test/test_buffer.cpp

Sun, 01 May 2022 16:12:13 +0200

author
Mike Becker <universe@uap-core.de>
date
Sun, 01 May 2022 16:12:13 +0200
changeset 545
3700ac4bd9a3
parent 542
45bcfd152f85
child 546
900795d59d03
permissions
-rw-r--r--

#184 #170 first basic flush test

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@539 34 static void expect_default_flush_config(CxBuffer *buf) {
universe@539 35 EXPECT_EQ(buf->flush_blkmax, 0);
universe@539 36 EXPECT_EQ(buf->flush_blksize, 4096);
universe@539 37 EXPECT_EQ(buf->flush_threshold, SIZE_MAX);
universe@539 38 EXPECT_EQ(buf->flush_func, nullptr);
universe@541 39 EXPECT_EQ(buf->flush_target, nullptr);
universe@539 40 }
universe@539 41
universe@535 42 TEST(BufferInit, WrapSpace) {
universe@535 43 CxTestingAllocator alloc;
universe@530 44 CxBuffer buf;
universe@535 45 void *space = cxMalloc(&alloc, 16);
universe@535 46 cxBufferInit(&buf, space, 16, &alloc, CX_BUFFER_DEFAULT);
universe@539 47 expect_default_flush_config(&buf);
universe@530 48 EXPECT_EQ(buf.space, space);
universe@530 49 EXPECT_EQ(buf.flags & CX_BUFFER_AUTO_EXTEND, 0);
universe@530 50 EXPECT_EQ(buf.flags & CX_BUFFER_FREE_CONTENTS, 0);
universe@530 51 EXPECT_EQ(buf.pos, 0);
universe@530 52 EXPECT_EQ(buf.size, 0);
universe@530 53 EXPECT_EQ(buf.capacity, 16);
universe@535 54 EXPECT_EQ(buf.allocator, &alloc);
universe@530 55 cxBufferDestroy(&buf);
universe@535 56 EXPECT_FALSE(alloc.verify());
universe@535 57 cxFree(&alloc, space);
universe@535 58 EXPECT_TRUE(alloc.verify());
universe@530 59 }
universe@530 60
universe@539 61 TEST(BufferInit, WrapSpaceAutoExtend) {
universe@539 62 CxTestingAllocator alloc;
universe@539 63 CxBuffer buf;
universe@539 64 void *space = cxMalloc(&alloc, 16);
universe@539 65 cxBufferInit(&buf, space, 16, &alloc, CX_BUFFER_AUTO_EXTEND);
universe@539 66 expect_default_flush_config(&buf);
universe@539 67 EXPECT_EQ(buf.space, space);
universe@539 68 EXPECT_EQ(buf.flags & CX_BUFFER_AUTO_EXTEND, CX_BUFFER_AUTO_EXTEND);
universe@539 69 EXPECT_EQ(buf.flags & CX_BUFFER_FREE_CONTENTS, 0);
universe@539 70 EXPECT_EQ(buf.pos, 0);
universe@539 71 EXPECT_EQ(buf.size, 0);
universe@539 72 EXPECT_EQ(buf.capacity, 16);
universe@539 73 EXPECT_EQ(buf.allocator, &alloc);
universe@539 74 cxBufferDestroy(&buf);
universe@539 75 EXPECT_FALSE(alloc.verify());
universe@539 76 cxFree(&alloc, space);
universe@539 77 EXPECT_TRUE(alloc.verify());
universe@539 78 }
universe@539 79
universe@535 80 TEST(BufferInit, WrapSpaceAutoFree) {
universe@535 81 CxTestingAllocator alloc;
universe@530 82 CxBuffer buf;
universe@535 83 void *space = cxMalloc(&alloc, 16);
universe@535 84 cxBufferInit(&buf, space, 16, &alloc, CX_BUFFER_FREE_CONTENTS);
universe@539 85 expect_default_flush_config(&buf);
universe@530 86 EXPECT_EQ(buf.space, space);
universe@530 87 EXPECT_EQ(buf.flags & CX_BUFFER_AUTO_EXTEND, 0);
universe@530 88 EXPECT_EQ(buf.flags & CX_BUFFER_FREE_CONTENTS, CX_BUFFER_FREE_CONTENTS);
universe@530 89 EXPECT_EQ(buf.pos, 0);
universe@530 90 EXPECT_EQ(buf.size, 0);
universe@530 91 EXPECT_EQ(buf.capacity, 16);
universe@535 92 EXPECT_EQ(buf.allocator, &alloc);
universe@535 93 EXPECT_FALSE(alloc.verify());
universe@530 94 cxBufferDestroy(&buf);
universe@535 95 EXPECT_TRUE(alloc.verify());
universe@530 96 }
universe@535 97
universe@535 98 TEST(BufferInit, FreshSpace) {
universe@535 99 CxTestingAllocator alloc;
universe@535 100 CxBuffer buf;
universe@535 101 cxBufferInit(&buf, nullptr, 8, &alloc, CX_BUFFER_DEFAULT);
universe@539 102 expect_default_flush_config(&buf);
universe@535 103 EXPECT_NE(buf.space, nullptr);
universe@535 104 EXPECT_EQ(buf.flags & CX_BUFFER_AUTO_EXTEND, 0);
universe@535 105 EXPECT_EQ(buf.flags & CX_BUFFER_FREE_CONTENTS, CX_BUFFER_FREE_CONTENTS);
universe@535 106 EXPECT_EQ(buf.pos, 0);
universe@535 107 EXPECT_EQ(buf.size, 0);
universe@535 108 EXPECT_EQ(buf.capacity, 8);
universe@535 109 EXPECT_EQ(buf.allocator, &alloc);
universe@535 110 EXPECT_FALSE(alloc.verify()); // space is still allocated
universe@535 111 cxBufferDestroy(&buf);
universe@535 112 EXPECT_TRUE(alloc.verify());
universe@535 113 }
universe@535 114
universe@535 115 class BufferShiftFixture : public ::testing::Test {
universe@535 116 protected:
universe@535 117 void SetUp() override {
universe@535 118 ASSERT_TRUE(alloc.verify());
universe@535 119 cxBufferInit(&buf, nullptr, 16, &alloc, CX_BUFFER_DEFAULT);
universe@535 120 memcpy(buf.space, "test____________", 16);
universe@535 121 buf.capacity = 8; // purposely pretend that the buffer has less capacity s.t. we can test beyond the range
universe@535 122 buf.pos = 4;
universe@535 123 buf.size = 4;
universe@535 124 }
universe@535 125
universe@535 126 void TearDown() override {
universe@535 127 cxBufferDestroy(&buf);
universe@535 128 EXPECT_TRUE(alloc.verify());
universe@535 129 }
universe@535 130
universe@535 131 CxTestingAllocator alloc;
universe@535 132 CxBuffer buf{};
universe@535 133 };
universe@535 134
universe@535 135 class BufferShiftLeft : public BufferShiftFixture {
universe@535 136 };
universe@535 137
universe@535 138 TEST_F(BufferShiftLeft, Zero) {
universe@535 139 ASSERT_EQ(buf.pos, 4);
universe@535 140 ASSERT_EQ(buf.size, 4);
universe@535 141 int ret = cxBufferShiftLeft(&buf, 0);
universe@535 142 EXPECT_EQ(ret, 0);
universe@535 143 EXPECT_EQ(buf.pos, 4);
universe@535 144 EXPECT_EQ(buf.size, 4);
universe@535 145 EXPECT_TRUE(memcmp(buf.space, "test________", 8) == 0);
universe@535 146 }
universe@535 147
universe@535 148 TEST_F(BufferShiftLeft, Standard) {
universe@535 149 ASSERT_EQ(buf.pos, 4);
universe@535 150 ASSERT_EQ(buf.size, 4);
universe@535 151 int ret = cxBufferShiftLeft(&buf, 2);
universe@535 152 EXPECT_EQ(ret, 0);
universe@535 153 EXPECT_EQ(buf.pos, 2);
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 TEST_F(BufferShiftLeft, Overshift) {
universe@535 159 ASSERT_LT(buf.pos, 6);
universe@535 160 ASSERT_LT(buf.size, 6);
universe@535 161 int ret = cxBufferShiftLeft(&buf, 6);
universe@535 162 EXPECT_EQ(ret, 0);
universe@535 163 EXPECT_EQ(buf.pos, 0);
universe@535 164 EXPECT_EQ(buf.size, 0);
universe@535 165 EXPECT_TRUE(memcmp(buf.space, "test________", 8) == 0);
universe@535 166 }
universe@535 167
universe@535 168 TEST_F(BufferShiftLeft, OvershiftPosOnly) {
universe@535 169 buf.pos = 2;
universe@535 170 ASSERT_EQ(buf.size, 4);
universe@535 171 int ret = cxBufferShiftLeft(&buf, 3);
universe@535 172 EXPECT_EQ(ret, 0);
universe@535 173 EXPECT_EQ(buf.pos, 0);
universe@535 174 EXPECT_EQ(buf.size, 1);
universe@535 175 EXPECT_TRUE(memcmp(buf.space, "test________", 8) == 0);
universe@535 176 }
universe@535 177
universe@535 178 TEST_F(BufferShiftLeft, OffsetInterface) {
universe@535 179 buf.pos = 3;
universe@535 180 ASSERT_EQ(buf.size, 4);
universe@535 181 int ret = cxBufferShift(&buf, -2);
universe@535 182 EXPECT_EQ(ret, 0);
universe@535 183 EXPECT_EQ(buf.pos, 1);
universe@535 184 EXPECT_EQ(buf.size, 2);
universe@535 185 EXPECT_TRUE(memcmp(buf.space, "stst________", 8) == 0);
universe@535 186 }
universe@535 187
universe@535 188 class BufferShiftRight : public BufferShiftFixture {
universe@535 189 };
universe@535 190
universe@535 191 TEST_F(BufferShiftRight, Zero) {
universe@535 192 ASSERT_EQ(buf.pos, 4);
universe@535 193 ASSERT_EQ(buf.size, 4);
universe@535 194 int ret = cxBufferShiftRight(&buf, 0);
universe@535 195 EXPECT_EQ(ret, 0);
universe@535 196 EXPECT_EQ(buf.pos, 4);
universe@535 197 EXPECT_EQ(buf.size, 4);
universe@535 198 EXPECT_TRUE(memcmp(buf.space, "test________", 8) == 0);
universe@535 199 }
universe@535 200
universe@535 201 TEST_F(BufferShiftRight, Standard) {
universe@535 202 ASSERT_EQ(buf.pos, 4);
universe@535 203 ASSERT_EQ(buf.size, 4);
universe@535 204 int ret = cxBufferShiftRight(&buf, 3);
universe@535 205 EXPECT_EQ(ret, 0);
universe@535 206 EXPECT_EQ(buf.pos, 7);
universe@535 207 EXPECT_EQ(buf.size, 7);
universe@535 208 EXPECT_TRUE(memcmp(buf.space, "testest_____", 8) == 0);
universe@535 209 }
universe@535 210
universe@535 211 TEST_F(BufferShiftRight, OvershiftDiscard) {
universe@535 212 ASSERT_EQ(buf.pos, 4);
universe@535 213 ASSERT_EQ(buf.size, 4);
universe@535 214 ASSERT_EQ(buf.capacity, 8);
universe@535 215 int ret = cxBufferShiftRight(&buf, 6);
universe@535 216 EXPECT_EQ(ret, 0);
universe@535 217 EXPECT_EQ(buf.pos, 8);
universe@535 218 EXPECT_EQ(buf.size, 8);
universe@535 219 EXPECT_EQ(buf.capacity, 8);
universe@535 220 EXPECT_TRUE(memcmp(buf.space, "test__te____", 8) == 0);
universe@535 221 }
universe@535 222
universe@535 223 TEST_F(BufferShiftRight, OvershiftExtend) {
universe@535 224 ASSERT_EQ(buf.pos, 4);
universe@535 225 ASSERT_EQ(buf.size, 4);
universe@535 226 ASSERT_EQ(buf.capacity, 8);
universe@535 227 buf.flags |= CX_BUFFER_AUTO_EXTEND;
universe@535 228 int ret = cxBufferShiftRight(&buf, 6);
universe@535 229 EXPECT_EQ(ret, 0);
universe@535 230 EXPECT_EQ(buf.pos, 10);
universe@535 231 EXPECT_EQ(buf.size, 10);
universe@535 232 EXPECT_GE(buf.capacity, 10);
universe@535 233 EXPECT_TRUE(memcmp(buf.space, "test__test__", 8) == 0);
universe@535 234 }
universe@535 235
universe@535 236 TEST_F(BufferShiftRight, OffsetInterface) {
universe@535 237 buf.pos = 3;
universe@535 238 ASSERT_EQ(buf.size, 4);
universe@535 239 int ret = cxBufferShift(&buf, 2);
universe@535 240 EXPECT_EQ(ret, 0);
universe@535 241 EXPECT_EQ(buf.pos, 5);
universe@535 242 EXPECT_EQ(buf.size, 6);
universe@535 243 EXPECT_TRUE(memcmp(buf.space, "tetest______", 8) == 0);
universe@535 244 }
universe@535 245
universe@535 246 TEST(BufferMinimumCapacity, Sufficient) {
universe@535 247 CxTestingAllocator alloc;
universe@535 248 auto space = cxMalloc(&alloc, 8);
universe@535 249 CxBuffer buf;
universe@535 250 cxBufferInit(&buf, space, 8, &alloc, CX_BUFFER_FREE_CONTENTS);
universe@535 251 memcpy(space, "Testing", 8);
universe@535 252 buf.size = 8;
universe@535 253 cxBufferMinimumCapacity(&buf, 6);
universe@535 254 EXPECT_EQ(buf.capacity, 8);
universe@535 255 EXPECT_EQ(buf.size, 8);
universe@535 256 EXPECT_TRUE(memcmp(buf.space, "Testing", 8) == 0);
universe@535 257 cxBufferDestroy(&buf);
universe@535 258 EXPECT_TRUE(alloc.verify());
universe@535 259 }
universe@535 260
universe@535 261 TEST(BufferMinimumCapacity, Extend) {
universe@535 262 CxTestingAllocator alloc;
universe@535 263 auto space = cxMalloc(&alloc, 8);
universe@535 264 CxBuffer buf;
universe@535 265 cxBufferInit(&buf, space, 8, &alloc, CX_BUFFER_FREE_CONTENTS); // NO auto extend!
universe@535 266 memcpy(space, "Testing", 8);
universe@535 267 buf.size = 8;
universe@535 268 cxBufferMinimumCapacity(&buf, 16);
universe@535 269 EXPECT_EQ(buf.capacity, 16);
universe@535 270 EXPECT_EQ(buf.size, 8);
universe@535 271 EXPECT_TRUE(memcmp(buf.space, "Testing", 8) == 0);
universe@535 272 cxBufferDestroy(&buf);
universe@535 273 EXPECT_TRUE(alloc.verify());
universe@535 274 }
universe@536 275
universe@536 276 TEST(BufferClear, Test) {
universe@536 277 char space[16];
universe@536 278 strcpy(space, "clear test");
universe@536 279 CxBuffer buf;
universe@536 280 cxBufferInit(&buf, space, 16, cxDefaultAllocator, CX_BUFFER_DEFAULT);
universe@536 281 ASSERT_EQ(buf.size, 0);
universe@536 282 // only clear the used part of the buffer
universe@536 283 cxBufferClear(&buf);
universe@536 284 EXPECT_EQ(memcmp(space, "clear test", 10), 0);
universe@536 285 buf.size = 5;
universe@536 286 buf.pos = 3;
universe@536 287 cxBufferClear(&buf);
universe@536 288 EXPECT_EQ(memcmp(space, "\0\0\0\0\0 test", 10), 0);
universe@536 289 EXPECT_EQ(buf.size, 0);
universe@536 290 EXPECT_EQ(buf.pos, 0);
universe@538 291 cxBufferDestroy(&buf);
universe@536 292 }
universe@538 293
universe@538 294 class BufferWrite : public ::testing::Test {
universe@538 295 protected:
universe@545 296 CxBuffer buf{}, target{};
universe@538 297
universe@538 298 void SetUp() override {
universe@545 299 cxBufferInit(&target, nullptr, 16, cxDefaultAllocator, CX_BUFFER_AUTO_EXTEND);
universe@538 300 cxBufferInit(&buf, nullptr, 16, cxDefaultAllocator, CX_BUFFER_DEFAULT);
universe@538 301 buf.capacity = 8; // artificially reduce capacity to check OOB writes
universe@538 302 memset(buf.space, 0, 16);
universe@538 303 memcpy(buf.space, "prep", 4);
universe@538 304 buf.size = buf.pos = 4;
universe@538 305 }
universe@538 306
universe@538 307 void TearDown() override {
universe@538 308 cxBufferDestroy(&buf);
universe@545 309 cxBufferDestroy(&target);
universe@545 310 }
universe@545 311
universe@545 312 void enableFlushing() {
universe@545 313 buf.flush_target = &target;
universe@545 314 buf.flush_func = reinterpret_cast<cx_write_func>(cxBufferWrite);
universe@545 315 buf.flush_blkmax = 1;
universe@538 316 }
universe@538 317 };
universe@538 318
universe@538 319 TEST_F(BufferWrite, SizeOneFit) {
universe@538 320 const char *data = "test";
universe@538 321 ASSERT_EQ(buf.capacity, 8);
universe@538 322 ASSERT_EQ(buf.pos, 4);
universe@541 323 ASSERT_EQ(buf.size, 4);
universe@538 324 size_t written = cxBufferWrite(data, 1, 4, &buf);
universe@538 325 EXPECT_EQ(written, 4);
universe@538 326 EXPECT_EQ(buf.size, 8);
universe@538 327 EXPECT_EQ(buf.pos, 8);
universe@538 328 EXPECT_EQ(buf.capacity, 8);
universe@538 329 EXPECT_EQ(memcmp(buf.space, "preptest", 8), 0);
universe@538 330 }
universe@538 331
universe@538 332 TEST_F(BufferWrite, SizeOneDiscard) {
universe@538 333 const char *data = "testing";
universe@538 334 ASSERT_EQ(buf.capacity, 8);
universe@538 335 ASSERT_EQ(buf.pos, 4);
universe@541 336 ASSERT_EQ(buf.size, 4);
universe@538 337 size_t written = cxBufferWrite(data, 1, 7, &buf);
universe@538 338 EXPECT_EQ(written, 4);
universe@538 339 EXPECT_EQ(buf.size, 8);
universe@538 340 EXPECT_EQ(buf.pos, 8);
universe@538 341 EXPECT_EQ(buf.capacity, 8);
universe@538 342 EXPECT_EQ(memcmp(buf.space, "preptest\0", 9), 0);
universe@538 343 }
universe@538 344
universe@538 345 TEST_F(BufferWrite, SizeOneExtend) {
universe@538 346 buf.flags |= CX_BUFFER_AUTO_EXTEND;
universe@538 347 const char *data = "testing";
universe@538 348 ASSERT_EQ(buf.capacity, 8);
universe@538 349 ASSERT_EQ(buf.pos, 4);
universe@541 350 ASSERT_EQ(buf.size, 4);
universe@538 351 size_t written = cxBufferWrite(data, 1, 7, &buf);
universe@538 352 EXPECT_EQ(written, 7);
universe@538 353 EXPECT_EQ(buf.size, 11);
universe@538 354 EXPECT_EQ(buf.pos, 11);
universe@538 355 EXPECT_GE(buf.capacity, 11);
universe@538 356 EXPECT_EQ(memcmp(buf.space, "preptesting", 11), 0);
universe@538 357 }
universe@538 358
universe@538 359 TEST_F(BufferWrite, MultibyteFit) {
universe@541 360 const char *data = "test";
universe@541 361 ASSERT_EQ(buf.capacity, 8);
universe@541 362 ASSERT_EQ(buf.pos, 4);
universe@541 363 ASSERT_EQ(buf.size, 4);
universe@541 364 size_t written = cxBufferWrite(data, 2, 2, &buf);
universe@541 365 EXPECT_EQ(written, 2);
universe@541 366 EXPECT_EQ(buf.size, 8);
universe@541 367 EXPECT_EQ(buf.pos, 8);
universe@541 368 EXPECT_EQ(buf.capacity, 8);
universe@541 369 EXPECT_EQ(memcmp(buf.space, "preptest", 8), 0);
universe@538 370 }
universe@538 371
universe@538 372 TEST_F(BufferWrite, MultibyteDiscard) {
universe@542 373 const char *data = "testing";
universe@541 374 ASSERT_EQ(buf.capacity, 8);
universe@541 375 ASSERT_EQ(buf.size, 4);
universe@541 376 buf.pos = 3;
universe@542 377 size_t written = cxBufferWrite(data, 2, 4, &buf);
universe@538 378 // remember: whole elements are discarded if they do not fit
universe@541 379 EXPECT_EQ(written, 2);
universe@541 380 EXPECT_EQ(buf.size, 7);
universe@541 381 EXPECT_EQ(buf.pos, 7);
universe@541 382 EXPECT_EQ(buf.capacity, 8);
universe@541 383 EXPECT_EQ(memcmp(buf.space, "pretest\0", 8), 0);
universe@538 384 }
universe@538 385
universe@538 386 TEST_F(BufferWrite, MultibyteExtend) {
universe@541 387 buf.flags |= CX_BUFFER_AUTO_EXTEND;
universe@541 388 const char *data = "tester";
universe@541 389 ASSERT_EQ(buf.capacity, 8);
universe@541 390 ASSERT_EQ(buf.size, 4);
universe@541 391 buf.pos = 3;
universe@541 392 size_t written = cxBufferWrite(data, 2, 3, &buf);
universe@541 393 // remember: whole elements are discarded if they do not fit
universe@541 394 EXPECT_EQ(written, 3);
universe@541 395 EXPECT_EQ(buf.size, 9);
universe@541 396 EXPECT_EQ(buf.pos, 9);
universe@541 397 EXPECT_GE(buf.capacity, 9);
universe@541 398 EXPECT_EQ(memcmp(buf.space, "pretester\0", 10), 0);
universe@538 399 }
universe@538 400
universe@538 401 TEST_F(BufferWrite, PutcWrapperFit) {
universe@541 402 ASSERT_EQ(buf.capacity, 8);
universe@541 403 ASSERT_EQ(buf.pos, 4);
universe@541 404 ASSERT_EQ(buf.size, 4);
universe@541 405 int c = cxBufferPut(&buf, 0x20 | 'a');
universe@541 406 EXPECT_EQ(c, 'a');
universe@541 407 EXPECT_EQ(buf.size, 5);
universe@541 408 EXPECT_EQ(buf.pos, 5);
universe@541 409 EXPECT_EQ(buf.capacity, 8);
universe@541 410 EXPECT_EQ(memcmp(buf.space, "prepa\0", 6), 0);
universe@538 411 }
universe@538 412
universe@538 413 TEST_F(BufferWrite, PutcWrapperDiscard) {
universe@541 414 ASSERT_EQ(buf.capacity, 8);
universe@541 415 ASSERT_EQ(buf.size, 4);
universe@541 416 buf.pos = 8;
universe@541 417 int c = cxBufferPut(&buf, 0x20 | 'a');
universe@541 418 EXPECT_EQ(c, EOF);
universe@541 419 EXPECT_EQ(buf.size, 4);
universe@541 420 EXPECT_EQ(buf.pos, 8);
universe@541 421 EXPECT_EQ(buf.capacity, 8);
universe@541 422 EXPECT_EQ(memcmp(buf.space, "prep\0\0\0\0\0", 9), 0);
universe@538 423 }
universe@538 424
universe@538 425 TEST_F(BufferWrite, PutcWrapperExtend) {
universe@541 426 buf.flags |= CX_BUFFER_AUTO_EXTEND;
universe@541 427 ASSERT_EQ(buf.capacity, 8);
universe@541 428 ASSERT_EQ(buf.size, 4);
universe@541 429 buf.pos = 8;
universe@541 430 int c = cxBufferPut(&buf, 0x20 | 'a');
universe@541 431 EXPECT_EQ(c, 'a');
universe@541 432 EXPECT_EQ(buf.size, 9);
universe@541 433 EXPECT_EQ(buf.pos, 9);
universe@541 434 EXPECT_GE(buf.capacity, 9);
universe@541 435 EXPECT_EQ(memcmp(buf.space, "prep\0\0\0\0a\0", 10), 0);
universe@538 436 }
universe@538 437
universe@538 438 TEST_F(BufferWrite, PutStringWrapperFit) {
universe@541 439 const char *data = "test";
universe@541 440 ASSERT_EQ(buf.capacity, 8);
universe@541 441 ASSERT_EQ(buf.pos, 4);
universe@541 442 ASSERT_EQ(buf.size, 4);
universe@541 443 size_t written = cxBufferPutString(&buf, data);
universe@541 444 EXPECT_EQ(written, 4);
universe@541 445 EXPECT_EQ(buf.size, 8);
universe@541 446 EXPECT_EQ(buf.pos, 8);
universe@541 447 EXPECT_EQ(buf.capacity, 8);
universe@541 448 EXPECT_EQ(memcmp(buf.space, "preptest", 8), 0);
universe@538 449 }
universe@538 450
universe@538 451 TEST_F(BufferWrite, PutStringWrapperDiscard) {
universe@541 452 const char *data = "testing";
universe@541 453 ASSERT_EQ(buf.capacity, 8);
universe@541 454 ASSERT_EQ(buf.pos, 4);
universe@541 455 ASSERT_EQ(buf.size, 4);
universe@541 456 size_t written = cxBufferPutString(&buf, data);
universe@541 457 EXPECT_EQ(written, 4);
universe@541 458 EXPECT_EQ(buf.size, 8);
universe@541 459 EXPECT_EQ(buf.pos, 8);
universe@541 460 EXPECT_EQ(buf.capacity, 8);
universe@541 461 EXPECT_EQ(memcmp(buf.space, "preptest\0", 9), 0);
universe@538 462 }
universe@538 463
universe@538 464 TEST_F(BufferWrite, PutStringWrapperExtend) {
universe@541 465 buf.flags |= CX_BUFFER_AUTO_EXTEND;
universe@541 466 const char *data = "testing";
universe@541 467 ASSERT_EQ(buf.capacity, 8);
universe@541 468 ASSERT_EQ(buf.pos, 4);
universe@541 469 ASSERT_EQ(buf.size, 4);
universe@541 470 size_t written = cxBufferPutString(&buf, data);
universe@541 471 EXPECT_EQ(written, 7);
universe@541 472 EXPECT_EQ(buf.size, 11);
universe@541 473 EXPECT_EQ(buf.pos, 11);
universe@541 474 EXPECT_GE(buf.capacity, 11);
universe@541 475 EXPECT_EQ(memcmp(buf.space, "preptesting", 11), 0);
universe@541 476 }
universe@538 477
universe@541 478 TEST_F(BufferWrite, MultOverflow) {
universe@541 479 const char *data = "testing";
universe@541 480 ASSERT_EQ(buf.capacity, 8);
universe@541 481 ASSERT_EQ(buf.pos, 4);
universe@541 482 ASSERT_EQ(buf.size, 4);
universe@541 483 size_t written = cxBufferWrite(data, 8, SIZE_MAX / 4, &buf);
universe@541 484 EXPECT_EQ(written, 0);
universe@541 485 EXPECT_EQ(buf.capacity, 8);
universe@541 486 EXPECT_EQ(buf.pos, 4);
universe@541 487 EXPECT_EQ(buf.size, 4);
universe@541 488 EXPECT_EQ(memcmp(buf.space, "prep\0", 5), 0);
universe@538 489 }
universe@541 490
universe@541 491 TEST_F(BufferWrite, MaxCapaOverflow) {
universe@541 492 buf.flags |= CX_BUFFER_AUTO_EXTEND;
universe@541 493 const char *data = "testing";
universe@541 494 ASSERT_EQ(buf.capacity, 8);
universe@541 495 ASSERT_EQ(buf.pos, 4);
universe@541 496 ASSERT_EQ(buf.size, 4);
universe@541 497 size_t written = cxBufferWrite(data, 1, SIZE_MAX - 2, &buf);
universe@541 498 EXPECT_EQ(written, 0);
universe@541 499 EXPECT_EQ(buf.capacity, 8);
universe@541 500 EXPECT_EQ(buf.pos, 4);
universe@541 501 EXPECT_EQ(buf.size, 4);
universe@541 502 EXPECT_EQ(memcmp(buf.space, "prep\0", 5), 0);
universe@541 503 }
universe@541 504
universe@541 505 TEST_F(BufferWrite, OnlyOverwrite) {
universe@541 506 buf.flags |= CX_BUFFER_AUTO_EXTEND;
universe@541 507 ASSERT_EQ(buf.capacity, 8);
universe@541 508 memcpy(buf.space, "preptest", 8);
universe@541 509 buf.pos = 3;
universe@541 510 buf.size = 8;
universe@541 511 size_t written = cxBufferWrite("XXX", 2, 2, &buf);
universe@541 512 EXPECT_EQ(written, 2);
universe@541 513 EXPECT_EQ(buf.capacity, 8);
universe@541 514 EXPECT_EQ(buf.size, 8);
universe@541 515 EXPECT_EQ(buf.pos, 7);
universe@541 516 EXPECT_EQ(memcmp(buf.space, "preXXX\0t", 8), 0);
universe@541 517 }
universe@545 518
universe@545 519 TEST_F(BufferWrite, FlushAtCapacity) {
universe@545 520 enableFlushing();
universe@545 521 ASSERT_EQ(buf.capacity, 8);
universe@545 522 ASSERT_EQ(buf.pos, 4);
universe@545 523 size_t written = cxBufferWrite("foo", 1, 3, &buf);
universe@545 524 EXPECT_EQ(written, 3);
universe@545 525 ASSERT_EQ(buf.pos, 7);
universe@545 526 ASSERT_EQ(buf.size, 7);
universe@545 527 ASSERT_EQ(target.pos, 0);
universe@545 528 ASSERT_EQ(target.size, 0);
universe@545 529 written = cxBufferWrite("hello", 1, 5, &buf);
universe@545 530 EXPECT_EQ(written, 5);
universe@545 531 EXPECT_EQ(buf.pos, 0);
universe@545 532 EXPECT_EQ(buf.size, 0);
universe@545 533 EXPECT_EQ(buf.capacity, 8);
universe@545 534 EXPECT_EQ(target.pos, 12);
universe@545 535 ASSERT_EQ(target.size, 12);
universe@545 536 EXPECT_EQ(memcmp(target.space, "prepfoohello", 12), 0);
universe@545 537 }

mercurial