ctdb-tests: Reorganize protocol tests
authorAmitay Isaacs <amitay@gmail.com>
Fri, 14 Jul 2017 07:09:57 +0000 (17:09 +1000)
committerMartin Schwenke <martins@samba.org>
Wed, 30 Aug 2017 12:59:21 +0000 (14:59 +0200)
This patch splits the protocol tests from:
  protocol_types_test.c
  protocol_client_test.c

and creates the following files:

  protocol_common.[ch]       - common code for data types
  protocol_common_ctdb.[ch]  - common code for ctdb protocol elements
  protocol_common_event.[ch] - common code for eventd protocol elements
  protocol_basic_test.c      - basic data types
  protocol_types_test.c      - ctdb data types
  protocol_ctdb_test.c       - ctdb protocol
  protocol_event_test.c      - eventd protocol

Signed-off-by: Amitay Isaacs <amitay@gmail.com>
Reviewed-by: Martin Schwenke <martin@meltin.net>
17 files changed:
ctdb/tests/cunit/protocol_test_001.sh
ctdb/tests/cunit/protocol_test_002.sh
ctdb/tests/cunit/protocol_test_101.sh [new file with mode: 0755]
ctdb/tests/cunit/protocol_test_102.sh [new file with mode: 0755]
ctdb/tests/cunit/protocol_test_201.sh [moved from ctdb/tests/cunit/protocol_test_003.sh with 100% similarity]
ctdb/tests/src/protocol_basic_test.c [new file with mode: 0644]
ctdb/tests/src/protocol_common.c [new file with mode: 0644]
ctdb/tests/src/protocol_common.h [new file with mode: 0644]
ctdb/tests/src/protocol_common_ctdb.c [moved from ctdb/tests/src/protocol_client_test.c with 63% similarity]
ctdb/tests/src/protocol_common_ctdb.h [new file with mode: 0644]
ctdb/tests/src/protocol_common_event.c [new file with mode: 0644]
ctdb/tests/src/protocol_common_event.h [new file with mode: 0644]
ctdb/tests/src/protocol_ctdb_test.c [new file with mode: 0644]
ctdb/tests/src/protocol_event_test.c [new file with mode: 0644]
ctdb/tests/src/protocol_types_test.c
ctdb/tests/src/protocol_util_test.c
ctdb/wscript

index 41afda5e9d3ee6c0ee84ff39973d92b0c5a66140..62c1086a03de7bac822def0c758752a1092723c3 100755 (executable)
@@ -5,5 +5,5 @@
 ok_null
 
 for i in $(seq 1 1000) ; do
-    unit_test protocol_types_test $i
+    unit_test protocol_basic_test $i
 done
index ac0eeefa9df710f2e056101feb50dc79c863890c..41afda5e9d3ee6c0ee84ff39973d92b0c5a66140 100755 (executable)
@@ -2,53 +2,8 @@
 
 . "${TEST_SCRIPTS_DIR}/unit.sh"
 
-last_control=150
+ok_null
 
-control_output=$(
-    for i in $(seq 0 $last_control) ; do
-       echo -n "$i.. "
-    done
-    echo
-)
-
-last_command=5
-
-command_output=$(
-    for i in $(seq 1 $last_command) ; do
-       echo -n "$i.. "
-    done
-    echo
-)
-
-output=$(
-    echo "ctdb_req_header"
-    echo "ctdb_req_call"
-    echo "ctdb_reply_call"
-    echo "ctdb_reply_error"
-    echo "ctdb_req_dmaster"
-    echo "ctdb_reply_dmaster"
-    echo "ctdb_req_control_data"
-    echo "$control_output"
-    echo "ctdb_reply_control_data"
-    echo "$control_output"
-    echo "ctdb_req_control"
-    echo "$control_output"
-    echo "ctdb_reply_control"
-    echo "$control_output"
-    echo "ctdb_req_message"
-    echo "ctdb_event_header"
-    echo "ctdb_event_request_data"
-    echo "$command_output"
-    echo "ctdb_event_reply_data"
-    echo "$command_output"
-    echo "ctdb_event_request"
-    echo "$command_output"
-    echo "ctdb_event_reply"
-    echo "$command_output"
-)
-
-ok "$output"
-
-for i in $(seq 1 100) ; do
-    unit_test protocol_client_test $i
+for i in $(seq 1 1000) ; do
+    unit_test protocol_types_test $i
 done
