2 Unix SMB/CIFS implementation.
4 DRSUAPI prefixMap unit tests
6 Copyright (C) Kamen Mazdrashki <kamen.mazdrashki@postpath.com> 2009
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 3 of the License, or
11 (at your option) any later version.
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with this program. If not, see <http://www.gnu.org/licenses/>.
23 #include "system/filesys.h"
24 #include "torture/smbtorture.h"
25 #include "dsdb/samdb/samdb.h"
26 #include "torture/rpc/drsuapi.h"
27 #include "param/param.h"
31 * Default schema_info string to be used for testing
33 #define SCHEMA_INFO_DEFAULT "FF0000000000000000000000000000000123456789"
36 * Private data to be shared among all test in Test case
38 struct drsut_prefixmap_data {
39 struct dsdb_schema_prefixmap *pfm_new;
40 struct dsdb_schema_prefixmap *pfm_full;
42 struct ldb_context *ldb_ctx;
46 * Test-oid data structure
48 struct drsut_pfm_oid_data {
51 const char *oid_prefix;
55 * Default prefixMap initialization data
57 static const struct drsut_pfm_oid_data _prefixmap_test_new_data[] = {
58 {.id=0x00000000, .bin_oid="5504", .oid_prefix="2.5.4"},
59 {.id=0x00000001, .bin_oid="5506", .oid_prefix="2.5.6"},
60 {.id=0x00000002, .bin_oid="2A864886F7140102", .oid_prefix="1.2.840.113556.1.2"},
61 {.id=0x00000003, .bin_oid="2A864886F7140103", .oid_prefix="1.2.840.113556.1.3"},
62 {.id=0x00000004, .bin_oid="6086480165020201", .oid_prefix="2.16.840.1.101.2.2.1"},
63 {.id=0x00000005, .bin_oid="6086480165020203", .oid_prefix="2.16.840.1.101.2.2.3"},
64 {.id=0x00000006, .bin_oid="6086480165020105", .oid_prefix="2.16.840.1.101.2.1.5"},
65 {.id=0x00000007, .bin_oid="6086480165020104", .oid_prefix="2.16.840.1.101.2.1.4"},
66 {.id=0x00000008, .bin_oid="5505", .oid_prefix="2.5.5"},
67 {.id=0x00000009, .bin_oid="2A864886F7140104", .oid_prefix="1.2.840.113556.1.4"},
68 {.id=0x0000000A, .bin_oid="2A864886F7140105", .oid_prefix="1.2.840.113556.1.5"},
69 {.id=0x00000013, .bin_oid="0992268993F22C64", .oid_prefix="0.9.2342.19200300.100"},
70 {.id=0x00000014, .bin_oid="6086480186F84203", .oid_prefix="2.16.840.1.113730.3"},
71 {.id=0x00000015, .bin_oid="0992268993F22C6401", .oid_prefix="0.9.2342.19200300.100.1"},
72 {.id=0x00000016, .bin_oid="6086480186F8420301", .oid_prefix="2.16.840.1.113730.3.1"},
73 {.id=0x00000017, .bin_oid="2A864886F7140105B658", .oid_prefix="1.2.840.113556.1.5.7000"},
74 {.id=0x00000018, .bin_oid="5515", .oid_prefix="2.5.21"},
75 {.id=0x00000019, .bin_oid="5512", .oid_prefix="2.5.18"},
76 {.id=0x0000001A, .bin_oid="5514", .oid_prefix="2.5.20"},
80 * Data to be used for creating full prefix map for testing
82 static const struct drsut_pfm_oid_data _prefixmap_full_map_data[] = {
83 {.id=0x00000000, .bin_oid="0x5504", .oid_prefix="2.5.4"},
84 {.id=0x00000001, .bin_oid="0x5506", .oid_prefix="2.5.6"},
85 {.id=0x00000002, .bin_oid="0x2A864886F7140102", .oid_prefix="1.2.840.113556.1.2"},
86 {.id=0x00000003, .bin_oid="0x2A864886F7140103", .oid_prefix="1.2.840.113556.1.3"},
87 {.id=0x00000004, .bin_oid="0x6086480165020201", .oid_prefix="2.16.840.1.101.2.2.1"},
88 {.id=0x00000005, .bin_oid="0x6086480165020203", .oid_prefix="2.16.840.1.101.2.2.3"},
89 {.id=0x00000006, .bin_oid="0x6086480165020105", .oid_prefix="2.16.840.1.101.2.1.5"},
90 {.id=0x00000007, .bin_oid="0x6086480165020104", .oid_prefix="2.16.840.1.101.2.1.4"},
91 {.id=0x00000008, .bin_oid="0x5505", .oid_prefix="2.5.5"},
92 {.id=0x00000009, .bin_oid="0x2A864886F7140104", .oid_prefix="1.2.840.113556.1.4"},
93 {.id=0x0000000a, .bin_oid="0x2A864886F7140105", .oid_prefix="1.2.840.113556.1.5"},
94 {.id=0x00000013, .bin_oid="0x0992268993F22C64", .oid_prefix="0.9.2342.19200300.100"},
95 {.id=0x00000014, .bin_oid="0x6086480186F84203", .oid_prefix="2.16.840.1.113730.3"},
96 {.id=0x00000015, .bin_oid="0x0992268993F22C6401", .oid_prefix="0.9.2342.19200300.100.1"},
97 {.id=0x00000016, .bin_oid="0x6086480186F8420301", .oid_prefix="2.16.840.1.113730.3.1"},
98 {.id=0x00000017, .bin_oid="0x2A864886F7140105B658", .oid_prefix="1.2.840.113556.1.5.7000"},
99 {.id=0x00000018, .bin_oid="0x5515", .oid_prefix="2.5.21"},
100 {.id=0x00000019, .bin_oid="0x5512", .oid_prefix="2.5.18"},
101 {.id=0x0000001a, .bin_oid="0x5514", .oid_prefix="2.5.20"},
102 {.id=0x0000000b, .bin_oid="0x2A864886F71401048204", .oid_prefix="1.2.840.113556.1.4.260"},
103 {.id=0x0000000c, .bin_oid="0x2A864886F714010538", .oid_prefix="1.2.840.113556.1.5.56"},
104 {.id=0x0000000d, .bin_oid="0x2A864886F71401048206", .oid_prefix="1.2.840.113556.1.4.262"},
105 {.id=0x0000000e, .bin_oid="0x2A864886F714010539", .oid_prefix="1.2.840.113556.1.5.57"},
106 {.id=0x0000000f, .bin_oid="0x2A864886F71401048207", .oid_prefix="1.2.840.113556.1.4.263"},
107 {.id=0x00000010, .bin_oid="0x2A864886F71401053A", .oid_prefix="1.2.840.113556.1.5.58"},
108 {.id=0x00000011, .bin_oid="0x2A864886F714010549", .oid_prefix="1.2.840.113556.1.5.73"},
109 {.id=0x00000012, .bin_oid="0x2A864886F71401048231", .oid_prefix="1.2.840.113556.1.4.305"},
110 {.id=0x0000001b, .bin_oid="0x2B060104018B3A6577", .oid_prefix="1.3.6.1.4.1.1466.101.119"},
111 {.id=0x0000001c, .bin_oid="0x6086480186F8420302", .oid_prefix="2.16.840.1.113730.3.2"},
112 {.id=0x0000001d, .bin_oid="0x2B06010401817A01", .oid_prefix="1.3.6.1.4.1.250.1"},
113 {.id=0x0000001e, .bin_oid="0x2A864886F70D0109", .oid_prefix="1.2.840.113549.1.9"},
114 {.id=0x0000001f, .bin_oid="0x0992268993F22C6404", .oid_prefix="0.9.2342.19200300.100.4"},
115 {.id=0x00000020, .bin_oid="0x2A864886F714010617", .oid_prefix="1.2.840.113556.1.6.23"},
116 {.id=0x00000021, .bin_oid="0x2A864886F71401061201", .oid_prefix="1.2.840.113556.1.6.18.1"},
117 {.id=0x00000022, .bin_oid="0x2A864886F71401061202", .oid_prefix="1.2.840.113556.1.6.18.2"},
118 {.id=0x00000023, .bin_oid="0x2A864886F71401060D03", .oid_prefix="1.2.840.113556.1.6.13.3"},
119 {.id=0x00000024, .bin_oid="0x2A864886F71401060D04", .oid_prefix="1.2.840.113556.1.6.13.4"},
120 {.id=0x00000025, .bin_oid="0x2B0601010101", .oid_prefix="1.3.6.1.1.1.1"},
121 {.id=0x00000026, .bin_oid="0x2B0601010102", .oid_prefix="1.3.6.1.1.1.2"},
122 {.id=0x000003ed, .bin_oid="0x2A864886F7140104B65866", .oid_prefix="1.2.840.113556.1.4.7000.102"},
123 {.id=0x00000428, .bin_oid="0x2A864886F7140105B6583E", .oid_prefix="1.2.840.113556.1.5.7000.62"},
124 {.id=0x0000044c, .bin_oid="0x2A864886F7140104B6586683", .oid_prefix="1.2.840.113556.1.4.7000.102:0x83"},
125 {.id=0x0000044f, .bin_oid="0x2A864886F7140104B6586681", .oid_prefix="1.2.840.113556.1.4.7000.102:0x81"},
126 {.id=0x0000047d, .bin_oid="0x2A864886F7140105B6583E81", .oid_prefix="1.2.840.113556.1.5.7000.62:0x81"},
127 {.id=0x00000561, .bin_oid="0x2A864886F7140105B6583E83", .oid_prefix="1.2.840.113556.1.5.7000.62:0x83"},
128 {.id=0x000007d1, .bin_oid="0x2A864886F71401061401", .oid_prefix="1.2.840.113556.1.6.20.1"},
129 {.id=0x000007e1, .bin_oid="0x2A864886F71401061402", .oid_prefix="1.2.840.113556.1.6.20.2"},
130 {.id=0x00001b86, .bin_oid="0x2A817A", .oid_prefix="1.2.250"},
131 {.id=0x00001c78, .bin_oid="0x2A817A81", .oid_prefix="1.2.250:0x81"},
132 {.id=0x00001c7b, .bin_oid="0x2A817A8180", .oid_prefix="1.2.250:0x8180"},
137 * OID-to-ATTID mappings to be used for testing
139 static const struct {
143 } _prefixmap_test_data[] = {
144 {.oid="2.5.4.0", .id=0x00000000, .attid=0x000000},
145 {.oid="2.5.4.42", .id=0x00000000, .attid=0x00002a},
146 {.oid="1.2.840.113556.1.2.1", .id=0x00000002, .attid=0x020001},
147 {.oid="1.2.840.113556.1.2.13", .id=0x00000002, .attid=0x02000d},
148 {.oid="1.2.840.113556.1.2.281", .id=0x00000002, .attid=0x020119},
149 {.oid="1.2.840.113556.1.4.125", .id=0x00000009, .attid=0x09007d},
150 {.oid="1.2.840.113556.1.4.146", .id=0x00000009, .attid=0x090092},
151 {.oid="1.2.250.1", .id=0x00001b86, .attid=0x1b860001},
152 {.oid="1.2.250.130", .id=0x00001b86, .attid=0x1b860082},
153 {.oid="1.2.250.16386", .id=0x00001c78, .attid=0x1c788002},
154 {.oid="1.2.250.2097154", .id=0x00001c7b, .attid=0x1c7b8002},
159 * Creates dsdb_schema_prefixmap based on predefined data
162 static WERROR _drsut_prefixmap_new(const struct drsut_pfm_oid_data *_pfm_init_data, uint32_t count,
163 TALLOC_CTX *mem_ctx, struct dsdb_schema_prefixmap **_pfm)
166 struct dsdb_schema_prefixmap *pfm;
168 pfm = talloc(mem_ctx, struct dsdb_schema_prefixmap);
169 W_ERROR_HAVE_NO_MEMORY(pfm);
172 pfm->prefixes = talloc_array(pfm, struct dsdb_schema_prefixmap_oid, pfm->length);
173 if (!pfm->prefixes) {
178 for (i = 0; i < pfm->length; i++) {
179 pfm->prefixes[i].id = _pfm_init_data[i].id;
180 pfm->prefixes[i].bin_oid = strhex_to_data_blob(pfm, _pfm_init_data[i].bin_oid);
181 if (!pfm->prefixes[i].bin_oid.data) {
192 static bool _torture_drs_pfm_compare_same(struct torture_context *tctx,
193 const struct dsdb_schema_prefixmap *pfm_left,
194 const struct dsdb_schema_prefixmap *pfm_right,
198 char *err_msg = NULL;
200 if (pfm_left->length != pfm_right->length) {
201 err_msg = talloc_asprintf(tctx, "prefixMaps differ in size; left = %d, right = %d",
202 pfm_left->length, pfm_right->length);
206 for (i = 0; i < pfm_left->length; i++) {
207 struct dsdb_schema_prefixmap_oid *entry_left = &pfm_left->prefixes[i];
208 struct dsdb_schema_prefixmap_oid *entry_right = &pfm_right->prefixes[i];
210 if (entry_left->id != entry_right->id) {
211 err_msg = talloc_asprintf(tctx, "Different IDs for index=%d", i);
214 if (data_blob_cmp(&entry_left->bin_oid, &entry_right->bin_oid)) {
215 err_msg = talloc_asprintf(tctx, "Different bin_oid for index=%d", i);
224 torture_comment(tctx, "_torture_drs_pfm_compare_same: %s", err_msg);
226 talloc_free(err_msg);
232 * Tests dsdb_schema_pfm_new()
234 static bool torture_drs_unit_pfm_new(struct torture_context *tctx, struct drsut_prefixmap_data *priv)
239 struct dsdb_schema_prefixmap *pfm = NULL;
241 mem_ctx = talloc_new(priv);
243 /* create new prefix map */
244 werr = dsdb_schema_pfm_new(mem_ctx, &pfm);
245 torture_assert_werr_ok(tctx, werr, "dsdb_schema_pfm_new() failed!");
246 torture_assert(tctx, pfm != NULL, "NULL prefixMap created!");
247 torture_assert(tctx, pfm->length > 0, "Empty prefixMap created!");
248 torture_assert(tctx, pfm->prefixes != NULL, "No prefixes for newly created prefixMap!");
250 /* compare newly created prefixMap with template one */
251 bret = _torture_drs_pfm_compare_same(tctx, priv->pfm_new, pfm, false);
253 talloc_free(mem_ctx);
259 * Tests dsdb_schema_pfm_make_attid() using full prefixMap.
260 * In this test we know exactly which ATTID and prefixMap->ID
261 * should be returned, i.e. no prefixMap entries should be added.
263 static bool torture_drs_unit_pfm_make_attid_full_map(struct torture_context *tctx, struct drsut_prefixmap_data *priv)
270 count = ARRAY_SIZE(_prefixmap_test_data);
271 for (i = 0; i < count; i++) {
272 werr = dsdb_schema_pfm_make_attid(priv->pfm_full, _prefixmap_test_data[i].oid, &attid);
273 /* prepare error message */
274 err_msg = talloc_asprintf(priv, "dsdb_schema_pfm_make_attid() failed with %s",
275 _prefixmap_test_data[i].oid);
276 torture_assert(tctx, err_msg, "Unexpected: Have no memory!");
277 /* verify result and returned ATTID */
278 torture_assert_werr_ok(tctx, werr, err_msg);
279 torture_assert_int_equal(tctx, attid, _prefixmap_test_data[i].attid, err_msg);
280 /* reclaim memory for prepared error message */
281 talloc_free(err_msg);
288 * Tests dsdb_schema_pfm_make_attid() using initially small prefixMap.
289 * In this test we don't know exactly which ATTID and prefixMap->ID
290 * should be returned, but we can verify lo-word of ATTID.
291 * This test verifies implementation branch when a new
292 * prefix should be added into prefixMap.
294 static bool torture_drs_unit_pfm_make_attid_small_map(struct torture_context *tctx, struct drsut_prefixmap_data *priv)
299 uint32_t attid, attid_2;
301 struct dsdb_schema_prefixmap *pfm = NULL;
304 mem_ctx = talloc_new(priv);
306 /* create new prefix map */
307 werr = dsdb_schema_pfm_new(mem_ctx, &pfm);
308 torture_assert_werr_ok(tctx, werr, "dsdb_schema_pfm_new() failed!");
309 torture_assert(tctx, pfm != NULL, "NULL prefixMap created!");
310 torture_assert(tctx, pfm->length > 0, "Empty prefixMap created!");
311 torture_assert(tctx, pfm->prefixes != NULL, "No prefixes for newly created prefixMap!");
313 /* make some ATTIDs and check result */
314 for (i = 0; i < ARRAY_SIZE(_prefixmap_test_data); i++) {
315 werr = dsdb_schema_pfm_make_attid(pfm, _prefixmap_test_data[i].oid, &attid);
317 /* prepare error message */
318 err_msg = talloc_asprintf(mem_ctx, "dsdb_schema_pfm_make_attid() failed with %s",
319 _prefixmap_test_data[i].oid);
320 torture_assert(tctx, err_msg, "Unexpected: Have no memory!");
322 /* verify result and returned ATTID */
323 torture_assert_werr_ok(tctx, werr, err_msg);
324 /* verify ATTID lo-word */
325 torture_assert_int_equal(tctx, attid & 0xFFFF, _prefixmap_test_data[i].attid & 0xFFFF, err_msg);
327 /* try again, this time verify for whole ATTID */
328 werr = dsdb_schema_pfm_make_attid(pfm, _prefixmap_test_data[i].oid, &attid_2);
329 torture_assert_werr_ok(tctx, werr, err_msg);
330 torture_assert_int_equal(tctx, attid_2, attid, err_msg);
332 /* reclaim memory for prepared error message */
333 talloc_free(err_msg);
335 /* check there is such an index in modified prefixMap */
337 for (j = 0; j < pfm->length; j++) {
338 if (pfm->prefixes[j].id == idx)
341 if (j >= pfm->length) {
342 torture_result(tctx, TORTURE_FAIL, __location__": No prefix for ATTID=0x%08X", attid);
348 talloc_free(mem_ctx);
354 * Tests dsdb_schema_pfm_oid_from_attid() using full prefixMap.
356 static bool torture_drs_unit_pfm_oid_from_attid(struct torture_context *tctx, struct drsut_prefixmap_data *priv)
363 count = ARRAY_SIZE(_prefixmap_test_data);
364 for (i = 0; i < count; i++) {
366 werr = dsdb_schema_pfm_oid_from_attid(priv->pfm_full, _prefixmap_test_data[i].attid,
368 /* prepare error message */
369 err_msg = talloc_asprintf(priv, "dsdb_schema_pfm_oid_from_attid() failed with 0x%08X",
370 _prefixmap_test_data[i].attid);
371 torture_assert(tctx, err_msg, "Unexpected: Have no memory!");
372 /* verify result and returned ATTID */
373 torture_assert_werr_ok(tctx, werr, err_msg);
374 torture_assert(tctx, oid, "dsdb_schema_pfm_oid_from_attid() returned NULL OID!!!");
375 torture_assert_str_equal(tctx, oid, _prefixmap_test_data[i].oid, err_msg);
376 /* reclaim memory for prepared error message */
377 talloc_free(err_msg);
378 /* free memory for OID */
379 talloc_free(discard_const(oid));
386 * Test Schema prefixMap conversions to/from drsuapi prefixMap
389 static bool torture_drs_unit_pfm_to_from_drsuapi(struct torture_context *tctx, struct drsut_prefixmap_data *priv)
392 const char *schema_info;
393 struct dsdb_schema_prefixmap *pfm;
394 struct drsuapi_DsReplicaOIDMapping_Ctr *ctr;
397 mem_ctx = talloc_new(tctx);
398 torture_assert(tctx, mem_ctx, "Unexpected: Have no memory!");
400 /* convert Schema_prefixMap to drsuapi_prefixMap */
401 werr = dsdb_drsuapi_pfm_from_schema_pfm(priv->pfm_full, SCHEMA_INFO_DEFAULT, mem_ctx, &ctr);
402 torture_assert_werr_ok(tctx, werr, "dsdb_drsuapi_pfm_from_schema_pfm() failed");
403 torture_assert(tctx, ctr && ctr->mappings, "drsuapi_prefixMap not constructed correctly");
404 torture_assert_int_equal(tctx, ctr->num_mappings, priv->pfm_full->length + 1,
405 "drs_mappings count does not match");
406 /* look for schema_info entry - it should be the last one */
407 schema_info = hex_encode_talloc(mem_ctx,
408 ctr->mappings[ctr->num_mappings - 1].oid.binary_oid,
409 ctr->mappings[ctr->num_mappings - 1].oid.length);
410 torture_assert_str_equal(tctx,
413 "schema_info not stored correctly or not last entry");
415 /* compare schema_prefixMap and drsuapi_prefixMap */
416 werr = dsdb_schema_pfm_contains_drsuapi_pfm(priv->pfm_full, ctr);
417 torture_assert_werr_ok(tctx, werr, "dsdb_schema_pfm_contains_drsuapi_pfm() failed");
419 /* convert back drsuapi_prefixMap to schema_prefixMap */
420 werr = dsdb_schema_pfm_from_drsuapi_pfm(ctr, true, mem_ctx, &pfm, &schema_info);
421 torture_assert_werr_ok(tctx, werr, "dsdb_schema_pfm_from_drsuapi_pfm() failed");
422 torture_assert_str_equal(tctx, schema_info, SCHEMA_INFO_DEFAULT, "Fetched schema_info is different");
424 /* compare against the original */
425 if (!_torture_drs_pfm_compare_same(tctx, priv->pfm_full, pfm, true)) {
426 talloc_free(mem_ctx);
430 /* test conversion with partial drsuapi_prefixMap */
432 werr = dsdb_schema_pfm_from_drsuapi_pfm(ctr, false, mem_ctx, &pfm, NULL);
433 torture_assert_werr_ok(tctx, werr, "dsdb_schema_pfm_from_drsuapi_pfm() failed");
434 /* compare against the original */
435 if (!_torture_drs_pfm_compare_same(tctx, priv->pfm_full, pfm, false)) {
436 talloc_free(mem_ctx);
440 talloc_free(mem_ctx);
446 * Test Schema prefixMap conversions to/from ldb_val
447 * blob representation.
449 static bool torture_drs_unit_pfm_to_from_ldb_val(struct torture_context *tctx, struct drsut_prefixmap_data *priv)
452 const char *schema_info;
453 struct dsdb_schema *schema;
454 struct ldb_val pfm_ldb_val;
455 struct ldb_val schema_info_ldb_val;
458 mem_ctx = talloc_new(tctx);
459 torture_assert(tctx, mem_ctx, "Unexpected: Have no memory!");
461 schema = dsdb_new_schema(mem_ctx, lp_iconv_convenience(tctx->lp_ctx));
462 torture_assert(tctx, schema, "Unexpected: failed to allocate schema object");
464 /* set priv->pfm_full as prefixMap for new schema object */
465 schema->prefixmap = priv->pfm_full;
466 schema->schema_info = SCHEMA_INFO_DEFAULT;
468 /* convert schema_prefixMap to ldb_val blob */
469 werr = dsdb_get_oid_mappings_ldb(schema, mem_ctx, &pfm_ldb_val, &schema_info_ldb_val);
470 torture_assert_werr_ok(tctx, werr, "dsdb_get_oid_mappings_ldb() failed");
471 torture_assert(tctx, pfm_ldb_val.data && pfm_ldb_val.length,
472 "pfm_ldb_val not constructed correctly");
473 torture_assert(tctx, schema_info_ldb_val.data && schema_info_ldb_val.length,
474 "schema_info_ldb_val not constructed correctly");
475 /* look for schema_info entry - it should be the last one */
476 schema_info = hex_encode_talloc(mem_ctx,
477 schema_info_ldb_val.data,
478 schema_info_ldb_val.length);
479 torture_assert_str_equal(tctx,
482 "schema_info not stored correctly or not last entry");
484 /* convert pfm_ldb_val back to schema_prefixMap */
485 schema->prefixmap = NULL;
486 schema->schema_info = NULL;
487 werr = dsdb_load_oid_mappings_ldb(schema, &pfm_ldb_val, &schema_info_ldb_val);
488 torture_assert_werr_ok(tctx, werr, "dsdb_load_oid_mappings_ldb() failed");
489 /* compare against the original */
490 if (!_torture_drs_pfm_compare_same(tctx, schema->prefixmap, priv->pfm_full, false)) {
491 talloc_free(mem_ctx);
495 talloc_free(mem_ctx);
500 * Test read/write in ldb implementation
502 static bool torture_drs_unit_pfm_read_write_ldb(struct torture_context *tctx, struct drsut_prefixmap_data *priv)
505 struct dsdb_schema *schema;
506 struct dsdb_schema_prefixmap *pfm;
509 mem_ctx = talloc_new(tctx);
510 torture_assert(tctx, mem_ctx, "Unexpected: Have no memory!");
512 /* makeup a dsdb_schema to test with */
513 schema = dsdb_new_schema(mem_ctx, lp_iconv_convenience(tctx->lp_ctx));
514 torture_assert(tctx, schema, "Unexpected: failed to allocate schema object");
515 /* set priv->pfm_full as prefixMap for new schema object */
516 schema->prefixmap = priv->pfm_full;
517 schema->schema_info = SCHEMA_INFO_DEFAULT;
519 /* write prfixMap to ldb */
520 werr = dsdb_write_prefixes_from_schema_to_ldb(mem_ctx, priv->ldb_ctx, schema);
521 torture_assert_werr_ok(tctx, werr, "dsdb_write_prefixes_from_schema_to_ldb() failed");
523 /* read from ldb what we have written */
524 werr = dsdb_read_prefixes_from_ldb(priv->ldb_ctx, mem_ctx, &pfm);
525 torture_assert_werr_ok(tctx, werr, "dsdb_read_prefixes_from_ldb() failed");
527 /* compare data written/read */
528 if (!_torture_drs_pfm_compare_same(tctx, schema->prefixmap, priv->pfm_full, false)) {
529 torture_fail(tctx, "prefixMap read/write in LDB is not consistent");
532 talloc_free(mem_ctx);
538 * Test rdsdb_create_prefix_mapping
540 static bool torture_drs_unit_dsdb_create_prefix_mapping(struct torture_context *tctx, struct drsut_prefixmap_data *priv)
544 struct dsdb_schema *schema;
549 bool exists; /* if this prefix already exists or should be added */
551 {.oid="2.5.4.0", .attid=0x00000000, true},
552 {.oid="2.5.4.42", .attid=0x0000002a, true},
553 {.oid="1.2.840.113556.1.2.1", .attid=0x00020001, true},
554 {.oid="1.2.840.113556.1.2.13", .attid=0x0002000d, true},
555 {.oid="1.2.840.113556.1.2.281", .attid=0x00020119, true},
556 {.oid="1.2.840.113556.1.4.125", .attid=0x0009007d, true},
557 {.oid="1.2.840.113556.1.4.146", .attid=0x00090092, true},
558 {.oid="1.2.250.1", .attid=0x1b860001, false},
559 {.oid="1.2.250.16386", .attid=0x1c788002, false},
560 {.oid="1.2.250.2097154", .attid=0x1c7b8002, false},
563 mem_ctx = talloc_new(tctx);
564 torture_assert(tctx, mem_ctx, "Unexpected: Have no memory!");
566 /* makeup a dsdb_schema to test with */
567 schema = dsdb_new_schema(mem_ctx, lp_iconv_convenience(tctx->lp_ctx));
568 torture_assert(tctx, schema, "Unexpected: failed to allocate schema object");
569 /* set priv->pfm_full as prefixMap for new schema object */
570 schema->schema_info = SCHEMA_INFO_DEFAULT;
571 werr = _drsut_prefixmap_new(_prefixmap_test_new_data, ARRAY_SIZE(_prefixmap_test_new_data),
572 schema, &schema->prefixmap);
573 torture_assert_werr_ok(tctx, werr, "_drsut_prefixmap_new() failed");
574 /* write prfixMap to ldb */
575 werr = dsdb_write_prefixes_from_schema_to_ldb(mem_ctx, priv->ldb_ctx, schema);
576 torture_assert_werr_ok(tctx, werr, "dsdb_write_prefixes_from_schema_to_ldb() failed");
578 for (i = 0; i < ARRAY_SIZE(_test_data); i++) {
579 struct dsdb_schema_prefixmap *pfm_ldb;
580 struct dsdb_schema_prefixmap *pfm_prev;
582 /* add ref to prefixMap so we can use it later */
583 pfm_prev = talloc_reference(schema, schema->prefixmap);
585 /* call dsdb_create_prefix_mapping() and check result accordingly */
586 werr = dsdb_create_prefix_mapping(priv->ldb_ctx, schema, _test_data[i].oid);
587 torture_assert_werr_ok(tctx, werr, "dsdb_create_prefix_mapping() failed");
589 /* verify pfm has been altered or not if needed */
590 if (_test_data[i].exists) {
591 torture_assert(tctx, pfm_prev == schema->prefixmap,
592 "schema->prefixmap has been reallocated!");
593 if (!_torture_drs_pfm_compare_same(tctx, pfm_prev, schema->prefixmap, true)) {
594 torture_fail(tctx, "schema->prefixmap has changed");
597 torture_assert(tctx, pfm_prev != schema->prefixmap,
598 "schema->prefixmap should be reallocated!");
599 if (_torture_drs_pfm_compare_same(tctx, pfm_prev, schema->prefixmap, true)) {
600 torture_fail(tctx, "schema->prefixmap should be changed");
604 /* read from ldb what we have written */
605 werr = dsdb_read_prefixes_from_ldb(priv->ldb_ctx, mem_ctx, &pfm_ldb);
606 torture_assert_werr_ok(tctx, werr, "dsdb_read_prefixes_from_ldb() failed");
607 /* compare data written/read */
608 if (!_torture_drs_pfm_compare_same(tctx, schema->prefixmap, pfm_ldb, true)) {
609 torture_fail(tctx, "schema->prefixmap and pfm in LDB are different");
611 /* free mem for pfm read from LDB */
612 talloc_free(pfm_ldb);
614 /* release prefixMap pointer */
615 talloc_unlink(schema, pfm_prev);
618 talloc_free(mem_ctx);
624 * Prepare temporary LDB and opens it
626 static bool torture_drs_unit_ldb_setup(struct torture_context *tctx, struct drsut_prefixmap_data *priv)
635 mem_ctx = talloc_new(priv);
637 status = torture_temp_dir(tctx, "drs_", &tempdir);
638 torture_assert_ntstatus_ok(tctx, status, "creating temp dir");
640 ldb_url = talloc_asprintf(priv, "%s/drs_test.ldb", tempdir);
643 priv->ldb_ctx = ldb_init(priv, tctx->ev);
644 ldb_err = ldb_connect(priv->ldb_ctx, ldb_url, 0, NULL);
645 torture_assert_int_equal_goto(tctx, ldb_err, LDB_SUCCESS, bret, DONE, "ldb_connect() failed");
647 /* set some schemaNamingContext */
648 ldb_err = ldb_set_opaque(priv->ldb_ctx,
649 "schemaNamingContext",
650 ldb_dn_new(priv->ldb_ctx, priv->ldb_ctx, "CN=Schema,CN=Config"));
651 torture_assert_int_equal_goto(tctx, ldb_err, LDB_SUCCESS, bret, DONE, "ldb_set_opaque() failed");
653 /* add prefixMap attribute so tested layer could work properly */
655 struct ldb_message *msg = ldb_msg_new(mem_ctx);
656 msg->dn = samdb_schema_dn(priv->ldb_ctx);
657 ldb_err = ldb_msg_add_string(msg, "prefixMap", "prefixMap");
658 torture_assert_int_equal_goto(tctx, ldb_err, LDB_SUCCESS, bret, DONE,
659 "ldb_msg_add_empty() failed");
661 ldb_err = ldb_add(priv->ldb_ctx, msg);
662 torture_assert_int_equal_goto(tctx, ldb_err, LDB_SUCCESS, bret, DONE, "ldb_add() failed");
666 talloc_free(mem_ctx);
671 * Setup/Teardown for test case
673 static bool torture_drs_unit_prefixmap_setup(struct torture_context *tctx, struct drsut_prefixmap_data **priv)
677 *priv = talloc_zero(tctx, struct drsut_prefixmap_data);
678 torture_assert(tctx, *priv != NULL, "Not enough memory");
680 werr = _drsut_prefixmap_new(_prefixmap_test_new_data, ARRAY_SIZE(_prefixmap_test_new_data), tctx, &(*priv)->pfm_new);
681 torture_assert_werr_ok(tctx, werr, "failed to create pfm_new");
683 werr = _drsut_prefixmap_new(_prefixmap_full_map_data, ARRAY_SIZE(_prefixmap_full_map_data), tctx, &(*priv)->pfm_full);
684 torture_assert_werr_ok(tctx, werr, "failed to create pfm_test");
686 /* create temporary LDB and populate with data */
687 if (!torture_drs_unit_ldb_setup(tctx, *priv)) {
694 static bool torture_drs_unit_prefixmap_teardown(struct torture_context *tctx, struct drsut_prefixmap_data *priv)
702 * Test case initialization for
705 struct torture_tcase * torture_drs_unit_prefixmap(struct torture_suite *suite)
707 typedef bool (*pfn_setup)(struct torture_context *, void **);
708 typedef bool (*pfn_teardown)(struct torture_context *, void *);
709 typedef bool (*pfn_run)(struct torture_context *, void *);
711 struct torture_tcase * tc = torture_suite_add_tcase(suite, "prefixMap");
713 torture_tcase_set_fixture(tc,
714 (pfn_setup)torture_drs_unit_prefixmap_setup,
715 (pfn_teardown)torture_drs_unit_prefixmap_teardown);
717 tc->description = talloc_strdup(tc, "Unit tests for DRSUAPI::prefixMap implementation");
719 torture_tcase_add_simple_test(tc, "new", (pfn_run)torture_drs_unit_pfm_new);
721 torture_tcase_add_simple_test(tc, "make_attid_full_map", (pfn_run)torture_drs_unit_pfm_make_attid_full_map);
722 torture_tcase_add_simple_test(tc, "make_attid_small_map", (pfn_run)torture_drs_unit_pfm_make_attid_small_map);
723 torture_tcase_add_simple_test(tc, "oid_from_attid_full_map", (pfn_run)torture_drs_unit_pfm_oid_from_attid);
725 torture_tcase_add_simple_test(tc, "pfm_to_from_drsuapi", (pfn_run)torture_drs_unit_pfm_to_from_drsuapi);
727 torture_tcase_add_simple_test(tc, "pfm_to_from_ldb_val", (pfn_run)torture_drs_unit_pfm_to_from_ldb_val);
729 torture_tcase_add_simple_test(tc, "pfm_read_write_ldb", (pfn_run)torture_drs_unit_pfm_read_write_ldb);
731 torture_tcase_add_simple_test(tc, "dsdb_create_prefix_mapping", (pfn_run)torture_drs_unit_dsdb_create_prefix_mapping);