blob: 0ddc16ade8d3ce189abaad72819e32aef68de5ba [file] [log] [blame] [edit]
// Copyright 2021 The ChromiumOS Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "rmad/utils/gsc_utils.h"
#include "rmad/utils/gsc_utils_impl.h"
#include <memory>
#include <optional>
#include <string>
#include <utility>
#include <base/files/file_path.h>
#include <base/files/file_util.h>
#include <base/files/scoped_temp_dir.h>
#include <brillo/file_utils.h>
#include <gmock/gmock.h>
#include <gtest/gtest.h>
#include "rmad/constants.h"
#include "rmad/utils/mock_cmd_utils.h"
using testing::_;
using testing::DoAll;
using testing::InSequence;
using testing::Return;
using testing::SetArgPointee;
using testing::StrictMock;
namespace {
// Constants for RSU
constexpr char kGetChallengeCodeResponse[] =
"CHALLENGE="
"AAAAABBBBBCCCCCDDDDDEEEEEFFFFFGGGGGHHHHH"
"1111122222333334444455555666667777788888\n";
constexpr char kExpectedChallengeCode[] =
"AAAAABBBBBCCCCCDDDDDEEEEEFFFFFGGGGGHHHHH"
"1111122222333334444455555666667777788888";
// Constants for CCD info.
constexpr char kFactoryModeEnabledResponse[] = R"(
STATE=Locked
---
---
CCD_FLAG_FACTORY_MODE=Y
---
)";
constexpr char kFactoryModeDisabledResponse[] = R"(
STATE=Locked
---
---
CCD_FLAG_FACTORY_MODE=N
---
)";
constexpr char kInitialFactoryModeEnabledResponse[] = R"(
STATE=Locked
---
---
INITIAL_FACTORY_MODE=Y
---
)";
constexpr char kInitialFactoryModeDisabledResponse[] = R"(
STATE=Locked
---
---
INITIAL_FACTORY_MODE=N
---
)";
// Constants for board ID.
constexpr char kGetBoardIdResponse[] = R"(
BID_TYPE=5a5a4352
BID_TYPE_INV=a5a5bcad
BID_FLAGS=00007f80
BID_RLZ=ZZCR
)";
constexpr char kExpectedBoardIdType[] = "5a5a4352";
constexpr char kExpectedBoardIdFlags[] = "00007f80";
// Constants for factory config.
constexpr char kGetFactoryConfigResponse[] = R"(
raw value: 0000000000000012
other fields: don't care
)";
constexpr char kGetFactoryConfigErrorResponse[] = R"(
raw value: 000000000000001
other fields: don't care
)";
constexpr bool kExpectedIsChassisBranded = true;
constexpr int kExpectedHwComplianceVersion = 2;
// Constants for CHASSIS_OPEN status.
constexpr char kGetChassisOpenStatusResponseTrue[] = R"(
Chassis Open: true
)";
constexpr char kGetChassisOpenStatusResponseFalse[] = R"(
Chassis Open: false
)";
constexpr char kGetChassisOpenStatusResponseInvalid[] = R"(
Chassis Open: ITS_INVALID
)";
} // namespace
namespace rmad {
class GscUtilsTest : public testing::Test {
public:
GscUtilsTest() = default;
~GscUtilsTest() override = default;
};
TEST_F(GscUtilsTest, GetRsuChallengeCode_Success) {
auto mock_cmd_utils = std::make_unique<StrictMock<MockCmdUtils>>();
EXPECT_CALL(*mock_cmd_utils, GetOutput(_, _))
.WillOnce(
DoAll(SetArgPointee<1>(kGetChallengeCodeResponse), Return(true)));
auto gsc_utils = std::make_unique<GscUtilsImpl>(std::move(mock_cmd_utils));
std::string challenge_code;
EXPECT_TRUE(gsc_utils->GetRsuChallengeCode(&challenge_code));
EXPECT_EQ(challenge_code, kExpectedChallengeCode);
}
TEST_F(GscUtilsTest, GetRsuChallengeCode_Fail) {
auto mock_cmd_utils = std::make_unique<StrictMock<MockCmdUtils>>();
EXPECT_CALL(*mock_cmd_utils, GetOutput(_, _)).WillOnce(Return(false));
auto gsc_utils = std::make_unique<GscUtilsImpl>(std::move(mock_cmd_utils));
std::string challenge_code;
EXPECT_FALSE(gsc_utils->GetRsuChallengeCode(&challenge_code));
}
TEST_F(GscUtilsTest, PerformRsu_Success) {
auto mock_cmd_utils = std::make_unique<StrictMock<MockCmdUtils>>();
EXPECT_CALL(*mock_cmd_utils, GetOutput(_, _)).WillOnce(Return(true));
auto gsc_utils = std::make_unique<GscUtilsImpl>(std::move(mock_cmd_utils));
EXPECT_TRUE(gsc_utils->PerformRsu(""));
}
TEST_F(GscUtilsTest, PerformRsu_Fail) {
auto mock_cmd_utils = std::make_unique<StrictMock<MockCmdUtils>>();
EXPECT_CALL(*mock_cmd_utils, GetOutput(_, _)).WillOnce(Return(false));
auto gsc_utils = std::make_unique<GscUtilsImpl>(std::move(mock_cmd_utils));
EXPECT_FALSE(gsc_utils->PerformRsu(""));
}
TEST_F(GscUtilsTest, IsFactoryModeEnabled_Enabled) {
auto mock_cmd_utils = std::make_unique<StrictMock<MockCmdUtils>>();
EXPECT_CALL(*mock_cmd_utils, GetOutput(_, _))
.WillOnce(
DoAll(SetArgPointee<1>(kFactoryModeEnabledResponse), Return(true)));
auto gsc_utils = std::make_unique<GscUtilsImpl>(std::move(mock_cmd_utils));
EXPECT_TRUE(gsc_utils->IsFactoryModeEnabled());
}
TEST_F(GscUtilsTest, IsFactoryModeEnabled_Disabled) {
auto mock_cmd_utils = std::make_unique<StrictMock<MockCmdUtils>>();
EXPECT_CALL(*mock_cmd_utils, GetOutput(_, _))
.WillOnce(
DoAll(SetArgPointee<1>(kFactoryModeDisabledResponse), Return(true)));
auto gsc_utils = std::make_unique<GscUtilsImpl>(std::move(mock_cmd_utils));
EXPECT_FALSE(gsc_utils->IsFactoryModeEnabled());
}
TEST_F(GscUtilsTest, IsFactoryModeEnabled_NoResponse) {
auto mock_cmd_utils = std::make_unique<StrictMock<MockCmdUtils>>();
EXPECT_CALL(*mock_cmd_utils, GetOutput(_, _)).WillOnce(Return(false));
auto gsc_utils = std::make_unique<GscUtilsImpl>(std::move(mock_cmd_utils));
EXPECT_FALSE(gsc_utils->IsFactoryModeEnabled());
}
TEST_F(GscUtilsTest, EnableFactoryMode_Success) {
auto mock_cmd_utils = std::make_unique<StrictMock<MockCmdUtils>>();
{
InSequence seq;
EXPECT_CALL(*mock_cmd_utils, GetOutput(_, _))
.WillOnce(DoAll(SetArgPointee<1>(kFactoryModeDisabledResponse),
Return(true)));
EXPECT_CALL(*mock_cmd_utils, GetOutput(_, _)).WillOnce(Return(true));
}
auto gsc_utils = std::make_unique<GscUtilsImpl>(std::move(mock_cmd_utils));
EXPECT_TRUE(gsc_utils->EnableFactoryMode());
}
TEST_F(GscUtilsTest, EnableFactoryMode_Fail) {
auto mock_cmd_utils = std::make_unique<StrictMock<MockCmdUtils>>();
{
InSequence seq;
EXPECT_CALL(*mock_cmd_utils, GetOutput(_, _))
.WillOnce(DoAll(SetArgPointee<1>(kFactoryModeDisabledResponse),
Return(true)));
EXPECT_CALL(*mock_cmd_utils, GetOutput(_, _)).WillOnce(Return(false));
}
auto gsc_utils = std::make_unique<GscUtilsImpl>(std::move(mock_cmd_utils));
EXPECT_FALSE(gsc_utils->EnableFactoryMode());
}
TEST_F(GscUtilsTest, EnableFactoryMode_AlreadyEnabled) {
auto mock_cmd_utils = std::make_unique<StrictMock<MockCmdUtils>>();
EXPECT_CALL(*mock_cmd_utils, GetOutput(_, _))
.WillOnce(
DoAll(SetArgPointee<1>(kFactoryModeEnabledResponse), Return(true)));
auto gsc_utils = std::make_unique<GscUtilsImpl>(std::move(mock_cmd_utils));
EXPECT_TRUE(gsc_utils->EnableFactoryMode());
}
TEST_F(GscUtilsTest, DisableFactoryMode_Success) {
auto mock_cmd_utils = std::make_unique<StrictMock<MockCmdUtils>>();
{
InSequence seq;
EXPECT_CALL(*mock_cmd_utils, GetOutput(_, _))
.WillOnce(
DoAll(SetArgPointee<1>(kFactoryModeEnabledResponse), Return(true)));
EXPECT_CALL(*mock_cmd_utils, GetOutput(_, _)).WillOnce(Return(true));
}
auto gsc_utils = std::make_unique<GscUtilsImpl>(std::move(mock_cmd_utils));
EXPECT_TRUE(gsc_utils->DisableFactoryMode());
}
TEST_F(GscUtilsTest, DisableFactoryMode_Fail) {
auto mock_cmd_utils = std::make_unique<StrictMock<MockCmdUtils>>();
{
InSequence seq;
EXPECT_CALL(*mock_cmd_utils, GetOutput(_, _))
.WillOnce(
DoAll(SetArgPointee<1>(kFactoryModeEnabledResponse), Return(true)));
EXPECT_CALL(*mock_cmd_utils, GetOutput(_, _)).WillOnce(Return(false));
}
auto gsc_utils = std::make_unique<GscUtilsImpl>(std::move(mock_cmd_utils));
EXPECT_FALSE(gsc_utils->DisableFactoryMode());
}
TEST_F(GscUtilsTest, DisableFactoryMode_AlreadyDisabled) {
auto mock_cmd_utils = std::make_unique<StrictMock<MockCmdUtils>>();
EXPECT_CALL(*mock_cmd_utils, GetOutput(_, _))
.WillOnce(
DoAll(SetArgPointee<1>(kFactoryModeDisabledResponse), Return(true)));
auto gsc_utils = std::make_unique<GscUtilsImpl>(std::move(mock_cmd_utils));
EXPECT_TRUE(gsc_utils->DisableFactoryMode());
}
TEST_F(GscUtilsTest, IsInitialFactoryModeEnabled_Enabled) {
auto mock_cmd_utils = std::make_unique<StrictMock<MockCmdUtils>>();
EXPECT_CALL(*mock_cmd_utils, GetOutput(_, _))
.WillOnce(DoAll(SetArgPointee<1>(kInitialFactoryModeEnabledResponse),
Return(true)));
auto gsc_utils = std::make_unique<GscUtilsImpl>(std::move(mock_cmd_utils));
EXPECT_TRUE(gsc_utils->IsInitialFactoryModeEnabled());
}
TEST_F(GscUtilsTest, IsInitialFactoryModeEnabled_Disabled) {
auto mock_cmd_utils = std::make_unique<StrictMock<MockCmdUtils>>();
EXPECT_CALL(*mock_cmd_utils, GetOutput(_, _))
.WillOnce(DoAll(SetArgPointee<1>(kInitialFactoryModeDisabledResponse),
Return(true)));
auto gsc_utils = std::make_unique<GscUtilsImpl>(std::move(mock_cmd_utils));
EXPECT_FALSE(gsc_utils->IsInitialFactoryModeEnabled());
}
TEST_F(GscUtilsTest, IsInitialFactoryModeEnabled_NoResponse) {
auto mock_cmd_utils = std::make_unique<StrictMock<MockCmdUtils>>();
EXPECT_CALL(*mock_cmd_utils, GetOutput(_, _)).WillOnce(Return(false));
auto gsc_utils = std::make_unique<GscUtilsImpl>(std::move(mock_cmd_utils));
EXPECT_FALSE(gsc_utils->IsInitialFactoryModeEnabled());
}
TEST_F(GscUtilsTest, GetBoardIdType_Success) {
auto mock_cmd_utils = std::make_unique<StrictMock<MockCmdUtils>>();
EXPECT_CALL(*mock_cmd_utils, GetOutput(_, _))
.WillOnce(DoAll(SetArgPointee<1>(kGetBoardIdResponse), Return(true)));
auto gsc_utils = std::make_unique<GscUtilsImpl>(std::move(mock_cmd_utils));
std::string board_id_type;
EXPECT_TRUE(gsc_utils->GetBoardIdType(&board_id_type));
EXPECT_EQ(board_id_type, kExpectedBoardIdType);
}
TEST_F(GscUtilsTest, GetBoardIdType_Fail) {
auto mock_cmd_utils = std::make_unique<StrictMock<MockCmdUtils>>();
EXPECT_CALL(*mock_cmd_utils, GetOutput(_, _)).WillOnce(Return(false));
auto gsc_utils = std::make_unique<GscUtilsImpl>(std::move(mock_cmd_utils));
std::string board_id_type;
EXPECT_FALSE(gsc_utils->GetBoardIdType(&board_id_type));
}
TEST_F(GscUtilsTest, GetBoardIdFlags_Success) {
auto mock_cmd_utils = std::make_unique<StrictMock<MockCmdUtils>>();
EXPECT_CALL(*mock_cmd_utils, GetOutput(_, _))
.WillOnce(DoAll(SetArgPointee<1>(kGetBoardIdResponse), Return(true)));
auto gsc_utils = std::make_unique<GscUtilsImpl>(std::move(mock_cmd_utils));
std::string board_id_flags;
EXPECT_TRUE(gsc_utils->GetBoardIdFlags(&board_id_flags));
EXPECT_EQ(board_id_flags, kExpectedBoardIdFlags);
}
TEST_F(GscUtilsTest, GetBoardIdFlags_Fail) {
auto mock_cmd_utils = std::make_unique<StrictMock<MockCmdUtils>>();
EXPECT_CALL(*mock_cmd_utils, GetOutput(_, _)).WillOnce(Return(false));
auto gsc_utils = std::make_unique<GscUtilsImpl>(std::move(mock_cmd_utils));
std::string board_id_flags;
EXPECT_FALSE(gsc_utils->GetBoardIdFlags(&board_id_flags));
}
TEST_F(GscUtilsTest, SetBoardId_Success) {
auto mock_cmd_utils = std::make_unique<StrictMock<MockCmdUtils>>();
EXPECT_CALL(*mock_cmd_utils, GetOutputAndError(_, _)).WillOnce(Return(true));
auto gsc_utils = std::make_unique<GscUtilsImpl>(std::move(mock_cmd_utils));
EXPECT_TRUE(gsc_utils->SetBoardId(true));
}
TEST_F(GscUtilsTest, SetBoardId_Fail) {
auto mock_cmd_utils = std::make_unique<StrictMock<MockCmdUtils>>();
EXPECT_CALL(*mock_cmd_utils, GetOutputAndError(_, _)).WillOnce(Return(false));
auto gsc_utils = std::make_unique<GscUtilsImpl>(std::move(mock_cmd_utils));
EXPECT_FALSE(gsc_utils->SetBoardId(true));
}
TEST_F(GscUtilsTest, Reboot_Success) {
auto mock_cmd_utils = std::make_unique<StrictMock<MockCmdUtils>>();
EXPECT_CALL(*mock_cmd_utils, GetOutput(_, _)).WillOnce(Return(true));
auto gsc_utils = std::make_unique<GscUtilsImpl>(std::move(mock_cmd_utils));
EXPECT_TRUE(gsc_utils->Reboot());
}
TEST_F(GscUtilsTest, GetFactoryConfig_Success) {
auto mock_cmd_utils = std::make_unique<StrictMock<MockCmdUtils>>();
EXPECT_CALL(*mock_cmd_utils, GetOutput(_, _))
.WillOnce(
DoAll(SetArgPointee<1>(kGetFactoryConfigResponse), Return(true)));
auto gsc_utils = std::make_unique<GscUtilsImpl>(std::move(mock_cmd_utils));
bool is_chassis_branded;
int hw_compliance_version;
EXPECT_TRUE(
gsc_utils->GetFactoryConfig(&is_chassis_branded, &hw_compliance_version));
EXPECT_EQ(is_chassis_branded, kExpectedIsChassisBranded);
EXPECT_EQ(hw_compliance_version, kExpectedHwComplianceVersion);
}
TEST_F(GscUtilsTest, GetFactoryConfig_CommandFailed) {
auto mock_cmd_utils = std::make_unique<StrictMock<MockCmdUtils>>();
EXPECT_CALL(*mock_cmd_utils, GetOutput(_, _)).WillOnce(Return(false));
auto gsc_utils = std::make_unique<GscUtilsImpl>(std::move(mock_cmd_utils));
bool is_chassis_branded;
int hw_compliance_version;
EXPECT_FALSE(
gsc_utils->GetFactoryConfig(&is_chassis_branded, &hw_compliance_version));
}
TEST_F(GscUtilsTest, GetFactoryConfig_ParseFailed) {
auto mock_cmd_utils = std::make_unique<StrictMock<MockCmdUtils>>();
EXPECT_CALL(*mock_cmd_utils, GetOutput(_, _))
.WillOnce(DoAll(SetArgPointee<1>(kGetFactoryConfigErrorResponse),
Return(true)));
auto gsc_utils = std::make_unique<GscUtilsImpl>(std::move(mock_cmd_utils));
bool is_chassis_branded;
int hw_compliance_version;
EXPECT_FALSE(
gsc_utils->GetFactoryConfig(&is_chassis_branded, &hw_compliance_version));
}
TEST_F(GscUtilsTest, SetFactoryConfig_Success) {
auto mock_cmd_utils = std::make_unique<StrictMock<MockCmdUtils>>();
EXPECT_CALL(*mock_cmd_utils, GetOutput(_, _)).WillOnce(Return(true));
auto gsc_utils = std::make_unique<GscUtilsImpl>(std::move(mock_cmd_utils));
EXPECT_TRUE(gsc_utils->SetFactoryConfig(true, 1));
}
TEST_F(GscUtilsTest, SetFactoryConfig_Failed) {
auto mock_cmd_utils = std::make_unique<StrictMock<MockCmdUtils>>();
EXPECT_CALL(*mock_cmd_utils, GetOutput(_, _)).WillOnce(Return(false));
auto gsc_utils = std::make_unique<GscUtilsImpl>(std::move(mock_cmd_utils));
EXPECT_FALSE(gsc_utils->SetFactoryConfig(true, 1));
}
TEST_F(GscUtilsTest, GetChassisOpenStatus_Success_True) {
auto mock_cmd_utils = std::make_unique<StrictMock<MockCmdUtils>>();
EXPECT_CALL(*mock_cmd_utils, GetOutput(_, _))
.WillOnce(DoAll(SetArgPointee<1>(kGetChassisOpenStatusResponseTrue),
Return(true)));
auto gsc_utils = std::make_unique<GscUtilsImpl>(std::move(mock_cmd_utils));
bool status;
EXPECT_TRUE(gsc_utils->GetChassisOpenStatus(&status));
EXPECT_EQ(status, true);
}
TEST_F(GscUtilsTest, GetChassisOpenStatus_Success_False) {
auto mock_cmd_utils = std::make_unique<StrictMock<MockCmdUtils>>();
EXPECT_CALL(*mock_cmd_utils, GetOutput(_, _))
.WillOnce(DoAll(SetArgPointee<1>(kGetChassisOpenStatusResponseFalse),
Return(true)));
auto gsc_utils = std::make_unique<GscUtilsImpl>(std::move(mock_cmd_utils));
bool status;
EXPECT_TRUE(gsc_utils->GetChassisOpenStatus(&status));
EXPECT_EQ(status, false);
}
TEST_F(GscUtilsTest, GetChassisOpenStatus_Failed) {
auto mock_cmd_utils = std::make_unique<StrictMock<MockCmdUtils>>();
EXPECT_CALL(*mock_cmd_utils, GetOutput(_, _))
.WillOnce(DoAll(SetArgPointee<1>(kGetChassisOpenStatusResponseTrue),
Return(false)));
auto gsc_utils = std::make_unique<GscUtilsImpl>(std::move(mock_cmd_utils));
bool status;
EXPECT_FALSE(gsc_utils->GetChassisOpenStatus(&status));
}
TEST_F(GscUtilsTest, GetChassisOpenStatus_Failed_Invalid) {
auto mock_cmd_utils = std::make_unique<StrictMock<MockCmdUtils>>();
EXPECT_CALL(*mock_cmd_utils, GetOutput(_, _))
.WillOnce(DoAll(SetArgPointee<1>(kGetChassisOpenStatusResponseInvalid),
Return(true)));
auto gsc_utils = std::make_unique<GscUtilsImpl>(std::move(mock_cmd_utils));
bool status;
EXPECT_FALSE(gsc_utils->GetChassisOpenStatus(&status));
}
TEST_F(GscUtilsTest, GetAddressingMode_Success) {
// "3byte".
auto mock_cmd_utils = std::make_unique<StrictMock<MockCmdUtils>>();
EXPECT_CALL(*mock_cmd_utils, GetOutputAndError(_, _))
.WillOnce(DoAll(SetArgPointee<1>("3byte"), Return(true)));
auto gsc_utils = std::make_unique<GscUtilsImpl>(std::move(mock_cmd_utils));
EXPECT_EQ(gsc_utils->GetAddressingMode(), SpiAddressingMode::k3Byte);
// "4byte".
mock_cmd_utils = std::make_unique<StrictMock<MockCmdUtils>>();
EXPECT_CALL(*mock_cmd_utils, GetOutputAndError(_, _))
.WillOnce(DoAll(SetArgPointee<1>("4byte"), Return(true)));
gsc_utils = std::make_unique<GscUtilsImpl>(std::move(mock_cmd_utils));
EXPECT_EQ(gsc_utils->GetAddressingMode(), SpiAddressingMode::k4Byte);
// "not provisioned".
mock_cmd_utils = std::make_unique<StrictMock<MockCmdUtils>>();
EXPECT_CALL(*mock_cmd_utils, GetOutputAndError(_, _))
.WillOnce(DoAll(SetArgPointee<1>("not provisioned"), Return(true)));
gsc_utils = std::make_unique<GscUtilsImpl>(std::move(mock_cmd_utils));
EXPECT_EQ(gsc_utils->GetAddressingMode(), SpiAddressingMode::kNotProvisioned);
}
TEST_F(GscUtilsTest, GetAddressingMode_Failed) {
// "Invalid format".
auto mock_cmd_utils = std::make_unique<StrictMock<MockCmdUtils>>();
EXPECT_CALL(*mock_cmd_utils, GetOutputAndError(_, _))
.WillOnce(DoAll(SetArgPointee<1>("invalid"), Return(true)));
auto gsc_utils = std::make_unique<GscUtilsImpl>(std::move(mock_cmd_utils));
auto result = gsc_utils->GetAddressingMode();
EXPECT_EQ(result, SpiAddressingMode::kUnknown);
// |cmd_utils| errors.
mock_cmd_utils = std::make_unique<StrictMock<MockCmdUtils>>();
EXPECT_CALL(*mock_cmd_utils, GetOutputAndError(_, _)).WillOnce(Return(false));
gsc_utils = std::make_unique<GscUtilsImpl>(std::move(mock_cmd_utils));
result = gsc_utils->GetAddressingMode();
EXPECT_EQ(result, SpiAddressingMode::kUnknown);
}
TEST_F(GscUtilsTest, SetAddressingMode_Success) {
// 0x0001000 -> "3byte".
auto mock_cmd_utils = std::make_unique<StrictMock<MockCmdUtils>>();
EXPECT_CALL(
*mock_cmd_utils,
GetOutputAndError(
testing::ElementsAreArray({"gsctool", "-a", "-C", "3byte"}), _))
.WillOnce(Return(true));
auto gsc_utils = std::make_unique<GscUtilsImpl>(std::move(mock_cmd_utils));
EXPECT_TRUE(gsc_utils->SetAddressingMode(SpiAddressingMode::k3Byte));
// 0x1000001 -> "4byte".
mock_cmd_utils = std::make_unique<StrictMock<MockCmdUtils>>();
EXPECT_CALL(
*mock_cmd_utils,
GetOutputAndError(
testing::ElementsAreArray({"gsctool", "-a", "-C", "4byte"}), _))
.WillOnce(Return(true));
gsc_utils = std::make_unique<GscUtilsImpl>(std::move(mock_cmd_utils));
EXPECT_TRUE(gsc_utils->SetAddressingMode(SpiAddressingMode::k4Byte));
}
TEST_F(GscUtilsTest, GetAddressingModeByFlashSize) {
auto gsc_utils = std::make_unique<GscUtilsImpl>();
EXPECT_EQ(gsc_utils->GetAddressingModeByFlashSize(0x0001000),
SpiAddressingMode::k3Byte);
EXPECT_EQ(gsc_utils->GetAddressingModeByFlashSize(0x1000000),
SpiAddressingMode::k3Byte);
EXPECT_EQ(gsc_utils->GetAddressingModeByFlashSize(0x1000001),
SpiAddressingMode::k4Byte);
}
TEST_F(GscUtilsTest, SetWpsr_Success) {
auto mock_cmd_utils = std::make_unique<StrictMock<MockCmdUtils>>();
EXPECT_CALL(*mock_cmd_utils, GetOutputAndError(_, _)).WillOnce(Return(true));
auto gsc_utils = std::make_unique<GscUtilsImpl>(std::move(mock_cmd_utils));
EXPECT_TRUE(gsc_utils->SetWpsr("0xA2 0x01 0x00 0x4A 0x00 0x01"));
}
TEST_F(GscUtilsTest, SetWpsr_Failed) {
auto mock_cmd_utils = std::make_unique<StrictMock<MockCmdUtils>>();
EXPECT_CALL(*mock_cmd_utils, GetOutputAndError(_, _)).WillOnce(Return(false));
auto gsc_utils = std::make_unique<GscUtilsImpl>(std::move(mock_cmd_utils));
EXPECT_FALSE(gsc_utils->SetWpsr("0xA2 0x01 0x00 0x4A 0x00 0x01"));
}
TEST_F(GscUtilsTest, IsApWpsrProvisioned_Success) {
auto mock_cmd_utils = std::make_unique<StrictMock<MockCmdUtils>>();
EXPECT_CALL(*mock_cmd_utils, GetOutputAndError(_, _))
.WillOnce(
DoAll(SetArgPointee<1>("expected values: 1: 99 & aa, 2: 00 & bb"),
Return(true)));
auto gsc_utils = std::make_unique<GscUtilsImpl>(std::move(mock_cmd_utils));
auto result = gsc_utils->IsApWpsrProvisioned();
EXPECT_TRUE(result.has_value());
EXPECT_TRUE(result.value());
}
TEST_F(GscUtilsTest, IsApWpsrProvisioned_Unprovisioned) {
auto mock_cmd_utils = std::make_unique<StrictMock<MockCmdUtils>>();
EXPECT_CALL(*mock_cmd_utils, GetOutputAndError(_, _))
.WillOnce(DoAll(SetArgPointee<1>("not provisioned"), Return(true)))
.WillOnce(DoAll(SetArgPointee<1>("not provisioned\n"), Return(true)));
auto gsc_utils = std::make_unique<GscUtilsImpl>(std::move(mock_cmd_utils));
auto result = gsc_utils->IsApWpsrProvisioned();
EXPECT_TRUE(result.has_value());
EXPECT_FALSE(result.value());
result = gsc_utils->IsApWpsrProvisioned();
EXPECT_TRUE(result.has_value());
EXPECT_FALSE(result.value());
}
TEST_F(GscUtilsTest, IsApWpsrProvisioned_Failed) {
auto mock_cmd_utils = std::make_unique<StrictMock<MockCmdUtils>>();
EXPECT_CALL(*mock_cmd_utils, GetOutputAndError(_, _)).WillOnce(Return(false));
auto gsc_utils = std::make_unique<GscUtilsImpl>(std::move(mock_cmd_utils));
auto result = gsc_utils->IsApWpsrProvisioned();
EXPECT_FALSE(result.has_value());
}
} // namespace rmad