blob: d5d24da2bde9643babbc7d7cef1f704fd6cb2841 [file] [log] [blame]
// 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 <gmock/gmock.h>
#include <gtest/gtest.h>
#include "libec/ec_command.h"
#include "libec/flash_info_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