test/test_buffer.cpp

Sat, 30 Apr 2022 09:03:17 +0200

author
Mike Becker <universe@uap-core.de>
date
Sat, 30 Apr 2022 09:03:17 +0200
changeset 538
2cfbcbe86a7c
parent 536
cb9b9739055e
child 539
9cd98da9ee17
permissions
-rw-r--r--

#170 first basic write tests

universe@530 1 /*
universe@530 2 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
universe@530 3 *
universe@530 4 * Copyright 2021 Mike Becker, Olaf Wintermann All rights reserved.
universe@530 5 *
universe@530 6 * Redistribution and use in source and binary forms, with or without
universe@530 7 * modification, are permitted provided that the following conditions are met:
universe@530 8 *
universe@530 9 * 1. Redistributions of source code must retain the above copyright
universe@530 10 * notice, this list of conditions and the following disclaimer.
universe@530 11 *
universe@530 12 * 2. Redistributions in binary form must reproduce the above copyright
universe@530 13 * notice, this list of conditions and the following disclaimer in the
universe@530 14 * documentation and/or other materials provided with the distribution.
universe@530 15 *
universe@530 16 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
universe@530 17 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
universe@530 18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
universe@530 19 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
universe@530 20 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
universe@530 21 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
universe@530 22 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
universe@530 23 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
universe@530 24 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
universe@530 25 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
universe@530 26 * POSSIBILITY OF SUCH DAMAGE.
universe@530 27 */
universe@530 28
universe@530 29 #include "cx/buffer.h"
universe@530 30
universe@530 31 #include <gtest/gtest.h>
universe@530 32 #include "util_allocator.h"
universe@530 33
universe@535 34 TEST(BufferInit, WrapSpace) {
universe@535 35 CxTestingAllocator alloc;
universe@530 36 CxBuffer buf;
universe@535 37 void *space = cxMalloc(&alloc, 16);
universe@535 38 cxBufferInit(&buf, space, 16, &alloc, CX_BUFFER_DEFAULT);
universe@530 39 EXPECT_EQ(buf.space, space);
universe@530 40 EXPECT_EQ(buf.flags & CX_BUFFER_AUTO_EXTEND, 0);
universe@530 41 EXPECT_EQ(buf.flags & CX_BUFFER_FREE_CONTENTS, 0);
universe@530 42 EXPECT_EQ(buf.pos, 0);
universe@530 43 EXPECT_EQ(buf.size, 0);
universe@530 44 EXPECT_EQ(buf.capacity, 16);
universe@535 45 EXPECT_EQ(buf.allocator, &alloc);
universe@530 46 cxBufferDestroy(&buf);
universe@535 47 EXPECT_FALSE(alloc.verify());
universe@535 48 cxFree(&alloc, space);
universe@535 49 EXPECT_TRUE(alloc.verify());
universe@530 50 }
universe@530 51
universe@535 52 TEST(BufferInit, WrapSpaceAutoFree) {
universe@535 53 CxTestingAllocator alloc;
universe@530 54 CxBuffer buf;
universe@535 55 void *space = cxMalloc(&alloc, 16);
universe@535 56 cxBufferInit(&buf, space, 16, &alloc, CX_BUFFER_FREE_CONTENTS);
universe@530 57 EXPECT_EQ(buf.space, space);
universe@530 58 EXPECT_EQ(buf.flags & CX_BUFFER_AUTO_EXTEND, 0);
universe@530 59 EXPECT_EQ(buf.flags & CX_BUFFER_FREE_CONTENTS, CX_BUFFER_FREE_CONTENTS);
universe@530 60 EXPECT_EQ(buf.pos, 0);
universe@530 61 EXPECT_EQ(buf.size, 0);
universe@530 62 EXPECT_EQ(buf.capacity, 16);
universe@535 63 EXPECT_EQ(buf.allocator, &alloc);
universe@535 64 EXPECT_FALSE(alloc.verify());
universe@530 65 cxBufferDestroy(&buf);
universe@535 66 EXPECT_TRUE(alloc.verify());
universe@530 67 }
universe@535 68
universe@535 69 TEST(BufferInit, FreshSpace) {
universe@535 70 CxTestingAllocator alloc;
universe@535 71 CxBuffer buf;
universe@535 72 cxBufferInit(&buf, nullptr, 8, &alloc, CX_BUFFER_DEFAULT);
universe@535 73 EXPECT_NE(buf.space, nullptr);
universe@535 74 EXPECT_EQ(buf.flags & CX_BUFFER_AUTO_EXTEND, 0);
universe@535 75 EXPECT_EQ(buf.flags & CX_BUFFER_FREE_CONTENTS, CX_BUFFER_FREE_CONTENTS);
universe@535 76 EXPECT_EQ(buf.pos, 0);
universe@535 77 EXPECT_EQ(buf.size, 0);
universe@535 78 EXPECT_EQ(buf.capacity, 8);
universe@535 79 EXPECT_EQ(buf.allocator, &alloc);
universe@535 80 EXPECT_FALSE(alloc.verify()); // space is still allocated
universe@535 81 cxBufferDestroy(&buf);
universe@535 82 EXPECT_TRUE(alloc.verify());
universe@535 83 }
universe@535 84
universe@535 85 class BufferShiftFixture : public ::testing::Test {
universe@535 86 protected:
universe@535 87 void SetUp() override {
universe@535 88 ASSERT_TRUE(alloc.verify());
universe@535 89 cxBufferInit(&buf, nullptr, 16, &alloc, CX_BUFFER_DEFAULT);
universe@535 90 memcpy(buf.space, "test____________", 16);
universe@535 91 buf.capacity = 8; // purposely pretend that the buffer has less capacity s.t. we can test beyond the range
universe@535 92 buf.pos = 4;
universe@535 93 buf.size = 4;
universe@535 94 }
universe@535 95
universe@535 96 void TearDown() override {
universe@535 97 cxBufferDestroy(&buf);
universe@535 98 EXPECT_TRUE(alloc.verify());
universe@535 99 }
universe@535 100
universe@535 101 CxTestingAllocator alloc;
universe@535 102 CxBuffer buf{};
universe@535 103 };
universe@535 104
universe@535 105 class BufferShiftLeft : public BufferShiftFixture {
universe@535 106 };
universe@535 107
universe@535 108 TEST_F(BufferShiftLeft, Zero) {
universe@535 109 ASSERT_EQ(buf.pos, 4);
universe@535 110 ASSERT_EQ(buf.size, 4);
universe@535 111 int ret = cxBufferShiftLeft(&buf, 0);
universe@535 112 EXPECT_EQ(ret, 0);
universe@535 113 EXPECT_EQ(buf.pos, 4);
universe@535 114 EXPECT_EQ(buf.size, 4);
universe@535 115 EXPECT_TRUE(memcmp(buf.space, "test________", 8) == 0);
universe@535 116 }
universe@535 117
universe@535 118 TEST_F(BufferShiftLeft, Standard) {
universe@535 119 ASSERT_EQ(buf.pos, 4);
universe@535 120 ASSERT_EQ(buf.size, 4);
universe@535 121 int ret = cxBufferShiftLeft(&buf, 2);
universe@535 122 EXPECT_EQ(ret, 0);
universe@535 123 EXPECT_EQ(buf.pos, 2);
universe@535 124 EXPECT_EQ(buf.size, 2);
universe@535 125 EXPECT_TRUE(memcmp(buf.space, "stst________", 8) == 0);
universe@535 126 }
universe@535 127
universe@535 128 TEST_F(BufferShiftLeft, Overshift) {
universe@535 129 ASSERT_LT(buf.pos, 6);
universe@535 130 ASSERT_LT(buf.size, 6);
universe@535 131 int ret = cxBufferShiftLeft(&buf, 6);
universe@535 132 EXPECT_EQ(ret, 0);
universe@535 133 EXPECT_EQ(buf.pos, 0);
universe@535 134 EXPECT_EQ(buf.size, 0);
universe@535 135 EXPECT_TRUE(memcmp(buf.space, "test________", 8) == 0);
universe@535 136 }
universe@535 137
universe@535 138 TEST_F(BufferShiftLeft, OvershiftPosOnly) {
universe@535 139 buf.pos = 2;
universe@535 140 ASSERT_EQ(buf.size, 4);
universe@535 141 int ret = cxBufferShiftLeft(&buf, 3);
universe@535 142 EXPECT_EQ(ret, 0);
universe@535 143 EXPECT_EQ(buf.pos, 0);
universe@535 144 EXPECT_EQ(buf.size, 1);
universe@535 145 EXPECT_TRUE(memcmp(buf.space, "test________", 8) == 0);
universe@535 146 }
universe@535 147
universe@535 148 TEST_F(BufferShiftLeft, OffsetInterface) {
universe@535 149 buf.pos = 3;
universe@535 150 ASSERT_EQ(buf.size, 4);
universe@535 151 int ret = cxBufferShift(&buf, -2);
universe@535 152 EXPECT_EQ(ret, 0);
universe@535 153 EXPECT_EQ(buf.pos, 1);
universe@535 154 EXPECT_EQ(buf.size, 2);
universe@535 155 EXPECT_TRUE(memcmp(buf.space, "stst________", 8) == 0);
universe@535 156 }
universe@535 157
universe@535 158 class BufferShiftRight : public BufferShiftFixture {
universe@535 159 };
universe@535 160
universe@535 161 TEST_F(BufferShiftRight, Zero) {
universe@535 162 ASSERT_EQ(buf.pos, 4);
universe@535 163 ASSERT_EQ(buf.size, 4);
universe@535 164 int ret = cxBufferShiftRight(&buf, 0);
universe@535 165 EXPECT_EQ(ret, 0);
universe@535 166 EXPECT_EQ(buf.pos, 4);
universe@535 167 EXPECT_EQ(buf.size, 4);
universe@535 168 EXPECT_TRUE(memcmp(buf.space, "test________", 8) == 0);
universe@535 169 }
universe@535 170
universe@535 171 TEST_F(BufferShiftRight, Standard) {
universe@535 172 ASSERT_EQ(buf.pos, 4);
universe@535 173 ASSERT_EQ(buf.size, 4);
universe@535 174 int ret = cxBufferShiftRight(&buf, 3);
universe@535 175 EXPECT_EQ(ret, 0);
universe@535 176 EXPECT_EQ(buf.pos, 7);
universe@535 177 EXPECT_EQ(buf.size, 7);
universe@535 178 EXPECT_TRUE(memcmp(buf.space, "testest_____", 8) == 0);
universe@535 179 }
universe@535 180
universe@535 181 TEST_F(BufferShiftRight, OvershiftDiscard) {
universe@535 182 ASSERT_EQ(buf.pos, 4);
universe@535 183 ASSERT_EQ(buf.size, 4);
universe@535 184 ASSERT_EQ(buf.capacity, 8);
universe@535 185 int ret = cxBufferShiftRight(&buf, 6);
universe@535 186 EXPECT_EQ(ret, 0);
universe@535 187 EXPECT_EQ(buf.pos, 8);
universe@535 188 EXPECT_EQ(buf.size, 8);
universe@535 189 EXPECT_EQ(buf.capacity, 8);
universe@535 190 EXPECT_TRUE(memcmp(buf.space, "test__te____", 8) == 0);
universe@535 191 }
universe@535 192
universe@535 193 TEST_F(BufferShiftRight, OvershiftExtend) {
universe@535 194 ASSERT_EQ(buf.pos, 4);
universe@535 195 ASSERT_EQ(buf.size, 4);
universe@535 196 ASSERT_EQ(buf.capacity, 8);
universe@535 197 buf.flags |= CX_BUFFER_AUTO_EXTEND;
universe@535 198 int ret = cxBufferShiftRight(&buf, 6);
universe@535 199 EXPECT_EQ(ret, 0);
universe@535 200 EXPECT_EQ(buf.pos, 10);
universe@535 201 EXPECT_EQ(buf.size, 10);
universe@535 202 EXPECT_GE(buf.capacity, 10);
universe@535 203 EXPECT_TRUE(memcmp(buf.space, "test__test__", 8) == 0);
universe@535 204 }
universe@535 205
universe@535 206 TEST_F(BufferShiftRight, OffsetInterface) {
universe@535 207 buf.pos = 3;
universe@535 208 ASSERT_EQ(buf.size, 4);
universe@535 209 int ret = cxBufferShift(&buf, 2);
universe@535 210 EXPECT_EQ(ret, 0);
universe@535 211 EXPECT_EQ(buf.pos, 5);
universe@535 212 EXPECT_EQ(buf.size, 6);
universe@535 213 EXPECT_TRUE(memcmp(buf.space, "tetest______", 8) == 0);
universe@535 214 }
universe@535 215
universe@535 216 TEST(BufferMinimumCapacity, Sufficient) {
universe@535 217 CxTestingAllocator alloc;
universe@535 218 auto space = cxMalloc(&alloc, 8);
universe@535 219 CxBuffer buf;
universe@535 220 cxBufferInit(&buf, space, 8, &alloc, CX_BUFFER_FREE_CONTENTS);
universe@535 221 memcpy(space, "Testing", 8);
universe@535 222 buf.size = 8;
universe@535 223 cxBufferMinimumCapacity(&buf, 6);
universe@535 224 EXPECT_EQ(buf.capacity, 8);
universe@535 225 EXPECT_EQ(buf.size, 8);
universe@535 226 EXPECT_TRUE(memcmp(buf.space, "Testing", 8) == 0);
universe@535 227 cxBufferDestroy(&buf);
universe@535 228 EXPECT_TRUE(alloc.verify());
universe@535 229 }
universe@535 230
universe@535 231 TEST(BufferMinimumCapacity, Extend) {
universe@535 232 CxTestingAllocator alloc;
universe@535 233 auto space = cxMalloc(&alloc, 8);
universe@535 234 CxBuffer buf;
universe@535 235 cxBufferInit(&buf, space, 8, &alloc, CX_BUFFER_FREE_CONTENTS); // NO auto extend!
universe@535 236 memcpy(space, "Testing", 8);
universe@535 237 buf.size = 8;
universe@535 238 cxBufferMinimumCapacity(&buf, 16);
universe@535 239 EXPECT_EQ(buf.capacity, 16);
universe@535 240 EXPECT_EQ(buf.size, 8);
universe@535 241 EXPECT_TRUE(memcmp(buf.space, "Testing", 8) == 0);
universe@535 242 cxBufferDestroy(&buf);
universe@535 243 EXPECT_TRUE(alloc.verify());
universe@535 244 }
universe@536 245
universe@536 246 TEST(BufferClear, Test) {
universe@536 247 char space[16];
universe@536 248 strcpy(space, "clear test");
universe@536 249 CxBuffer buf;
universe@536 250 cxBufferInit(&buf, space, 16, cxDefaultAllocator, CX_BUFFER_DEFAULT);
universe@536 251 ASSERT_EQ(buf.size, 0);
universe@536 252 // only clear the used part of the buffer
universe@536 253 cxBufferClear(&buf);
universe@536 254 EXPECT_EQ(memcmp(space, "clear test", 10), 0);
universe@536 255 buf.size = 5;
universe@536 256 buf.pos = 3;
universe@536 257 cxBufferClear(&buf);
universe@536 258 EXPECT_EQ(memcmp(space, "\0\0\0\0\0 test", 10), 0);
universe@536 259 EXPECT_EQ(buf.size, 0);
universe@536 260 EXPECT_EQ(buf.pos, 0);
universe@538 261 cxBufferDestroy(&buf);
universe@536 262 }
universe@538 263
universe@538 264 class BufferWrite : public ::testing::Test {
universe@538 265 protected:
universe@538 266 CxBuffer buf{};
universe@538 267
universe@538 268 void SetUp() override {
universe@538 269 cxBufferInit(&buf, nullptr, 16, cxDefaultAllocator, CX_BUFFER_DEFAULT);
universe@538 270 buf.capacity = 8; // artificially reduce capacity to check OOB writes
universe@538 271 memset(buf.space, 0, 16);
universe@538 272 memcpy(buf.space, "prep", 4);
universe@538 273 buf.size = buf.pos = 4;
universe@538 274 }
universe@538 275
universe@538 276 void TearDown() override {
universe@538 277 cxBufferDestroy(&buf);
universe@538 278 }
universe@538 279 };
universe@538 280
universe@538 281 TEST_F(BufferWrite, SizeOneFit) {
universe@538 282 const char *data = "test";
universe@538 283 ASSERT_EQ(buf.capacity, 8);
universe@538 284 ASSERT_EQ(buf.pos, 4);
universe@538 285 size_t written = cxBufferWrite(data, 1, 4, &buf);
universe@538 286 EXPECT_EQ(written, 4);
universe@538 287 EXPECT_EQ(buf.size, 8);
universe@538 288 EXPECT_EQ(buf.pos, 8);
universe@538 289 EXPECT_EQ(buf.capacity, 8);
universe@538 290 EXPECT_EQ(memcmp(buf.space, "preptest", 8), 0);
universe@538 291 }
universe@538 292
universe@538 293 TEST_F(BufferWrite, SizeOneOverwrite) {
universe@538 294
universe@538 295 }
universe@538 296
universe@538 297 TEST_F(BufferWrite, SizeOnePartialOverwrite) {
universe@538 298
universe@538 299 }
universe@538 300
universe@538 301 TEST_F(BufferWrite, SizeOneDiscard) {
universe@538 302 const char *data = "testing";
universe@538 303 ASSERT_EQ(buf.capacity, 8);
universe@538 304 ASSERT_EQ(buf.pos, 4);
universe@538 305 size_t written = cxBufferWrite(data, 1, 7, &buf);
universe@538 306 EXPECT_EQ(written, 4);
universe@538 307 EXPECT_EQ(buf.size, 8);
universe@538 308 EXPECT_EQ(buf.pos, 8);
universe@538 309 EXPECT_EQ(buf.capacity, 8);
universe@538 310 EXPECT_EQ(memcmp(buf.space, "preptest\0", 9), 0);
universe@538 311 }
universe@538 312
universe@538 313 TEST_F(BufferWrite, SizeOneExtend) {
universe@538 314 buf.flags |= CX_BUFFER_AUTO_EXTEND;
universe@538 315 const char *data = "testing";
universe@538 316 ASSERT_EQ(buf.capacity, 8);
universe@538 317 ASSERT_EQ(buf.pos, 4);
universe@538 318 size_t written = cxBufferWrite(data, 1, 7, &buf);
universe@538 319 EXPECT_EQ(written, 7);
universe@538 320 EXPECT_EQ(buf.size, 11);
universe@538 321 EXPECT_EQ(buf.pos, 11);
universe@538 322 EXPECT_GE(buf.capacity, 11);
universe@538 323 EXPECT_EQ(memcmp(buf.space, "preptesting", 11), 0);
universe@538 324 }
universe@538 325
universe@538 326 TEST_F(BufferWrite, MultibyteOverwrite) {
universe@538 327
universe@538 328 }
universe@538 329
universe@538 330 TEST_F(BufferWrite, MultibytePartialOverwrite) {
universe@538 331
universe@538 332 }
universe@538 333
universe@538 334 TEST_F(BufferWrite, MultibyteFit) {
universe@538 335
universe@538 336 }
universe@538 337
universe@538 338 TEST_F(BufferWrite, MultibyteDiscard) {
universe@538 339 // remember: whole elements are discarded if they do not fit
universe@538 340 }
universe@538 341
universe@538 342 TEST_F(BufferWrite, MultibyteExtend) {
universe@538 343
universe@538 344 }
universe@538 345
universe@538 346 TEST_F(BufferWrite, PutcWrapperFit) {
universe@538 347
universe@538 348 }
universe@538 349
universe@538 350 TEST_F(BufferWrite, PutcWrapperOverwrite) {
universe@538 351
universe@538 352 }
universe@538 353
universe@538 354 TEST_F(BufferWrite, PutcWrapperPartialOverwrite) {
universe@538 355
universe@538 356 }
universe@538 357
universe@538 358 TEST_F(BufferWrite, PutcWrapperDiscard) {
universe@538 359
universe@538 360 }
universe@538 361
universe@538 362 TEST_F(BufferWrite, PutcWrapperExtend) {
universe@538 363
universe@538 364 }
universe@538 365
universe@538 366 TEST_F(BufferWrite, PutStringWrapperFit) {
universe@538 367
universe@538 368 }
universe@538 369
universe@538 370 TEST_F(BufferWrite, PutStringWrapperOverwrite) {
universe@538 371
universe@538 372 }
universe@538 373
universe@538 374 TEST_F(BufferWrite, PutStringWrapperPartialOverwrite) {
universe@538 375
universe@538 376 }
universe@538 377
universe@538 378 TEST_F(BufferWrite, PutStringWrapperDiscard) {
universe@538 379
universe@538 380 }
universe@538 381
universe@538 382 TEST_F(BufferWrite, PutStringWrapperExtend) {
universe@538 383
universe@538 384 }

mercurial