1ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler/*
2ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler * Copyright (C) 2016 The Android Open Source Project
3ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler *
4ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler * Licensed under the Apache License, Version 2.0 (the "License");
5ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler * you may not use this file except in compliance with the License.
6ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler * You may obtain a copy of the License at
7ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler *
8ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler *      http://www.apache.org/licenses/LICENSE-2.0
9ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler *
10ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler * Unless required by applicable law or agreed to in writing, software
11ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler * distributed under the License is distributed on an "AS IS" BASIS,
12ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler * See the License for the specific language governing permissions and
14ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler * limitations under the License.
15ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler */
16ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler
17fce04ee60f5e12cf5b43d4c8c6be58f5884db71fMattias Nissler#if defined(HAS_GTEST)
18ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler#include <gtest/gtest.h>
19fce04ee60f5e12cf5b43d4c8c6be58f5884db71fMattias Nissler#else
20fce04ee60f5e12cf5b43d4c8c6be58f5884db71fMattias Nissler#include "gtest_stubs.h"
21fce04ee60f5e12cf5b43d4c8c6be58f5884db71fMattias Nissler#endif
22ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler
23625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler#include <string.h>
24625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler
25ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler#include <nvram/core/nvram_manager.h>
26ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler#include <nvram/core/persistence.h>
27ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler
28ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler#include "fake_storage.h"
29ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler
30ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nisslernamespace nvram {
31ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nisslernamespace {
32ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler
33ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nisslerclass NvramManagerTest : public testing::Test {
34ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler protected:
35ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  NvramManagerTest() {
36ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler    storage::Clear();
37ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  }
38ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler
39625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  static void SetupHeader(uint32_t header_version, uint32_t index) {
40ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler    NvramHeader header;
41ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler    header.version = header_version;
42ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler    ASSERT_TRUE(header.allocated_indices.Resize(1));
43ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler    header.allocated_indices[0] = index;
44ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler    ASSERT_EQ(storage::Status::kSuccess, persistence::StoreHeader(header));
45ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  }
46ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler
47625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  static void ReadAndCompareSpaceData(NvramManager* nvram,
48625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler                                      uint32_t index,
49625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler                                      const void* expected_contents,
50625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler                                      size_t expected_size) {
51625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler    ReadSpaceRequest read_space_request;
52625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler    read_space_request.index = index;
53625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler    ReadSpaceResponse read_space_response;
54625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler    EXPECT_EQ(NV_RESULT_SUCCESS,
55625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler              nvram->ReadSpace(read_space_request, &read_space_response));
56625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler    ASSERT_EQ(expected_size, read_space_response.buffer.size());
57625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler    EXPECT_EQ(0, memcmp(read_space_response.buffer.data(), expected_contents,
58625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler                        expected_size));
59625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  }
60625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler
61ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  static uint32_t GetControlsMask(const Vector<nvram_control_t>& controls) {
62ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler    uint32_t mask = 0;
63ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler    for (nvram_control_t control : controls) {
64ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler      mask |= (1 << control);
65ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler    }
66ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler    return mask;
67ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  }
68ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler};
69ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler
70ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias NisslerTEST_F(NvramManagerTest, Init_FromScratch) {
71ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  NvramManager nvram;
72ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler
73ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  GetSpaceInfoRequest get_space_info_request;
74ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  get_space_info_request.index = 1;
75ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  GetSpaceInfoResponse get_space_info_response;
76ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  EXPECT_EQ(
77ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler      NV_RESULT_SPACE_DOES_NOT_EXIST,
78ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler      nvram.GetSpaceInfo(get_space_info_request, &get_space_info_response));
79ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler}
80ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler
81ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias NisslerTEST_F(NvramManagerTest, Init_TrailingStorageBytes) {
82ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  // Set up a pre-existing space and add some trailing bytes.
83ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  NvramSpace space;
84ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  ASSERT_TRUE(space.contents.Resize(10));
85ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  ASSERT_EQ(storage::Status::kSuccess, persistence::StoreSpace(1, space));
86ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  Blob space_blob;
87ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  ASSERT_EQ(storage::Status::kSuccess, storage::LoadSpace(1, &space_blob));
88ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  ASSERT_TRUE(space_blob.Resize(space_blob.size() + 10));
89ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  ASSERT_EQ(storage::Status::kSuccess, storage::StoreSpace(1, space_blob));
90ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler
91ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  // Produce a matching header and append some trailing bytes.
92ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  NvramHeader header;
93ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  header.version = NvramHeader::kVersion;
94ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  ASSERT_TRUE(header.allocated_indices.Resize(1));
95ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  header.allocated_indices[0] = 1;
96ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  ASSERT_EQ(storage::Status::kSuccess, persistence::StoreHeader(header));
97ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  Blob header_blob;
98ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  ASSERT_EQ(storage::Status::kSuccess, storage::LoadHeader(&header_blob));
99ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  ASSERT_TRUE(header_blob.Resize(header_blob.size() + 10));
100ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  ASSERT_EQ(storage::Status::kSuccess, storage::StoreHeader(header_blob));
101ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler
102ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  // Initialize the |NvramManager| and check that the header and space blobs get
103ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  // loaded successfully.
104ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  NvramManager nvram;
105ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler
106ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  GetInfoRequest get_info_request;
107ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  GetInfoResponse get_info_response;
108ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  EXPECT_EQ(NV_RESULT_SUCCESS,
109ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler            nvram.GetInfo(get_info_request, &get_info_response));
110ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  ASSERT_EQ(1U, get_info_response.space_list.size());
111ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  EXPECT_EQ(1U, get_info_response.space_list[0]);
112ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler
113ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  GetSpaceInfoRequest get_space_info_request;
114ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  get_space_info_request.index = 1;
115ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  GetSpaceInfoResponse get_space_info_response;
116ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  EXPECT_EQ(NV_RESULT_SUCCESS, nvram.GetSpaceInfo(get_space_info_request,
117ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler                                                  &get_space_info_response));
118ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  EXPECT_EQ(10U, get_space_info_response.size);
119ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler}
120ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler
121ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias NisslerTEST_F(NvramManagerTest, Init_SpacesPresent) {
122ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  // Set up two pre-existing spaces.
123ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  NvramSpace space;
124ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  ASSERT_TRUE(space.contents.Resize(10));
125ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  ASSERT_EQ(storage::Status::kSuccess, persistence::StoreSpace(1, space));
126ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  ASSERT_TRUE(space.contents.Resize(20));
127ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  ASSERT_EQ(storage::Status::kSuccess, persistence::StoreSpace(2, space));
128ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler
129ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  // Indicate 3 present spaces in the header, including one that doesn't have
130ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  // space data in storage.
131ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  NvramHeader header;
132ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  header.version = NvramHeader::kVersion;
133ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  ASSERT_TRUE(header.allocated_indices.Resize(3));
134ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  header.allocated_indices[0] = 1;
135ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  header.allocated_indices[1] = 2;
136ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  header.allocated_indices[2] = 3;
137ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  header.provisional_index.Activate() = 4;
138ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  ASSERT_EQ(storage::Status::kSuccess, persistence::StoreHeader(header));
139ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler
140ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  NvramManager nvram;
141ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler
142ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  // Check that the spaces are correctly recovered.
143ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  GetSpaceInfoRequest get_space_info_request;
144ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  get_space_info_request.index = 1;
145ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  GetSpaceInfoResponse get_space_info_response;
146ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  EXPECT_EQ(NV_RESULT_SUCCESS, nvram.GetSpaceInfo(get_space_info_request,
147ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler                                                  &get_space_info_response));
148ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  EXPECT_EQ(10u, get_space_info_response.size);
149ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler
150ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  get_space_info_request.index = 2;
151ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  EXPECT_EQ(NV_RESULT_SUCCESS, nvram.GetSpaceInfo(get_space_info_request,
152ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler                                                  &get_space_info_response));
153ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  EXPECT_EQ(20u, get_space_info_response.size);
154ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler
155ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  get_space_info_request.index = 3;
156ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  EXPECT_EQ(
157ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler      NV_RESULT_INTERNAL_ERROR,
158ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler      nvram.GetSpaceInfo(get_space_info_request, &get_space_info_response));
159ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler
160ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  get_space_info_request.index = 4;
161ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  EXPECT_EQ(
162ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler      NV_RESULT_SPACE_DOES_NOT_EXIST,
163ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler      nvram.GetSpaceInfo(get_space_info_request, &get_space_info_response));
164ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler}
165ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler
166ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias NisslerTEST_F(NvramManagerTest, Init_BadSpacePresent) {
167ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  // Set up a good and a bad NVRAM space.
168ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  NvramSpace space;
169ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  ASSERT_TRUE(space.contents.Resize(10));
170ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  ASSERT_EQ(storage::Status::kSuccess, persistence::StoreSpace(1, space));
171ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  const uint8_t kBadSpaceData[] = {0xba, 0xad};
172ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  Blob bad_space_blob;
173ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  ASSERT_TRUE(bad_space_blob.Assign(kBadSpaceData, sizeof(kBadSpaceData)));
174ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  ASSERT_EQ(storage::Status::kSuccess,
175ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler            storage::StoreSpace(2, bad_space_blob));
176ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler
177ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  NvramHeader header;
178ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  header.version = NvramHeader::kVersion;
179ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  ASSERT_TRUE(header.allocated_indices.Resize(2));
180ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  header.allocated_indices[0] = 1;
181ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  header.allocated_indices[1] = 2;
182ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  ASSERT_EQ(storage::Status::kSuccess, persistence::StoreHeader(header));
183ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler
184ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  NvramManager nvram;
185ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler
186ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  // The bad index will fail requests.
187ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  GetSpaceInfoRequest get_space_info_request;
188ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  get_space_info_request.index = 2;
189ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  GetSpaceInfoResponse get_space_info_response;
190ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  nvram_result_t result =
191ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler      nvram.GetSpaceInfo(get_space_info_request, &get_space_info_response);
192ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  EXPECT_NE(NV_RESULT_SUCCESS, result);
193ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  EXPECT_NE(NV_RESULT_SPACE_DOES_NOT_EXIST, result);
194ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler
195ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  // A request to get info for the good index should succeed.
196ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  get_space_info_request.index = 1;
197ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  EXPECT_EQ(NV_RESULT_SUCCESS, nvram.GetSpaceInfo(get_space_info_request,
198ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler                                                  &get_space_info_response));
199ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  EXPECT_EQ(10u, get_space_info_response.size);
200ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler}
201ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler
202ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias NisslerTEST_F(NvramManagerTest, Init_NewerStorageVersion) {
203ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  // Set up an NVRAM space.
204ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  NvramSpace space;
205ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  ASSERT_TRUE(space.contents.Resize(10));
206ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  ASSERT_EQ(storage::Status::kSuccess, persistence::StoreSpace(1, space));
207ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler
208ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  SetupHeader(NvramHeader::kVersion + 1, 1);
209ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler
210ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  NvramManager nvram;
211ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler
212ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  // Requests should fail due to version mismatch.
213ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  GetSpaceInfoRequest get_space_info_request;
214ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  get_space_info_request.index = 1;
215ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  GetSpaceInfoResponse get_space_info_response;
216ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  EXPECT_EQ(
217ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler      NV_RESULT_INTERNAL_ERROR,
218ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler      nvram.GetSpaceInfo(get_space_info_request, &get_space_info_response));
219ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler}
220ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler
221ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias NisslerTEST_F(NvramManagerTest, Init_StorageObjectTypeMismatch) {
222ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  // Set up an NVRAM space.
223ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  NvramSpace space;
224ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  ASSERT_TRUE(space.contents.Resize(10));
225ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  ASSERT_EQ(storage::Status::kSuccess, persistence::StoreSpace(1, space));
226ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler
227ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  // Copy the space blob to the header storage.
228ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  Blob space_blob;
229ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  ASSERT_EQ(storage::Status::kSuccess, storage::LoadSpace(1, &space_blob));
230ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  ASSERT_EQ(storage::Status::kSuccess, storage::StoreHeader(space_blob));
231ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler
232ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  NvramManager nvram;
233ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler
234ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  // Initialization should detect that the header storage object doesn't look
235ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  // like a header, so initialization should fail.
236ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  GetInfoRequest get_info_request;
237ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  GetInfoResponse get_info_response;
238ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  EXPECT_EQ(NV_RESULT_INTERNAL_ERROR,
239ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler            nvram.GetInfo(get_info_request, &get_info_response));
240ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler}
241ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler
242ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias NisslerTEST_F(NvramManagerTest, CreateSpace_Success) {
243ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  NvramManager nvram;
244ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler
245ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  // Make a call to CreateSpace, which should succeed.
246ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  CreateSpaceRequest create_space_request;
247ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  create_space_request.index = 1;
24858e77d095777bee864fd1dda31837ac4e21bb43fMattias Nissler  create_space_request.size = 32;
249ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  ASSERT_TRUE(create_space_request.controls.Resize(5));
250ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  create_space_request.controls[0] = NV_CONTROL_BOOT_WRITE_LOCK;
251ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  create_space_request.controls[1] = NV_CONTROL_BOOT_READ_LOCK;
252ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  create_space_request.controls[2] = NV_CONTROL_WRITE_AUTHORIZATION;
253ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  create_space_request.controls[3] = NV_CONTROL_READ_AUTHORIZATION;
254ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  create_space_request.controls[4] = NV_CONTROL_WRITE_EXTEND;
255ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler
256ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  CreateSpaceResponse create_space_response;
257ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  EXPECT_EQ(NV_RESULT_SUCCESS,
258ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler            nvram.CreateSpace(create_space_request, &create_space_response));
259ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler
260ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  // GetSpaceInfo should reflect the space parameters set during creation.
261ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  GetSpaceInfoRequest get_space_info_request;
262ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  get_space_info_request.index = 1;
263ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  GetSpaceInfoResponse get_space_info_response;
264ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  EXPECT_EQ(NV_RESULT_SUCCESS, nvram.GetSpaceInfo(get_space_info_request,
265ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler                                                  &get_space_info_response));
266ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler
26758e77d095777bee864fd1dda31837ac4e21bb43fMattias Nissler  EXPECT_EQ(32u, get_space_info_response.size);
268ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  EXPECT_EQ(GetControlsMask(create_space_request.controls),
269ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler            GetControlsMask(get_space_info_response.controls));
270ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  EXPECT_EQ(false, get_space_info_response.read_locked);
271ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  EXPECT_EQ(false, get_space_info_response.write_locked);
272ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler}
273ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler
274ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias NisslerTEST_F(NvramManagerTest, CreateSpace_Existing) {
275ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  // Set up an NVRAM space.
276ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  NvramSpace space;
277ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  ASSERT_TRUE(space.contents.Resize(10));
278ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  ASSERT_EQ(storage::Status::kSuccess, persistence::StoreSpace(1, space));
279ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler
280ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  SetupHeader(NvramHeader::kVersion, 1);
281ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler
282ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  NvramManager nvram;
283ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler
284ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  // A request to create another space with the same index should fail.
285ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  CreateSpaceRequest create_space_request;
286ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  create_space_request.index = 1;
287ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  create_space_request.size = 16;
288ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler
289ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  CreateSpaceResponse create_space_response;
290ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  EXPECT_EQ(NV_RESULT_SPACE_ALREADY_EXISTS,
291ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler            nvram.CreateSpace(create_space_request, &create_space_response));
292ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler}
293ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler
294ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias NisslerTEST_F(NvramManagerTest, CreateSpace_TooLarge) {
295ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  NvramManager nvram;
296ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler
297ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  // A request to create a space with a too large content size should fail.
298ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  CreateSpaceRequest create_space_request;
299ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  create_space_request.index = 1;
300ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  create_space_request.size = 16384;
301ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler
302ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  CreateSpaceResponse create_space_response;
303ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  EXPECT_EQ(NV_RESULT_INVALID_PARAMETER,
304ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler            nvram.CreateSpace(create_space_request, &create_space_response));
305ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler}
306ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler
307ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias NisslerTEST_F(NvramManagerTest, CreateSpace_AuthTooLarge) {
308ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  NvramManager nvram;
309ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler
310ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  // A request to create a space with a too large authorization value size
311ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  // should fail.
312ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  CreateSpaceRequest create_space_request;
313ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  create_space_request.index = 1;
314ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  ASSERT_TRUE(create_space_request.authorization_value.Resize(256));
315ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler
316ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  CreateSpaceResponse create_space_response;
317ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  EXPECT_EQ(NV_RESULT_INVALID_PARAMETER,
318ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler            nvram.CreateSpace(create_space_request, &create_space_response));
319ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler}
320ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler
321ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias NisslerTEST_F(NvramManagerTest, CreateSpace_BadControl) {
322ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  NvramManager nvram;
323ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler
324ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  // A request to create a space with an unknown control value should fail.
325ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  CreateSpaceRequest create_space_request;
326ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  create_space_request.index = 1;
327ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  create_space_request.size = 16;
328ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  ASSERT_TRUE(create_space_request.controls.Resize(2));
329ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  create_space_request.controls[0] = NV_CONTROL_BOOT_WRITE_LOCK;
330ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  create_space_request.controls[1] = 17;
331ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler
332ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  CreateSpaceResponse create_space_response;
333ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  EXPECT_EQ(NV_RESULT_INVALID_PARAMETER,
334ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler            nvram.CreateSpace(create_space_request, &create_space_response));
335ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler}
336ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler
337ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias NisslerTEST_F(NvramManagerTest, CreateSpace_ControlWriteLockExclusive) {
338ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  NvramManager nvram;
339ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler
340ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  // Spaces may not be created with conflicting write lock modes.
341ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  CreateSpaceRequest create_space_request;
342ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  create_space_request.index = 1;
343ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  create_space_request.size = 16;
344ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  ASSERT_TRUE(create_space_request.controls.Resize(2));
345ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  create_space_request.controls[0] = NV_CONTROL_BOOT_WRITE_LOCK;
346ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  create_space_request.controls[1] = NV_CONTROL_PERSISTENT_WRITE_LOCK;
347ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler
348ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  CreateSpaceResponse create_space_response;
349ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  EXPECT_EQ(NV_RESULT_INVALID_PARAMETER,
350ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler            nvram.CreateSpace(create_space_request, &create_space_response));
351ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler}
352ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler
35358e77d095777bee864fd1dda31837ac4e21bb43fMattias NisslerTEST_F(NvramManagerTest, CreateSpace_WriteExtendSpaceSize) {
35458e77d095777bee864fd1dda31837ac4e21bb43fMattias Nissler  NvramManager nvram;
35558e77d095777bee864fd1dda31837ac4e21bb43fMattias Nissler
35658e77d095777bee864fd1dda31837ac4e21bb43fMattias Nissler  // Write-extend spaces must match SHA256 hash size, i.e. 32 bytes.
35758e77d095777bee864fd1dda31837ac4e21bb43fMattias Nissler  CreateSpaceRequest create_space_request;
35858e77d095777bee864fd1dda31837ac4e21bb43fMattias Nissler  create_space_request.index = 1;
35958e77d095777bee864fd1dda31837ac4e21bb43fMattias Nissler  create_space_request.size = 16;
36058e77d095777bee864fd1dda31837ac4e21bb43fMattias Nissler  ASSERT_TRUE(create_space_request.controls.Resize(1));
36158e77d095777bee864fd1dda31837ac4e21bb43fMattias Nissler  create_space_request.controls[0] = NV_CONTROL_WRITE_EXTEND;
36258e77d095777bee864fd1dda31837ac4e21bb43fMattias Nissler
36358e77d095777bee864fd1dda31837ac4e21bb43fMattias Nissler  CreateSpaceResponse create_space_response;
36458e77d095777bee864fd1dda31837ac4e21bb43fMattias Nissler  EXPECT_EQ(NV_RESULT_INVALID_PARAMETER,
36558e77d095777bee864fd1dda31837ac4e21bb43fMattias Nissler            nvram.CreateSpace(create_space_request, &create_space_response));
36658e77d095777bee864fd1dda31837ac4e21bb43fMattias Nissler}
36758e77d095777bee864fd1dda31837ac4e21bb43fMattias Nissler
368ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias NisslerTEST_F(NvramManagerTest, CreateSpace_HeaderWriteError) {
369ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  // If the header fails to get written to storage, the creation request should
370ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  // fail.
371625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  storage::SetHeaderWriteError(true);
372625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler
373625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  NvramManager nvram;
374ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler
375ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  CreateSpaceRequest create_space_request;
376ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  create_space_request.index = 1;
377ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  create_space_request.size = 16;
378ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler
379ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  CreateSpaceResponse create_space_response;
380ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  EXPECT_EQ(NV_RESULT_INTERNAL_ERROR,
381ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler            nvram.CreateSpace(create_space_request, &create_space_response));
382ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler
383ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  // The space shouldn't be present.
384625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  GetInfoRequest get_info_request;
385625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  GetInfoResponse get_info_response;
386ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  EXPECT_EQ(NV_RESULT_SUCCESS,
387ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler            nvram.GetInfo(get_info_request, &get_info_response));
388ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  EXPECT_EQ(0U, get_info_response.space_list.size());
389ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler
390ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  // Creation of the space after clearing the error should work.
391625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  storage::SetHeaderWriteError(false);
392ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  EXPECT_EQ(NV_RESULT_SUCCESS,
393ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler            nvram.CreateSpace(create_space_request, &create_space_response));
394ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler
395ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  // The space should be reported as allocated now.
396ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  EXPECT_EQ(NV_RESULT_SUCCESS,
397ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler            nvram.GetInfo(get_info_request, &get_info_response));
398ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  ASSERT_EQ(1U, get_info_response.space_list.size());
399ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  EXPECT_EQ(1U, get_info_response.space_list[0]);
400ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler}
401ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler
402ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias NisslerTEST_F(NvramManagerTest, CreateSpace_SpaceWriteError) {
403625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  storage::SetSpaceWriteError(1, true);
404ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  NvramManager nvram;
405ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler
406ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  // A request to create another space with the same index should fail.
407ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  CreateSpaceRequest create_space_request;
408ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  create_space_request.index = 1;
409ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  create_space_request.size = 16;
410ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler
411ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  CreateSpaceResponse create_space_response;
412ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  EXPECT_EQ(NV_RESULT_INTERNAL_ERROR,
413ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler            nvram.CreateSpace(create_space_request, &create_space_response));
414ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler
415ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  // Reloading the state after a crash should not show any traces of the space.
416625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  storage::SetSpaceWriteError(1, false);
417ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  NvramManager nvram2;
418ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler
419ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  // The space shouldn't exist in the space list.
420ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  GetInfoRequest get_info_request;
421ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  GetInfoResponse get_info_response;
422ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  EXPECT_EQ(NV_RESULT_SUCCESS,
423ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler            nvram2.GetInfo(get_info_request, &get_info_response));
424ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler
425ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  EXPECT_EQ(0U, get_info_response.space_list.size());
426ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler
427ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  // The space info request should indicate the space doesn't exist.
428ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  GetSpaceInfoRequest get_space_info_request;
429ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  get_space_info_request.index = 1;
430ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  GetSpaceInfoResponse get_space_info_response;
431ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  EXPECT_EQ(
432ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler      NV_RESULT_SPACE_DOES_NOT_EXIST,
433ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler      nvram2.GetSpaceInfo(get_space_info_request, &get_space_info_response));
434ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler}
435ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler
436625cbbe0b6f4a31079e889ac092456ac1893812bMattias NisslerTEST_F(NvramManagerTest, DeleteSpace_SpaceAbsent) {
437625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  NvramManager nvram;
438625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler
439625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  // Attempt to delete a non-existing space.
440625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  DeleteSpaceRequest delete_space_request;
441625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  delete_space_request.index = 42;
442625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  DeleteSpaceResponse delete_space_response;
443625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  EXPECT_EQ(NV_RESULT_SPACE_DOES_NOT_EXIST,
444625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler            nvram.DeleteSpace(delete_space_request, &delete_space_response));
445625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler}
446625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler
447625cbbe0b6f4a31079e889ac092456ac1893812bMattias NisslerTEST_F(NvramManagerTest, DeleteSpace_Success) {
448625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  // Set up an NVRAM space.
449625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  NvramSpace space;
450625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  ASSERT_TRUE(space.contents.Resize(10));
451625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  ASSERT_EQ(storage::Status::kSuccess, persistence::StoreSpace(42, space));
452625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  SetupHeader(NvramHeader::kVersion, 42);
453625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler
454625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  NvramManager nvram;
455625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler
456625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  // Successful deletion.
457625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  DeleteSpaceRequest delete_space_request;
458625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  delete_space_request.index = 42;
459625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  DeleteSpaceResponse delete_space_response;
460625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  EXPECT_EQ(NV_RESULT_SUCCESS,
461625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler            nvram.DeleteSpace(delete_space_request, &delete_space_response));
462625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler}
463625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler
464625cbbe0b6f4a31079e889ac092456ac1893812bMattias NisslerTEST_F(NvramManagerTest, DeleteSpace_AuthorizationFailure) {
465625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  // Set up an NVRAM space.
466625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  NvramSpace space;
467625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  space.controls = (1 << NV_CONTROL_WRITE_AUTHORIZATION);
468625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  const char kAuthorizationValue[] = "secret";
469625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  ASSERT_TRUE(space.authorization_value.Assign(kAuthorizationValue,
470625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler                                               sizeof(kAuthorizationValue)));
471625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  ASSERT_TRUE(space.contents.Resize(10));
472625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  ASSERT_EQ(storage::Status::kSuccess, persistence::StoreSpace(42, space));
473625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  SetupHeader(NvramHeader::kVersion, 42);
474625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler
475625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  NvramManager nvram;
476625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler
477625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  // Deletion should fail if correct secret is not provided.
478625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  DeleteSpaceRequest delete_space_request;
479625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  delete_space_request.index = 42;
480625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  DeleteSpaceResponse delete_space_response;
481625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  EXPECT_EQ(NV_RESULT_ACCESS_DENIED,
482625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler            nvram.DeleteSpace(delete_space_request, &delete_space_response));
483625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler}
484625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler
485625cbbe0b6f4a31079e889ac092456ac1893812bMattias NisslerTEST_F(NvramManagerTest, DeleteSpace_HalfDeleted) {
486625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  // Set up an NVRAM space.
487625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  NvramSpace space;
488625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  ASSERT_TRUE(space.contents.Resize(10));
489625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  ASSERT_EQ(storage::Status::kSuccess, persistence::StoreSpace(42, space));
490625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  SetupHeader(NvramHeader::kVersion, 42);
491625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler
492625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  // Hold on to the space data.
493625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  Blob space_data;
494625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  ASSERT_EQ(storage::Status::kSuccess, storage::LoadSpace(42, &space_data));
495625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler
496625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  NvramManager nvram;
497625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler
498625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  // Delete the space.
499625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  DeleteSpaceRequest delete_space_request;
500625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  delete_space_request.index = 42;
501625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  DeleteSpaceResponse delete_space_response;
502625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  EXPECT_EQ(NV_RESULT_SUCCESS,
503625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler            nvram.DeleteSpace(delete_space_request, &delete_space_response));
504625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler
505625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  // Put the space data back into place to simulate a half-completed deletion.
506625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  ASSERT_EQ(storage::Status::kSuccess, storage::StoreSpace(42, space_data));
507625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler
508625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  // The space should remain deleted after re-initialization.
509625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  NvramManager nvram2;
510625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler
511625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  GetSpaceInfoRequest get_space_info_request;
512625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  get_space_info_request.index = 42;
513625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  GetSpaceInfoResponse get_space_info_response;
514625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  EXPECT_EQ(
515625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler      NV_RESULT_SPACE_DOES_NOT_EXIST,
516625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler      nvram2.GetSpaceInfo(get_space_info_request, &get_space_info_response));
517625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler
518625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  // Re-creation of a space with the same index should work.
519625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  CreateSpaceRequest create_space_request;
520625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  create_space_request.index = 42;
521625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  create_space_request.size = 32;
522625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  ASSERT_TRUE(create_space_request.controls.Resize(1));
523625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  create_space_request.controls[0] = NV_CONTROL_BOOT_WRITE_LOCK;
524625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  CreateSpaceResponse create_space_response;
525625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  EXPECT_EQ(NV_RESULT_SUCCESS,
526625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler            nvram2.CreateSpace(create_space_request, &create_space_response));
527625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler}
528625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler
529625cbbe0b6f4a31079e889ac092456ac1893812bMattias NisslerTEST_F(NvramManagerTest, DeleteSpace_SpaceDeleteError) {
530625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  // Set up an NVRAM space.
531625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  NvramSpace space;
532625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  ASSERT_TRUE(space.contents.Resize(10));
533625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  ASSERT_EQ(storage::Status::kSuccess, persistence::StoreSpace(42, space));
534625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  SetupHeader(NvramHeader::kVersion, 42);
535625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler
536625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  // Make space deletion fail.
537625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  storage::SetSpaceWriteError(42, true);
538625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler
539625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  NvramManager nvram;
540625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler
541625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  // Attempt to delete the space.
542625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  DeleteSpaceRequest delete_space_request;
543625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  delete_space_request.index = 42;
544625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  DeleteSpaceResponse delete_space_response;
545625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  EXPECT_EQ(NV_RESULT_INTERNAL_ERROR,
546625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler            nvram.DeleteSpace(delete_space_request, &delete_space_response));
547625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler
548625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  // The space should remain present.
549625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  GetSpaceInfoRequest get_space_info_request;
550625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  get_space_info_request.index = 42;
551625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  GetSpaceInfoResponse get_space_info_response;
552625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  EXPECT_EQ(NV_RESULT_SUCCESS, nvram.GetSpaceInfo(get_space_info_request,
553625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler                                                  &get_space_info_response));
554625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  EXPECT_EQ(10U, get_space_info_response.size);
555625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler
556625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  // Starting up from scratch shouldn't destroy the space either.
557625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  storage::SetSpaceWriteError(42, false);
558625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler
559625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  NvramManager nvram2;
560625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler
561625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  GetSpaceInfoResponse get_space_info_response_2;
562625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  EXPECT_EQ(NV_RESULT_SUCCESS, nvram.GetSpaceInfo(get_space_info_request,
563625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler                                                  &get_space_info_response_2));
564625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  EXPECT_EQ(10U, get_space_info_response_2.size);
565625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler}
566625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler
567625cbbe0b6f4a31079e889ac092456ac1893812bMattias NisslerTEST_F(NvramManagerTest, DeleteSpace_HeaderWriteError) {
568625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  // Set up an NVRAM space.
569625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  NvramSpace space;
570625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  ASSERT_TRUE(space.contents.Resize(10));
571625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  ASSERT_EQ(storage::Status::kSuccess, persistence::StoreSpace(42, space));
572625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  SetupHeader(NvramHeader::kVersion, 42);
573625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler
574625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  // Header write on deletion will fail.
575625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  storage::SetHeaderWriteError(true);
576625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler
577625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  NvramManager nvram;
578625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler
579625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  // Attempt to delete the space.
580625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  DeleteSpaceRequest delete_space_request;
581625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  delete_space_request.index = 42;
582625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  DeleteSpaceResponse delete_space_response;
583625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  EXPECT_EQ(NV_RESULT_INTERNAL_ERROR,
584625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler            nvram.DeleteSpace(delete_space_request, &delete_space_response));
585625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler
586625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  // The space should remain present.
587625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  GetSpaceInfoRequest get_space_info_request;
588625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  get_space_info_request.index = 42;
589625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  GetSpaceInfoResponse get_space_info_response;
590625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  EXPECT_EQ(NV_RESULT_SUCCESS, nvram.GetSpaceInfo(get_space_info_request,
591625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler                                                  &get_space_info_response));
592625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  EXPECT_EQ(10U, get_space_info_response.size);
593625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler
594625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  // Starting up from scratch shouldn't destroy the space either.
595625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  storage::SetSpaceWriteError(42, false);
596625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler
597625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  NvramManager nvram2;
598625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler
599625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  GetSpaceInfoResponse get_space_info_response_2;
600625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  EXPECT_EQ(NV_RESULT_SUCCESS, nvram.GetSpaceInfo(get_space_info_request,
601625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler                                                  &get_space_info_response_2));
602625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  EXPECT_EQ(10U, get_space_info_response_2.size);
603625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler}
604625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler
605625cbbe0b6f4a31079e889ac092456ac1893812bMattias NisslerTEST_F(NvramManagerTest, DisableCreate_Success) {
606625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  NvramManager nvram;
607625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler
608625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  // Issue a successful disable create request.
609625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  DisableCreateRequest disable_create_request;
610625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  DisableCreateResponse disable_create_response;
611625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  EXPECT_EQ(NV_RESULT_SUCCESS, nvram.DisableCreate(disable_create_request,
612625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler                                                   &disable_create_response));
613625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler
614625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  // Make sure space creation request fail afterwards.
615625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  CreateSpaceRequest create_space_request;
616625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  create_space_request.index = 1;
617625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  create_space_request.size = 32;
618625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  ASSERT_TRUE(create_space_request.controls.Resize(1));
619625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  create_space_request.controls[0] = NV_CONTROL_BOOT_WRITE_LOCK;
620625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  CreateSpaceResponse create_space_response;
621625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  EXPECT_EQ(NV_RESULT_OPERATION_DISABLED,
622625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler            nvram.CreateSpace(create_space_request, &create_space_response));
623625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler
624625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  // Redundant requests to disable creation are OK.
625625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  EXPECT_EQ(NV_RESULT_SUCCESS, nvram.DisableCreate(disable_create_request,
626625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler                                                   &disable_create_response));
627625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler
628625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  // Space creation should remain disabled even after a reboot.
629625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  NvramManager nvram2;
630625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  EXPECT_EQ(NV_RESULT_OPERATION_DISABLED,
631625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler            nvram2.CreateSpace(create_space_request, &create_space_response));
632625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler}
633625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler
634625cbbe0b6f4a31079e889ac092456ac1893812bMattias NisslerTEST_F(NvramManagerTest, DisableCreate_WriteError) {
635625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  // Make header writes fail.
636625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  storage::SetHeaderWriteError(true);
637625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler
638625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  NvramManager nvram;
639625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler
640625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  // The disable request should fail.
641625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  DisableCreateRequest disable_create_request;
642625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  DisableCreateResponse disable_create_response;
643625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  EXPECT_EQ(
644625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler      NV_RESULT_INTERNAL_ERROR,
645625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler      nvram.DisableCreate(disable_create_request, &disable_create_response));
646625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler
647625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  // We should still be able to create spaces after clearing the error.
648625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  storage::SetHeaderWriteError(false);
649625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler
650625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  CreateSpaceRequest create_space_request;
651625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  create_space_request.index = 1;
652625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  create_space_request.size = 32;
653625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  ASSERT_TRUE(create_space_request.controls.Resize(1));
654625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  create_space_request.controls[0] = NV_CONTROL_BOOT_WRITE_LOCK;
655625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  CreateSpaceResponse create_space_response;
656625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  EXPECT_EQ(NV_RESULT_SUCCESS,
657625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler            nvram.CreateSpace(create_space_request, &create_space_response));
658625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler}
659625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler
660625cbbe0b6f4a31079e889ac092456ac1893812bMattias NisslerTEST_F(NvramManagerTest, WriteSpace_SpaceAbsent) {
661625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  NvramManager nvram;
662625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler
663625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  // Attempt to write a non-existing space.
664625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  WriteSpaceRequest write_space_request;
665625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  write_space_request.index = 17;
666625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  ASSERT_TRUE(write_space_request.buffer.Assign("0123456789", 10));
667625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  WriteSpaceResponse write_space_response;
668625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  EXPECT_EQ(NV_RESULT_SPACE_DOES_NOT_EXIST,
669625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler            nvram.WriteSpace(write_space_request, &write_space_response));
670625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler}
671625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler
672625cbbe0b6f4a31079e889ac092456ac1893812bMattias NisslerTEST_F(NvramManagerTest, WriteSpace_Success) {
673625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  // Set up an NVRAM space.
674625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  NvramSpace space;
675625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  ASSERT_TRUE(space.contents.Resize(10));
676625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  ASSERT_EQ(storage::Status::kSuccess, persistence::StoreSpace(17, space));
677625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  SetupHeader(NvramHeader::kVersion, 17);
678625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler
679625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  NvramManager nvram;
680625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler
681625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  // Write the space.
682625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  WriteSpaceRequest write_space_request;
683625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  write_space_request.index = 17;
684625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  ASSERT_TRUE(write_space_request.buffer.Assign("0123456789", 10));
685625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  WriteSpaceResponse write_space_response;
686625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  EXPECT_EQ(NV_RESULT_SUCCESS, nvram.WriteSpace(write_space_request,
687625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler                                                &write_space_response));
688625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler
689625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  // Read back the space and compare contents.
690625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  ReadAndCompareSpaceData(&nvram, 17, "0123456789", 10);
691625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler
692625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  // The data should persist even after a reboot.
693625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  NvramManager nvram2;
694625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler
695625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  ReadAndCompareSpaceData(&nvram2, 17, "0123456789", 10);
696625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler}
697625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler
698625cbbe0b6f4a31079e889ac092456ac1893812bMattias NisslerTEST_F(NvramManagerTest, WriteSpace_ExcessData) {
699625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  // Set up an NVRAM space.
700625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  NvramSpace space;
701625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  ASSERT_TRUE(space.contents.Resize(10));
702625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  ASSERT_EQ(storage::Status::kSuccess, persistence::StoreSpace(17, space));
703625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  SetupHeader(NvramHeader::kVersion, 17);
704625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler
705625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  NvramManager nvram;
706625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler
707625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  // Write the space.
708625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  WriteSpaceRequest write_space_request;
709625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  write_space_request.index = 17;
710625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  ASSERT_TRUE(write_space_request.buffer.Assign("0123456789abcdef", 16));
711625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  WriteSpaceResponse write_space_response;
712625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  EXPECT_EQ(NV_RESULT_INVALID_PARAMETER,
713625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler            nvram.WriteSpace(write_space_request, &write_space_response));
714625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler}
715625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler
716625cbbe0b6f4a31079e889ac092456ac1893812bMattias NisslerTEST_F(NvramManagerTest, WriteSpace_ShortData) {
717625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  // Set up an NVRAM space.
718625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  NvramSpace space;
719625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  ASSERT_TRUE(space.contents.Resize(10));
720625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  memset(space.contents.data(), 'X', space.contents.size());
721625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  ASSERT_EQ(storage::Status::kSuccess, persistence::StoreSpace(17, space));
722625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  SetupHeader(NvramHeader::kVersion, 17);
723625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler
724625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  NvramManager nvram;
725625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler
726625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  // Write the space.
727625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  WriteSpaceRequest write_space_request;
728625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  write_space_request.index = 17;
729625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  ASSERT_TRUE(write_space_request.buffer.Assign("01234", 5));
730625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  WriteSpaceResponse write_space_response;
731625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  EXPECT_EQ(NV_RESULT_SUCCESS,
732625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler            nvram.WriteSpace(write_space_request, &write_space_response));
733625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler
734625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  // Read back the space data and verify that the missing content bytes have
735625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  // been set to 0.
736625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  const uint8_t kExpectedContents[] = {'0', '1', '2', '3', '4', 0, 0, 0, 0, 0};
737625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  ReadAndCompareSpaceData(&nvram, 17, kExpectedContents, 10);
738625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler}
739625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler
740625cbbe0b6f4a31079e889ac092456ac1893812bMattias NisslerTEST_F(NvramManagerTest, WriteSpace_WriteExtend) {
741625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  // Set up an NVRAM space.
742625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  NvramSpace space;
743625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  space.controls = (1 << NV_CONTROL_WRITE_EXTEND);
744625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  ASSERT_TRUE(space.contents.Resize(32));
745625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  memset(space.contents.data(), 0, space.contents.size());
746625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  ASSERT_EQ(storage::Status::kSuccess, persistence::StoreSpace(17, space));
747625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  SetupHeader(NvramHeader::kVersion, 17);
748625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler
749625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  NvramManager nvram;
750625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler
751625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  // Write the space.
752625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  WriteSpaceRequest write_space_request;
753625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  write_space_request.index = 17;
754625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  ASSERT_TRUE(write_space_request.buffer.Assign("data", 4));
755625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  WriteSpaceResponse write_space_response;
756625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  EXPECT_EQ(NV_RESULT_SUCCESS,
757625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler            nvram.WriteSpace(write_space_request, &write_space_response));
758625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler
759625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  // Read back the space data and verify the hash.
760625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  const uint8_t kExpectedContents[] = {
761625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler      0xee, 0x84, 0x52, 0x88, 0xbb, 0x60, 0x7e, 0x02, 0xfd, 0xfb, 0x31,
762625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler      0x95, 0x3a, 0x77, 0x23, 0xcf, 0x67, 0xea, 0x6e, 0x2d, 0xd7, 0xdb,
763625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler      0x8c, 0xb4, 0xe4, 0xd2, 0xfd, 0xb4, 0x76, 0x7a, 0x67, 0x89,
764625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  };
765625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  ReadAndCompareSpaceData(&nvram, 17, kExpectedContents, 32);
766625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler}
767625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler
768625cbbe0b6f4a31079e889ac092456ac1893812bMattias NisslerTEST_F(NvramManagerTest, WriteSpace_WriteExtendShortSpace) {
769625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  // Set up an NVRAM space.
770625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  NvramSpace space;
771625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  space.controls = (1 << NV_CONTROL_WRITE_EXTEND);
772625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  ASSERT_TRUE(space.contents.Resize(16));
773625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  memset(space.contents.data(), 0, space.contents.size());
774625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  ASSERT_EQ(storage::Status::kSuccess, persistence::StoreSpace(17, space));
775625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  SetupHeader(NvramHeader::kVersion, 17);
776625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler
777625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  NvramManager nvram;
778625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler
779625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  // Write the space.
780625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  WriteSpaceRequest write_space_request;
781625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  write_space_request.index = 17;
782625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  ASSERT_TRUE(write_space_request.buffer.Assign("data", 4));
783625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  WriteSpaceResponse write_space_response;
784625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  EXPECT_EQ(NV_RESULT_SUCCESS,
785625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler            nvram.WriteSpace(write_space_request, &write_space_response));
786625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler
787625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  // Read back the space data and verify the truncated hash.
788625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  const uint8_t kExpectedContents[] = {
789625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler      0x24, 0x2a, 0xbb, 0x36, 0x10, 0x37, 0x92, 0x3f,
790625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler      0x7d, 0x7d, 0x92, 0x3a, 0x16, 0x65, 0xd2, 0xa2,
791625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  };
792625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  ReadAndCompareSpaceData(&nvram, 17, kExpectedContents, 16);
793625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler}
794625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler
795625cbbe0b6f4a31079e889ac092456ac1893812bMattias NisslerTEST_F(NvramManagerTest, WriteSpace_WriteExtendLongSpace) {
796625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  // Set up an NVRAM space.
797625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  NvramSpace space;
798625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  space.controls = (1 << NV_CONTROL_WRITE_EXTEND);
799625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  ASSERT_TRUE(space.contents.Resize(33));
800625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  memset(space.contents.data(), 'X', space.contents.size());
801625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  ASSERT_EQ(storage::Status::kSuccess, persistence::StoreSpace(17, space));
802625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  SetupHeader(NvramHeader::kVersion, 17);
803625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler
804625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  NvramManager nvram;
805625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler
806625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  // Write the space.
807625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  WriteSpaceRequest write_space_request;
808625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  write_space_request.index = 17;
809625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  ASSERT_TRUE(write_space_request.buffer.Assign("data", 4));
810625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  WriteSpaceResponse write_space_response;
811625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  EXPECT_EQ(NV_RESULT_SUCCESS,
812625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler            nvram.WriteSpace(write_space_request, &write_space_response));
813625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler
814625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  // Read back the space data and verify the hash and trailing 0 bytes.
815625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  const uint8_t kExpectedContents[] = {
816625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler      0x99, 0xb8, 0x5f, 0xd0, 0xf7, 0x9b, 0x17, 0x2e, 0x0e, 0x58, 0x3d,
817625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler      0x3c, 0x9a, 0x29, 0xa3, 0xaf, 0x0a, 0x4c, 0x68, 0x97, 0x72, 0x8c,
818625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler      0x0c, 0xa4, 0x37, 0xad, 0x39, 0xf3, 0x8c, 0x6e, 0x64, 0xd7, 0x00,
819625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  };
820625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  ReadAndCompareSpaceData(&nvram, 17, kExpectedContents, 33);
821625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler}
822625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler
823625cbbe0b6f4a31079e889ac092456ac1893812bMattias NisslerTEST_F(NvramManagerTest, WriteSpace_AuthorizationFailure) {
824625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  // Set up an NVRAM space.
825625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  NvramSpace space;
826625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  space.controls = (1 << NV_CONTROL_WRITE_AUTHORIZATION);
827625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  ASSERT_TRUE(space.contents.Resize(10));
828625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  const char kAuthorizationValue[] = "secret";
829625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  ASSERT_TRUE(space.authorization_value.Assign(kAuthorizationValue,
830625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler                                               sizeof(kAuthorizationValue)));
831625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  ASSERT_TRUE(space.contents.Assign("0123456789", 10));
832625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  ASSERT_EQ(storage::Status::kSuccess, persistence::StoreSpace(17, space));
833625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  SetupHeader(NvramHeader::kVersion, 17);
834625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler
835625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  NvramManager nvram;
836625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler
837625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  // Attempt a write with the wrong authorization value.
838625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  WriteSpaceRequest write_space_request;
839625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  write_space_request.index = 17;
840625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  ASSERT_TRUE(write_space_request.buffer.Assign("data", 4));
841625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  WriteSpaceResponse write_space_response;
842625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  EXPECT_EQ(NV_RESULT_ACCESS_DENIED,
843625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler            nvram.WriteSpace(write_space_request, &write_space_response));
844625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler
845625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  // The previous data should remain effective.
846625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  ReadAndCompareSpaceData(&nvram, 17, "0123456789", 10);
847625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler}
848625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler
849625cbbe0b6f4a31079e889ac092456ac1893812bMattias NisslerTEST_F(NvramManagerTest, WriteSpace_WriteError) {
850625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  // Set up an NVRAM space.
851625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  NvramSpace space;
852625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  ASSERT_TRUE(space.contents.Assign("0123456789", 10));
853625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  ASSERT_EQ(storage::Status::kSuccess, persistence::StoreSpace(17, space));
854625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  SetupHeader(NvramHeader::kVersion, 17);
855625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler
856625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  NvramManager nvram;
857625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler
858625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  storage::SetSpaceWriteError(17, true);
859625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler
860625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  // Attempt a write, which should fail.
861625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  WriteSpaceRequest write_space_request;
862625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  write_space_request.index = 17;
863625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  ASSERT_TRUE(write_space_request.buffer.Assign("data", 4));
864625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  WriteSpaceResponse write_space_response;
865625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  EXPECT_EQ(NV_RESULT_INTERNAL_ERROR,
866625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler            nvram.WriteSpace(write_space_request, &write_space_response));
867625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler
868625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  // The previous data should remain effective.
869625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  ReadAndCompareSpaceData(&nvram, 17, "0123456789", 10);
870625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler}
871625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler
872625cbbe0b6f4a31079e889ac092456ac1893812bMattias NisslerTEST_F(NvramManagerTest, ReadSpace_SpaceAbsent) {
873625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  NvramManager nvram;
874625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler
875625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  // Attempt a read from a space that doesn't exist.
876625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  ReadSpaceRequest read_space_request;
877625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  read_space_request.index = 17;
878625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  ReadSpaceResponse read_space_response;
879625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  EXPECT_EQ(NV_RESULT_SPACE_DOES_NOT_EXIST,
880625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler            nvram.ReadSpace(read_space_request, &read_space_response));
881625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler}
882625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler
883625cbbe0b6f4a31079e889ac092456ac1893812bMattias NisslerTEST_F(NvramManagerTest, ReadSpace_AuthorizationFailure) {
884625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  // Set up an NVRAM space.
885625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  NvramSpace space;
886625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  space.controls = (1 << NV_CONTROL_READ_AUTHORIZATION);
887625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  ASSERT_TRUE(space.contents.Resize(10));
888625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  const char kAuthorizationValue[] = "secret";
889625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  ASSERT_TRUE(space.authorization_value.Assign(kAuthorizationValue,
890625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler                                               sizeof(kAuthorizationValue)));
891625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  ASSERT_EQ(storage::Status::kSuccess, persistence::StoreSpace(17, space));
892625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  SetupHeader(NvramHeader::kVersion, 17);
893625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler
894625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  NvramManager nvram;
895625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler
896625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  // Attempt a read from the space.
897625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  ReadSpaceRequest read_space_request;
898625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  read_space_request.index = 17;
899625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  ReadSpaceResponse read_space_response;
900625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  EXPECT_EQ(NV_RESULT_ACCESS_DENIED,
901625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler            nvram.ReadSpace(read_space_request, &read_space_response));
902625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  EXPECT_EQ(0U, read_space_response.buffer.size());
903625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler}
904625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler
905625cbbe0b6f4a31079e889ac092456ac1893812bMattias NisslerTEST_F(NvramManagerTest, LockSpaceWrite_SpaceAbsent) {
906625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  NvramManager nvram;
907625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler
908625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  // Attempt to lock a space that doesn't exist.
909625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  LockSpaceWriteRequest lock_space_write_request;
910625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  lock_space_write_request.index = 17;
911625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  LockSpaceWriteResponse lock_space_write_response;
912625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  EXPECT_EQ(NV_RESULT_SPACE_DOES_NOT_EXIST,
913625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler            nvram.LockSpaceWrite(lock_space_write_request,
914625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler                                 &lock_space_write_response));
915625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler}
916625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler
917625cbbe0b6f4a31079e889ac092456ac1893812bMattias NisslerTEST_F(NvramManagerTest, LockSpaceWrite_AuthorizationFailure) {
918625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  // Set up an NVRAM space.
919625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  NvramSpace space;
920625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  space.controls = (1 << NV_CONTROL_PERSISTENT_WRITE_LOCK) |
921625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler                   (1 << NV_CONTROL_WRITE_AUTHORIZATION);
922625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  ASSERT_TRUE(space.contents.Resize(10));
923625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  const char kAuthorizationValue[] = "secret";
924625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  ASSERT_TRUE(space.authorization_value.Assign(kAuthorizationValue,
925625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler                                               sizeof(kAuthorizationValue)));
926625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  ASSERT_EQ(storage::Status::kSuccess, persistence::StoreSpace(17, space));
927625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  SetupHeader(NvramHeader::kVersion, 17);
928625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler
929625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  NvramManager nvram;
930625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler
931625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  // Attempt to lock a space without valid authentication.
932625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  LockSpaceWriteRequest lock_space_write_request;
933625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  lock_space_write_request.index = 17;
934625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  LockSpaceWriteResponse lock_space_write_response;
935625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  EXPECT_EQ(NV_RESULT_ACCESS_DENIED,
936625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler            nvram.LockSpaceWrite(lock_space_write_request,
937625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler                                 &lock_space_write_response));
938625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler}
939625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler
940625cbbe0b6f4a31079e889ac092456ac1893812bMattias NisslerTEST_F(NvramManagerTest, LockSpaceWrite_SuccessPersistent) {
941625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  // Set up an NVRAM space.
942625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  NvramSpace space;
943625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  space.controls = (1 << NV_CONTROL_PERSISTENT_WRITE_LOCK);
944625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  ASSERT_TRUE(space.contents.Resize(10));
945625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  ASSERT_EQ(storage::Status::kSuccess, persistence::StoreSpace(17, space));
946625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  SetupHeader(NvramHeader::kVersion, 17);
947625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler
948625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  NvramManager nvram;
949625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler
950625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  // Lock the space.
951625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  LockSpaceWriteRequest lock_space_write_request;
952625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  lock_space_write_request.index = 17;
953625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  LockSpaceWriteResponse lock_space_write_response;
954625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  EXPECT_EQ(NV_RESULT_SUCCESS,
955625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler            nvram.LockSpaceWrite(lock_space_write_request,
956625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler                                 &lock_space_write_response));
957625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler
958625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  // Writing should fail now.
959625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  WriteSpaceRequest write_space_request;
960625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  write_space_request.index = 17;
961625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  ASSERT_TRUE(write_space_request.buffer.Assign("data", 4));
962625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  WriteSpaceResponse write_space_response;
963625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  EXPECT_EQ(NV_RESULT_OPERATION_DISABLED,
964625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler            nvram.WriteSpace(write_space_request, &write_space_response));
965625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler
966625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  // The lock should be persistent, so writing should fail after reboot.
967625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  NvramManager nvram2;
968625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler
969625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  EXPECT_EQ(NV_RESULT_OPERATION_DISABLED,
970625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler            nvram2.WriteSpace(write_space_request, &write_space_response));
971625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler}
972625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler
973625cbbe0b6f4a31079e889ac092456ac1893812bMattias NisslerTEST_F(NvramManagerTest, LockSpaceWrite_SuccessBoot) {
974625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  // Set up an NVRAM space.
975625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  NvramSpace space;
976625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  space.controls = (1 << NV_CONTROL_BOOT_WRITE_LOCK);
977625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  ASSERT_TRUE(space.contents.Assign("01234567890", 10));
978625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  ASSERT_EQ(storage::Status::kSuccess, persistence::StoreSpace(17, space));
979625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  SetupHeader(NvramHeader::kVersion, 17);
980625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler
981625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  NvramManager nvram;
982625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler
983625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  // Lock the space.
984625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  LockSpaceWriteRequest lock_space_write_request;
985625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  lock_space_write_request.index = 17;
986625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  LockSpaceWriteResponse lock_space_write_response;
987625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  EXPECT_EQ(NV_RESULT_SUCCESS,
988625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler            nvram.LockSpaceWrite(lock_space_write_request,
989625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler                                 &lock_space_write_response));
990625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler
991625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  // Writing should fail now.
992625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  WriteSpaceRequest write_space_request;
993625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  write_space_request.index = 17;
994625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  ASSERT_TRUE(write_space_request.buffer.Assign("newcontent", 10));
995625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  WriteSpaceResponse write_space_response;
996625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  EXPECT_EQ(NV_RESULT_OPERATION_DISABLED,
997625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler            nvram.WriteSpace(write_space_request, &write_space_response));
998625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler
999625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  // We configured a per-boot lock, so writing should succeed after reboot.
1000625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  NvramManager nvram2;
1001625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler
1002625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  EXPECT_EQ(NV_RESULT_SUCCESS,
1003625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler            nvram2.WriteSpace(write_space_request, &write_space_response));
1004625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  ReadAndCompareSpaceData(&nvram2, 17, "newcontent", 10);
1005625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler}
1006625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler
1007625cbbe0b6f4a31079e889ac092456ac1893812bMattias NisslerTEST_F(NvramManagerTest, LockSpaceWrite_NotLockable) {
1008625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  // Set up an NVRAM space.
1009625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  NvramSpace space;
1010625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  ASSERT_TRUE(space.contents.Resize(10));
1011625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  ASSERT_EQ(storage::Status::kSuccess, persistence::StoreSpace(17, space));
1012625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  SetupHeader(NvramHeader::kVersion, 17);
1013625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler
1014625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  NvramManager nvram;
1015625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler
1016625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  // Attempt to lock a space without valid authentication.
1017625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  LockSpaceWriteRequest lock_space_write_request;
1018625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  lock_space_write_request.index = 17;
1019625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  LockSpaceWriteResponse lock_space_write_response;
1020625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  EXPECT_EQ(NV_RESULT_INVALID_PARAMETER,
1021625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler            nvram.LockSpaceWrite(lock_space_write_request,
1022625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler                                 &lock_space_write_response));
1023625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler}
1024625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler
1025625cbbe0b6f4a31079e889ac092456ac1893812bMattias NisslerTEST_F(NvramManagerTest, LockSpaceRead_SpaceAbsent) {
1026625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  NvramManager nvram;
1027625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler
1028625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  // Attempt to lock a non-existing space.
1029625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  LockSpaceReadRequest lock_space_read_request;
1030625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  lock_space_read_request.index = 17;
1031625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  LockSpaceReadResponse lock_space_read_response;
1032625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  EXPECT_EQ(
1033625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler      NV_RESULT_SPACE_DOES_NOT_EXIST,
1034625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler      nvram.LockSpaceRead(lock_space_read_request, &lock_space_read_response));
1035625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler}
1036625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler
1037625cbbe0b6f4a31079e889ac092456ac1893812bMattias NisslerTEST_F(NvramManagerTest, LockSpaceRead_AuthorizationFailure) {
1038625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  // Set up an NVRAM space.
1039625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  NvramSpace space;
1040625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  space.controls =
1041625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler      (1 << NV_CONTROL_BOOT_READ_LOCK) | (1 << NV_CONTROL_READ_AUTHORIZATION);
1042625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  ASSERT_TRUE(space.contents.Resize(10));
1043625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  const char kAuthorizationValue[] = "secret";
1044625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  ASSERT_TRUE(space.authorization_value.Assign(kAuthorizationValue,
1045625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler                                               sizeof(kAuthorizationValue)));
1046625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  ASSERT_EQ(storage::Status::kSuccess, persistence::StoreSpace(17, space));
1047625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  SetupHeader(NvramHeader::kVersion, 17);
1048625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler
1049625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  NvramManager nvram;
1050625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler
1051625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  // Attempt to lock a space without valid authorization.
1052625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  LockSpaceReadRequest lock_space_read_request;
1053625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  lock_space_read_request.index = 17;
1054625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  LockSpaceReadResponse lock_space_read_response;
1055625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  EXPECT_EQ(
1056625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler      NV_RESULT_ACCESS_DENIED,
1057625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler      nvram.LockSpaceRead(lock_space_read_request, &lock_space_read_response));
1058625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler}
1059625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler
1060625cbbe0b6f4a31079e889ac092456ac1893812bMattias NisslerTEST_F(NvramManagerTest, LockSpaceRead_Success) {
1061625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  // Set up an NVRAM space.
1062625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  NvramSpace space;
1063625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  space.controls = (1 << NV_CONTROL_BOOT_READ_LOCK);
1064625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  ASSERT_TRUE(space.contents.Assign("0123456789", 10));
1065625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  ASSERT_EQ(storage::Status::kSuccess, persistence::StoreSpace(17, space));
1066625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  SetupHeader(NvramHeader::kVersion, 17);
1067625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler
1068625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  NvramManager nvram;
1069625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler
1070625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  // Lock the space.
1071625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  LockSpaceReadRequest lock_space_read_request;
1072625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  lock_space_read_request.index = 17;
1073625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  LockSpaceReadResponse lock_space_read_response;
1074625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  EXPECT_EQ(NV_RESULT_SUCCESS, nvram.LockSpaceRead(lock_space_read_request,
1075625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler                                                   &lock_space_read_response));
1076625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler
1077625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  // Read requests should fail now.
1078625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  ReadSpaceRequest read_space_request;
1079625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  read_space_request.index = 17;
1080625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  ReadSpaceResponse read_space_response;
1081625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  EXPECT_EQ(NV_RESULT_OPERATION_DISABLED,
1082625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler            nvram.ReadSpace(read_space_request, &read_space_response));
1083625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  EXPECT_EQ(0U, read_space_response.buffer.size());
1084625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler
1085625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  // This is a non-persistent lock, so reads should work again after a reboot.
1086625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  NvramManager nvram2;
1087625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler
1088625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  ReadAndCompareSpaceData(&nvram2, 17, "0123456789", 10);
1089625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler}
1090625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler
1091625cbbe0b6f4a31079e889ac092456ac1893812bMattias NisslerTEST_F(NvramManagerTest, LockSpaceRead_NotLockable) {
1092625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  // Set up an NVRAM space.
1093625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  NvramSpace space;
1094625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  ASSERT_TRUE(space.contents.Resize(10));
1095625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  ASSERT_EQ(storage::Status::kSuccess, persistence::StoreSpace(17, space));
1096625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  SetupHeader(NvramHeader::kVersion, 17);
1097625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler
1098625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  NvramManager nvram;
1099625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler
1100625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  // Attempt to lock a space without valid authorization.
1101625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  LockSpaceReadRequest lock_space_read_request;
1102625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  lock_space_read_request.index = 17;
1103625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  LockSpaceReadResponse lock_space_read_response;
1104625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  EXPECT_EQ(
1105625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler      NV_RESULT_INVALID_PARAMETER,
1106625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler      nvram.LockSpaceRead(lock_space_read_request, &lock_space_read_response));
1107625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler}
1108625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler
11090b833364a3db07f389faa7f99a68277a493548f3Mattias NisslerTEST_F(NvramManagerTest, WipeStorage_Success) {
11100b833364a3db07f389faa7f99a68277a493548f3Mattias Nissler  // Set up an NVRAM space.
11110b833364a3db07f389faa7f99a68277a493548f3Mattias Nissler  NvramSpace space;
11120b833364a3db07f389faa7f99a68277a493548f3Mattias Nissler  ASSERT_TRUE(space.contents.Resize(10));
11130b833364a3db07f389faa7f99a68277a493548f3Mattias Nissler  ASSERT_EQ(storage::Status::kSuccess, persistence::StoreSpace(17, space));
11140b833364a3db07f389faa7f99a68277a493548f3Mattias Nissler  SetupHeader(NvramHeader::kVersion, 17);
11150b833364a3db07f389faa7f99a68277a493548f3Mattias Nissler
11160b833364a3db07f389faa7f99a68277a493548f3Mattias Nissler  // Check that the space is visible.
11170b833364a3db07f389faa7f99a68277a493548f3Mattias Nissler  NvramManager nvram;
11180b833364a3db07f389faa7f99a68277a493548f3Mattias Nissler  GetSpaceInfoRequest get_space_info_request;
11190b833364a3db07f389faa7f99a68277a493548f3Mattias Nissler  get_space_info_request.index = 17;
11200b833364a3db07f389faa7f99a68277a493548f3Mattias Nissler  GetSpaceInfoResponse get_space_info_response;
11210b833364a3db07f389faa7f99a68277a493548f3Mattias Nissler  EXPECT_EQ(NV_RESULT_SUCCESS, nvram.GetSpaceInfo(get_space_info_request,
11220b833364a3db07f389faa7f99a68277a493548f3Mattias Nissler                                                  &get_space_info_response));
11230b833364a3db07f389faa7f99a68277a493548f3Mattias Nissler  EXPECT_EQ(10U, get_space_info_response.size);
11240b833364a3db07f389faa7f99a68277a493548f3Mattias Nissler
11250b833364a3db07f389faa7f99a68277a493548f3Mattias Nissler  // Request a wipe.
11260b833364a3db07f389faa7f99a68277a493548f3Mattias Nissler  WipeStorageRequest wipe_storage_request;
11270b833364a3db07f389faa7f99a68277a493548f3Mattias Nissler  WipeStorageResponse wipe_storage_response;
11280b833364a3db07f389faa7f99a68277a493548f3Mattias Nissler  EXPECT_EQ(NV_RESULT_SUCCESS,
11290b833364a3db07f389faa7f99a68277a493548f3Mattias Nissler            nvram.WipeStorage(wipe_storage_request, &wipe_storage_response));
11300b833364a3db07f389faa7f99a68277a493548f3Mattias Nissler
11310b833364a3db07f389faa7f99a68277a493548f3Mattias Nissler  // The space should no longer be declared.
11320b833364a3db07f389faa7f99a68277a493548f3Mattias Nissler  GetInfoRequest get_info_request;
11330b833364a3db07f389faa7f99a68277a493548f3Mattias Nissler  GetInfoResponse get_info_response;
11340b833364a3db07f389faa7f99a68277a493548f3Mattias Nissler  EXPECT_EQ(NV_RESULT_SUCCESS,
11350b833364a3db07f389faa7f99a68277a493548f3Mattias Nissler            nvram.GetInfo(get_info_request, &get_info_response));
11360b833364a3db07f389faa7f99a68277a493548f3Mattias Nissler  EXPECT_EQ(0U, get_info_response.space_list.size());
11370b833364a3db07f389faa7f99a68277a493548f3Mattias Nissler
11380b833364a3db07f389faa7f99a68277a493548f3Mattias Nissler  // Accessing the space should fail.
11390b833364a3db07f389faa7f99a68277a493548f3Mattias Nissler  EXPECT_EQ(
11400b833364a3db07f389faa7f99a68277a493548f3Mattias Nissler      NV_RESULT_SPACE_DOES_NOT_EXIST,
11410b833364a3db07f389faa7f99a68277a493548f3Mattias Nissler      nvram.GetSpaceInfo(get_space_info_request, &get_space_info_response));
11420b833364a3db07f389faa7f99a68277a493548f3Mattias Nissler}
11430b833364a3db07f389faa7f99a68277a493548f3Mattias Nissler
11440b833364a3db07f389faa7f99a68277a493548f3Mattias NisslerTEST_F(NvramManagerTest, WipeStorage_Abort) {
11450b833364a3db07f389faa7f99a68277a493548f3Mattias Nissler  // Set up two pre-existing spaces and a matching header.
11460b833364a3db07f389faa7f99a68277a493548f3Mattias Nissler  NvramSpace space;
11470b833364a3db07f389faa7f99a68277a493548f3Mattias Nissler  ASSERT_TRUE(space.contents.Resize(10));
11480b833364a3db07f389faa7f99a68277a493548f3Mattias Nissler  ASSERT_EQ(storage::Status::kSuccess, persistence::StoreSpace(1, space));
11490b833364a3db07f389faa7f99a68277a493548f3Mattias Nissler  ASSERT_TRUE(space.contents.Resize(20));
11500b833364a3db07f389faa7f99a68277a493548f3Mattias Nissler  ASSERT_EQ(storage::Status::kSuccess, persistence::StoreSpace(2, space));
11510b833364a3db07f389faa7f99a68277a493548f3Mattias Nissler  NvramHeader header;
11520b833364a3db07f389faa7f99a68277a493548f3Mattias Nissler  header.version = NvramHeader::kVersion;
11530b833364a3db07f389faa7f99a68277a493548f3Mattias Nissler  ASSERT_TRUE(header.allocated_indices.Resize(2));
11540b833364a3db07f389faa7f99a68277a493548f3Mattias Nissler  header.allocated_indices[0] = 1;
11550b833364a3db07f389faa7f99a68277a493548f3Mattias Nissler  header.allocated_indices[1] = 2;
11560b833364a3db07f389faa7f99a68277a493548f3Mattias Nissler  ASSERT_EQ(storage::Status::kSuccess, persistence::StoreHeader(header));
11570b833364a3db07f389faa7f99a68277a493548f3Mattias Nissler
11580b833364a3db07f389faa7f99a68277a493548f3Mattias Nissler  // Check that the spaces are visible.
11590b833364a3db07f389faa7f99a68277a493548f3Mattias Nissler  NvramManager nvram;
11600b833364a3db07f389faa7f99a68277a493548f3Mattias Nissler  GetInfoRequest get_info_request;
11610b833364a3db07f389faa7f99a68277a493548f3Mattias Nissler  GetInfoResponse get_info_response;
11620b833364a3db07f389faa7f99a68277a493548f3Mattias Nissler  EXPECT_EQ(NV_RESULT_SUCCESS,
11630b833364a3db07f389faa7f99a68277a493548f3Mattias Nissler            nvram.GetInfo(get_info_request, &get_info_response));
11640b833364a3db07f389faa7f99a68277a493548f3Mattias Nissler  EXPECT_EQ(2U, get_info_response.space_list.size());
11650b833364a3db07f389faa7f99a68277a493548f3Mattias Nissler  int space_mask = 0;
11660b833364a3db07f389faa7f99a68277a493548f3Mattias Nissler  for (size_t i = 0; i < get_info_response.space_list.size(); ++i) {
11670b833364a3db07f389faa7f99a68277a493548f3Mattias Nissler    space_mask |= (1 << get_info_response.space_list[i]);
11680b833364a3db07f389faa7f99a68277a493548f3Mattias Nissler  }
11690b833364a3db07f389faa7f99a68277a493548f3Mattias Nissler  EXPECT_EQ(0x6, space_mask);
11700b833364a3db07f389faa7f99a68277a493548f3Mattias Nissler
11710b833364a3db07f389faa7f99a68277a493548f3Mattias Nissler  // Set things up so the deletion request for the second space fails.
11720b833364a3db07f389faa7f99a68277a493548f3Mattias Nissler  storage::SetSpaceWriteError(2, true);
11730b833364a3db07f389faa7f99a68277a493548f3Mattias Nissler
11740b833364a3db07f389faa7f99a68277a493548f3Mattias Nissler  // The wipe request should fail now.
11750b833364a3db07f389faa7f99a68277a493548f3Mattias Nissler  WipeStorageRequest wipe_storage_request;
11760b833364a3db07f389faa7f99a68277a493548f3Mattias Nissler  WipeStorageResponse wipe_storage_response;
11770b833364a3db07f389faa7f99a68277a493548f3Mattias Nissler  EXPECT_EQ(NV_RESULT_INTERNAL_ERROR,
11780b833364a3db07f389faa7f99a68277a493548f3Mattias Nissler            nvram.WipeStorage(wipe_storage_request, &wipe_storage_response));
11790b833364a3db07f389faa7f99a68277a493548f3Mattias Nissler
11800b833364a3db07f389faa7f99a68277a493548f3Mattias Nissler  // New wipe attempt with a fresh instance after clearing the error.
11810b833364a3db07f389faa7f99a68277a493548f3Mattias Nissler  storage::SetSpaceWriteError(2, false);
11820b833364a3db07f389faa7f99a68277a493548f3Mattias Nissler  NvramManager nvram2;
11830b833364a3db07f389faa7f99a68277a493548f3Mattias Nissler  EXPECT_EQ(NV_RESULT_SUCCESS,
11840b833364a3db07f389faa7f99a68277a493548f3Mattias Nissler            nvram2.WipeStorage(wipe_storage_request, &wipe_storage_response));
11850b833364a3db07f389faa7f99a68277a493548f3Mattias Nissler
11860b833364a3db07f389faa7f99a68277a493548f3Mattias Nissler  // No spaces should remain.
11870b833364a3db07f389faa7f99a68277a493548f3Mattias Nissler  EXPECT_EQ(NV_RESULT_SUCCESS,
11880b833364a3db07f389faa7f99a68277a493548f3Mattias Nissler            nvram2.GetInfo(get_info_request, &get_info_response));
11890b833364a3db07f389faa7f99a68277a493548f3Mattias Nissler  EXPECT_EQ(0U, get_info_response.space_list.size());
11900b833364a3db07f389faa7f99a68277a493548f3Mattias Nissler}
11910b833364a3db07f389faa7f99a68277a493548f3Mattias Nissler
11920b833364a3db07f389faa7f99a68277a493548f3Mattias NisslerTEST_F(NvramManagerTest, WipeStorage_Disable) {
11930b833364a3db07f389faa7f99a68277a493548f3Mattias Nissler  // Set up an NVRAM space.
11940b833364a3db07f389faa7f99a68277a493548f3Mattias Nissler  NvramSpace space;
11950b833364a3db07f389faa7f99a68277a493548f3Mattias Nissler  ASSERT_TRUE(space.contents.Resize(10));
11960b833364a3db07f389faa7f99a68277a493548f3Mattias Nissler  ASSERT_EQ(storage::Status::kSuccess, persistence::StoreSpace(17, space));
11970b833364a3db07f389faa7f99a68277a493548f3Mattias Nissler  SetupHeader(NvramHeader::kVersion, 17);
11980b833364a3db07f389faa7f99a68277a493548f3Mattias Nissler
11990b833364a3db07f389faa7f99a68277a493548f3Mattias Nissler  NvramManager nvram;
12000b833364a3db07f389faa7f99a68277a493548f3Mattias Nissler
12010b833364a3db07f389faa7f99a68277a493548f3Mattias Nissler  // Disable wiping.
12020b833364a3db07f389faa7f99a68277a493548f3Mattias Nissler  DisableWipeRequest disable_wipe_request;
12030b833364a3db07f389faa7f99a68277a493548f3Mattias Nissler  DisableWipeResponse disable_wipe_response;
12040b833364a3db07f389faa7f99a68277a493548f3Mattias Nissler  EXPECT_EQ(NV_RESULT_SUCCESS,
12050b833364a3db07f389faa7f99a68277a493548f3Mattias Nissler            nvram.DisableWipe(disable_wipe_request, &disable_wipe_response));
12060b833364a3db07f389faa7f99a68277a493548f3Mattias Nissler
12070b833364a3db07f389faa7f99a68277a493548f3Mattias Nissler  // A wipe request should fail.
12080b833364a3db07f389faa7f99a68277a493548f3Mattias Nissler  WipeStorageRequest wipe_storage_request;
12090b833364a3db07f389faa7f99a68277a493548f3Mattias Nissler  WipeStorageResponse wipe_storage_response;
12100b833364a3db07f389faa7f99a68277a493548f3Mattias Nissler  EXPECT_EQ(NV_RESULT_OPERATION_DISABLED,
12110b833364a3db07f389faa7f99a68277a493548f3Mattias Nissler            nvram.WipeStorage(wipe_storage_request, &wipe_storage_response));
12120b833364a3db07f389faa7f99a68277a493548f3Mattias Nissler
12130b833364a3db07f389faa7f99a68277a493548f3Mattias Nissler  // The space should remain declared.
12140b833364a3db07f389faa7f99a68277a493548f3Mattias Nissler  GetInfoRequest get_info_request;
12150b833364a3db07f389faa7f99a68277a493548f3Mattias Nissler  GetInfoResponse get_info_response;
12160b833364a3db07f389faa7f99a68277a493548f3Mattias Nissler  EXPECT_EQ(NV_RESULT_SUCCESS,
12170b833364a3db07f389faa7f99a68277a493548f3Mattias Nissler            nvram.GetInfo(get_info_request, &get_info_response));
12180b833364a3db07f389faa7f99a68277a493548f3Mattias Nissler  ASSERT_EQ(1U, get_info_response.space_list.size());
12190b833364a3db07f389faa7f99a68277a493548f3Mattias Nissler  EXPECT_EQ(17U, get_info_response.space_list[0]);
12200b833364a3db07f389faa7f99a68277a493548f3Mattias Nissler
12210b833364a3db07f389faa7f99a68277a493548f3Mattias Nissler  // The space data should remain present.
12220b833364a3db07f389faa7f99a68277a493548f3Mattias Nissler  GetSpaceInfoRequest get_space_info_request;
12230b833364a3db07f389faa7f99a68277a493548f3Mattias Nissler  get_space_info_request.index = 17;
12240b833364a3db07f389faa7f99a68277a493548f3Mattias Nissler  GetSpaceInfoResponse get_space_info_response;
12250b833364a3db07f389faa7f99a68277a493548f3Mattias Nissler  EXPECT_EQ(NV_RESULT_SUCCESS, nvram.GetSpaceInfo(get_space_info_request,
12260b833364a3db07f389faa7f99a68277a493548f3Mattias Nissler                                                  &get_space_info_response));
12270b833364a3db07f389faa7f99a68277a493548f3Mattias Nissler  EXPECT_EQ(10U, get_space_info_response.size);
12280b833364a3db07f389faa7f99a68277a493548f3Mattias Nissler}
12290b833364a3db07f389faa7f99a68277a493548f3Mattias Nissler
1230ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler}  // namespace
1231ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler}  // namespace nvram
1232