tests/test_buffer.cpp

Wed, 03 Jan 2024 22:17:40 +0100

author
Mike Becker <universe@uap-core.de>
date
Wed, 03 Jan 2024 22:17:40 +0100
changeset 792
3ca984931e1d
parent 789
9b2f5661bebd
permissions
-rw-r--r--

migrate more buffer tests - relates to #342

only read and write tests are remaining now

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@538 34 class BufferWrite : public ::testing::Test {
universe@538 35 protected:
universe@545 36 CxBuffer buf{}, target{};
universe@538 37
universe@538 38 void SetUp() override {
universe@789 39 cxBufferInit(&target, NULL, 16, cxDefaultAllocator, CX_BUFFER_AUTO_EXTEND);
universe@789 40 cxBufferInit(&buf, NULL, 16, cxDefaultAllocator, CX_BUFFER_DEFAULT);
universe@538 41 buf.capacity = 8; // artificially reduce capacity to check OOB writes
universe@538 42 memset(buf.space, 0, 16);
universe@538 43 memcpy(buf.space, "prep", 4);
universe@538 44 buf.size = buf.pos = 4;
universe@538 45 }
universe@538 46
universe@538 47 void TearDown() override {
universe@538 48 cxBufferDestroy(&buf);
universe@545 49 cxBufferDestroy(&target);
universe@545 50 }
universe@545 51
universe@545 52 void enableFlushing() {
universe@545 53 buf.flush_target = &target;
universe@545 54 buf.flush_func = reinterpret_cast<cx_write_func>(cxBufferWrite);
universe@545 55 buf.flush_blkmax = 1;
universe@538 56 }
universe@538 57 };
universe@538 58
universe@567 59 static size_t mock_write_limited_rate(
universe@567 60 void const *ptr,
universe@567 61 size_t size,
universe@567 62 __attribute__((unused)) size_t nitems,
universe@567 63 CxBuffer *buffer
universe@567 64 ) {
universe@567 65 // simulate limited target drain capacity
universe@567 66 static bool full = false;
universe@567 67 if (full) {
universe@567 68 full = false;
universe@567 69 return 0;
universe@567 70 } else {
universe@567 71 full = true;
universe@567 72 return cxBufferWrite(ptr, size, nitems > 2 ? 2 : nitems, buffer);
universe@567 73 }
universe@567 74 }
universe@567 75
universe@538 76 TEST_F(BufferWrite, SizeOneFit) {
universe@538 77 const char *data = "test";
universe@789 78 CX_TEST_ASSERT(buf.capacity == 8);
universe@789 79 CX_TEST_ASSERT(buf.pos == 4);
universe@789 80 CX_TEST_ASSERT(buf.size == 4);
universe@538 81 size_t written = cxBufferWrite(data, 1, 4, &buf);
universe@789 82 CX_TEST_ASSERT(written == 4);
universe@789 83 CX_TEST_ASSERT(buf.size == 8);
universe@789 84 CX_TEST_ASSERT(buf.pos == 8);
universe@789 85 CX_TEST_ASSERT(buf.capacity == 8);
universe@538 86 EXPECT_EQ(memcmp(buf.space, "preptest", 8), 0);
universe@538 87 }
universe@538 88
universe@538 89 TEST_F(BufferWrite, SizeOneDiscard) {
universe@538 90 const char *data = "testing";
universe@789 91 CX_TEST_ASSERT(buf.capacity == 8);
universe@789 92 CX_TEST_ASSERT(buf.pos == 4);
universe@789 93 CX_TEST_ASSERT(buf.size == 4);
universe@538 94 size_t written = cxBufferWrite(data, 1, 7, &buf);
universe@789 95 CX_TEST_ASSERT(written == 4);
universe@789 96 CX_TEST_ASSERT(buf.size == 8);
universe@789 97 CX_TEST_ASSERT(buf.pos == 8);
universe@789 98 CX_TEST_ASSERT(buf.capacity == 8);
universe@538 99 EXPECT_EQ(memcmp(buf.space, "preptest\0", 9), 0);
universe@538 100 }
universe@538 101
universe@538 102 TEST_F(BufferWrite, SizeOneExtend) {
universe@538 103 buf.flags |= CX_BUFFER_AUTO_EXTEND;
universe@538 104 const char *data = "testing";
universe@789 105 CX_TEST_ASSERT(buf.capacity == 8);
universe@789 106 CX_TEST_ASSERT(buf.pos == 4);
universe@789 107 CX_TEST_ASSERT(buf.size == 4);
universe@538 108 size_t written = cxBufferWrite(data, 1, 7, &buf);
universe@789 109 CX_TEST_ASSERT(written == 7);
universe@789 110 CX_TEST_ASSERT(buf.size == 11);
universe@789 111 CX_TEST_ASSERT(buf.pos == 11);
universe@538 112 EXPECT_GE(buf.capacity, 11);
universe@538 113 EXPECT_EQ(memcmp(buf.space, "preptesting", 11), 0);
universe@538 114 }
universe@538 115
universe@538 116 TEST_F(BufferWrite, MultibyteFit) {
universe@541 117 const char *data = "test";
universe@789 118 CX_TEST_ASSERT(buf.capacity == 8);
universe@789 119 CX_TEST_ASSERT(buf.pos == 4);
universe@789 120 CX_TEST_ASSERT(buf.size == 4);
universe@541 121 size_t written = cxBufferWrite(data, 2, 2, &buf);
universe@789 122 CX_TEST_ASSERT(written == 2);
universe@789 123 CX_TEST_ASSERT(buf.size == 8);
universe@789 124 CX_TEST_ASSERT(buf.pos == 8);
universe@789 125 CX_TEST_ASSERT(buf.capacity == 8);
universe@541 126 EXPECT_EQ(memcmp(buf.space, "preptest", 8), 0);
universe@538 127 }
universe@538 128
universe@538 129 TEST_F(BufferWrite, MultibyteDiscard) {
universe@542 130 const char *data = "testing";
universe@789 131 CX_TEST_ASSERT(buf.capacity == 8);
universe@789 132 CX_TEST_ASSERT(buf.size == 4);
universe@541 133 buf.pos = 3;
universe@542 134 size_t written = cxBufferWrite(data, 2, 4, &buf);
universe@538 135 // remember: whole elements are discarded if they do not fit
universe@789 136 CX_TEST_ASSERT(written == 2);
universe@789 137 CX_TEST_ASSERT(buf.size == 7);
universe@789 138 CX_TEST_ASSERT(buf.pos == 7);
universe@789 139 CX_TEST_ASSERT(buf.capacity == 8);
universe@541 140 EXPECT_EQ(memcmp(buf.space, "pretest\0", 8), 0);
universe@538 141 }
universe@538 142
universe@538 143 TEST_F(BufferWrite, MultibyteExtend) {
universe@541 144 buf.flags |= CX_BUFFER_AUTO_EXTEND;
universe@541 145 const char *data = "tester";
universe@789 146 CX_TEST_ASSERT(buf.capacity == 8);
universe@789 147 CX_TEST_ASSERT(buf.size == 4);
universe@541 148 buf.pos = 3;
universe@541 149 size_t written = cxBufferWrite(data, 2, 3, &buf);
universe@541 150 // remember: whole elements are discarded if they do not fit
universe@789 151 CX_TEST_ASSERT(written == 3);
universe@789 152 CX_TEST_ASSERT(buf.size == 9);
universe@789 153 CX_TEST_ASSERT(buf.pos == 9);
universe@541 154 EXPECT_GE(buf.capacity, 9);
universe@566 155 EXPECT_EQ(memcmp(buf.space, "pretester", 9), 0);
universe@538 156 }
universe@538 157
universe@538 158 TEST_F(BufferWrite, PutcWrapperFit) {
universe@789 159 CX_TEST_ASSERT(buf.capacity == 8);
universe@789 160 CX_TEST_ASSERT(buf.pos == 4);
universe@789 161 CX_TEST_ASSERT(buf.size == 4);
universe@565 162 int c = cxBufferPut(&buf, 0x200 | 'a');
universe@789 163 CX_TEST_ASSERT(c == 'a');
universe@789 164 CX_TEST_ASSERT(buf.size == 5);
universe@789 165 CX_TEST_ASSERT(buf.pos == 5);
universe@789 166 CX_TEST_ASSERT(buf.capacity == 8);
universe@541 167 EXPECT_EQ(memcmp(buf.space, "prepa\0", 6), 0);
universe@538 168 }
universe@538 169
universe@538 170 TEST_F(BufferWrite, PutcWrapperDiscard) {
universe@789 171 CX_TEST_ASSERT(buf.capacity == 8);
universe@789 172 CX_TEST_ASSERT(buf.size == 4);
universe@541 173 buf.pos = 8;
universe@565 174 int c = cxBufferPut(&buf, 0x200 | 'a');
universe@789 175 CX_TEST_ASSERT(c == EOF);
universe@789 176 CX_TEST_ASSERT(buf.size == 4);
universe@789 177 CX_TEST_ASSERT(buf.pos == 8);
universe@789 178 CX_TEST_ASSERT(buf.capacity == 8);
universe@541 179 EXPECT_EQ(memcmp(buf.space, "prep\0\0\0\0\0", 9), 0);
universe@538 180 }
universe@538 181
universe@538 182 TEST_F(BufferWrite, PutcWrapperExtend) {
universe@541 183 buf.flags |= CX_BUFFER_AUTO_EXTEND;
universe@789 184 CX_TEST_ASSERT(buf.capacity == 8);
universe@789 185 CX_TEST_ASSERT(buf.size == 4);
universe@541 186 buf.pos = 8;
universe@565 187 int c = cxBufferPut(&buf, 0x200 | 'a');
universe@789 188 CX_TEST_ASSERT(c == 'a');
universe@789 189 CX_TEST_ASSERT(buf.size == 9);
universe@789 190 CX_TEST_ASSERT(buf.pos == 9);
universe@541 191 EXPECT_GE(buf.capacity, 9);
universe@566 192 EXPECT_EQ(memcmp(buf.space, "prep\0\0\0\0a", 9), 0);
universe@538 193 }
universe@538 194
universe@538 195 TEST_F(BufferWrite, PutStringWrapperFit) {
universe@541 196 const char *data = "test";
universe@789 197 CX_TEST_ASSERT(buf.capacity == 8);
universe@789 198 CX_TEST_ASSERT(buf.pos == 4);
universe@789 199 CX_TEST_ASSERT(buf.size == 4);
universe@541 200 size_t written = cxBufferPutString(&buf, data);
universe@789 201 CX_TEST_ASSERT(written == 4);
universe@789 202 CX_TEST_ASSERT(buf.size == 8);
universe@789 203 CX_TEST_ASSERT(buf.pos == 8);
universe@789 204 CX_TEST_ASSERT(buf.capacity == 8);
universe@541 205 EXPECT_EQ(memcmp(buf.space, "preptest", 8), 0);
universe@538 206 }
universe@538 207
universe@538 208 TEST_F(BufferWrite, PutStringWrapperDiscard) {
universe@541 209 const char *data = "testing";
universe@789 210 CX_TEST_ASSERT(buf.capacity == 8);
universe@789 211 CX_TEST_ASSERT(buf.pos == 4);
universe@789 212 CX_TEST_ASSERT(buf.size == 4);
universe@541 213 size_t written = cxBufferPutString(&buf, data);
universe@789 214 CX_TEST_ASSERT(written == 4);
universe@789 215 CX_TEST_ASSERT(buf.size == 8);
universe@789 216 CX_TEST_ASSERT(buf.pos == 8);
universe@789 217 CX_TEST_ASSERT(buf.capacity == 8);
universe@541 218 EXPECT_EQ(memcmp(buf.space, "preptest\0", 9), 0);
universe@538 219 }
universe@538 220
universe@538 221 TEST_F(BufferWrite, PutStringWrapperExtend) {
universe@541 222 buf.flags |= CX_BUFFER_AUTO_EXTEND;
universe@541 223 const char *data = "testing";
universe@789 224 CX_TEST_ASSERT(buf.capacity == 8);
universe@789 225 CX_TEST_ASSERT(buf.pos == 4);
universe@789 226 CX_TEST_ASSERT(buf.size == 4);
universe@541 227 size_t written = cxBufferPutString(&buf, data);
universe@789 228 CX_TEST_ASSERT(written == 7);
universe@789 229 CX_TEST_ASSERT(buf.size == 11);
universe@789 230 CX_TEST_ASSERT(buf.pos == 11);
universe@541 231 EXPECT_GE(buf.capacity, 11);
universe@541 232 EXPECT_EQ(memcmp(buf.space, "preptesting", 11), 0);
universe@541 233 }
universe@538 234
universe@541 235 TEST_F(BufferWrite, MultOverflow) {
universe@541 236 const char *data = "testing";
universe@789 237 CX_TEST_ASSERT(buf.capacity == 8);
universe@789 238 CX_TEST_ASSERT(buf.pos == 4);
universe@789 239 CX_TEST_ASSERT(buf.size == 4);
universe@541 240 size_t written = cxBufferWrite(data, 8, SIZE_MAX / 4, &buf);
universe@789 241 CX_TEST_ASSERT(written == 0);
universe@789 242 CX_TEST_ASSERT(buf.capacity == 8);
universe@789 243 CX_TEST_ASSERT(buf.pos == 4);
universe@789 244 CX_TEST_ASSERT(buf.size == 4);
universe@541 245 EXPECT_EQ(memcmp(buf.space, "prep\0", 5), 0);
universe@538 246 }
universe@541 247
universe@541 248 TEST_F(BufferWrite, MaxCapaOverflow) {
universe@541 249 buf.flags |= CX_BUFFER_AUTO_EXTEND;
universe@541 250 const char *data = "testing";
universe@789 251 CX_TEST_ASSERT(buf.capacity == 8);
universe@789 252 CX_TEST_ASSERT(buf.pos == 4);
universe@789 253 CX_TEST_ASSERT(buf.size == 4);
universe@541 254 size_t written = cxBufferWrite(data, 1, SIZE_MAX - 2, &buf);
universe@789 255 CX_TEST_ASSERT(written == 0);
universe@789 256 CX_TEST_ASSERT(buf.capacity == 8);
universe@789 257 CX_TEST_ASSERT(buf.pos == 4);
universe@789 258 CX_TEST_ASSERT(buf.size == 4);
universe@541 259 EXPECT_EQ(memcmp(buf.space, "prep\0", 5), 0);
universe@541 260 }
universe@541 261
universe@541 262 TEST_F(BufferWrite, OnlyOverwrite) {
universe@541 263 buf.flags |= CX_BUFFER_AUTO_EXTEND;
universe@789 264 CX_TEST_ASSERT(buf.capacity == 8);
universe@541 265 memcpy(buf.space, "preptest", 8);
universe@541 266 buf.pos = 3;
universe@541 267 buf.size = 8;
universe@541 268 size_t written = cxBufferWrite("XXX", 2, 2, &buf);
universe@789 269 CX_TEST_ASSERT(written == 2);
universe@789 270 CX_TEST_ASSERT(buf.capacity == 8);
universe@789 271 CX_TEST_ASSERT(buf.size == 8);
universe@789 272 CX_TEST_ASSERT(buf.pos == 7);
universe@541 273 EXPECT_EQ(memcmp(buf.space, "preXXX\0t", 8), 0);
universe@541 274 }
universe@545 275
universe@545 276 TEST_F(BufferWrite, FlushAtCapacity) {
universe@545 277 enableFlushing();
universe@789 278 CX_TEST_ASSERT(buf.capacity == 8);
universe@789 279 CX_TEST_ASSERT(buf.pos == 4);
universe@545 280 size_t written = cxBufferWrite("foo", 1, 3, &buf);
universe@789 281 CX_TEST_ASSERT(written == 3);
universe@789 282 CX_TEST_ASSERT(buf.pos == 7);
universe@789 283 CX_TEST_ASSERT(buf.size == 7);
universe@789 284 CX_TEST_ASSERT(target.pos == 0);
universe@789 285 CX_TEST_ASSERT(target.size == 0);
universe@545 286 written = cxBufferWrite("hello", 1, 5, &buf);
universe@789 287 CX_TEST_ASSERT(written == 5);
universe@789 288 CX_TEST_ASSERT(buf.pos == 0);
universe@789 289 CX_TEST_ASSERT(buf.size == 0);
universe@789 290 CX_TEST_ASSERT(buf.capacity == 8);
universe@789 291 CX_TEST_ASSERT(target.pos == 12);
universe@789 292 CX_TEST_ASSERT(target.size == 12);
universe@545 293 EXPECT_EQ(memcmp(target.space, "prepfoohello", 12), 0);
universe@545 294 }
universe@546 295
universe@546 296 TEST_F(BufferWrite, FlushAtThreshold) {
universe@546 297 enableFlushing();
universe@546 298 buf.flush_threshold = 12;
universe@546 299 buf.flags |= CX_BUFFER_AUTO_EXTEND;
universe@789 300 CX_TEST_ASSERT(buf.capacity == 8);
universe@789 301 CX_TEST_ASSERT(buf.pos == 4);
universe@546 302 size_t written = cxBufferWrite("foobar", 1, 6, &buf);
universe@789 303 CX_TEST_ASSERT(written == 6);
universe@789 304 CX_TEST_ASSERT(buf.pos == 10);
universe@789 305 CX_TEST_ASSERT(buf.size == 10);
universe@546 306 ASSERT_GE(buf.capacity, 10);
universe@546 307 ASSERT_LE(buf.capacity, 12);
universe@789 308 CX_TEST_ASSERT(target.pos == 0);
universe@789 309 CX_TEST_ASSERT(target.size == 0);
universe@546 310 written = cxBufferWrite("hello", 1, 5, &buf);
universe@789 311 CX_TEST_ASSERT(written == 5);
universe@789 312 CX_TEST_ASSERT(buf.pos == 0);
universe@789 313 CX_TEST_ASSERT(buf.size == 0);
universe@546 314 EXPECT_LE(buf.capacity, 12);
universe@789 315 CX_TEST_ASSERT(target.pos == 15);
universe@789 316 CX_TEST_ASSERT(target.size == 15);
universe@546 317 EXPECT_EQ(memcmp(target.space, "prepfoobarhello", 15), 0);
universe@546 318 }
universe@547 319
universe@567 320 TEST_F(BufferWrite, FlushRateLimited) {
universe@567 321 enableFlushing();
universe@567 322 // limit the rate of the flush function and the capacity of the target
universe@567 323 target.capacity = 16;
universe@567 324 target.flags &= ~CX_BUFFER_AUTO_EXTEND;
universe@567 325 buf.flush_func = (cx_write_func) mock_write_limited_rate;
universe@789 326 CX_TEST_ASSERT(buf.capacity == 8);
universe@789 327 CX_TEST_ASSERT(buf.pos == 4);
universe@567 328 size_t written = cxBufferWrite("foo", 1, 3, &buf);
universe@789 329 CX_TEST_ASSERT(written == 3);
universe@789 330 CX_TEST_ASSERT(buf.pos == 7);
universe@789 331 CX_TEST_ASSERT(buf.size == 7);
universe@789 332 CX_TEST_ASSERT(target.pos == 0);
universe@789 333 CX_TEST_ASSERT(target.size == 0);
universe@567 334 written = cxBufferWrite("hello, world!", 1, 13, &buf);
universe@567 335 // " world!" fits into this buffer, the remaining stuff is flushed out
universe@789 336 CX_TEST_ASSERT(written == 13);
universe@789 337 CX_TEST_ASSERT(buf.pos == 7);
universe@789 338 CX_TEST_ASSERT(buf.size == 7);
universe@789 339 CX_TEST_ASSERT(buf.capacity == 8);
universe@567 340 EXPECT_EQ(memcmp(buf.space, " world!", 7), 0);
universe@789 341 CX_TEST_ASSERT(target.pos == 13);
universe@789 342 CX_TEST_ASSERT(target.size == 13);
universe@789 343 CX_TEST_ASSERT(target.capacity == 16);
universe@567 344 EXPECT_EQ(memcmp(target.space, "prepfoohello,", 13), 0);
universe@567 345 }
universe@567 346
universe@568 347 class BufferRead : public ::testing::Test {
universe@568 348 protected:
universe@568 349 CxBuffer buf{};
universe@568 350
universe@568 351 void SetUp() override {
universe@789 352 cxBufferInit(&buf, NULL, 16, cxDefaultAllocator, CX_BUFFER_DEFAULT);
universe@568 353 buf.capacity = 8; // artificially reduce capacity to check OOB writes
universe@568 354 memset(buf.space, 0, 16);
universe@568 355 memcpy(buf.space, "some data", 9);
universe@568 356 buf.size = 9;
universe@568 357 }
universe@568 358
universe@568 359 void TearDown() override {
universe@568 360 cxBufferDestroy(&buf);
universe@568 361 }
universe@568 362 };
universe@568 363
universe@568 364 TEST_F(BufferRead, GetByte) {
universe@568 365 buf.pos = 2;
universe@568 366 EXPECT_EQ(cxBufferGet(&buf), 'm');
universe@568 367 EXPECT_EQ(cxBufferGet(&buf), 'e');
universe@568 368 EXPECT_EQ(cxBufferGet(&buf), ' ');
universe@568 369 EXPECT_EQ(cxBufferGet(&buf), 'd');
universe@789 370 CX_TEST_ASSERT(buf.pos == 6);
universe@568 371 }
universe@568 372
universe@568 373 TEST_F(BufferRead, GetEof) {
universe@568 374 buf.pos = buf.size;
universe@568 375 EXPECT_EQ(cxBufferGet(&buf), EOF);
universe@568 376 }
universe@569 377
universe@569 378 TEST_F(BufferRead, ReadWithinBounds) {
universe@569 379 buf.pos = 2;
universe@569 380 char target[4];
universe@569 381 auto read = cxBufferRead(&target, 1, 4, &buf);
universe@789 382 CX_TEST_ASSERT(read == 4);
universe@569 383 EXPECT_EQ(memcmp(&target, "me d", 4), 0);
universe@789 384 CX_TEST_ASSERT(buf.pos == 6);
universe@569 385 }
universe@569 386
universe@569 387 TEST_F(BufferRead, ReadOutOfBounds) {
universe@569 388 buf.pos = 6;
universe@569 389 char target[4];
universe@569 390 auto read = cxBufferRead(&target, 1, 4, &buf);
universe@789 391 CX_TEST_ASSERT(read == 3);
universe@569 392 EXPECT_EQ(memcmp(&target, "ata", 3), 0);
universe@789 393 CX_TEST_ASSERT(buf.pos == 9);
universe@569 394 }
universe@569 395
universe@569 396 TEST_F(BufferRead, ReadOutOfBoundsMultibyte) {
universe@569 397 buf.pos = 6;
universe@569 398 char target[4];
universe@569 399 target[2] = '\0';
universe@569 400 auto read = cxBufferRead(&target, 2, 2, &buf);
universe@789 401 CX_TEST_ASSERT(read == 1);
universe@569 402 EXPECT_EQ(memcmp(&target, "at\0", 3), 0);
universe@789 403 CX_TEST_ASSERT(buf.pos == 8);
universe@569 404 }
universe@569 405
universe@569 406 TEST_F(BufferRead, ReadEof) {
universe@569 407 buf.pos = 9;
universe@569 408 char target[4];
universe@569 409 auto read = cxBufferRead(&target, 1, 1, &buf);
universe@789 410 CX_TEST_ASSERT(read == 0);
universe@789 411 CX_TEST_ASSERT(buf.pos == 9);
universe@569 412 }

mercurial