test/test_buffer.cpp

Mon, 16 May 2022 19:25:19 +0200

author
Mike Becker <universe@uap-core.de>
date
Mon, 16 May 2022 19:25:19 +0200
changeset 548
459bca1cdf8d
parent 547
9e933920dcf9
child 565
d756746ea94f
permissions
-rw-r--r--

#170 test buffer eof

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@548 34 class BufferFixture : public ::testing::Test {
universe@548 35 protected:
universe@548 36 void SetUp() override {
universe@548 37 cxBufferInit(&buf, nullptr, 16, cxDefaultAllocator, CX_BUFFER_DEFAULT);
universe@548 38 buf.size = 6;
universe@548 39 buf.pos = 3;
universe@548 40 }
universe@548 41
universe@548 42 void TearDown() override {
universe@548 43 cxBufferDestroy(&buf);
universe@548 44 }
universe@548 45
universe@548 46 CxBuffer buf{};
universe@548 47 };
universe@548 48
universe@539 49 static void expect_default_flush_config(CxBuffer *buf) {
universe@539 50 EXPECT_EQ(buf->flush_blkmax, 0);
universe@539 51 EXPECT_EQ(buf->flush_blksize, 4096);
universe@539 52 EXPECT_EQ(buf->flush_threshold, SIZE_MAX);
universe@539 53 EXPECT_EQ(buf->flush_func, nullptr);
universe@541 54 EXPECT_EQ(buf->flush_target, nullptr);
universe@539 55 }
universe@539 56
universe@535 57 TEST(BufferInit, WrapSpace) {
universe@535 58 CxTestingAllocator alloc;
universe@530 59 CxBuffer buf;
universe@535 60 void *space = cxMalloc(&alloc, 16);
universe@535 61 cxBufferInit(&buf, space, 16, &alloc, CX_BUFFER_DEFAULT);
universe@539 62 expect_default_flush_config(&buf);
universe@530 63 EXPECT_EQ(buf.space, space);
universe@530 64 EXPECT_EQ(buf.flags & CX_BUFFER_AUTO_EXTEND, 0);
universe@530 65 EXPECT_EQ(buf.flags & CX_BUFFER_FREE_CONTENTS, 0);
universe@530 66 EXPECT_EQ(buf.pos, 0);
universe@530 67 EXPECT_EQ(buf.size, 0);
universe@530 68 EXPECT_EQ(buf.capacity, 16);
universe@535 69 EXPECT_EQ(buf.allocator, &alloc);
universe@530 70 cxBufferDestroy(&buf);
universe@535 71 EXPECT_FALSE(alloc.verify());
universe@535 72 cxFree(&alloc, space);
universe@535 73 EXPECT_TRUE(alloc.verify());
universe@530 74 }
universe@530 75
universe@539 76 TEST(BufferInit, WrapSpaceAutoExtend) {
universe@539 77 CxTestingAllocator alloc;
universe@539 78 CxBuffer buf;
universe@539 79 void *space = cxMalloc(&alloc, 16);
universe@539 80 cxBufferInit(&buf, space, 16, &alloc, CX_BUFFER_AUTO_EXTEND);
universe@539 81 expect_default_flush_config(&buf);
universe@539 82 EXPECT_EQ(buf.space, space);
universe@539 83 EXPECT_EQ(buf.flags & CX_BUFFER_AUTO_EXTEND, CX_BUFFER_AUTO_EXTEND);
universe@539 84 EXPECT_EQ(buf.flags & CX_BUFFER_FREE_CONTENTS, 0);
universe@539 85 EXPECT_EQ(buf.pos, 0);
universe@539 86 EXPECT_EQ(buf.size, 0);
universe@539 87 EXPECT_EQ(buf.capacity, 16);
universe@539 88 EXPECT_EQ(buf.allocator, &alloc);
universe@539 89 cxBufferDestroy(&buf);
universe@539 90 EXPECT_FALSE(alloc.verify());
universe@539 91 cxFree(&alloc, space);
universe@539 92 EXPECT_TRUE(alloc.verify());
universe@539 93 }
universe@539 94
universe@535 95 TEST(BufferInit, WrapSpaceAutoFree) {
universe@535 96 CxTestingAllocator alloc;
universe@530 97 CxBuffer buf;
universe@535 98 void *space = cxMalloc(&alloc, 16);
universe@535 99 cxBufferInit(&buf, space, 16, &alloc, CX_BUFFER_FREE_CONTENTS);
universe@539 100 expect_default_flush_config(&buf);
universe@530 101 EXPECT_EQ(buf.space, space);
universe@530 102 EXPECT_EQ(buf.flags & CX_BUFFER_AUTO_EXTEND, 0);
universe@530 103 EXPECT_EQ(buf.flags & CX_BUFFER_FREE_CONTENTS, CX_BUFFER_FREE_CONTENTS);
universe@530 104 EXPECT_EQ(buf.pos, 0);
universe@530 105 EXPECT_EQ(buf.size, 0);
universe@530 106 EXPECT_EQ(buf.capacity, 16);
universe@535 107 EXPECT_EQ(buf.allocator, &alloc);
universe@535 108 EXPECT_FALSE(alloc.verify());
universe@530 109 cxBufferDestroy(&buf);
universe@535 110 EXPECT_TRUE(alloc.verify());
universe@530 111 }
universe@535 112
universe@535 113 TEST(BufferInit, FreshSpace) {
universe@535 114 CxTestingAllocator alloc;
universe@535 115 CxBuffer buf;
universe@535 116 cxBufferInit(&buf, nullptr, 8, &alloc, CX_BUFFER_DEFAULT);
universe@539 117 expect_default_flush_config(&buf);
universe@535 118 EXPECT_NE(buf.space, nullptr);
universe@535 119 EXPECT_EQ(buf.flags & CX_BUFFER_AUTO_EXTEND, 0);
universe@535 120 EXPECT_EQ(buf.flags & CX_BUFFER_FREE_CONTENTS, CX_BUFFER_FREE_CONTENTS);
universe@535 121 EXPECT_EQ(buf.pos, 0);
universe@535 122 EXPECT_EQ(buf.size, 0);
universe@535 123 EXPECT_EQ(buf.capacity, 8);
universe@535 124 EXPECT_EQ(buf.allocator, &alloc);
universe@535 125 EXPECT_FALSE(alloc.verify()); // space is still allocated
universe@535 126 cxBufferDestroy(&buf);
universe@535 127 EXPECT_TRUE(alloc.verify());
universe@535 128 }
universe@535 129
universe@535 130 class BufferShiftFixture : public ::testing::Test {
universe@535 131 protected:
universe@535 132 void SetUp() override {
universe@535 133 ASSERT_TRUE(alloc.verify());
universe@535 134 cxBufferInit(&buf, nullptr, 16, &alloc, CX_BUFFER_DEFAULT);
universe@535 135 memcpy(buf.space, "test____________", 16);
universe@535 136 buf.capacity = 8; // purposely pretend that the buffer has less capacity s.t. we can test beyond the range
universe@535 137 buf.pos = 4;
universe@535 138 buf.size = 4;
universe@535 139 }
universe@535 140
universe@535 141 void TearDown() override {
universe@535 142 cxBufferDestroy(&buf);
universe@535 143 EXPECT_TRUE(alloc.verify());
universe@535 144 }
universe@535 145
universe@535 146 CxTestingAllocator alloc;
universe@535 147 CxBuffer buf{};
universe@535 148 };
universe@535 149
universe@535 150 class BufferShiftLeft : public BufferShiftFixture {
universe@535 151 };
universe@535 152
universe@535 153 TEST_F(BufferShiftLeft, Zero) {
universe@535 154 ASSERT_EQ(buf.pos, 4);
universe@535 155 ASSERT_EQ(buf.size, 4);
universe@535 156 int ret = cxBufferShiftLeft(&buf, 0);
universe@535 157 EXPECT_EQ(ret, 0);
universe@535 158 EXPECT_EQ(buf.pos, 4);
universe@535 159 EXPECT_EQ(buf.size, 4);
universe@535 160 EXPECT_TRUE(memcmp(buf.space, "test________", 8) == 0);
universe@535 161 }
universe@535 162
universe@547 163 TEST_F(BufferShiftLeft, ZeroOffsetInterface) {
universe@547 164 ASSERT_EQ(buf.pos, 4);
universe@547 165 ASSERT_EQ(buf.size, 4);
universe@547 166 int ret = cxBufferShift(&buf, -0);
universe@547 167 EXPECT_EQ(ret, 0);
universe@547 168 EXPECT_EQ(buf.pos, 4);
universe@547 169 EXPECT_EQ(buf.size, 4);
universe@547 170 EXPECT_TRUE(memcmp(buf.space, "test________", 8) == 0);
universe@547 171 }
universe@547 172
universe@535 173 TEST_F(BufferShiftLeft, Standard) {
universe@535 174 ASSERT_EQ(buf.pos, 4);
universe@535 175 ASSERT_EQ(buf.size, 4);
universe@535 176 int ret = cxBufferShiftLeft(&buf, 2);
universe@535 177 EXPECT_EQ(ret, 0);
universe@535 178 EXPECT_EQ(buf.pos, 2);
universe@535 179 EXPECT_EQ(buf.size, 2);
universe@535 180 EXPECT_TRUE(memcmp(buf.space, "stst________", 8) == 0);
universe@535 181 }
universe@535 182
universe@535 183 TEST_F(BufferShiftLeft, Overshift) {
universe@535 184 ASSERT_LT(buf.pos, 6);
universe@535 185 ASSERT_LT(buf.size, 6);
universe@535 186 int ret = cxBufferShiftLeft(&buf, 6);
universe@535 187 EXPECT_EQ(ret, 0);
universe@535 188 EXPECT_EQ(buf.pos, 0);
universe@535 189 EXPECT_EQ(buf.size, 0);
universe@535 190 EXPECT_TRUE(memcmp(buf.space, "test________", 8) == 0);
universe@535 191 }
universe@535 192
universe@535 193 TEST_F(BufferShiftLeft, OvershiftPosOnly) {
universe@535 194 buf.pos = 2;
universe@535 195 ASSERT_EQ(buf.size, 4);
universe@535 196 int ret = cxBufferShiftLeft(&buf, 3);
universe@535 197 EXPECT_EQ(ret, 0);
universe@535 198 EXPECT_EQ(buf.pos, 0);
universe@535 199 EXPECT_EQ(buf.size, 1);
universe@535 200 EXPECT_TRUE(memcmp(buf.space, "test________", 8) == 0);
universe@535 201 }
universe@535 202
universe@535 203 TEST_F(BufferShiftLeft, OffsetInterface) {
universe@535 204 buf.pos = 3;
universe@535 205 ASSERT_EQ(buf.size, 4);
universe@535 206 int ret = cxBufferShift(&buf, -2);
universe@535 207 EXPECT_EQ(ret, 0);
universe@535 208 EXPECT_EQ(buf.pos, 1);
universe@535 209 EXPECT_EQ(buf.size, 2);
universe@535 210 EXPECT_TRUE(memcmp(buf.space, "stst________", 8) == 0);
universe@535 211 }
universe@535 212
universe@535 213 class BufferShiftRight : public BufferShiftFixture {
universe@535 214 };
universe@535 215
universe@535 216 TEST_F(BufferShiftRight, Zero) {
universe@535 217 ASSERT_EQ(buf.pos, 4);
universe@535 218 ASSERT_EQ(buf.size, 4);
universe@535 219 int ret = cxBufferShiftRight(&buf, 0);
universe@535 220 EXPECT_EQ(ret, 0);
universe@535 221 EXPECT_EQ(buf.pos, 4);
universe@535 222 EXPECT_EQ(buf.size, 4);
universe@535 223 EXPECT_TRUE(memcmp(buf.space, "test________", 8) == 0);
universe@535 224 }
universe@535 225
universe@547 226 TEST_F(BufferShiftRight, ZeroOffsetInterface) {
universe@547 227 ASSERT_EQ(buf.pos, 4);
universe@547 228 ASSERT_EQ(buf.size, 4);
universe@547 229 int ret = cxBufferShift(&buf, +0);
universe@547 230 EXPECT_EQ(ret, 0);
universe@547 231 EXPECT_EQ(buf.pos, 4);
universe@547 232 EXPECT_EQ(buf.size, 4);
universe@547 233 EXPECT_TRUE(memcmp(buf.space, "test________", 8) == 0);
universe@547 234 }
universe@547 235
universe@535 236 TEST_F(BufferShiftRight, Standard) {
universe@535 237 ASSERT_EQ(buf.pos, 4);
universe@535 238 ASSERT_EQ(buf.size, 4);
universe@535 239 int ret = cxBufferShiftRight(&buf, 3);
universe@535 240 EXPECT_EQ(ret, 0);
universe@535 241 EXPECT_EQ(buf.pos, 7);
universe@535 242 EXPECT_EQ(buf.size, 7);
universe@535 243 EXPECT_TRUE(memcmp(buf.space, "testest_____", 8) == 0);
universe@535 244 }
universe@535 245
universe@535 246 TEST_F(BufferShiftRight, OvershiftDiscard) {
universe@535 247 ASSERT_EQ(buf.pos, 4);
universe@535 248 ASSERT_EQ(buf.size, 4);
universe@535 249 ASSERT_EQ(buf.capacity, 8);
universe@535 250 int ret = cxBufferShiftRight(&buf, 6);
universe@535 251 EXPECT_EQ(ret, 0);
universe@535 252 EXPECT_EQ(buf.pos, 8);
universe@535 253 EXPECT_EQ(buf.size, 8);
universe@535 254 EXPECT_EQ(buf.capacity, 8);
universe@535 255 EXPECT_TRUE(memcmp(buf.space, "test__te____", 8) == 0);
universe@535 256 }
universe@535 257
universe@535 258 TEST_F(BufferShiftRight, OvershiftExtend) {
universe@535 259 ASSERT_EQ(buf.pos, 4);
universe@535 260 ASSERT_EQ(buf.size, 4);
universe@535 261 ASSERT_EQ(buf.capacity, 8);
universe@535 262 buf.flags |= CX_BUFFER_AUTO_EXTEND;
universe@535 263 int ret = cxBufferShiftRight(&buf, 6);
universe@535 264 EXPECT_EQ(ret, 0);
universe@535 265 EXPECT_EQ(buf.pos, 10);
universe@535 266 EXPECT_EQ(buf.size, 10);
universe@535 267 EXPECT_GE(buf.capacity, 10);
universe@535 268 EXPECT_TRUE(memcmp(buf.space, "test__test__", 8) == 0);
universe@535 269 }
universe@535 270
universe@535 271 TEST_F(BufferShiftRight, OffsetInterface) {
universe@535 272 buf.pos = 3;
universe@535 273 ASSERT_EQ(buf.size, 4);
universe@535 274 int ret = cxBufferShift(&buf, 2);
universe@535 275 EXPECT_EQ(ret, 0);
universe@535 276 EXPECT_EQ(buf.pos, 5);
universe@535 277 EXPECT_EQ(buf.size, 6);
universe@535 278 EXPECT_TRUE(memcmp(buf.space, "tetest______", 8) == 0);
universe@535 279 }
universe@535 280
universe@535 281 TEST(BufferMinimumCapacity, Sufficient) {
universe@535 282 CxTestingAllocator alloc;
universe@535 283 auto space = cxMalloc(&alloc, 8);
universe@535 284 CxBuffer buf;
universe@535 285 cxBufferInit(&buf, space, 8, &alloc, CX_BUFFER_FREE_CONTENTS);
universe@535 286 memcpy(space, "Testing", 8);
universe@535 287 buf.size = 8;
universe@535 288 cxBufferMinimumCapacity(&buf, 6);
universe@535 289 EXPECT_EQ(buf.capacity, 8);
universe@535 290 EXPECT_EQ(buf.size, 8);
universe@535 291 EXPECT_TRUE(memcmp(buf.space, "Testing", 8) == 0);
universe@535 292 cxBufferDestroy(&buf);
universe@535 293 EXPECT_TRUE(alloc.verify());
universe@535 294 }
universe@535 295
universe@535 296 TEST(BufferMinimumCapacity, Extend) {
universe@535 297 CxTestingAllocator alloc;
universe@535 298 auto space = cxMalloc(&alloc, 8);
universe@535 299 CxBuffer buf;
universe@535 300 cxBufferInit(&buf, space, 8, &alloc, CX_BUFFER_FREE_CONTENTS); // NO auto extend!
universe@535 301 memcpy(space, "Testing", 8);
universe@535 302 buf.size = 8;
universe@535 303 cxBufferMinimumCapacity(&buf, 16);
universe@535 304 EXPECT_EQ(buf.capacity, 16);
universe@535 305 EXPECT_EQ(buf.size, 8);
universe@535 306 EXPECT_TRUE(memcmp(buf.space, "Testing", 8) == 0);
universe@535 307 cxBufferDestroy(&buf);
universe@535 308 EXPECT_TRUE(alloc.verify());
universe@535 309 }
universe@536 310
universe@536 311 TEST(BufferClear, Test) {
universe@536 312 char space[16];
universe@536 313 strcpy(space, "clear test");
universe@536 314 CxBuffer buf;
universe@536 315 cxBufferInit(&buf, space, 16, cxDefaultAllocator, CX_BUFFER_DEFAULT);
universe@536 316 ASSERT_EQ(buf.size, 0);
universe@536 317 // only clear the used part of the buffer
universe@536 318 cxBufferClear(&buf);
universe@536 319 EXPECT_EQ(memcmp(space, "clear test", 10), 0);
universe@536 320 buf.size = 5;
universe@536 321 buf.pos = 3;
universe@536 322 cxBufferClear(&buf);
universe@536 323 EXPECT_EQ(memcmp(space, "\0\0\0\0\0 test", 10), 0);
universe@536 324 EXPECT_EQ(buf.size, 0);
universe@536 325 EXPECT_EQ(buf.pos, 0);
universe@538 326 cxBufferDestroy(&buf);
universe@536 327 }
universe@538 328
universe@538 329 class BufferWrite : public ::testing::Test {
universe@538 330 protected:
universe@545 331 CxBuffer buf{}, target{};
universe@538 332
universe@538 333 void SetUp() override {
universe@545 334 cxBufferInit(&target, nullptr, 16, cxDefaultAllocator, CX_BUFFER_AUTO_EXTEND);
universe@538 335 cxBufferInit(&buf, nullptr, 16, cxDefaultAllocator, CX_BUFFER_DEFAULT);
universe@538 336 buf.capacity = 8; // artificially reduce capacity to check OOB writes
universe@538 337 memset(buf.space, 0, 16);
universe@538 338 memcpy(buf.space, "prep", 4);
universe@538 339 buf.size = buf.pos = 4;
universe@538 340 }
universe@538 341
universe@538 342 void TearDown() override {
universe@538 343 cxBufferDestroy(&buf);
universe@545 344 cxBufferDestroy(&target);
universe@545 345 }
universe@545 346
universe@545 347 void enableFlushing() {
universe@545 348 buf.flush_target = &target;
universe@545 349 buf.flush_func = reinterpret_cast<cx_write_func>(cxBufferWrite);
universe@545 350 buf.flush_blkmax = 1;
universe@538 351 }
universe@538 352 };
universe@538 353
universe@538 354 TEST_F(BufferWrite, SizeOneFit) {
universe@538 355 const char *data = "test";
universe@538 356 ASSERT_EQ(buf.capacity, 8);
universe@538 357 ASSERT_EQ(buf.pos, 4);
universe@541 358 ASSERT_EQ(buf.size, 4);
universe@538 359 size_t written = cxBufferWrite(data, 1, 4, &buf);
universe@538 360 EXPECT_EQ(written, 4);
universe@538 361 EXPECT_EQ(buf.size, 8);
universe@538 362 EXPECT_EQ(buf.pos, 8);
universe@538 363 EXPECT_EQ(buf.capacity, 8);
universe@538 364 EXPECT_EQ(memcmp(buf.space, "preptest", 8), 0);
universe@538 365 }
universe@538 366
universe@538 367 TEST_F(BufferWrite, SizeOneDiscard) {
universe@538 368 const char *data = "testing";
universe@538 369 ASSERT_EQ(buf.capacity, 8);
universe@538 370 ASSERT_EQ(buf.pos, 4);
universe@541 371 ASSERT_EQ(buf.size, 4);
universe@538 372 size_t written = cxBufferWrite(data, 1, 7, &buf);
universe@538 373 EXPECT_EQ(written, 4);
universe@538 374 EXPECT_EQ(buf.size, 8);
universe@538 375 EXPECT_EQ(buf.pos, 8);
universe@538 376 EXPECT_EQ(buf.capacity, 8);
universe@538 377 EXPECT_EQ(memcmp(buf.space, "preptest\0", 9), 0);
universe@538 378 }
universe@538 379
universe@538 380 TEST_F(BufferWrite, SizeOneExtend) {
universe@538 381 buf.flags |= CX_BUFFER_AUTO_EXTEND;
universe@538 382 const char *data = "testing";
universe@538 383 ASSERT_EQ(buf.capacity, 8);
universe@538 384 ASSERT_EQ(buf.pos, 4);
universe@541 385 ASSERT_EQ(buf.size, 4);
universe@538 386 size_t written = cxBufferWrite(data, 1, 7, &buf);
universe@538 387 EXPECT_EQ(written, 7);
universe@538 388 EXPECT_EQ(buf.size, 11);
universe@538 389 EXPECT_EQ(buf.pos, 11);
universe@538 390 EXPECT_GE(buf.capacity, 11);
universe@538 391 EXPECT_EQ(memcmp(buf.space, "preptesting", 11), 0);
universe@538 392 }
universe@538 393
universe@538 394 TEST_F(BufferWrite, MultibyteFit) {
universe@541 395 const char *data = "test";
universe@541 396 ASSERT_EQ(buf.capacity, 8);
universe@541 397 ASSERT_EQ(buf.pos, 4);
universe@541 398 ASSERT_EQ(buf.size, 4);
universe@541 399 size_t written = cxBufferWrite(data, 2, 2, &buf);
universe@541 400 EXPECT_EQ(written, 2);
universe@541 401 EXPECT_EQ(buf.size, 8);
universe@541 402 EXPECT_EQ(buf.pos, 8);
universe@541 403 EXPECT_EQ(buf.capacity, 8);
universe@541 404 EXPECT_EQ(memcmp(buf.space, "preptest", 8), 0);
universe@538 405 }
universe@538 406
universe@538 407 TEST_F(BufferWrite, MultibyteDiscard) {
universe@542 408 const char *data = "testing";
universe@541 409 ASSERT_EQ(buf.capacity, 8);
universe@541 410 ASSERT_EQ(buf.size, 4);
universe@541 411 buf.pos = 3;
universe@542 412 size_t written = cxBufferWrite(data, 2, 4, &buf);
universe@538 413 // remember: whole elements are discarded if they do not fit
universe@541 414 EXPECT_EQ(written, 2);
universe@541 415 EXPECT_EQ(buf.size, 7);
universe@541 416 EXPECT_EQ(buf.pos, 7);
universe@541 417 EXPECT_EQ(buf.capacity, 8);
universe@541 418 EXPECT_EQ(memcmp(buf.space, "pretest\0", 8), 0);
universe@538 419 }
universe@538 420
universe@538 421 TEST_F(BufferWrite, MultibyteExtend) {
universe@541 422 buf.flags |= CX_BUFFER_AUTO_EXTEND;
universe@541 423 const char *data = "tester";
universe@541 424 ASSERT_EQ(buf.capacity, 8);
universe@541 425 ASSERT_EQ(buf.size, 4);
universe@541 426 buf.pos = 3;
universe@541 427 size_t written = cxBufferWrite(data, 2, 3, &buf);
universe@541 428 // remember: whole elements are discarded if they do not fit
universe@541 429 EXPECT_EQ(written, 3);
universe@541 430 EXPECT_EQ(buf.size, 9);
universe@541 431 EXPECT_EQ(buf.pos, 9);
universe@541 432 EXPECT_GE(buf.capacity, 9);
universe@541 433 EXPECT_EQ(memcmp(buf.space, "pretester\0", 10), 0);
universe@538 434 }
universe@538 435
universe@538 436 TEST_F(BufferWrite, PutcWrapperFit) {
universe@541 437 ASSERT_EQ(buf.capacity, 8);
universe@541 438 ASSERT_EQ(buf.pos, 4);
universe@541 439 ASSERT_EQ(buf.size, 4);
universe@541 440 int c = cxBufferPut(&buf, 0x20 | 'a');
universe@541 441 EXPECT_EQ(c, 'a');
universe@541 442 EXPECT_EQ(buf.size, 5);
universe@541 443 EXPECT_EQ(buf.pos, 5);
universe@541 444 EXPECT_EQ(buf.capacity, 8);
universe@541 445 EXPECT_EQ(memcmp(buf.space, "prepa\0", 6), 0);
universe@538 446 }
universe@538 447
universe@538 448 TEST_F(BufferWrite, PutcWrapperDiscard) {
universe@541 449 ASSERT_EQ(buf.capacity, 8);
universe@541 450 ASSERT_EQ(buf.size, 4);
universe@541 451 buf.pos = 8;
universe@541 452 int c = cxBufferPut(&buf, 0x20 | 'a');
universe@541 453 EXPECT_EQ(c, EOF);
universe@541 454 EXPECT_EQ(buf.size, 4);
universe@541 455 EXPECT_EQ(buf.pos, 8);
universe@541 456 EXPECT_EQ(buf.capacity, 8);
universe@541 457 EXPECT_EQ(memcmp(buf.space, "prep\0\0\0\0\0", 9), 0);
universe@538 458 }
universe@538 459
universe@538 460 TEST_F(BufferWrite, PutcWrapperExtend) {
universe@541 461 buf.flags |= CX_BUFFER_AUTO_EXTEND;
universe@541 462 ASSERT_EQ(buf.capacity, 8);
universe@541 463 ASSERT_EQ(buf.size, 4);
universe@541 464 buf.pos = 8;
universe@541 465 int c = cxBufferPut(&buf, 0x20 | 'a');
universe@541 466 EXPECT_EQ(c, 'a');
universe@541 467 EXPECT_EQ(buf.size, 9);
universe@541 468 EXPECT_EQ(buf.pos, 9);
universe@541 469 EXPECT_GE(buf.capacity, 9);
universe@541 470 EXPECT_EQ(memcmp(buf.space, "prep\0\0\0\0a\0", 10), 0);
universe@538 471 }
universe@538 472
universe@538 473 TEST_F(BufferWrite, PutStringWrapperFit) {
universe@541 474 const char *data = "test";
universe@541 475 ASSERT_EQ(buf.capacity, 8);
universe@541 476 ASSERT_EQ(buf.pos, 4);
universe@541 477 ASSERT_EQ(buf.size, 4);
universe@541 478 size_t written = cxBufferPutString(&buf, data);
universe@541 479 EXPECT_EQ(written, 4);
universe@541 480 EXPECT_EQ(buf.size, 8);
universe@541 481 EXPECT_EQ(buf.pos, 8);
universe@541 482 EXPECT_EQ(buf.capacity, 8);
universe@541 483 EXPECT_EQ(memcmp(buf.space, "preptest", 8), 0);
universe@538 484 }
universe@538 485
universe@538 486 TEST_F(BufferWrite, PutStringWrapperDiscard) {
universe@541 487 const char *data = "testing";
universe@541 488 ASSERT_EQ(buf.capacity, 8);
universe@541 489 ASSERT_EQ(buf.pos, 4);
universe@541 490 ASSERT_EQ(buf.size, 4);
universe@541 491 size_t written = cxBufferPutString(&buf, data);
universe@541 492 EXPECT_EQ(written, 4);
universe@541 493 EXPECT_EQ(buf.size, 8);
universe@541 494 EXPECT_EQ(buf.pos, 8);
universe@541 495 EXPECT_EQ(buf.capacity, 8);
universe@541 496 EXPECT_EQ(memcmp(buf.space, "preptest\0", 9), 0);
universe@538 497 }
universe@538 498
universe@538 499 TEST_F(BufferWrite, PutStringWrapperExtend) {
universe@541 500 buf.flags |= CX_BUFFER_AUTO_EXTEND;
universe@541 501 const char *data = "testing";
universe@541 502 ASSERT_EQ(buf.capacity, 8);
universe@541 503 ASSERT_EQ(buf.pos, 4);
universe@541 504 ASSERT_EQ(buf.size, 4);
universe@541 505 size_t written = cxBufferPutString(&buf, data);
universe@541 506 EXPECT_EQ(written, 7);
universe@541 507 EXPECT_EQ(buf.size, 11);
universe@541 508 EXPECT_EQ(buf.pos, 11);
universe@541 509 EXPECT_GE(buf.capacity, 11);
universe@541 510 EXPECT_EQ(memcmp(buf.space, "preptesting", 11), 0);
universe@541 511 }
universe@538 512
universe@541 513 TEST_F(BufferWrite, MultOverflow) {
universe@541 514 const char *data = "testing";
universe@541 515 ASSERT_EQ(buf.capacity, 8);
universe@541 516 ASSERT_EQ(buf.pos, 4);
universe@541 517 ASSERT_EQ(buf.size, 4);
universe@541 518 size_t written = cxBufferWrite(data, 8, SIZE_MAX / 4, &buf);
universe@541 519 EXPECT_EQ(written, 0);
universe@541 520 EXPECT_EQ(buf.capacity, 8);
universe@541 521 EXPECT_EQ(buf.pos, 4);
universe@541 522 EXPECT_EQ(buf.size, 4);
universe@541 523 EXPECT_EQ(memcmp(buf.space, "prep\0", 5), 0);
universe@538 524 }
universe@541 525
universe@541 526 TEST_F(BufferWrite, MaxCapaOverflow) {
universe@541 527 buf.flags |= CX_BUFFER_AUTO_EXTEND;
universe@541 528 const char *data = "testing";
universe@541 529 ASSERT_EQ(buf.capacity, 8);
universe@541 530 ASSERT_EQ(buf.pos, 4);
universe@541 531 ASSERT_EQ(buf.size, 4);
universe@541 532 size_t written = cxBufferWrite(data, 1, SIZE_MAX - 2, &buf);
universe@541 533 EXPECT_EQ(written, 0);
universe@541 534 EXPECT_EQ(buf.capacity, 8);
universe@541 535 EXPECT_EQ(buf.pos, 4);
universe@541 536 EXPECT_EQ(buf.size, 4);
universe@541 537 EXPECT_EQ(memcmp(buf.space, "prep\0", 5), 0);
universe@541 538 }
universe@541 539
universe@541 540 TEST_F(BufferWrite, OnlyOverwrite) {
universe@541 541 buf.flags |= CX_BUFFER_AUTO_EXTEND;
universe@541 542 ASSERT_EQ(buf.capacity, 8);
universe@541 543 memcpy(buf.space, "preptest", 8);
universe@541 544 buf.pos = 3;
universe@541 545 buf.size = 8;
universe@541 546 size_t written = cxBufferWrite("XXX", 2, 2, &buf);
universe@541 547 EXPECT_EQ(written, 2);
universe@541 548 EXPECT_EQ(buf.capacity, 8);
universe@541 549 EXPECT_EQ(buf.size, 8);
universe@541 550 EXPECT_EQ(buf.pos, 7);
universe@541 551 EXPECT_EQ(memcmp(buf.space, "preXXX\0t", 8), 0);
universe@541 552 }
universe@545 553
universe@545 554 TEST_F(BufferWrite, FlushAtCapacity) {
universe@545 555 enableFlushing();
universe@545 556 ASSERT_EQ(buf.capacity, 8);
universe@545 557 ASSERT_EQ(buf.pos, 4);
universe@545 558 size_t written = cxBufferWrite("foo", 1, 3, &buf);
universe@545 559 EXPECT_EQ(written, 3);
universe@545 560 ASSERT_EQ(buf.pos, 7);
universe@545 561 ASSERT_EQ(buf.size, 7);
universe@545 562 ASSERT_EQ(target.pos, 0);
universe@545 563 ASSERT_EQ(target.size, 0);
universe@545 564 written = cxBufferWrite("hello", 1, 5, &buf);
universe@545 565 EXPECT_EQ(written, 5);
universe@545 566 EXPECT_EQ(buf.pos, 0);
universe@545 567 EXPECT_EQ(buf.size, 0);
universe@545 568 EXPECT_EQ(buf.capacity, 8);
universe@545 569 EXPECT_EQ(target.pos, 12);
universe@545 570 ASSERT_EQ(target.size, 12);
universe@545 571 EXPECT_EQ(memcmp(target.space, "prepfoohello", 12), 0);
universe@545 572 }
universe@546 573
universe@546 574 TEST_F(BufferWrite, FlushAtThreshold) {
universe@546 575 enableFlushing();
universe@546 576 buf.flush_threshold = 12;
universe@546 577 buf.flags |= CX_BUFFER_AUTO_EXTEND;
universe@546 578 ASSERT_EQ(buf.capacity, 8);
universe@546 579 ASSERT_EQ(buf.pos, 4);
universe@546 580 size_t written = cxBufferWrite("foobar", 1, 6, &buf);
universe@546 581 EXPECT_EQ(written, 6);
universe@546 582 ASSERT_EQ(buf.pos, 10);
universe@546 583 ASSERT_EQ(buf.size, 10);
universe@546 584 ASSERT_GE(buf.capacity, 10);
universe@546 585 ASSERT_LE(buf.capacity, 12);
universe@546 586 ASSERT_EQ(target.pos, 0);
universe@546 587 ASSERT_EQ(target.size, 0);
universe@546 588 written = cxBufferWrite("hello", 1, 5, &buf);
universe@546 589 EXPECT_EQ(written, 5);
universe@546 590 EXPECT_EQ(buf.pos, 0);
universe@546 591 EXPECT_EQ(buf.size, 0);
universe@546 592 EXPECT_LE(buf.capacity, 12);
universe@546 593 EXPECT_EQ(target.pos, 15);
universe@546 594 ASSERT_EQ(target.size, 15);
universe@546 595 EXPECT_EQ(memcmp(target.space, "prepfoobarhello", 15), 0);
universe@546 596 }
universe@547 597
universe@548 598 class BufferSeek : public BufferFixture {
universe@547 599 };
universe@547 600
universe@547 601 TEST_F(BufferSeek, SetZero) {
universe@547 602 int result = cxBufferSeek(&buf, 0, SEEK_SET);
universe@547 603 EXPECT_EQ(result, 0);
universe@547 604 EXPECT_EQ(buf.pos, 0);
universe@547 605 }
universe@547 606
universe@547 607 TEST_F(BufferSeek, SetValid) {
universe@547 608 int result = cxBufferSeek(&buf, 5, SEEK_SET);
universe@547 609 EXPECT_EQ(result, 0);
universe@547 610 EXPECT_EQ(buf.pos, 5);
universe@547 611 }
universe@547 612
universe@547 613 TEST_F(BufferSeek, SetInvalid) {
universe@547 614 ASSERT_EQ(buf.pos, 3);
universe@547 615 int result = cxBufferSeek(&buf, 6, SEEK_SET);
universe@547 616 EXPECT_NE(result, 0);
universe@547 617 EXPECT_EQ(buf.pos, 3);
universe@547 618 }
universe@547 619
universe@547 620 TEST_F(BufferSeek, CurZero) {
universe@547 621 ASSERT_EQ(buf.pos, 3);
universe@547 622 int result = cxBufferSeek(&buf, 0, SEEK_CUR);
universe@547 623 EXPECT_EQ(result, 0);
universe@547 624 EXPECT_EQ(buf.pos, 3);
universe@547 625 }
universe@547 626
universe@547 627 TEST_F(BufferSeek, CurValidPositive) {
universe@547 628 ASSERT_EQ(buf.pos, 3);
universe@547 629 int result = cxBufferSeek(&buf, 2, SEEK_CUR);
universe@547 630 EXPECT_EQ(result, 0);
universe@547 631 EXPECT_EQ(buf.pos, 5);
universe@547 632 }
universe@547 633
universe@547 634 TEST_F(BufferSeek, CurValidNegative) {
universe@547 635 ASSERT_EQ(buf.pos, 3);
universe@547 636 int result = cxBufferSeek(&buf, -3, SEEK_CUR);
universe@547 637 EXPECT_EQ(result, 0);
universe@547 638 EXPECT_EQ(buf.pos, 0);
universe@547 639 }
universe@547 640
universe@547 641 TEST_F(BufferSeek, CurInvalidPositive) {
universe@547 642 ASSERT_EQ(buf.pos, 3);
universe@547 643 int result = cxBufferSeek(&buf, 3, SEEK_CUR);
universe@547 644 EXPECT_NE(result, 0);
universe@547 645 EXPECT_EQ(buf.pos, 3);
universe@547 646 }
universe@547 647
universe@547 648 TEST_F(BufferSeek, CurInvalidNegative) {
universe@547 649 ASSERT_EQ(buf.pos, 3);
universe@547 650 int result = cxBufferSeek(&buf, -4, SEEK_CUR);
universe@547 651 EXPECT_NE(result, 0);
universe@547 652 EXPECT_EQ(buf.pos, 3);
universe@547 653 }
universe@547 654
universe@547 655 TEST_F(BufferSeek, EndZero) {
universe@547 656 ASSERT_EQ(buf.size, 6);
universe@547 657 int result = cxBufferSeek(&buf, 0, SEEK_END);
universe@547 658 // the (past-the-)end position is always invalid
universe@547 659 EXPECT_NE(result, 0);
universe@547 660 EXPECT_EQ(buf.pos, 3);
universe@547 661 }
universe@547 662
universe@547 663 TEST_F(BufferSeek, EndValid) {
universe@547 664 ASSERT_EQ(buf.size, 6);
universe@547 665 int result = cxBufferSeek(&buf, -6, SEEK_END);
universe@547 666 EXPECT_EQ(result, 0);
universe@547 667 EXPECT_EQ(buf.pos, 0);
universe@547 668 }
universe@547 669
universe@547 670 TEST_F(BufferSeek, EndInvalid) {
universe@547 671 ASSERT_EQ(buf.size, 6);
universe@547 672 int result = cxBufferSeek(&buf, 1, SEEK_END);
universe@547 673 EXPECT_NE(result, 0);
universe@547 674 EXPECT_EQ(buf.pos, 3);
universe@547 675 }
universe@547 676
universe@547 677 TEST_F(BufferSeek, WhenceInvalid) {
universe@547 678 ASSERT_EQ(buf.size, 6);
universe@547 679 ASSERT_EQ(buf.pos, 3);
universe@547 680 int result = cxBufferSeek(&buf, 2, 9000);
universe@547 681 EXPECT_NE(result, 0);
universe@547 682 EXPECT_EQ(buf.size, 6);
universe@547 683 EXPECT_EQ(buf.pos, 3);
universe@548 684 }
universe@548 685
universe@548 686 class BufferEof : public BufferFixture {
universe@548 687 };
universe@548 688
universe@548 689 TEST_F(BufferEof, Reached) {
universe@548 690 buf.pos = buf.size;
universe@548 691 EXPECT_TRUE(cxBufferEof(&buf));
universe@548 692 buf.pos = buf.size - 1;
universe@548 693 ASSERT_FALSE(cxBufferEof(&buf));
universe@548 694 cxBufferPut(&buf, 'a');
universe@548 695 EXPECT_TRUE(cxBufferEof(&buf));
universe@548 696 }
universe@548 697
universe@548 698 TEST_F(BufferEof, NotReached) {
universe@548 699 buf.pos = buf.size - 1;
universe@548 700 EXPECT_FALSE(cxBufferEof(&buf));
universe@548 701 buf.pos = 0;
universe@548 702 cxBufferWrite("test", 1, 5, &buf);
universe@548 703 EXPECT_FALSE(cxBufferEof(&buf));
universe@548 704 }

mercurial