test/test_buffer.cpp

Sun, 01 May 2022 11:46:54 +0200

author
Mike Becker <universe@uap-core.de>
date
Sun, 01 May 2022 11:46:54 +0200
changeset 542
45bcfd152f85
parent 541
67e078518935
child 545
3700ac4bd9a3
permissions
-rw-r--r--

#170 no bug never existed

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@538 296 CxBuffer buf{};
universe@538 297
universe@538 298 void SetUp() override {
universe@538 299 cxBufferInit(&buf, nullptr, 16, cxDefaultAllocator, CX_BUFFER_DEFAULT);
universe@538 300 buf.capacity = 8; // artificially reduce capacity to check OOB writes
universe@538 301 memset(buf.space, 0, 16);
universe@538 302 memcpy(buf.space, "prep", 4);
universe@538 303 buf.size = buf.pos = 4;
universe@538 304 }
universe@538 305
universe@538 306 void TearDown() override {
universe@538 307 cxBufferDestroy(&buf);
universe@538 308 }
universe@538 309 };
universe@538 310
universe@538 311 TEST_F(BufferWrite, SizeOneFit) {
universe@538 312 const char *data = "test";
universe@538 313 ASSERT_EQ(buf.capacity, 8);
universe@538 314 ASSERT_EQ(buf.pos, 4);
universe@541 315 ASSERT_EQ(buf.size, 4);
universe@538 316 size_t written = cxBufferWrite(data, 1, 4, &buf);
universe@538 317 EXPECT_EQ(written, 4);
universe@538 318 EXPECT_EQ(buf.size, 8);
universe@538 319 EXPECT_EQ(buf.pos, 8);
universe@538 320 EXPECT_EQ(buf.capacity, 8);
universe@538 321 EXPECT_EQ(memcmp(buf.space, "preptest", 8), 0);
universe@538 322 }
universe@538 323
universe@538 324 TEST_F(BufferWrite, SizeOneDiscard) {
universe@538 325 const char *data = "testing";
universe@538 326 ASSERT_EQ(buf.capacity, 8);
universe@538 327 ASSERT_EQ(buf.pos, 4);
universe@541 328 ASSERT_EQ(buf.size, 4);
universe@538 329 size_t written = cxBufferWrite(data, 1, 7, &buf);
universe@538 330 EXPECT_EQ(written, 4);
universe@538 331 EXPECT_EQ(buf.size, 8);
universe@538 332 EXPECT_EQ(buf.pos, 8);
universe@538 333 EXPECT_EQ(buf.capacity, 8);
universe@538 334 EXPECT_EQ(memcmp(buf.space, "preptest\0", 9), 0);
universe@538 335 }
universe@538 336
universe@538 337 TEST_F(BufferWrite, SizeOneExtend) {
universe@538 338 buf.flags |= CX_BUFFER_AUTO_EXTEND;
universe@538 339 const char *data = "testing";
universe@538 340 ASSERT_EQ(buf.capacity, 8);
universe@538 341 ASSERT_EQ(buf.pos, 4);
universe@541 342 ASSERT_EQ(buf.size, 4);
universe@538 343 size_t written = cxBufferWrite(data, 1, 7, &buf);
universe@538 344 EXPECT_EQ(written, 7);
universe@538 345 EXPECT_EQ(buf.size, 11);
universe@538 346 EXPECT_EQ(buf.pos, 11);
universe@538 347 EXPECT_GE(buf.capacity, 11);
universe@538 348 EXPECT_EQ(memcmp(buf.space, "preptesting", 11), 0);
universe@538 349 }
universe@538 350
universe@538 351 TEST_F(BufferWrite, MultibyteFit) {
universe@541 352 const char *data = "test";
universe@541 353 ASSERT_EQ(buf.capacity, 8);
universe@541 354 ASSERT_EQ(buf.pos, 4);
universe@541 355 ASSERT_EQ(buf.size, 4);
universe@541 356 size_t written = cxBufferWrite(data, 2, 2, &buf);
universe@541 357 EXPECT_EQ(written, 2);
universe@541 358 EXPECT_EQ(buf.size, 8);
universe@541 359 EXPECT_EQ(buf.pos, 8);
universe@541 360 EXPECT_EQ(buf.capacity, 8);
universe@541 361 EXPECT_EQ(memcmp(buf.space, "preptest", 8), 0);
universe@538 362 }
universe@538 363
universe@538 364 TEST_F(BufferWrite, MultibyteDiscard) {
universe@542 365 const char *data = "testing";
universe@541 366 ASSERT_EQ(buf.capacity, 8);
universe@541 367 ASSERT_EQ(buf.size, 4);
universe@541 368 buf.pos = 3;
universe@542 369 size_t written = cxBufferWrite(data, 2, 4, &buf);
universe@538 370 // remember: whole elements are discarded if they do not fit
universe@541 371 EXPECT_EQ(written, 2);
universe@541 372 EXPECT_EQ(buf.size, 7);
universe@541 373 EXPECT_EQ(buf.pos, 7);
universe@541 374 EXPECT_EQ(buf.capacity, 8);
universe@541 375 EXPECT_EQ(memcmp(buf.space, "pretest\0", 8), 0);
universe@538 376 }
universe@538 377
universe@538 378 TEST_F(BufferWrite, MultibyteExtend) {
universe@541 379 buf.flags |= CX_BUFFER_AUTO_EXTEND;
universe@541 380 const char *data = "tester";
universe@541 381 ASSERT_EQ(buf.capacity, 8);
universe@541 382 ASSERT_EQ(buf.size, 4);
universe@541 383 buf.pos = 3;
universe@541 384 size_t written = cxBufferWrite(data, 2, 3, &buf);
universe@541 385 // remember: whole elements are discarded if they do not fit
universe@541 386 EXPECT_EQ(written, 3);
universe@541 387 EXPECT_EQ(buf.size, 9);
universe@541 388 EXPECT_EQ(buf.pos, 9);
universe@541 389 EXPECT_GE(buf.capacity, 9);
universe@541 390 EXPECT_EQ(memcmp(buf.space, "pretester\0", 10), 0);
universe@538 391 }
universe@538 392
universe@538 393 TEST_F(BufferWrite, PutcWrapperFit) {
universe@541 394 ASSERT_EQ(buf.capacity, 8);
universe@541 395 ASSERT_EQ(buf.pos, 4);
universe@541 396 ASSERT_EQ(buf.size, 4);
universe@541 397 int c = cxBufferPut(&buf, 0x20 | 'a');
universe@541 398 EXPECT_EQ(c, 'a');
universe@541 399 EXPECT_EQ(buf.size, 5);
universe@541 400 EXPECT_EQ(buf.pos, 5);
universe@541 401 EXPECT_EQ(buf.capacity, 8);
universe@541 402 EXPECT_EQ(memcmp(buf.space, "prepa\0", 6), 0);
universe@538 403 }
universe@538 404
universe@538 405 TEST_F(BufferWrite, PutcWrapperDiscard) {
universe@541 406 ASSERT_EQ(buf.capacity, 8);
universe@541 407 ASSERT_EQ(buf.size, 4);
universe@541 408 buf.pos = 8;
universe@541 409 int c = cxBufferPut(&buf, 0x20 | 'a');
universe@541 410 EXPECT_EQ(c, EOF);
universe@541 411 EXPECT_EQ(buf.size, 4);
universe@541 412 EXPECT_EQ(buf.pos, 8);
universe@541 413 EXPECT_EQ(buf.capacity, 8);
universe@541 414 EXPECT_EQ(memcmp(buf.space, "prep\0\0\0\0\0", 9), 0);
universe@538 415 }
universe@538 416
universe@538 417 TEST_F(BufferWrite, PutcWrapperExtend) {
universe@541 418 buf.flags |= CX_BUFFER_AUTO_EXTEND;
universe@541 419 ASSERT_EQ(buf.capacity, 8);
universe@541 420 ASSERT_EQ(buf.size, 4);
universe@541 421 buf.pos = 8;
universe@541 422 int c = cxBufferPut(&buf, 0x20 | 'a');
universe@541 423 EXPECT_EQ(c, 'a');
universe@541 424 EXPECT_EQ(buf.size, 9);
universe@541 425 EXPECT_EQ(buf.pos, 9);
universe@541 426 EXPECT_GE(buf.capacity, 9);
universe@541 427 EXPECT_EQ(memcmp(buf.space, "prep\0\0\0\0a\0", 10), 0);
universe@538 428 }
universe@538 429
universe@538 430 TEST_F(BufferWrite, PutStringWrapperFit) {
universe@541 431 const char *data = "test";
universe@541 432 ASSERT_EQ(buf.capacity, 8);
universe@541 433 ASSERT_EQ(buf.pos, 4);
universe@541 434 ASSERT_EQ(buf.size, 4);
universe@541 435 size_t written = cxBufferPutString(&buf, data);
universe@541 436 EXPECT_EQ(written, 4);
universe@541 437 EXPECT_EQ(buf.size, 8);
universe@541 438 EXPECT_EQ(buf.pos, 8);
universe@541 439 EXPECT_EQ(buf.capacity, 8);
universe@541 440 EXPECT_EQ(memcmp(buf.space, "preptest", 8), 0);
universe@538 441 }
universe@538 442
universe@538 443 TEST_F(BufferWrite, PutStringWrapperDiscard) {
universe@541 444 const char *data = "testing";
universe@541 445 ASSERT_EQ(buf.capacity, 8);
universe@541 446 ASSERT_EQ(buf.pos, 4);
universe@541 447 ASSERT_EQ(buf.size, 4);
universe@541 448 size_t written = cxBufferPutString(&buf, data);
universe@541 449 EXPECT_EQ(written, 4);
universe@541 450 EXPECT_EQ(buf.size, 8);
universe@541 451 EXPECT_EQ(buf.pos, 8);
universe@541 452 EXPECT_EQ(buf.capacity, 8);
universe@541 453 EXPECT_EQ(memcmp(buf.space, "preptest\0", 9), 0);
universe@538 454 }
universe@538 455
universe@538 456 TEST_F(BufferWrite, PutStringWrapperExtend) {
universe@541 457 buf.flags |= CX_BUFFER_AUTO_EXTEND;
universe@541 458 const char *data = "testing";
universe@541 459 ASSERT_EQ(buf.capacity, 8);
universe@541 460 ASSERT_EQ(buf.pos, 4);
universe@541 461 ASSERT_EQ(buf.size, 4);
universe@541 462 size_t written = cxBufferPutString(&buf, data);
universe@541 463 EXPECT_EQ(written, 7);
universe@541 464 EXPECT_EQ(buf.size, 11);
universe@541 465 EXPECT_EQ(buf.pos, 11);
universe@541 466 EXPECT_GE(buf.capacity, 11);
universe@541 467 EXPECT_EQ(memcmp(buf.space, "preptesting", 11), 0);
universe@541 468 }
universe@538 469
universe@541 470 TEST_F(BufferWrite, MultOverflow) {
universe@541 471 const char *data = "testing";
universe@541 472 ASSERT_EQ(buf.capacity, 8);
universe@541 473 ASSERT_EQ(buf.pos, 4);
universe@541 474 ASSERT_EQ(buf.size, 4);
universe@541 475 size_t written = cxBufferWrite(data, 8, SIZE_MAX / 4, &buf);
universe@541 476 EXPECT_EQ(written, 0);
universe@541 477 EXPECT_EQ(buf.capacity, 8);
universe@541 478 EXPECT_EQ(buf.pos, 4);
universe@541 479 EXPECT_EQ(buf.size, 4);
universe@541 480 EXPECT_EQ(memcmp(buf.space, "prep\0", 5), 0);
universe@538 481 }
universe@541 482
universe@541 483 TEST_F(BufferWrite, MaxCapaOverflow) {
universe@541 484 buf.flags |= CX_BUFFER_AUTO_EXTEND;
universe@541 485 const char *data = "testing";
universe@541 486 ASSERT_EQ(buf.capacity, 8);
universe@541 487 ASSERT_EQ(buf.pos, 4);
universe@541 488 ASSERT_EQ(buf.size, 4);
universe@541 489 size_t written = cxBufferWrite(data, 1, SIZE_MAX - 2, &buf);
universe@541 490 EXPECT_EQ(written, 0);
universe@541 491 EXPECT_EQ(buf.capacity, 8);
universe@541 492 EXPECT_EQ(buf.pos, 4);
universe@541 493 EXPECT_EQ(buf.size, 4);
universe@541 494 EXPECT_EQ(memcmp(buf.space, "prep\0", 5), 0);
universe@541 495 }
universe@541 496
universe@541 497 TEST_F(BufferWrite, OnlyOverwrite) {
universe@541 498 buf.flags |= CX_BUFFER_AUTO_EXTEND;
universe@541 499 ASSERT_EQ(buf.capacity, 8);
universe@541 500 memcpy(buf.space, "preptest", 8);
universe@541 501 buf.pos = 3;
universe@541 502 buf.size = 8;
universe@541 503 size_t written = cxBufferWrite("XXX", 2, 2, &buf);
universe@541 504 EXPECT_EQ(written, 2);
universe@541 505 EXPECT_EQ(buf.capacity, 8);
universe@541 506 EXPECT_EQ(buf.size, 8);
universe@541 507 EXPECT_EQ(buf.pos, 7);
universe@541 508 EXPECT_EQ(memcmp(buf.space, "preXXX\0t", 8), 0);
universe@541 509 }

mercurial