diff --git a/ctdb/tests/cunit/protocol_test_101.sh b/ctdb/tests/cunit/protocol_test_101.sh
new file mode 100755 (executable)
index 0000000..44e16fa
--- /dev/null
@@ -0,0 +1,36 @@
+#!/bin/sh
+
+. "${TEST_SCRIPTS_DIR}/unit.sh"
+
+last_control=150
+
+control_output=$(
+    for i in $(seq 0 $last_control) ; do
+       echo -n "$i.. "
+    done
+    echo
+)
+
+output=$(
+    echo "ctdb_req_header"
+    echo "ctdb_req_call"
+    echo "ctdb_reply_call"
+    echo "ctdb_reply_error"
+    echo "ctdb_req_dmaster"
+    echo "ctdb_reply_dmaster"
+    echo "ctdb_req_control_data"
+    echo "$control_output"
+    echo "ctdb_reply_control_data"
+    echo "$control_output"
+    echo "ctdb_req_control"
+    echo "$control_output"
+    echo "ctdb_reply_control"
+    echo "$control_output"
+    echo "ctdb_req_message"
+)
+
+ok "$output"
+
+for i in $(seq 1 100) ; do
+    unit_test protocol_ctdb_test $i
+done
diff --git a/ctdb/tests/cunit/protocol_test_102.sh b/ctdb/tests/cunit/protocol_test_102.sh
new file mode 100755 (executable)
index 0000000..26af1f3
--- /dev/null
@@ -0,0 +1,30 @@
+#!/bin/sh
+
+. "${TEST_SCRIPTS_DIR}/unit.sh"
+
+last_command=5
+
+command_output=$(
+    for i in $(seq 1 $last_command) ; do
+       echo -n "$i.. "
+    done
+    echo
+)
+
+output=$(
+    echo "ctdb_event_header"
+    echo "ctdb_event_request_data"
+    echo "$command_output"
+    echo "ctdb_event_reply_data"
+    echo "$command_output"
+    echo "ctdb_event_request"
+    echo "$command_output"
+    echo "ctdb_event_reply"
+    echo "$command_output"
+)
+
+ok "$output"
+
+for i in $(seq 1 100) ; do
+    unit_test protocol_event_test $i
+done
diff --git a/ctdb/tests/src/protocol_basic_test.c b/ctdb/tests/src/protocol_basic_test.c
new file mode 100644 (file)
index 0000000..dfc2796
--- /dev/null
@@ -0,0 +1,148 @@
+/*
+   protocol types tests
+
+   Copyright (C) Amitay Isaacs  2015-2017
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include <assert.h>
+
+#include "protocol/protocol_basic.c"
+#include "protocol/protocol_types.c"
+
+#include "tests/src/protocol_common.h"
+
+
+static void test_ctdb_int32(void)
+{
+       int32_t p1, p2;
+       size_t buflen;
+       int ret;
+
+       p1 = rand32i();
+       buflen = ctdb_int32_len(p1);
+       ctdb_int32_push(p1, BUFFER);
+       ret = ctdb_int32_pull(BUFFER, buflen, NULL, &p2);
+       assert(ret == 0);
+       assert(p1 == p2);
+}
+
+static void test_ctdb_uint32(void)
+{
+       uint32_t p1, p2;
+       size_t buflen;
+       int ret;
+
+       p1 = rand32();
+       buflen = ctdb_uint32_len(p1);
+       ctdb_uint32_push(p1, BUFFER);
+       ret = ctdb_uint32_pull(BUFFER, buflen, NULL, &p2);
+       assert(ret == 0);
+       assert(p1 == p2);
+}
+
+static void test_ctdb_uint64(void)
+{
+       uint64_t p1, p2;
+       size_t buflen;
+       int ret;
+
+       p1 = rand64();
+       buflen = ctdb_uint64_len(p1);
+       ctdb_uint64_push(p1, BUFFER);
+       ret = ctdb_uint64_pull(BUFFER, buflen, NULL, &p2);
+       assert(ret == 0);
+       assert(p1 == p2);
+}
+
+static void test_ctdb_double(void)
+{
+       double p1, p2;
+       size_t buflen;
+       int ret;
+
+       p1 = rand_double();
+       buflen = ctdb_double_len(p1);
+       ctdb_double_push(p1, BUFFER);
+       ret = ctdb_double_pull(BUFFER, buflen, NULL, &p2);
+       assert(ret == 0);
+       assert(p1 == p2);
+}
+
+static void test_ctdb_string(void)
+{
+       TALLOC_CTX *mem_ctx = talloc_new(NULL);
+       const char *p1, *p2;
+       size_t buflen;
+       int ret;
+
+       fill_ctdb_string(mem_ctx, &p1);
+       buflen = ctdb_string_len(p1);
+       ctdb_string_push(p1, BUFFER);
+       ret = ctdb_string_pull(BUFFER, buflen, mem_ctx, &p2);
+       assert(ret == 0);
+       verify_ctdb_string(p1, p2);
+       talloc_free(mem_ctx);
+}
+
+static void test_ctdb_stringn(void)
+{
+       TALLOC_CTX *mem_ctx = talloc_new(NULL);
+       const char *p1, *p2;
+       size_t buflen;
+       int ret;
+
+       fill_ctdb_string(mem_ctx, &p1);
+       buflen = ctdb_stringn_len(p1);
+       ctdb_stringn_push(p1, BUFFER);
+       ret = ctdb_stringn_pull(BUFFER, buflen, mem_ctx, &p2);
+       assert(ret == 0);
+       verify_ctdb_string(p1, p2);
+       talloc_free(mem_ctx);
+}
+
+static void test_ctdb_pid(void)
+{
+       pid_t p1, p2;
+       size_t buflen;
+       int ret;
+
+       p1 = rand32();
+       buflen = ctdb_pid_len(p1);
+       ctdb_pid_push(p1, BUFFER);
+       ret = ctdb_pid_pull(BUFFER, buflen, NULL, &p2);
+       assert(ret == 0);
+       assert(p1 == p2);
+}
+
+int main(int argc, char *argv[])
+{
+       if (argc == 2) {
+               int seed = atoi(argv[1]);
+               srandom(seed);
+       }
+
+       test_ctdb_int32();
+       test_ctdb_uint32();
+       test_ctdb_uint64();
+       test_ctdb_double();
+
+       test_ctdb_string();
+       test_ctdb_stringn();
+
+       test_ctdb_pid();
+
+       return 0;
+}
diff --git a/ctdb/tests/src/protocol_common.c b/ctdb/tests/src/protocol_common.c
new file mode 100644 (file)
index 0000000..83fb32d
--- /dev/null
@@ -0,0 +1,933 @@
+/*
+   protocol tests - common functions
+
+   Copyright (C) Amitay Isaacs  2015-2017
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include "replace.h"
+#include "system/network.h"
+
+#include <assert.h>
+
+#include "protocol/protocol_api.h"
+
+#include "tests/src/protocol_common.h"
+
+uint8_t BUFFER[1024*1024];
+
+/*
+ * Functions to generation random data
+ */
+
+int rand_int(int max)
+{
+       return random() % max;
+}
+
+uint8_t rand8(void)
+{
+       uint8_t val = rand_int(256) & 0xff;
+       return val;
+}
+
+int32_t rand32i(void)
+{
+       return INT_MIN + random();
+}
+
+uint32_t rand32(void)
+{
+       return random();
+}
+
+uint64_t rand64(void)
+{
+       uint64_t t = random();
+       t = (t << 32) | random();
+       return t;
+}
+
+double rand_double(void)
+{
+       return 1.0 / rand64();
+}
+
+void fill_buffer(void *p, size_t len)
+{
+       int i;
+       uint8_t *ptr = p;
+
+       for (i=0; i<len; i++) {
+               ptr[i] = rand8();
+       }
+}
+
+void verify_buffer(void *p1, void *p2, size_t len)
+{
+       if (len > 0) {
+               assert(memcmp(p1, p2, len) == 0);
+       }
+}
+
+void fill_ctdb_string(TALLOC_CTX *mem_ctx, const char **out)
+{
+       char *p;
+       int len, i;
+
+       len = rand_int(1024) + 1;
+       p = talloc_size(mem_ctx, len+1);
+       assert(p != NULL);
+
+       for (i=0; i<len; i++) {
+               p[i] = 'A' + rand_int(26);
+       }
+       p[len] = '\0';
+       *out = p;
+}
+
+void verify_ctdb_string(const char *p1, const char *p2)
+{
+       if (p1 == NULL || p2 == NULL) {
+               assert(p1 == p2);
+       } else {
+               assert(strlen(p1) == strlen(p2));
+               assert(strcmp(p1, p2) == 0);
+       }
+}
+
+void fill_tdb_data_nonnull(TALLOC_CTX *mem_ctx, TDB_DATA *p)
+{
+       p->dsize = rand_int(1024) + 1;
+       p->dptr = talloc_array(mem_ctx, uint8_t, p->dsize);
+       assert(p->dptr != NULL);
+       fill_buffer(p->dptr, p->dsize);
+}
+
+void fill_tdb_data(TALLOC_CTX *mem_ctx, TDB_DATA *p)
+{
+       if (rand_int(5) == 0) {
+               p->dsize = 0;
+               p->dptr = NULL;
+       } else {
+               fill_tdb_data_nonnull(mem_ctx, p);
+       }
+}
+
+void verify_tdb_data(TDB_DATA *p1, TDB_DATA *p2)
+{
+       assert(p1->dsize == p2->dsize);
+       verify_buffer(p1->dptr, p2->dptr, p1->dsize);
+}
+
+void fill_ctdb_statistics(TALLOC_CTX *mem_ctx, struct ctdb_statistics *p)
+{
+       fill_buffer((uint8_t *)p, sizeof(struct ctdb_statistics));
+}
+
+void verify_ctdb_statistics(struct ctdb_statistics *p1,
+                           struct ctdb_statistics *p2)
+{
+       verify_buffer(p1, p2, sizeof(struct ctdb_statistics));
+}
+
+void fill_ctdb_vnn_map(TALLOC_CTX *mem_ctx, struct ctdb_vnn_map *p)
+{
+       int i;
+
+       p->generation = rand32();
+       p->size = rand_int(20);
+       if (p->size > 0) {
+               p->map = talloc_array(mem_ctx, uint32_t, p->size);
+               assert(p->map != NULL);
+
+               for (i=0; i<p->size; i++) {
+                       p->map[i] = rand32();
+               }
+       } else {
+               p->map = NULL;
+       }
+}
+
+void verify_ctdb_vnn_map(struct ctdb_vnn_map *p1, struct ctdb_vnn_map *p2)
+{
+       int i;
+
+       assert(p1->generation == p2->generation);
+       assert(p1->size == p2->size);
+       for (i=0; i<p1->size; i++) {
+               assert(p1->map[i] == p2->map[i]);
+       }
+}
+
+void fill_ctdb_dbid(TALLOC_CTX *mem_ctx, struct ctdb_dbid *p)
+{
+       p->db_id = rand32();
+       p->flags = rand8();
+}
+
+void verify_ctdb_dbid(struct ctdb_dbid *p1, struct ctdb_dbid *p2)
+{
+       assert(p1->db_id == p2->db_id);
+       assert(p1->flags == p2->flags);
+}
+
+void fill_ctdb_dbid_map(TALLOC_CTX *mem_ctx, struct ctdb_dbid_map *p)
+{
+       int i;
+
+       p->num = rand_int(40);
+       if (p->num > 0) {
+               p->dbs = talloc_array(mem_ctx, struct ctdb_dbid, p->num);
+               assert(p->dbs != NULL);
+               for (i=0; i<p->num; i++) {
+                       fill_ctdb_dbid(mem_ctx, &p->dbs[i]);
+               }
+       } else {
+               p->dbs = NULL;
+       }
+}
+
+void verify_ctdb_dbid_map(struct ctdb_dbid_map *p1, struct ctdb_dbid_map *p2)
+{
+       int i;
+
+       assert(p1->num == p2->num);
+       for (i=0; i<p1->num; i++) {
+               verify_ctdb_dbid(&p1->dbs[i], &p2->dbs[i]);
+       }
+}
+
+void fill_ctdb_pulldb(TALLOC_CTX *mem_ctx, struct ctdb_pulldb *p)
+{
+       p->db_id = rand32();
+       p->lmaster = rand32();
+}
+
+void verify_ctdb_pulldb(struct ctdb_pulldb *p1, struct ctdb_pulldb *p2)
+{
+       assert(p1->db_id == p2->db_id);
+       assert(p1->lmaster == p2->lmaster);
+}
+
+void fill_ctdb_pulldb_ext(TALLOC_CTX *mem_ctx, struct ctdb_pulldb_ext *p)
+{
+       p->db_id = rand32();
+       p->lmaster = rand32();
+       p->srvid = rand64();
+}
+
+void verify_ctdb_pulldb_ext(struct ctdb_pulldb_ext *p1,
+                           struct ctdb_pulldb_ext *p2)
+{
+       assert(p1->db_id == p2->db_id);
+       assert(p1->lmaster == p2->lmaster);
+       assert(p1->srvid == p2->srvid);
+}
+
+void fill_ctdb_ltdb_header(TALLOC_CTX *mem_ctx, struct ctdb_ltdb_header *p)
+{
+       p->rsn = rand64();
+       p->dmaster = rand32();
+       p->flags = rand32();
+}
+
+void verify_ctdb_ltdb_header(struct ctdb_ltdb_header *p1,
+                            struct ctdb_ltdb_header *p2)
+{
+       assert(p1->rsn == p2->rsn);
+       assert(p1->dmaster == p2->dmaster);
+       assert(p1->flags == p2->flags);
+}
+
+void fill_ctdb_rec_data(TALLOC_CTX *mem_ctx, struct ctdb_rec_data *p)
+{
+       p->reqid = rand32();
+       if (p->reqid % 5 == 0) {
+               p->header = talloc(mem_ctx, struct ctdb_ltdb_header);
+               assert(p->header != NULL);
+               fill_ctdb_ltdb_header(mem_ctx, p->header);
+       } else {
+               p->header = NULL;
+       }
+       fill_tdb_data_nonnull(mem_ctx, &p->key);
+       fill_tdb_data(mem_ctx, &p->data);
+}
+
+void verify_ctdb_rec_data(struct ctdb_rec_data *p1, struct ctdb_rec_data *p2)
+{
+       struct ctdb_ltdb_header header;
+
+       assert(p1->reqid == p2->reqid);
+       if (p1->header != NULL) {
+               assert(ctdb_ltdb_header_extract(&p2->data, &header) == 0);
+               verify_ctdb_ltdb_header(p1->header, &header);
+       }
+       verify_tdb_data(&p1->key, &p2->key);
+       verify_tdb_data(&p1->data, &p2->data);
+}
+
+void fill_ctdb_rec_buffer(TALLOC_CTX *mem_ctx, struct ctdb_rec_buffer *p)
+{
+       struct ctdb_rec_data rec;
+       int ret, i;
+       int count;
+
+       p->db_id = rand32();
+       p->count = 0;
+       p->buf = NULL;
+       p->buflen = 0;
+
+       count = rand_int(100);
+       if (count > 0) {
+               for (i=0; i<count; i++) {
+                       fill_ctdb_rec_data(mem_ctx, &rec);
+                       ret = ctdb_rec_buffer_add(mem_ctx, p, rec.reqid,
+                                                 rec.header,
+                                                 rec.key, rec.data);
+                       assert(ret == 0);
+               }
+       }
+}
+
+void verify_ctdb_rec_buffer(struct ctdb_rec_buffer *p1,
+                           struct ctdb_rec_buffer *p2)
+{
+       assert(p1->db_id == p2->db_id);
+       assert(p1->count == p2->count);
+       assert(p1->buflen == p2->buflen);
+       verify_buffer(p1->buf, p2->buf, p1->buflen);
+}
+
+void fill_ctdb_traverse_start(TALLOC_CTX *mem_ctx,
+                             struct ctdb_traverse_start *p)
+{
+       p->db_id = rand32();
+       p->reqid = rand32();
+       p->srvid = rand64();
+}
+
+void verify_ctdb_traverse_start(struct ctdb_traverse_start *p1,
+                               struct ctdb_traverse_start *p2)
+{
+       assert(p1->db_id == p2->db_id);
+       assert(p1->reqid == p2->reqid);
+       assert(p1->srvid == p2->srvid);
+}
+
+void fill_ctdb_traverse_all(TALLOC_CTX *mem_ctx,
+                           struct ctdb_traverse_all *p)
+{
+       p->db_id = rand32();
+       p->reqid = rand32();
+       p->pnn = rand32();
+       p->client_reqid = rand32();
+       p->srvid = rand64();
+}
+
+void verify_ctdb_traverse_all(struct ctdb_traverse_all *p1,
+                             struct ctdb_traverse_all *p2)
+{
+       assert(p1->db_id == p2->db_id);
+       assert(p1->reqid == p2->reqid);
+       assert(p1->pnn == p2->pnn);
+       assert(p1->client_reqid == p2->client_reqid);
+       assert(p1->srvid == p2->srvid);
+}
+
+void fill_ctdb_traverse_start_ext(TALLOC_CTX *mem_ctx,
+                                 struct ctdb_traverse_start_ext *p)
+{
+       p->db_id = rand32();
+       p->reqid = rand32();
+       p->srvid = rand64();
+       p->withemptyrecords = rand_int(2);
+}
+
+void verify_ctdb_traverse_start_ext(struct ctdb_traverse_start_ext *p1,
+                                   struct ctdb_traverse_start_ext *p2)
+{
+       assert(p1->db_id == p2->db_id);
+       assert(p1->reqid == p2->reqid);
+       assert(p1->srvid == p2->srvid);
+       assert(p1->withemptyrecords == p2->withemptyrecords);
+}
+
+void fill_ctdb_traverse_all_ext(TALLOC_CTX *mem_ctx,
+                               struct ctdb_traverse_all_ext *p)
+{
+       p->db_id = rand32();
+       p->reqid = rand32();
+       p->pnn = rand32();
+       p->client_reqid = rand32();
+       p->srvid = rand64();
+       p->withemptyrecords = rand_int(2);
+}
+
+void verify_ctdb_traverse_all_ext(struct ctdb_traverse_all_ext *p1,
+                                 struct ctdb_traverse_all_ext *p2)
+{
+       assert(p1->db_id == p2->db_id);
+       assert(p1->reqid == p2->reqid);
+       assert(p1->pnn == p2->pnn);
+       assert(p1->client_reqid == p2->client_reqid);
+       assert(p1->srvid == p2->srvid);
+       assert(p1->withemptyrecords == p2->withemptyrecords);
+}
+
+void fill_ctdb_sock_addr(TALLOC_CTX *mem_ctx, ctdb_sock_addr *p)
+{
+       if (rand_int(2) == 0) {
+               p->ip.sin_family = AF_INET;
+               p->ip.sin_port = rand_int(65535);
+               fill_buffer(&p->ip.sin_addr, sizeof(struct in_addr));
+       } else {
+               p->ip6.sin6_family = AF_INET6;
+               p->ip6.sin6_port = rand_int(65535);
+               fill_buffer(&p->ip6.sin6_addr, sizeof(struct in6_addr));
+       }
+}
+
+void verify_ctdb_sock_addr(ctdb_sock_addr *p1, ctdb_sock_addr *p2)
+{
+       assert(p1->sa.sa_family == p2->sa.sa_family);
+       if (p1->sa.sa_family == AF_INET) {
+               assert(p1->ip.sin_port == p2->ip.sin_port);
+               verify_buffer(&p1->ip.sin_addr, &p2->ip.sin_addr,
+                                  sizeof(struct in_addr));
+       } else {
+               assert(p1->ip6.sin6_port == p2->ip6.sin6_port);
+               verify_buffer(&p1->ip6.sin6_addr, &p2->ip6.sin6_addr,
+                                  sizeof(struct in6_addr));
+       }
+}
+
+void fill_ctdb_connection(TALLOC_CTX *mem_ctx, struct ctdb_connection *p)
+{
+       fill_ctdb_sock_addr(mem_ctx, &p->src);
+       fill_ctdb_sock_addr(mem_ctx, &p->dst);
+}
+
+void verify_ctdb_connection(struct ctdb_connection *p1,
+                           struct ctdb_connection *p2)
+{
+       verify_ctdb_sock_addr(&p1->src, &p2->src);
+       verify_ctdb_sock_addr(&p1->dst, &p2->dst);
+}
+
+void fill_ctdb_tunable(TALLOC_CTX *mem_ctx, struct ctdb_tunable *p)
+{
+       fill_ctdb_string(mem_ctx, discard_const(&p->name));
+       p->value = rand32();
+}
+
+void verify_ctdb_tunable(struct ctdb_tunable *p1, struct ctdb_tunable *p2)
+{
+       verify_ctdb_string(discard_const(p1->name), discard_const(p2->name));
+       assert(p1->value == p2->value);
+}
+
+void fill_ctdb_node_flag_change(TALLOC_CTX *mem_ctx,
+                               struct ctdb_node_flag_change *p)
+{
+       p->pnn = rand32();
+       p->new_flags = rand32();
+       p->old_flags = rand32();
+}
+
+void verify_ctdb_node_flag_change(struct ctdb_node_flag_change *p1,
+                                 struct ctdb_node_flag_change *p2)
+{
+       assert(p1->pnn == p2->pnn);
+       assert(p1->new_flags == p2->new_flags);
+       assert(p1->old_flags == p2->old_flags);
+}
+
+void fill_ctdb_var_list(TALLOC_CTX *mem_ctx, struct ctdb_var_list *p)
+{
+       int i;
+
+       p->count = rand_int(100) + 1;
+       p->var = talloc_array(mem_ctx, const char *, p->count);
+       for (i=0; i<p->count; i++) {
+               fill_ctdb_string(p->var, discard_const(&p->var[i]));
+       }
+}
+
+void verify_ctdb_var_list(struct ctdb_var_list *p1, struct ctdb_var_list *p2)
+{
+       int i;
+
+       assert(p1->count == p2->count);
+       for (i=0; i<p1->count; i++) {
+               verify_ctdb_string(discard_const(p1->var[i]),
+                                  discard_const(p2->var[i]));
+       }
+}
+
+void fill_ctdb_tunable_list(TALLOC_CTX *mem_ctx, struct ctdb_tunable_list *p)
+{
+       fill_buffer(p, sizeof(struct ctdb_tunable_list));
+}
+
+void verify_ctdb_tunable_list(struct ctdb_tunable_list *p1,
+                             struct ctdb_tunable_list *p2)
+{
+       verify_buffer(p1, p2, sizeof(struct ctdb_tunable_list));
+}
+
+void fill_ctdb_tickle_list(TALLOC_CTX *mem_ctx, struct ctdb_tickle_list *p)
+{
+       int i;
+
+       fill_ctdb_sock_addr(mem_ctx, &p->addr);
+       p->num = rand_int(1000);
+       if (p->num > 0) {
+               p->conn = talloc_array(mem_ctx, struct ctdb_connection, p->num);
+               assert(p->conn != NULL);
+               for (i=0; i<p->num; i++) {
+                       fill_ctdb_connection(mem_ctx, &p->conn[i]);
+               }
+       } else {
+               p->conn = NULL;
+       }
+}
+
+void verify_ctdb_tickle_list(struct ctdb_tickle_list *p1,
+                            struct ctdb_tickle_list *p2)
+{
+       int i;
+
+       verify_ctdb_sock_addr(&p1->addr, &p2->addr);
+       assert(p1->num == p2->num);
+       for (i=0; i<p1->num; i++) {
+               verify_ctdb_connection(&p1->conn[i], &p2->conn[i]);
+       }
+}
+
+void fill_ctdb_addr_info(TALLOC_CTX *mem_ctx, struct ctdb_addr_info *p)
+{
+       fill_ctdb_sock_addr(mem_ctx, &p->addr);
+       p->mask = rand_int(33);
+       if (rand_int(2) == 0) {
+               p->iface = NULL;
+       } else {
+               fill_ctdb_string(mem_ctx, &p->iface);
+       }
+}
+
+void verify_ctdb_addr_info(struct ctdb_addr_info *p1,
+                          struct ctdb_addr_info *p2)
+{
+       verify_ctdb_sock_addr(&p1->addr, &p2->addr);
+       assert(p1->mask == p2->mask);
+       verify_ctdb_string(p1->iface, p2->iface);
+}
+
+void fill_ctdb_transdb(TALLOC_CTX *mem_ctx, struct ctdb_transdb *p)
+{
+       p->db_id = rand32();
+       p->tid = rand32();
+}
+
+void verify_ctdb_transdb(struct ctdb_transdb *p1, struct ctdb_transdb *p2)
+{
+       assert(p1->db_id == p2->db_id);
+       assert(p1->tid == p2->tid);
+}
+
+void fill_ctdb_uptime(TALLOC_CTX *mem_ctx, struct ctdb_uptime *p)
+{
+       fill_buffer(p, sizeof(struct ctdb_uptime));
+}
+
+void verify_ctdb_uptime(struct ctdb_uptime *p1, struct ctdb_uptime *p2)
+{
+       verify_buffer(p1, p2, sizeof(struct ctdb_uptime));
+}
+
+void fill_ctdb_public_ip(TALLOC_CTX *mem_ctx, struct ctdb_public_ip *p)
+{
+       p->pnn = rand32();
+       fill_ctdb_sock_addr(mem_ctx, &p->addr);
+}
+
+void verify_ctdb_public_ip(struct ctdb_public_ip *p1,
+                          struct ctdb_public_ip *p2)
+{
+       assert(p1->pnn == p2->pnn);
+       verify_ctdb_sock_addr(&p1->addr, &p2->addr);
+}
+
+void fill_ctdb_public_ip_list(TALLOC_CTX *mem_ctx,
+                             struct ctdb_public_ip_list *p)
+{
+       int i;
+
+       p->num = rand_int(32);
+       if (p->num > 0) {
+               p->ip = talloc_array(mem_ctx, struct ctdb_public_ip, p->num);
+               assert(p->ip != NULL);
+               for (i=0; i<p->num; i++) {
+                       fill_ctdb_public_ip(mem_ctx, &p->ip[i]);
+               }
+       } else {
+               p->ip = NULL;
+       }
+}
+
+void verify_ctdb_public_ip_list(struct ctdb_public_ip_list *p1,
+                               struct ctdb_public_ip_list *p2)
+{
+       int i;
+
+       assert(p1->num == p2->num);
+       for (i=0; i<p1->num; i++) {
+               verify_ctdb_public_ip(&p1->ip[i], &p2->ip[i]);
+       }
+}
+
+void fill_ctdb_node_and_flags(TALLOC_CTX *mem_ctx,
+                             struct ctdb_node_and_flags *p)
+{
+       p->pnn = rand32();
+       p->flags = rand32();
+       fill_ctdb_sock_addr(mem_ctx, &p->addr);
+}
+
+void verify_ctdb_node_and_flags(struct ctdb_node_and_flags *p1,
+                               struct ctdb_node_and_flags *p2)
+{
+       assert(p1->pnn == p2->pnn);
+       assert(p1->flags == p2->flags);
+       verify_ctdb_sock_addr(&p1->addr, &p2->addr);
+}
+
+void fill_ctdb_node_map(TALLOC_CTX *mem_ctx, struct ctdb_node_map *p)
+{
+       int i;
+
+       p->num = rand_int(32);
+       if (p->num > 0) {
+               p->node = talloc_array(mem_ctx, struct ctdb_node_and_flags,
+                                      p->num);
+               assert(p->node != NULL);
+               for (i=0; i<p->num; i++) {
+                       fill_ctdb_node_and_flags(mem_ctx, &p->node[i]);
+               }
+       } else {
+               p->node = NULL;
+       }
+}
+
+void verify_ctdb_node_map(struct ctdb_node_map *p1, struct ctdb_node_map *p2)
+{
+       int i;
+
+       assert(p1->num == p2->num);
+       for (i=0; i<p1->num; i++) {
+               verify_ctdb_node_and_flags(&p1->node[i], &p2->node[i]);
+       }
+}
+
+void fill_ctdb_script(TALLOC_CTX *mem_ctx, struct ctdb_script *p)
+{
+       fill_buffer(p, sizeof(struct ctdb_script));
+}
+
+void verify_ctdb_script(struct ctdb_script *p1, struct ctdb_script *p2)
+{
+       verify_buffer(p1, p2, sizeof(struct ctdb_script));
+}
+
+void fill_ctdb_script_list(TALLOC_CTX *mem_ctx, struct ctdb_script_list *p)
+{
+       int i;
+
+       p->num_scripts = rand_int(32);
+       if (p->num_scripts > 0) {
+               p->script = talloc_array(mem_ctx, struct ctdb_script,
+                                        p->num_scripts);
+               assert(p->script != NULL);
+               for (i=0; i<p->num_scripts; i++) {
+                       fill_ctdb_script(mem_ctx, &p->script[i]);
+               }
+       } else {
+               p->script = NULL;
+       }
+}
+
+void verify_ctdb_script_list(struct ctdb_script_list *p1,
+                            struct ctdb_script_list *p2)
+{
+       int i;
+
+       assert(p1->num_scripts == p2->num_scripts);
+       for (i=0; i<p1->num_scripts; i++) {
+               verify_ctdb_script(&p1->script[i], &p2->script[i]);
+       }
+}
+
+void fill_ctdb_ban_state(TALLOC_CTX *mem_ctx, struct ctdb_ban_state *p)
+{
+       p->pnn = rand32();
+       p->time = rand32();
+}
+
+void verify_ctdb_ban_state(struct ctdb_ban_state *p1,
+                          struct ctdb_ban_state *p2)
+{
+       assert(p1->pnn == p2->pnn);
+       assert(p1->time == p2->time);
+}
+
+void fill_ctdb_notify_data(TALLOC_CTX *mem_ctx, struct ctdb_notify_data *p)
+{
+       p->srvid = rand64();
+       fill_tdb_data(mem_ctx, &p->data);
+}
+
+void verify_ctdb_notify_data(struct ctdb_notify_data *p1,
+                            struct ctdb_notify_data *p2)
+{
+       assert(p1->srvid == p2->srvid);
+       verify_tdb_data(&p1->data, &p2->data);
+}
+
+void fill_ctdb_iface(TALLOC_CTX *mem_ctx, struct ctdb_iface *p)
+{
+       fill_buffer(p, sizeof(struct ctdb_iface));
+}
+
+void verify_ctdb_iface(struct ctdb_iface *p1, struct ctdb_iface *p2)
+{
+       verify_buffer(p1, p2, sizeof(struct ctdb_iface));
+}
+
+void fill_ctdb_iface_list(TALLOC_CTX *mem_ctx, struct ctdb_iface_list *p)
+{
+       int i;
+
+       p->num = rand_int(32);
+       if (p->num > 0) {
+               p->iface = talloc_array(mem_ctx, struct ctdb_iface, p->num);
+               assert(p->iface != NULL);
+               for (i=0; i<p->num; i++) {
+                       fill_ctdb_iface(mem_ctx, &p->iface[i]);
+               }
+       } else {
+               p->iface = NULL;
+       }
+}
+
+void verify_ctdb_iface_list(struct ctdb_iface_list *p1,
+                           struct ctdb_iface_list *p2)
+{
+       int i;
+
+       assert(p1->num == p2->num);
+       for (i=0; i<p1->num; i++) {
+               verify_ctdb_iface(&p1->iface[i], &p2->iface[i]);
+       }
+}
+
+void fill_ctdb_public_ip_info(TALLOC_CTX *mem_ctx,
+                             struct ctdb_public_ip_info *p)
+{
+       fill_ctdb_public_ip(mem_ctx, &p->ip);
+       p->active_idx = rand_int(32) + 1;
+       p->ifaces = talloc(mem_ctx, struct ctdb_iface_list);
+       assert(p->ifaces != NULL);
+       fill_ctdb_iface_list(mem_ctx, p->ifaces);
+}
+
+void verify_ctdb_public_ip_info(struct ctdb_public_ip_info *p1,
+                               struct ctdb_public_ip_info *p2)
+{
+       verify_ctdb_public_ip(&p1->ip, &p2->ip);
+       assert(p1->active_idx == p2->active_idx);
+       verify_ctdb_iface_list(p1->ifaces, p2->ifaces);
+}
+
+void fill_ctdb_statistics_list(TALLOC_CTX *mem_ctx,
+                              struct ctdb_statistics_list *p)
+{
+       int i;
+
+       p->num = rand_int(10);
+       if (p->num > 0) {
+               p->stats = talloc_array(mem_ctx, struct ctdb_statistics,
+                                       p->num);
+               assert(p->stats != NULL);
+
+               for (i=0; i<p->num; i++) {
+                       fill_ctdb_statistics(mem_ctx, &p->stats[i]);
+               }
+       } else {
+               p->stats = NULL;
+       }
+}
+
+void verify_ctdb_statistics_list(struct ctdb_statistics_list *p1,
+                                struct ctdb_statistics_list *p2)
+{
+       int i;
+
+       assert(p1->num == p2->num);
+       for (i=0; i<p1->num; i++) {
+               verify_ctdb_statistics(&p1->stats[i], &p2->stats[i]);
+       }
+}
+
+void fill_ctdb_key_data(TALLOC_CTX *mem_ctx, struct ctdb_key_data *p)
+{
+       p->db_id = rand32();
+       fill_ctdb_ltdb_header(mem_ctx, &p->header);
+       fill_tdb_data_nonnull(mem_ctx, &p->key);
+}
+
+void verify_ctdb_key_data(struct ctdb_key_data *p1, struct ctdb_key_data *p2)
+{
+       assert(p1->db_id == p2->db_id);
+       verify_ctdb_ltdb_header(&p1->header, &p2->header);
+       verify_tdb_data(&p1->key, &p2->key);
+}
+
+void fill_ctdb_db_statistics(TALLOC_CTX *mem_ctx,
+                            struct ctdb_db_statistics *p)
+{
+       int i;
+
+       fill_buffer(p, offsetof(struct ctdb_db_statistics, num_hot_keys));
+       p->num_hot_keys = 10;
+       for (i=0; i<p->num_hot_keys; i++) {
+               p->hot_keys[i].count = rand32();
+               fill_tdb_data(mem_ctx, &p->hot_keys[i].key);
+       }
+}
+
+void verify_ctdb_db_statistics(struct ctdb_db_statistics *p1,
+                              struct ctdb_db_statistics *p2)
+{
+       int i;
+
+       verify_buffer(p1, p2, offsetof(struct ctdb_db_statistics,
+                                           num_hot_keys));
+       assert(p1->num_hot_keys == p2->num_hot_keys);
+       for (i=0; i<p1->num_hot_keys; i++) {
+               assert(p1->hot_keys[i].count == p2->hot_keys[i].count);
+               verify_tdb_data(&p1->hot_keys[i].key, &p2->hot_keys[i].key);
+       }
+}
+
+void fill_ctdb_election_message(TALLOC_CTX *mem_ctx,
+                               struct ctdb_election_message *p)
+{
+       p->num_connected = rand_int(32);
+       fill_buffer(&p->priority_time, sizeof(struct timeval));
+       p->pnn = rand_int(32);
+       p->node_flags = rand32();
+}
+
+void verify_ctdb_election_message(struct ctdb_election_message *p1,
+                                 struct ctdb_election_message *p2)
+{
+       assert(p1->num_connected == p2->num_connected);
+       verify_buffer(p1, p2, sizeof(struct timeval));
+       assert(p1->pnn == p2->pnn);
+       assert(p1->node_flags == p2->node_flags);
+}
+
+void fill_ctdb_srvid_message(TALLOC_CTX *mem_ctx,
+                            struct ctdb_srvid_message *p)
+{
+       p->pnn = rand_int(32);
+       p->srvid = rand64();
+}
+
+void verify_ctdb_srvid_message(struct ctdb_srvid_message *p1,
+                              struct ctdb_srvid_message *p2)
+{
+       assert(p1->pnn == p2->pnn);
+       assert(p1->srvid == p2->srvid);
+}
+
+void fill_ctdb_disable_message(TALLOC_CTX *mem_ctx,
+                              struct ctdb_disable_message *p)
+{
+       p->pnn = rand_int(32);
+       p->srvid = rand64();
+       p->timeout = rand32();
+}
+
+void verify_ctdb_disable_message(struct ctdb_disable_message *p1,
+                                struct ctdb_disable_message *p2)
+{
+       assert(p1->pnn == p2->pnn);
+       assert(p1->srvid == p2->srvid);
+       assert(p1->timeout == p2->timeout);
+}
+
+void fill_ctdb_server_id(TALLOC_CTX *mem_ctx, struct ctdb_server_id *p)
+{
+       p->pid = rand64();
+       p->task_id = rand32();
+       p->vnn = rand_int(32);
+       p->unique_id = rand64();
+}
+
+void verify_ctdb_server_id(struct ctdb_server_id *p1,
+                          struct ctdb_server_id *p2)
+{
+       assert(p1->pid == p2->pid);
+       assert(p1->task_id == p2->task_id);
+       assert(p1->vnn == p2->vnn);
+       assert(p1->unique_id == p2->unique_id);
+}
+
+void fill_ctdb_g_lock(TALLOC_CTX *mem_ctx, struct ctdb_g_lock *p)
+{
+       p->type = rand_int(2);
+       fill_ctdb_server_id(mem_ctx, &p->sid);
+}
+
+void verify_ctdb_g_lock(struct ctdb_g_lock *p1, struct ctdb_g_lock *p2)
+{
+       assert(p1->type == p2->type);
+       verify_ctdb_server_id(&p1->sid, &p2->sid);
+}
+
+void fill_ctdb_g_lock_list(TALLOC_CTX *mem_ctx, struct ctdb_g_lock_list *p)
+{
+       int i;
+
+       p->num = rand_int(20) + 1;
+       p->lock = talloc_array(mem_ctx, struct ctdb_g_lock, p->num);
+       assert(p->lock != NULL);
+       for (i=0; i<p->num; i++) {
+               fill_ctdb_g_lock(mem_ctx, &p->lock[i]);
+       }
+}
+
+void verify_ctdb_g_lock_list(struct ctdb_g_lock_list *p1,
+                            struct ctdb_g_lock_list *p2)
+{
+       int i;
+
+       assert(p1->num == p2->num);
+       for (i=0; i<p1->num; i++) {
+               verify_ctdb_g_lock(&p1->lock[i], &p2->lock[i]);
+       }
+}
diff --git a/ctdb/tests/src/protocol_common.h b/ctdb/tests/src/protocol_common.h
new file mode 100644 (file)
index 0000000..82ee42f
--- /dev/null
@@ -0,0 +1,250 @@
+/*
+   protocol tests - common functions
+
+   Copyright (C) Amitay Isaacs  2015-2017
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef __CTDB_PROTOCOL_COMMON_H__
+#define __CTDB_PROTOCOL_COMMON_H__
+
+#include "replace.h"
+#include "system/network.h"
+
+#include <talloc.h>
+#include <tdb.h>
+
+#include "protocol/protocol.h"
+
+/*
+ * Generate test routines
+ */
+
+#define TEST_FUNC(NAME)                test_ ##NAME
+#define FILL_FUNC(NAME)                fill_ ##NAME
+#define VERIFY_FUNC(NAME)      verify_ ##NAME
+#define LEN_FUNC(NAME)         NAME## _len
+#define PUSH_FUNC(NAME)                NAME## _push
+#define PULL_FUNC(NAME)                NAME## _pull
+
+#define DEFINE_TEST(TYPE, NAME)        \
+static void TEST_FUNC(NAME)(void) \
+{ \
+       TALLOC_CTX *mem_ctx = talloc_new(NULL); \
+       TYPE *p1, *p2; \
+       size_t buflen; \
+       int ret; \
+\
+       p1 = talloc_zero(mem_ctx, TYPE); \
+       assert(p1 != NULL); \
+       FILL_FUNC(NAME)(p1, p1); \
+       buflen = LEN_FUNC(NAME)(p1); \
+       PUSH_FUNC(NAME)(p1, BUFFER); \
+       ret = PULL_FUNC(NAME)(BUFFER, buflen, mem_ctx, &p2); \
+       assert(ret == 0); \
+       VERIFY_FUNC(NAME)(p1, p2); \
+       talloc_free(mem_ctx); \
+}
+
+extern uint8_t BUFFER[1024*1024];
+
+int rand_int(int max);
+uint8_t rand8(void);
+int32_t rand32i(void);
+uint32_t rand32(void);
+uint64_t rand64(void);
+double rand_double(void);
+
+void fill_buffer(void *p, size_t len);
+void verify_buffer(void *p1, void *p2, size_t len);
+
+void fill_ctdb_string(TALLOC_CTX *mem_ctx, const char **out);
+void verify_ctdb_string(const char *p1, const char *p2);
+
+void fill_tdb_data_nonnull(TALLOC_CTX *mem_ctx, TDB_DATA *p);
+void fill_tdb_data(TALLOC_CTX *mem_ctx, TDB_DATA *p);
+void verify_tdb_data(TDB_DATA *p1, TDB_DATA *p2);
+
+void fill_ctdb_statistics(TALLOC_CTX *mem_ctx, struct ctdb_statistics *p);
+void verify_ctdb_statistics(struct ctdb_statistics *p1,
+                           struct ctdb_statistics *p2);
+
+void fill_ctdb_vnn_map(TALLOC_CTX *mem_ctx, struct ctdb_vnn_map *p);
+void verify_ctdb_vnn_map(struct ctdb_vnn_map *p1, struct ctdb_vnn_map *p2);
+
+void fill_ctdb_dbid(TALLOC_CTX *mem_ctx, struct ctdb_dbid *p);
+void verify_ctdb_dbid(struct ctdb_dbid *p1, struct ctdb_dbid *p2);
+
+void fill_ctdb_dbid_map(TALLOC_CTX *mem_ctx, struct ctdb_dbid_map *p);
+void verify_ctdb_dbid_map(struct ctdb_dbid_map *p1, struct ctdb_dbid_map *p2);
+
+void fill_ctdb_pulldb(TALLOC_CTX *mem_ctx, struct ctdb_pulldb *p);
+void verify_ctdb_pulldb(struct ctdb_pulldb *p1, struct ctdb_pulldb *p2);
+
+void fill_ctdb_pulldb_ext(TALLOC_CTX *mem_ctx, struct ctdb_pulldb_ext *p);
+void verify_ctdb_pulldb_ext(struct ctdb_pulldb_ext *p1,
+                           struct ctdb_pulldb_ext *p2);
+
+void fill_ctdb_ltdb_header(TALLOC_CTX *mem_ctx, struct ctdb_ltdb_header *p);
+void verify_ctdb_ltdb_header(struct ctdb_ltdb_header *p1,
+                            struct ctdb_ltdb_header *p2);
+
+void fill_ctdb_rec_data(TALLOC_CTX *mem_ctx, struct ctdb_rec_data *p);
+void verify_ctdb_rec_data(struct ctdb_rec_data *p1, struct ctdb_rec_data *p2);
+
+void fill_ctdb_rec_buffer(TALLOC_CTX *mem_ctx, struct ctdb_rec_buffer *p);
+void verify_ctdb_rec_buffer(struct ctdb_rec_buffer *p1,
+                           struct ctdb_rec_buffer *p2);
+
+void fill_ctdb_traverse_start(TALLOC_CTX *mem_ctx,
+                             struct ctdb_traverse_start *p);
+void verify_ctdb_traverse_start(struct ctdb_traverse_start *p1,
+                               struct ctdb_traverse_start *p2);
+
+void fill_ctdb_traverse_all(TALLOC_CTX *mem_ctx,
+                           struct ctdb_traverse_all *p);
+void verify_ctdb_traverse_all(struct ctdb_traverse_all *p1,
+                             struct ctdb_traverse_all *p2);
+
+void fill_ctdb_traverse_start_ext(TALLOC_CTX *mem_ctx,
+                                 struct ctdb_traverse_start_ext *p);
+void verify_ctdb_traverse_start_ext(struct ctdb_traverse_start_ext *p1,
+                                   struct ctdb_traverse_start_ext *p2);
+
+void fill_ctdb_traverse_all_ext(TALLOC_CTX *mem_ctx,
+                               struct ctdb_traverse_all_ext *p);
+void verify_ctdb_traverse_all_ext(struct ctdb_traverse_all_ext *p1,
+                                 struct ctdb_traverse_all_ext *p2);
+
+void fill_ctdb_sock_addr(TALLOC_CTX *mem_ctx, ctdb_sock_addr *p);
+void verify_ctdb_sock_addr(ctdb_sock_addr *p1, ctdb_sock_addr *p2);
+
+void fill_ctdb_connection(TALLOC_CTX *mem_ctx, struct ctdb_connection *p);
+void verify_ctdb_connection(struct ctdb_connection *p1,
+                           struct ctdb_connection *p2);
+
+void fill_ctdb_tunable(TALLOC_CTX *mem_ctx, struct ctdb_tunable *p);
+void verify_ctdb_tunable(struct ctdb_tunable *p1, struct ctdb_tunable *p2);
+
+void fill_ctdb_node_flag_change(TALLOC_CTX *mem_ctx,
+                               struct ctdb_node_flag_change *p);
+void verify_ctdb_node_flag_change(struct ctdb_node_flag_change *p1,
+                                 struct ctdb_node_flag_change *p2);
+
+void fill_ctdb_var_list(TALLOC_CTX *mem_ctx, struct ctdb_var_list *p);
+void verify_ctdb_var_list(struct ctdb_var_list *p1, struct ctdb_var_list *p2);
+
+void fill_ctdb_tunable_list(TALLOC_CTX *mem_ctx, struct ctdb_tunable_list *p);
+void verify_ctdb_tunable_list(struct ctdb_tunable_list *p1,
+                             struct ctdb_tunable_list *p2);
+
+void fill_ctdb_tickle_list(TALLOC_CTX *mem_ctx, struct ctdb_tickle_list *p);
+void verify_ctdb_tickle_list(struct ctdb_tickle_list *p1,
+                            struct ctdb_tickle_list *p2);
+
+void fill_ctdb_addr_info(TALLOC_CTX *mem_ctx, struct ctdb_addr_info *p);
+void verify_ctdb_addr_info(struct ctdb_addr_info *p1,
+                          struct ctdb_addr_info *p2);
+
+void fill_ctdb_transdb(TALLOC_CTX *mem_ctx, struct ctdb_transdb *p);
+void verify_ctdb_transdb(struct ctdb_transdb *p1, struct ctdb_transdb *p2);
+
+void fill_ctdb_uptime(TALLOC_CTX *mem_ctx, struct ctdb_uptime *p);
+void verify_ctdb_uptime(struct ctdb_uptime *p1, struct ctdb_uptime *p2);
+
+void fill_ctdb_public_ip(TALLOC_CTX *mem_ctx, struct ctdb_public_ip *p);
+void verify_ctdb_public_ip(struct ctdb_public_ip *p1,
+                          struct ctdb_public_ip *p2);
+
+void fill_ctdb_public_ip_list(TALLOC_CTX *mem_ctx,
+                             struct ctdb_public_ip_list *p);
+void verify_ctdb_public_ip_list(struct ctdb_public_ip_list *p1,
+                               struct ctdb_public_ip_list *p2);
+
+void fill_ctdb_node_and_flags(TALLOC_CTX *mem_ctx,
+                             struct ctdb_node_and_flags *p);
+void verify_ctdb_node_and_flags(struct ctdb_node_and_flags *p1,
+                               struct ctdb_node_and_flags *p2);
+
+void fill_ctdb_node_map(TALLOC_CTX *mem_ctx, struct ctdb_node_map *p);
+void verify_ctdb_node_map(struct ctdb_node_map *p1, struct ctdb_node_map *p2);
+
+void fill_ctdb_script(TALLOC_CTX *mem_ctx, struct ctdb_script *p);
+void verify_ctdb_script(struct ctdb_script *p1, struct ctdb_script *p2);
+
+void fill_ctdb_script_list(TALLOC_CTX *mem_ctx, struct ctdb_script_list *p);
+void verify_ctdb_script_list(struct ctdb_script_list *p1,
+                            struct ctdb_script_list *p2);
+
+void fill_ctdb_ban_state(TALLOC_CTX *mem_ctx, struct ctdb_ban_state *p);
+void verify_ctdb_ban_state(struct ctdb_ban_state *p1,
+                          struct ctdb_ban_state *p2);
+
+void fill_ctdb_notify_data(TALLOC_CTX *mem_ctx, struct ctdb_notify_data *p);
+void verify_ctdb_notify_data(struct ctdb_notify_data *p1,
+                            struct ctdb_notify_data *p2);
+
+void fill_ctdb_iface(TALLOC_CTX *mem_ctx, struct ctdb_iface *p);
+void verify_ctdb_iface(struct ctdb_iface *p1, struct ctdb_iface *p2);
+
+void fill_ctdb_iface_list(TALLOC_CTX *mem_ctx, struct ctdb_iface_list *p);
+void verify_ctdb_iface_list(struct ctdb_iface_list *p1,
+                           struct ctdb_iface_list *p2);
+
+void fill_ctdb_public_ip_info(TALLOC_CTX *mem_ctx,
+                             struct ctdb_public_ip_info *p);
+void verify_ctdb_public_ip_info(struct ctdb_public_ip_info *p1,
+                               struct ctdb_public_ip_info *p2);
+
+void fill_ctdb_statistics_list(TALLOC_CTX *mem_ctx,
+                              struct ctdb_statistics_list *p);
+void verify_ctdb_statistics_list(struct ctdb_statistics_list *p1,
+                                struct ctdb_statistics_list *p2);
+
+void fill_ctdb_key_data(TALLOC_CTX *mem_ctx, struct ctdb_key_data *p);
+void verify_ctdb_key_data(struct ctdb_key_data *p1, struct ctdb_key_data *p2);
+
+void fill_ctdb_db_statistics(TALLOC_CTX *mem_ctx,
+                            struct ctdb_db_statistics *p);
+void verify_ctdb_db_statistics(struct ctdb_db_statistics *p1,
+                              struct ctdb_db_statistics *p2);
+
+void fill_ctdb_election_message(TALLOC_CTX *mem_ctx,
+                               struct ctdb_election_message *p);
+void verify_ctdb_election_message(struct ctdb_election_message *p1,
+                                 struct ctdb_election_message *p2);
+
+void fill_ctdb_srvid_message(TALLOC_CTX *mem_ctx,
+                            struct ctdb_srvid_message *p);
+void verify_ctdb_srvid_message(struct ctdb_srvid_message *p1,
+                              struct ctdb_srvid_message *p2);
+
+void fill_ctdb_disable_message(TALLOC_CTX *mem_ctx,
+                              struct ctdb_disable_message *p);
+void verify_ctdb_disable_message(struct ctdb_disable_message *p1,
+                                struct ctdb_disable_message *p2);
+
+void fill_ctdb_server_id(TALLOC_CTX *mem_ctx, struct ctdb_server_id *p);
+void verify_ctdb_server_id(struct ctdb_server_id *p1,
+                          struct ctdb_server_id *p2);
+
+void fill_ctdb_g_lock(TALLOC_CTX *mem_ctx, struct ctdb_g_lock *p);
+void verify_ctdb_g_lock(struct ctdb_g_lock *p1, struct ctdb_g_lock *p2);
+
+void fill_ctdb_g_lock_list(TALLOC_CTX *mem_ctx, struct ctdb_g_lock_list *p);
+void verify_ctdb_g_lock_list(struct ctdb_g_lock_list *p1,
+                            struct ctdb_g_lock_list *p2);
+
+#endif /* __CTDB_PROTOCOL_COMMON_H__ */
similarity index 63%
rename from ctdb/tests/src/protocol_client_test.c
rename to ctdb/tests/src/protocol_common_ctdb.c
index 464ba1c207d4fc781bcc015de63574c2d6cf20a5..189cfcda5e7ab98752ea917fe734a1bd2704d9ae 100644 (file)
@@ -1,7 +1,7 @@
 /*
-   protocol tests
+   protocol tests - ctdb protocol
 
-   Copyright (C) Amitay Isaacs  2015
+   Copyright (C) Amitay Isaacs  2017
 
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
 
 #include <assert.h>
 
-#define PROTOCOL_TEST
-
-#include "protocol_types_test.c"
-
-
-#define GENERATION     0xabcdef12
-#define OPERATION      CTDB_REQ_KEEPALIVE
-#define REQID          0x34567890
-#define SRCNODE                7
-#define DESTNODE       13
+#include "tests/src/protocol_common.h"
+#include "tests/src/protocol_common_ctdb.h"
 
 /*
  * Functions to fill and verify protocol structures
  */
 
