// Copyright 2023 The ChromiumOS Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "libec/flash_info_command.h"

#include <gmock/gmock.h>
#include <gtest/gtest.h>

#include "libec/ec_command.h"

using testing::Return;

namespace ec {
namespace {

TEST(FlashInfoCommand, FlashInfoCommand_v0) {
  FlashInfoCommand_v0 cmd;
  EXPECT_EQ(cmd.Version(), 0);
  EXPECT_EQ(cmd.Command(), EC_CMD_FLASH_INFO);
}

TEST(FlashInfoCommand, FlashInfoCommand_v1) {
  FlashInfoCommand_v1 cmd;
  EXPECT_EQ(cmd.Version(), 1);
  EXPECT_EQ(cmd.Command(), EC_CMD_FLASH_INFO);
}

TEST(FlashInfoCommand, FlashInfoCommand_v2) {
  FlashInfoCommand_v2 cmd;
  EXPECT_EQ(cmd.Version(), 2);
  EXPECT_EQ(cmd.Command(), EC_CMD_FLASH_INFO);
  EXPECT_EQ(cmd.Req()->num_banks_desc, 0);
}

// Mock the underlying EcCommand to test
class FlashInfoCommand_v2Test : public testing::Test {
 public:
  class MockFlashInfoCommand_v2 : public FlashInfoCommand_v2 {
   public:
    using FlashInfoCommand_v2::FlashInfoCommand_v2;
    MOCK_METHOD(bool, EcCommandRun, (int fd), (override));
    MOCK_METHOD(const flash_info::Params_v2*, Resp, (), (const, override));
    MOCK_METHOD(uint32_t, Result, (), (const, override));
  };
};

TEST_F(FlashInfoCommand_v2Test, Success) {
  flash_info::Params_v2 response;
  MockFlashInfoCommand_v2 mock_command;

  EXPECT_CALL(mock_command, Resp).WillRepeatedly(Return(&response));
  EXPECT_CALL(mock_command, Result).WillRepeatedly(Return(EC_RES_SUCCESS));

  EXPECT_CALL(mock_command, EcCommandRun)
      .WillOnce([&response](int fd) {
        response = {.info = {.num_banks_total = 2}};
        return true;
      })
      .WillOnce([&response](int fd) {
        response = {.info = {
                        .flash_size = 1024,
                        .flags = 0,
                        .write_ideal_size = 10,
                        .num_banks_total = 2,
                        .num_banks_desc = 2,
                    }};
        response.banks[0] = {.count = 1,
                             .size_exp = 1,
                             .write_size_exp = 1,
                             .erase_size_exp = 1,
                             .protect_size_exp = 1};
        response.banks[1] = {.count = 2,
                             .size_exp = 2,
                             .write_size_exp = 2,
                             .erase_size_exp = 2,
                             .protect_size_exp = 2};
        return true;
      });
  EXPECT_TRUE(mock_command.Run(-1));

  EXPECT_EQ(mock_command.GetTotalNumBanks(), 2);
  EXPECT_EQ(mock_command.GetIdealWriteSize(), 10);
  EXPECT_EQ(mock_command.GetFlashSize(), 1024);
  EXPECT_EQ(mock_command.FlashErasesToZero(), false);
  EXPECT_EQ(mock_command.FlashSelectRequired(), false);
  struct ec_flash_bank expected_bank0 = {.count = 1,
                                         .size_exp = 1,
                                         .write_size_exp = 1,
                                         .erase_size_exp = 1,
                                         .protect_size_exp = 1};
  EXPECT_EQ(*mock_command.GetBankDescription(0), expected_bank0);
  struct ec_flash_bank expected_bank1 = {.count = 2,
                                         .size_exp = 2,
                                         .write_size_exp = 2,
                                         .erase_size_exp = 2,
                                         .protect_size_exp = 2};
  EXPECT_EQ(*mock_command.GetBankDescription(1), expected_bank1);
  EXPECT_EQ(mock_command.GetBankDescription(2), std::nullopt);
}

}  // namespace
}  // namespace ec
