blob: fa3417810fd7a2b536060e24c3befdcbfc7bb895 [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/cr50_utils_impl.h"
#include <memory>
#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 {
constexpr char kChallengeCodeResponse[] = R"(
Challenge:
AAAAA BBBBB
CCCCC DDDDD
)";
constexpr char kFactoryModeEnabledResponse[] = R"(
State: Locked
---
---
Capabilities are modified.
)";
constexpr char kFactoryModeDisabledResponse[] = R"(
State: Locked
---
---
Capabilities are default.
)";
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";
} // namespace
namespace rmad {
class Cr50UtilsTest : public testing::Test {
public:
Cr50UtilsTest() = default;
~Cr50UtilsTest() override = default;
};
TEST_F(Cr50UtilsTest, GetRsuChallengeCode_Success) {
auto mock_cmd_utils = std::make_unique<StrictMock<MockCmdUtils>>();
EXPECT_CALL(*mock_cmd_utils, GetOutput(_, _))
.WillOnce(DoAll(SetArgPointee<1>(kChallengeCodeResponse), Return(true)));
auto cr50_utils = std::make_unique<Cr50UtilsImpl>(std::move(mock_cmd_utils));
std::string challenge_code;
EXPECT_TRUE(cr50_utils->GetRsuChallengeCode(&challenge_code));
EXPECT_EQ(challenge_code, "AAAAABBBBBCCCCCDDDDD");
}
TEST_F(Cr50UtilsTest, GetRsuChallengeCode_Fail) {
auto mock_cmd_utils = std::make_unique<StrictMock<MockCmdUtils>>();
EXPECT_CALL(*mock_cmd_utils, GetOutput(_, _)).WillOnce(Return(false));
auto cr50_utils = std::make_unique<Cr50UtilsImpl>(std::move(mock_cmd_utils));
std::string challenge_code;
EXPECT_FALSE(cr50_utils->GetRsuChallengeCode(&challenge_code));
}
TEST_F(Cr50UtilsTest, PerformRsu_Success) {
auto mock_cmd_utils = std::make_unique<StrictMock<MockCmdUtils>>();
EXPECT_CALL(*mock_cmd_utils, GetOutput(_, _)).WillOnce(Return(true));
auto cr50_utils = std::make_unique<Cr50UtilsImpl>(std::move(mock_cmd_utils));
EXPECT_TRUE(cr50_utils->PerformRsu(""));
}
TEST_F(Cr50UtilsTest, PerformRsu_Fail) {
auto mock_cmd_utils = std::make_unique<StrictMock<MockCmdUtils>>();
EXPECT_CALL(*mock_cmd_utils, GetOutput(_, _)).WillOnce(Return(false));
auto cr50_utils = std::make_unique<Cr50UtilsImpl>(std::move(mock_cmd_utils));
EXPECT_FALSE(cr50_utils->PerformRsu(""));
}
TEST_F(Cr50UtilsTest, 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 cr50_utils = std::make_unique<Cr50UtilsImpl>(std::move(mock_cmd_utils));
EXPECT_TRUE(cr50_utils->IsFactoryModeEnabled());
}
TEST_F(Cr50UtilsTest, 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 cr50_utils = std::make_unique<Cr50UtilsImpl>(std::move(mock_cmd_utils));
EXPECT_FALSE(cr50_utils->IsFactoryModeEnabled());
}
TEST_F(Cr50UtilsTest, IsFactoryModeEnabled_NoResponse) {
auto mock_cmd_utils = std::make_unique<StrictMock<MockCmdUtils>>();
EXPECT_CALL(*mock_cmd_utils, GetOutput(_, _)).WillOnce(Return(false));
auto cr50_utils = std::make_unique<Cr50UtilsImpl>(std::move(mock_cmd_utils));
EXPECT_FALSE(cr50_utils->IsFactoryModeEnabled());
}
TEST_F(Cr50UtilsTest, 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 cr50_utils = std::make_unique<Cr50UtilsImpl>(std::move(mock_cmd_utils));
EXPECT_TRUE(cr50_utils->EnableFactoryMode());
}
TEST_F(Cr50UtilsTest, 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 cr50_utils = std::make_unique<Cr50UtilsImpl>(std::move(mock_cmd_utils));
EXPECT_FALSE(cr50_utils->EnableFactoryMode());
}
TEST_F(Cr50UtilsTest, 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 cr50_utils = std::make_unique<Cr50UtilsImpl>(std::move(mock_cmd_utils));
EXPECT_TRUE(cr50_utils->EnableFactoryMode());
}
TEST_F(Cr50UtilsTest, 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 cr50_utils = std::make_unique<Cr50UtilsImpl>(std::move(mock_cmd_utils));
EXPECT_TRUE(cr50_utils->DisableFactoryMode());
}
TEST_F(Cr50UtilsTest, 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 cr50_utils = std::make_unique<Cr50UtilsImpl>(std::move(mock_cmd_utils));
EXPECT_FALSE(cr50_utils->DisableFactoryMode());
}
TEST_F(Cr50UtilsTest, 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 cr50_utils = std::make_unique<Cr50UtilsImpl>(std::move(mock_cmd_utils));
EXPECT_TRUE(cr50_utils->DisableFactoryMode());
}
TEST_F(Cr50UtilsTest, 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 cr50_utils = std::make_unique<Cr50UtilsImpl>(std::move(mock_cmd_utils));
std::string board_id_type;
EXPECT_TRUE(cr50_utils->GetBoardIdType(&board_id_type));
EXPECT_EQ(board_id_type, kExpectedBoardIdType);
}
TEST_F(Cr50UtilsTest, GetBoardIdType_Fail) {
auto mock_cmd_utils = std::make_unique<StrictMock<MockCmdUtils>>();
EXPECT_CALL(*mock_cmd_utils, GetOutput(_, _)).WillOnce(Return(false));
auto cr50_utils = std::make_unique<Cr50UtilsImpl>(std::move(mock_cmd_utils));
std::string board_id_type;
EXPECT_FALSE(cr50_utils->GetBoardIdType(&board_id_type));
}
TEST_F(Cr50UtilsTest, 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 cr50_utils = std::make_unique<Cr50UtilsImpl>(std::move(mock_cmd_utils));
std::string board_id_flags;
EXPECT_TRUE(cr50_utils->GetBoardIdFlags(&board_id_flags));
EXPECT_EQ(board_id_flags, kExpectedBoardIdFlags);
}
TEST_F(Cr50UtilsTest, GetBoardIdFlags_Fail) {
auto mock_cmd_utils = std::make_unique<StrictMock<MockCmdUtils>>();
EXPECT_CALL(*mock_cmd_utils, GetOutput(_, _)).WillOnce(Return(false));
auto cr50_utils = std::make_unique<Cr50UtilsImpl>(std::move(mock_cmd_utils));
std::string board_id_flags;
EXPECT_FALSE(cr50_utils->GetBoardIdFlags(&board_id_flags));
}
TEST_F(Cr50UtilsTest, SetBoardId_Success) {
auto mock_cmd_utils = std::make_unique<StrictMock<MockCmdUtils>>();
EXPECT_CALL(*mock_cmd_utils, GetOutput(_, _)).WillOnce(Return(true));
auto cr50_utils = std::make_unique<Cr50UtilsImpl>(std::move(mock_cmd_utils));
EXPECT_TRUE(cr50_utils->SetBoardId(true));
}
TEST_F(Cr50UtilsTest, SetBoardId_Fail) {
auto mock_cmd_utils = std::make_unique<StrictMock<MockCmdUtils>>();
EXPECT_CALL(*mock_cmd_utils, GetOutput(_, _)).WillOnce(Return(false));
auto cr50_utils = std::make_unique<Cr50UtilsImpl>(std::move(mock_cmd_utils));
EXPECT_FALSE(cr50_utils->SetBoardId(true));
}
} // namespace rmad