// Copyright 2019 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "src/camera/drivers/test_utils/fake_buffer_collection.h"

#include <fidl/fuchsia.sysmem/cpp/wire.h>
#include <fuchsia/sysmem/c/banjo.h>
#include <lib/ddk/debug.h>
#include <lib/fake-bti/bti.h>
#include <lib/zx/bti.h>
#include <lib/zx/vmo.h>

#include <gtest/gtest.h>

namespace camera {
namespace {

constexpr uint32_t kWidth = 1080;
constexpr uint32_t kHeight = 764;
constexpr uint32_t kNumberOfBuffers = 8;

TEST(CreateContiguousBufferCollectionInfo2, CreatesCollection2) {
  zx::bti bti;
  ASSERT_EQ(fake_bti_create(bti.reset_and_get_address()), ZX_OK);

  buffer_collection_info_2_t buffer_collection;
  image_format_2_t image_format;

  EXPECT_EQ(
      GetImageFormat(image_format, static_cast<uint32_t>(fuchsia_sysmem::PixelFormatType::kNv12),
                     kWidth, kHeight),
      ZX_OK);
  ASSERT_EQ(CreateContiguousBufferCollectionInfo(buffer_collection, image_format, bti.get(),
                                                 kNumberOfBuffers),
            ZX_OK);

  // Check it made the buffer collection like we want:
  EXPECT_EQ(buffer_collection.buffer_count, kNumberOfBuffers);
  EXPECT_EQ(image_format.coded_width, kWidth);
  EXPECT_EQ(image_format.coded_height, kHeight);
  for (uint32_t i = 0; i < std::size(buffer_collection.buffers); ++i) {
    if (i < kNumberOfBuffers) {
      EXPECT_FALSE(buffer_collection.buffers[i].vmo == ZX_HANDLE_INVALID);
    } else {
      EXPECT_TRUE(buffer_collection.buffers[i].vmo == ZX_HANDLE_INVALID);
    }
  }

  // Clean up
  EXPECT_EQ(DestroyContiguousBufferCollection(buffer_collection), ZX_OK);
}

TEST(CreateContiguousBufferCollectionInfo2, FailsOnBadHandle) {
  zx_handle_t bti_handle = ZX_HANDLE_INVALID;
  buffer_collection_info_2_t buffer_collection;
  image_format_2_t image_format;

  EXPECT_EQ(
      GetImageFormat(image_format, static_cast<uint32_t>(fuchsia_sysmem::PixelFormatType::kNv12),
                     kWidth, kHeight),
      ZX_OK);
  EXPECT_EQ(camera::CreateContiguousBufferCollectionInfo(buffer_collection, image_format,
                                                         bti_handle, kNumberOfBuffers),
            ZX_ERR_INVALID_ARGS);

  // Cleanup
  EXPECT_EQ(DestroyContiguousBufferCollection(buffer_collection), ZX_OK);
}
}  // namespace
}  // namespace camera
