2 * nghttp2 - HTTP/2 C Library
4 * Copyright (c) 2015 Tatsuhiro Tsujikawa
6 * Permission is hereby granted, free of charge, to any person obtaining
7 * a copy of this software and associated documentation files (the
8 * "Software"), to deal in the Software without restriction, including
9 * without limitation the rights to use, copy, modify, merge, publish,
10 * distribute, sublicense, and/or sell copies of the Software, and to
11 * permit persons to whom the Software is furnished to do so, subject to
12 * the following conditions:
14 * The above copyright notice and this permission notice shall be
15 * included in all copies or substantial portions of the Software.
17 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
18 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
19 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
20 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
21 * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
22 * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
23 * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25 #include "memchunk_test.h"
27 #include <CUnit/CUnit.h>
29 #include <nghttp2/nghttp2.h>
36 void test_pool_recycle(void) {
39 CU_ASSERT(!pool.pool);
40 CU_ASSERT(0 == pool.poolsize);
41 CU_ASSERT(nullptr == pool.freelist);
45 CU_ASSERT(m1 == pool.pool.get());
46 CU_ASSERT(MemchunkPool::value_type::size == pool.poolsize);
47 CU_ASSERT(nullptr == pool.freelist);
51 CU_ASSERT(m2 == pool.pool.get());
52 CU_ASSERT(2 * MemchunkPool::value_type::size == pool.poolsize);
53 CU_ASSERT(nullptr == pool.freelist);
54 CU_ASSERT(m1 == m2->knext.get());
55 CU_ASSERT(nullptr == m1->knext.get());
59 CU_ASSERT(m3 == pool.pool.get());
60 CU_ASSERT(3 * MemchunkPool::value_type::size == pool.poolsize);
61 CU_ASSERT(nullptr == pool.freelist);
65 CU_ASSERT(m3 == pool.pool.get());
66 CU_ASSERT(3 * MemchunkPool::value_type::size == pool.poolsize);
67 CU_ASSERT(m3 == pool.freelist);
72 CU_ASSERT(m4 == pool.pool.get());
73 CU_ASSERT(3 * MemchunkPool::value_type::size == pool.poolsize);
74 CU_ASSERT(nullptr == pool.freelist);
79 CU_ASSERT(m1 == pool.freelist);
80 CU_ASSERT(m2 == m1->next);
81 CU_ASSERT(nullptr == m2->next);
84 using Memchunk16 = Memchunk<16>;
85 using MemchunkPool16 = Pool<Memchunk16>;
86 using Memchunks16 = Memchunks<Memchunk16>;
88 void test_memchunks_append(void) {
90 Memchunks16 chunks(&pool);
96 CU_ASSERT(3 == m->len());
97 CU_ASSERT(13 == m->left());
99 chunks.append("3456789abcdef@");
101 CU_ASSERT(16 == m->len());
102 CU_ASSERT(0 == m->left());
106 CU_ASSERT(1 == m->len());
107 CU_ASSERT(15 == m->left());
108 CU_ASSERT(17 == chunks.rleft());
113 nread = chunks.remove(buf, 8);
115 CU_ASSERT(8 == nread);
116 CU_ASSERT(0 == memcmp("01234567", buf, nread));
117 CU_ASSERT(9 == chunks.rleft());
119 nread = chunks.remove(buf, sizeof(buf));
121 CU_ASSERT(9 == nread);
122 CU_ASSERT(0 == memcmp("89abcdef@", buf, nread));
123 CU_ASSERT(0 == chunks.rleft());
124 CU_ASSERT(nullptr == chunks.head);
125 CU_ASSERT(nullptr == chunks.tail);
126 CU_ASSERT(32 == pool.poolsize);
129 void test_memchunks_drain(void) {
131 Memchunks16 chunks(&pool);
133 chunks.append("0123456789");
137 nread = chunks.drain(3);
139 CU_ASSERT(3 == nread);
143 nread = chunks.remove(buf, sizeof(buf));
145 CU_ASSERT(7 == nread);
146 CU_ASSERT(0 == memcmp("3456789", buf, nread));
149 void test_memchunks_riovec(void) {
151 Memchunks16 chunks(&pool);
155 chunks.append(buf, sizeof(buf));
157 std::array<struct iovec, 2> iov;
158 auto iovcnt = chunks.riovec(iov.data(), iov.size());
160 auto m = chunks.head;
162 CU_ASSERT(2 == iovcnt);
163 CU_ASSERT(m->buf.data() == iov[0].iov_base);
164 CU_ASSERT(m->len() == iov[0].iov_len);
168 CU_ASSERT(m->buf.data() == iov[1].iov_base);
169 CU_ASSERT(m->len() == iov[1].iov_len);
171 chunks.drain(2 * 16);
173 iovcnt = chunks.riovec(iov.data(), iov.size());
175 CU_ASSERT(1 == iovcnt);
178 CU_ASSERT(m->buf.data() == iov[0].iov_base);
179 CU_ASSERT(m->len() == iov[0].iov_len);
182 void test_memchunks_recycle(void) {
185 Memchunks16 chunks(&pool);
187 chunks.append(buf, sizeof(buf));
189 CU_ASSERT(32 == pool.poolsize);
190 CU_ASSERT(nullptr != pool.freelist);
192 auto m = pool.freelist;
195 CU_ASSERT(nullptr != m);
196 CU_ASSERT(nullptr == m->next);
199 } // namespace nghttp2