// Copyright 2017 The Chromium 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 "components/chromeos_camera/mojo_mjpeg_decode_accelerator_service.h"

#include "base/bind.h"
#include "base/command_line.h"
#include "base/memory/platform_shared_memory_region.h"
#include "base/run_loop.h"
#include "base/test/task_environment.h"
#include "base/threading/thread.h"
#include "media/base/media_switches.h"
#include "mojo/public/cpp/system/platform_handle.h"
#include "testing/gtest/include/gtest/gtest.h"

namespace chromeos_camera {

static const int32_t kArbitraryBitstreamBufferId = 123;

// Test fixture for the unit that is created via the mojom interface for
// class MojoMjpegDecodeAcceleratorService. Uses a FakeJpegDecodeAccelerator
// to simulate the actual decoding without the need for special hardware.
class MojoMjpegDecodeAcceleratorServiceTest : public ::testing::Test {
 public:
  MojoMjpegDecodeAcceleratorServiceTest() = default;
  ~MojoMjpegDecodeAcceleratorServiceTest() override = default;

  void SetUp() override {
    base::CommandLine::ForCurrentProcess()->AppendSwitch(
        switches::kUseFakeMjpegDecodeAccelerator);
  }

  void OnInitializeDone(const base::Closure& continuation, bool success) {
    EXPECT_TRUE(success);
    continuation.Run();
  }

  void OnDecodeAck(const base::Closure& continuation,
                   int32_t bitstream_buffer_id,
                   MjpegDecodeAccelerator::Error error) {
    EXPECT_EQ(kArbitraryBitstreamBufferId, bitstream_buffer_id);
    continuation.Run();
  }

 private:
  // This is required to allow base::ThreadTaskRunnerHandle::Get() from the
  // test execution thread.
  base::test::TaskEnvironment task_environment_;
};

TEST_F(MojoMjpegDecodeAcceleratorServiceTest, InitializeAndDecode) {
  chromeos_camera::mojom::MjpegDecodeAcceleratorPtr jpeg_decoder;
  MojoMjpegDecodeAcceleratorService::Create(mojo::MakeRequest(&jpeg_decoder));

  base::RunLoop run_loop;
  jpeg_decoder->Initialize(
      base::Bind(&MojoMjpegDecodeAcceleratorServiceTest::OnInitializeDone,
                 base::Unretained(this), run_loop.QuitClosure()));
  run_loop.Run();

  const size_t kInputBufferSizeInBytes = 512;
  const size_t kOutputFrameSizeInBytes = 1024;
  const gfx::Size kDummyFrameCodedSize(10, 10);
  const char kKeyId[] = "key id";
  const char kIv[] = "0123456789abcdef";
  std::vector<media::SubsampleEntry> subsamples;
  subsamples.push_back(media::SubsampleEntry(10, 5));
  subsamples.push_back(media::SubsampleEntry(15, 7));

  base::RunLoop run_loop2;
  base::subtle::PlatformSharedMemoryRegion shm_region =
      base::subtle::PlatformSharedMemoryRegion::CreateUnsafe(
          kInputBufferSizeInBytes);

  // mojo::SharedBufferHandle::Create will make a writable region, but an unsafe
  // one is needed.
  mojo::ScopedSharedBufferHandle output_frame_handle =
      mojo::WrapPlatformSharedMemoryRegion(
          base::subtle::PlatformSharedMemoryRegion::CreateUnsafe(
              kOutputFrameSizeInBytes));

  media::BitstreamBuffer bitstream_buffer(kArbitraryBitstreamBufferId,
                                          std::move(shm_region),
                                          kInputBufferSizeInBytes);
  bitstream_buffer.SetDecryptionSettings(kKeyId, kIv, subsamples);

  jpeg_decoder->Decode(
      std::move(bitstream_buffer), kDummyFrameCodedSize,
      std::move(output_frame_handle),
      base::checked_cast<uint32_t>(kOutputFrameSizeInBytes),
      base::Bind(&MojoMjpegDecodeAcceleratorServiceTest::OnDecodeAck,
                 base::Unretained(this), run_loop2.QuitClosure()));
  run_loop2.Run();
}

}  // namespace chromeos_camera
