2 Unix SMB/CIFS implementation.
3 test suite for clusapi rpc operations
5 Copyright (C) Günther Deschner 2015
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 3 of the License, or
10 (at your option) any later version.
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with this program. If not, see <http://www.gnu.org/licenses/>.
22 #include "librpc/gen_ndr/ndr_clusapi_c.h"
23 #include "torture/rpc/torture_rpc.h"
24 #include "param/param.h"
26 static bool test_OpenCluster_int(struct torture_context *tctx,
27 struct dcerpc_pipe *p,
28 struct policy_handle *Cluster)
30 struct dcerpc_binding_handle *b = p->binding_handle;
31 struct clusapi_OpenCluster r;
34 r.out.Status = &Status;
35 r.out.Cluster = Cluster;
37 torture_assert_ntstatus_ok(tctx,
38 dcerpc_clusapi_OpenCluster_r(b, tctx, &r),
39 "OpenCluster failed");
40 torture_assert_werr_ok(tctx,
42 "OpenCluster failed");
47 static bool test_CloseCluster_int(struct torture_context *tctx,
48 struct dcerpc_pipe *p,
49 struct policy_handle *Cluster)
51 struct dcerpc_binding_handle *b = p->binding_handle;
52 struct clusapi_CloseCluster r;
54 r.in.Cluster = Cluster;
55 r.out.Cluster = Cluster;
57 torture_assert_ntstatus_ok(tctx,
58 dcerpc_clusapi_CloseCluster_r(b, tctx, &r),
59 "CloseCluster failed");
60 torture_assert_werr_ok(tctx,
62 "CloseCluster failed");
65 ndr_policy_handle_empty(Cluster),
66 "policy_handle non empty after CloseCluster");
71 static bool test_OpenCluster(struct torture_context *tctx,
72 struct dcerpc_pipe *p)
74 struct policy_handle Cluster;
76 if (!test_OpenCluster_int(tctx, p, &Cluster)) {
80 test_CloseCluster_int(tctx, p, &Cluster);
85 static bool test_CloseCluster(struct torture_context *tctx,
86 struct dcerpc_pipe *p)
88 struct policy_handle Cluster;
90 if (!test_OpenCluster_int(tctx, p, &Cluster)) {
94 return test_CloseCluster_int(tctx, p, &Cluster);
97 static bool test_SetClusterName(struct torture_context *tctx,
98 struct dcerpc_pipe *p)
100 struct dcerpc_binding_handle *b = p->binding_handle;
101 struct clusapi_SetClusterName r;
104 r.in.NewClusterName = "wurst";
105 r.out.rpc_status = &rpc_status;
107 torture_assert_ntstatus_ok(tctx,
108 dcerpc_clusapi_SetClusterName_r(b, tctx, &r),
109 "SetClusterName failed");
110 torture_assert_werr_ok(tctx,
112 "SetClusterName failed");
117 static bool test_GetClusterName(struct torture_context *tctx,
118 struct dcerpc_pipe *p)
120 struct dcerpc_binding_handle *b = p->binding_handle;
121 struct clusapi_GetClusterName r;
122 const char *ClusterName;
123 const char *NodeName;
125 r.out.ClusterName = &ClusterName;
126 r.out.NodeName = &NodeName;
128 torture_assert_ntstatus_ok(tctx,
129 dcerpc_clusapi_GetClusterName_r(b, tctx, &r),
130 "GetClusterName failed");
131 torture_assert_werr_ok(tctx,
133 "GetClusterName failed");
138 static bool test_GetClusterVersion(struct torture_context *tctx,
139 struct dcerpc_pipe *p)
141 struct dcerpc_binding_handle *b = p->binding_handle;
142 struct clusapi_GetClusterVersion r;
143 uint16_t lpwMajorVersion;
144 uint16_t lpwMinorVersion;
145 uint16_t lpwBuildNumber;
146 const char *lpszVendorId;
147 const char *lpszCSDVersion;
149 r.out.lpwMajorVersion = &lpwMajorVersion;
150 r.out.lpwMinorVersion = &lpwMinorVersion;
151 r.out.lpwBuildNumber = &lpwBuildNumber;
152 r.out.lpszVendorId = &lpszVendorId;
153 r.out.lpszCSDVersion = &lpszCSDVersion;
155 torture_assert_ntstatus_ok(tctx,
156 dcerpc_clusapi_GetClusterVersion_r(b, tctx, &r),
157 "GetClusterVersion failed");
158 torture_assert_werr_equal(tctx,
160 WERR_CALL_NOT_IMPLEMENTED,
161 "GetClusterVersion failed");
166 static bool test_GetClusterVersion2(struct torture_context *tctx,
167 struct dcerpc_pipe *p)
169 struct dcerpc_binding_handle *b = p->binding_handle;
170 struct clusapi_GetClusterVersion2 r;
171 uint16_t lpwMajorVersion;
172 uint16_t lpwMinorVersion;
173 uint16_t lpwBuildNumber;
174 const char *lpszVendorId;
175 const char *lpszCSDVersion;
176 struct CLUSTER_OPERATIONAL_VERSION_INFO *ppClusterOpVerInfo;
179 r.out.lpwMajorVersion = &lpwMajorVersion;
180 r.out.lpwMinorVersion = &lpwMinorVersion;
181 r.out.lpwBuildNumber = &lpwBuildNumber;
182 r.out.lpszVendorId = &lpszVendorId;
183 r.out.lpszCSDVersion = &lpszCSDVersion;
184 r.out.ppClusterOpVerInfo = &ppClusterOpVerInfo;
185 r.out.rpc_status = &rpc_status;
187 torture_assert_ntstatus_ok(tctx,
188 dcerpc_clusapi_GetClusterVersion2_r(b, tctx, &r),
189 "GetClusterVersion2 failed");
190 torture_assert_werr_ok(tctx,
192 "GetClusterVersion2 failed");
197 static bool test_CreateEnum(struct torture_context *tctx,
198 struct dcerpc_pipe *p)
200 struct dcerpc_binding_handle *b = p->binding_handle;
201 struct clusapi_CreateEnum r;
202 uint32_t dwType = CLUSTER_ENUM_RESOURCE;
203 struct ENUM_LIST *ReturnEnum;
206 r.in.dwType = dwType;
207 r.out.ReturnEnum = &ReturnEnum;
208 r.out.rpc_status = &rpc_status;
210 torture_assert_ntstatus_ok(tctx,
211 dcerpc_clusapi_CreateEnum_r(b, tctx, &r),
212 "CreateEnum failed");
213 torture_assert_werr_ok(tctx,
215 "CreateEnum failed");
220 static bool test_GetQuorumResource(struct torture_context *tctx,
221 struct dcerpc_pipe *p)
223 struct dcerpc_binding_handle *b = p->binding_handle;
224 struct clusapi_GetQuorumResource r;
225 const char *lpszResourceName;
226 const char *lpszDeviceName;
227 uint32_t pdwMaxQuorumLogSize;
230 r.out.lpszResourceName = &lpszResourceName;
231 r.out.lpszDeviceName = &lpszDeviceName;
232 r.out.pdwMaxQuorumLogSize = &pdwMaxQuorumLogSize;
233 r.out.rpc_status = &rpc_status;
235 torture_assert_ntstatus_ok(tctx,
236 dcerpc_clusapi_GetQuorumResource_r(b, tctx, &r),
237 "GetQuorumResource failed");
238 torture_assert_werr_ok(tctx,
240 "GetQuorumResource failed");
245 static bool test_SetQuorumResource(struct torture_context *tctx,
246 struct dcerpc_pipe *p)
248 struct dcerpc_binding_handle *b = p->binding_handle;
249 struct clusapi_SetQuorumResource r;
250 const char *lpszDeviceName = "";
251 uint32_t dwMaxQuorumLogSize = 0;
253 struct policy_handle hResource;
255 /* we need to figure out how this call works and what we provide as
256 devicename and resource handle - gd
259 torture_skip(tctx, "skipping SetQuorumResource test");
261 ZERO_STRUCT(hResource);
263 r.in.hResource = hResource;
264 r.in.lpszDeviceName = lpszDeviceName;
265 r.in.dwMaxQuorumLogSize = dwMaxQuorumLogSize;
266 r.out.rpc_status = &rpc_status;
268 torture_assert_ntstatus_ok(tctx,
269 dcerpc_clusapi_SetQuorumResource_r(b, tctx, &r),
270 "SetQuorumResource failed");
271 torture_assert_werr_ok(tctx,
273 "SetQuorumResource failed");
278 static bool test_OpenResource_int(struct torture_context *tctx,
279 struct dcerpc_pipe *p,
280 struct policy_handle *hResource)
282 struct dcerpc_binding_handle *b = p->binding_handle;
283 struct clusapi_OpenResource r;
284 const char *lpszResourceName = "Cluster Name";
288 r.in.lpszResourceName = lpszResourceName;
289 r.out.rpc_status = &rpc_status;
290 r.out.Status = &Status;
291 r.out.hResource = hResource;
293 torture_assert_ntstatus_ok(tctx,
294 dcerpc_clusapi_OpenResource_r(b, tctx, &r),
295 "OpenResource failed");
296 torture_assert_werr_ok(tctx,
298 "OpenResource failed");
303 static bool test_CloseResource_int(struct torture_context *tctx,
304 struct dcerpc_pipe *p,
305 struct policy_handle *hResource)
307 struct dcerpc_binding_handle *b = p->binding_handle;
308 struct clusapi_CloseResource r;
310 r.in.Resource = hResource;
311 r.out.Resource = hResource;
313 torture_assert_ntstatus_ok(tctx,
314 dcerpc_clusapi_CloseResource_r(b, tctx, &r),
315 "CloseResource failed");
316 torture_assert_werr_ok(tctx,
318 "CloseResource failed");
320 ndr_policy_handle_empty(hResource),
321 "policy_handle non empty after CloseResource");
326 static bool test_OpenResource(struct torture_context *tctx,
327 struct dcerpc_pipe *p)
329 struct policy_handle hResource;
331 if (!test_OpenResource_int(tctx, p, &hResource)) {
335 test_CloseResource_int(tctx, p, &hResource);
340 static bool test_CloseResource(struct torture_context *tctx,
341 struct dcerpc_pipe *p)
343 struct policy_handle hResource;
345 if (!test_OpenResource_int(tctx, p, &hResource)) {
349 return test_CloseResource_int(tctx, p, &hResource);
352 static bool test_CreateResource_int(struct torture_context *tctx,
353 struct dcerpc_pipe *p,
354 struct policy_handle *hResource)
356 struct dcerpc_binding_handle *b = p->binding_handle;
357 struct clusapi_CreateResource r;
358 const char *lpszResourceName = "Cluster Name";
359 const char *lpszResourceType = "wurst";
362 struct policy_handle hGroup;
364 ZERO_STRUCT(hGroup); /* FIXME !!!!!! */
366 r.in.hGroup = hGroup;
367 r.in.lpszResourceName = lpszResourceName;
368 r.in.lpszResourceType = lpszResourceType;
369 r.in.dwFlags = 0; /* FIXME */
370 r.out.rpc_status = &rpc_status;
371 r.out.Status = &Status;
372 r.out.hResource = hResource;
374 torture_assert_ntstatus_ok(tctx,
375 dcerpc_clusapi_CreateResource_r(b, tctx, &r),
376 "CreateResource failed");
377 torture_assert_werr_ok(tctx,
379 "CreateResource failed");
384 static bool test_DeleteResource_int(struct torture_context *tctx,
385 struct dcerpc_pipe *p,
386 struct policy_handle *hResource)
388 struct dcerpc_binding_handle *b = p->binding_handle;
389 struct clusapi_DeleteResource r;
392 r.in.hResource = *hResource;
393 r.out.rpc_status = &rpc_status;
395 torture_assert_ntstatus_ok(tctx,
396 dcerpc_clusapi_DeleteResource_r(b, tctx, &r),
397 "DeleteResource failed");
398 torture_assert_werr_ok(tctx,
400 "DeleteResource failed");
405 static bool test_CreateResource(struct torture_context *tctx,
406 struct dcerpc_pipe *p)
408 struct policy_handle hResource;
410 if (!test_CreateResource_int(tctx, p, &hResource)) {
414 test_DeleteResource_int(tctx, p, &hResource);
419 static bool test_DeleteResource(struct torture_context *tctx,
420 struct dcerpc_pipe *p)
422 struct policy_handle hResource;
424 if (!test_CreateResource_int(tctx, p, &hResource)) {
428 return test_DeleteResource_int(tctx, p, &hResource);
431 static bool test_GetResourceState_int(struct torture_context *tctx,
432 struct dcerpc_pipe *p,
433 struct policy_handle *hResource)
435 struct dcerpc_binding_handle *b = p->binding_handle;
436 struct clusapi_GetResourceState r;
438 const char *NodeName;
439 const char *GroupName;
442 r.in.hResource = *hResource;
443 r.out.State = &State;
444 r.out.NodeName = &NodeName;
445 r.out.GroupName = &GroupName;
446 r.out.rpc_status = &rpc_status;
448 torture_assert_ntstatus_ok(tctx,
449 dcerpc_clusapi_GetResourceState_r(b, tctx, &r),
450 "GetResourceState failed");
451 torture_assert_werr_ok(tctx,
453 "GetResourceState failed");
458 static bool test_GetResourceState(struct torture_context *tctx,
459 struct dcerpc_pipe *p)
461 struct policy_handle hResource;
464 if (!test_OpenResource_int(tctx, p, &hResource)) {
468 ret = test_GetResourceState_int(tctx, p, &hResource);
470 test_CloseResource_int(tctx, p, &hResource);
475 static bool test_GetResourceId_int(struct torture_context *tctx,
476 struct dcerpc_pipe *p,
477 struct policy_handle *hResource)
479 struct dcerpc_binding_handle *b = p->binding_handle;
480 struct clusapi_GetResourceId r;
484 r.in.hResource = *hResource;
485 r.out.pGuid = &pGuid;
486 r.out.rpc_status = &rpc_status;
488 torture_assert_ntstatus_ok(tctx,
489 dcerpc_clusapi_GetResourceId_r(b, tctx, &r),
490 "GetResourceId failed");
491 torture_assert_werr_ok(tctx,
493 "GetResourceId failed");
498 static bool test_GetResourceId(struct torture_context *tctx,
499 struct dcerpc_pipe *p)
501 struct policy_handle hResource;
504 if (!test_OpenResource_int(tctx, p, &hResource)) {
508 ret = test_GetResourceId_int(tctx, p, &hResource);
510 test_CloseResource_int(tctx, p, &hResource);
515 static bool test_GetResourceType_int(struct torture_context *tctx,
516 struct dcerpc_pipe *p,
517 struct policy_handle *hResource)
519 struct dcerpc_binding_handle *b = p->binding_handle;
520 struct clusapi_GetResourceType r;
521 const char *lpszResourceType;
524 r.in.hResource = *hResource;
525 r.out.lpszResourceType = &lpszResourceType;
526 r.out.rpc_status = &rpc_status;
528 torture_assert_ntstatus_ok(tctx,
529 dcerpc_clusapi_GetResourceType_r(b, tctx, &r),
530 "GetResourceType failed");
531 torture_assert_werr_ok(tctx,
533 "GetResourceType failed");
538 static bool test_GetResourceType(struct torture_context *tctx,
539 struct dcerpc_pipe *p)
541 struct policy_handle hResource;
544 if (!test_OpenResource_int(tctx, p, &hResource)) {
548 ret = test_GetResourceType_int(tctx, p, &hResource);
550 test_CloseResource_int(tctx, p, &hResource);
555 static bool test_FailResource_int(struct torture_context *tctx,
556 struct dcerpc_pipe *p,
557 struct policy_handle *hResource)
559 struct dcerpc_binding_handle *b = p->binding_handle;
560 struct clusapi_FailResource r;
563 r.in.hResource = *hResource;
564 r.out.rpc_status = &rpc_status;
566 torture_assert_ntstatus_ok(tctx,
567 dcerpc_clusapi_FailResource_r(b, tctx, &r),
568 "FailResource failed");
569 torture_assert_werr_ok(tctx,
571 "FailResource failed");
576 static bool test_FailResource(struct torture_context *tctx,
577 struct dcerpc_pipe *p)
579 struct policy_handle hResource;
582 if (!test_OpenResource_int(tctx, p, &hResource)) {
586 ret = test_FailResource_int(tctx, p, &hResource);
588 test_CloseResource_int(tctx, p, &hResource);
593 static bool test_OnlineResource_int(struct torture_context *tctx,
594 struct dcerpc_pipe *p,
595 struct policy_handle *hResource)
597 struct dcerpc_binding_handle *b = p->binding_handle;
598 struct clusapi_OnlineResource r;
601 r.in.hResource = *hResource;
602 r.out.rpc_status = &rpc_status;
604 torture_assert_ntstatus_ok(tctx,
605 dcerpc_clusapi_OnlineResource_r(b, tctx, &r),
606 "OnlineResource failed");
607 torture_assert_werr_ok(tctx,
609 "OnlineResource failed");
614 static bool test_OnlineResource(struct torture_context *tctx,
615 struct dcerpc_pipe *p)
617 struct policy_handle hResource;
620 if (!test_OpenResource_int(tctx, p, &hResource)) {
624 ret = test_OnlineResource_int(tctx, p, &hResource);
626 test_CloseResource_int(tctx, p, &hResource);
631 static bool test_OfflineResource_int(struct torture_context *tctx,
632 struct dcerpc_pipe *p,
633 struct policy_handle *hResource)
635 struct dcerpc_binding_handle *b = p->binding_handle;
636 struct clusapi_OfflineResource r;
639 r.in.hResource = *hResource;
640 r.out.rpc_status = &rpc_status;
642 torture_assert_ntstatus_ok(tctx,
643 dcerpc_clusapi_OfflineResource_r(b, tctx, &r),
644 "OfflineResource failed");
645 torture_assert_werr_ok(tctx,
647 "OfflineResource failed");
652 static bool test_OfflineResource(struct torture_context *tctx,
653 struct dcerpc_pipe *p)
655 struct policy_handle hResource;
658 if (!test_OpenResource_int(tctx, p, &hResource)) {
662 ret = test_OfflineResource_int(tctx, p, &hResource);
664 test_CloseResource_int(tctx, p, &hResource);
669 static bool test_CreateResEnum(struct torture_context *tctx,
670 struct dcerpc_pipe *p)
672 struct dcerpc_binding_handle *b = p->binding_handle;
673 struct clusapi_CreateResEnum r;
674 struct policy_handle hResource;
675 uint32_t dwType = CLUSTER_ENUM_RESOURCE;
676 struct ENUM_LIST *ReturnEnum;
680 test_OpenResource_int(tctx, p, &hResource),
681 "OpenResource failed");
683 r.in.hResource = hResource;
684 r.in.dwType = dwType;
685 r.out.ReturnEnum = &ReturnEnum;
686 r.out.rpc_status = &rpc_status;
688 torture_assert_ntstatus_ok(tctx,
689 dcerpc_clusapi_CreateResEnum_r(b, tctx, &r),
690 "CreateResEnum failed");
691 torture_assert_werr_ok(tctx,
693 "CreateResEnum failed");
695 test_CloseResource_int(tctx, p, &hResource);
700 struct torture_suite *torture_rpc_clusapi(TALLOC_CTX *mem_ctx)
702 struct torture_rpc_tcase *tcase;
703 struct torture_suite *suite = torture_suite_create(mem_ctx, "clusapi");
704 struct torture_test *test;
706 tcase = torture_suite_add_rpc_iface_tcase(suite, "clusapi",
709 torture_rpc_tcase_add_test(tcase, "OpenCluster",
711 torture_rpc_tcase_add_test(tcase, "CloseCluster",
713 torture_rpc_tcase_add_test(tcase, "SetClusterName",
714 test_SetClusterName);
715 torture_rpc_tcase_add_test(tcase, "GetClusterName",
716 test_GetClusterName);
717 torture_rpc_tcase_add_test(tcase, "GetClusterVersion",
718 test_GetClusterVersion);
719 torture_rpc_tcase_add_test(tcase, "CreateEnum",
721 torture_rpc_tcase_add_test(tcase, "GetQuorumResource",
722 test_GetQuorumResource);
723 torture_rpc_tcase_add_test(tcase, "SetQuorumResource",
724 test_SetQuorumResource);
725 torture_rpc_tcase_add_test(tcase, "OpenResource",
727 torture_rpc_tcase_add_test(tcase, "CloseResource",
729 torture_rpc_tcase_add_test(tcase, "CreateResource",
730 test_CreateResource);
731 torture_rpc_tcase_add_test(tcase, "DeleteResource",
732 test_DeleteResource);
733 torture_rpc_tcase_add_test(tcase, "GetResourceState",
734 test_GetResourceState);
735 torture_rpc_tcase_add_test(tcase, "GetResourceId",
737 torture_rpc_tcase_add_test(tcase, "GetResourceType",
738 test_GetResourceType);
739 test = torture_rpc_tcase_add_test(tcase, "FailResource",
741 test->dangerous = true;
742 torture_rpc_tcase_add_test(tcase, "OnlineResource",
743 test_OnlineResource);
744 test = torture_rpc_tcase_add_test(tcase, "OfflineResource",
745 test_OfflineResource);
746 test->dangerous = true;
748 torture_rpc_tcase_add_test(tcase, "GetClusterVersion2",
749 test_GetClusterVersion2);
750 torture_rpc_tcase_add_test(tcase, "CreateResEnum",