1*cfb92d14SAndroid Build Coastguard Worker /*
2*cfb92d14SAndroid Build Coastguard Worker * Copyright (c) 2017, The OpenThread Authors.
3*cfb92d14SAndroid Build Coastguard Worker * All rights reserved.
4*cfb92d14SAndroid Build Coastguard Worker *
5*cfb92d14SAndroid Build Coastguard Worker * Redistribution and use in source and binary forms, with or without
6*cfb92d14SAndroid Build Coastguard Worker * modification, are permitted provided that the following conditions are met:
7*cfb92d14SAndroid Build Coastguard Worker * 1. Redistributions of source code must retain the above copyright
8*cfb92d14SAndroid Build Coastguard Worker * notice, this list of conditions and the following disclaimer.
9*cfb92d14SAndroid Build Coastguard Worker * 2. Redistributions in binary form must reproduce the above copyright
10*cfb92d14SAndroid Build Coastguard Worker * notice, this list of conditions and the following disclaimer in the
11*cfb92d14SAndroid Build Coastguard Worker * documentation and/or other materials provided with the distribution.
12*cfb92d14SAndroid Build Coastguard Worker * 3. Neither the name of the copyright holder nor the
13*cfb92d14SAndroid Build Coastguard Worker * names of its contributors may be used to endorse or promote products
14*cfb92d14SAndroid Build Coastguard Worker * derived from this software without specific prior written permission.
15*cfb92d14SAndroid Build Coastguard Worker *
16*cfb92d14SAndroid Build Coastguard Worker * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
17*cfb92d14SAndroid Build Coastguard Worker * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18*cfb92d14SAndroid Build Coastguard Worker * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19*cfb92d14SAndroid Build Coastguard Worker * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
20*cfb92d14SAndroid Build Coastguard Worker * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21*cfb92d14SAndroid Build Coastguard Worker * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22*cfb92d14SAndroid Build Coastguard Worker * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
23*cfb92d14SAndroid Build Coastguard Worker * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
24*cfb92d14SAndroid Build Coastguard Worker * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
25*cfb92d14SAndroid Build Coastguard Worker * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
26*cfb92d14SAndroid Build Coastguard Worker * POSSIBILITY OF SUCH DAMAGE.
27*cfb92d14SAndroid Build Coastguard Worker */
28*cfb92d14SAndroid Build Coastguard Worker
29*cfb92d14SAndroid Build Coastguard Worker #include "common/code_utils.hpp"
30*cfb92d14SAndroid Build Coastguard Worker #include "instance/instance.hpp"
31*cfb92d14SAndroid Build Coastguard Worker #include "lib/spinel/spinel_encoder.hpp"
32*cfb92d14SAndroid Build Coastguard Worker
33*cfb92d14SAndroid Build Coastguard Worker #include "test_util.hpp"
34*cfb92d14SAndroid Build Coastguard Worker
35*cfb92d14SAndroid Build Coastguard Worker namespace ot {
36*cfb92d14SAndroid Build Coastguard Worker namespace Spinel {
37*cfb92d14SAndroid Build Coastguard Worker
38*cfb92d14SAndroid Build Coastguard Worker enum
39*cfb92d14SAndroid Build Coastguard Worker {
40*cfb92d14SAndroid Build Coastguard Worker kTestBufferSize = 800,
41*cfb92d14SAndroid Build Coastguard Worker };
42*cfb92d14SAndroid Build Coastguard Worker
ReadFrame(Spinel::Buffer & aNcpBuffer,uint8_t * aFrame,uint16_t & aFrameLen)43*cfb92d14SAndroid Build Coastguard Worker otError ReadFrame(Spinel::Buffer &aNcpBuffer, uint8_t *aFrame, uint16_t &aFrameLen)
44*cfb92d14SAndroid Build Coastguard Worker {
45*cfb92d14SAndroid Build Coastguard Worker otError error = OT_ERROR_NONE;
46*cfb92d14SAndroid Build Coastguard Worker
47*cfb92d14SAndroid Build Coastguard Worker SuccessOrExit(error = aNcpBuffer.OutFrameBegin());
48*cfb92d14SAndroid Build Coastguard Worker aFrameLen = aNcpBuffer.OutFrameGetLength();
49*cfb92d14SAndroid Build Coastguard Worker VerifyOrExit(aNcpBuffer.OutFrameRead(aFrameLen, aFrame) == aFrameLen, error = OT_ERROR_FAILED);
50*cfb92d14SAndroid Build Coastguard Worker SuccessOrExit(error = aNcpBuffer.OutFrameRemove());
51*cfb92d14SAndroid Build Coastguard Worker
52*cfb92d14SAndroid Build Coastguard Worker exit:
53*cfb92d14SAndroid Build Coastguard Worker return error;
54*cfb92d14SAndroid Build Coastguard Worker }
55*cfb92d14SAndroid Build Coastguard Worker
TestEncoder(void)56*cfb92d14SAndroid Build Coastguard Worker void TestEncoder(void)
57*cfb92d14SAndroid Build Coastguard Worker {
58*cfb92d14SAndroid Build Coastguard Worker uint8_t buffer[kTestBufferSize];
59*cfb92d14SAndroid Build Coastguard Worker Spinel::Buffer ncpBuffer(buffer, kTestBufferSize);
60*cfb92d14SAndroid Build Coastguard Worker Spinel::Encoder encoder(ncpBuffer);
61*cfb92d14SAndroid Build Coastguard Worker
62*cfb92d14SAndroid Build Coastguard Worker uint8_t frame[kTestBufferSize];
63*cfb92d14SAndroid Build Coastguard Worker uint16_t frameLen;
64*cfb92d14SAndroid Build Coastguard Worker spinel_ssize_t parsedLen;
65*cfb92d14SAndroid Build Coastguard Worker
66*cfb92d14SAndroid Build Coastguard Worker const bool kBool_1 = true;
67*cfb92d14SAndroid Build Coastguard Worker const bool kBool_2 = false;
68*cfb92d14SAndroid Build Coastguard Worker const uint8_t kUint8 = 0x42;
69*cfb92d14SAndroid Build Coastguard Worker const int8_t kInt8 = -73;
70*cfb92d14SAndroid Build Coastguard Worker const uint16_t kUint16 = 0xabcd;
71*cfb92d14SAndroid Build Coastguard Worker const int16_t kInt16 = -567;
72*cfb92d14SAndroid Build Coastguard Worker const uint32_t kUint32 = 0xdeadbeef;
73*cfb92d14SAndroid Build Coastguard Worker const int32_t kInt32 = -123455678L;
74*cfb92d14SAndroid Build Coastguard Worker const uint64_t kUint64 = 0xfe10dc32ba549876ULL;
75*cfb92d14SAndroid Build Coastguard Worker const int64_t kInt64 = -9197712039090021561LL;
76*cfb92d14SAndroid Build Coastguard Worker const unsigned int kUint_1 = 9;
77*cfb92d14SAndroid Build Coastguard Worker const unsigned int kUint_2 = 0xa3;
78*cfb92d14SAndroid Build Coastguard Worker const unsigned int kUint_3 = 0x8765;
79*cfb92d14SAndroid Build Coastguard Worker const unsigned int kUint_4 = SPINEL_MAX_UINT_PACKED - 1;
80*cfb92d14SAndroid Build Coastguard Worker
81*cfb92d14SAndroid Build Coastguard Worker const spinel_ipv6addr_t kIp6Addr = {
82*cfb92d14SAndroid Build Coastguard Worker {0x6B, 0x41, 0x65, 0x73, 0x42, 0x68, 0x61, 0x76, 0x54, 0x61, 0x72, 0x7A, 0x49, 0x69, 0x61, 0x4E}};
83*cfb92d14SAndroid Build Coastguard Worker
84*cfb92d14SAndroid Build Coastguard Worker const spinel_eui48_t kEui48 = {
85*cfb92d14SAndroid Build Coastguard Worker {4, 8, 15, 16, 23, 42} // "Lost" EUI48!
86*cfb92d14SAndroid Build Coastguard Worker };
87*cfb92d14SAndroid Build Coastguard Worker
88*cfb92d14SAndroid Build Coastguard Worker const spinel_eui64_t kEui64 = {
89*cfb92d14SAndroid Build Coastguard Worker {2, 3, 5, 7, 11, 13, 17, 19}, // "Prime" EUI64!
90*cfb92d14SAndroid Build Coastguard Worker };
91*cfb92d14SAndroid Build Coastguard Worker
92*cfb92d14SAndroid Build Coastguard Worker const char kString_1[] = "OpenThread";
93*cfb92d14SAndroid Build Coastguard Worker const char kString_2[] = "";
94*cfb92d14SAndroid Build Coastguard Worker
95*cfb92d14SAndroid Build Coastguard Worker const uint16_t kData[] = {10, 20, 3, 15, 1000, 60, 16}; // ... then comes 17,18,19,20 :)
96*cfb92d14SAndroid Build Coastguard Worker
97*cfb92d14SAndroid Build Coastguard Worker bool b_1, b_2;
98*cfb92d14SAndroid Build Coastguard Worker uint8_t u8;
99*cfb92d14SAndroid Build Coastguard Worker int8_t i8;
100*cfb92d14SAndroid Build Coastguard Worker uint16_t u16;
101*cfb92d14SAndroid Build Coastguard Worker int16_t i16;
102*cfb92d14SAndroid Build Coastguard Worker uint32_t u32;
103*cfb92d14SAndroid Build Coastguard Worker int32_t i32;
104*cfb92d14SAndroid Build Coastguard Worker uint64_t u64;
105*cfb92d14SAndroid Build Coastguard Worker int64_t i64;
106*cfb92d14SAndroid Build Coastguard Worker unsigned int u_1, u_2, u_3, u_4;
107*cfb92d14SAndroid Build Coastguard Worker spinel_ipv6addr_t *ip6Addr;
108*cfb92d14SAndroid Build Coastguard Worker spinel_eui48_t *eui48;
109*cfb92d14SAndroid Build Coastguard Worker spinel_eui64_t *eui64;
110*cfb92d14SAndroid Build Coastguard Worker const char *utf_1;
111*cfb92d14SAndroid Build Coastguard Worker const char *utf_2;
112*cfb92d14SAndroid Build Coastguard Worker const uint8_t *dataPtr;
113*cfb92d14SAndroid Build Coastguard Worker spinel_size_t dataLen;
114*cfb92d14SAndroid Build Coastguard Worker
115*cfb92d14SAndroid Build Coastguard Worker memset(buffer, 0, sizeof(buffer));
116*cfb92d14SAndroid Build Coastguard Worker
117*cfb92d14SAndroid Build Coastguard Worker printf("\n- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -");
118*cfb92d14SAndroid Build Coastguard Worker printf("\nTest 1: Encoding of simple types");
119*cfb92d14SAndroid Build Coastguard Worker
120*cfb92d14SAndroid Build Coastguard Worker SuccessOrQuit(encoder.BeginFrame(Spinel::Buffer::kPriorityLow));
121*cfb92d14SAndroid Build Coastguard Worker SuccessOrQuit(encoder.WriteBool(kBool_1));
122*cfb92d14SAndroid Build Coastguard Worker SuccessOrQuit(encoder.WriteBool(kBool_2));
123*cfb92d14SAndroid Build Coastguard Worker SuccessOrQuit(encoder.WriteUint8(kUint8));
124*cfb92d14SAndroid Build Coastguard Worker SuccessOrQuit(encoder.WriteInt8(kInt8));
125*cfb92d14SAndroid Build Coastguard Worker SuccessOrQuit(encoder.WriteUint16(kUint16));
126*cfb92d14SAndroid Build Coastguard Worker SuccessOrQuit(encoder.WriteInt16(kInt16));
127*cfb92d14SAndroid Build Coastguard Worker SuccessOrQuit(encoder.WriteUint32(kUint32));
128*cfb92d14SAndroid Build Coastguard Worker SuccessOrQuit(encoder.WriteInt32(kInt32));
129*cfb92d14SAndroid Build Coastguard Worker SuccessOrQuit(encoder.WriteUint64(kUint64));
130*cfb92d14SAndroid Build Coastguard Worker SuccessOrQuit(encoder.WriteInt64(kInt64));
131*cfb92d14SAndroid Build Coastguard Worker SuccessOrQuit(encoder.WriteUintPacked(kUint_1));
132*cfb92d14SAndroid Build Coastguard Worker SuccessOrQuit(encoder.WriteUintPacked(kUint_2));
133*cfb92d14SAndroid Build Coastguard Worker SuccessOrQuit(encoder.WriteUintPacked(kUint_3));
134*cfb92d14SAndroid Build Coastguard Worker SuccessOrQuit(encoder.WriteUintPacked(kUint_4));
135*cfb92d14SAndroid Build Coastguard Worker SuccessOrQuit(encoder.WriteIp6Address(kIp6Addr));
136*cfb92d14SAndroid Build Coastguard Worker SuccessOrQuit(encoder.WriteEui48(kEui48));
137*cfb92d14SAndroid Build Coastguard Worker SuccessOrQuit(encoder.WriteEui64(kEui64));
138*cfb92d14SAndroid Build Coastguard Worker SuccessOrQuit(encoder.WriteUtf8(kString_1));
139*cfb92d14SAndroid Build Coastguard Worker SuccessOrQuit(encoder.WriteUtf8(kString_2));
140*cfb92d14SAndroid Build Coastguard Worker SuccessOrQuit(encoder.WriteData((const uint8_t *)kData, sizeof(kData)));
141*cfb92d14SAndroid Build Coastguard Worker SuccessOrQuit(encoder.EndFrame());
142*cfb92d14SAndroid Build Coastguard Worker
143*cfb92d14SAndroid Build Coastguard Worker DumpBuffer("Buffer", buffer, 256);
144*cfb92d14SAndroid Build Coastguard Worker SuccessOrQuit(ReadFrame(ncpBuffer, frame, frameLen));
145*cfb92d14SAndroid Build Coastguard Worker DumpBuffer("Frame", frame, frameLen);
146*cfb92d14SAndroid Build Coastguard Worker
147*cfb92d14SAndroid Build Coastguard Worker parsedLen = spinel_datatype_unpack(
148*cfb92d14SAndroid Build Coastguard Worker frame, static_cast<spinel_size_t>(frameLen),
149*cfb92d14SAndroid Build Coastguard Worker (SPINEL_DATATYPE_BOOL_S SPINEL_DATATYPE_BOOL_S SPINEL_DATATYPE_UINT8_S SPINEL_DATATYPE_INT8_S
150*cfb92d14SAndroid Build Coastguard Worker SPINEL_DATATYPE_UINT16_S SPINEL_DATATYPE_INT16_S SPINEL_DATATYPE_UINT32_S SPINEL_DATATYPE_INT32_S
151*cfb92d14SAndroid Build Coastguard Worker SPINEL_DATATYPE_UINT64_S SPINEL_DATATYPE_INT64_S SPINEL_DATATYPE_UINT_PACKED_S
152*cfb92d14SAndroid Build Coastguard Worker SPINEL_DATATYPE_UINT_PACKED_S SPINEL_DATATYPE_UINT_PACKED_S SPINEL_DATATYPE_UINT_PACKED_S
153*cfb92d14SAndroid Build Coastguard Worker SPINEL_DATATYPE_IPv6ADDR_S SPINEL_DATATYPE_EUI48_S SPINEL_DATATYPE_EUI64_S
154*cfb92d14SAndroid Build Coastguard Worker SPINEL_DATATYPE_UTF8_S SPINEL_DATATYPE_UTF8_S SPINEL_DATATYPE_DATA_S),
155*cfb92d14SAndroid Build Coastguard Worker &b_1, &b_2, &u8, &i8, &u16, &i16, &u32, &i32, &u64, &i64, &u_1, &u_2, &u_3, &u_4, &ip6Addr, &eui48, &eui64,
156*cfb92d14SAndroid Build Coastguard Worker &utf_1, &utf_2, &dataPtr, &dataLen);
157*cfb92d14SAndroid Build Coastguard Worker
158*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(parsedLen == frameLen);
159*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(b_1 == kBool_1);
160*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(b_2 == kBool_2);
161*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(u8 == kUint8);
162*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(i8 == kInt8);
163*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(u16 == kUint16);
164*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(i16 == kInt16);
165*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(u32 == kUint32);
166*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(i32 == kInt32);
167*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(u64 == kUint64);
168*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(i64 == kInt64);
169*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(u_1 == kUint_1);
170*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(u_2 == kUint_2);
171*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(u_3 == kUint_3);
172*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(u_4 == kUint_4);
173*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(memcmp(ip6Addr, &kIp6Addr, sizeof(spinel_ipv6addr_t)) == 0);
174*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(memcmp(eui48, &kEui48, sizeof(spinel_eui48_t)) == 0);
175*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(memcmp(eui64, &kEui64, sizeof(spinel_eui64_t)) == 0);
176*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(memcmp(utf_1, kString_1, sizeof(kString_1)) == 0);
177*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(memcmp(utf_2, kString_2, sizeof(kString_2)) == 0);
178*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(dataLen == sizeof(kData));
179*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(memcmp(dataPtr, &kData, sizeof(kData)) == 0);
180*cfb92d14SAndroid Build Coastguard Worker
181*cfb92d14SAndroid Build Coastguard Worker printf(" -- PASS\n");
182*cfb92d14SAndroid Build Coastguard Worker
183*cfb92d14SAndroid Build Coastguard Worker printf("\n- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -");
184*cfb92d14SAndroid Build Coastguard Worker printf("\nTest 2: Test a single simple struct.");
185*cfb92d14SAndroid Build Coastguard Worker
186*cfb92d14SAndroid Build Coastguard Worker SuccessOrQuit(encoder.BeginFrame(Spinel::Buffer::kPriorityLow));
187*cfb92d14SAndroid Build Coastguard Worker SuccessOrQuit(encoder.WriteUint8(kUint8));
188*cfb92d14SAndroid Build Coastguard Worker SuccessOrQuit(encoder.OpenStruct());
189*cfb92d14SAndroid Build Coastguard Worker {
190*cfb92d14SAndroid Build Coastguard Worker SuccessOrQuit(encoder.WriteUint32(kUint32));
191*cfb92d14SAndroid Build Coastguard Worker SuccessOrQuit(encoder.WriteEui48(kEui48));
192*cfb92d14SAndroid Build Coastguard Worker SuccessOrQuit(encoder.WriteUintPacked(kUint_3));
193*cfb92d14SAndroid Build Coastguard Worker }
194*cfb92d14SAndroid Build Coastguard Worker SuccessOrQuit(encoder.CloseStruct());
195*cfb92d14SAndroid Build Coastguard Worker SuccessOrQuit(encoder.WriteInt16(kInt16));
196*cfb92d14SAndroid Build Coastguard Worker SuccessOrQuit(encoder.EndFrame());
197*cfb92d14SAndroid Build Coastguard Worker
198*cfb92d14SAndroid Build Coastguard Worker DumpBuffer("Buffer", buffer, 256);
199*cfb92d14SAndroid Build Coastguard Worker SuccessOrQuit(ReadFrame(ncpBuffer, frame, frameLen));
200*cfb92d14SAndroid Build Coastguard Worker DumpBuffer("Frame", frame, frameLen);
201*cfb92d14SAndroid Build Coastguard Worker
202*cfb92d14SAndroid Build Coastguard Worker parsedLen = spinel_datatype_unpack(
203*cfb92d14SAndroid Build Coastguard Worker frame, static_cast<spinel_size_t>(frameLen),
204*cfb92d14SAndroid Build Coastguard Worker (SPINEL_DATATYPE_UINT8_S SPINEL_DATATYPE_STRUCT_S(
205*cfb92d14SAndroid Build Coastguard Worker SPINEL_DATATYPE_UINT32_S SPINEL_DATATYPE_EUI48_S SPINEL_DATATYPE_UINT_PACKED_S) SPINEL_DATATYPE_INT16_S
206*cfb92d14SAndroid Build Coastguard Worker
207*cfb92d14SAndroid Build Coastguard Worker ),
208*cfb92d14SAndroid Build Coastguard Worker &u8, &u32, &eui48, &u_3, &i16);
209*cfb92d14SAndroid Build Coastguard Worker
210*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(parsedLen == frameLen);
211*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(u8 == kUint8);
212*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(i16 == kInt16);
213*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(u32 == kUint32);
214*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(u_3 == kUint_3);
215*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(memcmp(eui48, &kEui48, sizeof(spinel_eui48_t)) == 0);
216*cfb92d14SAndroid Build Coastguard Worker
217*cfb92d14SAndroid Build Coastguard Worker // Parse the struct as a "data with len".
218*cfb92d14SAndroid Build Coastguard Worker parsedLen = spinel_datatype_unpack(frame, static_cast<spinel_size_t>(frameLen),
219*cfb92d14SAndroid Build Coastguard Worker (SPINEL_DATATYPE_UINT8_S SPINEL_DATATYPE_DATA_WLEN_S SPINEL_DATATYPE_INT16_S
220*cfb92d14SAndroid Build Coastguard Worker
221*cfb92d14SAndroid Build Coastguard Worker ),
222*cfb92d14SAndroid Build Coastguard Worker &u8, &dataPtr, &dataLen, &i16);
223*cfb92d14SAndroid Build Coastguard Worker
224*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(parsedLen == frameLen);
225*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(u8 == kUint8);
226*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(i16 == kInt16);
227*cfb92d14SAndroid Build Coastguard Worker
228*cfb92d14SAndroid Build Coastguard Worker printf(" -- PASS\n");
229*cfb92d14SAndroid Build Coastguard Worker
230*cfb92d14SAndroid Build Coastguard Worker printf("\n- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -");
231*cfb92d14SAndroid Build Coastguard Worker printf("\nTest 3: Test multiple structs and struct within struct.");
232*cfb92d14SAndroid Build Coastguard Worker
233*cfb92d14SAndroid Build Coastguard Worker SuccessOrQuit(encoder.BeginFrame(Spinel::Buffer::kPriorityLow));
234*cfb92d14SAndroid Build Coastguard Worker SuccessOrQuit(encoder.OpenStruct());
235*cfb92d14SAndroid Build Coastguard Worker {
236*cfb92d14SAndroid Build Coastguard Worker SuccessOrQuit(encoder.WriteUint8(kUint8));
237*cfb92d14SAndroid Build Coastguard Worker SuccessOrQuit(encoder.WriteUtf8(kString_1));
238*cfb92d14SAndroid Build Coastguard Worker SuccessOrQuit(encoder.OpenStruct());
239*cfb92d14SAndroid Build Coastguard Worker {
240*cfb92d14SAndroid Build Coastguard Worker SuccessOrQuit(encoder.WriteBool(kBool_1));
241*cfb92d14SAndroid Build Coastguard Worker SuccessOrQuit(encoder.WriteIp6Address(kIp6Addr));
242*cfb92d14SAndroid Build Coastguard Worker }
243*cfb92d14SAndroid Build Coastguard Worker SuccessOrQuit(encoder.CloseStruct());
244*cfb92d14SAndroid Build Coastguard Worker SuccessOrQuit(encoder.WriteUint16(kUint16));
245*cfb92d14SAndroid Build Coastguard Worker }
246*cfb92d14SAndroid Build Coastguard Worker SuccessOrQuit(encoder.CloseStruct());
247*cfb92d14SAndroid Build Coastguard Worker SuccessOrQuit(encoder.WriteEui48(kEui48));
248*cfb92d14SAndroid Build Coastguard Worker SuccessOrQuit(encoder.OpenStruct());
249*cfb92d14SAndroid Build Coastguard Worker {
250*cfb92d14SAndroid Build Coastguard Worker SuccessOrQuit(encoder.WriteUint32(kUint32));
251*cfb92d14SAndroid Build Coastguard Worker }
252*cfb92d14SAndroid Build Coastguard Worker SuccessOrQuit(encoder.CloseStruct());
253*cfb92d14SAndroid Build Coastguard Worker SuccessOrQuit(encoder.WriteInt32(kInt32));
254*cfb92d14SAndroid Build Coastguard Worker SuccessOrQuit(encoder.EndFrame());
255*cfb92d14SAndroid Build Coastguard Worker
256*cfb92d14SAndroid Build Coastguard Worker DumpBuffer("Buffer", buffer, 256 + 100);
257*cfb92d14SAndroid Build Coastguard Worker
258*cfb92d14SAndroid Build Coastguard Worker SuccessOrQuit(ReadFrame(ncpBuffer, frame, frameLen));
259*cfb92d14SAndroid Build Coastguard Worker
260*cfb92d14SAndroid Build Coastguard Worker parsedLen = spinel_datatype_unpack(
261*cfb92d14SAndroid Build Coastguard Worker frame, static_cast<spinel_size_t>(frameLen),
262*cfb92d14SAndroid Build Coastguard Worker (SPINEL_DATATYPE_STRUCT_S(SPINEL_DATATYPE_UINT8_S SPINEL_DATATYPE_UTF8_S SPINEL_DATATYPE_STRUCT_S(
263*cfb92d14SAndroid Build Coastguard Worker SPINEL_DATATYPE_BOOL_S SPINEL_DATATYPE_IPv6ADDR_S) SPINEL_DATATYPE_UINT16_S)
264*cfb92d14SAndroid Build Coastguard Worker SPINEL_DATATYPE_EUI48_S SPINEL_DATATYPE_STRUCT_S(SPINEL_DATATYPE_UINT32_S) SPINEL_DATATYPE_INT32_S),
265*cfb92d14SAndroid Build Coastguard Worker &u8, &utf_1, &b_1, &ip6Addr, &u16, &eui48, &u32, &i32);
266*cfb92d14SAndroid Build Coastguard Worker
267*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(parsedLen == frameLen);
268*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(b_1 == kBool_1);
269*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(u8 == kUint8);
270*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(u16 == kUint16);
271*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(u32 == kUint32);
272*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(i32 == kInt32);
273*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(memcmp(ip6Addr, &kIp6Addr, sizeof(spinel_ipv6addr_t)) == 0);
274*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(memcmp(eui48, &kEui48, sizeof(spinel_eui48_t)) == 0);
275*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(memcmp(utf_1, kString_1, sizeof(kString_1)) == 0);
276*cfb92d14SAndroid Build Coastguard Worker
277*cfb92d14SAndroid Build Coastguard Worker printf(" -- PASS\n");
278*cfb92d14SAndroid Build Coastguard Worker
279*cfb92d14SAndroid Build Coastguard Worker printf("\n- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -");
280*cfb92d14SAndroid Build Coastguard Worker printf("\nTest 4: Test unclosed struct.");
281*cfb92d14SAndroid Build Coastguard Worker
282*cfb92d14SAndroid Build Coastguard Worker SuccessOrQuit(encoder.BeginFrame(Spinel::Buffer::kPriorityLow));
283*cfb92d14SAndroid Build Coastguard Worker SuccessOrQuit(encoder.WriteUint8(kUint8));
284*cfb92d14SAndroid Build Coastguard Worker SuccessOrQuit(encoder.OpenStruct());
285*cfb92d14SAndroid Build Coastguard Worker {
286*cfb92d14SAndroid Build Coastguard Worker SuccessOrQuit(encoder.WriteUint32(kUint32));
287*cfb92d14SAndroid Build Coastguard Worker SuccessOrQuit(encoder.OpenStruct());
288*cfb92d14SAndroid Build Coastguard Worker {
289*cfb92d14SAndroid Build Coastguard Worker SuccessOrQuit(encoder.WriteEui48(kEui48));
290*cfb92d14SAndroid Build Coastguard Worker SuccessOrQuit(encoder.WriteUintPacked(kUint_3));
291*cfb92d14SAndroid Build Coastguard Worker // Do not close the structs expecting `EndFrame()` to close them.
292*cfb92d14SAndroid Build Coastguard Worker }
293*cfb92d14SAndroid Build Coastguard Worker }
294*cfb92d14SAndroid Build Coastguard Worker SuccessOrQuit(encoder.EndFrame());
295*cfb92d14SAndroid Build Coastguard Worker
296*cfb92d14SAndroid Build Coastguard Worker SuccessOrQuit(ReadFrame(ncpBuffer, frame, frameLen));
297*cfb92d14SAndroid Build Coastguard Worker
298*cfb92d14SAndroid Build Coastguard Worker parsedLen = spinel_datatype_unpack(
299*cfb92d14SAndroid Build Coastguard Worker frame, static_cast<spinel_size_t>(frameLen),
300*cfb92d14SAndroid Build Coastguard Worker (SPINEL_DATATYPE_UINT8_S SPINEL_DATATYPE_STRUCT_S(
301*cfb92d14SAndroid Build Coastguard Worker SPINEL_DATATYPE_UINT32_S SPINEL_DATATYPE_STRUCT_S(SPINEL_DATATYPE_EUI48_S SPINEL_DATATYPE_UINT_PACKED_S))),
302*cfb92d14SAndroid Build Coastguard Worker &u8, &u32, &eui48, &u_3);
303*cfb92d14SAndroid Build Coastguard Worker
304*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(parsedLen == frameLen);
305*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(u8 == kUint8);
306*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(u32 == kUint32);
307*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(u_3 == kUint_3);
308*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(memcmp(eui48, &kEui48, sizeof(spinel_eui48_t)) == 0);
309*cfb92d14SAndroid Build Coastguard Worker
310*cfb92d14SAndroid Build Coastguard Worker printf(" -- PASS\n");
311*cfb92d14SAndroid Build Coastguard Worker
312*cfb92d14SAndroid Build Coastguard Worker printf("\n- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -");
313*cfb92d14SAndroid Build Coastguard Worker printf("\nTest 5: Test saving position and resetting back to a saved position");
314*cfb92d14SAndroid Build Coastguard Worker
315*cfb92d14SAndroid Build Coastguard Worker SuccessOrQuit(encoder.BeginFrame(Spinel::Buffer::kPriorityLow));
316*cfb92d14SAndroid Build Coastguard Worker SuccessOrQuit(encoder.WriteUint8(kUint8));
317*cfb92d14SAndroid Build Coastguard Worker SuccessOrQuit(encoder.OpenStruct());
318*cfb92d14SAndroid Build Coastguard Worker {
319*cfb92d14SAndroid Build Coastguard Worker SuccessOrQuit(encoder.WriteUint32(kUint32));
320*cfb92d14SAndroid Build Coastguard Worker
321*cfb92d14SAndroid Build Coastguard Worker // Save position in middle a first open struct.
322*cfb92d14SAndroid Build Coastguard Worker SuccessOrQuit(encoder.SavePosition());
323*cfb92d14SAndroid Build Coastguard Worker SuccessOrQuit(encoder.OpenStruct());
324*cfb92d14SAndroid Build Coastguard Worker {
325*cfb92d14SAndroid Build Coastguard Worker SuccessOrQuit(encoder.WriteEui48(kEui48));
326*cfb92d14SAndroid Build Coastguard Worker SuccessOrQuit(encoder.WriteUintPacked(kUint_3));
327*cfb92d14SAndroid Build Coastguard Worker }
328*cfb92d14SAndroid Build Coastguard Worker
329*cfb92d14SAndroid Build Coastguard Worker // Reset to saved position in middle of the second open struct which should be discarded.
330*cfb92d14SAndroid Build Coastguard Worker
331*cfb92d14SAndroid Build Coastguard Worker SuccessOrQuit(encoder.ResetToSaved());
332*cfb92d14SAndroid Build Coastguard Worker
333*cfb92d14SAndroid Build Coastguard Worker SuccessOrQuit(encoder.WriteIp6Address(kIp6Addr));
334*cfb92d14SAndroid Build Coastguard Worker SuccessOrQuit(encoder.WriteEui64(kEui64));
335*cfb92d14SAndroid Build Coastguard Worker }
336*cfb92d14SAndroid Build Coastguard Worker SuccessOrQuit(encoder.CloseStruct());
337*cfb92d14SAndroid Build Coastguard Worker SuccessOrQuit(encoder.WriteUtf8(kString_1));
338*cfb92d14SAndroid Build Coastguard Worker SuccessOrQuit(encoder.EndFrame());
339*cfb92d14SAndroid Build Coastguard Worker
340*cfb92d14SAndroid Build Coastguard Worker SuccessOrQuit(ReadFrame(ncpBuffer, frame, frameLen));
341*cfb92d14SAndroid Build Coastguard Worker
342*cfb92d14SAndroid Build Coastguard Worker parsedLen = spinel_datatype_unpack(
343*cfb92d14SAndroid Build Coastguard Worker frame, static_cast<spinel_size_t>(frameLen),
344*cfb92d14SAndroid Build Coastguard Worker (SPINEL_DATATYPE_UINT8_S SPINEL_DATATYPE_STRUCT_S(
345*cfb92d14SAndroid Build Coastguard Worker SPINEL_DATATYPE_UINT32_S SPINEL_DATATYPE_IPv6ADDR_S SPINEL_DATATYPE_EUI64_S) SPINEL_DATATYPE_UTF8_S),
346*cfb92d14SAndroid Build Coastguard Worker &u8, &u32, &ip6Addr, &eui64, &utf_1);
347*cfb92d14SAndroid Build Coastguard Worker
348*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(parsedLen == frameLen);
349*cfb92d14SAndroid Build Coastguard Worker
350*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(u8 == kUint8);
351*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(u32 == kUint32);
352*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(i32 == kInt32);
353*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(memcmp(ip6Addr, &kIp6Addr, sizeof(spinel_ipv6addr_t)) == 0);
354*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(memcmp(eui64, &kEui64, sizeof(spinel_eui64_t)) == 0);
355*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(memcmp(utf_1, kString_1, sizeof(kString_1)) == 0);
356*cfb92d14SAndroid Build Coastguard Worker
357*cfb92d14SAndroid Build Coastguard Worker printf(" -- PASS\n");
358*cfb92d14SAndroid Build Coastguard Worker }
359*cfb92d14SAndroid Build Coastguard Worker
360*cfb92d14SAndroid Build Coastguard Worker } // namespace Spinel
361*cfb92d14SAndroid Build Coastguard Worker } // namespace ot
362*cfb92d14SAndroid Build Coastguard Worker
main(void)363*cfb92d14SAndroid Build Coastguard Worker int main(void)
364*cfb92d14SAndroid Build Coastguard Worker {
365*cfb92d14SAndroid Build Coastguard Worker ot::Spinel::TestEncoder();
366*cfb92d14SAndroid Build Coastguard Worker printf("\nAll tests passed.\n");
367*cfb92d14SAndroid Build Coastguard Worker return 0;
368*cfb92d14SAndroid Build Coastguard Worker }
369