1*cfb92d14SAndroid Build Coastguard Worker /*
2*cfb92d14SAndroid Build Coastguard Worker * Copyright (c) 2021, 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 "test_platform.h"
30*cfb92d14SAndroid Build Coastguard Worker
31*cfb92d14SAndroid Build Coastguard Worker #include <string.h>
32*cfb92d14SAndroid Build Coastguard Worker
33*cfb92d14SAndroid Build Coastguard Worker #include <openthread/config.h>
34*cfb92d14SAndroid Build Coastguard Worker
35*cfb92d14SAndroid Build Coastguard Worker #include "test_util.hpp"
36*cfb92d14SAndroid Build Coastguard Worker #include "common/code_utils.hpp"
37*cfb92d14SAndroid Build Coastguard Worker #include "common/heap_data.hpp"
38*cfb92d14SAndroid Build Coastguard Worker #include "common/heap_string.hpp"
39*cfb92d14SAndroid Build Coastguard Worker
40*cfb92d14SAndroid Build Coastguard Worker namespace ot {
41*cfb92d14SAndroid Build Coastguard Worker
PrintString(const char * aName,const Heap::String & aString)42*cfb92d14SAndroid Build Coastguard Worker void PrintString(const char *aName, const Heap::String &aString)
43*cfb92d14SAndroid Build Coastguard Worker {
44*cfb92d14SAndroid Build Coastguard Worker if (aString.IsNull())
45*cfb92d14SAndroid Build Coastguard Worker {
46*cfb92d14SAndroid Build Coastguard Worker printf("%s = (null)\n", aName);
47*cfb92d14SAndroid Build Coastguard Worker }
48*cfb92d14SAndroid Build Coastguard Worker else
49*cfb92d14SAndroid Build Coastguard Worker {
50*cfb92d14SAndroid Build Coastguard Worker printf("%s = [%zu] \"%s\"\n", aName, strlen(aString.AsCString()), aString.AsCString());
51*cfb92d14SAndroid Build Coastguard Worker }
52*cfb92d14SAndroid Build Coastguard Worker }
53*cfb92d14SAndroid Build Coastguard Worker
VerifyString(const char * aName,const Heap::String & aString,const char * aExpectedString)54*cfb92d14SAndroid Build Coastguard Worker void VerifyString(const char *aName, const Heap::String &aString, const char *aExpectedString)
55*cfb92d14SAndroid Build Coastguard Worker {
56*cfb92d14SAndroid Build Coastguard Worker PrintString(aName, aString);
57*cfb92d14SAndroid Build Coastguard Worker
58*cfb92d14SAndroid Build Coastguard Worker if (aExpectedString == nullptr)
59*cfb92d14SAndroid Build Coastguard Worker {
60*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(aString.IsNull());
61*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(aString.AsCString() == nullptr);
62*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(aString != "something");
63*cfb92d14SAndroid Build Coastguard Worker }
64*cfb92d14SAndroid Build Coastguard Worker else
65*cfb92d14SAndroid Build Coastguard Worker {
66*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(!aString.IsNull());
67*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(aString.AsCString() != nullptr);
68*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(strcmp(aString.AsCString(), aExpectedString) == 0, "String content is incorrect");
69*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(aString != nullptr);
70*cfb92d14SAndroid Build Coastguard Worker }
71*cfb92d14SAndroid Build Coastguard Worker
72*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(aString == aExpectedString);
73*cfb92d14SAndroid Build Coastguard Worker }
74*cfb92d14SAndroid Build Coastguard Worker
75*cfb92d14SAndroid Build Coastguard Worker // Function returning a `Heap::String` by value.
GetName(void)76*cfb92d14SAndroid Build Coastguard Worker Heap::String GetName(void)
77*cfb92d14SAndroid Build Coastguard Worker {
78*cfb92d14SAndroid Build Coastguard Worker Heap::String name;
79*cfb92d14SAndroid Build Coastguard Worker
80*cfb92d14SAndroid Build Coastguard Worker SuccessOrQuit(name.Set("name"));
81*cfb92d14SAndroid Build Coastguard Worker
82*cfb92d14SAndroid Build Coastguard Worker return name;
83*cfb92d14SAndroid Build Coastguard Worker }
84*cfb92d14SAndroid Build Coastguard Worker
TestHeapString(void)85*cfb92d14SAndroid Build Coastguard Worker void TestHeapString(void)
86*cfb92d14SAndroid Build Coastguard Worker {
87*cfb92d14SAndroid Build Coastguard Worker Heap::String str1;
88*cfb92d14SAndroid Build Coastguard Worker Heap::String str2;
89*cfb92d14SAndroid Build Coastguard Worker const char *oldBuffer;
90*cfb92d14SAndroid Build Coastguard Worker
91*cfb92d14SAndroid Build Coastguard Worker printf("====================================================================================\n");
92*cfb92d14SAndroid Build Coastguard Worker printf("TestHeapString\n\n");
93*cfb92d14SAndroid Build Coastguard Worker
94*cfb92d14SAndroid Build Coastguard Worker printf("------------------------------------------------------------------------------------\n");
95*cfb92d14SAndroid Build Coastguard Worker printf("After constructor\n\n");
96*cfb92d14SAndroid Build Coastguard Worker VerifyString("str1", str1, nullptr);
97*cfb92d14SAndroid Build Coastguard Worker
98*cfb92d14SAndroid Build Coastguard Worker printf("------------------------------------------------------------------------------------\n");
99*cfb92d14SAndroid Build Coastguard Worker printf("Set(const char *aCstring)\n\n");
100*cfb92d14SAndroid Build Coastguard Worker SuccessOrQuit(str1.Set("hello"));
101*cfb92d14SAndroid Build Coastguard Worker VerifyString("str1", str1, "hello");
102*cfb92d14SAndroid Build Coastguard Worker oldBuffer = str1.AsCString();
103*cfb92d14SAndroid Build Coastguard Worker
104*cfb92d14SAndroid Build Coastguard Worker SuccessOrQuit(str1.Set("0123456789"));
105*cfb92d14SAndroid Build Coastguard Worker VerifyString("str1", str1, "0123456789");
106*cfb92d14SAndroid Build Coastguard Worker printf("\tDid reuse its old buffer: %s\n", str1.AsCString() == oldBuffer ? "yes" : "no");
107*cfb92d14SAndroid Build Coastguard Worker oldBuffer = str1.AsCString();
108*cfb92d14SAndroid Build Coastguard Worker
109*cfb92d14SAndroid Build Coastguard Worker SuccessOrQuit(str1.Set("9876543210"));
110*cfb92d14SAndroid Build Coastguard Worker VerifyString("str1", str1, "9876543210");
111*cfb92d14SAndroid Build Coastguard Worker printf("\tDid reuse its old buffer (same length): %s\n", str1.AsCString() == oldBuffer ? "yes" : "no");
112*cfb92d14SAndroid Build Coastguard Worker
113*cfb92d14SAndroid Build Coastguard Worker printf("------------------------------------------------------------------------------------\n");
114*cfb92d14SAndroid Build Coastguard Worker printf("Set(const Heap::String &)\n\n");
115*cfb92d14SAndroid Build Coastguard Worker SuccessOrQuit(str2.Set(str1));
116*cfb92d14SAndroid Build Coastguard Worker VerifyString("str2", str2, str1.AsCString());
117*cfb92d14SAndroid Build Coastguard Worker
118*cfb92d14SAndroid Build Coastguard Worker SuccessOrQuit(str1.Set(nullptr));
119*cfb92d14SAndroid Build Coastguard Worker VerifyString("str1", str1, nullptr);
120*cfb92d14SAndroid Build Coastguard Worker
121*cfb92d14SAndroid Build Coastguard Worker SuccessOrQuit(str2.Set(str1));
122*cfb92d14SAndroid Build Coastguard Worker VerifyString("str2", str2, nullptr);
123*cfb92d14SAndroid Build Coastguard Worker
124*cfb92d14SAndroid Build Coastguard Worker printf("------------------------------------------------------------------------------------\n");
125*cfb92d14SAndroid Build Coastguard Worker printf("Free()\n\n");
126*cfb92d14SAndroid Build Coastguard Worker str1.Free();
127*cfb92d14SAndroid Build Coastguard Worker VerifyString("str1", str1, nullptr);
128*cfb92d14SAndroid Build Coastguard Worker
129*cfb92d14SAndroid Build Coastguard Worker SuccessOrQuit(str1.Set("hello again"));
130*cfb92d14SAndroid Build Coastguard Worker VerifyString("str1", str1, "hello again");
131*cfb92d14SAndroid Build Coastguard Worker
132*cfb92d14SAndroid Build Coastguard Worker str1.Free();
133*cfb92d14SAndroid Build Coastguard Worker VerifyString("str1", str1, nullptr);
134*cfb92d14SAndroid Build Coastguard Worker
135*cfb92d14SAndroid Build Coastguard Worker printf("------------------------------------------------------------------------------------\n");
136*cfb92d14SAndroid Build Coastguard Worker printf("Set() move semantics\n\n");
137*cfb92d14SAndroid Build Coastguard Worker SuccessOrQuit(str1.Set("old name"));
138*cfb92d14SAndroid Build Coastguard Worker PrintString("str1", str1);
139*cfb92d14SAndroid Build Coastguard Worker SuccessOrQuit(str1.Set(GetName()), "Set() with move semantics failed");
140*cfb92d14SAndroid Build Coastguard Worker VerifyString("str1", str1, "name");
141*cfb92d14SAndroid Build Coastguard Worker
142*cfb92d14SAndroid Build Coastguard Worker printf("------------------------------------------------------------------------------------\n");
143*cfb92d14SAndroid Build Coastguard Worker printf("operator==() with two null string\n\n");
144*cfb92d14SAndroid Build Coastguard Worker str1.Free();
145*cfb92d14SAndroid Build Coastguard Worker str2.Free();
146*cfb92d14SAndroid Build Coastguard Worker VerifyString("str1", str1, nullptr);
147*cfb92d14SAndroid Build Coastguard Worker VerifyString("str2", str2, nullptr);
148*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(str1 == str2, "operator==() failed with two null strings");
149*cfb92d14SAndroid Build Coastguard Worker
150*cfb92d14SAndroid Build Coastguard Worker printf("\n -- PASS\n");
151*cfb92d14SAndroid Build Coastguard Worker }
152*cfb92d14SAndroid Build Coastguard Worker
PrintData(const Heap::Data & aData)153*cfb92d14SAndroid Build Coastguard Worker void PrintData(const Heap::Data &aData) { DumpBuffer("data", aData.GetBytes(), aData.GetLength()); }
154*cfb92d14SAndroid Build Coastguard Worker
155*cfb92d14SAndroid Build Coastguard Worker static const uint8_t kTestValue = 0x77;
156*cfb92d14SAndroid Build Coastguard Worker
157*cfb92d14SAndroid Build Coastguard Worker // Function returning a `Heap::Data` by value.
GetData(void)158*cfb92d14SAndroid Build Coastguard Worker Heap::Data GetData(void)
159*cfb92d14SAndroid Build Coastguard Worker {
160*cfb92d14SAndroid Build Coastguard Worker Heap::Data data;
161*cfb92d14SAndroid Build Coastguard Worker
162*cfb92d14SAndroid Build Coastguard Worker SuccessOrQuit(data.SetFrom(&kTestValue, sizeof(kTestValue)));
163*cfb92d14SAndroid Build Coastguard Worker
164*cfb92d14SAndroid Build Coastguard Worker return data;
165*cfb92d14SAndroid Build Coastguard Worker }
166*cfb92d14SAndroid Build Coastguard Worker
VerifyData(const Heap::Data & aData,const uint8_t * aBytes,uint16_t aLength)167*cfb92d14SAndroid Build Coastguard Worker void VerifyData(const Heap::Data &aData, const uint8_t *aBytes, uint16_t aLength)
168*cfb92d14SAndroid Build Coastguard Worker {
169*cfb92d14SAndroid Build Coastguard Worker static constexpr uint16_t kMaxLength = 100;
170*cfb92d14SAndroid Build Coastguard Worker uint8_t buffer[kMaxLength];
171*cfb92d14SAndroid Build Coastguard Worker
172*cfb92d14SAndroid Build Coastguard Worker PrintData(aData);
173*cfb92d14SAndroid Build Coastguard Worker
174*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(aData.Matches(aBytes, aLength));
175*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(!aData.Matches(aBytes, aLength + 1));
176*cfb92d14SAndroid Build Coastguard Worker
177*cfb92d14SAndroid Build Coastguard Worker if (aLength == 0)
178*cfb92d14SAndroid Build Coastguard Worker {
179*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(aData.IsNull());
180*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(aData.GetBytes() == nullptr);
181*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(aData.GetLength() == 0);
182*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(aData.Matches(nullptr, 0));
183*cfb92d14SAndroid Build Coastguard Worker }
184*cfb92d14SAndroid Build Coastguard Worker else
185*cfb92d14SAndroid Build Coastguard Worker {
186*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(!aData.IsNull());
187*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(aData.GetBytes() != nullptr);
188*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(aData.GetLength() == aLength);
189*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(memcmp(aData.GetBytes(), aBytes, aLength) == 0, "Data content is incorrect");
190*cfb92d14SAndroid Build Coastguard Worker
191*cfb92d14SAndroid Build Coastguard Worker aData.CopyBytesTo(buffer);
192*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(memcmp(buffer, aBytes, aLength) == 0, "CopyBytesTo() failed");
193*cfb92d14SAndroid Build Coastguard Worker
194*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(aData.Matches(buffer, aLength));
195*cfb92d14SAndroid Build Coastguard Worker buffer[aLength - 1]++;
196*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(!aData.Matches(buffer, aLength));
197*cfb92d14SAndroid Build Coastguard Worker }
198*cfb92d14SAndroid Build Coastguard Worker }
199*cfb92d14SAndroid Build Coastguard Worker
VerifyData(const Heap::Data & aData,const uint8_t (& aArray)[kLength])200*cfb92d14SAndroid Build Coastguard Worker template <uint16_t kLength> void VerifyData(const Heap::Data &aData, const uint8_t (&aArray)[kLength])
201*cfb92d14SAndroid Build Coastguard Worker {
202*cfb92d14SAndroid Build Coastguard Worker VerifyData(aData, &aArray[0], kLength);
203*cfb92d14SAndroid Build Coastguard Worker }
204*cfb92d14SAndroid Build Coastguard Worker
TestHeapData(void)205*cfb92d14SAndroid Build Coastguard Worker void TestHeapData(void)
206*cfb92d14SAndroid Build Coastguard Worker {
207*cfb92d14SAndroid Build Coastguard Worker Instance *instance;
208*cfb92d14SAndroid Build Coastguard Worker MessagePool *messagePool;
209*cfb92d14SAndroid Build Coastguard Worker Message *message;
210*cfb92d14SAndroid Build Coastguard Worker Heap::Data data;
211*cfb92d14SAndroid Build Coastguard Worker uint16_t offset;
212*cfb92d14SAndroid Build Coastguard Worker const uint8_t *oldBuffer;
213*cfb92d14SAndroid Build Coastguard Worker
214*cfb92d14SAndroid Build Coastguard Worker static const uint8_t kData1[] = {10, 20, 3, 15, 100, 0, 60, 16};
215*cfb92d14SAndroid Build Coastguard Worker static const uint8_t kData2[] = "OpenThread HeapData";
216*cfb92d14SAndroid Build Coastguard Worker static const uint8_t kData3[] = {0xaa, 0xbb, 0xcc};
217*cfb92d14SAndroid Build Coastguard Worker static const uint8_t kData4[] = {0x11, 0x22, 0x33};
218*cfb92d14SAndroid Build Coastguard Worker
219*cfb92d14SAndroid Build Coastguard Worker instance = static_cast<Instance *>(testInitInstance());
220*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(instance != nullptr, "Null OpenThread instance");
221*cfb92d14SAndroid Build Coastguard Worker
222*cfb92d14SAndroid Build Coastguard Worker messagePool = &instance->Get<MessagePool>();
223*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit((message = messagePool->Allocate(Message::kTypeIp6)) != nullptr);
224*cfb92d14SAndroid Build Coastguard Worker
225*cfb92d14SAndroid Build Coastguard Worker message->SetOffset(0);
226*cfb92d14SAndroid Build Coastguard Worker
227*cfb92d14SAndroid Build Coastguard Worker printf("\n\n====================================================================================\n");
228*cfb92d14SAndroid Build Coastguard Worker printf("TestHeapData\n\n");
229*cfb92d14SAndroid Build Coastguard Worker
230*cfb92d14SAndroid Build Coastguard Worker printf("------------------------------------------------------------------------------------\n");
231*cfb92d14SAndroid Build Coastguard Worker printf("After constructor\n");
232*cfb92d14SAndroid Build Coastguard Worker VerifyData(data, nullptr, 0);
233*cfb92d14SAndroid Build Coastguard Worker
234*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(data.Matches(nullptr, 0));
235*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(data.Matches(kData1, 0));
236*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(!data.Matches(kData1, 1));
237*cfb92d14SAndroid Build Coastguard Worker
238*cfb92d14SAndroid Build Coastguard Worker printf("------------------------------------------------------------------------------------\n");
239*cfb92d14SAndroid Build Coastguard Worker printf("SetFrom(aBuffer, aLength)\n");
240*cfb92d14SAndroid Build Coastguard Worker
241*cfb92d14SAndroid Build Coastguard Worker SuccessOrQuit(data.SetFrom(kData1, sizeof(kData1)));
242*cfb92d14SAndroid Build Coastguard Worker VerifyData(data, kData1);
243*cfb92d14SAndroid Build Coastguard Worker
244*cfb92d14SAndroid Build Coastguard Worker SuccessOrQuit(data.SetFrom(kData2, sizeof(kData2)));
245*cfb92d14SAndroid Build Coastguard Worker VerifyData(data, kData2);
246*cfb92d14SAndroid Build Coastguard Worker
247*cfb92d14SAndroid Build Coastguard Worker SuccessOrQuit(data.SetFrom(kData3, sizeof(kData3)));
248*cfb92d14SAndroid Build Coastguard Worker VerifyData(data, kData3);
249*cfb92d14SAndroid Build Coastguard Worker oldBuffer = data.GetBytes();
250*cfb92d14SAndroid Build Coastguard Worker
251*cfb92d14SAndroid Build Coastguard Worker SuccessOrQuit(data.SetFrom(kData4, sizeof(kData4)));
252*cfb92d14SAndroid Build Coastguard Worker VerifyData(data, kData4);
253*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(oldBuffer == data.GetBytes(), "did not reuse old buffer on same data length");
254*cfb92d14SAndroid Build Coastguard Worker
255*cfb92d14SAndroid Build Coastguard Worker SuccessOrQuit(data.SetFrom(kData4, 0));
256*cfb92d14SAndroid Build Coastguard Worker VerifyData(data, nullptr, 0);
257*cfb92d14SAndroid Build Coastguard Worker
258*cfb92d14SAndroid Build Coastguard Worker printf("------------------------------------------------------------------------------------\n");
259*cfb92d14SAndroid Build Coastguard Worker printf("SetFrom(aMessage)\n");
260*cfb92d14SAndroid Build Coastguard Worker
261*cfb92d14SAndroid Build Coastguard Worker SuccessOrQuit(message->Append(kData2));
262*cfb92d14SAndroid Build Coastguard Worker SuccessOrQuit(data.SetFrom(*message));
263*cfb92d14SAndroid Build Coastguard Worker VerifyData(data, kData2);
264*cfb92d14SAndroid Build Coastguard Worker
265*cfb92d14SAndroid Build Coastguard Worker SuccessOrQuit(message->Append(kData3));
266*cfb92d14SAndroid Build Coastguard Worker SuccessOrQuit(data.SetFrom(*message));
267*cfb92d14SAndroid Build Coastguard Worker PrintData(data);
268*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(data.GetLength() == message->GetLength());
269*cfb92d14SAndroid Build Coastguard Worker
270*cfb92d14SAndroid Build Coastguard Worker message->SetOffset(sizeof(kData2));
271*cfb92d14SAndroid Build Coastguard Worker SuccessOrQuit(data.SetFrom(*message));
272*cfb92d14SAndroid Build Coastguard Worker VerifyData(data, kData3);
273*cfb92d14SAndroid Build Coastguard Worker
274*cfb92d14SAndroid Build Coastguard Worker SuccessOrQuit(message->Append(kData4));
275*cfb92d14SAndroid Build Coastguard Worker
276*cfb92d14SAndroid Build Coastguard Worker offset = 0;
277*cfb92d14SAndroid Build Coastguard Worker SuccessOrQuit(data.SetFrom(*message, offset, sizeof(kData2)));
278*cfb92d14SAndroid Build Coastguard Worker VerifyData(data, kData2);
279*cfb92d14SAndroid Build Coastguard Worker
280*cfb92d14SAndroid Build Coastguard Worker offset = sizeof(kData2);
281*cfb92d14SAndroid Build Coastguard Worker SuccessOrQuit(data.SetFrom(*message, offset, sizeof(kData3)));
282*cfb92d14SAndroid Build Coastguard Worker VerifyData(data, kData3);
283*cfb92d14SAndroid Build Coastguard Worker
284*cfb92d14SAndroid Build Coastguard Worker offset += sizeof(kData3);
285*cfb92d14SAndroid Build Coastguard Worker SuccessOrQuit(data.SetFrom(*message, offset, sizeof(kData4)));
286*cfb92d14SAndroid Build Coastguard Worker VerifyData(data, kData4);
287*cfb92d14SAndroid Build Coastguard Worker
288*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(data.SetFrom(*message, offset, sizeof(kData4) + 1) == kErrorParse);
289*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(data.SetFrom(*message, 0, message->GetLength() + 1) == kErrorParse);
290*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(data.SetFrom(*message, 1, message->GetLength()) == kErrorParse);
291*cfb92d14SAndroid Build Coastguard Worker
292*cfb92d14SAndroid Build Coastguard Worker printf("------------------------------------------------------------------------------------\n");
293*cfb92d14SAndroid Build Coastguard Worker printf("Free()\n");
294*cfb92d14SAndroid Build Coastguard Worker
295*cfb92d14SAndroid Build Coastguard Worker data.Free();
296*cfb92d14SAndroid Build Coastguard Worker VerifyData(data, nullptr, 0);
297*cfb92d14SAndroid Build Coastguard Worker
298*cfb92d14SAndroid Build Coastguard Worker data.Free();
299*cfb92d14SAndroid Build Coastguard Worker VerifyData(data, nullptr, 0);
300*cfb92d14SAndroid Build Coastguard Worker
301*cfb92d14SAndroid Build Coastguard Worker printf("------------------------------------------------------------------------------------\n");
302*cfb92d14SAndroid Build Coastguard Worker printf("CopyBytesTo(aMessage)\n");
303*cfb92d14SAndroid Build Coastguard Worker
304*cfb92d14SAndroid Build Coastguard Worker SuccessOrQuit(message->SetLength(0));
305*cfb92d14SAndroid Build Coastguard Worker
306*cfb92d14SAndroid Build Coastguard Worker SuccessOrQuit(data.CopyBytesTo(*message));
307*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(message->GetLength() == 0, "CopyBytesTo() failed");
308*cfb92d14SAndroid Build Coastguard Worker
309*cfb92d14SAndroid Build Coastguard Worker SuccessOrQuit(data.SetFrom(kData1, sizeof(kData1)));
310*cfb92d14SAndroid Build Coastguard Worker VerifyData(data, kData1);
311*cfb92d14SAndroid Build Coastguard Worker SuccessOrQuit(data.CopyBytesTo(*message));
312*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(message->GetLength() == data.GetLength(), "CopyBytesTo() failed");
313*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(message->Compare(0, kData1), "CopyBytesTo() failed");
314*cfb92d14SAndroid Build Coastguard Worker
315*cfb92d14SAndroid Build Coastguard Worker printf("------------------------------------------------------------------------------------\n");
316*cfb92d14SAndroid Build Coastguard Worker printf("SetFrom() move semantics\n\n");
317*cfb92d14SAndroid Build Coastguard Worker data.SetFrom(GetData());
318*cfb92d14SAndroid Build Coastguard Worker VerifyData(data, &kTestValue, sizeof(kTestValue));
319*cfb92d14SAndroid Build Coastguard Worker
320*cfb92d14SAndroid Build Coastguard Worker printf("\n -- PASS\n");
321*cfb92d14SAndroid Build Coastguard Worker }
322*cfb92d14SAndroid Build Coastguard Worker
323*cfb92d14SAndroid Build Coastguard Worker } // namespace ot
324*cfb92d14SAndroid Build Coastguard Worker
main(void)325*cfb92d14SAndroid Build Coastguard Worker int main(void)
326*cfb92d14SAndroid Build Coastguard Worker {
327*cfb92d14SAndroid Build Coastguard Worker ot::TestHeapString();
328*cfb92d14SAndroid Build Coastguard Worker ot::TestHeapData();
329*cfb92d14SAndroid Build Coastguard Worker printf("\nAll tests passed.\n");
330*cfb92d14SAndroid Build Coastguard Worker return 0;
331*cfb92d14SAndroid Build Coastguard Worker }
332