3 * Copyright (c) 2020 Project CHIP Authors
6 * Licensed under the Apache License, Version 2.0 (the "License");
7 * you may not use this file except in compliance with the License.
8 * You may obtain a copy of the License at
10 * http://www.apache.org/licenses/LICENSE-2.0
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
19 #include <support/ScopedBuffer.h>
20 #include <support/UnitTestRegistration.h>
22 #include <nlunit-test.h>
26 class TestCounterMemoryManagement
29 static int Counter() { return mAllocCount; }
31 static void MemoryFree(void * p)
34 chip::Platform::MemoryFree(p);
36 static void * MemoryAlloc(size_t size)
39 return chip::Platform::MemoryAlloc(size);
41 static void * MemoryCalloc(size_t num, size_t size)
45 return chip::Platform::MemoryCalloc(num, size);
49 static int mAllocCount;
51 int TestCounterMemoryManagement::mAllocCount = 0;
53 using TestCounterScopedBuffer = chip::Platform::ScopedMemoryBuffer<char, TestCounterMemoryManagement>;
55 void TestAutoFree(nlTestSuite * inSuite, void * inContext)
57 NL_TEST_ASSERT(inSuite, TestCounterMemoryManagement::Counter() == 0);
60 TestCounterScopedBuffer buffer;
62 NL_TEST_ASSERT(inSuite, TestCounterMemoryManagement::Counter() == 0);
63 NL_TEST_ASSERT(inSuite, buffer.Alloc(128));
64 NL_TEST_ASSERT(inSuite, TestCounterMemoryManagement::Counter() == 1);
66 NL_TEST_ASSERT(inSuite, TestCounterMemoryManagement::Counter() == 0);
69 void TestFreeDuringAllocs(nlTestSuite * inSuite, void * inContext)
71 NL_TEST_ASSERT(inSuite, TestCounterMemoryManagement::Counter() == 0);
74 TestCounterScopedBuffer buffer;
76 NL_TEST_ASSERT(inSuite, TestCounterMemoryManagement::Counter() == 0);
77 NL_TEST_ASSERT(inSuite, buffer.Alloc(128));
78 NL_TEST_ASSERT(inSuite, TestCounterMemoryManagement::Counter() == 1);
79 NL_TEST_ASSERT(inSuite, buffer.Alloc(64));
80 NL_TEST_ASSERT(inSuite, TestCounterMemoryManagement::Counter() == 1);
81 NL_TEST_ASSERT(inSuite, buffer.Calloc(10));
82 NL_TEST_ASSERT(inSuite, TestCounterMemoryManagement::Counter() == 1);
84 NL_TEST_ASSERT(inSuite, TestCounterMemoryManagement::Counter() == 0);
87 void TestRelease(nlTestSuite * inSuite, void * inContext)
89 NL_TEST_ASSERT(inSuite, TestCounterMemoryManagement::Counter() == 0);
93 TestCounterScopedBuffer buffer;
95 NL_TEST_ASSERT(inSuite, TestCounterMemoryManagement::Counter() == 0);
96 NL_TEST_ASSERT(inSuite, buffer.Alloc(128));
97 NL_TEST_ASSERT(inSuite, buffer.Get() != nullptr);
99 ptr = buffer.Release();
100 NL_TEST_ASSERT(inSuite, ptr != nullptr);
101 NL_TEST_ASSERT(inSuite, buffer.Get() == nullptr);
104 NL_TEST_ASSERT(inSuite, TestCounterMemoryManagement::Counter() == 1);
107 TestCounterScopedBuffer buffer;
108 NL_TEST_ASSERT(inSuite, buffer.Alloc(128));
109 NL_TEST_ASSERT(inSuite, TestCounterMemoryManagement::Counter() == 2);
110 TestCounterMemoryManagement::MemoryFree(ptr);
111 NL_TEST_ASSERT(inSuite, TestCounterMemoryManagement::Counter() == 1);
114 NL_TEST_ASSERT(inSuite, TestCounterMemoryManagement::Counter() == 0);
117 int Setup(void * inContext)
119 CHIP_ERROR error = chip::Platform::MemoryInit();
120 if (error != CHIP_NO_ERROR)
125 int Teardown(void * inContext)
127 chip::Platform::MemoryShutdown();
133 #define NL_TEST_DEF_FN(fn) NL_TEST_DEF("Test " #fn, fn)
135 * Test Suite. It lists all the test functions.
137 static const nlTest sTests[] = {
138 NL_TEST_DEF_FN(TestAutoFree), //
139 NL_TEST_DEF_FN(TestFreeDuringAllocs), //
140 NL_TEST_DEF_FN(TestRelease), //
141 NL_TEST_SENTINEL() //
144 int TestScopedBuffer(void)
146 nlTestSuite theSuite = { "CHIP ScopedBuffer tests", &sTests[0], Setup, Teardown };
148 // Run test suit againt one context.
149 nlTestRunner(&theSuite, nullptr);
150 return nlTestRunnerStats(&theSuite);
153 CHIP_REGISTER_TEST_SUITE(TestScopedBuffer)