tests/test_buffer.cpp

Mon, 01 Jan 2024 16:42:37 +0100

author
Mike Becker <universe@uap-core.de>
date
Mon, 01 Jan 2024 16:42:37 +0100
changeset 789
9b2f5661bebd
parent 761
61d5197d612b
child 792
3ca984931e1d
permissions
-rw-r--r--

begin migration of buffer tests - relates to #342

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@789 37 cxBufferInit(&buf, NULL, 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@535 49 class BufferShiftFixture : public ::testing::Test {
universe@535 50 protected:
universe@535 51 void SetUp() override {
universe@789 52 CX_TEST_ASSERT(cx_testing_allocator_verify(&talloc));
universe@789 53 cxBufferInit(&buf, NULL, 16, &alloc, CX_BUFFER_DEFAULT);
universe@535 54 memcpy(buf.space, "test____________", 16);
universe@535 55 buf.capacity = 8; // purposely pretend that the buffer has less capacity s.t. we can test beyond the range
universe@535 56 buf.pos = 4;
universe@535 57 buf.size = 4;
universe@535 58 }
universe@535 59
universe@535 60 void TearDown() override {
universe@535 61 cxBufferDestroy(&buf);
universe@789 62 CX_TEST_ASSERT(cx_testing_allocator_verify(&talloc));
universe@535 63 }
universe@535 64
universe@535 65 CxTestingAllocator alloc;
universe@535 66 CxBuffer buf{};
universe@535 67 };
universe@535 68
universe@535 69 class BufferShiftLeft : public BufferShiftFixture {
universe@535 70 };
universe@535 71
universe@535 72 TEST_F(BufferShiftLeft, Zero) {
universe@789 73 CX_TEST_ASSERT(buf.pos == 4);
universe@789 74 CX_TEST_ASSERT(buf.size == 4);
universe@535 75 int ret = cxBufferShiftLeft(&buf, 0);
universe@789 76 CX_TEST_ASSERT(ret == 0);
universe@789 77 CX_TEST_ASSERT(buf.pos == 4);
universe@789 78 CX_TEST_ASSERT(buf.size == 4);
universe@789 79 CX_TEST_ASSERT(memcmp(buf.space, "test________", 8) == 0);
universe@535 80 }
universe@535 81
universe@547 82 TEST_F(BufferShiftLeft, ZeroOffsetInterface) {
universe@789 83 CX_TEST_ASSERT(buf.pos == 4);
universe@789 84 CX_TEST_ASSERT(buf.size == 4);
universe@547 85 int ret = cxBufferShift(&buf, -0);
universe@789 86 CX_TEST_ASSERT(ret == 0);
universe@789 87 CX_TEST_ASSERT(buf.pos == 4);
universe@789 88 CX_TEST_ASSERT(buf.size == 4);
universe@789 89 CX_TEST_ASSERT(memcmp(buf.space, "test________", 8) == 0);
universe@547 90 }
universe@547 91
universe@535 92 TEST_F(BufferShiftLeft, Standard) {
universe@789 93 CX_TEST_ASSERT(buf.pos == 4);
universe@789 94 CX_TEST_ASSERT(buf.size == 4);
universe@535 95 int ret = cxBufferShiftLeft(&buf, 2);
universe@789 96 CX_TEST_ASSERT(ret == 0);
universe@789 97 CX_TEST_ASSERT(buf.pos == 2);
universe@789 98 CX_TEST_ASSERT(buf.size == 2);
universe@789 99 CX_TEST_ASSERT(memcmp(buf.space, "stst________", 8) == 0);
universe@535 100 }
universe@535 101
universe@535 102 TEST_F(BufferShiftLeft, Overshift) {
universe@535 103 ASSERT_LT(buf.pos, 6);
universe@535 104 ASSERT_LT(buf.size, 6);
universe@535 105 int ret = cxBufferShiftLeft(&buf, 6);
universe@789 106 CX_TEST_ASSERT(ret == 0);
universe@789 107 CX_TEST_ASSERT(buf.pos == 0);
universe@789 108 CX_TEST_ASSERT(buf.size == 0);
universe@789 109 CX_TEST_ASSERT(memcmp(buf.space, "test________", 8) == 0);
universe@535 110 }
universe@535 111
universe@535 112 TEST_F(BufferShiftLeft, OvershiftPosOnly) {
universe@535 113 buf.pos = 2;
universe@789 114 CX_TEST_ASSERT(buf.size == 4);
universe@535 115 int ret = cxBufferShiftLeft(&buf, 3);
universe@789 116 CX_TEST_ASSERT(ret == 0);
universe@789 117 CX_TEST_ASSERT(buf.pos == 0);
universe@789 118 CX_TEST_ASSERT(buf.size == 1);
universe@789 119 CX_TEST_ASSERT(memcmp(buf.space, "test________", 8) == 0);
universe@535 120 }
universe@535 121
universe@535 122 TEST_F(BufferShiftLeft, OffsetInterface) {
universe@535 123 buf.pos = 3;
universe@789 124 CX_TEST_ASSERT(buf.size == 4);
universe@535 125 int ret = cxBufferShift(&buf, -2);
universe@789 126 CX_TEST_ASSERT(ret == 0);
universe@789 127 CX_TEST_ASSERT(buf.pos == 1);
universe@789 128 CX_TEST_ASSERT(buf.size == 2);
universe@789 129 CX_TEST_ASSERT(memcmp(buf.space, "stst________", 8) == 0);
universe@535 130 }
universe@535 131
universe@535 132 TEST_F(BufferShiftRight, Zero) {
universe@789 133 CX_TEST_ASSERT(buf.pos == 4);
universe@789 134 CX_TEST_ASSERT(buf.size == 4);
universe@535 135 int ret = cxBufferShiftRight(&buf, 0);
universe@789 136 CX_TEST_ASSERT(ret == 0);
universe@789 137 CX_TEST_ASSERT(buf.pos == 4);
universe@789 138 CX_TEST_ASSERT(buf.size == 4);
universe@789 139 CX_TEST_ASSERT(memcmp(buf.space, "test________", 8) == 0);
universe@535 140 }
universe@535 141
universe@547 142 TEST_F(BufferShiftRight, ZeroOffsetInterface) {
universe@789 143 CX_TEST_ASSERT(buf.pos == 4);
universe@789 144 CX_TEST_ASSERT(buf.size == 4);
universe@547 145 int ret = cxBufferShift(&buf, +0);
universe@789 146 CX_TEST_ASSERT(ret == 0);
universe@789 147 CX_TEST_ASSERT(buf.pos == 4);
universe@789 148 CX_TEST_ASSERT(buf.size == 4);
universe@789 149 CX_TEST_ASSERT(memcmp(buf.space, "test________", 8) == 0);
universe@547 150 }
universe@547 151
universe@535 152 TEST_F(BufferShiftRight, Standard) {
universe@789 153 CX_TEST_ASSERT(buf.pos == 4);
universe@789 154 CX_TEST_ASSERT(buf.size == 4);
universe@535 155 int ret = cxBufferShiftRight(&buf, 3);
universe@789 156 CX_TEST_ASSERT(ret == 0);
universe@789 157 CX_TEST_ASSERT(buf.pos == 7);
universe@789 158 CX_TEST_ASSERT(buf.size == 7);
universe@789 159 CX_TEST_ASSERT(memcmp(buf.space, "testest_____", 8) == 0);
universe@535 160 }
universe@535 161
universe@535 162 TEST_F(BufferShiftRight, OvershiftDiscard) {
universe@789 163 CX_TEST_ASSERT(buf.pos == 4);
universe@789 164 CX_TEST_ASSERT(buf.size == 4);
universe@789 165 CX_TEST_ASSERT(buf.capacity == 8);
universe@535 166 int ret = cxBufferShiftRight(&buf, 6);
universe@789 167 CX_TEST_ASSERT(ret == 0);
universe@789 168 CX_TEST_ASSERT(buf.pos == 8);
universe@789 169 CX_TEST_ASSERT(buf.size == 8);
universe@789 170 CX_TEST_ASSERT(buf.capacity == 8);
universe@789 171 CX_TEST_ASSERT(memcmp(buf.space, "test__te____", 8) == 0);
universe@535 172 }
universe@535 173
universe@535 174 TEST_F(BufferShiftRight, OvershiftExtend) {
universe@789 175 CX_TEST_ASSERT(buf.pos == 4);
universe@789 176 CX_TEST_ASSERT(buf.size == 4);
universe@789 177 CX_TEST_ASSERT(buf.capacity == 8);
universe@535 178 buf.flags |= CX_BUFFER_AUTO_EXTEND;
universe@535 179 int ret = cxBufferShiftRight(&buf, 6);
universe@789 180 CX_TEST_ASSERT(ret == 0);
universe@789 181 CX_TEST_ASSERT(buf.pos == 10);
universe@789 182 CX_TEST_ASSERT(buf.size == 10);
universe@535 183 EXPECT_GE(buf.capacity, 10);
universe@789 184 CX_TEST_ASSERT(memcmp(buf.space, "test__test__", 8) == 0);
universe@535 185 }
universe@535 186
universe@535 187 TEST_F(BufferShiftRight, OffsetInterface) {
universe@535 188 buf.pos = 3;
universe@789 189 CX_TEST_ASSERT(buf.size == 4);
universe@535 190 int ret = cxBufferShift(&buf, 2);
universe@789 191 CX_TEST_ASSERT(ret == 0);
universe@789 192 CX_TEST_ASSERT(buf.pos == 5);
universe@789 193 CX_TEST_ASSERT(buf.size == 6);
universe@789 194 CX_TEST_ASSERT(memcmp(buf.space, "tetest______", 8) == 0);
universe@761 195 }
universe@761 196
universe@538 197 class BufferWrite : public ::testing::Test {
universe@538 198 protected:
universe@545 199 CxBuffer buf{}, target{};
universe@538 200
universe@538 201 void SetUp() override {
universe@789 202 cxBufferInit(&target, NULL, 16, cxDefaultAllocator, CX_BUFFER_AUTO_EXTEND);
universe@789 203 cxBufferInit(&buf, NULL, 16, cxDefaultAllocator, CX_BUFFER_DEFAULT);
universe@538 204 buf.capacity = 8; // artificially reduce capacity to check OOB writes
universe@538 205 memset(buf.space, 0, 16);
universe@538 206 memcpy(buf.space, "prep", 4);
universe@538 207 buf.size = buf.pos = 4;
universe@538 208 }
universe@538 209
universe@538 210 void TearDown() override {
universe@538 211 cxBufferDestroy(&buf);
universe@545 212 cxBufferDestroy(&target);
universe@545 213 }
universe@545 214
universe@545 215 void enableFlushing() {
universe@545 216 buf.flush_target = &target;
universe@545 217 buf.flush_func = reinterpret_cast<cx_write_func>(cxBufferWrite);
universe@545 218 buf.flush_blkmax = 1;
universe@538 219 }
universe@538 220 };
universe@538 221
universe@567 222 static size_t mock_write_limited_rate(
universe@567 223 void const *ptr,
universe@567 224 size_t size,
universe@567 225 __attribute__((unused)) size_t nitems,
universe@567 226 CxBuffer *buffer
universe@567 227 ) {
universe@567 228 // simulate limited target drain capacity
universe@567 229 static bool full = false;
universe@567 230 if (full) {
universe@567 231 full = false;
universe@567 232 return 0;
universe@567 233 } else {
universe@567 234 full = true;
universe@567 235 return cxBufferWrite(ptr, size, nitems > 2 ? 2 : nitems, buffer);
universe@567 236 }
universe@567 237 }
universe@567 238
universe@538 239 TEST_F(BufferWrite, SizeOneFit) {
universe@538 240 const char *data = "test";
universe@789 241 CX_TEST_ASSERT(buf.capacity == 8);
universe@789 242 CX_TEST_ASSERT(buf.pos == 4);
universe@789 243 CX_TEST_ASSERT(buf.size == 4);
universe@538 244 size_t written = cxBufferWrite(data, 1, 4, &buf);
universe@789 245 CX_TEST_ASSERT(written == 4);
universe@789 246 CX_TEST_ASSERT(buf.size == 8);
universe@789 247 CX_TEST_ASSERT(buf.pos == 8);
universe@789 248 CX_TEST_ASSERT(buf.capacity == 8);
universe@538 249 EXPECT_EQ(memcmp(buf.space, "preptest", 8), 0);
universe@538 250 }
universe@538 251
universe@538 252 TEST_F(BufferWrite, SizeOneDiscard) {
universe@538 253 const char *data = "testing";
universe@789 254 CX_TEST_ASSERT(buf.capacity == 8);
universe@789 255 CX_TEST_ASSERT(buf.pos == 4);
universe@789 256 CX_TEST_ASSERT(buf.size == 4);
universe@538 257 size_t written = cxBufferWrite(data, 1, 7, &buf);
universe@789 258 CX_TEST_ASSERT(written == 4);
universe@789 259 CX_TEST_ASSERT(buf.size == 8);
universe@789 260 CX_TEST_ASSERT(buf.pos == 8);
universe@789 261 CX_TEST_ASSERT(buf.capacity == 8);
universe@538 262 EXPECT_EQ(memcmp(buf.space, "preptest\0", 9), 0);
universe@538 263 }
universe@538 264
universe@538 265 TEST_F(BufferWrite, SizeOneExtend) {
universe@538 266 buf.flags |= CX_BUFFER_AUTO_EXTEND;
universe@538 267 const char *data = "testing";
universe@789 268 CX_TEST_ASSERT(buf.capacity == 8);
universe@789 269 CX_TEST_ASSERT(buf.pos == 4);
universe@789 270 CX_TEST_ASSERT(buf.size == 4);
universe@538 271 size_t written = cxBufferWrite(data, 1, 7, &buf);
universe@789 272 CX_TEST_ASSERT(written == 7);
universe@789 273 CX_TEST_ASSERT(buf.size == 11);
universe@789 274 CX_TEST_ASSERT(buf.pos == 11);
universe@538 275 EXPECT_GE(buf.capacity, 11);
universe@538 276 EXPECT_EQ(memcmp(buf.space, "preptesting", 11), 0);
universe@538 277 }
universe@538 278
universe@538 279 TEST_F(BufferWrite, MultibyteFit) {
universe@541 280 const char *data = "test";
universe@789 281 CX_TEST_ASSERT(buf.capacity == 8);
universe@789 282 CX_TEST_ASSERT(buf.pos == 4);
universe@789 283 CX_TEST_ASSERT(buf.size == 4);
universe@541 284 size_t written = cxBufferWrite(data, 2, 2, &buf);
universe@789 285 CX_TEST_ASSERT(written == 2);
universe@789 286 CX_TEST_ASSERT(buf.size == 8);
universe@789 287 CX_TEST_ASSERT(buf.pos == 8);
universe@789 288 CX_TEST_ASSERT(buf.capacity == 8);
universe@541 289 EXPECT_EQ(memcmp(buf.space, "preptest", 8), 0);
universe@538 290 }
universe@538 291
universe@538 292 TEST_F(BufferWrite, MultibyteDiscard) {
universe@542 293 const char *data = "testing";
universe@789 294 CX_TEST_ASSERT(buf.capacity == 8);
universe@789 295 CX_TEST_ASSERT(buf.size == 4);
universe@541 296 buf.pos = 3;
universe@542 297 size_t written = cxBufferWrite(data, 2, 4, &buf);
universe@538 298 // remember: whole elements are discarded if they do not fit
universe@789 299 CX_TEST_ASSERT(written == 2);
universe@789 300 CX_TEST_ASSERT(buf.size == 7);
universe@789 301 CX_TEST_ASSERT(buf.pos == 7);
universe@789 302 CX_TEST_ASSERT(buf.capacity == 8);
universe@541 303 EXPECT_EQ(memcmp(buf.space, "pretest\0", 8), 0);
universe@538 304 }
universe@538 305
universe@538 306 TEST_F(BufferWrite, MultibyteExtend) {
universe@541 307 buf.flags |= CX_BUFFER_AUTO_EXTEND;
universe@541 308 const char *data = "tester";
universe@789 309 CX_TEST_ASSERT(buf.capacity == 8);
universe@789 310 CX_TEST_ASSERT(buf.size == 4);
universe@541 311 buf.pos = 3;
universe@541 312 size_t written = cxBufferWrite(data, 2, 3, &buf);
universe@541 313 // remember: whole elements are discarded if they do not fit
universe@789 314 CX_TEST_ASSERT(written == 3);
universe@789 315 CX_TEST_ASSERT(buf.size == 9);
universe@789 316 CX_TEST_ASSERT(buf.pos == 9);
universe@541 317 EXPECT_GE(buf.capacity, 9);
universe@566 318 EXPECT_EQ(memcmp(buf.space, "pretester", 9), 0);
universe@538 319 }
universe@538 320
universe@538 321 TEST_F(BufferWrite, PutcWrapperFit) {
universe@789 322 CX_TEST_ASSERT(buf.capacity == 8);
universe@789 323 CX_TEST_ASSERT(buf.pos == 4);
universe@789 324 CX_TEST_ASSERT(buf.size == 4);
universe@565 325 int c = cxBufferPut(&buf, 0x200 | 'a');
universe@789 326 CX_TEST_ASSERT(c == 'a');
universe@789 327 CX_TEST_ASSERT(buf.size == 5);
universe@789 328 CX_TEST_ASSERT(buf.pos == 5);
universe@789 329 CX_TEST_ASSERT(buf.capacity == 8);
universe@541 330 EXPECT_EQ(memcmp(buf.space, "prepa\0", 6), 0);
universe@538 331 }
universe@538 332
universe@538 333 TEST_F(BufferWrite, PutcWrapperDiscard) {
universe@789 334 CX_TEST_ASSERT(buf.capacity == 8);
universe@789 335 CX_TEST_ASSERT(buf.size == 4);
universe@541 336 buf.pos = 8;
universe@565 337 int c = cxBufferPut(&buf, 0x200 | 'a');
universe@789 338 CX_TEST_ASSERT(c == EOF);
universe@789 339 CX_TEST_ASSERT(buf.size == 4);
universe@789 340 CX_TEST_ASSERT(buf.pos == 8);
universe@789 341 CX_TEST_ASSERT(buf.capacity == 8);
universe@541 342 EXPECT_EQ(memcmp(buf.space, "prep\0\0\0\0\0", 9), 0);
universe@538 343 }
universe@538 344
universe@538 345 TEST_F(BufferWrite, PutcWrapperExtend) {
universe@541 346 buf.flags |= CX_BUFFER_AUTO_EXTEND;
universe@789 347 CX_TEST_ASSERT(buf.capacity == 8);
universe@789 348 CX_TEST_ASSERT(buf.size == 4);
universe@541 349 buf.pos = 8;
universe@565 350 int c = cxBufferPut(&buf, 0x200 | 'a');
universe@789 351 CX_TEST_ASSERT(c == 'a');
universe@789 352 CX_TEST_ASSERT(buf.size == 9);
universe@789 353 CX_TEST_ASSERT(buf.pos == 9);
universe@541 354 EXPECT_GE(buf.capacity, 9);
universe@566 355 EXPECT_EQ(memcmp(buf.space, "prep\0\0\0\0a", 9), 0);
universe@538 356 }
universe@538 357
universe@538 358 TEST_F(BufferWrite, PutStringWrapperFit) {
universe@541 359 const char *data = "test";
universe@789 360 CX_TEST_ASSERT(buf.capacity == 8);
universe@789 361 CX_TEST_ASSERT(buf.pos == 4);
universe@789 362 CX_TEST_ASSERT(buf.size == 4);
universe@541 363 size_t written = cxBufferPutString(&buf, data);
universe@789 364 CX_TEST_ASSERT(written == 4);
universe@789 365 CX_TEST_ASSERT(buf.size == 8);
universe@789 366 CX_TEST_ASSERT(buf.pos == 8);
universe@789 367 CX_TEST_ASSERT(buf.capacity == 8);
universe@541 368 EXPECT_EQ(memcmp(buf.space, "preptest", 8), 0);
universe@538 369 }
universe@538 370
universe@538 371 TEST_F(BufferWrite, PutStringWrapperDiscard) {
universe@541 372 const char *data = "testing";
universe@789 373 CX_TEST_ASSERT(buf.capacity == 8);
universe@789 374 CX_TEST_ASSERT(buf.pos == 4);
universe@789 375 CX_TEST_ASSERT(buf.size == 4);
universe@541 376 size_t written = cxBufferPutString(&buf, data);
universe@789 377 CX_TEST_ASSERT(written == 4);
universe@789 378 CX_TEST_ASSERT(buf.size == 8);
universe@789 379 CX_TEST_ASSERT(buf.pos == 8);
universe@789 380 CX_TEST_ASSERT(buf.capacity == 8);
universe@541 381 EXPECT_EQ(memcmp(buf.space, "preptest\0", 9), 0);
universe@538 382 }
universe@538 383
universe@538 384 TEST_F(BufferWrite, PutStringWrapperExtend) {
universe@541 385 buf.flags |= CX_BUFFER_AUTO_EXTEND;
universe@541 386 const char *data = "testing";
universe@789 387 CX_TEST_ASSERT(buf.capacity == 8);
universe@789 388 CX_TEST_ASSERT(buf.pos == 4);
universe@789 389 CX_TEST_ASSERT(buf.size == 4);
universe@541 390 size_t written = cxBufferPutString(&buf, data);
universe@789 391 CX_TEST_ASSERT(written == 7);
universe@789 392 CX_TEST_ASSERT(buf.size == 11);
universe@789 393 CX_TEST_ASSERT(buf.pos == 11);
universe@541 394 EXPECT_GE(buf.capacity, 11);
universe@541 395 EXPECT_EQ(memcmp(buf.space, "preptesting", 11), 0);
universe@541 396 }
universe@538 397
universe@541 398 TEST_F(BufferWrite, MultOverflow) {
universe@541 399 const char *data = "testing";
universe@789 400 CX_TEST_ASSERT(buf.capacity == 8);
universe@789 401 CX_TEST_ASSERT(buf.pos == 4);
universe@789 402 CX_TEST_ASSERT(buf.size == 4);
universe@541 403 size_t written = cxBufferWrite(data, 8, SIZE_MAX / 4, &buf);
universe@789 404 CX_TEST_ASSERT(written == 0);
universe@789 405 CX_TEST_ASSERT(buf.capacity == 8);
universe@789 406 CX_TEST_ASSERT(buf.pos == 4);
universe@789 407 CX_TEST_ASSERT(buf.size == 4);
universe@541 408 EXPECT_EQ(memcmp(buf.space, "prep\0", 5), 0);
universe@538 409 }
universe@541 410
universe@541 411 TEST_F(BufferWrite, MaxCapaOverflow) {
universe@541 412 buf.flags |= CX_BUFFER_AUTO_EXTEND;
universe@541 413 const char *data = "testing";
universe@789 414 CX_TEST_ASSERT(buf.capacity == 8);
universe@789 415 CX_TEST_ASSERT(buf.pos == 4);
universe@789 416 CX_TEST_ASSERT(buf.size == 4);
universe@541 417 size_t written = cxBufferWrite(data, 1, SIZE_MAX - 2, &buf);
universe@789 418 CX_TEST_ASSERT(written == 0);
universe@789 419 CX_TEST_ASSERT(buf.capacity == 8);
universe@789 420 CX_TEST_ASSERT(buf.pos == 4);
universe@789 421 CX_TEST_ASSERT(buf.size == 4);
universe@541 422 EXPECT_EQ(memcmp(buf.space, "prep\0", 5), 0);
universe@541 423 }
universe@541 424
universe@541 425 TEST_F(BufferWrite, OnlyOverwrite) {
universe@541 426 buf.flags |= CX_BUFFER_AUTO_EXTEND;
universe@789 427 CX_TEST_ASSERT(buf.capacity == 8);
universe@541 428 memcpy(buf.space, "preptest", 8);
universe@541 429 buf.pos = 3;
universe@541 430 buf.size = 8;
universe@541 431 size_t written = cxBufferWrite("XXX", 2, 2, &buf);
universe@789 432 CX_TEST_ASSERT(written == 2);
universe@789 433 CX_TEST_ASSERT(buf.capacity == 8);
universe@789 434 CX_TEST_ASSERT(buf.size == 8);
universe@789 435 CX_TEST_ASSERT(buf.pos == 7);
universe@541 436 EXPECT_EQ(memcmp(buf.space, "preXXX\0t", 8), 0);
universe@541 437 }
universe@545 438
universe@545 439 TEST_F(BufferWrite, FlushAtCapacity) {
universe@545 440 enableFlushing();
universe@789 441 CX_TEST_ASSERT(buf.capacity == 8);
universe@789 442 CX_TEST_ASSERT(buf.pos == 4);
universe@545 443 size_t written = cxBufferWrite("foo", 1, 3, &buf);
universe@789 444 CX_TEST_ASSERT(written == 3);
universe@789 445 CX_TEST_ASSERT(buf.pos == 7);
universe@789 446 CX_TEST_ASSERT(buf.size == 7);
universe@789 447 CX_TEST_ASSERT(target.pos == 0);
universe@789 448 CX_TEST_ASSERT(target.size == 0);
universe@545 449 written = cxBufferWrite("hello", 1, 5, &buf);
universe@789 450 CX_TEST_ASSERT(written == 5);
universe@789 451 CX_TEST_ASSERT(buf.pos == 0);
universe@789 452 CX_TEST_ASSERT(buf.size == 0);
universe@789 453 CX_TEST_ASSERT(buf.capacity == 8);
universe@789 454 CX_TEST_ASSERT(target.pos == 12);
universe@789 455 CX_TEST_ASSERT(target.size == 12);
universe@545 456 EXPECT_EQ(memcmp(target.space, "prepfoohello", 12), 0);
universe@545 457 }
universe@546 458
universe@546 459 TEST_F(BufferWrite, FlushAtThreshold) {
universe@546 460 enableFlushing();
universe@546 461 buf.flush_threshold = 12;
universe@546 462 buf.flags |= CX_BUFFER_AUTO_EXTEND;
universe@789 463 CX_TEST_ASSERT(buf.capacity == 8);
universe@789 464 CX_TEST_ASSERT(buf.pos == 4);
universe@546 465 size_t written = cxBufferWrite("foobar", 1, 6, &buf);
universe@789 466 CX_TEST_ASSERT(written == 6);
universe@789 467 CX_TEST_ASSERT(buf.pos == 10);
universe@789 468 CX_TEST_ASSERT(buf.size == 10);
universe@546 469 ASSERT_GE(buf.capacity, 10);
universe@546 470 ASSERT_LE(buf.capacity, 12);
universe@789 471 CX_TEST_ASSERT(target.pos == 0);
universe@789 472 CX_TEST_ASSERT(target.size == 0);
universe@546 473 written = cxBufferWrite("hello", 1, 5, &buf);
universe@789 474 CX_TEST_ASSERT(written == 5);
universe@789 475 CX_TEST_ASSERT(buf.pos == 0);
universe@789 476 CX_TEST_ASSERT(buf.size == 0);
universe@546 477 EXPECT_LE(buf.capacity, 12);
universe@789 478 CX_TEST_ASSERT(target.pos == 15);
universe@789 479 CX_TEST_ASSERT(target.size == 15);
universe@546 480 EXPECT_EQ(memcmp(target.space, "prepfoobarhello", 15), 0);
universe@546 481 }
universe@547 482
universe@567 483 TEST_F(BufferWrite, FlushRateLimited) {
universe@567 484 enableFlushing();
universe@567 485 // limit the rate of the flush function and the capacity of the target
universe@567 486 target.capacity = 16;
universe@567 487 target.flags &= ~CX_BUFFER_AUTO_EXTEND;
universe@567 488 buf.flush_func = (cx_write_func) mock_write_limited_rate;
universe@789 489 CX_TEST_ASSERT(buf.capacity == 8);
universe@789 490 CX_TEST_ASSERT(buf.pos == 4);
universe@567 491 size_t written = cxBufferWrite("foo", 1, 3, &buf);
universe@789 492 CX_TEST_ASSERT(written == 3);
universe@789 493 CX_TEST_ASSERT(buf.pos == 7);
universe@789 494 CX_TEST_ASSERT(buf.size == 7);
universe@789 495 CX_TEST_ASSERT(target.pos == 0);
universe@789 496 CX_TEST_ASSERT(target.size == 0);
universe@567 497 written = cxBufferWrite("hello, world!", 1, 13, &buf);
universe@567 498 // " world!" fits into this buffer, the remaining stuff is flushed out
universe@789 499 CX_TEST_ASSERT(written == 13);
universe@789 500 CX_TEST_ASSERT(buf.pos == 7);
universe@789 501 CX_TEST_ASSERT(buf.size == 7);
universe@789 502 CX_TEST_ASSERT(buf.capacity == 8);
universe@567 503 EXPECT_EQ(memcmp(buf.space, " world!", 7), 0);
universe@789 504 CX_TEST_ASSERT(target.pos == 13);
universe@789 505 CX_TEST_ASSERT(target.size == 13);
universe@789 506 CX_TEST_ASSERT(target.capacity == 16);
universe@567 507 EXPECT_EQ(memcmp(target.space, "prepfoohello,", 13), 0);
universe@567 508 }
universe@567 509
universe@548 510
universe@548 511 TEST_F(BufferEof, Reached) {
universe@548 512 buf.pos = buf.size;
universe@789 513 CX_TEST_ASSERT(cxBufferEof(&buf));
universe@548 514 buf.pos = buf.size - 1;
universe@789 515 CX_TEST_ASSERT(!cxBufferEof(&buf));
universe@548 516 cxBufferPut(&buf, 'a');
universe@789 517 CX_TEST_ASSERT(cxBufferEof(&buf));
universe@548 518 }
universe@548 519
universe@548 520 TEST_F(BufferEof, NotReached) {
universe@548 521 buf.pos = buf.size - 1;
universe@789 522 CX_TEST_ASSERT(!cxBufferEof(&buf));
universe@548 523 buf.pos = 0;
universe@548 524 cxBufferWrite("test", 1, 5, &buf);
universe@789 525 CX_TEST_ASSERT(!cxBufferEof(&buf));
universe@548 526 }
universe@568 527
universe@568 528 class BufferRead : public ::testing::Test {
universe@568 529 protected:
universe@568 530 CxBuffer buf{};
universe@568 531
universe@568 532 void SetUp() override {
universe@789 533 cxBufferInit(&buf, NULL, 16, cxDefaultAllocator, CX_BUFFER_DEFAULT);
universe@568 534 buf.capacity = 8; // artificially reduce capacity to check OOB writes
universe@568 535 memset(buf.space, 0, 16);
universe@568 536 memcpy(buf.space, "some data", 9);
universe@568 537 buf.size = 9;
universe@568 538 }
universe@568 539
universe@568 540 void TearDown() override {
universe@568 541 cxBufferDestroy(&buf);
universe@568 542 }
universe@568 543 };
universe@568 544
universe@568 545 TEST_F(BufferRead, GetByte) {
universe@568 546 buf.pos = 2;
universe@568 547 EXPECT_EQ(cxBufferGet(&buf), 'm');
universe@568 548 EXPECT_EQ(cxBufferGet(&buf), 'e');
universe@568 549 EXPECT_EQ(cxBufferGet(&buf), ' ');
universe@568 550 EXPECT_EQ(cxBufferGet(&buf), 'd');
universe@789 551 CX_TEST_ASSERT(buf.pos == 6);
universe@568 552 }
universe@568 553
universe@568 554 TEST_F(BufferRead, GetEof) {
universe@568 555 buf.pos = buf.size;
universe@568 556 EXPECT_EQ(cxBufferGet(&buf), EOF);
universe@568 557 }
universe@569 558
universe@569 559 TEST_F(BufferRead, ReadWithinBounds) {
universe@569 560 buf.pos = 2;
universe@569 561 char target[4];
universe@569 562 auto read = cxBufferRead(&target, 1, 4, &buf);
universe@789 563 CX_TEST_ASSERT(read == 4);
universe@569 564 EXPECT_EQ(memcmp(&target, "me d", 4), 0);
universe@789 565 CX_TEST_ASSERT(buf.pos == 6);
universe@569 566 }
universe@569 567
universe@569 568 TEST_F(BufferRead, ReadOutOfBounds) {
universe@569 569 buf.pos = 6;
universe@569 570 char target[4];
universe@569 571 auto read = cxBufferRead(&target, 1, 4, &buf);
universe@789 572 CX_TEST_ASSERT(read == 3);
universe@569 573 EXPECT_EQ(memcmp(&target, "ata", 3), 0);
universe@789 574 CX_TEST_ASSERT(buf.pos == 9);
universe@569 575 }
universe@569 576
universe@569 577 TEST_F(BufferRead, ReadOutOfBoundsMultibyte) {
universe@569 578 buf.pos = 6;
universe@569 579 char target[4];
universe@569 580 target[2] = '\0';
universe@569 581 auto read = cxBufferRead(&target, 2, 2, &buf);
universe@789 582 CX_TEST_ASSERT(read == 1);
universe@569 583 EXPECT_EQ(memcmp(&target, "at\0", 3), 0);
universe@789 584 CX_TEST_ASSERT(buf.pos == 8);
universe@569 585 }
universe@569 586
universe@569 587 TEST_F(BufferRead, ReadEof) {
universe@569 588 buf.pos = 9;
universe@569 589 char target[4];
universe@569 590 auto read = cxBufferRead(&target, 1, 1, &buf);
universe@789 591 CX_TEST_ASSERT(read == 0);
universe@789 592 CX_TEST_ASSERT(buf.pos == 9);
universe@569 593 }

mercurial