-static void verify_ctdb_req_header(struct ctdb_req_header *h,
-                                  struct ctdb_req_header *h2)
+void verify_ctdb_req_header(struct ctdb_req_header *h,
+                           struct ctdb_req_header *h2)
 {
-       verify_buffer(h, h2, ctdb_req_header_len(h));
+       verify_buffer(h, h2, sizeof(struct ctdb_req_header));
 }
 
-static void fill_ctdb_req_call(TALLOC_CTX *mem_ctx,
-                              struct ctdb_req_call *c)
+void fill_ctdb_req_call(TALLOC_CTX *mem_ctx, struct ctdb_req_call *c)
 {
        c->flags = rand32();
        c->db_id = rand32();
@@ -54,8 +45,7 @@ static void fill_ctdb_req_call(TALLOC_CTX *mem_ctx,
        fill_tdb_data(mem_ctx, &c->calldata);
 }
 
-static void verify_ctdb_req_call(struct ctdb_req_call *c,
-                                struct ctdb_req_call *c2)
+void verify_ctdb_req_call(struct ctdb_req_call *c, struct ctdb_req_call *c2)
 {
        assert(c->flags == c2->flags);
        assert(c->db_id == c2->db_id);
@@ -65,36 +55,33 @@ static void verify_ctdb_req_call(struct ctdb_req_call *c,
        verify_tdb_data(&c->calldata, &c2->calldata);
 }
 
-static void fill_ctdb_reply_call(TALLOC_CTX *mem_ctx,
-                                struct ctdb_reply_call *c)
+void fill_ctdb_reply_call(TALLOC_CTX *mem_ctx, struct ctdb_reply_call *c)
 {
        c->status = rand32();
        fill_tdb_data(mem_ctx, &c->data);
 }
 
-static void verify_ctdb_reply_call(struct ctdb_reply_call *c,
-                                  struct ctdb_reply_call *c2)
+void verify_ctdb_reply_call(struct ctdb_reply_call *c,
+                           struct ctdb_reply_call *c2)
 {
        assert(c->status == c2->status);
        verify_tdb_data(&c->data, &c2->data);
 }
 
-static void fill_ctdb_reply_error(TALLOC_CTX *mem_ctx,
-                                 struct ctdb_reply_error *c)
+void fill_ctdb_reply_error(TALLOC_CTX *mem_ctx, struct ctdb_reply_error *c)
 {
        c->status = rand32();
        fill_tdb_data(mem_ctx, &c->msg);
 }
 
-static void verify_ctdb_reply_error(struct ctdb_reply_error *c,
-                                   struct ctdb_reply_error *c2)
+void verify_ctdb_reply_error(struct ctdb_reply_error *c,
+                            struct ctdb_reply_error *c2)
 {
        assert(c->status == c2->status);
        verify_tdb_data(&c->msg, &c2->msg);
 }
 
-static void fill_ctdb_req_dmaster(TALLOC_CTX *mem_ctx,
-                                 struct ctdb_req_dmaster *c)
+void fill_ctdb_req_dmaster(TALLOC_CTX *mem_ctx, struct ctdb_req_dmaster *c)
 {
        c->db_id = rand32();
        c->rsn = rand64();
@@ -103,8 +90,8 @@ static void fill_ctdb_req_dmaster(TALLOC_CTX *mem_ctx,
        fill_tdb_data(mem_ctx, &c->data);
 }
 
-static void verify_ctdb_req_dmaster(struct ctdb_req_dmaster *c,
-                                   struct ctdb_req_dmaster *c2)
+void verify_ctdb_req_dmaster(struct ctdb_req_dmaster *c,
+                            struct ctdb_req_dmaster *c2)
 {
        assert(c->db_id == c2->db_id);
        assert(c->rsn == c2->rsn);
@@ -113,8 +100,8 @@ static void verify_ctdb_req_dmaster(struct ctdb_req_dmaster *c,
        verify_tdb_data(&c->data, &c2->data);
 }
 
-static void fill_ctdb_reply_dmaster(TALLOC_CTX *mem_ctx,
-                                   struct ctdb_reply_dmaster *c)
+void fill_ctdb_reply_dmaster(TALLOC_CTX *mem_ctx,
+                            struct ctdb_reply_dmaster *c)
 {
        c->db_id = rand32();
        c->rsn = rand64();
@@ -122,8 +109,8 @@ static void fill_ctdb_reply_dmaster(TALLOC_CTX *mem_ctx,
        fill_tdb_data(mem_ctx, &c->data);
 }
 
-static void verify_ctdb_reply_dmaster(struct ctdb_reply_dmaster *c,
-                                     struct ctdb_reply_dmaster *c2)
+void verify_ctdb_reply_dmaster(struct ctdb_reply_dmaster *c,
+                              struct ctdb_reply_dmaster *c2)
 {
        assert(c->db_id == c2->db_id);
        assert(c->rsn == c2->rsn);
@@ -131,9 +118,9 @@ static void verify_ctdb_reply_dmaster(struct ctdb_reply_dmaster *c,
        verify_tdb_data(&c->data, &c2->data);
 }
 
-static void fill_ctdb_req_control_data(TALLOC_CTX *mem_ctx,
-                                      struct ctdb_req_control_data *cd,
-                                      uint32_t opcode)
+void fill_ctdb_req_control_data(TALLOC_CTX *mem_ctx,
+                               struct ctdb_req_control_data *cd,
+                               uint32_t opcode)
 {
        cd->opcode = opcode;
        switch (opcode) {
@@ -600,8 +587,8 @@ static void fill_ctdb_req_control_data(TALLOC_CTX *mem_ctx,
        }
 }
 
-static void verify_ctdb_req_control_data(struct ctdb_req_control_data *cd,
-                                        struct ctdb_req_control_data *cd2)
+void verify_ctdb_req_control_data(struct ctdb_req_control_data *cd,
+                                 struct ctdb_req_control_data *cd2)
 {
        assert(cd->opcode == cd2->opcode);
 
@@ -1002,9 +989,8 @@ static void verify_ctdb_req_control_data(struct ctdb_req_control_data *cd,
        }
 }
 
-static void fill_ctdb_req_control(TALLOC_CTX *mem_ctx,
-                                 struct ctdb_req_control *c,
-                                 uint32_t opcode)
+void fill_ctdb_req_control(TALLOC_CTX *mem_ctx, struct ctdb_req_control *c,
+                          uint32_t opcode)
 {
        c->opcode = opcode;
        c->pad = rand32();
@@ -1015,8 +1001,8 @@ static void fill_ctdb_req_control(TALLOC_CTX *mem_ctx,
        fill_ctdb_req_control_data(mem_ctx, &c->rdata, opcode);
 }
 
-static void verify_ctdb_req_control(struct ctdb_req_control *c,
-                                   struct ctdb_req_control *c2)
+void verify_ctdb_req_control(struct ctdb_req_control *c,
+                            struct ctdb_req_control *c2)
 {
        assert(c->opcode == c2->opcode);
        assert(c->pad == c2->pad);
@@ -1027,9 +1013,9 @@ static void verify_ctdb_req_control(struct ctdb_req_control *c,
        verify_ctdb_req_control_data(&c->rdata, &c2->rdata);
 }
 
-static void fill_ctdb_reply_control_data(TALLOC_CTX *mem_ctx,
-                                        struct ctdb_reply_control_data *cd,
-                                        uint32_t opcode)
+void fill_ctdb_reply_control_data(TALLOC_CTX *mem_ctx,
+                                 struct ctdb_reply_control_data *cd,
+                                 uint32_t opcode)
 {
        cd->opcode = opcode;
 
@@ -1415,8 +1401,8 @@ static void fill_ctdb_reply_control_data(TALLOC_CTX *mem_ctx,
        }
 }
 
-static void verify_ctdb_reply_control_data(struct ctdb_reply_control_data *cd,
-                                          struct ctdb_reply_control_data *cd2)
+void verify_ctdb_reply_control_data(struct ctdb_reply_control_data *cd,
+                                   struct ctdb_reply_control_data *cd2)
 {
        assert(cd->opcode == cd2->opcode);
 
@@ -1760,9 +1746,8 @@ static void verify_ctdb_reply_control_data(struct ctdb_reply_control_data *cd,
        }
 }
 
-static void fill_ctdb_reply_control(TALLOC_CTX *mem_ctx,
-                                   struct ctdb_reply_control *c,
-                                   uint32_t opcode)
+void fill_ctdb_reply_control(TALLOC_CTX *mem_ctx,
+                            struct ctdb_reply_control *c, uint32_t opcode)
 {
        c->status = -rand_int(2);
        if (c->status == 0) {
@@ -1773,8 +1758,8 @@ static void fill_ctdb_reply_control(TALLOC_CTX *mem_ctx,
        }
 }
 
-static void verify_ctdb_reply_control(struct ctdb_reply_control *c,
-                                     struct ctdb_reply_control *c2)
+void verify_ctdb_reply_control(struct ctdb_reply_control *c,
+                              struct ctdb_reply_control *c2)
 {
        assert(c->status == c2->status);
        verify_ctdb_string(c->errmsg, c2->errmsg);
@@ -1783,819 +1768,16 @@ static void verify_ctdb_reply_control(struct ctdb_reply_control *c,
        }
 }
 
-static void fill_ctdb_req_message_data(TALLOC_CTX *mem_ctx,
-                                      struct ctdb_req_message_data *c)
+void fill_ctdb_req_message_data(TALLOC_CTX *mem_ctx,
+                               struct ctdb_req_message_data *c)
 {
        c->srvid = rand64();
        fill_tdb_data(mem_ctx, &c->data);
 }
 
-static void verify_ctdb_req_message_data(struct ctdb_req_message_data *c,
-                                        struct ctdb_req_message_data *c2)
+void verify_ctdb_req_message_data(struct ctdb_req_message_data *c,
+                                 struct ctdb_req_message_data *c2)
 {
        assert(c->srvid == c2->srvid);
        verify_tdb_data(&c->data, &c2->data);
 }
-
-/*
- * Functions to fill and verify eventd protocol structures
- */
-
-static void fill_ctdb_event_request_data(TALLOC_CTX *mem_ctx,
-                                        struct ctdb_event_request_data *r,
-                                        uint32_t command)
-{
-       r->command = command;
-
-       switch (command) {
-       case CTDB_EVENT_COMMAND_RUN:
-               r->data.run = talloc(mem_ctx, struct ctdb_event_request_run);
-               assert(r->data.run != NULL);
-
-               fill_ctdb_event_request_run(mem_ctx, r->data.run);
-               break;
-
-       case CTDB_EVENT_COMMAND_STATUS:
-               r->data.status = talloc(mem_ctx,
-                                       struct ctdb_event_request_status);
-               assert(r->data.status != NULL);
-
-               fill_ctdb_event_request_status(mem_ctx, r->data.status);
-               break;
-
-       case CTDB_EVENT_COMMAND_SCRIPT_LIST:
-               break;
-
-       case CTDB_EVENT_COMMAND_SCRIPT_ENABLE:
-               r->data.script_enable = talloc(mem_ctx,
-                               struct ctdb_event_request_script_enable);
-               assert(r->data.script_enable != NULL);
-
-               fill_ctdb_event_request_script_enable(mem_ctx,
-                                                     r->data.script_enable);
-               break;
-
-       case CTDB_EVENT_COMMAND_SCRIPT_DISABLE:
-               r->data.script_disable = talloc(mem_ctx,
-                               struct ctdb_event_request_script_disable);
-               assert(r->data.script_disable != NULL);
-
-               fill_ctdb_event_request_script_disable(mem_ctx,
-                                                      r->data.script_disable);
-               break;
-       }
-}
-
-static void verify_ctdb_event_request_data(struct ctdb_event_request_data *r,
-                                          struct ctdb_event_request_data *r2)
-{
-       assert(r->command == r2->command);
-
-       switch (r->command) {
-       case CTDB_EVENT_COMMAND_RUN:
-               verify_ctdb_event_request_run(r->data.run, r2->data.run);
-               break;
-
-       case CTDB_EVENT_COMMAND_STATUS:
-               verify_ctdb_event_request_status(r->data.status,
-                                                r2->data.status);
-               break;
-
-       case CTDB_EVENT_COMMAND_SCRIPT_LIST:
-               break;
-
-       case CTDB_EVENT_COMMAND_SCRIPT_ENABLE:
-               verify_ctdb_event_request_script_enable(r->data.script_enable,
-                                                       r2->data.script_enable);
-               break;
-
-       case CTDB_EVENT_COMMAND_SCRIPT_DISABLE:
-               verify_ctdb_event_request_script_disable(r->data.script_disable,
-                                                        r2->data.script_disable);
-               break;
-       }
-}
-
-static void fill_ctdb_event_reply_data(TALLOC_CTX *mem_ctx,
-                                      struct ctdb_event_reply_data *r,
-                                      uint32_t command)
-{
-       r->command = command;
-       r->result = rand32i();
-
-       switch (command) {
-       case CTDB_EVENT_COMMAND_STATUS:
-               r->data.status = talloc(mem_ctx,
-                                       struct ctdb_event_reply_status);
-               assert(r->data.status != NULL);
-
-               fill_ctdb_event_reply_status(mem_ctx, r->data.status);
-               break;
-
-       case CTDB_EVENT_COMMAND_SCRIPT_LIST:
-               r->data.script_list = talloc(mem_ctx,
-                               struct ctdb_event_reply_script_list);
-               assert(r->data.script_list != NULL);
-
-               fill_ctdb_event_reply_script_list(mem_ctx,
-                                                 r->data.script_list);
-               break;
-       }
-}
-
-static void verify_ctdb_event_reply_data(struct ctdb_event_reply_data *r,
-                                        struct ctdb_event_reply_data *r2)
-{
-       assert(r->command == r2->command);
-       assert(r->result == r2->result);
-
-       switch (r->command) {
-       case CTDB_EVENT_COMMAND_RUN:
-               break;
-
-       case CTDB_EVENT_COMMAND_STATUS:
-               verify_ctdb_event_reply_status(r->data.status,
-                                              r2->data.status);
-               break;
-
-       case CTDB_EVENT_COMMAND_SCRIPT_LIST:
-               verify_ctdb_event_reply_script_list(r->data.script_list,
-                                                   r2->data.script_list);
-               break;
-
-       case CTDB_EVENT_COMMAND_SCRIPT_ENABLE:
-               break;
-
-       case CTDB_EVENT_COMMAND_SCRIPT_DISABLE:
-               break;
-       }
-}
-
-static void verify_ctdb_event_header(struct ctdb_event_header *h,
-                                    struct ctdb_event_header *h2)
-{
-       verify_buffer(h, h2, ctdb_event_header_len(h));
-}
-
-static void fill_ctdb_event_request(TALLOC_CTX *mem_ctx,
-                                   struct ctdb_event_request *r,
-                                   uint32_t command)
-{
-       ctdb_event_header_fill(&r->header, rand());
-       fill_ctdb_event_request_data(mem_ctx, &r->rdata, command);
-}
-
-static void verify_ctdb_event_request(struct ctdb_event_request *r,
-                                     struct ctdb_event_request *r2)
-{
-       verify_ctdb_event_header(&r->header, &r2->header);
-       verify_ctdb_event_request_data(&r->rdata, &r2->rdata);
-}
-
-static void fill_ctdb_event_reply(TALLOC_CTX *mem_ctx,
-                                 struct ctdb_event_reply *r,
-                                 uint32_t command)
-{
-       ctdb_event_header_fill(&r->header, rand());
-       fill_ctdb_event_reply_data(mem_ctx, &r->rdata, command);
-}
-
-static void verify_ctdb_event_reply(struct ctdb_event_reply *r,
-                                   struct ctdb_event_reply *r2)
-{
-       verify_ctdb_event_header(&r->header, &r2->header);
-       verify_ctdb_event_reply_data(&r->rdata, &r2->rdata);
-}
-
-/*
- * Functions to test marshalling
- */
-
-static void test_ctdb_req_header(void)
-{
-       TALLOC_CTX *mem_ctx;
-       uint8_t *pkt;
-       size_t pkt_len;
-       struct ctdb_req_header h, h2;
-       int ret;
-
-       printf("ctdb_req_header\n");
-       fflush(stdout);
-
-       mem_ctx = talloc_new(NULL);
-       assert(mem_ctx != NULL);
-
-       ctdb_req_header_fill(&h, GENERATION, OPERATION, DESTNODE, SRCNODE,
-                            REQID);
-
-       ret = ctdb_allocate_pkt(mem_ctx, ctdb_req_header_len(&h),
-                               &pkt, &pkt_len);
-       assert(ret == 0);
-       assert(pkt != NULL);
-       assert(pkt_len >= ctdb_req_header_len(&h));
-
-       ctdb_req_header_push(&h, pkt);
-
-       ret = ctdb_req_header_pull(pkt, pkt_len, &h2);
-       assert(ret == 0);
-
-       verify_ctdb_req_header(&h, &h2);
-
-       talloc_free(mem_ctx);
-}
-
-static void test_ctdb_req_call(void)
-{
-       TALLOC_CTX *mem_ctx;
-       uint8_t *pkt;
-       size_t datalen, pkt_len, len;
-       int ret;
-       struct ctdb_req_header h, h2;
-       struct ctdb_req_call c, c2;
-
-       printf("ctdb_req_call\n");
-       fflush(stdout);
-
-       mem_ctx = talloc_new(NULL);
-       assert(mem_ctx != NULL);
-
-       ctdb_req_header_fill(&h, GENERATION, CTDB_REQ_CALL,
-                            DESTNODE, SRCNODE, REQID);
-
-       fill_ctdb_req_call(mem_ctx, &c);
-       datalen = ctdb_req_call_len(&h, &c);
-       ret = ctdb_allocate_pkt(mem_ctx, datalen, &pkt, &pkt_len);
-       assert(ret == 0);
-       assert(pkt != NULL);
-       assert(pkt_len >= datalen);
-       len = 0;
-       ret = ctdb_req_call_push(&h, &c, pkt, &len);
-       assert(ret == EMSGSIZE);
-       assert(len == datalen);
-       ret = ctdb_req_call_push(&h, &c, pkt, &pkt_len);
-       assert(ret == 0);
-       ret = ctdb_req_call_pull(pkt, pkt_len, &h2, mem_ctx, &c2);
-       assert(ret == 0);
-       verify_ctdb_req_header(&h, &h2);
-       assert(h2.length == pkt_len);
-       verify_ctdb_req_call(&c, &c2);
-
-       talloc_free(mem_ctx);
-}
-
-static void test_ctdb_reply_call(void)
-{
-       TALLOC_CTX *mem_ctx;
-       uint8_t *pkt;
-       size_t datalen, pkt_len, len;
-       int ret;
-       struct ctdb_req_header h, h2;
-       struct ctdb_reply_call c, c2;
-
-       printf("ctdb_reply_call\n");
-       fflush(stdout);
-
-       mem_ctx = talloc_new(NULL);
-       assert(mem_ctx != NULL);
-
-       ctdb_req_header_fill(&h, GENERATION, CTDB_REPLY_CALL,
-                            DESTNODE, SRCNODE, REQID);
-
-       fill_ctdb_reply_call(mem_ctx, &c);
-       datalen = ctdb_reply_call_len(&h, &c);
-       ret = ctdb_allocate_pkt(mem_ctx, datalen, &pkt, &pkt_len);
-       assert(ret == 0);
-       assert(pkt != NULL);
-       assert(pkt_len >= datalen);
-       len = 0;
-       ret = ctdb_reply_call_push(&h, &c, pkt, &len);
-       assert(ret == EMSGSIZE);
-       assert(len == datalen);
-       ret = ctdb_reply_call_push(&h, &c, pkt, &pkt_len);
-       assert(ret == 0);
-       ret = ctdb_reply_call_pull(pkt, pkt_len, &h2, mem_ctx, &c2);
-       assert(ret == 0);
-       verify_ctdb_req_header(&h, &h2);
-       assert(h2.length == pkt_len);
-       verify_ctdb_reply_call(&c, &c2);
-
-       talloc_free(mem_ctx);
-}
-
-static void test_ctdb_reply_error(void)
-{
-       TALLOC_CTX *mem_ctx;
-       uint8_t *pkt;
-       size_t datalen, pkt_len, len;
-       int ret;
-       struct ctdb_req_header h, h2;
-       struct ctdb_reply_error c, c2;
-
-       printf("ctdb_reply_error\n");
-       fflush(stdout);
-
-       mem_ctx = talloc_new(NULL);
-       assert(mem_ctx != NULL);
-
-       ctdb_req_header_fill(&h, GENERATION, CTDB_REPLY_ERROR,
-                            DESTNODE, SRCNODE, REQID);
-
-       fill_ctdb_reply_error(mem_ctx, &c);
-       datalen = ctdb_reply_error_len(&h, &c);
-       ret = ctdb_allocate_pkt(mem_ctx, datalen, &pkt, &pkt_len);
-       assert(ret == 0);
-       assert(pkt != NULL);
-       assert(pkt_len >= datalen);
-       len = 0;
-       ret = ctdb_reply_error_push(&h, &c, pkt, &len);
-       assert(ret == EMSGSIZE);
-       assert(len == datalen);
-       ret = ctdb_reply_error_push(&h, &c, pkt, &pkt_len);
-       assert(ret == 0);
-       ret = ctdb_reply_error_pull(pkt, pkt_len, &h2, mem_ctx, &c2);
-       assert(ret == 0);
-       verify_ctdb_req_header(&h, &h2);
-       assert(h2.length == pkt_len);
-       verify_ctdb_reply_error(&c, &c2);
-
-       talloc_free(mem_ctx);
-}
-
-static void test_ctdb_req_dmaster(void)
-{
-       TALLOC_CTX *mem_ctx;
-       uint8_t *pkt;
-       size_t datalen, pkt_len, len;
-       int ret;
-       struct ctdb_req_header h, h2;
-       struct ctdb_req_dmaster c, c2;
-
-       printf("ctdb_req_dmaster\n");
-       fflush(stdout);
-
-       mem_ctx = talloc_new(NULL);
-       assert(mem_ctx != NULL);
-
-       ctdb_req_header_fill(&h, GENERATION, CTDB_REQ_DMASTER,
-                            DESTNODE, SRCNODE, REQID);
-
-       fill_ctdb_req_dmaster(mem_ctx, &c);
-       datalen = ctdb_req_dmaster_len(&h, &c);
-       ret = ctdb_allocate_pkt(mem_ctx, datalen, &pkt, &pkt_len);
-       assert(ret == 0);
-       assert(pkt != NULL);
-       assert(pkt_len >= datalen);
-       len = 0;
-       ret = ctdb_req_dmaster_push(&h, &c, pkt, &len);
-       assert(ret == EMSGSIZE);
-       assert(len == datalen);
-       ret = ctdb_req_dmaster_push(&h, &c, pkt, &pkt_len);
-       assert(ret == 0);
-       ret = ctdb_req_dmaster_pull(pkt, pkt_len, &h2, mem_ctx, &c2);
-       assert(ret == 0);
-       verify_ctdb_req_header(&h, &h2);
-       assert(h2.length == pkt_len);
-       verify_ctdb_req_dmaster(&c, &c2);
-
-       talloc_free(mem_ctx);
-}
-
-static void test_ctdb_reply_dmaster(void)
-{
-       TALLOC_CTX *mem_ctx;
-       uint8_t *pkt;
-       size_t datalen, pkt_len, len;
-       int ret;
-       struct ctdb_req_header h, h2;
-       struct ctdb_reply_dmaster c, c2;
-
-       printf("ctdb_reply_dmaster\n");
-       fflush(stdout);
-
-       mem_ctx = talloc_new(NULL);
-       assert(mem_ctx != NULL);
-
-       ctdb_req_header_fill(&h, GENERATION, CTDB_REPLY_DMASTER,
-                            DESTNODE, SRCNODE, REQID);
-
-       fill_ctdb_reply_dmaster(mem_ctx, &c);
-       datalen = ctdb_reply_dmaster_len(&h, &c);
-       ret = ctdb_allocate_pkt(mem_ctx, datalen, &pkt, &pkt_len);
-       assert(ret == 0);
-       assert(pkt != NULL);
-       assert(pkt_len >= datalen);
-       len = 0;
-       ret = ctdb_reply_dmaster_push(&h, &c, pkt, &len);
-       assert(ret == EMSGSIZE);
-       assert(len == datalen);
-       ret = ctdb_reply_dmaster_push(&h, &c, pkt, &pkt_len);
-       assert(ret == 0);
-       ret = ctdb_reply_dmaster_pull(pkt, pkt_len, &h2, mem_ctx, &c2);
-       assert(ret == 0);
-       verify_ctdb_req_header(&h, &h2);
-       assert(h2.length == pkt_len);
-       verify_ctdb_reply_dmaster(&c, &c2);
-
-       talloc_free(mem_ctx);
-}
-
-#define NUM_CONTROLS   151
-
-static void test_ctdb_req_control_data(void)
-{
-       TALLOC_CTX *mem_ctx;
-       size_t buflen;
-       int ret;
-       struct ctdb_req_control_data cd, cd2;
-       uint32_t opcode;
-
-       printf("ctdb_req_control_data\n");
-       fflush(stdout);
-
-       for (opcode=0; opcode<NUM_CONTROLS; opcode++) {
-               mem_ctx = talloc_new(NULL);
-               assert(mem_ctx != NULL);
-
-               printf("%u.. ", opcode);
-               fflush(stdout);
-               fill_ctdb_req_control_data(mem_ctx, &cd, opcode);
-               buflen = ctdb_req_control_data_len(&cd);
-               ctdb_req_control_data_push(&cd, BUFFER);
-               ret = ctdb_req_control_data_pull(BUFFER, buflen, opcode, mem_ctx, &cd2);
-               assert(ret == 0);
-               verify_ctdb_req_control_data(&cd, &cd2);
-               talloc_free(mem_ctx);
-       }
-
-       printf("\n");
-       fflush(stdout);
-}
-
-static void test_ctdb_reply_control_data(void)
-{
-       TALLOC_CTX *mem_ctx;
-       size_t buflen;
-       int ret;
-       struct ctdb_reply_control_data cd, cd2;
-       uint32_t opcode;
-
-       printf("ctdb_reply_control_data\n");
-       fflush(stdout);
-
-       for (opcode=0; opcode<NUM_CONTROLS; opcode++) {
-               mem_ctx = talloc_new(NULL);
-               assert(mem_ctx != NULL);
-
-               printf("%u.. ", opcode);
-               fflush(stdout);
-               fill_ctdb_reply_control_data(mem_ctx, &cd, opcode);
-               buflen = ctdb_reply_control_data_len(&cd);
-               ctdb_reply_control_data_push(&cd, BUFFER);
-               ret = ctdb_reply_control_data_pull(BUFFER, buflen, opcode, mem_ctx, &cd2);
-               assert(ret == 0);
-               verify_ctdb_reply_control_data(&cd, &cd2);
-               talloc_free(mem_ctx);
-       }
-
-       printf("\n");
-       fflush(stdout);
-}
-
-static void test_ctdb_req_control(void)
-{
-       TALLOC_CTX *mem_ctx;
-       uint8_t *pkt;
-       size_t datalen, pkt_len, len;
-       int ret;
-       struct ctdb_req_header h, h2;
-       struct ctdb_req_control c, c2;
-       uint32_t opcode;
-
-       printf("ctdb_req_control\n");
-       fflush(stdout);
-
-       ctdb_req_header_fill(&h, GENERATION, CTDB_REQ_CONTROL,
-                            DESTNODE, SRCNODE, REQID);
-
-       for (opcode=0; opcode<NUM_CONTROLS; opcode++) {
-               mem_ctx = talloc_new(NULL);
-               assert(mem_ctx != NULL);
-
-               printf("%u.. ", opcode);
-               fflush(stdout);
-               fill_ctdb_req_control(mem_ctx, &c, opcode);
-               datalen = ctdb_req_control_len(&h, &c);
-               ret = ctdb_allocate_pkt(mem_ctx, datalen, &pkt, &pkt_len);
-               assert(ret == 0);
-               assert(pkt != NULL);
-               assert(pkt_len >= datalen);
-               len = 0;
-               ret = ctdb_req_control_push(&h, &c, pkt, &len);
-               assert(ret == EMSGSIZE);
-               assert(len == datalen);
-               ret = ctdb_req_control_push(&h, &c, pkt, &pkt_len);
-               assert(ret == 0);
-               ret = ctdb_req_control_pull(pkt, pkt_len, &h2, mem_ctx, &c2);
-               assert(ret == 0);
-               verify_ctdb_req_header(&h, &h2);
-               assert(h2.length == pkt_len);
-               verify_ctdb_req_control(&c, &c2);
-
-               talloc_free(mem_ctx);
-       }
-
-       printf("\n");
-       fflush(stdout);
-}
-
-static void test_ctdb_reply_control(void)
-{
-       TALLOC_CTX *mem_ctx;
-       uint8_t *pkt;
-       size_t datalen, pkt_len, len;
-       int ret;
-       struct ctdb_req_header h, h2;
-       struct ctdb_reply_control c, c2;
-       uint32_t opcode;
-
-       printf("ctdb_reply_control\n");
-       fflush(stdout);
-
-       ctdb_req_header_fill(&h, GENERATION, CTDB_REPLY_CONTROL,
-                            DESTNODE, SRCNODE, REQID);
-
-       for (opcode=0; opcode<NUM_CONTROLS; opcode++) {
-               mem_ctx = talloc_new(NULL);
-               assert(mem_ctx != NULL);
-
-               printf("%u.. ", opcode);
-               fflush(stdout);
-               fill_ctdb_reply_control(mem_ctx, &c, opcode);
-               datalen = ctdb_reply_control_len(&h, &c);
-               ret = ctdb_allocate_pkt(mem_ctx, datalen, &pkt, &pkt_len);
-               assert(ret == 0);
-               assert(pkt != NULL);
-               assert(pkt_len >= datalen);
-               len = 0;
-               ret = ctdb_reply_control_push(&h, &c, pkt, &len);
-               assert(ret == EMSGSIZE);
-               assert(len == datalen);
-               ret = ctdb_reply_control_push(&h, &c, pkt, &pkt_len);
-               assert(ret == 0);
-               ret = ctdb_reply_control_pull(pkt, pkt_len, opcode, &h2, mem_ctx, &c2);
-               assert(ret == 0);
-               verify_ctdb_req_header(&h, &h2);
-               assert(h2.length == pkt_len);
-               verify_ctdb_reply_control(&c, &c2);
-
-               talloc_free(mem_ctx);
-       }
-
-       printf("\n");
-       fflush(stdout);
-}
-
-static void test_ctdb_req_message_data(void)
-{
-       TALLOC_CTX *mem_ctx;
-       uint8_t *pkt;
-       size_t datalen, pkt_len, len;
-       int ret;
-       struct ctdb_req_header h, h2;
-       struct ctdb_req_message_data c, c2;
-
-       printf("ctdb_req_message\n");
-       fflush(stdout);
-
-       mem_ctx = talloc_new(NULL);
-       assert(mem_ctx != NULL);
-
-       ctdb_req_header_fill(&h, GENERATION, CTDB_REQ_MESSAGE,
-                            DESTNODE, SRCNODE, REQID);
-
-       fill_ctdb_req_message_data(mem_ctx, &c);
-       datalen = ctdb_req_message_data_len(&h, &c);
-       ret = ctdb_allocate_pkt(mem_ctx, datalen, &pkt, &pkt_len);
-       assert(ret == 0);
-       assert(pkt != NULL);
-       assert(pkt_len >= datalen);
-       len = 0;
-       ret = ctdb_req_message_data_push(&h, &c, pkt, &len);
-       assert(ret == EMSGSIZE);
-       assert(len == datalen);
-       ret = ctdb_req_message_data_push(&h, &c, pkt, &pkt_len);
-       assert(ret == 0);
-       ret = ctdb_req_message_data_pull(pkt, pkt_len, &h2, mem_ctx, &c2);
-       assert(ret == 0);
-       verify_ctdb_req_header(&h, &h2);
-       assert(h2.length == pkt_len);
-       verify_ctdb_req_message_data(&c, &c2);
-
-       talloc_free(mem_ctx);
-}
-
-/*
- * Functions to test eventd protocol marshalling
- */
-
-static void test_ctdb_event_header(void)
-{
-       TALLOC_CTX *mem_ctx;
-       size_t buflen;
-       struct ctdb_event_header h, h2;
-       int ret;
-
-       printf("ctdb_event_header\n");
-       fflush(stdout);
-
-       mem_ctx = talloc_new(NULL);
-       assert(mem_ctx != NULL);
-
-       ctdb_event_header_fill(&h, REQID);
-
-       buflen = ctdb_event_header_len(&h);
-       ctdb_event_header_push(&h, BUFFER);
-       ret = ctdb_event_header_pull(BUFFER, buflen, mem_ctx, &h2);
-       assert(ret == 0);
-
-       verify_ctdb_event_header(&h, &h2);
-
-       talloc_free(mem_ctx);
-}
-
-#define NUM_COMMANDS   5
-
-static void test_ctdb_event_request_data(void)
-{
-       TALLOC_CTX *mem_ctx;
-       size_t buflen;
-       struct ctdb_event_request_data rd, rd2;
-       uint32_t command;
-       int ret;
-
-       printf("ctdb_event_request_data\n");
-       fflush(stdout);
-
-       for (command=1; command<=NUM_COMMANDS; command++) {
-               mem_ctx = talloc_new(NULL);
-               assert(mem_ctx != NULL);
-
-               printf("%u.. ", command);
-               fflush(stdout);
-               fill_ctdb_event_request_data(mem_ctx, &rd, command);
-               buflen = ctdb_event_request_data_len(&rd);
-               ctdb_event_request_data_push(&rd, BUFFER);
-               ret = ctdb_event_request_data_pull(BUFFER, buflen, mem_ctx, &rd2);
-               assert(ret == 0);
-               verify_ctdb_event_request_data(&rd, &rd2);
-
-               talloc_free(mem_ctx);
-       }
-
-       printf("\n");
-       fflush(stdout);
-}
-
-static void test_ctdb_event_reply_data(void)
-{
-       TALLOC_CTX *mem_ctx;
-       size_t buflen;
-       struct ctdb_event_reply_data rd, rd2;
-       uint32_t command;
-       int ret;
-
-       printf("ctdb_event_reply_data\n");
-       fflush(stdout);
-
-       for (command=1; command<=NUM_COMMANDS; command++) {
-               mem_ctx = talloc_new(NULL);
-               assert(mem_ctx != NULL);
-
-               printf("%u.. ", command);
-               fflush(stdout);
-               fill_ctdb_event_reply_data(mem_ctx, &rd, command);
-               buflen = ctdb_event_reply_data_len(&rd);
-               ctdb_event_reply_data_push(&rd, BUFFER);
-               ret = ctdb_event_reply_data_pull(BUFFER, buflen, mem_ctx, &rd2);
-               assert(ret == 0);
-               verify_ctdb_event_reply_data(&rd, &rd2);
-
-               talloc_free(mem_ctx);
-       }
-
-       printf("\n");
-       fflush(stdout);
-}
-
-static void test_ctdb_event_request(void)
-{
-       TALLOC_CTX *mem_ctx;
-       uint8_t *buf;
-       size_t len, buflen;
-       int ret;
-       struct ctdb_event_request r, r2;
-       uint32_t command;
-
-       printf("ctdb_event_request\n");
-       fflush(stdout);
-
-       for (command=1; command<=NUM_COMMANDS; command++) {
-               mem_ctx = talloc_new(NULL);
-               assert(mem_ctx != NULL);
-
-               printf("%u.. ", command);
-               fflush(stdout);
-               fill_ctdb_event_request(mem_ctx, &r, command);
-               buflen = ctdb_event_request_len(&r);
-               buf = talloc_size(mem_ctx, buflen);
-               assert(buf != NULL);
-               len = 0;
-               ret = ctdb_event_request_push(&r, buf, &len);
-               assert(ret == EMSGSIZE);
-               assert(len == buflen);
-               ret = ctdb_event_request_push(&r, buf, &buflen);
-               assert(ret == 0);
-               ret = ctdb_event_request_pull(buf, buflen, mem_ctx, &r2);
-               assert(ret == 0);
-               assert(r2.header.length == buflen);
-               verify_ctdb_event_request(&r, &r2);
-
-               talloc_free(mem_ctx);
-       }
-
-       printf("\n");
-       fflush(stdout);
-}
-
-static void test_ctdb_event_reply(void)
-{
-       TALLOC_CTX *mem_ctx;
-       uint8_t *buf;
-       size_t len, buflen;
-       int ret;
-       struct ctdb_event_reply r, r2;
-       uint32_t command;
-
-       printf("ctdb_event_reply\n");
-       fflush(stdout);
-
-       for (command=1; command<=NUM_COMMANDS; command++) {
-               mem_ctx = talloc_new(NULL);
-               assert(mem_ctx != NULL);
-
-               printf("%u.. ", command);
-               fflush(stdout);
-               fill_ctdb_event_reply(mem_ctx, &r, command);
-               buflen = ctdb_event_reply_len(&r);
-               buf = talloc_size(mem_ctx, buflen);
-               assert(buf != NULL);
-               len = 0;
-               ret = ctdb_event_reply_push(&r, buf, &len);
-               assert(ret == EMSGSIZE);
-               assert(len == buflen);
-               ret = ctdb_event_reply_push(&r, buf, &buflen);
-               assert(ret == 0);
-               ret = ctdb_event_reply_pull(buf, buflen, mem_ctx, &r2);
-               assert(ret == 0);
-               assert(r2.header.length == buflen);
-               verify_ctdb_event_reply(&r, &r2);
-
-               talloc_free(mem_ctx);
-       }
-
-       printf("\n");
-       fflush(stdout);
-}
-
-int main(int argc, char *argv[])
-{
-       if (argc == 2) {
-               int seed = atoi(argv[1]);
-               srandom(seed);
-       }
-
-       test_ctdb_req_header();
-
-       test_ctdb_req_call();
-       test_ctdb_reply_call();
-       test_ctdb_reply_error();
-       test_ctdb_req_dmaster();
-       test_ctdb_reply_dmaster();
-
-       test_ctdb_req_control_data();
-       test_ctdb_reply_control_data();
-
-       test_ctdb_req_control();
-       test_ctdb_reply_control();
-
-       test_ctdb_req_message_data();
-
-       test_ctdb_event_header();
-
-       test_ctdb_event_request_data();
-       test_ctdb_event_reply_data();
-       test_ctdb_event_request();
-       test_ctdb_event_reply();
-
-       return 0;
-}
diff --git a/ctdb/tests/src/protocol_common_ctdb.h b/ctdb/tests/src/protocol_common_ctdb.h
new file mode 100644 (file)
index 0000000..39a3e13
--- /dev/null
@@ -0,0 +1,81 @@
+/*
+   protocol tests - ctdb protocol
+
+   Copyright (C) Amitay Isaacs  2017
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef __CTDB_PROTOCOL_COMMON_CTDB_H__
+#define __CTDB_PROTOCOL_COMMON_CTDB_H__
+
+#include "replace.h"
+#include "system/network.h"
+
+#include <talloc.h>
+#include <tdb.h>
+
+#include "protocol/protocol.h"
+
+void verify_ctdb_req_header(struct ctdb_req_header *h,
+                           struct ctdb_req_header *h2);
+
+void fill_ctdb_req_call(TALLOC_CTX *mem_ctx, struct ctdb_req_call *c);
+void verify_ctdb_req_call(struct ctdb_req_call *c, struct ctdb_req_call *c2);
+
+void fill_ctdb_reply_call(TALLOC_CTX *mem_ctx, struct ctdb_reply_call *c);
+void verify_ctdb_reply_call(struct ctdb_reply_call *c,
+                           struct ctdb_reply_call *c2);
+
+void fill_ctdb_reply_error(TALLOC_CTX *mem_ctx, struct ctdb_reply_error *c);
+void verify_ctdb_reply_error(struct ctdb_reply_error *c,
+                            struct ctdb_reply_error *c2);
+
+void fill_ctdb_req_dmaster(TALLOC_CTX *mem_ctx, struct ctdb_req_dmaster *c);
+void verify_ctdb_req_dmaster(struct ctdb_req_dmaster *c,
+                            struct ctdb_req_dmaster *c2);
+
+void fill_ctdb_reply_dmaster(TALLOC_CTX *mem_ctx,
+                            struct ctdb_reply_dmaster *c);
+void verify_ctdb_reply_dmaster(struct ctdb_reply_dmaster *c,
+                              struct ctdb_reply_dmaster *c2);
+
+void fill_ctdb_req_control_data(TALLOC_CTX *mem_ctx,
+                               struct ctdb_req_control_data *cd,
+                               uint32_t opcode);
+void verify_ctdb_req_control_data(struct ctdb_req_control_data *cd,
+                                 struct ctdb_req_control_data *cd2);
+
+void fill_ctdb_req_control(TALLOC_CTX *mem_ctx, struct ctdb_req_control *c,
+                          uint32_t opcode);
+void verify_ctdb_req_control(struct ctdb_req_control *c,
+                            struct ctdb_req_control *c2);
+
+void fill_ctdb_reply_control_data(TALLOC_CTX *mem_ctx,
+                                 struct ctdb_reply_control_data *cd,
+                                 uint32_t opcode);
+void verify_ctdb_reply_control_data(struct ctdb_reply_control_data *cd,
+                                   struct ctdb_reply_control_data *cd2);
+
+void fill_ctdb_reply_control(TALLOC_CTX *mem_ctx,
+                            struct ctdb_reply_control *c, uint32_t opcode);
+void verify_ctdb_reply_control(struct ctdb_reply_control *c,
+                              struct ctdb_reply_control *c2);
+
+void fill_ctdb_req_message_data(TALLOC_CTX *mem_ctx,
+                               struct ctdb_req_message_data *c);
+void verify_ctdb_req_message_data(struct ctdb_req_message_data *c,
+                                 struct ctdb_req_message_data *c2);
+
+#endif /* __CTDB_PROTOCOL_COMMON_CTDB_H__ */
diff --git a/ctdb/tests/src/protocol_common_event.c b/ctdb/tests/src/protocol_common_event.c
new file mode 100644 (file)
index 0000000..2e4978e
--- /dev/null
@@ -0,0 +1,298 @@
+/*
+   protocol tests - eventd protocol
+
+   Copyright (C) Amitay Isaacs  2017
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include "replace.h"
+#include "system/network.h"
+
+#include <assert.h>
+
+#include "tests/src/protocol_common.h"
+#include "tests/src/protocol_common_event.h"
+
+/*
+ * Functions to fill and verify eventd protocol structures
+ */
+
+void fill_ctdb_event_request_run(TALLOC_CTX *mem_ctx,
+                                struct ctdb_event_request_run *p)
+{
+       p->event = rand_int(CTDB_EVENT_MAX);
+       p->timeout = rand();
+       fill_ctdb_string(mem_ctx, &p->arg_str);
+}
+
+void verify_ctdb_event_request_run(struct ctdb_event_request_run *p1,
+                                  struct ctdb_event_request_run *p2)
+{
+       assert(p1->event == p2->event);
+       assert(p1->timeout == p2->timeout);
+       verify_ctdb_string(p1->arg_str, p2->arg_str);
+}
+
+void fill_ctdb_event_request_status(TALLOC_CTX *mem_ctx,
+                                   struct ctdb_event_request_status *p)
+{
+       p->event = rand_int(CTDB_EVENT_MAX);
+       p->state = rand_int(3) + 1;
+}
+
+void verify_ctdb_event_request_status(struct ctdb_event_request_status *p1,
+                                     struct ctdb_event_request_status *p2)
+{
+       assert(p1->event == p2->event);
+       assert(p1->state == p2->state);
+}
+
+void fill_ctdb_event_request_script_enable(TALLOC_CTX *mem_ctx,
+                               struct ctdb_event_request_script_enable *p)
+{
+       fill_ctdb_string(mem_ctx, &p->script_name);
+}
+
+void verify_ctdb_event_request_script_enable(
+                               struct ctdb_event_request_script_enable *p1,
+                               struct ctdb_event_request_script_enable *p2)
+{
+       verify_ctdb_string(p1->script_name, p2->script_name);
+}
+
+void fill_ctdb_event_request_script_disable(TALLOC_CTX *mem_ctx,
+                               struct ctdb_event_request_script_disable *p)
+{
+       fill_ctdb_string(mem_ctx, &p->script_name);
+}
+
+void verify_ctdb_event_request_script_disable(
+                               struct ctdb_event_request_script_disable *p1,
+                               struct ctdb_event_request_script_disable *p2)
+{
+       verify_ctdb_string(p1->script_name, p2->script_name);
+}
+
+void fill_ctdb_event_reply_status(TALLOC_CTX *mem_ctx,
+                                 struct ctdb_event_reply_status *p)
+{
+       if (rand_int(2) == 0) {
+               p->status = 0;
+               p->script_list = talloc(mem_ctx, struct ctdb_script_list);
+               assert(p->script_list != NULL);
+               fill_ctdb_script_list(mem_ctx, p->script_list);
+       } else {
+               p->status = rand32i();
+               p->script_list = NULL;
+       }
+}
+
+void verify_ctdb_event_reply_status(struct ctdb_event_reply_status *p1,
+                                   struct ctdb_event_reply_status *p2)
+{
+       assert(p1->status == p2->status);
+       if (p1->script_list == NULL) {
+               assert(p1->script_list == p2->script_list);
+       } else {
+               verify_ctdb_script_list(p1->script_list, p2->script_list);
+       }
+}
+
+void fill_ctdb_event_reply_script_list(TALLOC_CTX *mem_ctx,
+                                      struct ctdb_event_reply_script_list *p)
+{
+       p->script_list = talloc(mem_ctx, struct ctdb_script_list);
+       assert(p->script_list != NULL);
+
+       fill_ctdb_script_list(mem_ctx, p->script_list);
+}
+
+void verify_ctdb_event_reply_script_list(
+                               struct ctdb_event_reply_script_list *p1,
+                               struct ctdb_event_reply_script_list *p2)
+{
+       verify_ctdb_script_list(p1->script_list, p2->script_list);
+}
+
+void fill_ctdb_event_request_data(TALLOC_CTX *mem_ctx,
+                                 struct ctdb_event_request_data *r,
+                                 uint32_t command)
+{
+       r->command = command;
+
+       switch (command) {
+       case CTDB_EVENT_COMMAND_RUN:
+               r->data.run = talloc(mem_ctx, struct ctdb_event_request_run);
+               assert(r->data.run != NULL);
+
+               fill_ctdb_event_request_run(mem_ctx, r->data.run);
+               break;
+
+       case CTDB_EVENT_COMMAND_STATUS:
+               r->data.status = talloc(mem_ctx,
+                                       struct ctdb_event_request_status);
+               assert(r->data.status != NULL);
+
+               fill_ctdb_event_request_status(mem_ctx, r->data.status);
+               break;
+
+       case CTDB_EVENT_COMMAND_SCRIPT_LIST:
+               break;
+
+       case CTDB_EVENT_COMMAND_SCRIPT_ENABLE:
+               r->data.script_enable = talloc(mem_ctx,
+                               struct ctdb_event_request_script_enable);
+               assert(r->data.script_enable != NULL);
+
+               fill_ctdb_event_request_script_enable(mem_ctx,
+                                                     r->data.script_enable);
+               break;
+
+       case CTDB_EVENT_COMMAND_SCRIPT_DISABLE:
+               r->data.script_disable = talloc(mem_ctx,
+                               struct ctdb_event_request_script_disable);
+               assert(r->data.script_disable != NULL);
+
+               fill_ctdb_event_request_script_disable(mem_ctx,
+                                                      r->data.script_disable);
+               break;
+       }
+}
+
+void verify_ctdb_event_request_data(struct ctdb_event_request_data *r,
+                                   struct ctdb_event_request_data *r2)
+{
+       assert(r->command == r2->command);
+
+       switch (r->command) {
+       case CTDB_EVENT_COMMAND_RUN:
+               verify_ctdb_event_request_run(r->data.run, r2->data.run);
+               break;
+
+       case CTDB_EVENT_COMMAND_STATUS:
+               verify_ctdb_event_request_status(r->data.status,
+                                                r2->data.status);
+               break;
+
+       case CTDB_EVENT_COMMAND_SCRIPT_LIST:
+               break;
+
+       case CTDB_EVENT_COMMAND_SCRIPT_ENABLE:
+               verify_ctdb_event_request_script_enable(r->data.script_enable,
+                                                       r2->data.script_enable);
+               break;
+
+       case CTDB_EVENT_COMMAND_SCRIPT_DISABLE:
+               verify_ctdb_event_request_script_disable(r->data.script_disable,
+                                                        r2->data.script_disable);
+               break;
+       }
+}
+
+void fill_ctdb_event_reply_data(TALLOC_CTX *mem_ctx,
+                               struct ctdb_event_reply_data *r,
+                               uint32_t command)
+{
+       r->command = command;
+       r->result = rand32i();
+
+       switch (command) {
+       case CTDB_EVENT_COMMAND_STATUS:
+               r->data.status = talloc(mem_ctx,
+                                       struct ctdb_event_reply_status);
+               assert(r->data.status != NULL);
+
+               fill_ctdb_event_reply_status(mem_ctx, r->data.status);
+               break;
+
+       case CTDB_EVENT_COMMAND_SCRIPT_LIST:
+               r->data.script_list = talloc(mem_ctx,
+                               struct ctdb_event_reply_script_list);
+               assert(r->data.script_list != NULL);
+
+               fill_ctdb_event_reply_script_list(mem_ctx,
+                                                 r->data.script_list);
+               break;
+       }
+}
+
+void verify_ctdb_event_reply_data(struct ctdb_event_reply_data *r,
+                                 struct ctdb_event_reply_data *r2)
+{
+       assert(r->command == r2->command);
+       assert(r->result == r2->result);
+
+       switch (r->command) {
+       case CTDB_EVENT_COMMAND_RUN:
+               break;
+
+       case CTDB_EVENT_COMMAND_STATUS:
+               verify_ctdb_event_reply_status(r->data.status,
+                                              r2->data.status);
+               break;
+
+       case CTDB_EVENT_COMMAND_SCRIPT_LIST:
+               verify_ctdb_event_reply_script_list(r->data.script_list,
+                                                   r2->data.script_list);
+               break;
+
+       case CTDB_EVENT_COMMAND_SCRIPT_ENABLE:
+               break;
+
+       case CTDB_EVENT_COMMAND_SCRIPT_DISABLE:
+               break;
+       }
+}
+
+void fill_ctdb_event_header(struct ctdb_event_header *h)
+{
+       h->length = rand32();
+       h->reqid = rand32();
+}
+
+void verify_ctdb_event_header(struct ctdb_event_header *h,
+                             struct ctdb_event_header *h2)
+{
+       assert(h->length == h2->length);
+       assert(h->reqid == h2->reqid);
+}
+
+void fill_ctdb_event_request(TALLOC_CTX *mem_ctx,
+                            struct ctdb_event_request *r, uint32_t command)
+{
+       fill_ctdb_event_header(&r->header);
+       fill_ctdb_event_request_data(mem_ctx, &r->rdata, command);
+}
+
+void verify_ctdb_event_request(struct ctdb_event_request *r,
+                              struct ctdb_event_request *r2)
+{
+       verify_ctdb_event_header(&r->header, &r2->header);
+       verify_ctdb_event_request_data(&r->rdata, &r2->rdata);
+}
+
+void fill_ctdb_event_reply(TALLOC_CTX *mem_ctx, struct ctdb_event_reply *r,
+                          uint32_t command)
+{
+       fill_ctdb_event_header(&r->header);
+       fill_ctdb_event_reply_data(mem_ctx, &r->rdata, command);
+}
+
+void verify_ctdb_event_reply(struct ctdb_event_reply *r,
+                            struct ctdb_event_reply *r2)
+{
+       verify_ctdb_event_header(&r->header, &r2->header);
+       verify_ctdb_event_reply_data(&r->rdata, &r2->rdata);
+}
diff --git a/ctdb/tests/src/protocol_common_event.h b/ctdb/tests/src/protocol_common_event.h
new file mode 100644 (file)
index 0000000..00bfc73
--- /dev/null
@@ -0,0 +1,90 @@
+/*
+   protocol tests - eventd protocol
+
+   Copyright (C) Amitay Isaacs  2017
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef __CTDB_PROTOCOL_COMMON_EVENT_H__
+#define __CTDB_PROTOCOL_COMMON_EVENT_H__
+
+#include "replace.h"
+#include "system/network.h"
+
+#include <talloc.h>
+#include <tdb.h>
+
+#include "protocol/protocol.h"
+
+void fill_ctdb_event_request_run(TALLOC_CTX *mem_ctx,
+                                struct ctdb_event_request_run *p);
+void verify_ctdb_event_request_run(struct ctdb_event_request_run *p1,
+                                  struct ctdb_event_request_run *p2);
+
+void fill_ctdb_event_request_status(TALLOC_CTX *mem_ctx,
+                                   struct ctdb_event_request_status *p);
+void verify_ctdb_event_request_status(struct ctdb_event_request_status *p1,
+                                     struct ctdb_event_request_status *p2);
+
+void fill_ctdb_event_request_script_enable(TALLOC_CTX *mem_ctx,
+                               struct ctdb_event_request_script_enable *p);
+void verify_ctdb_event_request_script_enable(
+                               struct ctdb_event_request_script_enable *p1,
+                               struct ctdb_event_request_script_enable *p2);
+
+void fill_ctdb_event_request_script_disable(TALLOC_CTX *mem_ctx,
+                               struct ctdb_event_request_script_disable *p);
+void verify_ctdb_event_request_script_disable(
+                               struct ctdb_event_request_script_disable *p1,
+                               struct ctdb_event_request_script_disable *p2);
+
+void fill_ctdb_event_reply_status(TALLOC_CTX *mem_ctx,
+                                 struct ctdb_event_reply_status *p);
+void verify_ctdb_event_reply_status(struct ctdb_event_reply_status *p1,
+                                   struct ctdb_event_reply_status *p2);
+
+void fill_ctdb_event_reply_script_list(TALLOC_CTX *mem_ctx,
+                                      struct ctdb_event_reply_script_list *p);
+void verify_ctdb_event_reply_script_list(
+                               struct ctdb_event_reply_script_list *p1,
+                               struct ctdb_event_reply_script_list *p2);
+
+void fill_ctdb_event_request_data(TALLOC_CTX *mem_ctx,
+                                 struct ctdb_event_request_data *r,
+                                 uint32_t command);
+void verify_ctdb_event_request_data(struct ctdb_event_request_data *r,
+                                   struct ctdb_event_request_data *r2);
+
+void fill_ctdb_event_reply_data(TALLOC_CTX *mem_ctx,
+                               struct ctdb_event_reply_data *r,
+                               uint32_t command);
+void verify_ctdb_event_reply_data(struct ctdb_event_reply_data *r,
+                                 struct ctdb_event_reply_data *r2);
+
+void fill_ctdb_event_header(struct ctdb_event_header *h);
+void verify_ctdb_event_header(struct ctdb_event_header *h,
+                             struct ctdb_event_header *h2);
+
+void fill_ctdb_event_request(TALLOC_CTX *mem_ctx,
+                            struct ctdb_event_request *r, uint32_t command);
+void verify_ctdb_event_request(struct ctdb_event_request *r,
+                              struct ctdb_event_request *r2);
+
+void fill_ctdb_event_reply(TALLOC_CTX *mem_ctx, struct ctdb_event_reply *r,
+                          uint32_t command);
+void verify_ctdb_event_reply(struct ctdb_event_reply *r,
+                            struct ctdb_event_reply *r2);
+
+#endif /* __CTDB_PROTOCOL_COMMON_EVENT_H__ */
diff --git a/ctdb/tests/src/protocol_ctdb_test.c b/ctdb/tests/src/protocol_ctdb_test.c
new file mode 100644 (file)
index 0000000..46350df
--- /dev/null
@@ -0,0 +1,491 @@
+/*
+   protocol tests
+
+   Copyright (C) Amitay Isaacs  2015
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include <assert.h>
+
+#include "protocol/protocol_basic.c"
+#include "protocol/protocol_types.c"
+#include "protocol/protocol_header.c"
+#include "protocol/protocol_call.c"
+#include "protocol/protocol_control.c"
+#include "protocol/protocol_message.c"
+#include "protocol/protocol_packet.c"
+
+#include "tests/src/protocol_common.h"
+#include "tests/src/protocol_common_ctdb.h"
+
+
+#define GENERATION     0xabcdef12
+#define OPERATION      CTDB_REQ_KEEPALIVE
+#define REQID          0x34567890
+#define SRCNODE                7
+#define DESTNODE       13
+
+/*
+ * Functions to test marshalling
+ */
+
+static void test_ctdb_req_header(void)
+{
+       TALLOC_CTX *mem_ctx;
+       uint8_t *pkt;
+       size_t pkt_len;
+       struct ctdb_req_header h, h2;
+       int ret;
+
+       printf("ctdb_req_header\n");
+       fflush(stdout);
+
+       mem_ctx = talloc_new(NULL);
+       assert(mem_ctx != NULL);
+
+       ctdb_req_header_fill(&h, GENERATION, OPERATION, DESTNODE, SRCNODE,
+                            REQID);
+
+       ret = ctdb_allocate_pkt(mem_ctx, ctdb_req_header_len(&h),
+                               &pkt, &pkt_len);
+       assert(ret == 0);
+       assert(pkt != NULL);
+       assert(pkt_len >= ctdb_req_header_len(&h));
+
+       ctdb_req_header_push(&h, pkt);
+
+       ret = ctdb_req_header_pull(pkt, pkt_len, &h2);
+       assert(ret == 0);
+
+       verify_ctdb_req_header(&h, &h2);
+
+       talloc_free(mem_ctx);
+}
+
+static void test_ctdb_req_call(void)
+{
+       TALLOC_CTX *mem_ctx;
+       uint8_t *pkt;
+       size_t datalen, pkt_len, len;
+       int ret;
+       struct ctdb_req_header h, h2;
+       struct ctdb_req_call c, c2;
+
+       printf("ctdb_req_call\n");
+       fflush(stdout);
+
+       mem_ctx = talloc_new(NULL);
+       assert(mem_ctx != NULL);
+
+       ctdb_req_header_fill(&h, GENERATION, CTDB_REQ_CALL,
+                            DESTNODE, SRCNODE, REQID);
+
+       fill_ctdb_req_call(mem_ctx, &c);
+       datalen = ctdb_req_call_len(&h, &c);
+       ret = ctdb_allocate_pkt(mem_ctx, datalen, &pkt, &pkt_len);
+       assert(ret == 0);
+       assert(pkt != NULL);
+       assert(pkt_len >= datalen);
+       len = 0;
+       ret = ctdb_req_call_push(&h, &c, pkt, &len);
+       assert(ret == EMSGSIZE);
+       assert(len == datalen);
+       ret = ctdb_req_call_push(&h, &c, pkt, &pkt_len);
+       assert(ret == 0);
+       ret = ctdb_req_call_pull(pkt, pkt_len, &h2, mem_ctx, &c2);
+       assert(ret == 0);
+       verify_ctdb_req_header(&h, &h2);
+       assert(h2.length == pkt_len);
+       verify_ctdb_req_call(&c, &c2);
+
+       talloc_free(mem_ctx);
+}
+
+static void test_ctdb_reply_call(void)
+{
+       TALLOC_CTX *mem_ctx;
+       uint8_t *pkt;
+       size_t datalen, pkt_len, len;
+       int ret;
+       struct ctdb_req_header h, h2;
+       struct ctdb_reply_call c, c2;
+
+       printf("ctdb_reply_call\n");
+       fflush(stdout);
+
+       mem_ctx = talloc_new(NULL);
+       assert(mem_ctx != NULL);
+
+       ctdb_req_header_fill(&h, GENERATION, CTDB_REPLY_CALL,
+                            DESTNODE, SRCNODE, REQID);
+
+       fill_ctdb_reply_call(mem_ctx, &c);
+       datalen = ctdb_reply_call_len(&h, &c);
+       ret = ctdb_allocate_pkt(mem_ctx, datalen, &pkt, &pkt_len);
+       assert(ret == 0);
+       assert(pkt != NULL);
+       assert(pkt_len >= datalen);
+       len = 0;
+       ret = ctdb_reply_call_push(&h, &c, pkt, &len);
+       assert(ret == EMSGSIZE);
+       assert(len == datalen);
+       ret = ctdb_reply_call_push(&h, &c, pkt, &pkt_len);
+       assert(ret == 0);
+       ret = ctdb_reply_call_pull(pkt, pkt_len, &h2, mem_ctx, &c2);
+       assert(ret == 0);
+       verify_ctdb_req_header(&h, &h2);
+       assert(h2.length == pkt_len);
+       verify_ctdb_reply_call(&c, &c2);
+
+       talloc_free(mem_ctx);
+}
+
+static void test_ctdb_reply_error(void)
+{
+       TALLOC_CTX *mem_ctx;
+       uint8_t *pkt;
+       size_t datalen, pkt_len, len;
+       int ret;
+       struct ctdb_req_header h, h2;
+       struct ctdb_reply_error c, c2;
+
+       printf("ctdb_reply_error\n");
+       fflush(stdout);
+
+       mem_ctx = talloc_new(NULL);
+       assert(mem_ctx != NULL);
+
+       ctdb_req_header_fill(&h, GENERATION, CTDB_REPLY_ERROR,
+                            DESTNODE, SRCNODE, REQID);
+
+       fill_ctdb_reply_error(mem_ctx, &c);
+       datalen = ctdb_reply_error_len(&h, &c);
+       ret = ctdb_allocate_pkt(mem_ctx, datalen, &pkt, &pkt_len);
+       assert(ret == 0);
+       assert(pkt != NULL);
+       assert(pkt_len >= datalen);
+       len = 0;
+       ret = ctdb_reply_error_push(&h, &c, pkt, &len);
+       assert(ret == EMSGSIZE);
+       assert(len == datalen);
+       ret = ctdb_reply_error_push(&h, &c, pkt, &pkt_len);
+       assert(ret == 0);
+       ret = ctdb_reply_error_pull(pkt, pkt_len, &h2, mem_ctx, &c2);
+       assert(ret == 0);
+       verify_ctdb_req_header(&h, &h2);
+       assert(h2.length == pkt_len);
+       verify_ctdb_reply_error(&c, &c2);
+
+       talloc_free(mem_ctx);
+}
+
+static void test_ctdb_req_dmaster(void)
+{
+       TALLOC_CTX *mem_ctx;
+       uint8_t *pkt;
+       size_t datalen, pkt_len, len;
+       int ret;
+       struct ctdb_req_header h, h2;
+       struct ctdb_req_dmaster c, c2;
+
+       printf("ctdb_req_dmaster\n");
+       fflush(stdout);
+
+       mem_ctx = talloc_new(NULL);
+       assert(mem_ctx != NULL);
+
+       ctdb_req_header_fill(&h, GENERATION, CTDB_REQ_DMASTER,
+                            DESTNODE, SRCNODE, REQID);
+
+       fill_ctdb_req_dmaster(mem_ctx, &c);
+       datalen = ctdb_req_dmaster_len(&h, &c);
+       ret = ctdb_allocate_pkt(mem_ctx, datalen, &pkt, &pkt_len);
+       assert(ret == 0);
+       assert(pkt != NULL);
+       assert(pkt_len >= datalen);
+       len = 0;
+       ret = ctdb_req_dmaster_push(&h, &c, pkt, &len);
+       assert(ret == EMSGSIZE);
+       assert(len == datalen);
+       ret = ctdb_req_dmaster_push(&h, &c, pkt, &pkt_len);
+       assert(ret == 0);
+       ret = ctdb_req_dmaster_pull(pkt, pkt_len, &h2, mem_ctx, &c2);
+       assert(ret == 0);
+       verify_ctdb_req_header(&h, &h2);
+       assert(h2.length == pkt_len);
+       verify_ctdb_req_dmaster(&c, &c2);
+
+       talloc_free(mem_ctx);
+}
+
+static void test_ctdb_reply_dmaster(void)
+{
+       TALLOC_CTX *mem_ctx;
+       uint8_t *pkt;
+       size_t datalen, pkt_len, len;
+       int ret;
+       struct ctdb_req_header h, h2;
+       struct ctdb_reply_dmaster c, c2;
+
+       printf("ctdb_reply_dmaster\n");
+       fflush(stdout);
+
+       mem_ctx = talloc_new(NULL);
+       assert(mem_ctx != NULL);
+
+       ctdb_req_header_fill(&h, GENERATION, CTDB_REPLY_DMASTER,
+                            DESTNODE, SRCNODE, REQID);
+
+       fill_ctdb_reply_dmaster(mem_ctx, &c);
+       datalen = ctdb_reply_dmaster_len(&h, &c);
+       ret = ctdb_allocate_pkt(mem_ctx, datalen, &pkt, &pkt_len);
+       assert(ret == 0);
+       assert(pkt != NULL);
+       assert(pkt_len >= datalen);
+       len = 0;
+       ret = ctdb_reply_dmaster_push(&h, &c, pkt, &len);
+       assert(ret == EMSGSIZE);
+       assert(len == datalen);
+       ret = ctdb_reply_dmaster_push(&h, &c, pkt, &pkt_len);
+       assert(ret == 0);
+       ret = ctdb_reply_dmaster_pull(pkt, pkt_len, &h2, mem_ctx, &c2);
+       assert(ret == 0);
+       verify_ctdb_req_header(&h, &h2);
+       assert(h2.length == pkt_len);
+       verify_ctdb_reply_dmaster(&c, &c2);
+
+       talloc_free(mem_ctx);
+}
+
+#define NUM_CONTROLS   151
+
+static void test_ctdb_req_control_data(void)
+{
+       TALLOC_CTX *mem_ctx;
+       size_t buflen;
+       int ret;
+       struct ctdb_req_control_data cd, cd2;
+       uint32_t opcode;
+
+       printf("ctdb_req_control_data\n");
+       fflush(stdout);
+
+       for (opcode=0; opcode<NUM_CONTROLS; opcode++) {
+               mem_ctx = talloc_new(NULL);
+               assert(mem_ctx != NULL);
+
+               printf("%u.. ", opcode);
+               fflush(stdout);
+               fill_ctdb_req_control_data(mem_ctx, &cd, opcode);
+               buflen = ctdb_req_control_data_len(&cd);
+               ctdb_req_control_data_push(&cd, BUFFER);
+               ret = ctdb_req_control_data_pull(BUFFER, buflen, opcode, mem_ctx, &cd2);
+               assert(ret == 0);
+               verify_ctdb_req_control_data(&cd, &cd2);
+               talloc_free(mem_ctx);
+       }
+
+       printf("\n");
+       fflush(stdout);
+}
+
+static void test_ctdb_reply_control_data(void)
+{
+       TALLOC_CTX *mem_ctx;
+       size_t buflen;
+       int ret;
+       struct ctdb_reply_control_data cd, cd2;
+       uint32_t opcode;
+
+       printf("ctdb_reply_control_data\n");
+       fflush(stdout);
+
+       for (opcode=0; opcode<NUM_CONTROLS; opcode++) {
+               mem_ctx = talloc_new(NULL);
+               assert(mem_ctx != NULL);
+
+               printf("%u.. ", opcode);
+               fflush(stdout);
+               fill_ctdb_reply_control_data(mem_ctx, &cd, opcode);
+               buflen = ctdb_reply_control_data_len(&cd);
+               ctdb_reply_control_data_push(&cd, BUFFER);
+               ret = ctdb_reply_control_data_pull(BUFFER, buflen, opcode, mem_ctx, &cd2);
+               assert(ret == 0);
+               verify_ctdb_reply_control_data(&cd, &cd2);
+               talloc_free(mem_ctx);
+       }
+
+       printf("\n");
+       fflush(stdout);
+}
+
+static void test_ctdb_req_control(void)
+{
+       TALLOC_CTX *mem_ctx;
+       uint8_t *pkt;
+       size_t datalen, pkt_len, len;
+       int ret;
+       struct ctdb_req_header h, h2;
+       struct ctdb_req_control c, c2;
+       uint32_t opcode;
+
+       printf("ctdb_req_control\n");
+       fflush(stdout);
+
+       ctdb_req_header_fill(&h, GENERATION, CTDB_REQ_CONTROL,
+                            DESTNODE, SRCNODE, REQID);
+
+       for (opcode=0; opcode<NUM_CONTROLS; opcode++) {
+               mem_ctx = talloc_new(NULL);
+               assert(mem_ctx != NULL);
+
+               printf("%u.. ", opcode);
+               fflush(stdout);
+               fill_ctdb_req_control(mem_ctx, &c, opcode);
+               datalen = ctdb_req_control_len(&h, &c);
+               ret = ctdb_allocate_pkt(mem_ctx, datalen, &pkt, &pkt_len);
+               assert(ret == 0);
+               assert(pkt != NULL);
+               assert(pkt_len >= datalen);
+               len = 0;
+               ret = ctdb_req_control_push(&h, &c, pkt, &len);
+               assert(ret == EMSGSIZE);
+               assert(len == datalen);
+               ret = ctdb_req_control_push(&h, &c, pkt, &pkt_len);
+               assert(ret == 0);
+               ret = ctdb_req_control_pull(pkt, pkt_len, &h2, mem_ctx, &c2);
+               assert(ret == 0);
+               verify_ctdb_req_header(&h, &h2);
+               assert(h2.length == pkt_len);
+               verify_ctdb_req_control(&c, &c2);
+
+               talloc_free(mem_ctx);
+       }
+
+       printf("\n");
+       fflush(stdout);
+}
+
+static void test_ctdb_reply_control(void)
+{
+       TALLOC_CTX *mem_ctx;
+       uint8_t *pkt;
+       size_t datalen, pkt_len, len;
+       int ret;
+       struct ctdb_req_header h, h2;
+       struct ctdb_reply_control c, c2;
+       uint32_t opcode;
+
+       printf("ctdb_reply_control\n");
+       fflush(stdout);
+
+       ctdb_req_header_fill(&h, GENERATION, CTDB_REPLY_CONTROL,
+                            DESTNODE, SRCNODE, REQID);
+
+       for (opcode=0; opcode<NUM_CONTROLS; opcode++) {
+               mem_ctx = talloc_new(NULL);
+               assert(mem_ctx != NULL);
+
+               printf("%u.. ", opcode);
+               fflush(stdout);
+               fill_ctdb_reply_control(mem_ctx, &c, opcode);
+               datalen = ctdb_reply_control_len(&h, &c);
+               ret = ctdb_allocate_pkt(mem_ctx, datalen, &pkt, &pkt_len);
+               assert(ret == 0);
+               assert(pkt != NULL);
+               assert(pkt_len >= datalen);
+               len = 0;
+               ret = ctdb_reply_control_push(&h, &c, pkt, &len);
+               assert(ret == EMSGSIZE);
+               assert(len == datalen);
+               ret = ctdb_reply_control_push(&h, &c, pkt, &pkt_len);
+               assert(ret == 0);
+               ret = ctdb_reply_control_pull(pkt, pkt_len, opcode, &h2, mem_ctx, &c2);
+               assert(ret == 0);
+               verify_ctdb_req_header(&h, &h2);
+               assert(h2.length == pkt_len);
+               verify_ctdb_reply_control(&c, &c2);
+
+               talloc_free(mem_ctx);
+       }
+
+       printf("\n");
+       fflush(stdout);
+}
+
+static void test_ctdb_req_message_data(void)
+{
+       TALLOC_CTX *mem_ctx;
+       uint8_t *pkt;
+       size_t datalen, pkt_len, len;
+       int ret;
+       struct ctdb_req_header h, h2;
+       struct ctdb_req_message_data c, c2;
+
+       printf("ctdb_req_message\n");
+       fflush(stdout);
+
+       mem_ctx = talloc_new(NULL);
+       assert(mem_ctx != NULL);
+
+       ctdb_req_header_fill(&h, GENERATION, CTDB_REQ_MESSAGE,
+                            DESTNODE, SRCNODE, REQID);
+
+       fill_ctdb_req_message_data(mem_ctx, &c);
+       datalen = ctdb_req_message_data_len(&h, &c);
+       ret = ctdb_allocate_pkt(mem_ctx, datalen, &pkt, &pkt_len);
+       assert(ret == 0);
+       assert(pkt != NULL);
+       assert(pkt_len >= datalen);
+       len = 0;
+       ret = ctdb_req_message_data_push(&h, &c, pkt, &len);
+       assert(ret == EMSGSIZE);
+       assert(len == datalen);
+       ret = ctdb_req_message_data_push(&h, &c, pkt, &pkt_len);
+       assert(ret == 0);
+       ret = ctdb_req_message_data_pull(pkt, pkt_len, &h2, mem_ctx, &c2);
+       assert(ret == 0);
+       verify_ctdb_req_header(&h, &h2);
+       assert(h2.length == pkt_len);
+       verify_ctdb_req_message_data(&c, &c2);
+
+       talloc_free(mem_ctx);
+}
+
+int main(int argc, char *argv[])
+{
+       if (argc == 2) {
+               int seed = atoi(argv[1]);
+               srandom(seed);
+       }
+
+       test_ctdb_req_header();
+
+       test_ctdb_req_call();
+       test_ctdb_reply_call();
+       test_ctdb_reply_error();
+       test_ctdb_req_dmaster();
+       test_ctdb_reply_dmaster();
+
+       test_ctdb_req_control_data();
+       test_ctdb_reply_control_data();
+
+       test_ctdb_req_control();
+       test_ctdb_reply_control();
+
+       test_ctdb_req_message_data();
+
+       return 0;
+}
diff --git a/ctdb/tests/src/protocol_event_test.c b/ctdb/tests/src/protocol_event_test.c
new file mode 100644 (file)
index 0000000..027e09e
--- /dev/null
@@ -0,0 +1,236 @@
+/*
+   protocol types tests
+
+   Copyright (C) Amitay Isaacs  2015
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include <assert.h>
+
+#include "protocol/protocol_basic.c"
+#include "protocol/protocol_types.c"
+#include "protocol/protocol_event.c"
+
+#include "tests/src/protocol_common.h"
+#include "tests/src/protocol_common_event.h"
+
+#define REQID          0x34567890
+
+
+/*
+ * Functions to test eventd protocol marshalling
+ */
+
+static void test_ctdb_event_header(void)
+{
+       TALLOC_CTX *mem_ctx;
+       size_t buflen;
+       struct ctdb_event_header h, h2;
+       int ret;
+
+       printf("ctdb_event_header\n");
+       fflush(stdout);
+
+       mem_ctx = talloc_new(NULL);
+       assert(mem_ctx != NULL);
+
+       ctdb_event_header_fill(&h, REQID);
+
+       buflen = ctdb_event_header_len(&h);
+       ctdb_event_header_push(&h, BUFFER);
+       ret = ctdb_event_header_pull(BUFFER, buflen, mem_ctx, &h2);
+       assert(ret == 0);
+
+       verify_ctdb_event_header(&h, &h2);
+
+       talloc_free(mem_ctx);
+}
+
+#define NUM_COMMANDS   5
+
+static void test_ctdb_event_request_data(void)
+{
+       TALLOC_CTX *mem_ctx;
+       size_t buflen;
+       struct ctdb_event_request_data rd, rd2;
+       uint32_t command;
+       int ret;
+
+       printf("ctdb_event_request_data\n");
+       fflush(stdout);
+
+       for (command=1; command<=NUM_COMMANDS; command++) {
+               mem_ctx = talloc_new(NULL);
+               assert(mem_ctx != NULL);
+
+               printf("%u.. ", command);
+               fflush(stdout);
+               fill_ctdb_event_request_data(mem_ctx, &rd, command);
+               buflen = ctdb_event_request_data_len(&rd);
+               ctdb_event_request_data_push(&rd, BUFFER);
+               ret = ctdb_event_request_data_pull(BUFFER, buflen, mem_ctx, &rd2);
+               assert(ret == 0);
+               verify_ctdb_event_request_data(&rd, &rd2);
+
+               talloc_free(mem_ctx);
+       }
+
+       printf("\n");
+       fflush(stdout);
+}
+
+static void test_ctdb_event_reply_data(void)
+{
+       TALLOC_CTX *mem_ctx;
+       size_t buflen;
+       struct ctdb_event_reply_data rd, rd2;
+       uint32_t command;
+       int ret;
+
+       printf("ctdb_event_reply_data\n");
+       fflush(stdout);
+
+       for (command=1; command<=NUM_COMMANDS; command++) {
+               mem_ctx = talloc_new(NULL);
+               assert(mem_ctx != NULL);
+
+               printf("%u.. ", command);
+               fflush(stdout);
+               fill_ctdb_event_reply_data(mem_ctx, &rd, command);
+               buflen = ctdb_event_reply_data_len(&rd);
+               ctdb_event_reply_data_push(&rd, BUFFER);
+               ret = ctdb_event_reply_data_pull(BUFFER, buflen, mem_ctx, &rd2);
+               assert(ret == 0);
+               verify_ctdb_event_reply_data(&rd, &rd2);
+
+               talloc_free(mem_ctx);
+       }
+
+       printf("\n");
+       fflush(stdout);
+}
+
+static void test_ctdb_event_request(void)
+{
+       TALLOC_CTX *mem_ctx;
+       uint8_t *buf;
+       size_t len, buflen;
+       int ret;
+       struct ctdb_event_request r, r2;
+       uint32_t command;
+
+       printf("ctdb_event_request\n");
+       fflush(stdout);
+
+       for (command=1; command<=NUM_COMMANDS; command++) {
+               mem_ctx = talloc_new(NULL);
+               assert(mem_ctx != NULL);
+
+               printf("%u.. ", command);
+               fflush(stdout);
+               fill_ctdb_event_request(mem_ctx, &r, command);
+               buflen = ctdb_event_request_len(&r);
+               buf = talloc_size(mem_ctx, buflen);
+               assert(buf != NULL);
+               len = 0;
+               ret = ctdb_event_request_push(&r, buf, &len);
+               assert(ret == EMSGSIZE);
+               assert(len == buflen);
+               ret = ctdb_event_request_push(&r, buf, &buflen);
+               assert(ret == 0);
+               ret = ctdb_event_request_pull(buf, buflen, mem_ctx, &r2);
+               assert(ret == 0);
+               assert(r2.header.length == buflen);
+               verify_ctdb_event_request(&r, &r2);
+
+               talloc_free(mem_ctx);
+       }
+
+       printf("\n");
+       fflush(stdout);
+}
+
+static void test_ctdb_event_reply(void)
+{
+       TALLOC_CTX *mem_ctx;
+       uint8_t *buf;
+       size_t len, buflen;
+       int ret;
+       struct ctdb_event_reply r, r2;
+       uint32_t command;
+
+       printf("ctdb_event_reply\n");
+       fflush(stdout);
+
+       for (command=1; command<=NUM_COMMANDS; command++) {
+               mem_ctx = talloc_new(NULL);
+               assert(mem_ctx != NULL);
+
+               printf("%u.. ", command);
+               fflush(stdout);
+               fill_ctdb_event_reply(mem_ctx, &r, command);
+               buflen = ctdb_event_reply_len(&r);
+               buf = talloc_size(mem_ctx, buflen);
+               assert(buf != NULL);
+               len = 0;
+               ret = ctdb_event_reply_push(&r, buf, &len);
+               assert(ret == EMSGSIZE);
+               assert(len == buflen);
+               ret = ctdb_event_reply_push(&r, buf, &buflen);
+               assert(ret == 0);
+               ret = ctdb_event_reply_pull(buf, buflen, mem_ctx, &r2);
+               assert(ret == 0);
+               assert(r2.header.length == buflen);
+               verify_ctdb_event_reply(&r, &r2);
+
+               talloc_free(mem_ctx);
+       }
+
+       printf("\n");
+       fflush(stdout);
+}
+
+DEFINE_TEST(struct ctdb_event_request_run, ctdb_event_request_run);
+DEFINE_TEST(struct ctdb_event_request_status, ctdb_event_request_status);
+DEFINE_TEST(struct ctdb_event_request_script_enable,
+                               ctdb_event_request_script_enable);
+DEFINE_TEST(struct ctdb_event_request_script_disable,
+                               ctdb_event_request_script_disable);
+DEFINE_TEST(struct ctdb_event_reply_status, ctdb_event_reply_status);
+DEFINE_TEST(struct ctdb_event_reply_script_list, ctdb_event_reply_script_list);
+
+int main(int argc, char *argv[])
+{
+       if (argc == 2) {
+               int seed = atoi(argv[1]);
+               srandom(seed);
+       }
+
+       TEST_FUNC(ctdb_event_request_run)();
+       TEST_FUNC(ctdb_event_request_status)();
+       TEST_FUNC(ctdb_event_request_script_enable)();
+       TEST_FUNC(ctdb_event_request_script_disable)();
+       TEST_FUNC(ctdb_event_reply_status)();
+       TEST_FUNC(ctdb_event_reply_script_list)();
+
+       test_ctdb_event_header();
+
+       test_ctdb_event_request_data();
+       test_ctdb_event_reply_data();
+       test_ctdb_event_request();
+       test_ctdb_event_reply();
+
+       return 0;
+}
index 876502fb9f4c38651f68c7b6013a1601364b7358..457a9107bd96a5eff21004d29477e88f8565ab2d 100644 (file)
 */
 
 #include "replace.h"
-#include "system/network.h"
 #include "system/filesys.h"
 
 #include <assert.h>
 
 #include "protocol/protocol_basic.c"
 #include "protocol/protocol_types.c"
-#include "protocol/protocol_header.c"
-#include "protocol/protocol_call.c"
-#include "protocol/protocol_control.c"
-#include "protocol/protocol_event.c"
-#include "protocol/protocol_message.c"
-#include "protocol/protocol_packet.c"
 
-uint8_t BUFFER[1024*1024];
-
-/*
- * Functions to generation random data
- */
-
-static int rand_int(int max)
-{
-       return random() % max;
-}
-
-static uint8_t rand8(void)
-{
-       uint8_t val = rand_int(256) & 0xff;
-       return val;
-}
-
-static int32_t rand32i(void)
-{
-       return INT_MIN + random();
-}
-
-static uint32_t rand32(void)
-{
-       return random();
-}
-
-static uint64_t rand64(void)
-{
-       uint64_t t = random();
-       t = (t << 32) | random();
-       return t;
-}
-
-static double rand_double(void)
-{
-       return 1.0 / rand64();
-}
-
-static void fill_buffer(void *p, size_t len)
-{
-       int i;
-       uint8_t *ptr = p;
-
-       for (i=0; i<len; i++) {
-               ptr[i] = rand8();
-       }
-}
-
-static void verify_buffer(void *p1, void *p2, size_t len)
-{
-       if (len > 0) {
-               assert(memcmp(p1, p2, len) == 0);
-       }
-}
-
-/*
- * Functions to fill and verify data types
- */
-
-static void fill_tdb_data_nonnull(TALLOC_CTX *mem_ctx, TDB_DATA *p)
-{
-       p->dsize = rand_int(1024) + 1;
-       p->dptr = talloc_array(mem_ctx, uint8_t, p->dsize);
-       assert(p->dptr != NULL);
-       fill_buffer(p->dptr, p->dsize);
-}
-
-static void fill_tdb_data(TALLOC_CTX *mem_ctx, TDB_DATA *p)
-{
-       if (rand_int(5) == 0) {
-               p->dsize = 0;
-               p->dptr = NULL;
-       } else {
-               fill_tdb_data_nonnull(mem_ctx, p);
-       }
-}
-
-static void verify_tdb_data(TDB_DATA *p1, TDB_DATA *p2)
-{
-       assert(p1->dsize == p2->dsize);
-       verify_buffer(p1->dptr, p2->dptr, p1->dsize);
-}
-
-static void fill_ctdb_statistics(TALLOC_CTX *mem_ctx, struct ctdb_statistics *p)
-{
-       fill_buffer((uint8_t *)p, sizeof(struct ctdb_statistics));
-}
-
-static void verify_ctdb_statistics(struct ctdb_statistics *p1,
-                                  struct ctdb_statistics *p2)
-{
-       verify_buffer(p1, p2, sizeof(struct ctdb_statistics));
-}
-
-static void fill_ctdb_vnn_map(TALLOC_CTX *mem_ctx, struct ctdb_vnn_map *p)
-{
-       int i;
-
-       p->generation = rand32();
-       p->size = rand_int(20);
-       if (p->size > 0) {
-               p->map = talloc_array(mem_ctx, uint32_t, p->size);
-               assert(p->map != NULL);
-
-               for (i=0; i<p->size; i++) {
-                       p->map[i] = rand32();
-               }
-       } else {
-               p->map = NULL;
-       }
-}
-
-static void verify_ctdb_vnn_map(struct ctdb_vnn_map *p1,
-                               struct ctdb_vnn_map *p2)
-{
-       int i;
-
-       assert(p1->generation == p2->generation);
-       assert(p1->size == p2->size);
-       for (i=0; i<p1->size; i++) {
-               assert(p1->map[i] == p2->map[i]);
-       }
-}
-
-static void fill_ctdb_dbid(TALLOC_CTX *mem_ctx, struct ctdb_dbid *p)
-{
-       p->db_id = rand32();
-       p->flags = rand8();
-}
-
-static void verify_ctdb_dbid(struct ctdb_dbid *p1, struct ctdb_dbid *p2)
-{
-       assert(p1->db_id == p2->db_id);
-       assert(p1->flags == p2->flags);
-}
-
-static void fill_ctdb_dbid_map(TALLOC_CTX *mem_ctx, struct ctdb_dbid_map *p)
-{
-       int i;
-
-       p->num = rand_int(40);
-       if (p->num > 0) {
-               p->dbs = talloc_array(mem_ctx, struct ctdb_dbid, p->num);
-               assert(p->dbs != NULL);
-               for (i=0; i<p->num; i++) {
-                       fill_ctdb_dbid(mem_ctx, &p->dbs[i]);
-               }
-       } else {
-               p->dbs = NULL;
-       }
-}
-
-static void verify_ctdb_dbid_map(struct ctdb_dbid_map *p1,
-                                struct ctdb_dbid_map *p2)
-{
-       int i;
-
-       assert(p1->num == p2->num);
-       for (i=0; i<p1->num; i++) {
-               verify_ctdb_dbid(&p1->dbs[i], &p2->dbs[i]);
-       }
-}
-
-static void fill_ctdb_pulldb(TALLOC_CTX *mem_ctx, struct ctdb_pulldb *p)
-{
-       p->db_id = rand32();
-       p->lmaster = rand32();
-}
-
-static void verify_ctdb_pulldb(struct ctdb_pulldb *p1, struct ctdb_pulldb *p2)
-{
-       assert(p1->db_id == p2->db_id);
-       assert(p1->lmaster == p2->lmaster);
-}
-
-static void fill_ctdb_pulldb_ext(TALLOC_CTX *mem_ctx,
-                                struct ctdb_pulldb_ext *p)
-{
-       p->db_id = rand32();
-       p->lmaster = rand32();
-       p->srvid = rand64();
-}
-
-static void verify_ctdb_pulldb_ext(struct ctdb_pulldb_ext *p1,
-                                  struct ctdb_pulldb_ext *p2)
-{
-       assert(p1->db_id == p2->db_id);
-       assert(p1->lmaster == p2->lmaster);
-       assert(p1->srvid == p2->srvid);
-}
-
-static void fill_ctdb_ltdb_header(TALLOC_CTX *mem_ctx,
-                                 struct ctdb_ltdb_header *p)
-{
-       p->rsn = rand64();
-       p->dmaster = rand32();
-       p->flags = rand32();
-}
-
-static void verify_ctdb_ltdb_header(struct ctdb_ltdb_header *p1,
-                                   struct ctdb_ltdb_header *p2)
-{
-       assert(p1->rsn == p2->rsn);
-       assert(p1->dmaster == p2->dmaster);
-       assert(p1->flags == p2->flags);
-}
-
-static void fill_ctdb_rec_data(TALLOC_CTX *mem_ctx, struct ctdb_rec_data *p)
-{
-       p->reqid = rand32();
-       if (p->reqid % 5 == 0) {
-               p->header = talloc(mem_ctx, struct ctdb_ltdb_header);
-               assert(p->header != NULL);
-               fill_ctdb_ltdb_header(mem_ctx, p->header);
-       } else {
-               p->header = NULL;
-       }
-       fill_tdb_data_nonnull(mem_ctx, &p->key);
-       fill_tdb_data(mem_ctx, &p->data);
-}
-
-static void verify_ctdb_rec_data(struct ctdb_rec_data *p1,
-                                struct ctdb_rec_data *p2)
-{
-       struct ctdb_ltdb_header header;
-
-       assert(p1->reqid == p2->reqid);
-       if (p1->header != NULL) {
-               assert(ctdb_ltdb_header_extract(&p2->data, &header) == 0);
-               verify_ctdb_ltdb_header(p1->header, &header);
-       }
-       verify_tdb_data(&p1->key, &p2->key);
-       verify_tdb_data(&p1->data, &p2->data);
-}
-
-static void fill_ctdb_rec_buffer(TALLOC_CTX *mem_ctx, struct ctdb_rec_buffer *p)
-{
-       struct ctdb_rec_data rec;
-       int ret, i;
-       int count;
-
-       p->db_id = rand32();
-       p->count = 0;
-       p->buf = NULL;
-       p->buflen = 0;
-
-       count = rand_int(100);
-       if (count > 0) {
-               for (i=0; i<count; i++) {
-                       fill_ctdb_rec_data(mem_ctx, &rec);
-                       ret = ctdb_rec_buffer_add(mem_ctx, p, rec.reqid,
-                                                 rec.header,
-                                                 rec.key, rec.data);
-                       assert(ret == 0);
-               }
-       }
-}
-
-static void verify_ctdb_rec_buffer(struct ctdb_rec_buffer *p1,
-                                  struct ctdb_rec_buffer *p2)
-{
-       assert(p1->db_id == p2->db_id);
-       assert(p1->count == p2->count);
-       assert(p1->buflen == p2->buflen);
-       verify_buffer(p1->buf, p2->buf, p1->buflen);
-}
-
-static void fill_ctdb_traverse_start(TALLOC_CTX *mem_ctx,
-                                    struct ctdb_traverse_start *p)
-{
-       p->db_id = rand32();
-       p->reqid = rand32();
-       p->srvid = rand64();
-}
-
-static void verify_ctdb_traverse_start(struct ctdb_traverse_start *p1,
-                                      struct ctdb_traverse_start *p2)
-{
-       assert(p1->db_id == p2->db_id);
-       assert(p1->reqid == p2->reqid);
-       assert(p1->srvid == p2->srvid);
-}
-
-static void fill_ctdb_traverse_all(TALLOC_CTX *mem_ctx,
-                                  struct ctdb_traverse_all *p)
-{
-       p->db_id = rand32();
-       p->reqid = rand32();
-       p->pnn = rand32();
-       p->client_reqid = rand32();
-       p->srvid = rand64();
-}
-
-static void verify_ctdb_traverse_all(struct ctdb_traverse_all *p1,
-                                    struct ctdb_traverse_all *p2)
-{
-       assert(p1->db_id == p2->db_id);
-       assert(p1->reqid == p2->reqid);
-       assert(p1->pnn == p2->pnn);
-       assert(p1->client_reqid == p2->client_reqid);
-       assert(p1->srvid == p2->srvid);
-}
-
-static void fill_ctdb_traverse_start_ext(TALLOC_CTX *mem_ctx,
-                                        struct ctdb_traverse_start_ext *p)
-{
-       p->db_id = rand32();
-       p->reqid = rand32();
-       p->srvid = rand64();
-       p->withemptyrecords = rand_int(2);
-}
-
-static void verify_ctdb_traverse_start_ext(struct ctdb_traverse_start_ext *p1,
-                                          struct ctdb_traverse_start_ext *p2)
-{
-       assert(p1->db_id == p2->db_id);
-       assert(p1->reqid == p2->reqid);
-       assert(p1->srvid == p2->srvid);
-       assert(p1->withemptyrecords == p2->withemptyrecords);
-}
-
-static void fill_ctdb_traverse_all_ext(TALLOC_CTX *mem_ctx,
-                                      struct ctdb_traverse_all_ext *p)
-{
-       p->db_id = rand32();
-       p->reqid = rand32();
-       p->pnn = rand32();
-       p->client_reqid = rand32();
-       p->srvid = rand64();
-       p->withemptyrecords = rand_int(2);
-}
-
-static void verify_ctdb_traverse_all_ext(struct ctdb_traverse_all_ext *p1,
-                                        struct ctdb_traverse_all_ext *p2)
-{
-       assert(p1->db_id == p2->db_id);
-       assert(p1->reqid == p2->reqid);
-       assert(p1->pnn == p2->pnn);
-       assert(p1->client_reqid == p2->client_reqid);
-       assert(p1->srvid == p2->srvid);
-       assert(p1->withemptyrecords == p2->withemptyrecords);
-}
-
-static void fill_ctdb_sock_addr(TALLOC_CTX *mem_ctx, ctdb_sock_addr *p)
-{
-       if (rand_int(2) == 0) {
-               p->ip.sin_family = AF_INET;
-               p->ip.sin_port = rand_int(65535);
-               fill_buffer(&p->ip.sin_addr, sizeof(struct in_addr));
-       } else {
-               p->ip6.sin6_family = AF_INET6;
-               p->ip6.sin6_port = rand_int(65535);
-               fill_buffer(&p->ip6.sin6_addr, sizeof(struct in6_addr));
-       }
-}
-
-static void verify_ctdb_sock_addr(ctdb_sock_addr *p1, ctdb_sock_addr *p2)
-{
-       assert(p1->sa.sa_family == p2->sa.sa_family);
-       if (p1->sa.sa_family == AF_INET) {
-               assert(p1->ip.sin_port == p2->ip.sin_port);
-               verify_buffer(&p1->ip.sin_addr, &p2->ip.sin_addr,
-                                  sizeof(struct in_addr));
-       } else {
-               assert(p1->ip6.sin6_port == p2->ip6.sin6_port);
-               verify_buffer(&p1->ip6.sin6_addr, &p2->ip6.sin6_addr,
-                                  sizeof(struct in6_addr));
-       }
-}
-
-static void fill_ctdb_connection(TALLOC_CTX *mem_ctx,
-                                struct ctdb_connection *p)
-{
-       fill_ctdb_sock_addr(mem_ctx, &p->src);
-       fill_ctdb_sock_addr(mem_ctx, &p->dst);
-}
-
-static void verify_ctdb_connection(struct ctdb_connection *p1,
-                                  struct ctdb_connection *p2)
-{
-       verify_ctdb_sock_addr(&p1->src, &p2->src);
-       verify_ctdb_sock_addr(&p1->dst, &p2->dst);
-}
-
-static void fill_ctdb_string(TALLOC_CTX *mem_ctx, const char **out)
-{
-       char *p;
-       int len, i;
-
-       len = rand_int(1024) + 1;
-       p = talloc_size(mem_ctx, len+1);
-       assert(p != NULL);
-
-       for (i=0; i<len; i++) {
-               p[i] = 'A' + rand_int(26);
-       }
-       p[len] = '\0';
-       *out = p;
-}
-
-static void verify_ctdb_string(const char *p1, const char *p2)
-{
-       if (p1 == NULL || p2 == NULL) {
-               assert(p1 == p2);
-       } else {
-               assert(strlen(p1) == strlen(p2));
-               assert(strcmp(p1, p2) == 0);
-       }
-}
-
-static void fill_ctdb_tunable(TALLOC_CTX *mem_ctx, struct ctdb_tunable *p)
-{
-       fill_ctdb_string(mem_ctx, discard_const(&p->name));
-       p->value = rand32();
-}
-
-static void verify_ctdb_tunable(struct ctdb_tunable *p1,
-                               struct ctdb_tunable *p2)
-{
-       verify_ctdb_string(discard_const(p1->name), discard_const(p2->name));
-       assert(p1->value == p2->value);
-}
-
-static void fill_ctdb_node_flag_change(TALLOC_CTX *mem_ctx,
-                                      struct ctdb_node_flag_change *p)
-{
-       p->pnn = rand32();
-       p->new_flags = rand32();
-       p->old_flags = rand32();
-}
-
-static void verify_ctdb_node_flag_change(struct ctdb_node_flag_change *p1,
-                                        struct ctdb_node_flag_change *p2)
-{
-       assert(p1->pnn == p2->pnn);
-       assert(p1->new_flags == p2->new_flags);
-       assert(p1->old_flags == p2->old_flags);
-}
-
-static void fill_ctdb_var_list(TALLOC_CTX *mem_ctx,
-                              struct ctdb_var_list *p)
-{
-       int i;
-
-       p->count = rand_int(100) + 1;
-       p->var = talloc_array(mem_ctx, const char *, p->count);
-       for (i=0; i<p->count; i++) {
-               fill_ctdb_string(p->var, discard_const(&p->var[i]));
-       }
-}
-
-static void verify_ctdb_var_list(struct ctdb_var_list *p1,
-                                struct ctdb_var_list *p2)
-{
-       int i;
-
-       assert(p1->count == p2->count);
-       for (i=0; i<p1->count; i++) {
-               verify_ctdb_string(discard_const(p1->var[i]),
-                                  discard_const(p2->var[i]));
-       }
-}
-
-static void fill_ctdb_tunable_list(TALLOC_CTX *mem_ctx,
-                                  struct ctdb_tunable_list *p)
-{
-       fill_buffer(p, sizeof(struct ctdb_tunable_list));
-}
-
-static void verify_ctdb_tunable_list(struct ctdb_tunable_list *p1,
-                                    struct ctdb_tunable_list *p2)
-{
-       verify_buffer(p1, p2, sizeof(struct ctdb_tunable_list));
-}
-
-static void fill_ctdb_tickle_list(TALLOC_CTX *mem_ctx,
-                                 struct ctdb_tickle_list *p)
-{
-       int i;
-
-       fill_ctdb_sock_addr(mem_ctx, &p->addr);
-       p->num = rand_int(1000);
-       if (p->num > 0) {
-               p->conn = talloc_array(mem_ctx, struct ctdb_connection, p->num);
-               assert(p->conn != NULL);
-               for (i=0; i<p->num; i++) {
-                       fill_ctdb_connection(mem_ctx, &p->conn[i]);
-               }
-       } else {
-               p->conn = NULL;
-       }
-}
-
-static void verify_ctdb_tickle_list(struct ctdb_tickle_list *p1,
-                                   struct ctdb_tickle_list *p2)
-{
-       int i;
-
-       verify_ctdb_sock_addr(&p1->addr, &p2->addr);
-       assert(p1->num == p2->num);
-       for (i=0; i<p1->num; i++) {
-               verify_ctdb_connection(&p1->conn[i], &p2->conn[i]);
-       }
-}
-
-static void fill_ctdb_addr_info(TALLOC_CTX *mem_ctx, struct ctdb_addr_info *p)
-{
-       fill_ctdb_sock_addr(mem_ctx, &p->addr);
-       p->mask = rand_int(33);
-       if (rand_int(2) == 0) {
-               p->iface = NULL;
-       } else {
-               fill_ctdb_string(mem_ctx, &p->iface);
-       }
-}
-
-static void verify_ctdb_addr_info(struct ctdb_addr_info *p1,
-                                 struct ctdb_addr_info *p2)
-{
-       verify_ctdb_sock_addr(&p1->addr, &p2->addr);
-       assert(p1->mask == p2->mask);
-       verify_ctdb_string(p1->iface, p2->iface);
-}
-
-static void fill_ctdb_transdb(TALLOC_CTX *mem_ctx, struct ctdb_transdb *p)
-{
-       p->db_id = rand32();
-       p->tid = rand32();
-}
-
-static void verify_ctdb_transdb(struct ctdb_transdb *p1, struct ctdb_transdb *p2)
-{
-       assert(p1->db_id == p2->db_id);
-       assert(p1->tid == p2->tid);
-}
-
-static void fill_ctdb_uptime(TALLOC_CTX *mem_ctx, struct ctdb_uptime *p)
-{
-       fill_buffer(p, sizeof(struct ctdb_uptime));
-}
-
-static void verify_ctdb_uptime(struct ctdb_uptime *p1, struct ctdb_uptime *p2)
-{
-       verify_buffer(p1, p2, sizeof(struct ctdb_uptime));
-}
-
-static void fill_ctdb_public_ip(TALLOC_CTX *mem_ctx, struct ctdb_public_ip *p)
-{
-       p->pnn = rand32();
-       fill_ctdb_sock_addr(mem_ctx, &p->addr);
-}
-
-static void verify_ctdb_public_ip(struct ctdb_public_ip *p1,
-                                 struct ctdb_public_ip *p2)
-{
-       assert(p1->pnn == p2->pnn);
-       verify_ctdb_sock_addr(&p1->addr, &p2->addr);
-}
-
-static void fill_ctdb_public_ip_list(TALLOC_CTX *mem_ctx,
-                                    struct ctdb_public_ip_list *p)
-{
-       int i;
-
-       p->num = rand_int(32);
-       if (p->num > 0) {
-               p->ip = talloc_array(mem_ctx, struct ctdb_public_ip, p->num);
-               assert(p->ip != NULL);
-               for (i=0; i<p->num; i++) {
-                       fill_ctdb_public_ip(mem_ctx, &p->ip[i]);
-               }
-       } else {
-               p->ip = NULL;
-       }
-}
-
-static void verify_ctdb_public_ip_list(struct ctdb_public_ip_list *p1,
-                                      struct ctdb_public_ip_list *p2)
-{
-       int i;
-
-       assert(p1->num == p2->num);
-       for (i=0; i<p1->num; i++) {
-               verify_ctdb_public_ip(&p1->ip[i], &p2->ip[i]);
-       }
-}
-
-static void fill_ctdb_node_and_flags(TALLOC_CTX *mem_ctx,
-                                    struct ctdb_node_and_flags *p)
-{
-       p->pnn = rand32();
-       p->flags = rand32();
-       fill_ctdb_sock_addr(mem_ctx, &p->addr);
-}
-
-static void verify_ctdb_node_and_flags(struct ctdb_node_and_flags *p1,
-                                      struct ctdb_node_and_flags *p2)
-{
-       assert(p1->pnn == p2->pnn);
-       assert(p1->flags == p2->flags);
-       verify_ctdb_sock_addr(&p1->addr, &p2->addr);
-}
-
-static void fill_ctdb_node_map(TALLOC_CTX *mem_ctx, struct ctdb_node_map *p)
-{
-       int i;
-
-       p->num = rand_int(32);
-       if (p->num > 0) {
-               p->node = talloc_array(mem_ctx, struct ctdb_node_and_flags,
-                                      p->num);
-               assert(p->node != NULL);
-               for (i=0; i<p->num; i++) {
-                       fill_ctdb_node_and_flags(mem_ctx, &p->node[i]);
-               }
-       } else {
-               p->node = NULL;
-       }
-}
-
-static void verify_ctdb_node_map(struct ctdb_node_map *p1,
-                                struct ctdb_node_map *p2)
-{
-       int i;
-
-       assert(p1->num == p2->num);
-       for (i=0; i<p1->num; i++) {
-               verify_ctdb_node_and_flags(&p1->node[i], &p2->node[i]);
-       }
-}
-
-static void fill_ctdb_script(TALLOC_CTX *mem_ctx, struct ctdb_script *p)
-{
-       fill_buffer(p, sizeof(struct ctdb_script));
-}
-
-static void verify_ctdb_script(struct ctdb_script *p1, struct ctdb_script *p2)
-{
-       verify_buffer(p1, p2, sizeof(struct ctdb_script));
-}
-
-static void fill_ctdb_script_list(TALLOC_CTX *mem_ctx,
-                                 struct ctdb_script_list *p)
-{
-       int i;
-
-       p->num_scripts = rand_int(32);
-       if (p->num_scripts > 0) {
-               p->script = talloc_array(mem_ctx, struct ctdb_script,
-                                        p->num_scripts);
-               assert(p->script != NULL);
-               for (i=0; i<p->num_scripts; i++) {
-                       fill_ctdb_script(mem_ctx, &p->script[i]);
-               }
-       } else {
-               p->script = NULL;
-       }
-}
-
-static void verify_ctdb_script_list(struct ctdb_script_list *p1,
-                                   struct ctdb_script_list *p2)
-{
-       int i;
-
-       assert(p1->num_scripts == p2->num_scripts);
-       for (i=0; i<p1->num_scripts; i++) {
-               verify_ctdb_script(&p1->script[i], &p2->script[i]);
-       }
-}
-
-static void fill_ctdb_ban_state(TALLOC_CTX *mem_ctx, struct ctdb_ban_state *p)
-{
-       p->pnn = rand32();
-       p->time = rand32();
-}
-
-static void verify_ctdb_ban_state(struct ctdb_ban_state *p1,
-                                 struct ctdb_ban_state *p2)
-{
-       assert(p1->pnn == p2->pnn);
-       assert(p1->time == p2->time);
-}
-
-static void fill_ctdb_notify_data(TALLOC_CTX *mem_ctx,
-                                 struct ctdb_notify_data *p)
-{
-       p->srvid = rand64();
-       fill_tdb_data(mem_ctx, &p->data);
-}
-
-static void verify_ctdb_notify_data(struct ctdb_notify_data *p1,
-                                   struct ctdb_notify_data *p2)
-{
-       assert(p1->srvid == p2->srvid);
-       verify_tdb_data(&p1->data, &p2->data);
-}
-
-static void fill_ctdb_iface(TALLOC_CTX *mem_ctx, struct ctdb_iface *p)
-{
-       fill_buffer(p, sizeof(struct ctdb_iface));
-}
-
-static void verify_ctdb_iface(struct ctdb_iface *p1, struct ctdb_iface *p2)
-{
-       verify_buffer(p1, p2, sizeof(struct ctdb_iface));
-}
-
-static void fill_ctdb_iface_list(TALLOC_CTX *mem_ctx,
-                                struct ctdb_iface_list *p)
-{
-       int i;
-
-       p->num = rand_int(32);
-       if (p->num > 0) {
-               p->iface = talloc_array(mem_ctx, struct ctdb_iface, p->num);
-               assert(p->iface != NULL);
-               for (i=0; i<p->num; i++) {
-                       fill_ctdb_iface(mem_ctx, &p->iface[i]);
-               }
-       } else {
-               p->iface = NULL;
-       }
-}
-
-static void verify_ctdb_iface_list(struct ctdb_iface_list *p1,
-                                  struct ctdb_iface_list *p2)
-{
-       int i;
-
-       assert(p1->num == p2->num);
-       for (i=0; i<p1->num; i++) {
-               verify_ctdb_iface(&p1->iface[i], &p2->iface[i]);
-       }
-}
-
-static void fill_ctdb_public_ip_info(TALLOC_CTX *mem_ctx,
-                                    struct ctdb_public_ip_info *p)
-{
-       fill_ctdb_public_ip(mem_ctx, &p->ip);
-       p->active_idx = rand_int(32) + 1;
-       p->ifaces = talloc(mem_ctx, struct ctdb_iface_list);
-       assert(p->ifaces != NULL);
-       fill_ctdb_iface_list(mem_ctx, p->ifaces);
-}
-
-static void verify_ctdb_public_ip_info(struct ctdb_public_ip_info *p1,
-                                      struct ctdb_public_ip_info *p2)
-{
-       verify_ctdb_public_ip(&p1->ip, &p2->ip);
-       assert(p1->active_idx == p2->active_idx);
-       verify_ctdb_iface_list(p1->ifaces, p2->ifaces);
-}
-
-static void fill_ctdb_statistics_list(TALLOC_CTX *mem_ctx,
-                                     struct ctdb_statistics_list *p)
-{
-       int i;
-
-       p->num = rand_int(10);
-       if (p->num > 0) {
-               p->stats = talloc_array(mem_ctx, struct ctdb_statistics,
-                                       p->num);
-               assert(p->stats != NULL);
-
-               for (i=0; i<p->num; i++) {
-                       fill_ctdb_statistics(mem_ctx, &p->stats[i]);
-               }
-       } else {
-               p->stats = NULL;
-       }
-}
-
-static void verify_ctdb_statistics_list(struct ctdb_statistics_list *p1,
-                                       struct ctdb_statistics_list *p2)
-{
-       int i;
-
-       assert(p1->num == p2->num);
-       for (i=0; i<p1->num; i++) {
-               verify_ctdb_statistics(&p1->stats[i], &p2->stats[i]);
-       }
-}
-
-static void fill_ctdb_key_data(TALLOC_CTX *mem_ctx, struct ctdb_key_data *p)
-{
-       p->db_id = rand32();
-       fill_ctdb_ltdb_header(mem_ctx, &p->header);
-       fill_tdb_data_nonnull(mem_ctx, &p->key);
-}
-
-static void verify_ctdb_key_data(struct ctdb_key_data *p1,
-                                struct ctdb_key_data *p2)
-{
-       assert(p1->db_id == p2->db_id);
-       verify_ctdb_ltdb_header(&p1->header, &p2->header);
-       verify_tdb_data(&p1->key, &p2->key);
-}
-
-static void fill_ctdb_db_statistics(TALLOC_CTX *mem_ctx,
-                                   struct ctdb_db_statistics *p)
-{
-       int i;
-
-       fill_buffer(p, offsetof(struct ctdb_db_statistics, num_hot_keys));
-       p->num_hot_keys = 10;
-       for (i=0; i<p->num_hot_keys; i++) {
-               p->hot_keys[i].count = rand32();
-               fill_tdb_data(mem_ctx, &p->hot_keys[i].key);
-       }
-}
-
-static void verify_ctdb_db_statistics(struct ctdb_db_statistics *p1,
-                                     struct ctdb_db_statistics *p2)
-{
-       int i;
-
-       verify_buffer(p1, p2, offsetof(struct ctdb_db_statistics,
-                                           num_hot_keys));
-       assert(p1->num_hot_keys == p2->num_hot_keys);
-       for (i=0; i<p1->num_hot_keys; i++) {
-               assert(p1->hot_keys[i].count == p2->hot_keys[i].count);
-               verify_tdb_data(&p1->hot_keys[i].key, &p2->hot_keys[i].key);
-       }
-}
-
-static void fill_ctdb_event_request_run(TALLOC_CTX *mem_ctx,
-                                       struct ctdb_event_request_run *p)
-{
-       p->event = rand_int(CTDB_EVENT_MAX);
-       p->timeout = rand();
-       fill_ctdb_string(mem_ctx, &p->arg_str);
-}
-
-static void verify_ctdb_event_request_run(struct ctdb_event_request_run *p1,
-                                         struct ctdb_event_request_run *p2)
-{
-       assert(p1->event == p2->event);
-       assert(p1->timeout == p2->timeout);
-       verify_ctdb_string(p1->arg_str, p2->arg_str);
-}
-
-static void fill_ctdb_event_request_status(TALLOC_CTX *mem_ctx,
-                                          struct ctdb_event_request_status *p)
-{
-       p->event = rand_int(CTDB_EVENT_MAX);
-       p->state = rand_int(3) + 1;
-}
-
-static void verify_ctdb_event_request_status(
-                                       struct ctdb_event_request_status *p1,
-                                       struct ctdb_event_request_status *p2)
-{
-       assert(p1->event == p2->event);
-       assert(p1->state == p2->state);
-}
-
-static void fill_ctdb_event_request_script_enable(
-                               TALLOC_CTX *mem_ctx,
-                               struct ctdb_event_request_script_enable *p)
-{
-       fill_ctdb_string(mem_ctx, &p->script_name);
-}
-
-static void verify_ctdb_event_request_script_enable(
-                               struct ctdb_event_request_script_enable *p1,
-                               struct ctdb_event_request_script_enable *p2)
-{
-       verify_ctdb_string(p1->script_name, p2->script_name);
-}
-
-static void fill_ctdb_event_request_script_disable(
-                               TALLOC_CTX *mem_ctx,
-                               struct ctdb_event_request_script_disable *p)
-{
-       fill_ctdb_string(mem_ctx, &p->script_name);
-}
-
-static void verify_ctdb_event_request_script_disable(
-                               struct ctdb_event_request_script_disable *p1,
-                               struct ctdb_event_request_script_disable *p2)
-{
-       verify_ctdb_string(p1->script_name, p2->script_name);
-}
-
-static void fill_ctdb_event_reply_status(TALLOC_CTX *mem_ctx,
-                                        struct ctdb_event_reply_status *p)
-{
-       if (rand_int(2) == 0) {
-               p->status = 0;
-               p->script_list = talloc(mem_ctx, struct ctdb_script_list);
-               assert(p->script_list != NULL);
-               fill_ctdb_script_list(mem_ctx, p->script_list);
-       } else {
-               p->status = rand32i();
-               p->script_list = NULL;
-       }
-}
-
-static void verify_ctdb_event_reply_status(struct ctdb_event_reply_status *p1,
-                                          struct ctdb_event_reply_status *p2)
-{
-       assert(p1->status == p2->status);
-       if (p1->script_list == NULL) {
-               assert(p1->script_list == p2->script_list);
-       } else {
-               verify_ctdb_script_list(p1->script_list, p2->script_list);
-       }
-}
-
-static void fill_ctdb_event_reply_script_list(
-                               TALLOC_CTX *mem_ctx,
-                               struct ctdb_event_reply_script_list *p)
-{
-       p->script_list = talloc(mem_ctx, struct ctdb_script_list);
-       assert(p->script_list != NULL);
-
-       fill_ctdb_script_list(mem_ctx, p->script_list);
-}
-
-static void verify_ctdb_event_reply_script_list(
-                               struct ctdb_event_reply_script_list *p1,
-                               struct ctdb_event_reply_script_list *p2)
-{
-       verify_ctdb_script_list(p1->script_list, p2->script_list);
-}
-
-#ifndef PROTOCOL_TEST
-
-static void fill_ctdb_election_message(TALLOC_CTX *mem_ctx,
-                                      struct ctdb_election_message *p)
-{
-       p->num_connected = rand_int(32);
-       fill_buffer(&p->priority_time, sizeof(struct timeval));
-       p->pnn = rand_int(32);
-       p->node_flags = rand32();
-}
-
-static void verify_ctdb_election_message(struct ctdb_election_message *p1,
-                                        struct ctdb_election_message *p2)
-{
-       assert(p1->num_connected == p2->num_connected);
-       verify_buffer(p1, p2, sizeof(struct timeval));
-       assert(p1->pnn == p2->pnn);
-       assert(p1->node_flags == p2->node_flags);
-}
-
-static void fill_ctdb_srvid_message(TALLOC_CTX *mem_ctx,
-                                   struct ctdb_srvid_message *p)
-{
-       p->pnn = rand_int(32);
-       p->srvid = rand64();
-}
-
-static void verify_ctdb_srvid_message(struct ctdb_srvid_message *p1,
-                                     struct ctdb_srvid_message *p2)
-{
-       assert(p1->pnn == p2->pnn);
-       assert(p1->srvid == p2->srvid);
-}
-
-static void fill_ctdb_disable_message(TALLOC_CTX *mem_ctx,
-                                     struct ctdb_disable_message *p)
-{
-       p->pnn = rand_int(32);
-       p->srvid = rand64();
-       p->timeout = rand32();
-}
-
-static void verify_ctdb_disable_message(struct ctdb_disable_message *p1,
-                                       struct ctdb_disable_message *p2)
-{
-       assert(p1->pnn == p2->pnn);
-       assert(p1->srvid == p2->srvid);
-       assert(p1->timeout == p2->timeout);
-}
-
-static void fill_ctdb_server_id(TALLOC_CTX *mem_ctx,
-                               struct ctdb_server_id *p)
-{
-       p->pid = rand64();
-       p->task_id = rand32();
-       p->vnn = rand_int(32);
-       p->unique_id = rand64();
-}
-
-static void verify_ctdb_server_id(struct ctdb_server_id *p1,
-                                 struct ctdb_server_id *p2)
-{
-       assert(p1->pid == p2->pid);
-       assert(p1->task_id == p2->task_id);
-       assert(p1->vnn == p2->vnn);
-       assert(p1->unique_id == p2->unique_id);
-}
-
-static void fill_ctdb_g_lock(TALLOC_CTX *mem_ctx, struct ctdb_g_lock *p)
-{
-       p->type = rand_int(2);
-       fill_ctdb_server_id(mem_ctx, &p->sid);
-}
-
-static void verify_ctdb_g_lock(struct ctdb_g_lock *p1, struct ctdb_g_lock *p2)
-{
-       assert(p1->type == p2->type);
-       verify_ctdb_server_id(&p1->sid, &p2->sid);
-}
-
-static void fill_ctdb_g_lock_list(TALLOC_CTX *mem_ctx,
-                                 struct ctdb_g_lock_list *p)
-{
-       int i;
-
-       p->num = rand_int(20) + 1;
-       p->lock = talloc_array(mem_ctx, struct ctdb_g_lock, p->num);
-       assert(p->lock != NULL);
-       for (i=0; i<p->num; i++) {
-               fill_ctdb_g_lock(mem_ctx, &p->lock[i]);
-       }
-}
-
-static void verify_ctdb_g_lock_list(struct ctdb_g_lock_list *p1,
-                                   struct ctdb_g_lock_list *p2)
-{
-       int i;
-
-       assert(p1->num == p2->num);
-       for (i=0; i<p1->num; i++) {
-               verify_ctdb_g_lock(&p1->lock[i], &p2->lock[i]);
-       }
-}
-
-/*
- * Functions to test marshalling routines
- */
-
-static void test_ctdb_int32(void)
-{
-       int32_t p1, p2;
-       size_t buflen;
-       int ret;
-
-       p1 = rand32i();
-       buflen = ctdb_int32_len(p1);
-       ctdb_int32_push(p1, BUFFER);
-       ret = ctdb_int32_pull(BUFFER, buflen, NULL, &p2);
-       assert(ret == 0);
-       assert(p1 == p2);
-}
-
-static void test_ctdb_uint32(void)
-{
-       uint32_t p1, p2;
-       size_t buflen;
-       int ret;
-
-       p1 = rand32();
-       buflen = ctdb_uint32_len(p1);
-       ctdb_uint32_push(p1, BUFFER);
-       ret = ctdb_uint32_pull(BUFFER, buflen, NULL, &p2);
-       assert(ret == 0);
-       assert(p1 == p2);
-}
-
-static void test_ctdb_uint64(void)
-{
-       uint64_t p1, p2;
-       size_t buflen;
-       int ret;
-
-       p1 = rand64();
-       buflen = ctdb_uint64_len(p1);
-       ctdb_uint64_push(p1, BUFFER);
-       ret = ctdb_uint64_pull(BUFFER, buflen, NULL, &p2);
-       assert(ret == 0);
-       assert(p1 == p2);
-}
-
-static void test_ctdb_double(void)
-{
-       double p1, p2;
-       size_t buflen;
-       int ret;
-
-       p1 = rand_double();
-       buflen = ctdb_double_len(p1);
-       ctdb_double_push(p1, BUFFER);
-       ret = ctdb_double_pull(BUFFER, buflen, NULL, &p2);
-       assert(ret == 0);
-       assert(p1 == p2);
-}
-
-static void test_ctdb_pid(void)
-{
-       pid_t p1, p2;
-       size_t buflen;
-       int ret;
-
-       p1 = rand32();
-       buflen = ctdb_pid_len(p1);
-       ctdb_pid_push(p1, BUFFER);
-       ret = ctdb_pid_pull(BUFFER, buflen, NULL, &p2);
-       assert(ret == 0);
-       assert(p1 == p2);
-}
-
-#define TEST_FUNC(NAME)                test_ ##NAME
-#define FILL_FUNC(NAME)                fill_ ##NAME
-#define VERIFY_FUNC(NAME)      verify_ ##NAME
-#define LEN_FUNC(NAME)         NAME## _len
-#define PUSH_FUNC(NAME)                NAME## _push
-#define PULL_FUNC(NAME)                NAME## _pull
-
-#define DEFINE_TEST(TYPE, NAME)        \
-static void TEST_FUNC(NAME)(void) \
-{ \
-       TALLOC_CTX *mem_ctx = talloc_new(NULL); \
-       TYPE *p1, *p2; \
-       size_t buflen; \
-       int ret; \
-\
-       p1 = talloc_zero(mem_ctx, TYPE); \
-       assert(p1 != NULL); \
-       FILL_FUNC(NAME)(p1, p1); \
-       buflen = LEN_FUNC(NAME)(p1); \
-       PUSH_FUNC(NAME)(p1, BUFFER); \
-       ret = PULL_FUNC(NAME)(BUFFER, buflen, mem_ctx, &p2); \
-       assert(ret == 0); \
-       VERIFY_FUNC(NAME)(p1, p2); \
-       talloc_free(mem_ctx); \
-}
-
-
-static void test_ctdb_string(void)
-{
-       TALLOC_CTX *mem_ctx = talloc_new(NULL);
-       const char *p1, *p2;
-       size_t buflen;
-       int ret;
-
-       fill_ctdb_string(mem_ctx, &p1);
-       buflen = ctdb_string_len(p1);
-       ctdb_string_push(p1, BUFFER);
-       ret = ctdb_string_pull(BUFFER, buflen, mem_ctx, &p2);
-       assert(ret == 0);
-       verify_ctdb_string(p1, p2);
-       talloc_free(mem_ctx);
-}
-
-static void test_ctdb_stringn(void)
-{
-       TALLOC_CTX *mem_ctx = talloc_new(NULL);
-       const char *p1, *p2;
-       size_t buflen;
-       int ret;
-
-       fill_ctdb_string(mem_ctx, &p1);
-       buflen = ctdb_stringn_len(p1);
-       ctdb_stringn_push(p1, BUFFER);
-       ret = ctdb_stringn_pull(BUFFER, buflen, mem_ctx, &p2);
-       assert(ret == 0);
-       verify_ctdb_string(p1, p2);
-       talloc_free(mem_ctx);
-}
+#include "tests/src/protocol_common.h"
 
 static void test_ctdb_ltdb_header(void)
 {
@@ -1268,15 +99,6 @@ DEFINE_TEST(struct ctdb_srvid_message, ctdb_srvid_message);
 DEFINE_TEST(struct ctdb_disable_message, ctdb_disable_message);
 DEFINE_TEST(struct ctdb_g_lock_list, ctdb_g_lock_list);
 
-DEFINE_TEST(struct ctdb_event_request_run, ctdb_event_request_run);
-DEFINE_TEST(struct ctdb_event_request_status, ctdb_event_request_status);
-DEFINE_TEST(struct ctdb_event_request_script_enable,
-                               ctdb_event_request_script_enable);
-DEFINE_TEST(struct ctdb_event_request_script_disable,
-                               ctdb_event_request_script_disable);
-DEFINE_TEST(struct ctdb_event_reply_status, ctdb_event_reply_status);
-DEFINE_TEST(struct ctdb_event_reply_script_list, ctdb_event_reply_script_list);
-
 static void test_ctdb_rec_buffer_read_write(void)
 {
        TALLOC_CTX *mem_ctx = talloc_new(NULL);
@@ -1330,15 +152,6 @@ int main(int argc, char *argv[])
                srandom(seed);
        }
 
-       test_ctdb_int32();
-       test_ctdb_uint32();
-       test_ctdb_uint64();
-       test_ctdb_double();
-       test_ctdb_pid();
-
-       test_ctdb_string();
-       test_ctdb_stringn();
-
        test_ctdb_ltdb_header();
        test_ctdb_g_lock();
 
@@ -1382,16 +195,7 @@ int main(int argc, char *argv[])
        TEST_FUNC(ctdb_disable_message)();
        TEST_FUNC(ctdb_g_lock_list)();
 
-       TEST_FUNC(ctdb_event_request_run)();
-       TEST_FUNC(ctdb_event_request_status)();
-       TEST_FUNC(ctdb_event_request_script_enable)();
-       TEST_FUNC(ctdb_event_request_script_disable)();
-       TEST_FUNC(ctdb_event_reply_status)();
-       TEST_FUNC(ctdb_event_reply_script_list)();
-
        test_ctdb_rec_buffer_read_write();
 
        return 0;
 }
-
-#endif
index 752c437b5734e373f5c38ed45e1bd465476aa7a6..1fcaa62d38937c269664262c23dc47a3a93fafc2 100644 (file)
 
 #include <assert.h>
 
-#include <talloc.h>
+#include "protocol/protocol_basic.c"
+#include "protocol/protocol_types.c"
+#include "protocol/protocol_util.c"
 
-#include "protocol/protocol.h"
-#include "protocol/protocol_api.h"
 #include "common/system_util.c"
 
 /* Test parsing of IPs, conversion to string */
index abf9ba65b75779836901bb697b590cea055b4586..c23e840f4e7b7a20463243cb444d2eac2c9fb3b3 100644 (file)
@@ -728,8 +728,6 @@ def build(bld):
         'comm_test',
         'comm_server_test',
         'comm_client_test',
-        'protocol_types_test',
-        'protocol_client_test',
         'pidfile_test',
         'run_proc_test',
         'sock_daemon_test',
@@ -767,6 +765,31 @@ def build(bld):
                      deps='samba-util ctdb-system popt',
                      install_path='${CTDB_TEST_LIBEXECDIR}')
 
+    bld.SAMBA_SUBSYSTEM('protocol-tests-common',
+                        source=bld.SUBDIR('tests/src',
+                                          '''protocol_common.c
+                                             protocol_common_ctdb.c
+                                             protocol_common_event.c
+                                          '''),
+                        includes='include',
+                        deps='replace popt talloc tevent tdb')
+
+    ctdb_protocol_tests = [
+            'protocol_basic_test',
+            'protocol_types_test',
+            'protocol_ctdb_test',
+            'protocol_event_test',
+            'protocol_util_test',
+    ]
+
+    for target in ctdb_protocol_tests:
+        src = 'tests/src/' + target + '.c'
+
+        bld.SAMBA_BINARY(target,
+                         source=src,
+                         deps='''protocol-tests-common
+                                 samba-util talloc tdb''',
+                         install_path='${CTDB_TEST_LIBEXECDIR}')
 
     bld.SAMBA_SUBSYSTEM('ctdb-tests-common',
                         source=bld.SUBDIR('tests/src',
@@ -774,11 +797,6 @@ def build(bld):
                         includes='include',
                         deps='replace popt talloc tevent tdb')
 
-    bld.SAMBA_BINARY('protocol_util_test',
-                     source='tests/src/protocol_util_test.c',
-                     deps='talloc ctdb-protocol samba-util',
-                     install_path='${CTDB_TEST_LIBEXECDIR}')
-
     # Test binaries
     ctdb_tests = [
         'g_lock_loop',