return test;
}
+static bool torture_rpc_wrap_test_setup(struct torture_context *tctx,
+ struct torture_tcase *tcase,
+ struct torture_test *test)
+{
+ bool (*fn)(struct torture_context *, struct dcerpc_pipe *, const void *);
+ struct torture_rpc_tcase *rpc_tcase = talloc_get_type_abort(
+ tctx->active_tcase, struct torture_rpc_tcase);
+ struct torture_rpc_tcase_data *tcase_data = talloc_get_type_abort(
+ tcase->data, struct torture_rpc_tcase_data);
+ void *data = discard_const_p(void, test->data);
+ bool ok;
+
+ ok = rpc_tcase->setup_fn(tctx, tcase_data->pipe, data);
+ if (!ok) {
+ return false;
+ }
+
+ fn = test->fn;
+
+ ok = fn(tctx, tcase_data->pipe, data);
+ if (!ok) {
+ return false;
+ }
+
+ ok = rpc_tcase->teardown_fn(tctx, tcase_data->pipe, data);
+ if (!ok) {
+ return false;
+ }
+
+ return true;
+}
+
+_PUBLIC_ struct torture_test *torture_rpc_tcase_add_test_setup(
+ struct torture_rpc_tcase *tcase,
+ const char *name,
+ bool (*fn)(struct torture_context *,
+ struct dcerpc_pipe *,
+ void *),
+ void *userdata)
+{
+ struct torture_test *test = NULL;
+
+ test = talloc(tcase, struct torture_test);
+
+ test->name = talloc_strdup(test, name);
+ test->description = NULL;
+ test->run = torture_rpc_wrap_test_setup;
+ test->dangerous = false;
+ test->data = userdata;
+ test->fn = fn;
+
+ DLIST_ADD(tcase->tcase.tests, test);
+
+ return test;
+}
+
+_PUBLIC_ struct torture_rpc_tcase *torture_suite_add_rpc_setup_tcase(
+ struct torture_suite *suite,
+ const char *name,
+ const struct ndr_interface_table *table,
+ bool (*setup_fn)(struct torture_context *,
+ struct dcerpc_pipe *,
+ void *),
+ bool (*teardown_fn)(struct torture_context *,
+ struct dcerpc_pipe *,
+ void *))
+{
+ struct torture_rpc_tcase *tcase = talloc(
+ suite, struct torture_rpc_tcase);
+
+ torture_suite_init_rpc_tcase(suite, tcase, name, table);
+
+ tcase->setup_fn = setup_fn;
+ tcase->teardown_fn = teardown_fn;
+ tcase->tcase.setup = torture_rpc_setup;
+ tcase->tcase.teardown = torture_rpc_teardown;
+
+ return tcase;
+}
+
NTSTATUS torture_rpc_init(TALLOC_CTX *ctx)
{
struct torture_suite *suite = torture_suite_create(ctx, "rpc");
torture_suite_add_suite(suite, torture_rpc_fsrvp(suite));
torture_suite_add_suite(suite, torture_rpc_clusapi(suite));
torture_suite_add_suite(suite, torture_rpc_witness(suite));
+ torture_suite_add_suite(suite, torture_rpc_mdssvc(suite));
suite->description = talloc_strdup(suite, "DCE/RPC protocol and interface tests");