mirror of
https://github.com/samba-team/samba.git
synced 2024-12-25 23:21:54 +03:00
bbdfbf8d9d
(This used to be commit a33a553054
)
276 lines
6.5 KiB
C
276 lines
6.5 KiB
C
/*
|
|
Unix SMB/CIFS implementation.
|
|
test suite for rpc frsapi operations
|
|
|
|
Copyright (C) Guenther Deschner 2007
|
|
|
|
This program is free software; you can redistribute it and/or modify
|
|
it under the terms of the GNU General Public License as published by
|
|
the Free Software Foundation; either version 2 of the License, or
|
|
(at your option) any later version.
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with this program; if not, write to the Free Software
|
|
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
|
*/
|
|
|
|
#include "includes.h"
|
|
#include "torture/torture.h"
|
|
#include "torture/rpc/rpc.h"
|
|
#include "librpc/gen_ndr/ndr_frsapi_c.h"
|
|
#include "torture/util.h"
|
|
#include "param/param.h"
|
|
|
|
static bool test_GetDsPollingIntervalW(struct torture_context *tctx,
|
|
struct dcerpc_pipe *p,
|
|
uint32_t *CurrentInterval,
|
|
uint32_t *DsPollingLongInterval,
|
|
uint32_t *DsPollingShortInterval)
|
|
{
|
|
struct frsapi_GetDsPollingIntervalW r;
|
|
|
|
ZERO_STRUCT(r);
|
|
|
|
r.out.CurrentInterval = CurrentInterval;
|
|
r.out.DsPollingLongInterval = DsPollingLongInterval;
|
|
r.out.DsPollingShortInterval = DsPollingShortInterval;
|
|
|
|
torture_assert_ntstatus_ok(tctx,
|
|
dcerpc_frsapi_GetDsPollingIntervalW(p, tctx, &r),
|
|
"GetDsPollingIntervalW failed");
|
|
|
|
torture_assert_werr_ok(tctx, r.out.result,
|
|
"GetDsPollingIntervalW failed");
|
|
|
|
return true;
|
|
}
|
|
|
|
static bool test_SetDsPollingIntervalW(struct torture_context *tctx,
|
|
struct dcerpc_pipe *p,
|
|
uint32_t CurrentInterval,
|
|
uint32_t DsPollingLongInterval,
|
|
uint32_t DsPollingShortInterval)
|
|
{
|
|
struct frsapi_SetDsPollingIntervalW r;
|
|
|
|
ZERO_STRUCT(r);
|
|
|
|
r.in.CurrentInterval = CurrentInterval;
|
|
r.in.DsPollingLongInterval = DsPollingLongInterval;
|
|
r.in.DsPollingShortInterval = DsPollingShortInterval;
|
|
|
|
torture_assert_ntstatus_ok(tctx,
|
|
dcerpc_frsapi_SetDsPollingIntervalW(p, tctx, &r),
|
|
"SetDsPollingIntervalW failed");
|
|
|
|
torture_assert_werr_ok(tctx, r.out.result,
|
|
"SetDsPollingIntervalW failed");
|
|
|
|
return true;
|
|
}
|
|
|
|
static bool test_DsPollingIntervalW(struct torture_context *tctx,
|
|
struct dcerpc_pipe *p)
|
|
{
|
|
uint32_t i1, i2, i3;
|
|
uint32_t k1, k2, k3;
|
|
|
|
if (!test_GetDsPollingIntervalW(tctx, p, &i1, &i2, &i3)) {
|
|
return false;
|
|
}
|
|
|
|
if (!test_SetDsPollingIntervalW(tctx, p, i1, i2, i3)) {
|
|
return false;
|
|
}
|
|
|
|
k1 = i1;
|
|
k2 = k3 = 0;
|
|
|
|
if (!test_SetDsPollingIntervalW(tctx, p, k1, k2, k3)) {
|
|
return false;
|
|
}
|
|
|
|
if (!test_GetDsPollingIntervalW(tctx, p, &k1, &k2, &k3)) {
|
|
return false;
|
|
}
|
|
|
|
if ((i1 != k1) || (i2 != k2) || (i3 != k3)) {
|
|
return false;
|
|
}
|
|
|
|
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;
|
|
bool ret = true;
|
|
|
|
if (!test_IsPathReplicated_err(tctx, p, NULL, 0,
|
|
WERR_FRS_INVALID_SERVICE_PARAMETER)) {
|
|
ret = false;
|
|
}
|
|
|
|
for (i=0; i<ARRAY_SIZE(lvls); i++) {
|
|
if (!_test_IsPathReplicated(tctx, p, dcerpc_server_name(p),
|
|
lvls[i])) {
|
|
ret = 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])) {
|
|
ret = false;
|
|
}
|
|
}
|
|
|
|
for (i=0; i<ARRAY_SIZE(lvls); i++) {
|
|
if (!_test_IsPathReplicated(tctx, p,
|
|
"C:\\windows\\sysvol\\domain",
|
|
lvls[i])) {
|
|
ret = false;
|
|
}
|
|
}
|
|
|
|
return ret;
|
|
}
|
|
|
|
static bool test_ForceReplication(struct torture_context *tctx,
|
|
struct dcerpc_pipe *p)
|
|
{
|
|
struct frsapi_ForceReplication r;
|
|
|
|
ZERO_STRUCT(r);
|
|
|
|
r.in.guid1 = NULL;
|
|
r.in.guid2 = NULL;
|
|
r.in.replica_set = talloc_asprintf(tctx, "%s",
|
|
lp_realm(tctx->lp_ctx));
|
|
r.in.partner_name = dcerpc_server_name(p);
|
|
|
|
torture_assert_ntstatus_ok(tctx,
|
|
dcerpc_frsapi_ForceReplication(p, tctx, &r),
|
|
"ForceReplication failed");
|
|
|
|
torture_assert_werr_ok(tctx, r.out.result,
|
|
"ForceReplication failed");
|
|
|
|
return true;
|
|
}
|
|
|
|
static bool test_InfoW(struct torture_context *tctx,
|
|
struct dcerpc_pipe *p)
|
|
{
|
|
int i;
|
|
|
|
for (i=0; i<10; i++) {
|
|
|
|
struct frsapi_InfoW r;
|
|
struct frsapi_Info *info;
|
|
int d;
|
|
DATA_BLOB blob;
|
|
|
|
ZERO_STRUCT(r);
|
|
|
|
info = talloc_zero(tctx, struct frsapi_Info);
|
|
|
|
r.in.length = 0x1000;
|
|
r.in.info = r.out.info = info;
|
|
|
|
info->length = r.in.length;
|
|
info->length2 = r.in.length;
|
|
info->level = i;
|
|
info->offset = 0x2c;
|
|
info->blob_len = 0x2c;
|
|
|
|
torture_assert_ntstatus_ok(tctx,
|
|
dcerpc_frsapi_InfoW(p, tctx, &r),
|
|
"InfoW failed");
|
|
|
|
torture_assert_werr_ok(tctx, r.out.result, "InfoW failed");
|
|
|
|
/* display the formatted blob text */
|
|
blob = r.out.info->blob;
|
|
for (d = 0; d < blob.length; d++) {
|
|
if (blob.data[d]) {
|
|
printf("%c", blob.data[d]);
|
|
}
|
|
}
|
|
printf("\n");
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
struct torture_suite *torture_rpc_frsapi(TALLOC_CTX *mem_ctx)
|
|
{
|
|
struct torture_rpc_tcase *tcase;
|
|
struct torture_suite *suite = torture_suite_create(mem_ctx, "FRSAPI");
|
|
struct torture_test *test;
|
|
|
|
tcase = torture_suite_add_rpc_iface_tcase(suite, "frsapi",
|
|
&ndr_table_frsapi);
|
|
|
|
test = torture_rpc_tcase_add_test(tcase, "DsPollingIntervalW",
|
|
test_DsPollingIntervalW);
|
|
|
|
test = torture_rpc_tcase_add_test(tcase, "IsPathReplicated",
|
|
test_IsPathReplicated);
|
|
|
|
test = torture_rpc_tcase_add_test(tcase, "ForceReplication",
|
|
test_ForceReplication);
|
|
|
|
test = torture_rpc_tcase_add_test(tcase, "InfoW",
|
|
test_InfoW);
|
|
return suite;
|
|
}
|