X-Git-Url: http://git.samba.org/?a=blobdiff_plain;f=source4%2Ftorture%2Fdrs%2Funit%2Fschemainfo_tests.c;h=3db7c8cdc9b3bf969e12a2afdeca5ad17aeb8fb6;hb=87f31510475c6debd56ff874130f4f5d48bef9a5;hp=ab9de87f2213cbc344fa957b3ab3cc4ff9706bbb;hpb=526e62c46f432950645dc7019969eb694d7b0c6b;p=samba.git diff --git a/source4/torture/drs/unit/schemainfo_tests.c b/source4/torture/drs/unit/schemainfo_tests.c index ab9de87f221..3db7c8cdc9b 100644 --- a/source4/torture/drs/unit/schemainfo_tests.c +++ b/source4/torture/drs/unit/schemainfo_tests.c @@ -24,7 +24,7 @@ #include "torture/smbtorture.h" #include "dsdb/samdb/samdb.h" #include "dsdb/samdb/ldb_modules/util.h" -#include "lib/ldb_wrap.h" +#include "ldb_wrap.h" #include "lib/ldb/include/ldb_module.h" #include "torture/rpc/drsuapi.h" #include "librpc/ndr/libndr.h" @@ -33,10 +33,10 @@ /** * schemaInfo to init ldb context with - * Rev: 01 - * GUID: 071c82fd-45c7-4351-a3db-51f75a630a7f + * Rev: 0 + * GUID: 00000000-0000-0000-0000-000000000000 */ -#define SCHEMA_INFO_INIT_STR "FF0000000100000000000000000000000000000000" +#define SCHEMA_INFO_INIT_STR "FF0000000000000000000000000000000000000000" /** * Default schema_info string to be used for testing @@ -65,6 +65,13 @@ static const struct { WERROR werr_expected; bool test_both_ways; } _schemainfo_test_data[] = { + { + .schema_info_str = "FF0000000000000000000000000000000000000000", + .revision = 0, + .guid_str = "00000000-0000-0000-0000-000000000000", + .werr_expected = WERR_OK, + .test_both_ways = true + }, { .schema_info_str = "FF00000001FD821C07C7455143A3DB51F75A630A7F", .revision = 1, @@ -79,13 +86,6 @@ static const struct { .werr_expected = WERR_OK, .test_both_ways = true }, - { /* revision > 0 */ - .schema_info_str = "FF00000000FD821C07C7455143A3DB51F75A630A7F", - .revision = 0, - .guid_str = "071c82fd-45c7-4351-a3db-51f75a630a7f", - .werr_expected = WERR_INVALID_PARAMETER, - .test_both_ways = true - }, { /* len == 21 */ .schema_info_str = "FF00000001FD821C07C7455143A3DB51F75A630A7F00", .revision = 1, @@ -185,6 +185,39 @@ bool drsut_schemainfo_new(struct torture_context *tctx, struct dsdb_schema_info } +/* + * Tests dsdb_schema_info_new() and dsdb_schema_info_blob_new() + */ +static bool test_dsdb_schema_info_new(struct torture_context *tctx, + struct drsut_schemainfo_data *priv) +{ + WERROR werr; + DATA_BLOB ndr_blob; + DATA_BLOB ndr_blob_expected; + struct dsdb_schema_info *schi; + TALLOC_CTX *mem_ctx; + + mem_ctx = talloc_new(priv); + torture_assert(tctx, mem_ctx, "Not enough memory!"); + ndr_blob_expected = strhex_to_data_blob(mem_ctx, SCHEMA_INFO_INIT_STR); + torture_assert(tctx, ndr_blob_expected.data, "Not enough memory!"); + + werr = dsdb_schema_info_new(mem_ctx, &schi); + torture_assert_werr_ok(tctx, werr, "dsdb_schema_info_new() failed"); + torture_assert_int_equal(tctx, schi->revision, 0, + "dsdb_schema_info_new() creates schemaInfo with invalid revision"); + torture_assert(tctx, GUID_all_zero(&schi->invocation_id), + "dsdb_schema_info_new() creates schemaInfo with not ZERO GUID"); + + werr = dsdb_schema_info_blob_new(mem_ctx, &ndr_blob); + torture_assert_werr_ok(tctx, werr, "dsdb_schema_info_blob_new() failed"); + torture_assert_data_blob_equal(tctx, ndr_blob, ndr_blob_expected, + "dsdb_schema_info_blob_new() returned invalid blob"); + + talloc_free(mem_ctx); + return true; +} + /* * Tests dsdb_schema_info_from_blob() */ @@ -264,6 +297,82 @@ static bool test_dsdb_blob_from_schema_info(struct torture_context *tctx, return true; } +static bool test_dsdb_schema_info_cmp(struct torture_context *tctx, + struct drsut_schemainfo_data *priv) +{ + DATA_BLOB blob; + struct drsuapi_DsReplicaOIDMapping_Ctr *ctr; + + ctr = talloc_zero(priv, struct drsuapi_DsReplicaOIDMapping_Ctr); + torture_assert(tctx, ctr, "Not enough memory!"); + + /* not enough elements */ + torture_assert_werr_equal(tctx, + dsdb_schema_info_cmp(priv->schema, ctr), + WERR_INVALID_PARAMETER, + "dsdb_schema_info_cmp(): unexpected result"); + + /* an empty element for schemaInfo */ + ctr->num_mappings = 1; + ctr->mappings = talloc_zero_array(ctr, struct drsuapi_DsReplicaOIDMapping, 1); + torture_assert(tctx, ctr->mappings, "Not enough memory!"); + torture_assert_werr_equal(tctx, + dsdb_schema_info_cmp(priv->schema, ctr), + WERR_INVALID_PARAMETER, + "dsdb_schema_info_cmp(): unexpected result"); + + /* test with invalid schemaInfo - length != 21 */ + blob = strhex_to_data_blob(ctr, "FF00000001FD821C07C7455143A3DB51F75A630A7F00"); + torture_assert(tctx, blob.data, "Not enough memory!"); + ctr->mappings[0].oid.length = blob.length; + ctr->mappings[0].oid.binary_oid = blob.data; + torture_assert_werr_equal(tctx, + dsdb_schema_info_cmp(priv->schema, ctr), + WERR_INVALID_PARAMETER, + "dsdb_schema_info_cmp(): unexpected result"); + + /* test with invalid schemaInfo - marker != 0xFF */ + blob = strhex_to_data_blob(ctr, "AA00000001FD821C07C7455143A3DB51F75A630A7F"); + torture_assert(tctx, blob.data, "Not enough memory!"); + ctr->mappings[0].oid.length = blob.length; + ctr->mappings[0].oid.binary_oid = blob.data; + torture_assert_werr_equal(tctx, + dsdb_schema_info_cmp(priv->schema, ctr), + WERR_INVALID_PARAMETER, + "dsdb_schema_info_cmp(): unexpected result"); + + /* test with valid schemaInfo, but not correct one */ + blob = strhex_to_data_blob(ctr, "FF0000000000000000000000000000000000000000"); + torture_assert(tctx, blob.data, "Not enough memory!"); + ctr->mappings[0].oid.length = blob.length; + ctr->mappings[0].oid.binary_oid = blob.data; + torture_assert_werr_equal(tctx, + dsdb_schema_info_cmp(priv->schema, ctr), + WERR_DS_DRA_SCHEMA_MISMATCH, + "dsdb_schema_info_cmp(): unexpected result"); + + /* test with correct schemaInfo, but invalid ATTID */ + blob = strhex_to_data_blob(ctr, priv->schema->schema_info); + torture_assert(tctx, blob.data, "Not enough memory!"); + ctr->mappings[0].id_prefix = 1; + ctr->mappings[0].oid.length = blob.length; + ctr->mappings[0].oid.binary_oid = blob.data; + torture_assert_werr_equal(tctx, + dsdb_schema_info_cmp(priv->schema, ctr), + WERR_INVALID_PARAMETER, + "dsdb_schema_info_cmp(): unexpected result"); + + /* test with valid schemaInfo */ + blob = strhex_to_data_blob(ctr, priv->schema->schema_info); + ctr->mappings[0].id_prefix = 0; + torture_assert_werr_ok(tctx, + dsdb_schema_info_cmp(priv->schema, ctr), + "dsdb_schema_info_cmp(): unexpected result"); + + talloc_free(ctr); + return true; +} + /* * Tests dsdb_module_schema_info_blob_read() * and dsdb_module_schema_info_blob_write() @@ -271,7 +380,7 @@ static bool test_dsdb_blob_from_schema_info(struct torture_context *tctx, static bool test_dsdb_module_schema_info_blob_rw(struct torture_context *tctx, struct drsut_schemainfo_data *priv) { - WERROR werr; + int ldb_err; DATA_BLOB blob_write; DATA_BLOB blob_read; @@ -284,14 +393,14 @@ static bool test_dsdb_module_schema_info_blob_rw(struct torture_context *tctx, blob_write = strhex_to_data_blob(priv, SCHEMA_INFO_DEFAULT_STR); torture_assert(tctx, blob_write.data, "Not enough memory!"); - werr = dsdb_module_schema_info_blob_write(priv->ldb_module, - DSDB_FLAG_TOP_MODULE, - &blob_write); - torture_assert_werr_ok(tctx, werr, "dsdb_module_schema_info_blob_write() failed"); + ldb_err = dsdb_module_schema_info_blob_write(priv->ldb_module, + DSDB_FLAG_TOP_MODULE, + &blob_write, NULL); + torture_assert_int_equal(tctx, ldb_err, LDB_SUCCESS, "dsdb_module_schema_info_blob_write() failed"); - werr = dsdb_module_schema_info_blob_read(priv->ldb_module, DSDB_FLAG_TOP_MODULE, - priv, &blob_read); - torture_assert_werr_ok(tctx, werr, "dsdb_module_schema_info_blob_read() failed"); + ldb_err = dsdb_module_schema_info_blob_read(priv->ldb_module, DSDB_FLAG_TOP_MODULE, + priv, &blob_read, NULL); + torture_assert_int_equal(tctx, ldb_err, LDB_SUCCESS, "dsdb_module_schema_info_blob_read() failed"); /* check if we get what we wrote */ torture_assert_data_blob_equal(tctx, blob_read, blob_write, @@ -306,6 +415,7 @@ static bool test_dsdb_module_schema_info_blob_rw(struct torture_context *tctx, static bool test_dsdb_module_schema_info_update(struct torture_context *tctx, struct drsut_schemainfo_data *priv) { + int ldb_err; WERROR werr; DATA_BLOB blob; struct dsdb_schema_info *schema_info; @@ -315,23 +425,19 @@ static bool test_dsdb_module_schema_info_update(struct torture_context *tctx, _drsut_ldb_schema_info_reset(tctx, priv->ldb, SCHEMA_INFO_INIT_STR, false), "_drsut_ldb_schema_info_reset() failed"); - werr = dsdb_module_schema_info_update(priv->ldb_module, - priv->schema, - DSDB_FLAG_TOP_MODULE | DSDB_FLAG_AS_SYSTEM); - torture_assert_werr_ok(tctx, werr, "dsdb_module_schema_info_update() failed"); + ldb_err = dsdb_module_schema_info_update(priv->ldb_module, + priv->schema, + DSDB_FLAG_TOP_MODULE | DSDB_FLAG_AS_SYSTEM, NULL); + torture_assert_int_equal(tctx, ldb_err, LDB_SUCCESS, "dsdb_module_schema_info_update() failed"); /* get updated schemaInfo */ - werr = dsdb_module_schema_info_blob_read(priv->ldb_module, DSDB_FLAG_TOP_MODULE, - priv, &blob); - torture_assert_werr_ok(tctx, werr, "dsdb_module_schema_info_blob_read() failed"); + ldb_err = dsdb_module_schema_info_blob_read(priv->ldb_module, DSDB_FLAG_TOP_MODULE, + priv, &blob, NULL); + torture_assert_int_equal(tctx, ldb_err, LDB_SUCCESS, "dsdb_module_schema_info_blob_read() failed"); werr = dsdb_schema_info_from_blob(&blob, priv, &schema_info); torture_assert_werr_ok(tctx, werr, "dsdb_schema_info_from_blob() failed"); - /* decrement revision to be able to compare - * against default schemaInfo later */ - schema_info->revision--; - /* check against default schema_info */ torture_assert_schema_info_equal(tctx, schema_info, priv->schema_info, "schemaInfo attribute no updated correctly"); @@ -339,29 +445,6 @@ static bool test_dsdb_module_schema_info_update(struct torture_context *tctx, return true; } -/* - * Tests dsdb_schema_info_create() - */ -static bool test_dsdb_schema_info_create(struct torture_context *tctx, - struct drsut_schemainfo_data *priv) -{ - WERROR werr; - struct dsdb_schema_info *schema_info = NULL; - - werr = dsdb_schema_info_create(priv->ldb, priv, &schema_info); - torture_assert_werr_ok(tctx, werr, "dsdb_schema_info_create() failed"); - - torture_assert(tctx, schema_info, "schema_info is NULL after dsdb_schema_info_create()"); - torture_assert_int_equal(tctx, schema_info->revision, 1, "Invalid schemaInfo revision"); - torture_assert(tctx, - GUID_equal(&schema_info->invocation_id, &priv->schema_info->invocation_id), - "Invalid invocationId returned"); - - talloc_free(schema_info); - - return true; -} - /** * Reset schemaInfo record to know value @@ -383,7 +466,7 @@ static bool _drsut_ldb_schema_info_reset(struct torture_context *tctx, msg = ldb_msg_new(mem_ctx); torture_assert_goto(tctx, msg, bret, DONE, "Not enough memory!"); - msg->dn = samdb_schema_dn(ldb); + msg->dn = ldb_get_schema_basedn(ldb); ldb_err = ldb_msg_add_value(msg, "schemaInfo", &blob, NULL); torture_assert_int_equal_goto(tctx, ldb_err, LDB_SUCCESS, bret, DONE, "ldb_msg_add_value() failed"); @@ -507,7 +590,10 @@ static bool torture_drs_unit_schemainfo_setup(struct torture_context *tctx, torture_assert(tctx, priv->ldb_module, "Not enough memory!"); /* create schema mockup object */ - priv->schema = dsdb_new_schema(priv, lp_iconv_convenience(tctx->lp_ctx)); + priv->schema = dsdb_new_schema(priv); + + /* set schema_info in dsdb_schema for testing */ + priv->schema->schema_info = talloc_strdup(priv->schema, SCHEMA_INFO_DEFAULT_STR); /* pre-cache invocationId for samdb_ntds_invocation_id() * to work with our mock ldb */ @@ -547,7 +633,7 @@ static bool torture_drs_unit_schemainfo_teardown(struct torture_context *tctx, /** * Test case initialization for - * DRS-UNIT.schemaInfo + * drs.unit.schemaInfo */ struct torture_tcase * torture_drs_unit_schemainfo(struct torture_suite *suite) { @@ -563,14 +649,16 @@ struct torture_tcase * torture_drs_unit_schemainfo(struct torture_suite *suite) tc->description = talloc_strdup(tc, "Unit tests for DRSUAPI::schemaInfo implementation"); + torture_tcase_add_simple_test(tc, "dsdb_schema_info_new", + (pfn_run)test_dsdb_schema_info_new); torture_tcase_add_simple_test(tc, "dsdb_schema_info_from_blob", (pfn_run)test_dsdb_schema_info_from_blob); torture_tcase_add_simple_test(tc, "dsdb_blob_from_schema_info", (pfn_run)test_dsdb_blob_from_schema_info); + torture_tcase_add_simple_test(tc, "dsdb_schema_info_cmp", + (pfn_run)test_dsdb_schema_info_cmp); torture_tcase_add_simple_test(tc, "dsdb_module_schema_info_blob read|write", (pfn_run)test_dsdb_module_schema_info_blob_rw); - torture_tcase_add_simple_test(tc, "dsdb_schema_info_create", - (pfn_run)test_dsdb_schema_info_create); torture_tcase_add_simple_test(tc, "dsdb_module_schema_info_update", (pfn_run)test_dsdb_module_schema_info_update);