xref: /aosp_15_r20/system/nvram/messages/tests/nvram_messages_test.cpp (revision 7ba4dab5cc5e3c8f3eb594dcf3b33f99d9214aee)
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