| // 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 |