Author: ivan Date: Mon Nov 2 08:22:53 2015 New Revision: 1711904 URL: http://svn.apache.org/viewvc?rev=1711904&view=rev Log: Follow-up to r1711794: Fix get_remaining support on the standard iovec bucket when one buffer is partially read.
* buckets/iovec_buckets.c (serf_iovec_get_remaining): Substract current buffer offset from total size of remaining buffers. * test/test_buckets.c (test_iovec_buckets): Check serf_bucket_get_remaining() result during test execution. Modified: serf/trunk/buckets/iovec_buckets.c serf/trunk/test/test_buckets.c Modified: serf/trunk/buckets/iovec_buckets.c URL: http://svn.apache.org/viewvc/serf/trunk/buckets/iovec_buckets.c?rev=1711904&r1=1711903&r2=1711904&view=diff ============================================================================== --- serf/trunk/buckets/iovec_buckets.c (original) +++ serf/trunk/buckets/iovec_buckets.c Mon Nov 2 08:22:53 2015 @@ -166,7 +166,7 @@ static apr_uint64_t serf_iovec_get_remai total += ctx->vecs[i].iov_len; } - return total; + return total - ctx->offset; } const serf_bucket_type_t serf_bucket_type_iovec = { Modified: serf/trunk/test/test_buckets.c URL: http://svn.apache.org/viewvc/serf/trunk/test/test_buckets.c?rev=1711904&r1=1711903&r2=1711904&view=diff ============================================================================== --- serf/trunk/test/test_buckets.c (original) +++ serf/trunk/test/test_buckets.c Mon Nov 2 08:22:53 2015 @@ -462,6 +462,9 @@ static void test_iovec_buckets(CuTest *t iobkt = serf_bucket_iovec_create(vecs, vecs_used, alloc); + /* Check serf_bucket_get_remaining() result. */ + CuAssertIntEquals(tc, 12, (int)serf_bucket_get_remaining(iobkt)); + /* Check available data */ status = serf_bucket_peek(iobkt, &data, &len); CuAssertIntEquals(tc, APR_EOF, status); @@ -475,6 +478,9 @@ static void test_iovec_buckets(CuTest *t CuAssert(tc, tgt_vecs[0].iov_base, strncmp("lin", tgt_vecs[0].iov_base, tgt_vecs[0].iov_len) == 0); + /* Check serf_bucket_get_remaining() result. */ + CuAssertIntEquals(tc, 9, (int)serf_bucket_get_remaining(iobkt)); + /* Read the rest of the data. */ status = serf_bucket_read_iovec(iobkt, SERF_READ_ALL_AVAIL, 32, tgt_vecs, &vecs_used); @@ -484,6 +490,9 @@ static void test_iovec_buckets(CuTest *t CuAssert(tc, tgt_vecs[0].iov_base, strncmp("e1" CRLF "line2", tgt_vecs[0].iov_base, tgt_vecs[0].iov_len - 3) == 0); + /* Check serf_bucket_get_remaining() result. */ + CuAssertIntEquals(tc, 0, (int)serf_bucket_get_remaining(iobkt)); + /* Bucket should now be empty */ status = serf_bucket_peek(iobkt, &data, &len); CuAssertIntEquals(tc, APR_EOF, status); @@ -498,6 +507,9 @@ static void test_iovec_buckets(CuTest *t iobkt = serf_bucket_iovec_create(vecs, 32, alloc); + /* Check serf_bucket_get_remaining() result. */ + CuAssertIntEquals(tc, 640, (int)serf_bucket_get_remaining(iobkt)); + /* Check that some data is in the buffer. Don't verify the actual data, the amount of data returned is not guaranteed to be the full buffer. */ status = serf_bucket_peek(iobkt, &data, &len); @@ -513,12 +525,14 @@ static void test_iovec_buckets(CuTest *t CuAssertIntEquals(tc, 1, vecs_used); CuAssert(tc, tgt_vecs[0].iov_base, strncmp("data 00 901234567890", tgt_vecs[0].iov_base, tgt_vecs[0].iov_len) == 0); + CuAssertIntEquals(tc, 620, (int)serf_bucket_get_remaining(iobkt)); /* Read 2 bufs. */ status = serf_bucket_read_iovec(iobkt, 2 * 20, 32, tgt_vecs, &vecs_used); CuAssertIntEquals(tc, APR_SUCCESS, status); CuAssertIntEquals(tc, 2, vecs_used); + CuAssertIntEquals(tc, 580, (int)serf_bucket_get_remaining(iobkt)); /* Read the remaining 29 bufs. */ vecs_used = 400; /* test if iovec code correctly resets vecs_used */ @@ -526,6 +540,7 @@ static void test_iovec_buckets(CuTest *t tgt_vecs, &vecs_used); CuAssertIntEquals(tc, APR_EOF, status); CuAssertIntEquals(tc, 29, vecs_used); + CuAssertIntEquals(tc, 0, (int)serf_bucket_get_remaining(iobkt)); /* Test 3: use serf_bucket_read */ for (i = 0; i < 32 ; i++) { @@ -535,17 +550,22 @@ static void test_iovec_buckets(CuTest *t iobkt = serf_bucket_iovec_create(vecs, 32, alloc); + /* Check serf_bucket_get_remaining() result. */ + CuAssertIntEquals(tc, 640, (int)serf_bucket_get_remaining(iobkt)); + status = serf_bucket_read(iobkt, 10, &data, &len); CuAssertIntEquals(tc, APR_SUCCESS, status); CuAssertIntEquals(tc, 10, len); CuAssert(tc, data, strncmp("DATA 00 90", data, len) == 0); + CuAssertIntEquals(tc, 630, (int)serf_bucket_get_remaining(iobkt)); status = serf_bucket_read(iobkt, 10, &data, &len); CuAssertIntEquals(tc, APR_SUCCESS, status); CuAssertIntEquals(tc, 10, len); CuAssert(tc, tgt_vecs[0].iov_base, strncmp("1234567890", data, len) == 0); + CuAssertIntEquals(tc, 620, (int)serf_bucket_get_remaining(iobkt)); for (i = 1; i < 31 ; i++) { const char *exp = apr_psprintf(tb->pool, "DATA %02d 901234567890", i); @@ -557,11 +577,14 @@ static void test_iovec_buckets(CuTest *t } + CuAssertIntEquals(tc, 20, (int)serf_bucket_get_remaining(iobkt)); + status = serf_bucket_read(iobkt, 20, &data, &len); CuAssertIntEquals(tc, APR_EOF, status); CuAssertIntEquals(tc, 20, len); CuAssert(tc, data, strncmp("DATA 31 901234567890", data, len) == 0); + CuAssertIntEquals(tc, 0, (int)serf_bucket_get_remaining(iobkt)); /* Test 3: read an empty iovec */ iobkt = serf_bucket_iovec_create(vecs, 0, alloc); @@ -569,20 +592,26 @@ static void test_iovec_buckets(CuTest *t tgt_vecs, &vecs_used); CuAssertIntEquals(tc, APR_EOF, status); CuAssertIntEquals(tc, 0, vecs_used); + CuAssertIntEquals(tc, 0, (int)serf_bucket_get_remaining(iobkt)); status = serf_bucket_read(iobkt, SERF_READ_ALL_AVAIL, &data, &len); CuAssertIntEquals(tc, APR_EOF, status); CuAssertIntEquals(tc, 0, len); + CuAssertIntEquals(tc, 0, (int)serf_bucket_get_remaining(iobkt)); /* Test 4: read 0 bytes from an iovec */ bkt = SERF_BUCKET_SIMPLE_STRING("line1" CRLF, alloc); status = serf_bucket_read_iovec(bkt, SERF_READ_ALL_AVAIL, 32, vecs, &vecs_used); iobkt = serf_bucket_iovec_create(vecs, vecs_used, alloc); + /* Check serf_bucket_get_remaining() result. */ + CuAssertIntEquals(tc, 7, (int)serf_bucket_get_remaining(iobkt)); + status = serf_bucket_read_iovec(iobkt, 0, 32, tgt_vecs, &vecs_used); CuAssertIntEquals(tc, APR_SUCCESS, status); CuAssertIntEquals(tc, 0, vecs_used); + CuAssertIntEquals(tc, 7, (int)serf_bucket_get_remaining(iobkt)); } /* Construct a header bucket with some headers, and then read from it. */