s4:NBT-WINSREPLICATION: test replication with names including scopes
[ira/wip.git] / source4 / torture / nbt / winsreplication.c
index 6b600bd7cd48ef847dcc3e7eacb77a6fdd1bbf71..f363c9ee5c23e02d26c3460df5c28aff64e6b503 100644 (file)
@@ -24,7 +24,6 @@
 #include "libcli/wrepl/winsrepl.h"
 #include "lib/events/events.h"
 #include "lib/socket/socket.h"
-#include "libcli/resolve/resolve.h"
 #include "system/network.h"
 #include "lib/socket/netif.h"
 #include "librpc/gen_ndr/ndr_nbt.h"
@@ -107,10 +106,10 @@ static bool test_assoc_ctx1(struct torture_context *tctx)
        wrepl_socket2 = wrepl_socket_init(tctx, tctx->ev, lp_iconv_convenience(tctx->lp_ctx));
 
        torture_comment(tctx, "Setup 2 wrepl connections\n");
-       status = wrepl_connect(wrepl_socket1, lp_resolve_context(tctx->lp_ctx), wrepl_best_ip(tctx->lp_ctx, address), address);
+       status = wrepl_connect(wrepl_socket1, wrepl_best_ip(tctx->lp_ctx, address), address);
        CHECK_STATUS(tctx, status, NT_STATUS_OK);
 
-       status = wrepl_connect(wrepl_socket2, lp_resolve_context(tctx->lp_ctx), wrepl_best_ip(tctx->lp_ctx, address), address);
+       status = wrepl_connect(wrepl_socket2, wrepl_best_ip(tctx->lp_ctx, address), address);
        CHECK_STATUS(tctx, status, NT_STATUS_OK);
 
        torture_comment(tctx, "Send a start association request (conn1)\n");
@@ -189,7 +188,7 @@ static bool test_assoc_ctx2(struct torture_context *tctx)
        wrepl_socket = wrepl_socket_init(tctx, tctx->ev, lp_iconv_convenience(tctx->lp_ctx));
        
        torture_comment(tctx, "Setup wrepl connections\n");
-       status = wrepl_connect(wrepl_socket, lp_resolve_context(tctx->lp_ctx), wrepl_best_ip(tctx->lp_ctx, address), address);
+       status = wrepl_connect(wrepl_socket, wrepl_best_ip(tctx->lp_ctx, address), address);
        CHECK_STATUS(tctx, status, NT_STATUS_OK);
 
        torture_comment(tctx, "Send 1st start association request\n");
@@ -258,7 +257,7 @@ static bool test_wins_replication(struct torture_context *tctx)
        wrepl_socket = wrepl_socket_init(tctx, tctx->ev, lp_iconv_convenience(tctx->lp_ctx));
        
        torture_comment(tctx, "Setup wrepl connections\n");
-       status = wrepl_connect(wrepl_socket, lp_resolve_context(tctx->lp_ctx), wrepl_best_ip(tctx->lp_ctx, address), address);
+       status = wrepl_connect(wrepl_socket, wrepl_best_ip(tctx->lp_ctx, address), address);
        CHECK_STATUS(tctx, status, NT_STATUS_OK);
 
        torture_comment(tctx, "Send a start association request\n");
