| 1173 CX_TEST_ASSERT(0 == memcmp(buf.space, " world!", 7)); |
1173 CX_TEST_ASSERT(0 == memcmp(buf.space, " world!", 7)); |
| 1174 CX_TEST_ASSERT(target.pos == 13); |
1174 CX_TEST_ASSERT(target.pos == 13); |
| 1175 CX_TEST_ASSERT(target.size == 13); |
1175 CX_TEST_ASSERT(target.size == 13); |
| 1176 CX_TEST_ASSERT(target.capacity >= 13); |
1176 CX_TEST_ASSERT(target.capacity >= 13); |
| 1177 CX_TEST_ASSERT(0 == memcmp(target.space, "prepfoohello,", 13)); |
1177 CX_TEST_ASSERT(0 == memcmp(target.space, "prepfoohello,", 13)); |
| |
1178 } |
| |
1179 cxBufferDestroy(&buf); |
| |
1180 cxBufferDestroy(&target); |
| |
1181 } |
| |
1182 |
| |
1183 CX_TEST(test_buffer_write_flush_multibyte) { |
| |
1184 // this test case tests that flushing works correctly even when the |
| |
1185 // contents in the buffer are currently not aligned with the item size |
| |
1186 CxBuffer buf, target; |
| |
1187 cxBufferInit(&target, NULL, 8, cxDefaultAllocator, CX_BUFFER_AUTO_EXTEND); |
| |
1188 cxBufferInit(&buf, NULL, 8, cxDefaultAllocator, CX_BUFFER_DEFAULT); |
| |
1189 memset(buf.space, 0, 8); |
| |
1190 cxBufferPutString(&buf, "pre"); |
| |
1191 CX_TEST_DO { |
| |
1192 CxBufferFlushConfig flush; |
| |
1193 flush.threshold = 0; |
| |
1194 flush.blksize = 4; // test blksize that is not aligned |
| |
1195 flush.blkmax = 2; // test with two blocks |
| |
1196 flush.target = ⌖ |
| |
1197 flush.wfunc = cxBufferWriteFunc; |
| |
1198 CX_TEST_ASSERT(0 == cxBufferEnableFlushing(&buf, flush)); |
| |
1199 // first case: string fits after flush |
| |
1200 size_t written = cxBufferWrite("foobar", 3, 2, &buf); |
| |
1201 CX_TEST_ASSERT(written == 2); |
| |
1202 CX_TEST_ASSERT(buf.pos == 6); |
| |
1203 CX_TEST_ASSERT(buf.size == 6); |
| |
1204 CX_TEST_ASSERT(target.pos == 3); |
| |
1205 CX_TEST_ASSERT(target.size == 3); |
| |
1206 CX_TEST_ASSERT(0 == memcmp(buf.space, "foobar", 6)); |
| |
1207 CX_TEST_ASSERT(0 == memcmp(target.space, "pre", 3)); |
| |
1208 // second case: string does not fit, data is relayed, but only two blocks! |
| |
1209 written = cxBufferWrite("bazfooBAR", 3, 3, &buf); |
| |
1210 CX_TEST_ASSERT(written == 3); |
| |
1211 CX_TEST_ASSERT(buf.pos == 3); |
| |
1212 CX_TEST_ASSERT(buf.size == 3); |
| |
1213 CX_TEST_ASSERT(target.pos == 15); |
| |
1214 CX_TEST_ASSERT(target.size == 15); |
| |
1215 CX_TEST_ASSERT(0 == memcmp(buf.space, "BAR", 3)); |
| |
1216 CX_TEST_ASSERT(0 == memcmp(target.space, "prefoobarbazfoo", 15)); |
| |
1217 // third case: everything can be relayed, block size is large enough |
| |
1218 buf.flush->blkmax = 3; |
| |
1219 written = cxBufferWrite("abcdef012", 3, 3, &buf); |
| |
1220 CX_TEST_ASSERT(written == 3); |
| |
1221 CX_TEST_ASSERT(buf.pos == 0); |
| |
1222 CX_TEST_ASSERT(buf.size == 0); |
| |
1223 CX_TEST_ASSERT(target.pos == 27); |
| |
1224 CX_TEST_ASSERT(target.size == 27); |
| |
1225 CX_TEST_ASSERT(0 == memcmp(target.space, "prefoobarbazfooBARabcdef012", 27)); |
| |
1226 } |
| |
1227 cxBufferDestroy(&buf); |
| |
1228 cxBufferDestroy(&target); |
| |
1229 } |
| |
1230 |
| |
1231 CX_TEST(test_buffer_write_flush_misaligned) { |
| |
1232 // this test case tests that flushing works correctly even when the |
| |
1233 // contents in the buffer are currently not aligned with the item size |
| |
1234 CxBuffer buf, target; |
| |
1235 cxBufferInit(&target, NULL, 8, cxDefaultAllocator, CX_BUFFER_AUTO_EXTEND); |
| |
1236 cxBufferInit(&buf, NULL, 8, cxDefaultAllocator, CX_BUFFER_DEFAULT); |
| |
1237 memset(buf.space, 0, 8); |
| |
1238 cxBufferPutString(&buf, "prep"); |
| |
1239 CX_TEST_DO { |
| |
1240 CxBufferFlushConfig flush; |
| |
1241 flush.threshold = 0; |
| |
1242 flush.blksize = 32; |
| |
1243 flush.blkmax = 1; |
| |
1244 flush.target = ⌖ |
| |
1245 flush.wfunc = cxBufferWriteFunc; |
| |
1246 CX_TEST_ASSERT(0 == cxBufferEnableFlushing(&buf, flush)); |
| |
1247 // first case: string fits after flush |
| |
1248 size_t written = cxBufferWrite("foobar", 3, 2, &buf); |
| |
1249 CX_TEST_ASSERT(written == 2); |
| |
1250 CX_TEST_ASSERT(buf.pos == 7); |
| |
1251 CX_TEST_ASSERT(buf.size == 7); |
| |
1252 CX_TEST_ASSERT(target.pos == 3); |
| |
1253 CX_TEST_ASSERT(target.size == 3); |
| |
1254 CX_TEST_ASSERT(0 == memcmp(buf.space, "pfoobar", 7)); |
| |
1255 CX_TEST_ASSERT(0 == memcmp(target.space, "pre", 3)); |
| |
1256 // second case: string does not fit, relaying not possible due to misalignment |
| |
1257 written = cxBufferWrite("bazfoobar", 3, 3, &buf); |
| |
1258 CX_TEST_ASSERT(written == 0); |
| |
1259 CX_TEST_ASSERT(buf.pos == 1); |
| |
1260 CX_TEST_ASSERT(buf.size == 1); |
| |
1261 CX_TEST_ASSERT(target.pos == 9); |
| |
1262 CX_TEST_ASSERT(target.size == 9); |
| |
1263 CX_TEST_ASSERT(0 == memcmp(buf.space, "r", 1)); |
| |
1264 CX_TEST_ASSERT(0 == memcmp(target.space, "prepfooba", 9)); |
| 1178 } |
1265 } |
| 1179 cxBufferDestroy(&buf); |
1266 cxBufferDestroy(&buf); |
| 1180 cxBufferDestroy(&target); |
1267 cxBufferDestroy(&target); |
| 1181 } |
1268 } |
| 1182 |
1269 |
| 1375 cx_test_register(suite, test_buffer_write_capacity_overflow); |
1462 cx_test_register(suite, test_buffer_write_capacity_overflow); |
| 1376 cx_test_register(suite, test_buffer_write_only_overwrite); |
1463 cx_test_register(suite, test_buffer_write_only_overwrite); |
| 1377 cx_test_register(suite, test_buffer_write_flush_at_capacity); |
1464 cx_test_register(suite, test_buffer_write_flush_at_capacity); |
| 1378 cx_test_register(suite, test_buffer_write_flush_at_threshold); |
1465 cx_test_register(suite, test_buffer_write_flush_at_threshold); |
| 1379 cx_test_register(suite, test_buffer_write_flush_rate_limited_and_buffer_too_small); |
1466 cx_test_register(suite, test_buffer_write_flush_rate_limited_and_buffer_too_small); |
| |
1467 cx_test_register(suite, test_buffer_write_flush_multibyte); |
| |
1468 cx_test_register(suite, test_buffer_write_flush_misaligned); |
| 1380 cx_test_register(suite, test_buffer_flush); |
1469 cx_test_register(suite, test_buffer_flush); |
| 1381 cx_test_register(suite, test_buffer_get); |
1470 cx_test_register(suite, test_buffer_get); |
| 1382 cx_test_register(suite, test_buffer_get_eof); |
1471 cx_test_register(suite, test_buffer_get_eof); |
| 1383 cx_test_register(suite, test_buffer_read); |
1472 cx_test_register(suite, test_buffer_read); |
| 1384 cx_test_register(suite, test_buffer_read_oob); |
1473 cx_test_register(suite, test_buffer_read_oob); |