/*
 * Copyright 2019 The Chromium OS 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 "hal/ip/request_queue.h"

#include <memory>
#include <utility>

#include <gtest/gtest.h>

namespace cros {
namespace {

class RequestQueueTest : public ::testing::Test {
 public:
  RequestQueueTest() {}

 protected:
  void SetUp() override {
    request_queue_ = std::make_unique<RequestQueue>();

    callbacks_this_.this_ = this;
    callbacks_this_.process_capture_result = &ProcessResult;
    callbacks_this_.notify = &Notify;

    request_queue_->SetCallbacks(&callbacks_this_);
  }

  void PushFrame(uint32_t frame_number) {
    camera3_capture_request_t request = {};
    camera3_stream_buffer_t buffer = {};
    buffer_handle_t handle = {};
    buffer.buffer = &handle;
    buffer.acquire_fence = -1;
    request.output_buffers = &buffer;
    request.frame_number = frame_number;

    request_queue_->Push(&request);
  }

  static void ProcessResult(const struct camera3_callback_ops* ops,
                            const camera3_capture_result_t* result) {
    RequestQueueTest* self = static_cast<const callbacks_this*>(ops)->this_;
    self->num_capture_callbacks_++;
  }

  static void Notify(const struct camera3_callback_ops* ops,
                     const camera3_notify_msg_t* msg) {
    RequestQueueTest* self = static_cast<const callbacks_this*>(ops)->this_;
    if (msg->type == CAMERA3_MSG_SHUTTER) {
      self->num_shutter_callbacks_++;
    }
    if (msg->type == CAMERA3_MSG_ERROR) {
      self->num_error_callbacks_++;
    }
  }

  struct callbacks_this : camera3_callback_ops_t {
    RequestQueueTest* this_;
  } callbacks_this_;
  std::unique_ptr<RequestQueue> request_queue_;
  uint32_t num_shutter_callbacks_ = 0;
  uint32_t num_capture_callbacks_ = 0;
  uint32_t num_error_callbacks_ = 0;
};

TEST_F(RequestQueueTest, OneFrame) {
  PushFrame(1);
  std::unique_ptr<CaptureRequest> request = request_queue_->Pop();
  ASSERT_EQ(request->GetFrameNumber(), 1);
  request_queue_->NotifyCapture(std::move(request));

  EXPECT_EQ(num_shutter_callbacks_, 1);
  EXPECT_EQ(num_capture_callbacks_, 1);
  EXPECT_EQ(num_error_callbacks_, 0);
}

TEST_F(RequestQueueTest, Empty) {
  ASSERT_TRUE(request_queue_->IsEmpty());
  PushFrame(1);
  ASSERT_FALSE(request_queue_->IsEmpty());
  std::unique_ptr<CaptureRequest> request = request_queue_->Pop();
  ASSERT_TRUE(request_queue_->IsEmpty());
  request_queue_->NotifyCapture(std::move(request));
  ASSERT_TRUE(request_queue_->IsEmpty());
}

TEST_F(RequestQueueTest, MultipleFrames) {
  PushFrame(1);
  PushFrame(2);
  std::unique_ptr<CaptureRequest> request = request_queue_->Pop();
  ASSERT_EQ(request->GetFrameNumber(), 1);
  std::unique_ptr<CaptureRequest> request2 = request_queue_->Pop();
  ASSERT_EQ(request2->GetFrameNumber(), 2);
  request_queue_->NotifyCapture(std::move(request));
  request_queue_->NotifyCapture(std::move(request2));

  EXPECT_EQ(num_shutter_callbacks_, 2);
  EXPECT_EQ(num_capture_callbacks_, 2);
  EXPECT_EQ(num_error_callbacks_, 0);
}

TEST_F(RequestQueueTest, Flush) {
  PushFrame(1);
  request_queue_->Flush();
  ASSERT_TRUE(request_queue_->IsEmpty());

  EXPECT_EQ(num_shutter_callbacks_, 0);
  EXPECT_EQ(num_capture_callbacks_, 1);
  EXPECT_EQ(num_error_callbacks_, 1);
}

TEST_F(RequestQueueTest, OneError) {
  PushFrame(1);
  std::unique_ptr<CaptureRequest> request = request_queue_->Pop();
  ASSERT_EQ(request->GetFrameNumber(), 1);
  request_queue_->NotifyError(std::move(request));

  EXPECT_EQ(num_shutter_callbacks_, 1);
  EXPECT_EQ(num_capture_callbacks_, 1);
  EXPECT_EQ(num_error_callbacks_, 1);
}

}  // namespace
}  // namespace cros