@@ -557,7 +556,7 @@ static struct test_wrepl_conflict_conn *test_create_conflict_ctx(
        if (!ctx->pull) return NULL;
 
        torture_comment(tctx, "Setup wrepl conflict pull connection\n");
-       status = wrepl_connect(ctx->pull, lp_resolve_context(tctx->lp_ctx), wrepl_best_ip(tctx->lp_ctx, ctx->address), ctx->address);
+       status = wrepl_connect(ctx->pull, wrepl_best_ip(tctx->lp_ctx, ctx->address), ctx->address);
        if (!NT_STATUS_IS_OK(status)) return NULL;
 
        status = wrepl_associate(ctx->pull, &associate);
@@ -724,7 +723,7 @@ static bool test_wrepl_update_one(struct torture_context *tctx,
 
        wrepl_socket = wrepl_socket_init(ctx, tctx->ev, lp_iconv_convenience(tctx->lp_ctx));
 
-       status = wrepl_connect(wrepl_socket, lp_resolve_context(tctx->lp_ctx), wrepl_best_ip(tctx->lp_ctx, ctx->address), ctx->address);
+       status = wrepl_connect(wrepl_socket, wrepl_best_ip(tctx->lp_ctx, ctx->address), ctx->address);
        CHECK_STATUS(tctx, status, NT_STATUS_OK);
 
        status = wrepl_associate(wrepl_socket, &associate);
@@ -800,9 +799,16 @@ static bool test_wrepl_is_applied(struct torture_context *tctx,
                                                  names[0].state,
                                                  names[0].node,
                                                  names[0].is_static);
+               char *expected_scope = NULL;
                CHECK_VALUE(tctx, names[0].name.type, name->name->type);
                CHECK_VALUE_STRING(tctx, names[0].name.name, name->name->name);
-               CHECK_VALUE_STRING(tctx, names[0].name.scope, name->name->scope);
+
+               if (names[0].name.scope) {
+                       expected_scope = talloc_strndup(tctx,
+                                                       name->name->scope,
+                                                       237);
+               }
+               CHECK_VALUE_STRING(tctx, names[0].name.scope, expected_scope);
                CHECK_VALUE(tctx, flags, name->flags);
                CHECK_VALUE_UINT64(tctx, names[0].version_id, name->id);
 
@@ -1005,18 +1011,63 @@ static bool test_wrepl_sgroup_merged(struct torture_context *tctx,
        return true;
 }
 
+static char *test_nbt_winsrepl_scope_string(TALLOC_CTX *mem_ctx, uint8_t count)
+{
+       char *res;
+       uint8_t i;
+
+       res = talloc_array(mem_ctx, char, count+1);
+       if (res == NULL) {
+               return NULL;
+       }
+
+       for (i=0; i < count; i++) {
+               res[i] = '0' + (i%10);
+       }
+
+       res[count] = '\0';
+
+       talloc_set_name_const(res, res);
+
+       return res;
+}
+
 static bool test_conflict_same_owner(struct torture_context *tctx, 
                                                                         struct test_wrepl_conflict_conn *ctx)
 {
        static bool ret = true;
-       struct nbt_name name;
        struct wrepl_wins_name wins_name1;
        struct wrepl_wins_name wins_name2;
        struct wrepl_wins_name *wins_name_tmp;
        struct wrepl_wins_name *wins_name_last;
        struct wrepl_wins_name *wins_name_cur;
        uint32_t i,j;
-       uint8_t types[] = { 0x00, 0x1C };
+       struct nbt_name names[] = {
+               _NBT_NAME("_SAME_OWNER_A", 0x00, NULL),
+               _NBT_NAME("_SAME_OWNER_A", 0x00,
+                         test_nbt_winsrepl_scope_string(tctx, 1)),
+               _NBT_NAME("_SAME_OWNER_A", 0x00,
+                         test_nbt_winsrepl_scope_string(tctx, 2)),
+               _NBT_NAME("_SAME_OWNER_A", 0x00,
+                         test_nbt_winsrepl_scope_string(tctx, 3)),
+               _NBT_NAME("_SAME_OWNER_A", 0x00,
+                         test_nbt_winsrepl_scope_string(tctx, 4)),
+               _NBT_NAME("_SAME_OWNER_A", 0x00,
+                         test_nbt_winsrepl_scope_string(tctx, 5)),
+               _NBT_NAME("_SAME_OWNER_A", 0x00,
+                         test_nbt_winsrepl_scope_string(tctx, 6)),
+               _NBT_NAME("_SAME_OWNER_A", 0x00,
+                         test_nbt_winsrepl_scope_string(tctx, 7)),
+               _NBT_NAME("_SAME_OWNER_A", 0x00,
+                         test_nbt_winsrepl_scope_string(tctx, 8)),
+               _NBT_NAME("_SAME_OWNER_A", 0x00,
+                         test_nbt_winsrepl_scope_string(tctx, 9)),
+               _NBT_NAME("_SAME_OWNER_A", 0x00,
+                         test_nbt_winsrepl_scope_string(tctx, 237)),
+               _NBT_NAME("_SAME_OWNER_A", 0x00,
+                         test_nbt_winsrepl_scope_string(tctx, 238)),
+               _NBT_NAME("_SAME_OWNER_A", 0x1C, NULL),
+       };
        struct {
                enum wrepl_name_type type;
                enum wrepl_name_state state;
@@ -1113,18 +1164,13 @@ static bool test_conflict_same_owner(struct torture_context *tctx,
                }
        };
 
-       name.name       = "_SAME_OWNER_A";
-       name.type       = 0;
-       name.scope      = NULL;
-
        wins_name_tmp   = NULL;
        wins_name_last  = &wins_name2;
        wins_name_cur   = &wins_name1;
 
-       for (j=0; ret && j < ARRAY_SIZE(types); j++) {
-               name.type = types[j];
+       for (j=0; ret && j < ARRAY_SIZE(names); j++) {
                torture_comment(tctx, "Test Replica Conflicts with same owner[%s] for %s\n",
-                       nbt_name_string(ctx, &name), ctx->a.address);
+                       nbt_name_string(ctx, &names[j]), ctx->a.address);
 
                for(i=0; ret && i < ARRAY_SIZE(records); i++) {
                        wins_name_tmp   = wins_name_last;
@@ -1143,7 +1189,7 @@ static bool test_conflict_same_owner(struct torture_context *tctx,
                                        "REPLACE");
                        }
 
-                       wins_name_cur->name     = &name;
+                       wins_name_cur->name     = &names[j];
                        wins_name_cur->flags    = WREPL_NAME_FLAGS(records[i].type,
                                                                   records[i].state,
                                                                   records[i].node,
@@ -1151,7 +1197,8 @@ static bool test_conflict_same_owner(struct torture_context *tctx,
                        wins_name_cur->id       = ++ctx->a.max_version;
                        if (wins_name_cur->flags & 2) {
                                wins_name_cur->addresses.addresses.num_ips = records[i].num_ips;
-                               wins_name_cur->addresses.addresses.ips     = discard_const(records[i].ips);
+                               wins_name_cur->addresses.addresses.ips     = discard_const_p(struct wrepl_ip,
+                                                                            records[i].ips);
                        } else {
                                wins_name_cur->addresses.ip = records[i].ips[0].ip;
                        }
@@ -4834,7 +4881,8 @@ static bool test_conflict_different_owner(struct torture_context *tctx,
                wins_name_r1->id        = ++records[i].r1.owner->max_version;
                if (wins_name_r1->flags & 2) {
                        wins_name_r1->addresses.addresses.num_ips = records[i].r1.num_ips;
-                       wins_name_r1->addresses.addresses.ips     = discard_const(records[i].r1.ips);
+                       wins_name_r1->addresses.addresses.ips     = discard_const_p(struct wrepl_ip,
+                                                                   records[i].r1.ips);
                } else {
                        wins_name_r1->addresses.ip = records[i].r1.ips[0].ip;
                }
@@ -4856,7 +4904,8 @@ static bool test_conflict_different_owner(struct torture_context *tctx,
                wins_name_r2->id        = ++records[i].r2.owner->max_version;
                if (wins_name_r2->flags & 2) {
                        wins_name_r2->addresses.addresses.num_ips = records[i].r2.num_ips;
-                       wins_name_r2->addresses.addresses.ips     = discard_const(records[i].r2.ips);
+                       wins_name_r2->addresses.addresses.ips     = discard_const_p(struct wrepl_ip,
+                                                                   records[i].r2.ips);
                } else {
                        wins_name_r2->addresses.ip = records[i].r2.ips[0].ip;
                }
@@ -4933,7 +4982,8 @@ static bool test_conflict_different_owner(struct torture_context *tctx,
                                                                   WREPL_NODE_B, false);
                        wins_name_r2->id        = ++records[i].r2.owner->max_version;
                        wins_name_r2->addresses.addresses.num_ips = ARRAY_SIZE(addresses_B_1);
-                       wins_name_r2->addresses.addresses.ips     = discard_const(addresses_B_1);
+                       wins_name_r2->addresses.addresses.ips     = discard_const_p(struct wrepl_ip,
+                                                                   addresses_B_1);
                        wins_name_r2->unknown   = "255.255.255.255";
                        ret &= test_wrepl_update_one(tctx, ctx, records[i].r2.owner, wins_name_r2);
                        ret &= test_wrepl_is_applied(tctx, ctx, records[i].r2.owner, wins_name_r2, true);
@@ -4945,7 +4995,8 @@ static bool test_conflict_different_owner(struct torture_context *tctx,
                                                                   WREPL_NODE_B, false);
                        wins_name_r2->id        = ++records[i].r2.owner->max_version;
                        wins_name_r2->addresses.addresses.num_ips = ARRAY_SIZE(addresses_B_1);
-                       wins_name_r2->addresses.addresses.ips     = discard_const(addresses_B_1);
+                       wins_name_r2->addresses.addresses.ips     = discard_const_p(struct wrepl_ip,
+                                                                   addresses_B_1);
                        wins_name_r2->unknown   = "255.255.255.255";
                        ret &= test_wrepl_update_one(tctx, ctx, records[i].r2.owner, wins_name_r2);
                        ret &= test_wrepl_is_applied(tctx, ctx, records[i].r2.owner, wins_name_r2, true);
@@ -6593,7 +6644,8 @@ static bool test_conflict_owned_released_vs_replica(struct torture_context *tctx
                wins_name->id           = ++ctx->b.max_version;
                if (wins_name->flags & 2) {
                        wins_name->addresses.addresses.num_ips = records[i].replica.num_ips;
-                       wins_name->addresses.addresses.ips     = discard_const(records[i].replica.ips);
+                       wins_name->addresses.addresses.ips     = discard_const_p(struct wrepl_ip,
+                                                                records[i].replica.ips);
                } else {
                        wins_name->addresses.ip = records[i].replica.ips[0].ip;
                }
@@ -9290,7 +9342,8 @@ static bool test_conflict_owned_active_vs_replica(struct torture_context *tctx,
                wins_name->id           = ++ctx->b.max_version;
                if (wins_name->flags & 2) {
                        wins_name->addresses.addresses.num_ips = records[i].replica.num_ips;
-                       wins_name->addresses.addresses.ips     = discard_const(records[i].replica.ips);
+                       wins_name->addresses.addresses.ips     = discard_const_p(struct wrepl_ip,
+                                                                records[i].replica.ips);
                } else {
                        wins_name->addresses.ip = records[i].replica.ips[0].ip;
                }
@@ -9405,7 +9458,8 @@ static bool test_conflict_owned_active_vs_replica(struct torture_context *tctx,
                                                                           WREPL_NODE_B, false);
                                wins_name->id           = ++ctx->b.max_version;
                                wins_name->addresses.addresses.num_ips = ARRAY_SIZE(addresses_B_1);
-                               wins_name->addresses.addresses.ips     = discard_const(addresses_B_1);
+                               wins_name->addresses.addresses.ips     = discard_const_p(struct wrepl_ip,
+                                                                        addresses_B_1);
                                wins_name->unknown      = "255.255.255.255";
                                ret &= test_wrepl_update_one(tctx, ctx, &ctx->b, wins_name);
                                ret &= test_wrepl_is_applied(tctx, ctx, &ctx->b, wins_name, true);
@@ -9457,7 +9511,7 @@ static void test_conflict_owned_active_vs_replica_handler_query(struct nbt_name_
        struct nbt_name *name;
        struct nbt_name_packet *rep_packet;
        struct test_conflict_owned_active_vs_replica_struct *rec = 
-               (struct test_conflict_owned_active_vs_replica_struct *)nbtsock->incoming.private;
+               (struct test_conflict_owned_active_vs_replica_struct *)nbtsock->incoming.private_data;
 
        _NBT_ASSERT(req_packet->qdcount, 1);
        _NBT_ASSERT(req_packet->questions[0].question_type, NBT_QTYPE_NETBIOS);
@@ -9556,7 +9610,7 @@ static void test_conflict_owned_active_vs_replica_handler_release(
        struct nbt_name *name;
        struct nbt_name_packet *rep_packet;
        struct test_conflict_owned_active_vs_replica_struct *rec = 
-               (struct test_conflict_owned_active_vs_replica_struct *)nbtsock->incoming.private;
+               (struct test_conflict_owned_active_vs_replica_struct *)nbtsock->incoming.private_data;
 
        _NBT_ASSERT(req_packet->qdcount, 1);
        _NBT_ASSERT(req_packet->questions[0].question_type, NBT_QTYPE_NETBIOS);
@@ -9610,7 +9664,7 @@ static void test_conflict_owned_active_vs_replica_handler(struct nbt_name_socket
                                                          struct socket_address *src)
 {
        struct test_conflict_owned_active_vs_replica_struct *rec = 
-               (struct test_conflict_owned_active_vs_replica_struct *)nbtsock->incoming.private;
+               (struct test_conflict_owned_active_vs_replica_struct *)nbtsock->incoming.private_data;
 
        rec->defend.ret = false;