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. */


Reply via email to