1*7ba4dab5SXin Li /*
2*7ba4dab5SXin Li * Copyright (C) 2016 The Android Open Source Project
3*7ba4dab5SXin Li *
4*7ba4dab5SXin Li * Licensed under the Apache License, Version 2.0 (the "License");
5*7ba4dab5SXin Li * you may not use this file except in compliance with the License.
6*7ba4dab5SXin Li * You may obtain a copy of the License at
7*7ba4dab5SXin Li *
8*7ba4dab5SXin Li * http://www.apache.org/licenses/LICENSE-2.0
9*7ba4dab5SXin Li *
10*7ba4dab5SXin Li * Unless required by applicable law or agreed to in writing, software
11*7ba4dab5SXin Li * distributed under the License is distributed on an "AS IS" BASIS,
12*7ba4dab5SXin Li * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*7ba4dab5SXin Li * See the License for the specific language governing permissions and
14*7ba4dab5SXin Li * limitations under the License.
15*7ba4dab5SXin Li */
16*7ba4dab5SXin Li
17*7ba4dab5SXin Li #include <stdlib.h>
18*7ba4dab5SXin Li #include <string.h>
19*7ba4dab5SXin Li
20*7ba4dab5SXin Li #include <gtest/gtest.h>
21*7ba4dab5SXin Li
22*7ba4dab5SXin Li #include <nvram/messages/nvram_messages.h>
23*7ba4dab5SXin Li
24*7ba4dab5SXin Li namespace nvram {
25*7ba4dab5SXin Li
26*7ba4dab5SXin Li namespace {
27*7ba4dab5SXin Li
28*7ba4dab5SXin Li template <typename Message>
EncodeAndDecode(const Message & in,Message * out)29*7ba4dab5SXin Li void EncodeAndDecode(const Message& in, Message* out) {
30*7ba4dab5SXin Li Blob blob;
31*7ba4dab5SXin Li ASSERT_TRUE(Encode(in, &blob));
32*7ba4dab5SXin Li ASSERT_TRUE(Decode(blob.data(), blob.size(), out));
33*7ba4dab5SXin Li }
34*7ba4dab5SXin Li
35*7ba4dab5SXin Li } // namespace
36*7ba4dab5SXin Li
TEST(NvramMessagesTest,GetInfoRequest)37*7ba4dab5SXin Li TEST(NvramMessagesTest, GetInfoRequest) {
38*7ba4dab5SXin Li Request request;
39*7ba4dab5SXin Li request.payload.Activate<COMMAND_GET_INFO>();
40*7ba4dab5SXin Li
41*7ba4dab5SXin Li Request decoded;
42*7ba4dab5SXin Li EncodeAndDecode(request, &decoded);
43*7ba4dab5SXin Li
44*7ba4dab5SXin Li EXPECT_EQ(COMMAND_GET_INFO, decoded.payload.which());
45*7ba4dab5SXin Li EXPECT_TRUE(decoded.payload.get<COMMAND_GET_INFO>());
46*7ba4dab5SXin Li }
47*7ba4dab5SXin Li
TEST(NvramMessagesTest,GetInfoResponse)48*7ba4dab5SXin Li TEST(NvramMessagesTest, GetInfoResponse) {
49*7ba4dab5SXin Li Response response;
50*7ba4dab5SXin Li response.result = NV_RESULT_SUCCESS;
51*7ba4dab5SXin Li response.payload.Activate<COMMAND_GET_INFO>();
52*7ba4dab5SXin Li
53*7ba4dab5SXin Li GetInfoResponse& response_payload =
54*7ba4dab5SXin Li response.payload.Activate<COMMAND_GET_INFO>();
55*7ba4dab5SXin Li response_payload.total_size = 32768;
56*7ba4dab5SXin Li response_payload.available_size = 4096;
57*7ba4dab5SXin Li response_payload.max_space_size = 512;
58*7ba4dab5SXin Li response_payload.max_spaces = 32;
59*7ba4dab5SXin Li ASSERT_TRUE(response_payload.space_list.Append(0x1234));
60*7ba4dab5SXin Li ASSERT_TRUE(response_payload.space_list.Append(0xffffffff));
61*7ba4dab5SXin Li ASSERT_TRUE(response_payload.space_list.Append(0x32));
62*7ba4dab5SXin Li ASSERT_TRUE(response_payload.space_list.Append(0x0));
63*7ba4dab5SXin Li ASSERT_TRUE(response_payload.space_list.Append(0x1));
64*7ba4dab5SXin Li
65*7ba4dab5SXin Li Response decoded;
66*7ba4dab5SXin Li EncodeAndDecode(response, &decoded);
67*7ba4dab5SXin Li
68*7ba4dab5SXin Li EXPECT_EQ(NV_RESULT_SUCCESS, response.result);
69*7ba4dab5SXin Li EXPECT_EQ(COMMAND_GET_INFO, decoded.payload.which());
70*7ba4dab5SXin Li const GetInfoResponse* decoded_payload =
71*7ba4dab5SXin Li decoded.payload.get<COMMAND_GET_INFO>();
72*7ba4dab5SXin Li ASSERT_TRUE(decoded_payload);
73*7ba4dab5SXin Li
74*7ba4dab5SXin Li EXPECT_EQ(32768ULL, decoded_payload->total_size);
75*7ba4dab5SXin Li EXPECT_EQ(4096ULL, decoded_payload->available_size);
76*7ba4dab5SXin Li EXPECT_EQ(512ULL, decoded_payload->max_space_size);
77*7ba4dab5SXin Li EXPECT_EQ(32U, decoded_payload->max_spaces);
78*7ba4dab5SXin Li ASSERT_EQ(5U, decoded_payload->space_list.size());
79*7ba4dab5SXin Li EXPECT_EQ(0x1234U, decoded_payload->space_list[0]);
80*7ba4dab5SXin Li EXPECT_EQ(0xffffffffU, decoded_payload->space_list[1]);
81*7ba4dab5SXin Li EXPECT_EQ(0x32U, decoded_payload->space_list[2]);
82*7ba4dab5SXin Li EXPECT_EQ(0x0U, decoded_payload->space_list[3]);
83*7ba4dab5SXin Li EXPECT_EQ(0x1U, decoded_payload->space_list[4]);
84*7ba4dab5SXin Li }
85*7ba4dab5SXin Li
TEST(NvramMessagesTest,CreateSpaceRequest)86*7ba4dab5SXin Li TEST(NvramMessagesTest, CreateSpaceRequest) {
87*7ba4dab5SXin Li Request request;
88*7ba4dab5SXin Li CreateSpaceRequest& request_payload =
89*7ba4dab5SXin Li request.payload.Activate<COMMAND_CREATE_SPACE>();
90*7ba4dab5SXin Li request_payload.index = 0x12345678;
91*7ba4dab5SXin Li request_payload.size = 8;
92*7ba4dab5SXin Li ASSERT_TRUE(request_payload.controls.Append(NV_CONTROL_BOOT_WRITE_LOCK));
93*7ba4dab5SXin Li ASSERT_TRUE(request_payload.controls.Append(NV_CONTROL_WRITE_EXTEND));
94*7ba4dab5SXin Li const uint8_t kAuthValue[] = {1, 2, 3, 4, 5};
95*7ba4dab5SXin Li ASSERT_TRUE(request_payload.authorization_value.Assign(kAuthValue,
96*7ba4dab5SXin Li sizeof(kAuthValue)));
97*7ba4dab5SXin Li
98*7ba4dab5SXin Li Request decoded;
99*7ba4dab5SXin Li EncodeAndDecode(request, &decoded);
100*7ba4dab5SXin Li
101*7ba4dab5SXin Li EXPECT_EQ(COMMAND_CREATE_SPACE, decoded.payload.which());
102*7ba4dab5SXin Li const CreateSpaceRequest* decoded_payload =
103*7ba4dab5SXin Li decoded.payload.get<COMMAND_CREATE_SPACE>();
104*7ba4dab5SXin Li ASSERT_TRUE(decoded_payload);
105*7ba4dab5SXin Li
106*7ba4dab5SXin Li EXPECT_EQ(0x12345678U, decoded_payload->index);
107*7ba4dab5SXin Li EXPECT_EQ(8ULL, decoded_payload->size);
108*7ba4dab5SXin Li ASSERT_EQ(2UL, decoded_payload->controls.size());
109*7ba4dab5SXin Li EXPECT_EQ(NV_CONTROL_BOOT_WRITE_LOCK, decoded_payload->controls[0]);
110*7ba4dab5SXin Li EXPECT_EQ(NV_CONTROL_WRITE_EXTEND, decoded_payload->controls[1]);
111*7ba4dab5SXin Li const Blob& decoded_auth_value = decoded_payload->authorization_value;
112*7ba4dab5SXin Li ASSERT_EQ(sizeof(kAuthValue), decoded_auth_value.size());
113*7ba4dab5SXin Li EXPECT_EQ(0,
114*7ba4dab5SXin Li memcmp(kAuthValue, decoded_auth_value.data(), sizeof(kAuthValue)));
115*7ba4dab5SXin Li }
116*7ba4dab5SXin Li
TEST(NvramMessagesTest,CreateSpaceResponse)117*7ba4dab5SXin Li TEST(NvramMessagesTest, CreateSpaceResponse) {
118*7ba4dab5SXin Li Response response;
119*7ba4dab5SXin Li response.result = NV_RESULT_SPACE_ALREADY_EXISTS;
120*7ba4dab5SXin Li response.payload.Activate<COMMAND_CREATE_SPACE>();
121*7ba4dab5SXin Li
122*7ba4dab5SXin Li Response decoded;
123*7ba4dab5SXin Li EncodeAndDecode(response, &decoded);
124*7ba4dab5SXin Li
125*7ba4dab5SXin Li EXPECT_EQ(NV_RESULT_SPACE_ALREADY_EXISTS, response.result);
126*7ba4dab5SXin Li EXPECT_EQ(COMMAND_CREATE_SPACE, decoded.payload.which());
127*7ba4dab5SXin Li EXPECT_TRUE(decoded.payload.get<COMMAND_CREATE_SPACE>());
128*7ba4dab5SXin Li }
129*7ba4dab5SXin Li
TEST(NvramMessagesTest,GetSpaceInfoRequest)130*7ba4dab5SXin Li TEST(NvramMessagesTest, GetSpaceInfoRequest) {
131*7ba4dab5SXin Li Request request;
132*7ba4dab5SXin Li GetSpaceInfoRequest& request_payload =
133*7ba4dab5SXin Li request.payload.Activate<COMMAND_GET_SPACE_INFO>();
134*7ba4dab5SXin Li request_payload.index = 0x1234;
135*7ba4dab5SXin Li
136*7ba4dab5SXin Li Request decoded;
137*7ba4dab5SXin Li EncodeAndDecode(request, &decoded);
138*7ba4dab5SXin Li
139*7ba4dab5SXin Li EXPECT_EQ(COMMAND_GET_SPACE_INFO, decoded.payload.which());
140*7ba4dab5SXin Li const GetSpaceInfoRequest* decoded_payload =
141*7ba4dab5SXin Li decoded.payload.get<COMMAND_GET_SPACE_INFO>();
142*7ba4dab5SXin Li ASSERT_TRUE(decoded_payload);
143*7ba4dab5SXin Li
144*7ba4dab5SXin Li EXPECT_EQ(0x1234U, decoded_payload->index);
145*7ba4dab5SXin Li }
146*7ba4dab5SXin Li
TEST(NvramMessagesTest,GetSpaceInfoResponse)147*7ba4dab5SXin Li TEST(NvramMessagesTest, GetSpaceInfoResponse) {
148*7ba4dab5SXin Li Response response;
149*7ba4dab5SXin Li response.result = NV_RESULT_SPACE_DOES_NOT_EXIST;
150*7ba4dab5SXin Li GetSpaceInfoResponse& response_payload =
151*7ba4dab5SXin Li response.payload.Activate<COMMAND_GET_SPACE_INFO>();
152*7ba4dab5SXin Li response_payload.size = 256;
153*7ba4dab5SXin Li ASSERT_TRUE(response_payload.controls.Append(NV_CONTROL_BOOT_WRITE_LOCK));
154*7ba4dab5SXin Li ASSERT_TRUE(response_payload.controls.Append(NV_CONTROL_BOOT_READ_LOCK));
155*7ba4dab5SXin Li ASSERT_TRUE(response_payload.controls.Append(NV_CONTROL_WRITE_EXTEND));
156*7ba4dab5SXin Li response_payload.read_locked = false;
157*7ba4dab5SXin Li response_payload.write_locked = true;
158*7ba4dab5SXin Li
159*7ba4dab5SXin Li Response decoded;
160*7ba4dab5SXin Li EncodeAndDecode(response, &decoded);
161*7ba4dab5SXin Li
162*7ba4dab5SXin Li EXPECT_EQ(NV_RESULT_SPACE_DOES_NOT_EXIST, response.result);
163*7ba4dab5SXin Li EXPECT_EQ(COMMAND_GET_SPACE_INFO, decoded.payload.which());
164*7ba4dab5SXin Li const GetSpaceInfoResponse* decoded_payload =
165*7ba4dab5SXin Li decoded.payload.get<COMMAND_GET_SPACE_INFO>();
166*7ba4dab5SXin Li ASSERT_TRUE(decoded_payload);
167*7ba4dab5SXin Li
168*7ba4dab5SXin Li EXPECT_EQ(256ULL, decoded_payload->size);
169*7ba4dab5SXin Li ASSERT_EQ(3U, decoded_payload->controls.size());
170*7ba4dab5SXin Li EXPECT_EQ(NV_CONTROL_BOOT_WRITE_LOCK, decoded_payload->controls[0]);
171*7ba4dab5SXin Li EXPECT_EQ(NV_CONTROL_BOOT_READ_LOCK, decoded_payload->controls[1]);
172*7ba4dab5SXin Li EXPECT_EQ(NV_CONTROL_WRITE_EXTEND, decoded_payload->controls[2]);
173*7ba4dab5SXin Li EXPECT_FALSE(decoded_payload->read_locked);
174*7ba4dab5SXin Li EXPECT_TRUE(decoded_payload->write_locked);
175*7ba4dab5SXin Li }
176*7ba4dab5SXin Li
TEST(NvramMessagesTest,DeleteSpaceRequest)177*7ba4dab5SXin Li TEST(NvramMessagesTest, DeleteSpaceRequest) {
178*7ba4dab5SXin Li Request request;
179*7ba4dab5SXin Li DeleteSpaceRequest& request_payload =
180*7ba4dab5SXin Li request.payload.Activate<COMMAND_DELETE_SPACE>();
181*7ba4dab5SXin Li request_payload.index = 0x1234;
182*7ba4dab5SXin Li const uint8_t kAuthValue[] = {1, 2, 3};
183*7ba4dab5SXin Li ASSERT_TRUE(request_payload.authorization_value.Assign(kAuthValue,
184*7ba4dab5SXin Li sizeof(kAuthValue)));
185*7ba4dab5SXin Li
186*7ba4dab5SXin Li Request decoded;
187*7ba4dab5SXin Li EncodeAndDecode(request, &decoded);
188*7ba4dab5SXin Li
189*7ba4dab5SXin Li EXPECT_EQ(COMMAND_DELETE_SPACE, decoded.payload.which());
190*7ba4dab5SXin Li const DeleteSpaceRequest* decoded_payload =
191*7ba4dab5SXin Li decoded.payload.get<COMMAND_DELETE_SPACE>();
192*7ba4dab5SXin Li ASSERT_TRUE(decoded_payload);
193*7ba4dab5SXin Li
194*7ba4dab5SXin Li EXPECT_EQ(0x1234U, decoded_payload->index);
195*7ba4dab5SXin Li const Blob& decoded_auth_value = decoded_payload->authorization_value;
196*7ba4dab5SXin Li ASSERT_EQ(sizeof(kAuthValue), decoded_auth_value.size());
197*7ba4dab5SXin Li EXPECT_EQ(0,
198*7ba4dab5SXin Li memcmp(kAuthValue, decoded_auth_value.data(), sizeof(kAuthValue)));
199*7ba4dab5SXin Li }
200*7ba4dab5SXin Li
TEST(NvramMessagesTest,DeleteSpaceResponse)201*7ba4dab5SXin Li TEST(NvramMessagesTest, DeleteSpaceResponse) {
202*7ba4dab5SXin Li Response response;
203*7ba4dab5SXin Li response.result = NV_RESULT_ACCESS_DENIED;
204*7ba4dab5SXin Li response.payload.Activate<COMMAND_DELETE_SPACE>();
205*7ba4dab5SXin Li
206*7ba4dab5SXin Li Response decoded;
207*7ba4dab5SXin Li EncodeAndDecode(response, &decoded);
208*7ba4dab5SXin Li
209*7ba4dab5SXin Li EXPECT_EQ(NV_RESULT_ACCESS_DENIED, response.result);
210*7ba4dab5SXin Li EXPECT_EQ(COMMAND_DELETE_SPACE, decoded.payload.which());
211*7ba4dab5SXin Li EXPECT_TRUE(decoded.payload.get<COMMAND_DELETE_SPACE>());
212*7ba4dab5SXin Li }
213*7ba4dab5SXin Li
TEST(NvramMessagesTest,DisableCreateRequest)214*7ba4dab5SXin Li TEST(NvramMessagesTest, DisableCreateRequest) {
215*7ba4dab5SXin Li Request request;
216*7ba4dab5SXin Li request.payload.Activate<COMMAND_DISABLE_CREATE>();
217*7ba4dab5SXin Li
218*7ba4dab5SXin Li Request decoded;
219*7ba4dab5SXin Li EncodeAndDecode(request, &decoded);
220*7ba4dab5SXin Li
221*7ba4dab5SXin Li EXPECT_EQ(COMMAND_DISABLE_CREATE, decoded.payload.which());
222*7ba4dab5SXin Li EXPECT_TRUE(decoded.payload.get<COMMAND_DISABLE_CREATE>());
223*7ba4dab5SXin Li }
224*7ba4dab5SXin Li
TEST(NvramMessagesTest,DisableCreateResponse)225*7ba4dab5SXin Li TEST(NvramMessagesTest, DisableCreateResponse) {
226*7ba4dab5SXin Li Response response;
227*7ba4dab5SXin Li response.result = NV_RESULT_INTERNAL_ERROR;
228*7ba4dab5SXin Li response.payload.Activate<COMMAND_DISABLE_CREATE>();
229*7ba4dab5SXin Li
230*7ba4dab5SXin Li Response decoded;
231*7ba4dab5SXin Li EncodeAndDecode(response, &decoded);
232*7ba4dab5SXin Li
233*7ba4dab5SXin Li EXPECT_EQ(NV_RESULT_INTERNAL_ERROR, response.result);
234*7ba4dab5SXin Li EXPECT_EQ(COMMAND_DISABLE_CREATE, decoded.payload.which());
235*7ba4dab5SXin Li EXPECT_TRUE(decoded.payload.get<COMMAND_DISABLE_CREATE>());
236*7ba4dab5SXin Li }
237*7ba4dab5SXin Li
TEST(NvramMessagesTest,WriteSpaceRequest)238*7ba4dab5SXin Li TEST(NvramMessagesTest, WriteSpaceRequest) {
239*7ba4dab5SXin Li Request request;
240*7ba4dab5SXin Li WriteSpaceRequest& request_payload =
241*7ba4dab5SXin Li request.payload.Activate<COMMAND_WRITE_SPACE>();
242*7ba4dab5SXin Li request_payload.index = 0x1234;
243*7ba4dab5SXin Li const uint8_t kData[] = {17, 29, 33};
244*7ba4dab5SXin Li ASSERT_TRUE(request_payload.buffer.Assign(kData, sizeof(kData)));
245*7ba4dab5SXin Li const uint8_t kAuthValue[] = {1, 2, 3};
246*7ba4dab5SXin Li ASSERT_TRUE(request_payload.authorization_value.Assign(kAuthValue,
247*7ba4dab5SXin Li sizeof(kAuthValue)));
248*7ba4dab5SXin Li
249*7ba4dab5SXin Li Request decoded;
250*7ba4dab5SXin Li EncodeAndDecode(request, &decoded);
251*7ba4dab5SXin Li
252*7ba4dab5SXin Li EXPECT_EQ(COMMAND_WRITE_SPACE, decoded.payload.which());
253*7ba4dab5SXin Li const WriteSpaceRequest* decoded_payload =
254*7ba4dab5SXin Li decoded.payload.get<COMMAND_WRITE_SPACE>();
255*7ba4dab5SXin Li ASSERT_TRUE(decoded_payload);
256*7ba4dab5SXin Li
257*7ba4dab5SXin Li EXPECT_EQ(0x1234U, decoded_payload->index);
258*7ba4dab5SXin Li const Blob& decoded_buffer = decoded_payload->buffer;
259*7ba4dab5SXin Li ASSERT_EQ(sizeof(kData), decoded_buffer.size());
260*7ba4dab5SXin Li EXPECT_EQ(0, memcmp(kData, decoded_buffer.data(), sizeof(kData)));
261*7ba4dab5SXin Li const Blob& decoded_auth_value = decoded_payload->authorization_value;
262*7ba4dab5SXin Li ASSERT_EQ(sizeof(kAuthValue), decoded_auth_value.size());
263*7ba4dab5SXin Li EXPECT_EQ(0,
264*7ba4dab5SXin Li memcmp(kAuthValue, decoded_auth_value.data(), sizeof(kAuthValue)));
265*7ba4dab5SXin Li }
266*7ba4dab5SXin Li
TEST(NvramMessagesTest,WriteSpaceResponse)267*7ba4dab5SXin Li TEST(NvramMessagesTest, WriteSpaceResponse) {
268*7ba4dab5SXin Li Response response;
269*7ba4dab5SXin Li response.result = NV_RESULT_OPERATION_DISABLED;
270*7ba4dab5SXin Li response.payload.Activate<COMMAND_WRITE_SPACE>();
271*7ba4dab5SXin Li
272*7ba4dab5SXin Li Response decoded;
273*7ba4dab5SXin Li EncodeAndDecode(response, &decoded);
274*7ba4dab5SXin Li
275*7ba4dab5SXin Li EXPECT_EQ(NV_RESULT_OPERATION_DISABLED, response.result);
276*7ba4dab5SXin Li EXPECT_EQ(COMMAND_WRITE_SPACE, decoded.payload.which());
277*7ba4dab5SXin Li EXPECT_TRUE(decoded.payload.get<COMMAND_WRITE_SPACE>());
278*7ba4dab5SXin Li }
279*7ba4dab5SXin Li
TEST(NvramMessagesTest,ReadSpaceRequest)280*7ba4dab5SXin Li TEST(NvramMessagesTest, ReadSpaceRequest) {
281*7ba4dab5SXin Li Request request;
282*7ba4dab5SXin Li ReadSpaceRequest& request_payload =
283*7ba4dab5SXin Li request.payload.Activate<COMMAND_READ_SPACE>();
284*7ba4dab5SXin Li request_payload.index = 0x1234;
285*7ba4dab5SXin Li const uint8_t kAuthValue[] = {1, 2, 3};
286*7ba4dab5SXin Li ASSERT_TRUE(request_payload.authorization_value.Assign(kAuthValue,
287*7ba4dab5SXin Li sizeof(kAuthValue)));
288*7ba4dab5SXin Li
289*7ba4dab5SXin Li Request decoded;
290*7ba4dab5SXin Li EncodeAndDecode(request, &decoded);
291*7ba4dab5SXin Li
292*7ba4dab5SXin Li EXPECT_EQ(COMMAND_READ_SPACE, decoded.payload.which());
293*7ba4dab5SXin Li const ReadSpaceRequest* decoded_payload =
294*7ba4dab5SXin Li decoded.payload.get<COMMAND_READ_SPACE>();
295*7ba4dab5SXin Li ASSERT_TRUE(decoded_payload);
296*7ba4dab5SXin Li
297*7ba4dab5SXin Li EXPECT_EQ(0x1234U, decoded_payload->index);
298*7ba4dab5SXin Li const Blob& decoded_auth_value = decoded_payload->authorization_value;
299*7ba4dab5SXin Li ASSERT_EQ(sizeof(kAuthValue), decoded_auth_value.size());
300*7ba4dab5SXin Li EXPECT_EQ(0,
301*7ba4dab5SXin Li memcmp(kAuthValue, decoded_auth_value.data(), sizeof(kAuthValue)));
302*7ba4dab5SXin Li }
303*7ba4dab5SXin Li
TEST(NvramMessagesTest,ReadSpaceResponse)304*7ba4dab5SXin Li TEST(NvramMessagesTest, ReadSpaceResponse) {
305*7ba4dab5SXin Li Response response;
306*7ba4dab5SXin Li response.result = NV_RESULT_SUCCESS;
307*7ba4dab5SXin Li ReadSpaceResponse& response_payload =
308*7ba4dab5SXin Li response.payload.Activate<COMMAND_READ_SPACE>();
309*7ba4dab5SXin Li const uint8_t kData[] = {48, 0, 32, 1, 255};
310*7ba4dab5SXin Li ASSERT_TRUE(response_payload.buffer.Assign(kData, sizeof(kData)));
311*7ba4dab5SXin Li
312*7ba4dab5SXin Li Response decoded;
313*7ba4dab5SXin Li EncodeAndDecode(response, &decoded);
314*7ba4dab5SXin Li
315*7ba4dab5SXin Li EXPECT_EQ(NV_RESULT_SUCCESS, response.result);
316*7ba4dab5SXin Li EXPECT_EQ(COMMAND_READ_SPACE, decoded.payload.which());
317*7ba4dab5SXin Li const ReadSpaceResponse* decoded_payload =
318*7ba4dab5SXin Li decoded.payload.get<COMMAND_READ_SPACE>();
319*7ba4dab5SXin Li ASSERT_TRUE(decoded_payload);
320*7ba4dab5SXin Li const Blob& decoded_buffer = decoded_payload->buffer;
321*7ba4dab5SXin Li ASSERT_EQ(sizeof(kData), decoded_buffer.size());
322*7ba4dab5SXin Li EXPECT_EQ(0, memcmp(kData, decoded_buffer.data(), sizeof(kData)));
323*7ba4dab5SXin Li }
324*7ba4dab5SXin Li
TEST(NvramMessagesTest,LockSpaceWriteRequest)325*7ba4dab5SXin Li TEST(NvramMessagesTest, LockSpaceWriteRequest) {
326*7ba4dab5SXin Li Request request;
327*7ba4dab5SXin Li LockSpaceWriteRequest& request_payload =
328*7ba4dab5SXin Li request.payload.Activate<COMMAND_LOCK_SPACE_WRITE>();
329*7ba4dab5SXin Li request_payload.index = 0x1234;
330*7ba4dab5SXin Li const uint8_t kAuthValue[] = {1, 2, 3};
331*7ba4dab5SXin Li ASSERT_TRUE(request_payload.authorization_value.Assign(kAuthValue,
332*7ba4dab5SXin Li sizeof(kAuthValue)));
333*7ba4dab5SXin Li
334*7ba4dab5SXin Li Request decoded;
335*7ba4dab5SXin Li EncodeAndDecode(request, &decoded);
336*7ba4dab5SXin Li
337*7ba4dab5SXin Li EXPECT_EQ(COMMAND_LOCK_SPACE_WRITE, decoded.payload.which());
338*7ba4dab5SXin Li const LockSpaceWriteRequest* decoded_payload =
339*7ba4dab5SXin Li decoded.payload.get<COMMAND_LOCK_SPACE_WRITE>();
340*7ba4dab5SXin Li ASSERT_TRUE(decoded_payload);
341*7ba4dab5SXin Li
342*7ba4dab5SXin Li EXPECT_EQ(0x1234U, decoded_payload->index);
343*7ba4dab5SXin Li const Blob& decoded_auth_value = decoded_payload->authorization_value;
344*7ba4dab5SXin Li ASSERT_EQ(sizeof(kAuthValue), decoded_auth_value.size());
345*7ba4dab5SXin Li EXPECT_EQ(0,
346*7ba4dab5SXin Li memcmp(kAuthValue, decoded_auth_value.data(), sizeof(kAuthValue)));
347*7ba4dab5SXin Li }
348*7ba4dab5SXin Li
TEST(NvramMessagesTest,LockSpaceWriteResponse)349*7ba4dab5SXin Li TEST(NvramMessagesTest, LockSpaceWriteResponse) {
350*7ba4dab5SXin Li Response response;
351*7ba4dab5SXin Li response.result = NV_RESULT_SUCCESS;
352*7ba4dab5SXin Li response.payload.Activate<COMMAND_LOCK_SPACE_WRITE>();
353*7ba4dab5SXin Li
354*7ba4dab5SXin Li Response decoded;
355*7ba4dab5SXin Li EncodeAndDecode(response, &decoded);
356*7ba4dab5SXin Li
357*7ba4dab5SXin Li EXPECT_EQ(NV_RESULT_SUCCESS, response.result);
358*7ba4dab5SXin Li EXPECT_EQ(COMMAND_LOCK_SPACE_WRITE, decoded.payload.which());
359*7ba4dab5SXin Li EXPECT_TRUE(decoded.payload.get<COMMAND_LOCK_SPACE_WRITE>());
360*7ba4dab5SXin Li }
361*7ba4dab5SXin Li
TEST(NvramMessagesTest,LockSpaceReadRequest)362*7ba4dab5SXin Li TEST(NvramMessagesTest, LockSpaceReadRequest) {
363*7ba4dab5SXin Li Request request;
364*7ba4dab5SXin Li LockSpaceReadRequest& request_payload =
365*7ba4dab5SXin Li request.payload.Activate<COMMAND_LOCK_SPACE_READ>();
366*7ba4dab5SXin Li request_payload.index = 0x1234;
367*7ba4dab5SXin Li const uint8_t kAuthValue[] = {1, 2, 3};
368*7ba4dab5SXin Li ASSERT_TRUE(request_payload.authorization_value.Assign(kAuthValue,
369*7ba4dab5SXin Li sizeof(kAuthValue)));
370*7ba4dab5SXin Li
371*7ba4dab5SXin Li Request decoded;
372*7ba4dab5SXin Li EncodeAndDecode(request, &decoded);
373*7ba4dab5SXin Li
374*7ba4dab5SXin Li EXPECT_EQ(COMMAND_LOCK_SPACE_READ, decoded.payload.which());
375*7ba4dab5SXin Li const LockSpaceReadRequest* decoded_payload =
376*7ba4dab5SXin Li decoded.payload.get<COMMAND_LOCK_SPACE_READ>();
377*7ba4dab5SXin Li ASSERT_TRUE(decoded_payload);
378*7ba4dab5SXin Li
379*7ba4dab5SXin Li EXPECT_EQ(0x1234U, decoded_payload->index);
380*7ba4dab5SXin Li const Blob& decoded_auth_value = decoded_payload->authorization_value;
381*7ba4dab5SXin Li ASSERT_EQ(sizeof(kAuthValue), decoded_auth_value.size());
382*7ba4dab5SXin Li EXPECT_EQ(0,
383*7ba4dab5SXin Li memcmp(kAuthValue, decoded_auth_value.data(), sizeof(kAuthValue)));
384*7ba4dab5SXin Li }
385*7ba4dab5SXin Li
TEST(NvramMessagesTest,LockSpaceReadResponse)386*7ba4dab5SXin Li TEST(NvramMessagesTest, LockSpaceReadResponse) {
387*7ba4dab5SXin Li Response response;
388*7ba4dab5SXin Li response.result = NV_RESULT_SUCCESS;
389*7ba4dab5SXin Li response.payload.Activate<COMMAND_LOCK_SPACE_READ>();
390*7ba4dab5SXin Li
391*7ba4dab5SXin Li Response decoded;
392*7ba4dab5SXin Li EncodeAndDecode(response, &decoded);
393*7ba4dab5SXin Li
394*7ba4dab5SXin Li EXPECT_EQ(NV_RESULT_SUCCESS, response.result);
395*7ba4dab5SXin Li EXPECT_EQ(COMMAND_LOCK_SPACE_READ, decoded.payload.which());
396*7ba4dab5SXin Li EXPECT_TRUE(decoded.payload.get<COMMAND_LOCK_SPACE_READ>());
397*7ba4dab5SXin Li }
398*7ba4dab5SXin Li
TEST(NvramMessagesTest,GarbageDecode)399*7ba4dab5SXin Li TEST(NvramMessagesTest, GarbageDecode) {
400*7ba4dab5SXin Li srand(0);
401*7ba4dab5SXin Li uint8_t random_data[1024];
402*7ba4dab5SXin Li for (size_t i = 0; i < sizeof(random_data); ++i) {
403*7ba4dab5SXin Li random_data[i] = rand() & 0xff;
404*7ba4dab5SXin Li }
405*7ba4dab5SXin Li
406*7ba4dab5SXin Li // Feed the data to the decoder. The test succeeds if we don't crash.
407*7ba4dab5SXin Li for (size_t pos = 0; pos < sizeof(random_data); ++pos) {
408*7ba4dab5SXin Li for (size_t end = pos; end < sizeof(random_data); ++end) {
409*7ba4dab5SXin Li Request request;
410*7ba4dab5SXin Li Decode(random_data + pos, end - pos, &request);
411*7ba4dab5SXin Li
412*7ba4dab5SXin Li Response response;
413*7ba4dab5SXin Li Decode(random_data + pos, end - pos, &response);
414*7ba4dab5SXin Li }
415*7ba4dab5SXin Li }
416*7ba4dab5SXin Li }
417*7ba4dab5SXin Li
418*7ba4dab5SXin Li } // namespace nvram
419