diff options
author | Günther Deschner <gd@samba.org> | 2007-10-16 14:33:34 +0200 |
---|---|---|
committer | Stefan Metzmacher <metze@samba.org> | 2007-12-21 05:43:07 +0100 |
commit | 5da21cd19b0e5ec86a47b70d32eb1c189ae082c3 (patch) | |
tree | e34a842d4f16a04fe1735f284706cff79c1a349b | |
parent | 47f67ef366bca56ad9b4a561d183a35aa464b4ba (diff) | |
download | samba-5da21cd19b0e5ec86a47b70d32eb1c189ae082c3.tar.gz samba-5da21cd19b0e5ec86a47b70d32eb1c189ae082c3.tar.bz2 samba-5da21cd19b0e5ec86a47b70d32eb1c189ae082c3.zip |
r25670: Add torture test for frsapi_IsPathReplicated().
Guenther
(This used to be commit e7fc3c1da9764a2e7c103e05f3d774b540334f75)
-rw-r--r-- | source4/librpc/idl/frsapi.idl | 10 | ||||
-rw-r--r-- | source4/torture/rpc/frsapi.c | 80 |
2 files changed, 88 insertions, 2 deletions
diff --git a/source4/librpc/idl/frsapi.idl b/source4/librpc/idl/frsapi.idl index d75be0ec04..df12f44892 100644 --- a/source4/librpc/idl/frsapi.idl +++ b/source4/librpc/idl/frsapi.idl @@ -71,13 +71,19 @@ interface frsapi /****************/ /* Function 0x08 */ + typedef [v1_enum] enum { + FRSAPI_REPLICA_SET_TYPE_0 = 0x00000000, + FRSAPI_REPLICA_SET_TYPE_DOMAIN = 0x00000002, + FRSAPI_REPLICA_SET_TYPE_DFS = 0x00000003 + } frsapi_ReplicaSetType; + WERROR frsapi_IsPathReplicated( [in,unique] [string,charset(UTF16)] uint16 *path, - [in] uint32 unknown, + [in] frsapi_ReplicaSetType replica_set_type, [out] uint32 *unknown1, [out] uint32 *unknown2, [out] uint32 *unknown3, - [out] GUID *guid + [out] GUID *replica_set_guid ); /****************/ diff --git a/source4/torture/rpc/frsapi.c b/source4/torture/rpc/frsapi.c index d65d551554..a382b1e415 100644 --- a/source4/torture/rpc/frsapi.c +++ b/source4/torture/rpc/frsapi.c @@ -105,6 +105,83 @@ static bool test_DsPollingIntervalW(struct torture_context *tctx, return true; } +static bool test_IsPathReplicated_err(struct torture_context *tctx, + struct dcerpc_pipe *p, + const char *path, + uint32_t type, + WERROR werr) +{ + struct frsapi_IsPathReplicated r; + struct GUID guid; + uint32_t unknown1, unknown2, unknown3 = 0; + + ZERO_STRUCT(r); + + r.in.path = path; + r.in.replica_set_type = type; + r.out.unknown1 = &unknown1; + r.out.unknown2 = &unknown2; + r.out.unknown3 = &unknown3; + r.out.replica_set_guid = &guid; + + torture_assert_ntstatus_ok(tctx, + dcerpc_frsapi_IsPathReplicated(p, tctx, &r), + "IsPathReplicated failed"); + + torture_assert_werr_equal(tctx, r.out.result, werr, + "GetDsPollingIntervalW failed"); + + return true; +} + +static bool _test_IsPathReplicated(struct torture_context *tctx, + struct dcerpc_pipe *p, + const char *path, + uint32_t type) +{ + return test_IsPathReplicated_err(tctx, p, path, type, WERR_OK); +} + +static bool test_IsPathReplicated(struct torture_context *tctx, + struct dcerpc_pipe *p) +{ + const uint32_t lvls[] = { + FRSAPI_REPLICA_SET_TYPE_0, + FRSAPI_REPLICA_SET_TYPE_DOMAIN, + FRSAPI_REPLICA_SET_TYPE_DFS }; + int i; + + if (!test_IsPathReplicated_err(tctx, p, NULL, 0, + WERR_FRS_INVALID_SERVICE_PARAMETER)) { + return false; + } + + for (i=0; i<ARRAY_SIZE(lvls); i++) { + if (!_test_IsPathReplicated(tctx, p, dcerpc_server_name(p), + lvls[i])) { + return false; + } + } + + for (i=0; i<ARRAY_SIZE(lvls); i++) { + const char *path = talloc_asprintf(tctx, "\\\\%s\\SYSVOL", + dcerpc_server_name(p)); + if (!_test_IsPathReplicated(tctx, p, path, lvls[i])) { + return false; + } + } + + for (i=0; i<ARRAY_SIZE(lvls); i++) { + if (!_test_IsPathReplicated(tctx, p, + "C:\\windows\\sysvol\\domain", + lvls[i])) { + return false; + } + } + + return true; +} + struct torture_suite *torture_rpc_frsapi(TALLOC_CTX *mem_ctx) { struct torture_rpc_tcase *tcase; @@ -117,5 +194,8 @@ struct torture_suite *torture_rpc_frsapi(TALLOC_CTX *mem_ctx) test = torture_rpc_tcase_add_test(tcase, "DsPollingIntervalW", test_DsPollingIntervalW); + test = torture_rpc_tcase_add_test(tcase, "IsPathReplicated", + test_IsPathReplicated); + return suite; } |