xref: /aosp_15_r20/external/openthread/tests/unit/test_hdlc.cpp (revision cfb92d1480a9e65faed56933e9c12405f45898b4)
1*cfb92d14SAndroid Build Coastguard Worker /*
2*cfb92d14SAndroid Build Coastguard Worker  *  Copyright (c) 2018, 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 <ctype.h>
30*cfb92d14SAndroid Build Coastguard Worker 
31*cfb92d14SAndroid Build Coastguard Worker #include "common/code_utils.hpp"
32*cfb92d14SAndroid Build Coastguard Worker #include "instance/instance.hpp"
33*cfb92d14SAndroid Build Coastguard Worker #include "lib/hdlc/hdlc.hpp"
34*cfb92d14SAndroid Build Coastguard Worker #include "lib/spinel/multi_frame_buffer.hpp"
35*cfb92d14SAndroid Build Coastguard Worker 
36*cfb92d14SAndroid Build Coastguard Worker #include "test_util.h"
37*cfb92d14SAndroid Build Coastguard Worker 
38*cfb92d14SAndroid Build Coastguard Worker namespace ot {
39*cfb92d14SAndroid Build Coastguard Worker namespace Ncp {
40*cfb92d14SAndroid Build Coastguard Worker 
41*cfb92d14SAndroid Build Coastguard Worker enum
42*cfb92d14SAndroid Build Coastguard Worker {
43*cfb92d14SAndroid Build Coastguard Worker     kBufferSize        = 1500,  // Frame buffer size
44*cfb92d14SAndroid Build Coastguard Worker     kMaxFrameLength    = 500,   // Maximum allowed frame length (used when randomly generating frames)
45*cfb92d14SAndroid Build Coastguard Worker     kFuzzTestIteration = 50000, // Number of iteration during fuzz test (randomly generating frames)
46*cfb92d14SAndroid Build Coastguard Worker     kFrameHeaderSize   = 4,     // Frame header size
47*cfb92d14SAndroid Build Coastguard Worker 
48*cfb92d14SAndroid Build Coastguard Worker     kFlagXOn        = 0x11,
49*cfb92d14SAndroid Build Coastguard Worker     kFlagXOff       = 0x13,
50*cfb92d14SAndroid Build Coastguard Worker     kFlagSequence   = 0x7e, ///< HDLC Flag value
51*cfb92d14SAndroid Build Coastguard Worker     kEscapeSequence = 0x7d, ///< HDLC Escape value
52*cfb92d14SAndroid Build Coastguard Worker     kFlagSpecial    = 0xf8,
53*cfb92d14SAndroid Build Coastguard Worker 
54*cfb92d14SAndroid Build Coastguard Worker };
55*cfb92d14SAndroid Build Coastguard Worker 
56*cfb92d14SAndroid Build Coastguard Worker static const uint8_t sOpenThreadText[] = "OpenThread Rocks";
57*cfb92d14SAndroid Build Coastguard Worker static const uint8_t sHelloText[]      = "Hello there!";
58*cfb92d14SAndroid Build Coastguard Worker static const uint8_t sMottoText[]      = "Think good thoughts, say good words, do good deeds!";
59*cfb92d14SAndroid Build Coastguard Worker static const uint8_t sHexText[]        = "0123456789abcdef";
60*cfb92d14SAndroid Build Coastguard Worker static const uint8_t sSkipText[]       = "Skip text";
61*cfb92d14SAndroid Build Coastguard Worker static const uint8_t sHdlcSpecials[]   = {kFlagSequence, kFlagXOn,        kFlagXOff,
62*cfb92d14SAndroid Build Coastguard Worker                                           kFlagSequence, kEscapeSequence, kFlagSpecial};
63*cfb92d14SAndroid Build Coastguard Worker 
WriteToBuffer(const uint8_t * aText,Spinel::FrameWritePointer & aWritePointer)64*cfb92d14SAndroid Build Coastguard Worker otError WriteToBuffer(const uint8_t *aText, Spinel::FrameWritePointer &aWritePointer)
65*cfb92d14SAndroid Build Coastguard Worker {
66*cfb92d14SAndroid Build Coastguard Worker     otError error = OT_ERROR_NONE;
67*cfb92d14SAndroid Build Coastguard Worker 
68*cfb92d14SAndroid Build Coastguard Worker     while (*aText != 0)
69*cfb92d14SAndroid Build Coastguard Worker     {
70*cfb92d14SAndroid Build Coastguard Worker         SuccessOrExit(aWritePointer.WriteByte(*aText++));
71*cfb92d14SAndroid Build Coastguard Worker     }
72*cfb92d14SAndroid Build Coastguard Worker 
73*cfb92d14SAndroid Build Coastguard Worker exit:
74*cfb92d14SAndroid Build Coastguard Worker     return error;
75*cfb92d14SAndroid Build Coastguard Worker }
76*cfb92d14SAndroid Build Coastguard Worker 
TestHdlcFrameBuffer(void)77*cfb92d14SAndroid Build Coastguard Worker void TestHdlcFrameBuffer(void)
78*cfb92d14SAndroid Build Coastguard Worker {
79*cfb92d14SAndroid Build Coastguard Worker     Spinel::FrameBuffer<kBufferSize> frameBuffer;
80*cfb92d14SAndroid Build Coastguard Worker 
81*cfb92d14SAndroid Build Coastguard Worker     printf("Testing Spinel::FrameBuffer");
82*cfb92d14SAndroid Build Coastguard Worker 
83*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(frameBuffer.IsEmpty(), "after constructor");
84*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(frameBuffer.GetLength() == 0, "after constructor");
85*cfb92d14SAndroid Build Coastguard Worker 
86*cfb92d14SAndroid Build Coastguard Worker     SuccessOrQuit(WriteToBuffer(sOpenThreadText, frameBuffer));
87*cfb92d14SAndroid Build Coastguard Worker 
88*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(frameBuffer.GetLength() == sizeof(sOpenThreadText) - 1);
89*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(memcmp(frameBuffer.GetFrame(), sOpenThreadText, frameBuffer.GetLength()) == 0);
90*cfb92d14SAndroid Build Coastguard Worker 
91*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(frameBuffer.CanWrite(1));
92*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(!frameBuffer.IsEmpty());
93*cfb92d14SAndroid Build Coastguard Worker 
94*cfb92d14SAndroid Build Coastguard Worker     SuccessOrQuit(WriteToBuffer(sHelloText, frameBuffer));
95*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(frameBuffer.GetLength() == sizeof(sOpenThreadText) + sizeof(sHelloText) - 2);
96*cfb92d14SAndroid Build Coastguard Worker 
97*cfb92d14SAndroid Build Coastguard Worker     frameBuffer.UndoLastWrites(sizeof(sHelloText) - 1);
98*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(frameBuffer.GetLength() == sizeof(sOpenThreadText) - 1);
99*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(memcmp(frameBuffer.GetFrame(), sOpenThreadText, frameBuffer.GetLength()) == 0);
100*cfb92d14SAndroid Build Coastguard Worker 
101*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(!frameBuffer.IsEmpty());
102*cfb92d14SAndroid Build Coastguard Worker     frameBuffer.Clear();
103*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(frameBuffer.IsEmpty(), "after Clear()");
104*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(frameBuffer.GetLength() == 0, "after Clear()");
105*cfb92d14SAndroid Build Coastguard Worker 
106*cfb92d14SAndroid Build Coastguard Worker     SuccessOrQuit(WriteToBuffer(sMottoText, frameBuffer));
107*cfb92d14SAndroid Build Coastguard Worker 
108*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(frameBuffer.GetLength() == sizeof(sMottoText) - 1);
109*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(memcmp(frameBuffer.GetFrame(), sMottoText, frameBuffer.GetLength()) == 0);
110*cfb92d14SAndroid Build Coastguard Worker 
111*cfb92d14SAndroid Build Coastguard Worker     frameBuffer.Clear();
112*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(frameBuffer.CanWrite(kBufferSize));
113*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(frameBuffer.CanWrite(kBufferSize + 1) == false, "CanWrite(kBufferSize + 1) did not fail as expected");
114*cfb92d14SAndroid Build Coastguard Worker 
115*cfb92d14SAndroid Build Coastguard Worker     for (uint16_t i = 0; i < kBufferSize; i++)
116*cfb92d14SAndroid Build Coastguard Worker     {
117*cfb92d14SAndroid Build Coastguard Worker         VerifyOrQuit(frameBuffer.CanWrite(1));
118*cfb92d14SAndroid Build Coastguard Worker         SuccessOrQuit(frameBuffer.WriteByte(i & 0xff));
119*cfb92d14SAndroid Build Coastguard Worker     }
120*cfb92d14SAndroid Build Coastguard Worker 
121*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(frameBuffer.CanWrite(1) == false, "did not fail with full buffer");
122*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(frameBuffer.WriteByte(0) == OT_ERROR_NO_BUFS, "did not fail with full buffer");
123*cfb92d14SAndroid Build Coastguard Worker 
124*cfb92d14SAndroid Build Coastguard Worker     printf(" -- PASS\n");
125*cfb92d14SAndroid Build Coastguard Worker }
126*cfb92d14SAndroid Build Coastguard Worker 
TestSpinelMultiFrameBuffer(void)127*cfb92d14SAndroid Build Coastguard Worker void TestSpinelMultiFrameBuffer(void)
128*cfb92d14SAndroid Build Coastguard Worker {
129*cfb92d14SAndroid Build Coastguard Worker     Spinel::MultiFrameBuffer<kBufferSize> frameBuffer;
130*cfb92d14SAndroid Build Coastguard Worker     uint8_t                              *frame    = nullptr;
131*cfb92d14SAndroid Build Coastguard Worker     uint8_t                              *newFrame = nullptr;
132*cfb92d14SAndroid Build Coastguard Worker     uint16_t                              length;
133*cfb92d14SAndroid Build Coastguard Worker     uint16_t                              newLength;
134*cfb92d14SAndroid Build Coastguard Worker 
135*cfb92d14SAndroid Build Coastguard Worker     printf("Testing Spinel::MultiFrameBuffer");
136*cfb92d14SAndroid Build Coastguard Worker 
137*cfb92d14SAndroid Build Coastguard Worker     //- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
138*cfb92d14SAndroid Build Coastguard Worker     // Check state after constructor
139*cfb92d14SAndroid Build Coastguard Worker 
140*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(!frameBuffer.HasFrame(), "after constructor");
141*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(!frameBuffer.HasSavedFrame(), "after constructor");
142*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(frameBuffer.GetLength() == 0, "after constructor");
143*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(frameBuffer.GetNextSavedFrame(frame, length) == OT_ERROR_NOT_FOUND, "after constructor");
144*cfb92d14SAndroid Build Coastguard Worker 
145*cfb92d14SAndroid Build Coastguard Worker     //- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
146*cfb92d14SAndroid Build Coastguard Worker     // Write multiple frames, save them and read later
147*cfb92d14SAndroid Build Coastguard Worker 
148*cfb92d14SAndroid Build Coastguard Worker     SuccessOrQuit(WriteToBuffer(sMottoText, frameBuffer));
149*cfb92d14SAndroid Build Coastguard Worker 
150*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(frameBuffer.GetLength() == sizeof(sMottoText) - 1);
151*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(memcmp(frameBuffer.GetFrame(), sMottoText, frameBuffer.GetLength()) == 0);
152*cfb92d14SAndroid Build Coastguard Worker 
153*cfb92d14SAndroid Build Coastguard Worker     SuccessOrQuit(frameBuffer.SaveFrame());
154*cfb92d14SAndroid Build Coastguard Worker 
155*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(!frameBuffer.HasFrame(), "after SaveFrame()");
156*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(frameBuffer.HasSavedFrame(), "after SaveFrame()");
157*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(frameBuffer.GetLength() == 0, "after SaveFrame()");
158*cfb92d14SAndroid Build Coastguard Worker 
159*cfb92d14SAndroid Build Coastguard Worker     SuccessOrQuit(WriteToBuffer(sHelloText, frameBuffer));
160*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(frameBuffer.GetLength() == sizeof(sHelloText) - 1);
161*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(memcmp(frameBuffer.GetFrame(), sHelloText, frameBuffer.GetLength()) == 0);
162*cfb92d14SAndroid Build Coastguard Worker 
163*cfb92d14SAndroid Build Coastguard Worker     SuccessOrQuit(frameBuffer.SaveFrame());
164*cfb92d14SAndroid Build Coastguard Worker 
165*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(!frameBuffer.HasFrame(), "after SaveFrame()");
166*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(frameBuffer.HasSavedFrame(), "after SaveFrame()");
167*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(frameBuffer.GetLength() == 0, "after SaveFrame()");
168*cfb92d14SAndroid Build Coastguard Worker 
169*cfb92d14SAndroid Build Coastguard Worker     SuccessOrQuit(WriteToBuffer(sOpenThreadText, frameBuffer));
170*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(frameBuffer.GetLength() == sizeof(sOpenThreadText) - 1);
171*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(memcmp(frameBuffer.GetFrame(), sOpenThreadText, frameBuffer.GetLength()) == 0);
172*cfb92d14SAndroid Build Coastguard Worker 
173*cfb92d14SAndroid Build Coastguard Worker     frameBuffer.DiscardFrame();
174*cfb92d14SAndroid Build Coastguard Worker 
175*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(!frameBuffer.HasFrame(), "after DiscardFrame()");
176*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(frameBuffer.HasSavedFrame(), "after SaveFrame()");
177*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(frameBuffer.GetLength() == 0, "after DiscardFrame()");
178*cfb92d14SAndroid Build Coastguard Worker 
179*cfb92d14SAndroid Build Coastguard Worker     SuccessOrQuit(WriteToBuffer(sMottoText, frameBuffer));
180*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(frameBuffer.GetLength() == sizeof(sMottoText) - 1);
181*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(memcmp(frameBuffer.GetFrame(), sMottoText, frameBuffer.GetLength()) == 0);
182*cfb92d14SAndroid Build Coastguard Worker 
183*cfb92d14SAndroid Build Coastguard Worker     frameBuffer.DiscardFrame();
184*cfb92d14SAndroid Build Coastguard Worker 
185*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(!frameBuffer.HasFrame(), "after DiscardFrame()");
186*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(frameBuffer.GetLength() == 0, "after DiscardFrame()");
187*cfb92d14SAndroid Build Coastguard Worker 
188*cfb92d14SAndroid Build Coastguard Worker     SuccessOrQuit(WriteToBuffer(sHexText, frameBuffer));
189*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(frameBuffer.GetLength() == sizeof(sHexText) - 1);
190*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(memcmp(frameBuffer.GetFrame(), sHexText, frameBuffer.GetLength()) == 0);
191*cfb92d14SAndroid Build Coastguard Worker 
192*cfb92d14SAndroid Build Coastguard Worker     SuccessOrQuit(frameBuffer.SaveFrame());
193*cfb92d14SAndroid Build Coastguard Worker 
194*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(!frameBuffer.HasFrame(), "after SaveFrame()");
195*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(frameBuffer.HasSavedFrame(), "after SaveFrame()");
196*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(frameBuffer.GetLength() == 0, "after SaveFrame()");
197*cfb92d14SAndroid Build Coastguard Worker 
198*cfb92d14SAndroid Build Coastguard Worker     SuccessOrQuit(WriteToBuffer(sOpenThreadText, frameBuffer));
199*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(frameBuffer.GetLength() == sizeof(sOpenThreadText) - 1);
200*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(memcmp(frameBuffer.GetFrame(), sOpenThreadText, frameBuffer.GetLength()) == 0);
201*cfb92d14SAndroid Build Coastguard Worker 
202*cfb92d14SAndroid Build Coastguard Worker     // Read the first saved frame and check the content
203*cfb92d14SAndroid Build Coastguard Worker     frame = nullptr;
204*cfb92d14SAndroid Build Coastguard Worker     SuccessOrQuit(frameBuffer.GetNextSavedFrame(frame, length));
205*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(length == sizeof(sMottoText) - 1, "GetNextSavedFrame() length is incorrect");
206*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(memcmp(frame, sMottoText, length) == 0, "GetNextSavedFrame() frame content is incorrect");
207*cfb92d14SAndroid Build Coastguard Worker 
208*cfb92d14SAndroid Build Coastguard Worker     // Read the second saved frame and check the content
209*cfb92d14SAndroid Build Coastguard Worker     SuccessOrQuit(frameBuffer.GetNextSavedFrame(frame, length));
210*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(length == sizeof(sHelloText) - 1, "GetNextSavedFrame() length is incorrect");
211*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(memcmp(frame, sHelloText, length) == 0, "GetNextSavedFrame() frame content is incorrect");
212*cfb92d14SAndroid Build Coastguard Worker 
213*cfb92d14SAndroid Build Coastguard Worker     // Read the third saved frame and check the content
214*cfb92d14SAndroid Build Coastguard Worker     SuccessOrQuit(frameBuffer.GetNextSavedFrame(frame, length));
215*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(length == sizeof(sHexText) - 1, "GetNextSavedFrame() length is incorrect");
216*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(memcmp(frame, sHexText, length) == 0, "GetNextSavedFrame() frame content is incorrect");
217*cfb92d14SAndroid Build Coastguard Worker 
218*cfb92d14SAndroid Build Coastguard Worker     newFrame  = frame;
219*cfb92d14SAndroid Build Coastguard Worker     newLength = length;
220*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(frameBuffer.GetNextSavedFrame(newFrame, newLength) == OT_ERROR_NOT_FOUND,
221*cfb92d14SAndroid Build Coastguard Worker                  "GetNextSavedFrame() incorrect behavior after all frames were read");
222*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(newFrame == nullptr, "GetNextSavedFrame() incorrect behavior after all frames were read");
223*cfb92d14SAndroid Build Coastguard Worker 
224*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(frameBuffer.GetLength() == sizeof(sOpenThreadText) - 1);
225*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(memcmp(frameBuffer.GetFrame(), sOpenThreadText, frameBuffer.GetLength()) == 0,
226*cfb92d14SAndroid Build Coastguard Worker                  "GetFrame() content is incorrect");
227*cfb92d14SAndroid Build Coastguard Worker 
228*cfb92d14SAndroid Build Coastguard Worker     SuccessOrQuit(frameBuffer.SaveFrame());
229*cfb92d14SAndroid Build Coastguard Worker 
230*cfb92d14SAndroid Build Coastguard Worker     // Read the fourth saved frame and check the content
231*cfb92d14SAndroid Build Coastguard Worker     SuccessOrQuit(frameBuffer.GetNextSavedFrame(frame, length));
232*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(length == sizeof(sOpenThreadText) - 1, "GetNextSavedFrame() length is incorrect");
233*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(memcmp(frame, sOpenThreadText, length) == 0, "GetNextSavedFrame() frame content is incorrect");
234*cfb92d14SAndroid Build Coastguard Worker 
235*cfb92d14SAndroid Build Coastguard Worker     // Re-read all the saved frames
236*cfb92d14SAndroid Build Coastguard Worker     frame = nullptr;
237*cfb92d14SAndroid Build Coastguard Worker     SuccessOrQuit(frameBuffer.GetNextSavedFrame(frame, length));
238*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(length == sizeof(sMottoText) - 1, "GetNextSavedFrame() length is incorrect");
239*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(memcmp(frame, sMottoText, length) == 0, "GetNextSavedFrame() frame content is incorrect");
240*cfb92d14SAndroid Build Coastguard Worker 
241*cfb92d14SAndroid Build Coastguard Worker     // Second saved frame
242*cfb92d14SAndroid Build Coastguard Worker     SuccessOrQuit(frameBuffer.GetNextSavedFrame(frame, length));
243*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(length == sizeof(sHelloText) - 1, "GetNextSavedFrame() length is incorrect");
244*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(memcmp(frame, sHelloText, length) == 0, "GetNextSavedFrame() frame content is incorrect");
245*cfb92d14SAndroid Build Coastguard Worker 
246*cfb92d14SAndroid Build Coastguard Worker     // Third saved frame
247*cfb92d14SAndroid Build Coastguard Worker     SuccessOrQuit(frameBuffer.GetNextSavedFrame(frame, length));
248*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(length == sizeof(sHexText) - 1, "GetNextSavedFrame() length is incorrect");
249*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(memcmp(frame, sHexText, length) == 0, "GetNextSavedFrame() frame content is incorrect");
250*cfb92d14SAndroid Build Coastguard Worker 
251*cfb92d14SAndroid Build Coastguard Worker     // Fourth saved frame and check the content
252*cfb92d14SAndroid Build Coastguard Worker     SuccessOrQuit(frameBuffer.GetNextSavedFrame(frame, length));
253*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(length == sizeof(sOpenThreadText) - 1, "GetNextSavedFrame() length is incorrect");
254*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(memcmp(frame, sOpenThreadText, length) == 0, "GetNextSavedFrame() frame content is incorrect");
255*cfb92d14SAndroid Build Coastguard Worker 
256*cfb92d14SAndroid Build Coastguard Worker     //- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
257*cfb92d14SAndroid Build Coastguard Worker     // Verify behavior of `Clear()`
258*cfb92d14SAndroid Build Coastguard Worker 
259*cfb92d14SAndroid Build Coastguard Worker     frameBuffer.Clear();
260*cfb92d14SAndroid Build Coastguard Worker 
261*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(!frameBuffer.HasFrame(), "after Clear()");
262*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(!frameBuffer.HasSavedFrame(), "after Clear()");
263*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(frameBuffer.GetLength() == 0, "after Clear()");
264*cfb92d14SAndroid Build Coastguard Worker 
265*cfb92d14SAndroid Build Coastguard Worker     SuccessOrQuit(WriteToBuffer(sOpenThreadText, frameBuffer));
266*cfb92d14SAndroid Build Coastguard Worker     SuccessOrQuit(frameBuffer.SaveFrame());
267*cfb92d14SAndroid Build Coastguard Worker 
268*cfb92d14SAndroid Build Coastguard Worker     SuccessOrQuit(WriteToBuffer(sHelloText, frameBuffer));
269*cfb92d14SAndroid Build Coastguard Worker     SuccessOrQuit(frameBuffer.SaveFrame());
270*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(frameBuffer.HasSavedFrame(), "after SaveFrame()");
271*cfb92d14SAndroid Build Coastguard Worker 
272*cfb92d14SAndroid Build Coastguard Worker     frame = nullptr;
273*cfb92d14SAndroid Build Coastguard Worker     SuccessOrQuit(frameBuffer.GetNextSavedFrame(frame, length));
274*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(frameBuffer.HasSavedFrame(), "after GetNextSavedFrame()");
275*cfb92d14SAndroid Build Coastguard Worker 
276*cfb92d14SAndroid Build Coastguard Worker     frameBuffer.Clear();
277*cfb92d14SAndroid Build Coastguard Worker 
278*cfb92d14SAndroid Build Coastguard Worker     frame = nullptr;
279*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(frameBuffer.GetNextSavedFrame(frame, length) == OT_ERROR_NOT_FOUND, "after Clear()");
280*cfb92d14SAndroid Build Coastguard Worker 
281*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(!frameBuffer.HasFrame(), "after Clear()");
282*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(!frameBuffer.HasSavedFrame(), "after Clear()");
283*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(frameBuffer.CanWrite(kBufferSize - (kFrameHeaderSize - 1)) == false, "after Clear()");
284*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(frameBuffer.CanWrite(kBufferSize - kFrameHeaderSize) == true, "after Clear()");
285*cfb92d14SAndroid Build Coastguard Worker 
286*cfb92d14SAndroid Build Coastguard Worker     //- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
287*cfb92d14SAndroid Build Coastguard Worker     // Verify behavior of `ClearSavedFrames()`
288*cfb92d14SAndroid Build Coastguard Worker 
289*cfb92d14SAndroid Build Coastguard Worker     SuccessOrQuit(WriteToBuffer(sHelloText, frameBuffer));
290*cfb92d14SAndroid Build Coastguard Worker     SuccessOrQuit(frameBuffer.SaveFrame());
291*cfb92d14SAndroid Build Coastguard Worker     SuccessOrQuit(WriteToBuffer(sOpenThreadText, frameBuffer));
292*cfb92d14SAndroid Build Coastguard Worker     SuccessOrQuit(frameBuffer.SaveFrame());
293*cfb92d14SAndroid Build Coastguard Worker     SuccessOrQuit(WriteToBuffer(sMottoText, frameBuffer));
294*cfb92d14SAndroid Build Coastguard Worker     SuccessOrQuit(frameBuffer.SaveFrame());
295*cfb92d14SAndroid Build Coastguard Worker     SuccessOrQuit(WriteToBuffer(sHexText, frameBuffer));
296*cfb92d14SAndroid Build Coastguard Worker 
297*cfb92d14SAndroid Build Coastguard Worker     frame = nullptr;
298*cfb92d14SAndroid Build Coastguard Worker     SuccessOrQuit(frameBuffer.GetNextSavedFrame(frame, length));
299*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(length == sizeof(sHelloText) - 1, "GetNextSavedFrame() length is incorrect");
300*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(memcmp(frame, sHelloText, length) == 0, "GetNextSavedFrame() frame content is incorrect");
301*cfb92d14SAndroid Build Coastguard Worker 
302*cfb92d14SAndroid Build Coastguard Worker     frameBuffer.ClearSavedFrames();
303*cfb92d14SAndroid Build Coastguard Worker 
304*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(frameBuffer.HasFrame(), "after ClearSavedFrames()");
305*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(!frameBuffer.HasSavedFrame(), "after ClearSavedFrames()");
306*cfb92d14SAndroid Build Coastguard Worker 
307*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(frameBuffer.GetLength() == sizeof(sHexText) - 1, "after ClearSavedFrames()");
308*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(memcmp(frameBuffer.GetFrame(), sHexText, frameBuffer.GetLength()) == 0);
309*cfb92d14SAndroid Build Coastguard Worker 
310*cfb92d14SAndroid Build Coastguard Worker     SuccessOrQuit(frameBuffer.SaveFrame());
311*cfb92d14SAndroid Build Coastguard Worker 
312*cfb92d14SAndroid Build Coastguard Worker     SuccessOrQuit(WriteToBuffer(sHelloText, frameBuffer));
313*cfb92d14SAndroid Build Coastguard Worker 
314*cfb92d14SAndroid Build Coastguard Worker     frame = nullptr;
315*cfb92d14SAndroid Build Coastguard Worker     SuccessOrQuit(frameBuffer.GetNextSavedFrame(frame, length));
316*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(length == sizeof(sHexText) - 1, "GetNextSavedFrame() length is incorrect");
317*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(memcmp(frame, sHexText, length) == 0, "GetNextSavedFrame() frame content is incorrect");
318*cfb92d14SAndroid Build Coastguard Worker 
319*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(frameBuffer.GetLength() == sizeof(sHelloText) - 1, "after ClearSavedFrames()");
320*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(memcmp(frameBuffer.GetFrame(), sHelloText, frameBuffer.GetLength()) == 0, "after ClearSavedFrames()");
321*cfb92d14SAndroid Build Coastguard Worker 
322*cfb92d14SAndroid Build Coastguard Worker     frameBuffer.ClearSavedFrames();
323*cfb92d14SAndroid Build Coastguard Worker     frameBuffer.DiscardFrame();
324*cfb92d14SAndroid Build Coastguard Worker 
325*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(!frameBuffer.HasFrame(), "after all frames are read and discarded");
326*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(!frameBuffer.HasSavedFrame(), "after all read or discarded");
327*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(frameBuffer.CanWrite(kBufferSize - (kFrameHeaderSize - 1)) == false, "after all read or discarded");
328*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(frameBuffer.CanWrite(kBufferSize - kFrameHeaderSize) == true, "after all read of discarded");
329*cfb92d14SAndroid Build Coastguard Worker 
330*cfb92d14SAndroid Build Coastguard Worker     SuccessOrQuit(WriteToBuffer(sHelloText, frameBuffer));
331*cfb92d14SAndroid Build Coastguard Worker 
332*cfb92d14SAndroid Build Coastguard Worker     frameBuffer.ClearSavedFrames();
333*cfb92d14SAndroid Build Coastguard Worker 
334*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(frameBuffer.GetLength() == sizeof(sHelloText) - 1);
335*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(memcmp(frameBuffer.GetFrame(), sHelloText, frameBuffer.GetLength()) == 0);
336*cfb92d14SAndroid Build Coastguard Worker 
337*cfb92d14SAndroid Build Coastguard Worker     SuccessOrQuit(frameBuffer.SaveFrame());
338*cfb92d14SAndroid Build Coastguard Worker     frame = nullptr;
339*cfb92d14SAndroid Build Coastguard Worker     SuccessOrQuit(frameBuffer.GetNextSavedFrame(frame, length));
340*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(length == sizeof(sHelloText) - 1, "GetNextSavedFrame() length is incorrect");
341*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(memcmp(frame, sHelloText, length) == 0, "GetNextSavedFrame() frame content is incorrect");
342*cfb92d14SAndroid Build Coastguard Worker 
343*cfb92d14SAndroid Build Coastguard Worker     //- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
344*cfb92d14SAndroid Build Coastguard Worker     // Verify behavior of `SetSkipLength()` and `GetSkipLength()`
345*cfb92d14SAndroid Build Coastguard Worker 
346*cfb92d14SAndroid Build Coastguard Worker     frameBuffer.Clear();
347*cfb92d14SAndroid Build Coastguard Worker 
348*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(frameBuffer.GetSkipLength() == 0, "after Clear()");
349*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(frameBuffer.SetSkipLength(sizeof(sSkipText)) == OT_ERROR_NONE);
350*cfb92d14SAndroid Build Coastguard Worker     SuccessOrQuit(WriteToBuffer(sMottoText, frameBuffer));
351*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(memcmp(frameBuffer.GetFrame(), sMottoText, frameBuffer.GetLength()) == 0);
352*cfb92d14SAndroid Build Coastguard Worker     memcpy(frameBuffer.GetFrame() - sizeof(sSkipText), sSkipText, sizeof(sSkipText));
353*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(frameBuffer.GetSkipLength() == sizeof(sSkipText));
354*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(frameBuffer.GetLength() == sizeof(sMottoText) - 1);
355*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(memcmp(frameBuffer.GetFrame(), sMottoText, frameBuffer.GetLength()) == 0);
356*cfb92d14SAndroid Build Coastguard Worker 
357*cfb92d14SAndroid Build Coastguard Worker     SuccessOrQuit(frameBuffer.SaveFrame());
358*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(!frameBuffer.HasFrame(), "after SaveFrame()");
359*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(frameBuffer.HasSavedFrame(), "after SaveFrame()");
360*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(frameBuffer.GetSkipLength() == 0, "after SaveFrame()");
361*cfb92d14SAndroid Build Coastguard Worker 
362*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(frameBuffer.SetSkipLength(sizeof(sSkipText)) == OT_ERROR_NONE);
363*cfb92d14SAndroid Build Coastguard Worker     SuccessOrQuit(WriteToBuffer(sOpenThreadText, frameBuffer));
364*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(memcmp(frameBuffer.GetFrame(), sOpenThreadText, frameBuffer.GetLength()) == 0);
365*cfb92d14SAndroid Build Coastguard Worker     memcpy(frameBuffer.GetFrame() - sizeof(sSkipText), sSkipText, sizeof(sSkipText));
366*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(frameBuffer.GetSkipLength() == sizeof(sSkipText));
367*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(frameBuffer.GetLength() == sizeof(sOpenThreadText) - 1);
368*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(memcmp(frameBuffer.GetFrame(), sOpenThreadText, frameBuffer.GetLength()) == 0);
369*cfb92d14SAndroid Build Coastguard Worker 
370*cfb92d14SAndroid Build Coastguard Worker     SuccessOrQuit(frameBuffer.SaveFrame());
371*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(!frameBuffer.HasFrame(), "after SaveFrame()");
372*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(frameBuffer.HasSavedFrame(), "after SaveFrame()");
373*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(frameBuffer.GetSkipLength() == 0, "after SaveFrame()");
374*cfb92d14SAndroid Build Coastguard Worker 
375*cfb92d14SAndroid Build Coastguard Worker     frame = nullptr;
376*cfb92d14SAndroid Build Coastguard Worker     SuccessOrQuit(frameBuffer.GetNextSavedFrame(frame, length));
377*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(length == sizeof(sMottoText) - 1, "GetNextSavedFrame() length is incorrect");
378*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(memcmp(frame, sMottoText, length) == 0, "GetNextSavedFrame() frame content is incorrect");
379*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(memcmp(frame - sizeof(sSkipText), sSkipText, sizeof(sSkipText)) == 0,
380*cfb92d14SAndroid Build Coastguard Worker                  "GetNextSavedFrame() reserved frame buffer content is incorrect");
381*cfb92d14SAndroid Build Coastguard Worker 
382*cfb92d14SAndroid Build Coastguard Worker     SuccessOrQuit(frameBuffer.GetNextSavedFrame(frame, length));
383*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(length == sizeof(sOpenThreadText) - 1, "GetNextSavedFrame() length is incorrect");
384*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(memcmp(frame, sOpenThreadText, length) == 0, "GetNextSavedFrame() frame content is incorrect");
385*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(memcmp(frame - sizeof(sSkipText), sSkipText, sizeof(sSkipText)) == 0,
386*cfb92d14SAndroid Build Coastguard Worker                  "GetNextSavedFrame() reserved frame buffer content is incorrect");
387*cfb92d14SAndroid Build Coastguard Worker 
388*cfb92d14SAndroid Build Coastguard Worker     frameBuffer.Clear();
389*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(frameBuffer.SetSkipLength(kBufferSize - (kFrameHeaderSize - 1)) == OT_ERROR_NO_BUFS, "after Clear()");
390*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(frameBuffer.SetSkipLength(kBufferSize - kFrameHeaderSize) == OT_ERROR_NONE, "after Clear()");
391*cfb92d14SAndroid Build Coastguard Worker 
392*cfb92d14SAndroid Build Coastguard Worker     //- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
393*cfb92d14SAndroid Build Coastguard Worker     // Verify behavior of `SetLength()` and `GetLength()`
394*cfb92d14SAndroid Build Coastguard Worker 
395*cfb92d14SAndroid Build Coastguard Worker     frameBuffer.Clear();
396*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit((frame = frameBuffer.GetFrame()) != nullptr);
397*cfb92d14SAndroid Build Coastguard Worker     memcpy(frame, sHelloText, sizeof(sHelloText));
398*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(frameBuffer.SetLength(sizeof(sHelloText)) == OT_ERROR_NONE);
399*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(frameBuffer.GetLength() == sizeof(sHelloText));
400*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(frameBuffer.HasFrame());
401*cfb92d14SAndroid Build Coastguard Worker     SuccessOrQuit(frameBuffer.SaveFrame());
402*cfb92d14SAndroid Build Coastguard Worker 
403*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit((frame = frameBuffer.GetFrame()) != nullptr);
404*cfb92d14SAndroid Build Coastguard Worker     memcpy(frame, sMottoText, sizeof(sMottoText));
405*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(frameBuffer.SetLength(sizeof(sMottoText)) == OT_ERROR_NONE);
406*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(frameBuffer.GetLength() == sizeof(sMottoText));
407*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(frameBuffer.HasFrame());
408*cfb92d14SAndroid Build Coastguard Worker     SuccessOrQuit(frameBuffer.SaveFrame());
409*cfb92d14SAndroid Build Coastguard Worker 
410*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit((frame = frameBuffer.GetFrame()) != nullptr);
411*cfb92d14SAndroid Build Coastguard Worker     memcpy(frame, sHexText, sizeof(sHexText));
412*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(frameBuffer.SetLength(sizeof(sHexText)) == OT_ERROR_NONE);
413*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(frameBuffer.GetLength() == sizeof(sHexText));
414*cfb92d14SAndroid Build Coastguard Worker     frameBuffer.DiscardFrame();
415*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(!frameBuffer.HasFrame());
416*cfb92d14SAndroid Build Coastguard Worker 
417*cfb92d14SAndroid Build Coastguard Worker     frame = nullptr;
418*cfb92d14SAndroid Build Coastguard Worker     SuccessOrQuit(frameBuffer.GetNextSavedFrame(frame, length));
419*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(length == sizeof(sHelloText), "GetNextSavedFrame() length is incorrect");
420*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(memcmp(frame, sHelloText, length) == 0, "GetNextSavedFrame() frame content is incorrect");
421*cfb92d14SAndroid Build Coastguard Worker 
422*cfb92d14SAndroid Build Coastguard Worker     SuccessOrQuit(frameBuffer.GetNextSavedFrame(frame, length));
423*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(length == sizeof(sMottoText), "GetNextSavedFrame() length is incorrect");
424*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(memcmp(frame, sMottoText, length) == 0, "GetNextSavedFrame() frame content is incorrect");
425*cfb92d14SAndroid Build Coastguard Worker 
426*cfb92d14SAndroid Build Coastguard Worker     SuccessOrQuit(!frameBuffer.GetNextSavedFrame(frame, length));
427*cfb92d14SAndroid Build Coastguard Worker 
428*cfb92d14SAndroid Build Coastguard Worker     frameBuffer.Clear();
429*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(frameBuffer.SetLength(kBufferSize - (kFrameHeaderSize - 1)) == OT_ERROR_NO_BUFS, "after Clear()");
430*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(frameBuffer.SetLength(kBufferSize - kFrameHeaderSize) == OT_ERROR_NONE, "after Clear()");
431*cfb92d14SAndroid Build Coastguard Worker 
432*cfb92d14SAndroid Build Coastguard Worker     printf(" -- PASS\n");
433*cfb92d14SAndroid Build Coastguard Worker }
434*cfb92d14SAndroid Build Coastguard Worker 
435*cfb92d14SAndroid Build Coastguard Worker struct DecoderContext
436*cfb92d14SAndroid Build Coastguard Worker {
437*cfb92d14SAndroid Build Coastguard Worker     bool    mWasCalled;
438*cfb92d14SAndroid Build Coastguard Worker     otError mError;
439*cfb92d14SAndroid Build Coastguard Worker };
440*cfb92d14SAndroid Build Coastguard Worker 
ProcessDecodedFrame(void * aContext,otError aError)441*cfb92d14SAndroid Build Coastguard Worker void ProcessDecodedFrame(void *aContext, otError aError)
442*cfb92d14SAndroid Build Coastguard Worker {
443*cfb92d14SAndroid Build Coastguard Worker     DecoderContext &decoderContext = *static_cast<DecoderContext *>(aContext);
444*cfb92d14SAndroid Build Coastguard Worker 
445*cfb92d14SAndroid Build Coastguard Worker     decoderContext.mError     = aError;
446*cfb92d14SAndroid Build Coastguard Worker     decoderContext.mWasCalled = true;
447*cfb92d14SAndroid Build Coastguard Worker }
448*cfb92d14SAndroid Build Coastguard Worker 
TestEncoderDecoder(void)449*cfb92d14SAndroid Build Coastguard Worker void TestEncoderDecoder(void)
450*cfb92d14SAndroid Build Coastguard Worker {
451*cfb92d14SAndroid Build Coastguard Worker     otError                               error;
452*cfb92d14SAndroid Build Coastguard Worker     uint8_t                               byte;
453*cfb92d14SAndroid Build Coastguard Worker     Spinel::MultiFrameBuffer<kBufferSize> encoderBuffer;
454*cfb92d14SAndroid Build Coastguard Worker     Spinel::MultiFrameBuffer<kBufferSize> decoderBuffer;
455*cfb92d14SAndroid Build Coastguard Worker     DecoderContext                        decoderContext;
456*cfb92d14SAndroid Build Coastguard Worker     Hdlc::Encoder                         encoder(encoderBuffer);
457*cfb92d14SAndroid Build Coastguard Worker     Hdlc::Decoder                         decoder;
458*cfb92d14SAndroid Build Coastguard Worker     uint8_t                              *frame;
459*cfb92d14SAndroid Build Coastguard Worker     uint16_t                              length;
460*cfb92d14SAndroid Build Coastguard Worker     uint8_t                               badShortFrame[3] = {kFlagSequence, 0xaa, kFlagSequence};
461*cfb92d14SAndroid Build Coastguard Worker 
462*cfb92d14SAndroid Build Coastguard Worker     printf("Testing Hdlc::Encoder and Hdlc::Decoder");
463*cfb92d14SAndroid Build Coastguard Worker 
464*cfb92d14SAndroid Build Coastguard Worker     decoder.Init(decoderBuffer, ProcessDecodedFrame, &decoderContext);
465*cfb92d14SAndroid Build Coastguard Worker     SuccessOrQuit(encoder.BeginFrame());
466*cfb92d14SAndroid Build Coastguard Worker     SuccessOrQuit(encoder.Encode(sOpenThreadText, sizeof(sOpenThreadText) - 1));
467*cfb92d14SAndroid Build Coastguard Worker     SuccessOrQuit(encoder.EndFrame());
468*cfb92d14SAndroid Build Coastguard Worker     SuccessOrQuit(encoderBuffer.SaveFrame());
469*cfb92d14SAndroid Build Coastguard Worker 
470*cfb92d14SAndroid Build Coastguard Worker     SuccessOrQuit(encoder.BeginFrame());
471*cfb92d14SAndroid Build Coastguard Worker     SuccessOrQuit(encoder.Encode(sMottoText, sizeof(sMottoText) - 1));
472*cfb92d14SAndroid Build Coastguard Worker     SuccessOrQuit(encoder.EndFrame());
473*cfb92d14SAndroid Build Coastguard Worker     SuccessOrQuit(encoderBuffer.SaveFrame());
474*cfb92d14SAndroid Build Coastguard Worker 
475*cfb92d14SAndroid Build Coastguard Worker     SuccessOrQuit(encoder.BeginFrame());
476*cfb92d14SAndroid Build Coastguard Worker     SuccessOrQuit(encoder.Encode(sHdlcSpecials, sizeof(sHdlcSpecials)));
477*cfb92d14SAndroid Build Coastguard Worker     SuccessOrQuit(encoder.EndFrame());
478*cfb92d14SAndroid Build Coastguard Worker     SuccessOrQuit(encoderBuffer.SaveFrame());
479*cfb92d14SAndroid Build Coastguard Worker 
480*cfb92d14SAndroid Build Coastguard Worker     SuccessOrQuit(encoder.BeginFrame());
481*cfb92d14SAndroid Build Coastguard Worker     SuccessOrQuit(encoder.Encode(sHelloText, sizeof(sHelloText) - 1));
482*cfb92d14SAndroid Build Coastguard Worker     SuccessOrQuit(encoder.EndFrame());
483*cfb92d14SAndroid Build Coastguard Worker     SuccessOrQuit(encoderBuffer.SaveFrame());
484*cfb92d14SAndroid Build Coastguard Worker 
485*cfb92d14SAndroid Build Coastguard Worker     SuccessOrQuit(encoder.BeginFrame());
486*cfb92d14SAndroid Build Coastguard Worker     // Empty frame
487*cfb92d14SAndroid Build Coastguard Worker     SuccessOrQuit(encoder.EndFrame());
488*cfb92d14SAndroid Build Coastguard Worker     SuccessOrQuit(encoderBuffer.SaveFrame());
489*cfb92d14SAndroid Build Coastguard Worker 
490*cfb92d14SAndroid Build Coastguard Worker     byte = kFlagSequence;
491*cfb92d14SAndroid Build Coastguard Worker     SuccessOrQuit(encoder.BeginFrame());
492*cfb92d14SAndroid Build Coastguard Worker     SuccessOrQuit(encoder.Encode(&byte, sizeof(uint8_t)));
493*cfb92d14SAndroid Build Coastguard Worker     SuccessOrQuit(encoder.EndFrame());
494*cfb92d14SAndroid Build Coastguard Worker     SuccessOrQuit(encoderBuffer.SaveFrame());
495*cfb92d14SAndroid Build Coastguard Worker 
496*cfb92d14SAndroid Build Coastguard Worker     // Feed the encoded frames to decoder and save the content
497*cfb92d14SAndroid Build Coastguard Worker     for (frame = nullptr; encoderBuffer.GetNextSavedFrame(frame, length) == OT_ERROR_NONE;)
498*cfb92d14SAndroid Build Coastguard Worker     {
499*cfb92d14SAndroid Build Coastguard Worker         decoderContext.mWasCalled = false;
500*cfb92d14SAndroid Build Coastguard Worker 
501*cfb92d14SAndroid Build Coastguard Worker         decoder.Decode(frame, length);
502*cfb92d14SAndroid Build Coastguard Worker 
503*cfb92d14SAndroid Build Coastguard Worker         VerifyOrQuit(decoderContext.mWasCalled);
504*cfb92d14SAndroid Build Coastguard Worker         VerifyOrQuit(decoderContext.mError == OT_ERROR_NONE, "Decoder::Decode() returned incorrect error code");
505*cfb92d14SAndroid Build Coastguard Worker 
506*cfb92d14SAndroid Build Coastguard Worker         SuccessOrQuit(decoderBuffer.SaveFrame());
507*cfb92d14SAndroid Build Coastguard Worker     }
508*cfb92d14SAndroid Build Coastguard Worker 
509*cfb92d14SAndroid Build Coastguard Worker     // Verify the decoded frames match the original frames
510*cfb92d14SAndroid Build Coastguard Worker     frame = nullptr;
511*cfb92d14SAndroid Build Coastguard Worker     SuccessOrQuit(decoderBuffer.GetNextSavedFrame(frame, length));
512*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(length == sizeof(sOpenThreadText) - 1, "Decoded frame length does not match original frame");
513*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(memcmp(frame, sOpenThreadText, length) == 0, "Decoded frame content does not match original frame");
514*cfb92d14SAndroid Build Coastguard Worker 
515*cfb92d14SAndroid Build Coastguard Worker     SuccessOrQuit(decoderBuffer.GetNextSavedFrame(frame, length));
516*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(length == sizeof(sMottoText) - 1, "Decoded frame length does not match original frame");
517*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(memcmp(frame, sMottoText, length) == 0, "Decoded frame content does not match original frame");
518*cfb92d14SAndroid Build Coastguard Worker 
519*cfb92d14SAndroid Build Coastguard Worker     SuccessOrQuit(decoderBuffer.GetNextSavedFrame(frame, length));
520*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(length == sizeof(sHdlcSpecials), "Decoded frame length does not match original frame");
521*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(memcmp(frame, sHdlcSpecials, length) == 0, "Decoded frame content does not match original frame");
522*cfb92d14SAndroid Build Coastguard Worker 
523*cfb92d14SAndroid Build Coastguard Worker     SuccessOrQuit(decoderBuffer.GetNextSavedFrame(frame, length));
524*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(length == sizeof(sHelloText) - 1, "Decoded frame length does not match original frame");
525*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(memcmp(frame, sHelloText, length) == 0, "Decoded frame content does not match original frame");
526*cfb92d14SAndroid Build Coastguard Worker 
527*cfb92d14SAndroid Build Coastguard Worker     SuccessOrQuit(decoderBuffer.GetNextSavedFrame(frame, length));
528*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(length == 0, "Decoded frame length does not match original frame");
529*cfb92d14SAndroid Build Coastguard Worker 
530*cfb92d14SAndroid Build Coastguard Worker     SuccessOrQuit(decoderBuffer.GetNextSavedFrame(frame, length));
531*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(length == sizeof(uint8_t), "Decoded frame length does not match original frame");
532*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(*frame == kFlagSequence, "Decoded frame content does not match original frame");
533*cfb92d14SAndroid Build Coastguard Worker 
534*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(decoderBuffer.GetNextSavedFrame(frame, length) == OT_ERROR_NOT_FOUND, "Extra decoded frame");
535*cfb92d14SAndroid Build Coastguard Worker 
536*cfb92d14SAndroid Build Coastguard Worker     encoderBuffer.Clear();
537*cfb92d14SAndroid Build Coastguard Worker     decoderBuffer.Clear();
538*cfb92d14SAndroid Build Coastguard Worker 
539*cfb92d14SAndroid Build Coastguard Worker     // Test `Encoder` behavior when running out of buffer space
540*cfb92d14SAndroid Build Coastguard Worker     SuccessOrQuit(encoder.BeginFrame());
541*cfb92d14SAndroid Build Coastguard Worker 
542*cfb92d14SAndroid Build Coastguard Worker     error = OT_ERROR_NONE;
543*cfb92d14SAndroid Build Coastguard Worker 
544*cfb92d14SAndroid Build Coastguard Worker     for (uint16_t i = 0; error == OT_ERROR_NONE; i++)
545*cfb92d14SAndroid Build Coastguard Worker     {
546*cfb92d14SAndroid Build Coastguard Worker         byte  = i & 0xff;
547*cfb92d14SAndroid Build Coastguard Worker         error = encoder.Encode(&byte, sizeof(uint8_t));
548*cfb92d14SAndroid Build Coastguard Worker     }
549*cfb92d14SAndroid Build Coastguard Worker 
550*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(encoder.Encode(&byte, sizeof(uint8_t)) == OT_ERROR_NO_BUFS,
551*cfb92d14SAndroid Build Coastguard Worker                  "Encoder::Encode() did not fail with a full buffer");
552*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(encoder.EndFrame(), "Encoder::EndFrame() did not fail with a full buffer");
553*cfb92d14SAndroid Build Coastguard Worker 
554*cfb92d14SAndroid Build Coastguard Worker     encoderBuffer.Clear();
555*cfb92d14SAndroid Build Coastguard Worker 
556*cfb92d14SAndroid Build Coastguard Worker     // Test `Decoder` behavior with incorrect FCS
557*cfb92d14SAndroid Build Coastguard Worker 
558*cfb92d14SAndroid Build Coastguard Worker     SuccessOrQuit(encoder.BeginFrame());
559*cfb92d14SAndroid Build Coastguard Worker     SuccessOrQuit(encoder.Encode(sMottoText, sizeof(sMottoText) - 1));
560*cfb92d14SAndroid Build Coastguard Worker     SuccessOrQuit(encoder.EndFrame());
561*cfb92d14SAndroid Build Coastguard Worker 
562*cfb92d14SAndroid Build Coastguard Worker     encoderBuffer.GetFrame()[0] ^= 0x0a; // Change the first byte in the frame to cause FCS failure
563*cfb92d14SAndroid Build Coastguard Worker 
564*cfb92d14SAndroid Build Coastguard Worker     decoderContext.mWasCalled = false;
565*cfb92d14SAndroid Build Coastguard Worker     decoder.Decode(encoderBuffer.GetFrame(), encoderBuffer.GetLength());
566*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(decoderContext.mWasCalled);
567*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(decoderContext.mError == OT_ERROR_PARSE, "Decoder::Decode() did not fail with bad FCS");
568*cfb92d14SAndroid Build Coastguard Worker 
569*cfb92d14SAndroid Build Coastguard Worker     decoderBuffer.Clear();
570*cfb92d14SAndroid Build Coastguard Worker 
571*cfb92d14SAndroid Build Coastguard Worker     // Test `Decoder` behavior with short frame (smaller than FCS)
572*cfb92d14SAndroid Build Coastguard Worker 
573*cfb92d14SAndroid Build Coastguard Worker     decoderContext.mWasCalled = false;
574*cfb92d14SAndroid Build Coastguard Worker     decoder.Decode(badShortFrame, sizeof(badShortFrame));
575*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(decoderContext.mWasCalled);
576*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(decoderContext.mError == OT_ERROR_PARSE, "Decoder::Decode() did not fail for short frame");
577*cfb92d14SAndroid Build Coastguard Worker 
578*cfb92d14SAndroid Build Coastguard Worker     decoderBuffer.Clear();
579*cfb92d14SAndroid Build Coastguard Worker 
580*cfb92d14SAndroid Build Coastguard Worker     // Test `Decoder` with back to back `kFlagSequence` and ensure callback is not invoked.
581*cfb92d14SAndroid Build Coastguard Worker 
582*cfb92d14SAndroid Build Coastguard Worker     byte                      = kFlagSequence;
583*cfb92d14SAndroid Build Coastguard Worker     decoderContext.mWasCalled = false;
584*cfb92d14SAndroid Build Coastguard Worker     decoder.Decode(&byte, sizeof(uint8_t));
585*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(!decoderContext.mWasCalled);
586*cfb92d14SAndroid Build Coastguard Worker     decoder.Decode(&byte, sizeof(uint8_t));
587*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(!decoderContext.mWasCalled);
588*cfb92d14SAndroid Build Coastguard Worker     decoder.Decode(&byte, sizeof(uint8_t));
589*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(!decoderContext.mWasCalled);
590*cfb92d14SAndroid Build Coastguard Worker     decoder.Decode(&byte, sizeof(uint8_t));
591*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(!decoderContext.mWasCalled);
592*cfb92d14SAndroid Build Coastguard Worker 
593*cfb92d14SAndroid Build Coastguard Worker     printf(" -- PASS\n");
594*cfb92d14SAndroid Build Coastguard Worker }
595*cfb92d14SAndroid Build Coastguard Worker 
GetRandom(uint32_t max)596*cfb92d14SAndroid Build Coastguard Worker uint32_t GetRandom(uint32_t max) { return static_cast<uint32_t>(rand()) % max; }
597*cfb92d14SAndroid Build Coastguard Worker 
TestFuzzEncoderDecoder(void)598*cfb92d14SAndroid Build Coastguard Worker void TestFuzzEncoderDecoder(void)
599*cfb92d14SAndroid Build Coastguard Worker {
600*cfb92d14SAndroid Build Coastguard Worker     uint16_t                         length;
601*cfb92d14SAndroid Build Coastguard Worker     uint8_t                          frame[kMaxFrameLength];
602*cfb92d14SAndroid Build Coastguard Worker     Spinel::FrameBuffer<kBufferSize> encoderBuffer;
603*cfb92d14SAndroid Build Coastguard Worker     Spinel::FrameBuffer<kBufferSize> decoderBuffer;
604*cfb92d14SAndroid Build Coastguard Worker     DecoderContext                   decoderContext;
605*cfb92d14SAndroid Build Coastguard Worker     Hdlc::Encoder                    encoder(encoderBuffer);
606*cfb92d14SAndroid Build Coastguard Worker     Hdlc::Decoder                    decoder;
607*cfb92d14SAndroid Build Coastguard Worker 
608*cfb92d14SAndroid Build Coastguard Worker     printf("Testing Hdlc::Encoder and Hdlc::Decoder with randomly generated frames");
609*cfb92d14SAndroid Build Coastguard Worker 
610*cfb92d14SAndroid Build Coastguard Worker     decoder.Init(decoderBuffer, ProcessDecodedFrame, &decoderContext);
611*cfb92d14SAndroid Build Coastguard Worker     for (uint32_t iter = 0; iter < kFuzzTestIteration; iter++)
612*cfb92d14SAndroid Build Coastguard Worker     {
613*cfb92d14SAndroid Build Coastguard Worker         encoderBuffer.Clear();
614*cfb92d14SAndroid Build Coastguard Worker         decoderBuffer.Clear();
615*cfb92d14SAndroid Build Coastguard Worker 
616*cfb92d14SAndroid Build Coastguard Worker         do
617*cfb92d14SAndroid Build Coastguard Worker         {
618*cfb92d14SAndroid Build Coastguard Worker             length = static_cast<uint16_t>(GetRandom(kMaxFrameLength));
619*cfb92d14SAndroid Build Coastguard Worker         } while (length == 0);
620*cfb92d14SAndroid Build Coastguard Worker 
621*cfb92d14SAndroid Build Coastguard Worker         for (uint16_t i = 0; i < length; i++)
622*cfb92d14SAndroid Build Coastguard Worker         {
623*cfb92d14SAndroid Build Coastguard Worker             frame[i] = static_cast<uint8_t>(GetRandom(256));
624*cfb92d14SAndroid Build Coastguard Worker         }
625*cfb92d14SAndroid Build Coastguard Worker 
626*cfb92d14SAndroid Build Coastguard Worker         SuccessOrQuit(encoder.BeginFrame());
627*cfb92d14SAndroid Build Coastguard Worker         SuccessOrQuit(encoder.Encode(frame, length));
628*cfb92d14SAndroid Build Coastguard Worker         SuccessOrQuit(encoder.EndFrame());
629*cfb92d14SAndroid Build Coastguard Worker 
630*cfb92d14SAndroid Build Coastguard Worker         VerifyOrQuit(!encoderBuffer.IsEmpty(), "Encoded frame is empty");
631*cfb92d14SAndroid Build Coastguard Worker         VerifyOrQuit(encoderBuffer.GetLength() > length, "Encoded frame is too short");
632*cfb92d14SAndroid Build Coastguard Worker 
633*cfb92d14SAndroid Build Coastguard Worker         decoderContext.mWasCalled = false;
634*cfb92d14SAndroid Build Coastguard Worker         decoder.Decode(encoderBuffer.GetFrame(), encoderBuffer.GetLength());
635*cfb92d14SAndroid Build Coastguard Worker         VerifyOrQuit(decoderContext.mWasCalled);
636*cfb92d14SAndroid Build Coastguard Worker         VerifyOrQuit(decoderContext.mError == OT_ERROR_NONE, "Decoder::Decode() returned incorrect error code");
637*cfb92d14SAndroid Build Coastguard Worker 
638*cfb92d14SAndroid Build Coastguard Worker         VerifyOrQuit(!decoderBuffer.IsEmpty(), "Decoded frame is empty");
639*cfb92d14SAndroid Build Coastguard Worker         VerifyOrQuit(decoderBuffer.GetLength() == length, "Decoded frame length does not match original frame");
640*cfb92d14SAndroid Build Coastguard Worker         VerifyOrQuit(memcmp(decoderBuffer.GetFrame(), frame, length) == 0,
641*cfb92d14SAndroid Build Coastguard Worker                      "Decoded frame content does not match original frame");
642*cfb92d14SAndroid Build Coastguard Worker     }
643*cfb92d14SAndroid Build Coastguard Worker 
644*cfb92d14SAndroid Build Coastguard Worker     printf(" -- PASS\n");
645*cfb92d14SAndroid Build Coastguard Worker }
646*cfb92d14SAndroid Build Coastguard Worker 
647*cfb92d14SAndroid Build Coastguard Worker } // namespace Ncp
648*cfb92d14SAndroid Build Coastguard Worker } // namespace ot
649*cfb92d14SAndroid Build Coastguard Worker 
main(void)650*cfb92d14SAndroid Build Coastguard Worker int main(void)
651*cfb92d14SAndroid Build Coastguard Worker {
652*cfb92d14SAndroid Build Coastguard Worker     ot::Ncp::TestHdlcFrameBuffer();
653*cfb92d14SAndroid Build Coastguard Worker     ot::Ncp::TestSpinelMultiFrameBuffer();
654*cfb92d14SAndroid Build Coastguard Worker     ot::Ncp::TestEncoderDecoder();
655*cfb92d14SAndroid Build Coastguard Worker     ot::Ncp::TestFuzzEncoderDecoder();
656*cfb92d14SAndroid Build Coastguard Worker     printf("\nAll tests passed.\n");
657*cfb92d14SAndroid Build Coastguard Worker     return 0;
658*cfb92d14SAndroid Build Coastguard Worker }
659