-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathnvram_boot_lockbox_test.cc
105 lines (90 loc) · 3.63 KB
/
nvram_boot_lockbox_test.cc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
// Copyright 2018 The ChromiumOS Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "bootlockbox/nvram_boot_lockbox.h"
#include <memory>
#include <base/files/file_path.h>
#include <base/files/file_util.h>
#include <base/files/scoped_temp_dir.h>
#include <gmock/gmock.h>
#include <gtest/gtest.h>
#include "bootlockbox/fake_hwsec_space.h"
#include "bootlockbox/proto_bindings/boot_lockbox_rpc.pb.h"
namespace {
const char kTestFilePath[] = "test_file_path.pb";
}
namespace bootlockbox {
class NVRamBootLockboxTest : public testing::Test {
public:
void SetUp() override {
base::ScopedTempDir temp_directory;
ASSERT_TRUE(temp_directory.CreateUniqueTempDir());
file_path_ = temp_directory.GetPath().Append(kTestFilePath);
nvram_boot_lockbox_ =
std::make_unique<NVRamBootLockbox>(&fake_hwsec_space_, file_path_);
}
protected:
FakeTpmSpace fake_hwsec_space_;
std::unique_ptr<NVRamBootLockbox> nvram_boot_lockbox_;
base::FilePath file_path_;
};
TEST_F(NVRamBootLockboxTest, Finalize) {
EXPECT_TRUE(nvram_boot_lockbox_->Finalize());
EXPECT_EQ(nvram_boot_lockbox_->GetState(), SpaceState::kSpaceWriteLocked);
}
TEST_F(NVRamBootLockboxTest, DefineSpace) {
nvram_boot_lockbox_->SetState(SpaceState::kSpaceUndefined);
EXPECT_TRUE(nvram_boot_lockbox_->DefineSpace());
EXPECT_EQ(nvram_boot_lockbox_->GetState(), SpaceState::kSpaceUninitialized);
}
TEST_F(NVRamBootLockboxTest, StoreFail) {
std::string key = "test_key";
std::string value = "test_value";
BootLockboxErrorCode error;
EXPECT_TRUE(nvram_boot_lockbox_->Finalize());
EXPECT_FALSE(nvram_boot_lockbox_->Store(key, value, &error));
EXPECT_EQ(error, BootLockboxErrorCode::BOOTLOCKBOX_ERROR_WRITE_LOCKED);
}
TEST_F(NVRamBootLockboxTest, LoadFailDigestMisMatch) {
std::string key = "test_key";
std::string value = "test_value";
BootLockboxErrorCode error;
// avoid early failure.
nvram_boot_lockbox_->SetState(SpaceState::kSpaceNormal);
EXPECT_TRUE(nvram_boot_lockbox_->Store(key, value, &error));
// modify the proto file.
std::string invalid_proto = "aaa";
base::WriteFile(file_path_, invalid_proto.c_str(), invalid_proto.size());
EXPECT_FALSE(nvram_boot_lockbox_->Load());
}
TEST_F(NVRamBootLockboxTest, StoreLoadReadSuccess) {
std::string key = "test_key";
std::string value = "test_value_digest";
BootLockboxErrorCode error;
nvram_boot_lockbox_->SetState(SpaceState::kSpaceNormal);
EXPECT_TRUE(nvram_boot_lockbox_->Store(key, value, &error));
EXPECT_TRUE(nvram_boot_lockbox_->Load());
std::string stored_value;
EXPECT_TRUE(nvram_boot_lockbox_->Read(key, &stored_value, &error));
EXPECT_EQ(value, stored_value);
EXPECT_FALSE(
nvram_boot_lockbox_->Read("non-exist-key", &stored_value, &error));
EXPECT_EQ(error, BootLockboxErrorCode::BOOTLOCKBOX_ERROR_MISSING_KEY);
}
// This test simulates the situation that the device is powerwashed.
TEST_F(NVRamBootLockboxTest, FirstStoreReadSuccess) {
std::string key = "test_key";
std::string value = "test_value_digest";
BootLockboxErrorCode error;
nvram_boot_lockbox_->SetState(SpaceState::kSpaceUninitialized);
EXPECT_TRUE(nvram_boot_lockbox_->Store(key, value, &error));
EXPECT_EQ(error, BootLockboxErrorCode::BOOTLOCKBOX_ERROR_NOT_SET);
std::string stored_value;
EXPECT_TRUE(nvram_boot_lockbox_->Read(key, &stored_value, &error));
EXPECT_EQ(error, BootLockboxErrorCode::BOOTLOCKBOX_ERROR_NOT_SET);
EXPECT_EQ(value, stored_value);
EXPECT_FALSE(
nvram_boot_lockbox_->Read("non-exist-key", &stored_value, &error));
EXPECT_EQ(error, BootLockboxErrorCode::BOOTLOCKBOX_ERROR_MISSING_KEY);
}
} // namespace bootlockbox