xref: /aosp_15_r20/external/openthread/tests/unit/test_spinel_encoder.cpp (revision cfb92d1480a9e65faed56933e9c12405f45898b4)
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