191
204
// headers are case insensitive.
192
205
CuAssertStrEquals(tc, "bar,baz,test", serf_bucket_headers_get(hdrs, "fOo"));
195
static void test_simple_read_restore_snapshot_read(CuTest *tc)
197
serf_bucket_alloc_t *alloc = serf_bucket_allocator_create(test_pool, NULL,
205
bkt = SERF_BUCKET_SIMPLE_STRING(
211
status = serf_bucket_snapshot(bkt);
212
CuAssertIntEquals(tc, APR_SUCCESS, status);
214
/* Read the first line of text from the bucket. */
215
status = serf_bucket_readline(bkt, SERF_NEWLINE_CRLF, &found, &data, &len);
217
CuAssertIntEquals(tc, APR_SUCCESS, status);
218
CuAssertIntEquals(tc, SERF_NEWLINE_CRLF, found);
219
CuAssertIntEquals(tc, 7, len);
220
CuAssert(tc, data, strncmp("line1" CRLF, data, len) == 0);
222
/* Restore the buckets original content. */
223
CuAssertTrue(tc, serf_bucket_is_snapshot_set(bkt) != 0);
224
status = serf_bucket_restore_snapshot(bkt);
225
CuAssertIntEquals(tc, APR_SUCCESS, status);
226
CuAssertTrue(tc, serf_bucket_is_snapshot_set(bkt) == 0);
228
/* Now read both lines from the bucket. */
229
status = serf_bucket_readline(bkt, SERF_NEWLINE_CRLF, &found, &data, &len);
231
CuAssertIntEquals(tc, APR_SUCCESS, status);
232
CuAssertIntEquals(tc, SERF_NEWLINE_CRLF, found);
233
CuAssertIntEquals(tc, 7, len);
234
CuAssert(tc, data, strncmp("line1" CRLF, data, len) == 0);
236
status = serf_bucket_readline(bkt, SERF_NEWLINE_CRLF, &found, &data, &len);
238
CuAssertIntEquals(tc, APR_EOF, status);
239
CuAssertIntEquals(tc, SERF_NEWLINE_NONE, found);
240
CuAssertIntEquals(tc, 5, len);
241
CuAssert(tc, data, strncmp("line2", data, len) == 0);
206
test_teardown(test_pool);
244
209
static apr_status_t read_requested_bytes(serf_bucket_t *bkt,
269
static void test_aggregate_read_restore_snapshot_read(CuTest *tc)
235
static void test_iovec_buckets(CuTest *tc)
271
serf_bucket_alloc_t *alloc = serf_bucket_allocator_create(test_pool, NULL,
273
237
apr_status_t status;
238
serf_bucket_t *bkt, *iobkt;
276
239
const char *data;
279
bkt = serf_bucket_aggregate_create(alloc);
281
tmp = SERF_BUCKET_SIMPLE_STRING_LEN("<", 1, alloc);
282
serf_bucket_aggregate_append(bkt, tmp);
283
tmp = SERF_BUCKET_SIMPLE_STRING_LEN("tagname", 7, alloc);
284
serf_bucket_aggregate_append(bkt, tmp);
285
tmp = SERF_BUCKET_SIMPLE_STRING_LEN(">", 1, alloc);
286
serf_bucket_aggregate_append(bkt, tmp);
287
tmp = SERF_BUCKET_SIMPLE_STRING_LEN("value", 5, alloc);
288
serf_bucket_aggregate_append(bkt, tmp);
289
tmp = SERF_BUCKET_SIMPLE_STRING_LEN("</", 2, alloc);
290
serf_bucket_aggregate_append(bkt, tmp);
291
tmp = SERF_BUCKET_SIMPLE_STRING_LEN("tagname", 7, alloc);
292
serf_bucket_aggregate_append(bkt, tmp);
293
tmp = SERF_BUCKET_SIMPLE_STRING_LEN(">", 1, alloc);
294
serf_bucket_aggregate_append(bkt, tmp);
297
status = serf_bucket_snapshot(bkt);
298
CuAssertIntEquals(tc, APR_SUCCESS, status);
300
status = read_requested_bytes(bkt, 9, &data, &len, test_pool);
301
CuAssertIntEquals(tc, APR_SUCCESS, status);
302
CuAssertIntEquals(tc, 9, len);
303
CuAssert(tc, data, strncmp("<tagname>", data, len) == 0);
305
CuAssertTrue(tc, serf_bucket_is_snapshot_set(bkt) != 0);
306
status = serf_bucket_restore_snapshot(bkt);
307
CuAssertIntEquals(tc, APR_SUCCESS, status);
308
CuAssertTrue(tc, serf_bucket_is_snapshot_set(bkt) == 0);
310
/* Ask more bytes than expected, just to make sure that we get
312
status = read_requested_bytes(bkt, 50, &data, &len, test_pool);
313
CuAssertIntEquals(tc, APR_EOF, status);
314
CuAssertIntEquals(tc, 24, len);
315
CuAssert(tc, data, strncmp("<tagname>value</tagname>", data, len) == 0);
241
struct iovec vecs[32];
242
struct iovec tgt_vecs[32];
246
apr_pool_t *test_pool = test_setup();
247
serf_bucket_alloc_t *alloc = serf_bucket_allocator_create(test_pool, NULL,
250
/* Test 1: Read a single string in an iovec, store it in a iovec_bucket
251
and then read it back. */
252
bkt = SERF_BUCKET_SIMPLE_STRING(
257
status = serf_bucket_read_iovec(bkt, SERF_READ_ALL_AVAIL, 32, vecs,
260
iobkt = serf_bucket_iovec_create(vecs, vecs_used, alloc);
262
/* Check available data */
263
status = serf_bucket_peek(iobkt, &data, &len);
264
CuAssertIntEquals(tc, APR_EOF, status);
265
CuAssertIntEquals(tc, strlen("line1" CRLF "line2"), len);
267
/* Try to read only a few bytes (less than what's in the first buffer). */
268
status = serf_bucket_read_iovec(iobkt, 3, 32, tgt_vecs, &vecs_used);
269
CuAssertIntEquals(tc, APR_SUCCESS, status);
270
CuAssertIntEquals(tc, 1, vecs_used);
271
CuAssertIntEquals(tc, 3, tgt_vecs[0].iov_len);
272
CuAssert(tc, tgt_vecs[0].iov_base,
273
strncmp("lin", tgt_vecs[0].iov_base, tgt_vecs[0].iov_len) == 0);
275
/* Read the rest of the data. */
276
status = serf_bucket_read_iovec(iobkt, SERF_READ_ALL_AVAIL, 32, tgt_vecs,
278
CuAssertIntEquals(tc, APR_EOF, status);
279
CuAssertIntEquals(tc, 1, vecs_used);
280
CuAssertIntEquals(tc, strlen("e1" CRLF "line2"), tgt_vecs[0].iov_len);
281
CuAssert(tc, tgt_vecs[0].iov_base,
282
strncmp("e1" CRLF "line2", tgt_vecs[0].iov_base, tgt_vecs[0].iov_len - 3) == 0);
284
/* Bucket should now be empty */
285
status = serf_bucket_peek(iobkt, &data, &len);
286
CuAssertIntEquals(tc, APR_EOF, status);
287
CuAssertIntEquals(tc, 0, len);
289
/* Test 2: Read multiple character bufs in an iovec, then read them back
291
for (i = 0; i < 32 ; i++) {
292
vecs[i].iov_base = apr_psprintf(test_pool, "data %02d 901234567890", i);
293
vecs[i].iov_len = strlen(vecs[i].iov_base);
296
iobkt = serf_bucket_iovec_create(vecs, 32, alloc);
298
/* Check that some data is in the buffer. Don't verify the actual data, the
299
amount of data returned is not guaranteed to be the full buffer. */
300
status = serf_bucket_peek(iobkt, &data, &len);
301
CuAssertTrue(tc, len > 0);
302
CuAssertIntEquals(tc, APR_SUCCESS, status); /* this assumes not all data is
306
/* Read 1 buf. 20 = sizeof("data %2d 901234567890") */
307
status = serf_bucket_read_iovec(iobkt, 1 * 20, 32,
308
tgt_vecs, &vecs_used);
309
CuAssertIntEquals(tc, APR_SUCCESS, status);
310
CuAssertIntEquals(tc, 1, vecs_used);
311
CuAssert(tc, tgt_vecs[0].iov_base,
312
strncmp("data 00 901234567890", tgt_vecs[0].iov_base, tgt_vecs[0].iov_len) == 0);
315
status = serf_bucket_read_iovec(iobkt, 2 * 20, 32,
316
tgt_vecs, &vecs_used);
317
CuAssertIntEquals(tc, APR_SUCCESS, status);
318
CuAssertIntEquals(tc, 2, vecs_used);
320
/* Read the remaining 29 bufs. */
321
vecs_used = 400; /* test if iovec code correctly resets vecs_used */
322
status = serf_bucket_read_iovec(iobkt, SERF_READ_ALL_AVAIL, 32,
323
tgt_vecs, &vecs_used);
324
CuAssertIntEquals(tc, APR_EOF, status);
325
CuAssertIntEquals(tc, 29, vecs_used);
327
/* Test 3: use serf_bucket_read */
328
for (i = 0; i < 32 ; i++) {
329
vecs[i].iov_base = apr_psprintf(test_pool, "DATA %02d 901234567890", i);
330
vecs[i].iov_len = strlen(vecs[i].iov_base);
333
iobkt = serf_bucket_iovec_create(vecs, 32, alloc);
335
status = serf_bucket_read(iobkt, 10, &data, &len);
336
CuAssertIntEquals(tc, APR_SUCCESS, status);
337
CuAssertIntEquals(tc, 10, len);
339
strncmp("DATA 00 90", data, len) == 0);
341
status = serf_bucket_read(iobkt, 10, &data, &len);
342
CuAssertIntEquals(tc, APR_SUCCESS, status);
343
CuAssertIntEquals(tc, 10, len);
344
CuAssert(tc, tgt_vecs[0].iov_base,
345
strncmp("1234567890", data, len) == 0);
347
for (i = 1; i < 31 ; i++) {
348
const char *exp = apr_psprintf(test_pool, "DATA %02d 901234567890", i);
349
status = serf_bucket_read(iobkt, SERF_READ_ALL_AVAIL, &data, &len);
350
CuAssertIntEquals(tc, APR_SUCCESS, status);
351
CuAssertIntEquals(tc, 20, len);
353
strncmp(exp, data, len) == 0);
357
status = serf_bucket_read(iobkt, 20, &data, &len);
358
CuAssertIntEquals(tc, APR_EOF, status);
359
CuAssertIntEquals(tc, 20, len);
361
strncmp("DATA 31 901234567890", data, len) == 0);
363
/* Test 3: read an empty iovec */
364
iobkt = serf_bucket_iovec_create(vecs, 0, alloc);
365
status = serf_bucket_read_iovec(iobkt, SERF_READ_ALL_AVAIL, 32,
366
tgt_vecs, &vecs_used);
367
CuAssertIntEquals(tc, APR_EOF, status);
368
CuAssertIntEquals(tc, 0, vecs_used);
370
status = serf_bucket_read(iobkt, SERF_READ_ALL_AVAIL, &data, &len);
371
CuAssertIntEquals(tc, APR_EOF, status);
372
CuAssertIntEquals(tc, 0, len);
374
/* Test 4: read 0 bytes from an iovec */
375
bkt = SERF_BUCKET_SIMPLE_STRING("line1" CRLF, alloc);
376
status = serf_bucket_read_iovec(bkt, SERF_READ_ALL_AVAIL, 32, vecs,
378
iobkt = serf_bucket_iovec_create(vecs, vecs_used, alloc);
379
status = serf_bucket_read_iovec(iobkt, 0, 32,
380
tgt_vecs, &vecs_used);
381
CuAssertIntEquals(tc, APR_SUCCESS, status);
382
CuAssertIntEquals(tc, 0, vecs_used);
384
test_teardown(test_pool);
387
static void test_aggregate_buckets(CuTest *tc)
390
serf_bucket_t *bkt, *aggbkt;
391
struct iovec tgt_vecs[32];
394
apr_pool_t *test_pool = test_setup();
395
serf_bucket_alloc_t *alloc = serf_bucket_allocator_create(test_pool, NULL,
398
/* Test 1: read 0 bytes from an aggregate */
399
aggbkt = serf_bucket_aggregate_create(alloc);
401
bkt = SERF_BUCKET_SIMPLE_STRING("line1" CRLF, alloc);
402
serf_bucket_aggregate_append(aggbkt, bkt);
404
status = serf_bucket_read_iovec(aggbkt, 0, 32,
405
tgt_vecs, &vecs_used);
406
CuAssertIntEquals(tc, APR_SUCCESS, status);
407
CuAssertIntEquals(tc, 0, vecs_used);
409
test_teardown(test_pool);
318
412
CuSuite *test_buckets(void)