summaryrefslogtreecommitdiff
path: root/source4
diff options
context:
space:
mode:
Diffstat (limited to 'source4')
-rw-r--r--source4/torture/nbt/winsreplication.c147
1 files changed, 143 insertions, 4 deletions
diff --git a/source4/torture/nbt/winsreplication.c b/source4/torture/nbt/winsreplication.c
index c771fc52ee..012c07c748 100644
--- a/source4/torture/nbt/winsreplication.c
+++ b/source4/torture/nbt/winsreplication.c
@@ -325,7 +325,7 @@ struct test_wrepl_conflict_conn {
#define TEST_OWNER_B_ADDRESS "127.66.66.1"
#define TEST_ADDRESS_B_PREFIX "127.0.66"
- struct wrepl_wins_owner a, b;
+ struct wrepl_wins_owner a, b, c;
};
static const struct wrepl_ip addresses_A_1[] = {
@@ -409,6 +409,11 @@ static struct test_wrepl_conflict_conn *test_create_conflict_ctx(TALLOC_CTX *mem
ctx->b.min_version = 0;
ctx->b.type = 1;
+ ctx->c.address = address;
+ ctx->c.max_version = 0;
+ ctx->c.min_version = 0;
+ ctx->c.type = 1;
+
pull_table.in.assoc_ctx = ctx->pull_assoc;
status = wrepl_pull_table(ctx->pull, ctx->pull, &pull_table);
if (!NT_STATUS_IS_OK(status)) return NULL;
@@ -420,7 +425,11 @@ static struct test_wrepl_conflict_conn *test_create_conflict_ctx(TALLOC_CTX *mem
}
if (strcmp(TEST_OWNER_B_ADDRESS,pull_table.out.partners[i].address)==0) {
ctx->b.max_version = pull_table.out.partners[i].max_version;
- ctx->b.min_version = pull_table.out.partners[i].min_version;
+ ctx->b.min_version = pull_table.out.partners[i].min_version;
+ }
+ if (strcmp(address,pull_table.out.partners[i].address)==0) {
+ ctx->c.max_version = pull_table.out.partners[i].max_version;
+ ctx->c.min_version = pull_table.out.partners[i].min_version;
}
}
@@ -544,6 +553,46 @@ done:
return ret;
}
+static BOOL test_wrepl_is_merged(struct test_wrepl_conflict_conn *ctx,
+ const struct wrepl_wins_name *name1,
+ const struct wrepl_wins_name *name2)
+{
+ return True;
+#if 0
+ BOOL ret = True;
+ NTSTATUS status;
+ struct wrepl_pull_names pull_names;
+ struct wrepl_name *names;
+ uint32_t num_ips;
+
+ pull_names.in.assoc_ctx = ctx->pull_assoc;
+ pull_names.in.partner = ctx->c;
+ pull_names.in.partner.min_version = ctx->c.max_version-1;
+
+ status = wrepl_pull_names(ctx->pull, ctx->pull, &pull_names);
+ CHECK_STATUS(status, NT_STATUS_OK);
+ CHECK_VALUE(pull_names.out.num_names, 1);
+
+ names = pull_names.out.names;
+
+ num_ips = name1->addresses.addresses.num_ips + name2->addresses.addresses.num_ips;
+
+ CHECK_VALUE(names[0].name.type, name1->name->type);
+ CHECK_VALUE_STRING(names[0].name.name, name1->name->name);
+ CHECK_VALUE_STRING(names[0].name.scope, name1->name->scope);
+ CHECK_VALUE(names[0].type, WREPL_TYPE_SGROUP);
+ CHECK_VALUE(names[0].state, (num_ips>0?WREPL_STATE_ACTIVE:WREPL_STATE_RELEASED));
+ CHECK_VALUE_UINT64(names[0].version_id, ctx->c.max_version);
+
+ CHECK_VALUE(names[0].num_addresses,
+ name1->addresses.addresses.num_ips+
+ name2->addresses.addresses.num_ips);
+done:
+ talloc_free(pull_names.out.names);
+ return ret;
+#endif
+}
+
static BOOL test_conflict_same_owner(struct test_wrepl_conflict_conn *ctx)
{
BOOL ret = True;
@@ -725,6 +774,7 @@ static BOOL test_conflict_different_owner(struct test_wrepl_conflict_conn *ctx)
uint32_t num_ips;
const struct wrepl_ip *ips;
BOOL apply_expected;
+ BOOL merge_expected;
} r1, r2;
} records[] = {
/*
@@ -2755,6 +2805,91 @@ static BOOL test_conflict_different_owner(struct test_wrepl_conflict_conn *ctx)
}
},
+/*
+ * special group vs special group section,
+ */
+ /*
+ * sgroup,active vs. sgroup,active
+ * => should be merged
+ */
+ {
+ .line = __location__,
+ .name = _NBT_NAME("_DIFF_OWNER_SG", 0x00, NULL),
+ .extra = True,
+ .r1 = {
+ .owner = &ctx->a,
+ .type = WREPL_TYPE_SGROUP,
+ .state = WREPL_STATE_ACTIVE,
+ .node = WREPL_NODE_B,
+ .is_static = False,
+ .num_ips = ARRAY_SIZE(addresses_A_3_4),
+ .ips = addresses_A_3_4,
+ .apply_expected = True,
+ },
+ .r2 = {
+ .owner = &ctx->b,
+ .type = WREPL_TYPE_SGROUP,
+ .state = WREPL_STATE_ACTIVE,
+ .node = WREPL_NODE_B,
+ .is_static = False,
+ .num_ips = ARRAY_SIZE(addresses_B_3_4),
+ .ips = addresses_B_3_4,
+ .apply_expected = False,
+ .merge_expected = True
+ }
+ },
+ {
+ .line = __location__,
+ .name = _NBT_NAME("_DIFF_OWNER_SG", 0x00, NULL),
+ .cleanup= True,
+ .r1 = {
+ .owner = &ctx->a,
+ .type = WREPL_TYPE_SGROUP,
+ .state = WREPL_STATE_ACTIVE,
+ .node = WREPL_NODE_B,
+ .is_static = False,
+ .num_ips = 0,
+ .ips = NULL,
+ .apply_expected = False
+ },
+ .r2 = {
+ .owner = &ctx->b,
+ .type = WREPL_TYPE_SGROUP,
+ .state = WREPL_STATE_ACTIVE,
+ .node = WREPL_NODE_B,
+ .is_static = False,
+ .num_ips = 0,
+ .ips = NULL,
+ .apply_expected = False,
+ .merge_expected = False
+ }
+ },
+ {
+ .line = __location__,
+ .name = _NBT_NAME("_DIFF_OWNER_SG", 0x00, NULL),
+ .cleanup= True,
+ .r1 = {
+ .owner = &ctx->a,
+ .type = WREPL_TYPE_SGROUP,
+ .state = WREPL_STATE_ACTIVE,
+ .node = WREPL_NODE_B,
+ .is_static = False,
+ .num_ips = ARRAY_SIZE(addresses_A_1),
+ .ips = addresses_A_1,
+ .apply_expected = True
+ },
+ .r2 = {
+ .owner = &ctx->a,
+ .type = WREPL_TYPE_UNIQUE,
+ .state = WREPL_STATE_TOMBSTONE,
+ .node = WREPL_NODE_B,
+ .is_static = False,
+ .num_ips = ARRAY_SIZE(addresses_A_1),
+ .ips = addresses_A_1,
+ .apply_expected = True
+ }
+ },
+
/*
* This should be the last record in this array,
* we need to make sure the we leave a tombstoned unique entry
@@ -2864,14 +2999,18 @@ static BOOL test_conflict_different_owner(struct test_wrepl_conflict_conn *ctx)
if (records[i].r1.state == WREPL_STATE_RELEASED) {
ret &= test_wrepl_is_applied(ctx, records[i].r1.owner,
wins_name_r1, False);
+ } else if (records[i].r2.merge_expected) {
+ ret &= test_wrepl_is_merged(ctx, wins_name_r1, wins_name_r2);
} else if (records[i].r1.owner != records[i].r2.owner) {
+ BOOL _expected;
+ _expected = (records[i].r1.apply_expected && !records[i].r2.apply_expected);
ret &= test_wrepl_is_applied(ctx, records[i].r1.owner,
- wins_name_r1, !records[i].r2.apply_expected);
+ wins_name_r1, _expected);
}
if (records[i].r2.state == WREPL_STATE_RELEASED) {
ret &= test_wrepl_is_applied(ctx, records[i].r2.owner,
wins_name_r2, False);
- } else {
+ } else if (!records[i].r2.merge_expected) {
ret &= test_wrepl_is_applied(ctx, records[i].r2.owner,
wins_name_r2, records[i].r2.apply_expected);
}