blob: e1f0067289f0d1f7975123b41c37eccf9dfe8800 [file] [log] [blame]
// Copyright 2021 The Chromium OS Authors. All rights reserved.
// 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 "rmad/utils/fake_cr50_utils.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.
)";
} // 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());
}
namespace fake {
class FakeCr50UtilsTest : public testing::Test {
public:
FakeCr50UtilsTest() = default;
~FakeCr50UtilsTest() override = default;
base::FilePath GetHwwpDisabledFilePath() const {
return temp_dir_.GetPath().AppendASCII(kHwwpDisabledFilePath);
}
base::FilePath GetFactoryModeEnabledFilePath() const {
return temp_dir_.GetPath().AppendASCII(kFactoryModeEnabledFilePath);
}
base::FilePath GetBlockCcdFilePath() const {
return temp_dir_.GetPath().AppendASCII(kBlockCcdFilePath);
}
base::FilePath GetRebootRequestFilePath() const {
return temp_dir_.GetPath().AppendASCII(kRebootRequestFilePath);
}
protected:
void SetUp() override {
ASSERT_TRUE(temp_dir_.CreateUniqueTempDir());
fake_cr50_utils_ = std::make_unique<FakeCr50Utils>(temp_dir_.GetPath());
}
base::ScopedTempDir temp_dir_;
std::unique_ptr<FakeCr50Utils> fake_cr50_utils_;
};
TEST_F(FakeCr50UtilsTest, GetRsuChallengCode) {
std::string challenge_code;
ASSERT_TRUE(fake_cr50_utils_->GetRsuChallengeCode(&challenge_code));
ASSERT_EQ(challenge_code, "ABCDEFG");
}
TEST_F(FakeCr50UtilsTest, PerformRsu_Success) {
ASSERT_FALSE(base::PathExists(GetFactoryModeEnabledFilePath()));
ASSERT_TRUE(fake_cr50_utils_->PerformRsu("AAAAAAAA"));
ASSERT_TRUE(base::PathExists(GetFactoryModeEnabledFilePath()));
}
TEST_F(FakeCr50UtilsTest, PerformRsu_AlreadyEnabled) {
brillo::TouchFile(GetFactoryModeEnabledFilePath());
ASSERT_TRUE(base::PathExists(GetFactoryModeEnabledFilePath()));
ASSERT_TRUE(fake_cr50_utils_->PerformRsu("AAAAAAAA"));
ASSERT_TRUE(base::PathExists(GetFactoryModeEnabledFilePath()));
}
TEST_F(FakeCr50UtilsTest, PerformRsu_Fail) {
ASSERT_FALSE(base::PathExists(GetFactoryModeEnabledFilePath()));
ASSERT_FALSE(fake_cr50_utils_->PerformRsu("AAAAAAAB"));
ASSERT_FALSE(base::PathExists(GetFactoryModeEnabledFilePath()));
}
TEST_F(FakeCr50UtilsTest, IsFactoryModeEnabled_Enabled) {
brillo::TouchFile(GetFactoryModeEnabledFilePath());
ASSERT_TRUE(fake_cr50_utils_->IsFactoryModeEnabled());
}
TEST_F(FakeCr50UtilsTest, IsFactoryModeEnabled_Disabled) {
ASSERT_FALSE(fake_cr50_utils_->IsFactoryModeEnabled());
}
TEST_F(FakeCr50UtilsTest, EnableFactoryMode_Success) {
brillo::TouchFile(GetHwwpDisabledFilePath());
ASSERT_FALSE(base::PathExists(GetFactoryModeEnabledFilePath()));
ASSERT_FALSE(base::PathExists(GetRebootRequestFilePath()));
ASSERT_TRUE(fake_cr50_utils_->EnableFactoryMode());
ASSERT_TRUE(base::PathExists(GetFactoryModeEnabledFilePath()));
ASSERT_TRUE(base::PathExists(GetRebootRequestFilePath()));
}
TEST_F(FakeCr50UtilsTest, EnableFactoryMode_AlreadyEnabled) {
brillo::TouchFile(GetFactoryModeEnabledFilePath());
ASSERT_TRUE(base::PathExists(GetFactoryModeEnabledFilePath()));
ASSERT_TRUE(fake_cr50_utils_->EnableFactoryMode());
ASSERT_TRUE(base::PathExists(GetFactoryModeEnabledFilePath()));
}
TEST_F(FakeCr50UtilsTest, EnableFactoryMode_HwwpDisabled) {
ASSERT_FALSE(fake_cr50_utils_->EnableFactoryMode());
ASSERT_FALSE(base::PathExists(GetFactoryModeEnabledFilePath()));
}
TEST_F(FakeCr50UtilsTest, EnableFactoryMode_CcdBlocked) {
brillo::TouchFile(GetHwwpDisabledFilePath());
brillo::TouchFile(GetBlockCcdFilePath());
ASSERT_FALSE(fake_cr50_utils_->EnableFactoryMode());
ASSERT_FALSE(base::PathExists(GetFactoryModeEnabledFilePath()));
}
TEST_F(FakeCr50UtilsTest, DisableFactoryMode_Success) {
brillo::TouchFile(GetFactoryModeEnabledFilePath());
ASSERT_TRUE(base::PathExists(GetFactoryModeEnabledFilePath()));
ASSERT_TRUE(fake_cr50_utils_->DisableFactoryMode());
ASSERT_FALSE(base::PathExists(GetFactoryModeEnabledFilePath()));
}
TEST_F(FakeCr50UtilsTest, DisableFactoryMode_AlreadyDisabled) {
ASSERT_FALSE(base::PathExists(GetFactoryModeEnabledFilePath()));
ASSERT_TRUE(fake_cr50_utils_->DisableFactoryMode());
ASSERT_FALSE(base::PathExists(GetFactoryModeEnabledFilePath()));
}
} // namespace fake
} // namespace rmad