3 * Copyright (c) 2020-2021 Project CHIP Authors
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
9 * http://www.apache.org/licenses/LICENSE-2.0
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
17 #include <support/BufferWriter.h>
18 #include <support/UnitTestRegistration.h>
20 #include <nlunit-test.h>
25 class BWTest : public Base
28 static constexpr size_t kLen = 64;
29 static constexpr uint8_t kGuard = 0xfe;
34 BWTest(size_t len) : Base(mBuf + 1, len), mLen(len) { memset(mBuf, kGuard, kLen); }
36 bool expect(const void * val, size_t needed, size_t available)
39 for (size_t i = mLen + 1; i < sizeof(mBuf); i++)
41 if (mBuf[i] != kGuard)
43 printf("Guards failure at index %d\n", static_cast<int>(i));
47 if (mBuf[0] != kGuard)
49 printf("Guards failure at index 0: buffer underflow\n");
53 size_t written = 0xcafebabe;
54 bool fit = Base::Fit(written);
55 if (written == 0xcafebabe)
57 printf("Fit(written) didn't set written\n");
60 if ((fit && (mLen < needed || written != needed)) || (!fit && (mLen >= needed || written != mLen)))
62 printf("Fit(written) is wrong: mLen == %zu, needed == %zu, written == %zu, Fit() == %s\n", mLen, needed, written,
63 fit ? "true" : "false");
67 // check everything else
68 if (memcmp(mBuf + 1, val, needed < mLen ? needed : mLen) != 0)
70 printf("Memory comparison failed.\n");
74 return Base::Available() == available && Base::Needed() == needed;
78 using namespace chip::Encoding;
80 void TestStringWrite(nlTestSuite * inSuite, void * inContext)
83 BWTest<BufferWriter> bb(2);
85 NL_TEST_ASSERT(inSuite, bb.expect("hi", 2, 0));
88 BWTest<BufferWriter> bb(1);
90 NL_TEST_ASSERT(inSuite, bb.expect("hi", 2, 0));
94 BWTest<LittleEndian::BufferWriter> bb(2);
96 NL_TEST_ASSERT(inSuite, bb.expect("hi", 2, 0));
99 BWTest<LittleEndian::BufferWriter> bb(1);
101 NL_TEST_ASSERT(inSuite, bb.expect("hi", 2, 0));
105 BWTest<BigEndian::BufferWriter> bb(2);
107 NL_TEST_ASSERT(inSuite, bb.expect("hi", 2, 0));
110 BWTest<BigEndian::BufferWriter> bb(1);
112 NL_TEST_ASSERT(inSuite, bb.expect("hi", 2, 0));
116 void TestBufferWrite(nlTestSuite * inSuite, void * inContext)
119 BWTest<BufferWriter> bb(2);
120 bb.Put("hithere", 2);
121 NL_TEST_ASSERT(inSuite, bb.expect("hi", 2, 0));
124 BWTest<BufferWriter> bb(1);
125 bb.Put("hithere", 2);
126 NL_TEST_ASSERT(inSuite, bb.expect("hi", 2, 0));
130 BWTest<LittleEndian::BufferWriter> bb(2);
131 bb.Put("hithere", 2);
132 NL_TEST_ASSERT(inSuite, bb.expect("hi", 2, 0));
135 BWTest<LittleEndian::BufferWriter> bb(1);
136 bb.Put("hithere", 2);
137 NL_TEST_ASSERT(inSuite, bb.expect("hi", 2, 0));
141 BWTest<BigEndian::BufferWriter> bb(2);
142 bb.Put("hithere", 2);
143 NL_TEST_ASSERT(inSuite, bb.expect("hi", 2, 0));
146 BWTest<BigEndian::BufferWriter> bb(1);
147 bb.Put("hithere", 2);
148 NL_TEST_ASSERT(inSuite, bb.expect("hi", 2, 0));
152 void TestPutLittleEndian(nlTestSuite * inSuite, void * inContext)
155 BWTest<LittleEndian::BufferWriter> bb(2);
156 bb.Put16('h' + 'i' * 256);
157 NL_TEST_ASSERT(inSuite, bb.expect("hi", 2, 0));
160 BWTest<LittleEndian::BufferWriter> bb(4);
161 bb.Put32(0x01020304);
162 NL_TEST_ASSERT(inSuite, bb.expect("\x04\x03\x02\x01", 4, 0));
166 BWTest<LittleEndian::BufferWriter> bb(8);
167 bb.Put64(0x0102030405060708);
168 NL_TEST_ASSERT(inSuite, bb.expect("\x08\x07\x06\x05\x04\x03\x02\x01", 8, 0));
172 BWTest<LittleEndian::BufferWriter> bb(3);
173 bb.EndianPut(0x0102030405060708u, 3);
174 NL_TEST_ASSERT(inSuite, bb.expect("\x08\x07\x06", 3, 0));
178 void TestPutBigEndian(nlTestSuite * inSuite, void * inContext)
181 BWTest<BigEndian::BufferWriter> bb(2);
182 bb.Put16('i' + 'h' * 256);
183 NL_TEST_ASSERT(inSuite, bb.expect("hi", 2, 0));
187 BWTest<BigEndian::BufferWriter> bb(4);
188 bb.Put32(0x01020304);
189 NL_TEST_ASSERT(inSuite, bb.expect("\x01\x02\x03\x04", 4, 0));
193 BWTest<BigEndian::BufferWriter> bb(8);
194 bb.Put64(0x0102030405060708);
195 NL_TEST_ASSERT(inSuite, bb.expect("\x01\x02\x03\x04\x05\x06\x07\x08", 8, 0));
199 BWTest<BigEndian::BufferWriter> bb(3);
200 bb.EndianPut(0x0102030405060708u, 3);
201 NL_TEST_ASSERT(inSuite, bb.expect("\x06\x07\x08", 3, 0));
205 const nlTest sTests[] = {
206 NL_TEST_DEF("TestStringWrite", TestStringWrite), //
207 NL_TEST_DEF("TestBufferWrite", TestBufferWrite), //
208 NL_TEST_DEF("TestPutLittleEndian", TestPutLittleEndian), //
209 NL_TEST_DEF("TestPutBigEndian", TestPutBigEndian), //
210 NL_TEST_SENTINEL() //
215 int TestBufferWriter(void)
217 nlTestSuite theSuite = { "BufferWriter", sTests, nullptr, nullptr };
218 nlTestRunner(&theSuite, nullptr);
219 return nlTestRunnerStats(&theSuite);
222 CHIP_REGISTER_TEST_SUITE(TestBufferWriter)