ctdb-test: Adding test case verifying data in buffer move
authorSwen Schillig <swen@linux.ibm.com>
Mon, 18 Mar 2019 14:22:19 +0000 (15:22 +0100)
committerChristof Schmitt <cs@samba.org>
Tue, 9 Apr 2019 23:14:19 +0000 (23:14 +0000)
Signed-off-by: Swen Schillig <swen@linux.ibm.com>
Reviewed-by: Martin Schwenke <martin@meltin.net>
Reviewed-by: Christof Schmitt <cs@samba.org>
ctdb/tests/cunit/ctdb_io_test_001.sh
ctdb/tests/src/ctdb_io_test.c

index 15842ea8e17c5c02bd92b1f2333a6006c7ab2b70..6851d524bf527e50af5b9621083f50255ec7857d 100755 (executable)
@@ -6,3 +6,4 @@ ok_null
 
 unit_test ctdb_io_test 1
 unit_test ctdb_io_test 2
+unit_test ctdb_io_test 3
index 668b1f0afe50cd63713da15ba8717bde0784dd85..ec1d25859f0eb807e352d5a1739d4756eb464d2a 100644 (file)
@@ -172,6 +172,78 @@ static void test2(void)
        TALLOC_FREE(ctdb);
 }
 
+static void test_cb(uint8_t *data, size_t length, void *private_data)
+{
+       /* dummy handler, not verifying anything */
+       TALLOC_FREE(data);
+}
+
+static void test3(void)
+{
+       struct ctdb_context *ctdb;
+       struct ctdb_queue *queue;
+       uint32_t pkt_size;
+       char *request;
+       size_t req_len;
+       int fd;
+       int ret;
+
+       test_setup(test_cb, &fd, &ctdb, &queue);
+       request = talloc_zero_size(queue, queue->buffer_size);
+
+       /*
+        * calculate a request length which will fit into the buffer
+        * but not twice. Because we need to write the size integer
+        * as well (4-bytes) we're guaranteed that no 2 packets will fit.
+        */
+       req_len = queue->buffer_size >> 1;
+
+       /* writing first packet */
+       pkt_size = sizeof(uint32_t) + req_len;
+
+       ret = write(fd, &pkt_size, sizeof(pkt_size));
+       assert(ret == sizeof(pkt_size));
+
+       ret = write(fd, request, req_len);
+       assert(ret == req_len);
+
+       /* writing second, incomplete packet */
+       pkt_size = sizeof(uint32_t) + req_len;
+
+       ret = write(fd, &pkt_size, sizeof(pkt_size));
+       assert(ret == sizeof(pkt_size));
+
+       ret = write(fd, request, req_len >> 1);
+       assert(ret == req_len >> 1);
+
+       /* process...only 1st packet can be processed */
+       tevent_loop_once(ctdb->ev);
+
+       /* we should see a progressed offset of req_len + sizeof(pkt_size) */
+       assert(queue->buffer.offset == req_len + sizeof(pkt_size));
+
+       /* writing another few bytes of the still incomplete packet */
+       ret = write(fd, request, (req_len >> 1) - 1);
+       assert(ret == (req_len >> 1) - 1);
+
+       /*
+        * the packet is still incomplete and connot be processed
+        * but the packet data had to be moved in the buffer in order
+        * to fetch the new 199 bytes -> offset must be 0 now.
+        */
+       tevent_loop_once(ctdb->ev);
+       /*
+        * needs to be called twice as an incomplete packet
+        * does not trigger a schedule_immediate
+        */
+       tevent_loop_once(ctdb->ev);
+
+       assert(queue->buffer.offset == 0);
+
+       TALLOC_FREE(ctdb);
+}
+
+
 int main(int argc, const char **argv)
 {
        int num;
@@ -192,6 +264,10 @@ int main(int argc, const char **argv)
                test2();
                break;
 
+       case 3:
+               test3();
+               break;
+
        default:
                fprintf(stderr, "Unknown test number %s\n", argv[1]);
        }