LCOV - code coverage report
Current view: top level - source4/torture/rpc - clusapi.c (source / functions) Hit Total Coverage
Test: coverage report for master 2f515e9b Lines: 129 1966 6.6 %
Date: 2024-04-21 15:09:00 Functions: 10 156 6.4 %

          Line data    Source code
       1             : /*
       2             :    Unix SMB/CIFS implementation.
       3             :    test suite for clusapi rpc operations
       4             : 
       5             :    Copyright (C) Günther Deschner 2015
       6             : 
       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.
      11             : 
      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.
      16             : 
      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/>.
      19             : */
      20             : 
      21             : #include "includes.h"
      22             : #include "librpc/gen_ndr/ndr_clusapi_c.h"
      23             : #include "torture/rpc/torture_rpc.h"
      24             : #include "param/param.h"
      25             : #include "libcli/registry/util_reg.h"
      26             : 
      27             : struct torture_clusapi_context {
      28             :         struct dcerpc_pipe *p;
      29             :         const char *NodeName;
      30             :         const char *ClusterName;
      31             :         uint16_t lpwMajorVersion;
      32             :         uint16_t lpwMinorVersion;
      33             :         uint16_t lpwBuildNumber;
      34             : };
      35             : 
      36           0 : static bool test_OpenCluster_int(struct torture_context *tctx,
      37             :                                  struct dcerpc_pipe *p,
      38             :                                  struct policy_handle *Cluster)
      39             : {
      40           0 :         struct dcerpc_binding_handle *b = p->binding_handle;
      41           0 :         struct clusapi_OpenCluster r;
      42           0 :         WERROR Status;
      43             : 
      44           0 :         r.out.Status = &Status;
      45           0 :         r.out.Cluster = Cluster;
      46             : 
      47           0 :         torture_assert_ntstatus_ok(tctx,
      48             :                 dcerpc_clusapi_OpenCluster_r(b, tctx, &r),
      49             :                 "OpenCluster failed");
      50           0 :         torture_assert_werr_ok(tctx,
      51             :                 *r.out.Status,
      52             :                 "OpenCluster failed");
      53             : 
      54           0 :         return true;
      55             : }
      56             : 
      57           0 : static bool test_OpenClusterEx_int(struct torture_context *tctx,
      58             :                                    struct dcerpc_pipe *p,
      59             :                                    struct policy_handle *Cluster)
      60             : {
      61           0 :         struct dcerpc_binding_handle *b = p->binding_handle;
      62           0 :         struct clusapi_OpenClusterEx r;
      63           0 :         uint32_t lpdwGrantedAccess;
      64           0 :         WERROR Status;
      65             : 
      66           0 :         r.in.dwDesiredAccess = SEC_FLAG_MAXIMUM_ALLOWED;
      67           0 :         r.out.lpdwGrantedAccess = &lpdwGrantedAccess;
      68           0 :         r.out.Status = &Status;
      69           0 :         r.out.hCluster = Cluster;
      70             : 
      71           0 :         torture_assert_ntstatus_ok(tctx,
      72             :                 dcerpc_clusapi_OpenClusterEx_r(b, tctx, &r),
      73             :                 "OpenClusterEx failed");
      74           0 :         torture_assert_werr_ok(tctx,
      75             :                 *r.out.Status,
      76             :                 "OpenClusterEx failed");
      77             : 
      78           0 :         return true;
      79             : }
      80             : 
      81           0 : static bool test_CloseCluster_int(struct torture_context *tctx,
      82             :                                   struct dcerpc_pipe *p,
      83             :                                   struct policy_handle *Cluster)
      84             : {
      85           0 :         struct dcerpc_binding_handle *b = p->binding_handle;
      86           0 :         struct clusapi_CloseCluster r;
      87             : 
      88           0 :         r.in.Cluster = Cluster;
      89           0 :         r.out.Cluster = Cluster;
      90             : 
      91           0 :         torture_assert_ntstatus_ok(tctx,
      92             :                 dcerpc_clusapi_CloseCluster_r(b, tctx, &r),
      93             :                 "CloseCluster failed");
      94           0 :         torture_assert_werr_ok(tctx,
      95             :                 r.out.result,
      96             :                 "CloseCluster failed");
      97             : 
      98           0 :         torture_assert(tctx,
      99             :                 ndr_policy_handle_empty(Cluster),
     100             :                 "policy_handle non empty after CloseCluster");
     101             : 
     102           0 :         return true;
     103             : }
     104             : 
     105           0 : static bool test_OpenCluster(struct torture_context *tctx,
     106             :                              void *data)
     107             : {
     108           0 :         struct torture_clusapi_context *t =
     109           0 :                 talloc_get_type_abort(data, struct torture_clusapi_context);
     110           0 :         struct policy_handle Cluster;
     111             : 
     112           0 :         if (!test_OpenCluster_int(tctx, t->p, &Cluster)) {
     113           0 :                 return false;
     114             :         }
     115             : 
     116           0 :         test_CloseCluster_int(tctx, t->p, &Cluster);
     117             : 
     118           0 :         return true;
     119             : }
     120             : 
     121           0 : static bool test_OpenClusterEx(struct torture_context *tctx,
     122             :                                void *data)
     123             : {
     124           0 :         struct torture_clusapi_context *t =
     125           0 :                 talloc_get_type_abort(data, struct torture_clusapi_context);
     126           0 :         struct policy_handle Cluster;
     127             : 
     128           0 :         if (!test_OpenClusterEx_int(tctx, t->p, &Cluster)) {
     129           0 :                 return false;
     130             :         }
     131             : 
     132           0 :         test_CloseCluster_int(tctx, t->p, &Cluster);
     133             : 
     134           0 :         return true;
     135             : }
     136             : 
     137           0 : static bool test_CloseCluster(struct torture_context *tctx,
     138             :                               void *data)
     139             : {
     140           0 :         struct torture_clusapi_context *t =
     141           0 :                 talloc_get_type_abort(data, struct torture_clusapi_context);
     142           0 :         struct policy_handle Cluster;
     143             : 
     144           0 :         if (!test_OpenCluster_int(tctx, t->p, &Cluster)) {
     145           0 :                 return false;
     146             :         }
     147             : 
     148           0 :         return test_CloseCluster_int(tctx, t->p, &Cluster);
     149             : }
     150             : 
     151           0 : static bool test_GetClusterName_int(struct torture_context *tctx,
     152             :                                     struct dcerpc_pipe *p,
     153             :                                     const char **ClusterName)
     154             : {
     155           0 :         struct dcerpc_binding_handle *b = p->binding_handle;
     156           0 :         struct clusapi_GetClusterName r;
     157           0 :         const char *NodeName;
     158             : 
     159           0 :         r.out.ClusterName = ClusterName;
     160           0 :         r.out.NodeName = &NodeName;
     161             : 
     162           0 :         torture_assert_ntstatus_ok(tctx,
     163             :                 dcerpc_clusapi_GetClusterName_r(b, tctx, &r),
     164             :                 "GetClusterName failed");
     165           0 :         torture_assert_werr_ok(tctx,
     166             :                 r.out.result,
     167             :                 "GetClusterName failed");
     168             : 
     169           0 :         return true;
     170             : }
     171             : 
     172           0 : static bool test_SetClusterName(struct torture_context *tctx,
     173             :                                 void *data)
     174             : {
     175           0 :         struct torture_clusapi_context *t =
     176           0 :                 talloc_get_type_abort(data, struct torture_clusapi_context);
     177           0 :         struct dcerpc_binding_handle *b = t->p->binding_handle;
     178           0 :         struct clusapi_SetClusterName r;
     179           0 :         const char *NewClusterName;
     180           0 :         WERROR rpc_status;
     181             : 
     182           0 :         torture_assert(tctx,
     183             :                 test_GetClusterName_int(tctx, t->p, &NewClusterName),
     184             :                 "failed to query old ClusterName");
     185             : 
     186           0 :         r.in.NewClusterName = NewClusterName;
     187           0 :         r.out.rpc_status = &rpc_status;
     188             : 
     189           0 :         torture_assert_ntstatus_ok(tctx,
     190             :                 dcerpc_clusapi_SetClusterName_r(b, tctx, &r),
     191             :                 "SetClusterName failed");
     192           0 :         torture_assert_werr_equal(tctx,
     193             :                 r.out.result,
     194             :                 WERR_RESOURCE_PROPERTIES_STORED,
     195             :                 "SetClusterName failed");
     196             : 
     197           0 :         return true;
     198             : }
     199             : 
     200           0 : static bool test_GetClusterName(struct torture_context *tctx,
     201             :                                 void *data)
     202             : {
     203           0 :         struct torture_clusapi_context *t =
     204           0 :                 talloc_get_type_abort(data, struct torture_clusapi_context);
     205           0 :         const char *ClusterName;
     206             : 
     207           0 :         return test_GetClusterName_int(tctx, t->p, &ClusterName);
     208             : }
     209             : 
     210           0 : static bool test_GetClusterVersion(struct torture_context *tctx,
     211             :                                    void *data)
     212             : {
     213           0 :         struct torture_clusapi_context *t =
     214           0 :                 talloc_get_type_abort(data, struct torture_clusapi_context);
     215           0 :         struct dcerpc_binding_handle *b = t->p->binding_handle;
     216           0 :         struct clusapi_GetClusterVersion r;
     217           0 :         uint16_t lpwMajorVersion;
     218           0 :         uint16_t lpwMinorVersion;
     219           0 :         uint16_t lpwBuildNumber;
     220           0 :         const char *lpszVendorId;
     221           0 :         const char *lpszCSDVersion;
     222             : 
     223           0 :         r.out.lpwMajorVersion = &lpwMajorVersion;
     224           0 :         r.out.lpwMinorVersion = &lpwMinorVersion;
     225           0 :         r.out.lpwBuildNumber = &lpwBuildNumber;
     226           0 :         r.out.lpszVendorId = &lpszVendorId;
     227           0 :         r.out.lpszCSDVersion = &lpszCSDVersion;
     228             : 
     229           0 :         torture_assert_ntstatus_ok(tctx,
     230             :                 dcerpc_clusapi_GetClusterVersion_r(b, tctx, &r),
     231             :                 "GetClusterVersion failed");
     232           0 :         torture_assert_werr_equal(tctx,
     233             :                 r.out.result,
     234             :                 WERR_CALL_NOT_IMPLEMENTED,
     235             :                 "GetClusterVersion failed");
     236             : 
     237           0 :         return true;
     238             : }
     239             : 
     240           0 : static bool test_GetClusterVersion2(struct torture_context *tctx,
     241             :                                     void *data)
     242             : {
     243           0 :         struct torture_clusapi_context *t =
     244           0 :                 talloc_get_type_abort(data, struct torture_clusapi_context);
     245           0 :         struct dcerpc_binding_handle *b = t->p->binding_handle;
     246           0 :         struct clusapi_GetClusterVersion2 r;
     247           0 :         uint16_t lpwMajorVersion;
     248           0 :         uint16_t lpwMinorVersion;
     249           0 :         uint16_t lpwBuildNumber;
     250           0 :         const char *lpszVendorId;
     251           0 :         const char *lpszCSDVersion;
     252           0 :         struct CLUSTER_OPERATIONAL_VERSION_INFO *ppClusterOpVerInfo;
     253           0 :         WERROR rpc_status;
     254             : 
     255           0 :         r.out.lpwMajorVersion = &lpwMajorVersion;
     256           0 :         r.out.lpwMinorVersion = &lpwMinorVersion;
     257           0 :         r.out.lpwBuildNumber = &lpwBuildNumber;
     258           0 :         r.out.lpszVendorId = &lpszVendorId;
     259           0 :         r.out.lpszCSDVersion = &lpszCSDVersion;
     260           0 :         r.out.ppClusterOpVerInfo = &ppClusterOpVerInfo;
     261           0 :         r.out.rpc_status = &rpc_status;
     262             : 
     263           0 :         torture_assert_ntstatus_ok(tctx,
     264             :                 dcerpc_clusapi_GetClusterVersion2_r(b, tctx, &r),
     265             :                 "GetClusterVersion2 failed");
     266           0 :         torture_assert_werr_ok(tctx,
     267             :                 r.out.result,
     268             :                 "GetClusterVersion2 failed");
     269             : 
     270           0 :         return true;
     271             : }
     272             : 
     273           0 : static bool test_CreateEnum(struct torture_context *tctx,
     274             :                             void *data)
     275             : {
     276           0 :         struct torture_clusapi_context *t =
     277           0 :                 talloc_get_type_abort(data, struct torture_clusapi_context);
     278           0 :         struct dcerpc_binding_handle *b = t->p->binding_handle;
     279           0 :         struct clusapi_CreateEnum r;
     280           0 :         uint32_t dwType[] = {
     281             :                 CLUSTER_ENUM_NODE,
     282             :                 CLUSTER_ENUM_RESTYPE,
     283             :                 CLUSTER_ENUM_RESOURCE,
     284             :                 CLUSTER_ENUM_GROUP,
     285             :                 CLUSTER_ENUM_NETWORK,
     286             :                 CLUSTER_ENUM_NETINTERFACE,
     287             :                 CLUSTER_ENUM_INTERNAL_NETWORK,
     288             :                 CLUSTER_ENUM_SHARED_VOLUME_RESOURCE
     289             :         };
     290           0 :         uint32_t dwType_invalid[] = {
     291             :                 0x00000040,
     292             :                 0x00000080,
     293             :                 0x00000100 /* and many more ... */
     294             :         };
     295           0 :         struct ENUM_LIST *ReturnEnum;
     296           0 :         WERROR rpc_status;
     297           0 :         int i;
     298             : 
     299           0 :         for (i=0; i < ARRAY_SIZE(dwType); i++) {
     300             : 
     301           0 :                 r.in.dwType = dwType[i];
     302           0 :                 r.out.ReturnEnum = &ReturnEnum;
     303           0 :                 r.out.rpc_status = &rpc_status;
     304             : 
     305           0 :                 torture_assert_ntstatus_ok(tctx,
     306             :                         dcerpc_clusapi_CreateEnum_r(b, tctx, &r),
     307             :                         "CreateEnum failed");
     308           0 :                 torture_assert_werr_ok(tctx,
     309             :                         r.out.result,
     310             :                         "CreateEnum failed");
     311             :         }
     312             : 
     313           0 :         for (i=0; i < ARRAY_SIZE(dwType_invalid); i++) {
     314             : 
     315           0 :                 r.in.dwType = dwType_invalid[i];
     316           0 :                 r.out.ReturnEnum = &ReturnEnum;
     317           0 :                 r.out.rpc_status = &rpc_status;
     318             : 
     319           0 :                 torture_assert_ntstatus_ok(tctx,
     320             :                         dcerpc_clusapi_CreateEnum_r(b, tctx, &r),
     321             :                         "CreateEnum failed");
     322           0 :                 torture_assert_werr_equal(tctx,
     323             :                         r.out.result,
     324             :                         WERR_INVALID_PARAMETER,
     325             :                         "CreateEnum failed");
     326             :         }
     327             : 
     328           0 :         return true;
     329             : }
     330             : 
     331           0 : static bool test_CreateEnumEx_int(struct torture_context *tctx,
     332             :                                   struct dcerpc_pipe *p,
     333             :                                   struct policy_handle *Cluster)
     334             : {
     335           0 :         struct dcerpc_binding_handle *b = p->binding_handle;
     336           0 :         struct clusapi_CreateEnumEx r;
     337           0 :         uint32_t dwType[] = {
     338             :                 CLUSTER_ENUM_NODE,
     339             :                 CLUSTER_ENUM_RESTYPE,
     340             :                 CLUSTER_ENUM_RESOURCE,
     341             :                 CLUSTER_ENUM_GROUP,
     342             :                 CLUSTER_ENUM_NETWORK,
     343             :                 CLUSTER_ENUM_NETINTERFACE,
     344             :                 CLUSTER_ENUM_INTERNAL_NETWORK,
     345             :                 CLUSTER_ENUM_SHARED_VOLUME_RESOURCE
     346             :         };
     347           0 :         uint32_t dwType_invalid[] = {
     348             :                 0x00000040,
     349             :                 0x00000080,
     350             :                 0x00000100 /* and many more ... */
     351             :         };
     352           0 :         struct ENUM_LIST *ReturnIdEnum;
     353           0 :         struct ENUM_LIST *ReturnNameEnum;
     354           0 :         WERROR rpc_status;
     355           0 :         int i;
     356             : 
     357           0 :         for (i=0; i < ARRAY_SIZE(dwType); i++) {
     358             : 
     359           0 :                 r.in.hCluster = *Cluster;
     360           0 :                 r.in.dwType = dwType[i];
     361           0 :                 r.in.dwOptions = 0;
     362           0 :                 r.out.ReturnIdEnum = &ReturnIdEnum;
     363           0 :                 r.out.ReturnNameEnum = &ReturnNameEnum;
     364           0 :                 r.out.rpc_status = &rpc_status;
     365             : 
     366           0 :                 torture_assert_ntstatus_ok(tctx,
     367             :                         dcerpc_clusapi_CreateEnumEx_r(b, tctx, &r),
     368             :                         "CreateEnumEx failed");
     369           0 :                 torture_assert_werr_ok(tctx,
     370             :                         r.out.result,
     371             :                         "CreateEnumEx failed");
     372             :         }
     373             : 
     374           0 :         for (i=0; i < ARRAY_SIZE(dwType_invalid); i++) {
     375             : 
     376           0 :                 r.in.hCluster = *Cluster;
     377           0 :                 r.in.dwType = dwType_invalid[i];
     378           0 :                 r.in.dwOptions = 0;
     379           0 :                 r.out.ReturnIdEnum = &ReturnIdEnum;
     380           0 :                 r.out.ReturnNameEnum = &ReturnNameEnum;
     381           0 :                 r.out.rpc_status = &rpc_status;
     382             : 
     383           0 :                 torture_assert_ntstatus_ok(tctx,
     384             :                         dcerpc_clusapi_CreateEnumEx_r(b, tctx, &r),
     385             :                         "CreateEnumEx failed");
     386           0 :                 torture_assert_werr_equal(tctx,
     387             :                         r.out.result,
     388             :                         WERR_INVALID_PARAMETER,
     389             :                         "CreateEnumEx failed");
     390             :         }
     391             : 
     392           0 :         return true;
     393             : }
     394             : 
     395           0 : static bool test_CreateEnumEx(struct torture_context *tctx,
     396             :                               void *data)
     397             : {
     398           0 :         struct torture_clusapi_context *t =
     399           0 :                 talloc_get_type_abort(data, struct torture_clusapi_context);
     400           0 :         struct policy_handle Cluster;
     401           0 :         bool ret;
     402             : 
     403           0 :         if (!test_OpenCluster_int(tctx, t->p, &Cluster)) {
     404           0 :                 return false;
     405             :         }
     406             : 
     407           0 :         ret = test_CreateEnumEx_int(tctx, t->p, &Cluster);
     408             : 
     409           0 :         test_CloseCluster_int(tctx, t->p, &Cluster);
     410             : 
     411           0 :         return ret;
     412             : }
     413             : 
     414             : 
     415           0 : static bool test_GetQuorumResource(struct torture_context *tctx,
     416             :                                    void *data)
     417             : {
     418           0 :         struct torture_clusapi_context *t =
     419           0 :                 talloc_get_type_abort(data, struct torture_clusapi_context);
     420           0 :         struct dcerpc_binding_handle *b = t->p->binding_handle;
     421           0 :         struct clusapi_GetQuorumResource r;
     422           0 :         const char *lpszResourceName;
     423           0 :         const char *lpszDeviceName;
     424           0 :         uint32_t pdwMaxQuorumLogSize;
     425           0 :         WERROR rpc_status;
     426             : 
     427           0 :         r.out.lpszResourceName = &lpszResourceName;
     428           0 :         r.out.lpszDeviceName = &lpszDeviceName;
     429           0 :         r.out.pdwMaxQuorumLogSize = &pdwMaxQuorumLogSize;
     430           0 :         r.out.rpc_status = &rpc_status;
     431             : 
     432           0 :         torture_assert_ntstatus_ok(tctx,
     433             :                 dcerpc_clusapi_GetQuorumResource_r(b, tctx, &r),
     434             :                 "GetQuorumResource failed");
     435           0 :         torture_assert_werr_ok(tctx,
     436             :                 r.out.result,
     437             :                 "GetQuorumResource failed");
     438             : 
     439           0 :         return true;
     440             : }
     441             : 
     442           0 : static bool test_SetQuorumResource(struct torture_context *tctx,
     443             :                                    void *data)
     444             : {
     445           0 :         struct torture_clusapi_context *t =
     446           0 :                 talloc_get_type_abort(data, struct torture_clusapi_context);
     447           0 :         struct dcerpc_binding_handle *b = t->p->binding_handle;
     448           0 :         struct clusapi_SetQuorumResource r;
     449           0 :         const char *lpszDeviceName = "";
     450           0 :         uint32_t dwMaxQuorumLogSize = 0;
     451           0 :         WERROR rpc_status;
     452           0 :         struct policy_handle hResource;
     453             : 
     454             :         /* we need to figure out how this call works and what we provide as
     455             :            devicename and resource handle - gd
     456             :          */
     457             : 
     458           0 :         torture_skip(tctx, "skipping SetQuorumResource test");
     459             : 
     460             :         ZERO_STRUCT(hResource);
     461             : 
     462             :         r.in.hResource = hResource;
     463             :         r.in.lpszDeviceName = lpszDeviceName;
     464             :         r.in.dwMaxQuorumLogSize = dwMaxQuorumLogSize;
     465             :         r.out.rpc_status = &rpc_status;
     466             : 
     467             :         torture_assert_ntstatus_ok(tctx,
     468             :                 dcerpc_clusapi_SetQuorumResource_r(b, tctx, &r),
     469             :                 "SetQuorumResource failed");
     470             :         torture_assert_werr_ok(tctx,
     471             :                 r.out.result,
     472             :                 "SetQuorumResource failed");
     473             : 
     474             :         return true;
     475             : }
     476             : 
     477           0 : static bool test_OpenResource_int_exp(struct torture_context *tctx,
     478             :                                       struct dcerpc_pipe *p,
     479             :                                       const char *lpszResourceName,
     480             :                                       struct policy_handle *hResource,
     481             :                                       WERROR expected_Status,
     482             :                                       WERROR expected_rpc_status)
     483             : {
     484           0 :         struct dcerpc_binding_handle *b = p->binding_handle;
     485           0 :         struct clusapi_OpenResource r;
     486           0 :         WERROR Status;
     487           0 :         WERROR rpc_status;
     488             : 
     489           0 :         r.in.lpszResourceName = lpszResourceName;
     490           0 :         r.out.rpc_status = &rpc_status;
     491           0 :         r.out.Status = &Status;
     492           0 :         r.out.hResource = hResource;
     493             : 
     494           0 :         torture_assert_ntstatus_ok(tctx,
     495             :                 dcerpc_clusapi_OpenResource_r(b, tctx, &r),
     496             :                 "OpenResource failed");
     497           0 :         torture_assert_werr_equal(tctx,
     498             :                 *r.out.Status, expected_Status,
     499             :                 "OpenResource failed");
     500           0 :         torture_assert_werr_equal(tctx,
     501             :                 *r.out.rpc_status, expected_rpc_status,
     502             :                 "OpenResource failed");
     503             : 
     504           0 :         return true;
     505             : }
     506             : 
     507           0 : bool test_OpenResource_int(struct torture_context *tctx,
     508             :                            struct dcerpc_pipe *p,
     509             :                            const char *lpszResourceName,
     510             :                            struct policy_handle *hResource)
     511             : {
     512           0 :         return test_OpenResource_int_exp(tctx, p,
     513             :                                          lpszResourceName,
     514             :                                          hResource,
     515           0 :                                          WERR_OK, WERR_OK);
     516             : }
     517             : 
     518           0 : static bool test_OpenResourceEx_int(struct torture_context *tctx,
     519             :                                     struct dcerpc_pipe *p,
     520             :                                     const char *lpszResourceName,
     521             :                                     struct policy_handle *hResource)
     522             : {
     523           0 :         struct dcerpc_binding_handle *b = p->binding_handle;
     524           0 :         struct clusapi_OpenResourceEx r;
     525           0 :         uint32_t lpdwGrantedAccess;
     526           0 :         WERROR Status;
     527           0 :         WERROR rpc_status;
     528             : 
     529           0 :         r.in.lpszResourceName = lpszResourceName;
     530           0 :         r.in.dwDesiredAccess = SEC_FLAG_MAXIMUM_ALLOWED;
     531           0 :         r.out.lpdwGrantedAccess = &lpdwGrantedAccess;
     532           0 :         r.out.rpc_status = &rpc_status;
     533           0 :         r.out.Status = &Status;
     534           0 :         r.out.hResource = hResource;
     535             : 
     536           0 :         torture_assert_ntstatus_ok(tctx,
     537             :                 dcerpc_clusapi_OpenResourceEx_r(b, tctx, &r),
     538             :                 "OpenResourceEx failed");
     539           0 :         torture_assert_werr_ok(tctx,
     540             :                 *r.out.Status,
     541             :                 "OpenResourceEx failed");
     542             : 
     543           0 :         return true;
     544             : }
     545             : 
     546           0 : bool test_CloseResource_int(struct torture_context *tctx,
     547             :                             struct dcerpc_pipe *p,
     548             :                             struct policy_handle *hResource)
     549             : {
     550           0 :         struct dcerpc_binding_handle *b = p->binding_handle;
     551           0 :         struct clusapi_CloseResource r;
     552             : 
     553           0 :         r.in.Resource = hResource;
     554           0 :         r.out.Resource = hResource;
     555             : 
     556           0 :         torture_assert_ntstatus_ok(tctx,
     557             :                 dcerpc_clusapi_CloseResource_r(b, tctx, &r),
     558             :                 "CloseResource failed");
     559           0 :         torture_assert_werr_ok(tctx,
     560             :                 r.out.result,
     561             :                 "CloseResource failed");
     562           0 :         torture_assert(tctx,
     563             :                 ndr_policy_handle_empty(hResource),
     564             :                 "policy_handle non empty after CloseResource");
     565             : 
     566           0 :         return true;
     567             : }
     568             : 
     569           0 : static bool test_OpenResource(struct torture_context *tctx,
     570             :                               void *data)
     571             : {
     572           0 :         struct torture_clusapi_context *t =
     573           0 :                 talloc_get_type_abort(data, struct torture_clusapi_context);
     574           0 :         struct policy_handle hResource;
     575             : 
     576           0 :         if (!test_OpenResource_int(tctx, t->p, "Cluster Name", &hResource)) {
     577           0 :                 return false;
     578             :         }
     579             : 
     580           0 :         test_CloseResource_int(tctx, t->p, &hResource);
     581             : 
     582           0 :         if (!test_OpenResource_int_exp(tctx, t->p, "", &hResource, WERR_RESOURCE_NOT_FOUND, WERR_OK)) {
     583           0 :                 return false;
     584             :         }
     585             : 
     586           0 :         torture_assert(tctx,
     587             :                 ndr_policy_handle_empty(&hResource),
     588             :                 "expected empty policy handle");
     589             : 
     590           0 :         if (!test_OpenResource_int_exp(tctx, t->p, "jfUF38fjSNcfn", &hResource, WERR_RESOURCE_NOT_FOUND, WERR_OK)) {
     591           0 :                 return false;
     592             :         }
     593             : 
     594           0 :         torture_assert(tctx,
     595             :                 ndr_policy_handle_empty(&hResource),
     596             :                 "expected empty policy handle");
     597             : 
     598           0 :         return true;
     599             : }
     600             : 
     601           0 : static bool test_OpenResourceEx(struct torture_context *tctx,
     602             :                                 void *data)
     603             : {
     604           0 :         struct torture_clusapi_context *t =
     605           0 :                 talloc_get_type_abort(data, struct torture_clusapi_context);
     606           0 :         struct policy_handle hResource;
     607             : 
     608           0 :         if (!test_OpenResourceEx_int(tctx, t->p, "Cluster Name", &hResource)) {
     609           0 :                 return false;
     610             :         }
     611             : 
     612           0 :         test_CloseResource_int(tctx, t->p, &hResource);
     613             : 
     614           0 :         return true;
     615             : }
     616             : 
     617             : 
     618           0 : static bool test_CloseResource(struct torture_context *tctx,
     619             :                                void *data)
     620             : {
     621           0 :         struct torture_clusapi_context *t =
     622           0 :                 talloc_get_type_abort(data, struct torture_clusapi_context);
     623           0 :         struct policy_handle hResource;
     624             : 
     625           0 :         if (!test_OpenResource_int(tctx, t->p, "Cluster Name", &hResource)) {
     626           0 :                 return false;
     627             :         }
     628             : 
     629           0 :         return test_CloseResource_int(tctx, t->p, &hResource);
     630             : }
     631             : 
     632             : static bool test_OpenGroup_int(struct torture_context *tctx,
     633             :                                struct dcerpc_pipe *p,
     634             :                                const char *lpszGroupName,
     635             :                                struct policy_handle *hGroup);
     636             : static bool test_CloseGroup_int(struct torture_context *tctx,
     637             :                                 struct dcerpc_pipe *p,
     638             :                                 struct policy_handle *Group);
     639             : 
     640           0 : static bool test_CreateResource_int(struct torture_context *tctx,
     641             :                                     struct dcerpc_pipe *p,
     642             :                                     struct policy_handle *hResource)
     643             : {
     644           0 :         struct dcerpc_binding_handle *b = p->binding_handle;
     645           0 :         struct clusapi_CreateResource r;
     646           0 :         const char *lpszResourceName = "wurst";
     647           0 :         const char *lpszResourceType = "Generic Service";
     648           0 :         WERROR Status;
     649           0 :         WERROR rpc_status;
     650           0 :         struct policy_handle hGroup;
     651             : 
     652           0 :         torture_assert(tctx,
     653             :                 test_OpenGroup_int(tctx, p, "Cluster Group", &hGroup),
     654             :                 "failed to open group");
     655             : 
     656           0 :         r.in.hGroup = hGroup;
     657           0 :         r.in.lpszResourceName = lpszResourceName;
     658           0 :         r.in.lpszResourceType = lpszResourceType;
     659           0 :         r.in.dwFlags = CLUSTER_RESOURCE_DEFAULT_MONITOR;
     660           0 :         r.out.rpc_status = &rpc_status;
     661           0 :         r.out.Status = &Status;
     662           0 :         r.out.hResource = hResource;
     663             : 
     664           0 :         torture_assert_ntstatus_ok(tctx,
     665             :                 dcerpc_clusapi_CreateResource_r(b, tctx, &r),
     666             :                 "CreateResource failed");
     667           0 :         torture_assert_werr_ok(tctx,
     668             :                 *r.out.Status,
     669             :                 "CreateResource failed");
     670             : 
     671           0 :         test_CloseGroup_int(tctx, p, &hGroup);
     672             : 
     673           0 :         return true;
     674             : }
     675             : 
     676           0 : static bool test_DeleteResource_int(struct torture_context *tctx,
     677             :                                     struct dcerpc_pipe *p,
     678             :                                     struct policy_handle *hResource)
     679             : {
     680           0 :         struct dcerpc_binding_handle *b = p->binding_handle;
     681           0 :         struct clusapi_DeleteResource r;
     682           0 :         WERROR rpc_status;
     683             : 
     684           0 :         r.in.hResource = *hResource;
     685           0 :         r.out.rpc_status = &rpc_status;
     686             : 
     687           0 :         torture_assert_ntstatus_ok(tctx,
     688             :                 dcerpc_clusapi_DeleteResource_r(b, tctx, &r),
     689             :                 "DeleteResource failed");
     690           0 :         torture_assert_werr_ok(tctx,
     691             :                 r.out.result,
     692             :                 "DeleteResource failed");
     693             : 
     694           0 :         return true;
     695             : }
     696             : 
     697           0 : static bool test_CreateResource(struct torture_context *tctx,
     698             :                                 void *data)
     699             : {
     700           0 :         struct torture_clusapi_context *t =
     701           0 :                 talloc_get_type_abort(data, struct torture_clusapi_context);
     702           0 :         struct policy_handle hResource;
     703             : 
     704           0 :         if (!test_CreateResource_int(tctx, t->p, &hResource)) {
     705           0 :                 return false;
     706             :         }
     707             : 
     708           0 :         test_DeleteResource_int(tctx, t->p, &hResource);
     709             : 
     710           0 :         return true;
     711             : }
     712             : 
     713           0 : static bool test_DeleteResource(struct torture_context *tctx,
     714             :                                 void *data)
     715             : {
     716           0 :         struct torture_clusapi_context *t =
     717           0 :                 talloc_get_type_abort(data, struct torture_clusapi_context);
     718           0 :         struct policy_handle hResource;
     719             : 
     720           0 :         if (!test_CreateResource_int(tctx, t->p, &hResource)) {
     721           0 :                 return false;
     722             :         }
     723             : 
     724           0 :         return test_DeleteResource_int(tctx, t->p, &hResource);
     725             : }
     726             : 
     727           0 : static bool test_SetResourceName_int(struct torture_context *tctx,
     728             :                                      struct dcerpc_pipe *p,
     729             :                                      struct policy_handle *hResource)
     730             : {
     731           0 :         struct dcerpc_binding_handle *b = p->binding_handle;
     732           0 :         struct clusapi_SetResourceName r;
     733           0 :         WERROR rpc_status;
     734             : 
     735           0 :         r.in.hResource = *hResource;
     736           0 :         r.in.lpszResourceName = "wurst";
     737           0 :         r.out.rpc_status = &rpc_status;
     738             : 
     739           0 :         torture_assert_ntstatus_ok(tctx,
     740             :                 dcerpc_clusapi_SetResourceName_r(b, tctx, &r),
     741             :                 "SetResourceName failed");
     742           0 :         torture_assert_werr_ok(tctx,
     743             :                 r.out.result,
     744             :                 "SetResourceName failed");
     745             : 
     746           0 :         return true;
     747             : }
     748             : 
     749           0 : static bool test_SetResourceName(struct torture_context *tctx,
     750             :                                  void *data)
     751             : {
     752           0 :         struct torture_clusapi_context *t =
     753           0 :                 talloc_get_type_abort(data, struct torture_clusapi_context);
     754           0 :         struct policy_handle hResource;
     755           0 :         bool ret = true;
     756             : 
     757           0 :         if (!test_CreateResource_int(tctx, t->p, &hResource)) {
     758           0 :                 return false;
     759             :         }
     760             : 
     761           0 :         ret = test_SetResourceName_int(tctx, t->p, &hResource);
     762             : 
     763           0 :         test_DeleteResource_int(tctx, t->p, &hResource);
     764             : 
     765           0 :         return ret;
     766             : }
     767             : 
     768           0 : static bool test_GetResourceState_int(struct torture_context *tctx,
     769             :                                       struct dcerpc_pipe *p,
     770             :                                       struct policy_handle *hResource)
     771             : {
     772           0 :         struct dcerpc_binding_handle *b = p->binding_handle;
     773           0 :         struct clusapi_GetResourceState r;
     774           0 :         enum clusapi_ClusterResourceState State;
     775           0 :         const char *NodeName;
     776           0 :         const char *GroupName;
     777           0 :         WERROR rpc_status;
     778             : 
     779           0 :         r.in.hResource = *hResource;
     780           0 :         r.out.State = &State;
     781           0 :         r.out.NodeName = &NodeName;
     782           0 :         r.out.GroupName = &GroupName;
     783           0 :         r.out.rpc_status = &rpc_status;
     784             : 
     785           0 :         torture_assert_ntstatus_ok(tctx,
     786             :                 dcerpc_clusapi_GetResourceState_r(b, tctx, &r),
     787             :                 "GetResourceState failed");
     788           0 :         torture_assert_werr_ok(tctx,
     789             :                 r.out.result,
     790             :                 "GetResourceState failed");
     791             : 
     792           0 :         return true;
     793             : }
     794             : 
     795           0 : static bool test_GetResourceState(struct torture_context *tctx,
     796             :                                   void *data)
     797             : {
     798           0 :         struct torture_clusapi_context *t =
     799           0 :                 talloc_get_type_abort(data, struct torture_clusapi_context);
     800           0 :         struct policy_handle hResource;
     801           0 :         bool ret = true;
     802             : 
     803           0 :         if (!test_OpenResource_int(tctx, t->p, "Cluster Name", &hResource)) {
     804           0 :                 return false;
     805             :         }
     806             : 
     807           0 :         ret = test_GetResourceState_int(tctx, t->p, &hResource);
     808             : 
     809           0 :         test_CloseResource_int(tctx, t->p, &hResource);
     810             : 
     811           0 :         return ret;
     812             : }
     813             : 
     814           0 : static bool test_GetResourceId_int(struct torture_context *tctx,
     815             :                                    struct dcerpc_pipe *p,
     816             :                                    struct policy_handle *hResource)
     817             : {
     818           0 :         struct dcerpc_binding_handle *b = p->binding_handle;
     819           0 :         struct clusapi_GetResourceId r;
     820           0 :         const char *pGuid;
     821           0 :         WERROR rpc_status;
     822             : 
     823           0 :         r.in.hResource = *hResource;
     824           0 :         r.out.pGuid = &pGuid;
     825           0 :         r.out.rpc_status = &rpc_status;
     826             : 
     827           0 :         torture_assert_ntstatus_ok(tctx,
     828             :                 dcerpc_clusapi_GetResourceId_r(b, tctx, &r),
     829             :                 "GetResourceId failed");
     830           0 :         torture_assert_werr_ok(tctx,
     831             :                 r.out.result,
     832             :                 "GetResourceId failed");
     833             : 
     834           0 :         return true;
     835             : }
     836             : 
     837           0 : static bool test_GetResourceId(struct torture_context *tctx,
     838             :                                void *data)
     839             : {
     840           0 :         struct torture_clusapi_context *t =
     841           0 :                 talloc_get_type_abort(data, struct torture_clusapi_context);
     842           0 :         struct policy_handle hResource;
     843           0 :         bool ret = true;
     844             : 
     845           0 :         if (!test_OpenResource_int(tctx, t->p, "Cluster Name", &hResource)) {
     846           0 :                 return false;
     847             :         }
     848             : 
     849           0 :         ret = test_GetResourceId_int(tctx, t->p, &hResource);
     850             : 
     851           0 :         test_CloseResource_int(tctx, t->p, &hResource);
     852             : 
     853           0 :         return ret;
     854             : }
     855             : 
     856           0 : static bool test_GetResourceType_int(struct torture_context *tctx,
     857             :                                      struct dcerpc_pipe *p,
     858             :                                      struct policy_handle *hResource)
     859             : {
     860           0 :         struct dcerpc_binding_handle *b = p->binding_handle;
     861           0 :         struct clusapi_GetResourceType r;
     862           0 :         const char *lpszResourceType;
     863           0 :         WERROR rpc_status;
     864             : 
     865           0 :         r.in.hResource = *hResource;
     866           0 :         r.out.lpszResourceType = &lpszResourceType;
     867           0 :         r.out.rpc_status = &rpc_status;
     868             : 
     869           0 :         torture_assert_ntstatus_ok(tctx,
     870             :                 dcerpc_clusapi_GetResourceType_r(b, tctx, &r),
     871             :                 "GetResourceType failed");
     872           0 :         torture_assert_werr_ok(tctx,
     873             :                 r.out.result,
     874             :                 "GetResourceType failed");
     875             : 
     876           0 :         return true;
     877             : }
     878             : 
     879           0 : static bool test_GetResourceType(struct torture_context *tctx,
     880             :                                  void *data)
     881             : {
     882           0 :         struct torture_clusapi_context *t =
     883           0 :                 talloc_get_type_abort(data, struct torture_clusapi_context);
     884           0 :         struct policy_handle hResource;
     885           0 :         bool ret = true;
     886             : 
     887           0 :         if (!test_OpenResource_int(tctx, t->p, "Cluster Name", &hResource)) {
     888           0 :                 return false;
     889             :         }
     890             : 
     891           0 :         ret = test_GetResourceType_int(tctx, t->p, &hResource);
     892             : 
     893           0 :         test_CloseResource_int(tctx, t->p, &hResource);
     894             : 
     895           0 :         return ret;
     896             : }
     897             : 
     898           0 : static bool test_FailResource_int(struct torture_context *tctx,
     899             :                                   struct dcerpc_pipe *p,
     900             :                                   struct policy_handle *hResource)
     901             : {
     902           0 :         struct dcerpc_binding_handle *b = p->binding_handle;
     903           0 :         struct clusapi_FailResource r;
     904           0 :         WERROR rpc_status;
     905             : 
     906           0 :         r.in.hResource = *hResource;
     907           0 :         r.out.rpc_status = &rpc_status;
     908             : 
     909           0 :         torture_assert_ntstatus_ok(tctx,
     910             :                 dcerpc_clusapi_FailResource_r(b, tctx, &r),
     911             :                 "FailResource failed");
     912           0 :         torture_assert_werr_ok(tctx,
     913             :                 r.out.result,
     914             :                 "FailResource failed");
     915             : 
     916           0 :         return true;
     917             : }
     918             : 
     919           0 : static bool test_FailResource(struct torture_context *tctx,
     920             :                               void *data)
     921             : {
     922           0 :         struct torture_clusapi_context *t =
     923           0 :                 talloc_get_type_abort(data, struct torture_clusapi_context);
     924           0 :         struct policy_handle hResource;
     925           0 :         bool ret = true;
     926             : 
     927           0 :         if (!test_OpenResource_int(tctx, t->p, "Cluster Name", &hResource)) {
     928           0 :                 return false;
     929             :         }
     930             : 
     931           0 :         ret = test_FailResource_int(tctx, t->p, &hResource);
     932             : 
     933           0 :         test_CloseResource_int(tctx, t->p, &hResource);
     934             : 
     935           0 :         return ret;
     936             : }
     937             : 
     938           0 : bool test_OnlineResource_int(struct torture_context *tctx,
     939             :                              struct dcerpc_pipe *p,
     940             :                              struct policy_handle *hResource)
     941             : {
     942           0 :         struct dcerpc_binding_handle *b = p->binding_handle;
     943           0 :         struct clusapi_OnlineResource r;
     944           0 :         WERROR rpc_status;
     945             : 
     946           0 :         r.in.hResource = *hResource;
     947           0 :         r.out.rpc_status = &rpc_status;
     948             : 
     949           0 :         torture_assert_ntstatus_ok(tctx,
     950             :                 dcerpc_clusapi_OnlineResource_r(b, tctx, &r),
     951             :                 "OnlineResource failed");
     952           0 :         if (!W_ERROR_IS_OK(r.out.result) &&
     953           0 :             !W_ERROR_EQUAL(r.out.result, WERR_IO_PENDING)) {
     954           0 :                 torture_result(tctx, TORTURE_FAIL,
     955             :                                "OnlineResource failed with %s",
     956             :                                 win_errstr(r.out.result));
     957           0 :                 return false;
     958             :         }
     959             : 
     960           0 :         return true;
     961             : }
     962             : 
     963           0 : static bool test_OnlineResource(struct torture_context *tctx,
     964             :                                 void *data)
     965             : {
     966           0 :         struct torture_clusapi_context *t =
     967           0 :                 talloc_get_type_abort(data, struct torture_clusapi_context);
     968           0 :         struct policy_handle hResource;
     969           0 :         bool ret = true;
     970             : 
     971           0 :         if (!test_OpenResource_int(tctx, t->p, "Cluster Name", &hResource)) {
     972           0 :                 return false;
     973             :         }
     974             : 
     975           0 :         ret = test_OnlineResource_int(tctx, t->p, &hResource);
     976             : 
     977           0 :         test_CloseResource_int(tctx, t->p, &hResource);
     978             : 
     979           0 :         return ret;
     980             : }
     981             : 
     982           0 : bool test_OfflineResource_int(struct torture_context *tctx,
     983             :                               struct dcerpc_pipe *p,
     984             :                               struct policy_handle *hResource)
     985             : {
     986           0 :         struct dcerpc_binding_handle *b = p->binding_handle;
     987           0 :         struct clusapi_OfflineResource r;
     988           0 :         WERROR rpc_status;
     989             : 
     990           0 :         r.in.hResource = *hResource;
     991           0 :         r.out.rpc_status = &rpc_status;
     992             : 
     993           0 :         torture_assert_ntstatus_ok(tctx,
     994             :                 dcerpc_clusapi_OfflineResource_r(b, tctx, &r),
     995             :                 "OfflineResource failed");
     996           0 :         if (!W_ERROR_IS_OK(r.out.result) &&
     997           0 :             !W_ERROR_EQUAL(r.out.result, WERR_IO_PENDING)) {
     998           0 :                 torture_result(tctx, TORTURE_FAIL,
     999             :                                "OfflineResource failed with %s",
    1000             :                                win_errstr(r.out.result));
    1001           0 :                 return false;
    1002             :         }
    1003             : 
    1004           0 :         return true;
    1005             : }
    1006             : 
    1007           0 : static bool test_OfflineResource(struct torture_context *tctx,
    1008             :                                  void *data)
    1009             : {
    1010           0 :         struct torture_clusapi_context *t =
    1011           0 :                 talloc_get_type_abort(data, struct torture_clusapi_context);
    1012           0 :         struct policy_handle hResource;
    1013           0 :         bool ret = true;
    1014             : 
    1015           0 :         if (!test_OpenResource_int(tctx, t->p, "Cluster Name", &hResource)) {
    1016           0 :                 return false;
    1017             :         }
    1018             : 
    1019           0 :         ret = test_OfflineResource_int(tctx, t->p, &hResource);
    1020             : 
    1021           0 :         test_CloseResource_int(tctx, t->p, &hResource);
    1022             : 
    1023           0 :         return ret;
    1024             : }
    1025             : 
    1026           0 : static bool test_CreateResEnum_int(struct torture_context *tctx,
    1027             :                                    struct dcerpc_pipe *p,
    1028             :                                    struct policy_handle *hResource)
    1029             : {
    1030           0 :         struct dcerpc_binding_handle *b = p->binding_handle;
    1031           0 :         struct clusapi_CreateResEnum r;
    1032           0 :         uint32_t dwType = CLUSTER_ENUM_RESOURCE;
    1033           0 :         struct ENUM_LIST *ReturnEnum;
    1034           0 :         WERROR rpc_status;
    1035             : 
    1036           0 :         r.in.hResource = *hResource;
    1037           0 :         r.in.dwType = dwType;
    1038           0 :         r.out.ReturnEnum = &ReturnEnum;
    1039           0 :         r.out.rpc_status = &rpc_status;
    1040             : 
    1041           0 :         torture_assert_ntstatus_ok(tctx,
    1042             :                 dcerpc_clusapi_CreateResEnum_r(b, tctx, &r),
    1043             :                 "CreateResEnum failed");
    1044           0 :         torture_assert_werr_ok(tctx,
    1045             :                 r.out.result,
    1046             :                 "CreateResEnum failed");
    1047             : 
    1048           0 :         return true;
    1049             : }
    1050             : 
    1051           0 : static bool test_CreateResEnum(struct torture_context *tctx,
    1052             :                                void *data)
    1053             : {
    1054           0 :         struct torture_clusapi_context *t =
    1055           0 :                 talloc_get_type_abort(data, struct torture_clusapi_context);
    1056           0 :         struct policy_handle hResource;
    1057           0 :         bool ret = true;
    1058             : 
    1059           0 :         if (!test_OpenResource_int(tctx, t->p, "Cluster Name", &hResource)) {
    1060           0 :                 return false;
    1061             :         }
    1062             : 
    1063           0 :         ret = test_CreateResEnum_int(tctx, t->p, &hResource);
    1064             : 
    1065           0 :         test_CloseResource_int(tctx, t->p, &hResource);
    1066             : 
    1067           0 :         return ret;
    1068             : }
    1069             : 
    1070           0 : static bool test_GetResourceDependencyExpression_int(struct torture_context *tctx,
    1071             :                                                      struct dcerpc_pipe *p,
    1072             :                                                      struct policy_handle *hResource)
    1073             : {
    1074           0 :         struct dcerpc_binding_handle *b = p->binding_handle;
    1075           0 :         struct clusapi_GetResourceDependencyExpression r;
    1076           0 :         const char *lpszDependencyExpression;
    1077           0 :         WERROR rpc_status;
    1078             : 
    1079           0 :         r.in.hResource = *hResource;
    1080           0 :         r.out.lpszDependencyExpression = &lpszDependencyExpression;
    1081           0 :         r.out.rpc_status = &rpc_status;
    1082             : 
    1083           0 :         torture_assert_ntstatus_ok(tctx,
    1084             :                 dcerpc_clusapi_GetResourceDependencyExpression_r(b, tctx, &r),
    1085             :                 "GetResourceDependencyExpression failed");
    1086           0 :         torture_assert_werr_ok(tctx,
    1087             :                 r.out.result,
    1088             :                 "GetResourceDependencyExpression failed");
    1089             : 
    1090           0 :         return true;
    1091             : }
    1092             : 
    1093           0 : static bool test_GetResourceDependencyExpression(struct torture_context *tctx,
    1094             :                                                  void *data)
    1095             : {
    1096           0 :         struct torture_clusapi_context *t =
    1097           0 :                 talloc_get_type_abort(data, struct torture_clusapi_context);
    1098           0 :         struct policy_handle hResource;
    1099           0 :         bool ret = true;
    1100             : 
    1101           0 :         if (!test_OpenResource_int(tctx, t->p, "Cluster Name", &hResource)) {
    1102           0 :                 return false;
    1103             :         }
    1104             : 
    1105           0 :         ret = test_GetResourceDependencyExpression_int(tctx, t->p, &hResource);
    1106             : 
    1107           0 :         test_CloseResource_int(tctx, t->p, &hResource);
    1108             : 
    1109           0 :         return ret;
    1110             : }
    1111             : 
    1112           0 : static bool test_GetResourceNetworkName_int(struct torture_context *tctx,
    1113             :                                             struct dcerpc_pipe *p,
    1114             :                                             struct policy_handle *hResource)
    1115             : {
    1116           0 :         struct dcerpc_binding_handle *b = p->binding_handle;
    1117           0 :         struct clusapi_GetResourceNetworkName r;
    1118           0 :         const char *lpszName;
    1119           0 :         WERROR rpc_status;
    1120             : 
    1121           0 :         r.in.hResource = *hResource;
    1122           0 :         r.out.lpszName = &lpszName;
    1123           0 :         r.out.rpc_status = &rpc_status;
    1124             : 
    1125           0 :         torture_assert_ntstatus_ok(tctx,
    1126             :                 dcerpc_clusapi_GetResourceNetworkName_r(b, tctx, &r),
    1127             :                 "GetResourceNetworkName failed");
    1128           0 :         torture_assert_werr_ok(tctx,
    1129             :                 r.out.result,
    1130             :                 "GetResourceNetworkName failed");
    1131             : 
    1132           0 :         return true;
    1133             : }
    1134             : 
    1135           0 : static bool test_GetResourceNetworkName(struct torture_context *tctx,
    1136             :                                         void *data)
    1137             : {
    1138           0 :         struct torture_clusapi_context *t =
    1139           0 :                 talloc_get_type_abort(data, struct torture_clusapi_context);
    1140           0 :         struct policy_handle hResource;
    1141           0 :         bool ret = true;
    1142             : 
    1143           0 :         if (!test_OpenResource_int(tctx, t->p, "Network Name", &hResource)) {
    1144           0 :                 return false;
    1145             :         }
    1146             : 
    1147           0 :         ret = test_GetResourceNetworkName_int(tctx, t->p, &hResource);
    1148             : 
    1149           0 :         test_CloseResource_int(tctx, t->p, &hResource);
    1150             : 
    1151           0 :         return ret;
    1152             : }
    1153             : 
    1154           0 : static bool test_ResourceTypeControl_int(struct torture_context *tctx,
    1155             :                                          struct dcerpc_pipe *p,
    1156             :                                          struct policy_handle *Cluster,
    1157             :                                          const char *resource_type,
    1158             :                                          enum clusapi_ResourceTypeControlCode dwControlCode)
    1159             : {
    1160           0 :         struct dcerpc_binding_handle *b = p->binding_handle;
    1161           0 :         struct clusapi_ResourceTypeControl r;
    1162           0 :         uint32_t lpBytesReturned;
    1163           0 :         uint32_t lpcbRequired;
    1164           0 :         WERROR rpc_status;
    1165             : 
    1166           0 :         r.in.hCluster = *Cluster;
    1167           0 :         r.in.lpszResourceTypeName = resource_type;
    1168           0 :         r.in.dwControlCode = 0;
    1169           0 :         r.in.lpInBuffer = NULL;
    1170           0 :         r.in.nInBufferSize = 0;
    1171           0 :         r.in.nOutBufferSize = 0;
    1172           0 :         r.out.lpOutBuffer = NULL;
    1173           0 :         r.out.lpBytesReturned = &lpBytesReturned;
    1174           0 :         r.out.lpcbRequired = &lpcbRequired;
    1175           0 :         r.out.rpc_status = &rpc_status;
    1176             : 
    1177           0 :         torture_assert_ntstatus_ok(tctx,
    1178             :                 dcerpc_clusapi_ResourceTypeControl_r(b, tctx, &r),
    1179             :                 "ResourceTypeControl failed");
    1180             : 
    1181           0 :         if (strequal(r.in.lpszResourceTypeName, "MSMQ") ||
    1182           0 :             strequal(r.in.lpszResourceTypeName, "MSMQTriggers")) {
    1183           0 :                 torture_assert_werr_equal(tctx,
    1184             :                         r.out.result,
    1185             :                         WERR_CLUSTER_RESTYPE_NOT_SUPPORTED,
    1186             :                         "ResourceTypeControl failed");
    1187           0 :                 return true;
    1188             :         }
    1189             : 
    1190           0 :         torture_assert_werr_equal(tctx,
    1191             :                 r.out.result,
    1192             :                 WERR_INVALID_FUNCTION,
    1193             :                 "ResourceTypeControl failed");
    1194             : 
    1195           0 :         r.in.dwControlCode = dwControlCode;
    1196             : 
    1197           0 :         torture_assert_ntstatus_ok(tctx,
    1198             :                 dcerpc_clusapi_ResourceTypeControl_r(b, tctx, &r),
    1199             :                 "ResourceTypeControl failed");
    1200             : 
    1201           0 :         if (W_ERROR_EQUAL(r.out.result, WERR_MORE_DATA)) {
    1202           0 :                 r.out.lpOutBuffer = talloc_zero_array(tctx, uint8_t, *r.out.lpcbRequired);
    1203           0 :                 r.in.nOutBufferSize = *r.out.lpcbRequired;
    1204           0 :                 torture_assert_ntstatus_ok(tctx,
    1205             :                         dcerpc_clusapi_ResourceTypeControl_r(b, tctx, &r),
    1206             :                         "ResourceTypeControl failed");
    1207             :         }
    1208           0 :         torture_assert_werr_ok(tctx,
    1209             :                 r.out.result,
    1210             :                 "ResourceTypeControl failed");
    1211             : 
    1212             :         /* now try what happens when we query with a buffer large enough to hold
    1213             :          * the entire packet */
    1214             : 
    1215           0 :         r.in.nOutBufferSize = 0x4000;
    1216           0 :         r.out.lpOutBuffer = talloc_zero_array(tctx, uint8_t, r.in.nOutBufferSize);
    1217             : 
    1218           0 :         torture_assert_ntstatus_ok(tctx,
    1219             :                 dcerpc_clusapi_ResourceTypeControl_r(b, tctx, &r),
    1220             :                 "ResourceTypeControl failed");
    1221           0 :         torture_assert_werr_ok(tctx,
    1222             :                 r.out.result,
    1223             :                 "ResourceTypeControl failed");
    1224           0 :         torture_assert(tctx, *r.out.lpBytesReturned < r.in.nOutBufferSize,
    1225             :                 "lpBytesReturned expected to be smaller than input size nOutBufferSize");
    1226             : 
    1227           0 :         return true;
    1228             : }
    1229             : 
    1230           0 : static bool test_ResourceTypeControl(struct torture_context *tctx,
    1231             :                                      struct dcerpc_pipe *p,
    1232             :                                      const char *resourcetype_name)
    1233             : {
    1234           0 :         struct policy_handle Cluster;
    1235           0 :         bool ret = true;
    1236           0 :         uint32_t control_codes[] = {
    1237             :                 CLUSCTL_RESOURCE_TYPE_GET_CLASS_INFO,
    1238             :                 CLUSCTL_RESOURCE_TYPE_GET_CHARACTERISTICS,
    1239             :                 CLUSCTL_RESOURCE_TYPE_GET_COMMON_PROPERTIES,
    1240             :                 CLUSCTL_RESOURCE_TYPE_GET_RO_COMMON_PROPERTIES,
    1241             :                 CLUSCTL_RESOURCE_TYPE_GET_PRIVATE_PROPERTIES
    1242             :         };
    1243           0 :         int i;
    1244             : 
    1245           0 :         if (!test_OpenCluster_int(tctx, p, &Cluster)) {
    1246           0 :                 return false;
    1247             :         }
    1248             : 
    1249           0 :         for (i=0; i < ARRAY_SIZE(control_codes); i++) {
    1250           0 :                 ret = test_ResourceTypeControl_int(tctx, p, &Cluster,
    1251             :                                                    resourcetype_name,
    1252           0 :                                                    control_codes[i]);
    1253           0 :                 if (!ret) {
    1254           0 :                         goto done;
    1255             :                 }
    1256             :         }
    1257             : 
    1258           0 :  done:
    1259           0 :         test_CloseCluster_int(tctx, p, &Cluster);
    1260             : 
    1261           0 :         return ret;
    1262             : }
    1263             : 
    1264             : 
    1265             : 
    1266           0 : static bool test_one_resourcetype(struct torture_context *tctx,
    1267             :                                   struct dcerpc_pipe *p,
    1268             :                                   const char *resourcetype_name)
    1269             : {
    1270           0 :         torture_assert(tctx,
    1271             :                 test_ResourceTypeControl(tctx, p, resourcetype_name),
    1272             :                 "failed to query ResourceTypeControl");
    1273             : 
    1274           0 :         return true;
    1275             : }
    1276             : 
    1277           0 : static bool test_one_resource(struct torture_context *tctx,
    1278             :                               struct dcerpc_pipe *p,
    1279             :                               const char *resource_name)
    1280             : {
    1281           0 :         struct policy_handle hResource;
    1282             : 
    1283           0 :         torture_assert(tctx,
    1284             :                 test_OpenResource_int(tctx, p, resource_name, &hResource),
    1285             :                 "failed to open resource");
    1286           0 :         test_CloseResource_int(tctx, p, &hResource);
    1287             : 
    1288           0 :         torture_assert(tctx,
    1289             :                 test_OpenResourceEx_int(tctx, p, resource_name, &hResource),
    1290             :                 "failed to openex resource");
    1291             : 
    1292           0 :         torture_assert(tctx,
    1293             :                 test_GetResourceType_int(tctx, p, &hResource),
    1294             :                 "failed to query resource type");
    1295           0 :         torture_assert(tctx,
    1296             :                 test_GetResourceId_int(tctx, p, &hResource),
    1297             :                 "failed to query resource id");
    1298           0 :         torture_assert(tctx,
    1299             :                 test_GetResourceState_int(tctx, p, &hResource),
    1300             :                 "failed to query resource state");
    1301           0 :         torture_assert(tctx,
    1302             :                 test_CreateResEnum_int(tctx, p, &hResource),
    1303             :                 "failed to query resource enum");
    1304           0 :         torture_assert(tctx,
    1305             :                 test_GetResourceDependencyExpression_int(tctx, p, &hResource),
    1306             :                 "failed to query resource dependency expression");
    1307           0 :         torture_assert(tctx,
    1308             :                 test_GetResourceNetworkName_int(tctx, p, &hResource),
    1309             :                 "failed to query resource network name");
    1310             : 
    1311           0 :         test_CloseResource_int(tctx, p, &hResource);
    1312             : 
    1313           0 :         return true;
    1314             : }
    1315             : 
    1316           0 : static bool test_all_resources(struct torture_context *tctx,
    1317             :                                void *data)
    1318             : {
    1319           0 :         struct torture_clusapi_context *t =
    1320           0 :                 talloc_get_type_abort(data, struct torture_clusapi_context);
    1321           0 :         struct dcerpc_binding_handle *b = t->p->binding_handle;
    1322           0 :         struct clusapi_CreateEnum r;
    1323           0 :         uint32_t dwType = CLUSTER_ENUM_RESOURCE;
    1324           0 :         struct ENUM_LIST *ReturnEnum;
    1325           0 :         WERROR rpc_status;
    1326           0 :         int i;
    1327             : 
    1328           0 :         r.in.dwType = dwType;
    1329           0 :         r.out.ReturnEnum = &ReturnEnum;
    1330           0 :         r.out.rpc_status = &rpc_status;
    1331             : 
    1332           0 :         torture_assert_ntstatus_ok(tctx,
    1333             :                 dcerpc_clusapi_CreateEnum_r(b, tctx, &r),
    1334             :                 "CreateEnum failed");
    1335           0 :         torture_assert_werr_ok(tctx,
    1336             :                 r.out.result,
    1337             :                 "CreateEnum failed");
    1338             : 
    1339           0 :         for (i=0; i < ReturnEnum->EntryCount; i++) {
    1340             : 
    1341           0 :                 struct ENUM_ENTRY e = ReturnEnum->Entry[i];
    1342             : 
    1343           0 :                 torture_assert_int_equal(tctx, e.Type, CLUSTER_ENUM_RESOURCE, "type mismatch");
    1344             : 
    1345           0 :                 torture_assert(tctx,
    1346             :                         test_one_resource(tctx, t->p, e.Name),
    1347             :                         "failed to test one resource");
    1348             :         }
    1349             : 
    1350           0 :         return true;
    1351             : }
    1352             : 
    1353           0 : static bool test_all_resourcetypes(struct torture_context *tctx,
    1354             :                                    void *data)
    1355             : {
    1356           0 :         struct torture_clusapi_context *t =
    1357           0 :                 talloc_get_type_abort(data, struct torture_clusapi_context);
    1358           0 :         struct dcerpc_binding_handle *b = t->p->binding_handle;
    1359           0 :         struct clusapi_CreateEnum r;
    1360           0 :         uint32_t dwType = CLUSTER_ENUM_RESTYPE;
    1361           0 :         struct ENUM_LIST *ReturnEnum;
    1362           0 :         WERROR rpc_status;
    1363           0 :         int i;
    1364             : 
    1365           0 :         r.in.dwType = dwType;
    1366           0 :         r.out.ReturnEnum = &ReturnEnum;
    1367           0 :         r.out.rpc_status = &rpc_status;
    1368             : 
    1369           0 :         torture_assert_ntstatus_ok(tctx,
    1370             :                 dcerpc_clusapi_CreateEnum_r(b, tctx, &r),
    1371             :                 "CreateEnum failed");
    1372           0 :         torture_assert_werr_ok(tctx,
    1373             :                 r.out.result,
    1374             :                 "CreateEnum failed");
    1375             : 
    1376           0 :         for (i=0; i < ReturnEnum->EntryCount; i++) {
    1377             : 
    1378           0 :                 struct ENUM_ENTRY e = ReturnEnum->Entry[i];
    1379             : 
    1380           0 :                 torture_assert_int_equal(tctx, e.Type, CLUSTER_ENUM_RESTYPE, "type mismatch");
    1381             : 
    1382           0 :                 torture_assert(tctx,
    1383             :                         test_one_resourcetype(tctx, t->p, e.Name),
    1384             :                         "failed to test one resourcetype");
    1385             :         }
    1386             : 
    1387           0 :         return true;
    1388             : }
    1389             : 
    1390             : 
    1391           0 : static bool test_OpenNode_int(struct torture_context *tctx,
    1392             :                               struct dcerpc_pipe *p,
    1393             :                               const char *lpszNodeName,
    1394             :                               struct policy_handle *hNode)
    1395             : {
    1396           0 :         struct dcerpc_binding_handle *b = p->binding_handle;
    1397           0 :         struct clusapi_OpenNode r;
    1398           0 :         WERROR Status;
    1399           0 :         WERROR rpc_status;
    1400             : 
    1401           0 :         r.in.lpszNodeName = lpszNodeName;
    1402           0 :         r.out.rpc_status = &rpc_status;
    1403           0 :         r.out.Status = &Status;
    1404           0 :         r.out.hNode= hNode;
    1405             : 
    1406           0 :         torture_assert_ntstatus_ok(tctx,
    1407             :                 dcerpc_clusapi_OpenNode_r(b, tctx, &r),
    1408             :                 "OpenNode failed");
    1409           0 :         torture_assert_werr_ok(tctx,
    1410             :                 *r.out.Status,
    1411             :                 "OpenNode failed");
    1412             : 
    1413           0 :         return true;
    1414             : }
    1415             : 
    1416           0 : static bool test_OpenNodeEx_int(struct torture_context *tctx,
    1417             :                                 struct dcerpc_pipe *p,
    1418             :                                 const char *lpszNodeName,
    1419             :                                 struct policy_handle *hNode)
    1420             : {
    1421           0 :         struct dcerpc_binding_handle *b = p->binding_handle;
    1422           0 :         struct clusapi_OpenNodeEx r;
    1423           0 :         uint32_t lpdwGrantedAccess;
    1424           0 :         WERROR Status;
    1425           0 :         WERROR rpc_status;
    1426             : 
    1427           0 :         r.in.lpszNodeName = lpszNodeName;
    1428           0 :         r.in.dwDesiredAccess = SEC_FLAG_MAXIMUM_ALLOWED;
    1429           0 :         r.out.lpdwGrantedAccess = &lpdwGrantedAccess;
    1430           0 :         r.out.rpc_status = &rpc_status;
    1431           0 :         r.out.Status = &Status;
    1432           0 :         r.out.hNode= hNode;
    1433             : 
    1434           0 :         torture_assert_ntstatus_ok(tctx,
    1435             :                 dcerpc_clusapi_OpenNodeEx_r(b, tctx, &r),
    1436             :                 "OpenNodeEx failed");
    1437           0 :         torture_assert_werr_ok(tctx,
    1438             :                 *r.out.Status,
    1439             :                 "OpenNodeEx failed");
    1440             : 
    1441           0 :         return true;
    1442             : }
    1443             : 
    1444             : 
    1445           0 : static bool test_CloseNode_int(struct torture_context *tctx,
    1446             :                                struct dcerpc_pipe *p,
    1447             :                                struct policy_handle *Node)
    1448             : {
    1449           0 :         struct dcerpc_binding_handle *b = p->binding_handle;
    1450           0 :         struct clusapi_CloseNode r;
    1451             : 
    1452           0 :         r.in.Node = Node;
    1453           0 :         r.out.Node = Node;
    1454             : 
    1455           0 :         torture_assert_ntstatus_ok(tctx,
    1456             :                 dcerpc_clusapi_CloseNode_r(b, tctx, &r),
    1457             :                 "CloseNode failed");
    1458           0 :         torture_assert_werr_ok(tctx,
    1459             :                 r.out.result,
    1460             :                 "CloseNode failed");
    1461           0 :         torture_assert(tctx,
    1462             :                 ndr_policy_handle_empty(Node),
    1463             :                 "policy_handle non empty after CloseNode");
    1464             : 
    1465           0 :         return true;
    1466             : }
    1467             : 
    1468           0 : static bool test_OpenNode(struct torture_context *tctx,
    1469             :                           void *data)
    1470             : {
    1471           0 :         struct torture_clusapi_context *t =
    1472           0 :                 talloc_get_type_abort(data, struct torture_clusapi_context);
    1473           0 :         struct policy_handle hNode;
    1474             : 
    1475           0 :         if (!test_OpenNode_int(tctx, t->p, t->NodeName, &hNode)) {
    1476           0 :                 return false;
    1477             :         }
    1478             : 
    1479           0 :         test_CloseNode_int(tctx, t->p, &hNode);
    1480             : 
    1481           0 :         return true;
    1482             : }
    1483             : 
    1484           0 : static bool test_OpenNodeEx(struct torture_context *tctx,
    1485             :                             void *data)
    1486             : {
    1487           0 :         struct torture_clusapi_context *t =
    1488           0 :                 talloc_get_type_abort(data, struct torture_clusapi_context);
    1489           0 :         struct policy_handle hNode;
    1490             : 
    1491           0 :         if (!test_OpenNodeEx_int(tctx, t->p, t->NodeName, &hNode)) {
    1492           0 :                 return false;
    1493             :         }
    1494             : 
    1495           0 :         test_CloseNode_int(tctx, t->p, &hNode);
    1496             : 
    1497           0 :         return true;
    1498             : }
    1499             : 
    1500           0 : static bool test_CloseNode(struct torture_context *tctx,
    1501             :                            void *data)
    1502             : {
    1503           0 :         struct torture_clusapi_context *t =
    1504           0 :                 talloc_get_type_abort(data, struct torture_clusapi_context);
    1505           0 :         struct policy_handle hNode;
    1506             : 
    1507           0 :         if (!test_OpenNode_int(tctx, t->p, t->NodeName, &hNode)) {
    1508           0 :                 return false;
    1509             :         }
    1510             : 
    1511           0 :         return test_CloseNode_int(tctx, t->p, &hNode);
    1512             : }
    1513             : 
    1514           0 : static bool test_GetNodeState_int(struct torture_context *tctx,
    1515             :                                   struct dcerpc_pipe *p,
    1516             :                                   struct policy_handle *hNode)
    1517             : {
    1518           0 :         struct dcerpc_binding_handle *b = p->binding_handle;
    1519           0 :         struct clusapi_GetNodeState r;
    1520           0 :         enum clusapi_ClusterNodeState State;
    1521           0 :         WERROR rpc_status;
    1522             : 
    1523           0 :         r.in.hNode = *hNode;
    1524           0 :         r.out.State = &State;
    1525           0 :         r.out.rpc_status = &rpc_status;
    1526             : 
    1527           0 :         torture_assert_ntstatus_ok(tctx,
    1528             :                 dcerpc_clusapi_GetNodeState_r(b, tctx, &r),
    1529             :                 "GetNodeState failed");
    1530           0 :         torture_assert_werr_ok(tctx,
    1531             :                 r.out.result,
    1532             :                 "GetNodeState failed");
    1533             : 
    1534           0 :         return true;
    1535             : }
    1536             : 
    1537           0 : static bool test_GetNodeState(struct torture_context *tctx,
    1538             :                               void *data)
    1539             : {
    1540           0 :         struct torture_clusapi_context *t =
    1541           0 :                 talloc_get_type_abort(data, struct torture_clusapi_context);
    1542           0 :         struct policy_handle hNode;
    1543           0 :         bool ret = true;
    1544             : 
    1545           0 :         if (!test_OpenNode_int(tctx, t->p, t->NodeName, &hNode)) {
    1546           0 :                 return false;
    1547             :         }
    1548             : 
    1549           0 :         ret = test_GetNodeState_int(tctx, t->p, &hNode);
    1550             : 
    1551           0 :         test_CloseNode_int(tctx, t->p, &hNode);
    1552             : 
    1553           0 :         return ret;
    1554             : }
    1555             : 
    1556           0 : static bool test_GetNodeId_int(struct torture_context *tctx,
    1557             :                                struct dcerpc_pipe *p,
    1558             :                                struct policy_handle *hNode)
    1559             : {
    1560           0 :         struct dcerpc_binding_handle *b = p->binding_handle;
    1561           0 :         struct clusapi_GetNodeId r;
    1562           0 :         const char *pGuid;
    1563           0 :         WERROR rpc_status;
    1564             : 
    1565           0 :         r.in.hNode = *hNode;
    1566           0 :         r.out.pGuid = &pGuid;
    1567           0 :         r.out.rpc_status = &rpc_status;
    1568             : 
    1569           0 :         torture_assert_ntstatus_ok(tctx,
    1570             :                 dcerpc_clusapi_GetNodeId_r(b, tctx, &r),
    1571             :                 "GetNodeId failed");
    1572           0 :         torture_assert_werr_ok(tctx,
    1573             :                 r.out.result,
    1574             :                 "GetNodeId failed");
    1575             : 
    1576           0 :         return true;
    1577             : }
    1578             : 
    1579           0 : static bool test_GetNodeId(struct torture_context *tctx,
    1580             :                            void *data)
    1581             : {
    1582           0 :         struct torture_clusapi_context *t =
    1583           0 :                 talloc_get_type_abort(data, struct torture_clusapi_context);
    1584           0 :         struct policy_handle hNode;
    1585           0 :         bool ret = true;
    1586             : 
    1587           0 :         if (!test_OpenNode_int(tctx, t->p, t->NodeName, &hNode)) {
    1588           0 :                 return false;
    1589             :         }
    1590             : 
    1591           0 :         ret = test_GetNodeId_int(tctx, t->p, &hNode);
    1592             : 
    1593           0 :         test_CloseNode_int(tctx, t->p, &hNode);
    1594             : 
    1595           0 :         return ret;
    1596             : }
    1597             : 
    1598           0 : static bool test_NodeControl_int(struct torture_context *tctx,
    1599             :                                  struct dcerpc_pipe *p,
    1600             :                                  struct policy_handle *hNode,
    1601             :                                  enum clusapi_NodeControlCode dwControlCode)
    1602             : {
    1603           0 :         struct dcerpc_binding_handle *b = p->binding_handle;
    1604           0 :         struct clusapi_NodeControl r;
    1605           0 :         uint32_t lpBytesReturned;
    1606           0 :         uint32_t lpcbRequired;
    1607           0 :         WERROR rpc_status;
    1608             : 
    1609           0 :         r.in.hNode = *hNode;
    1610           0 :         r.in.dwControlCode = 0;
    1611           0 :         r.in.lpInBuffer = NULL;
    1612           0 :         r.in.nInBufferSize = 0;
    1613           0 :         r.in.nOutBufferSize = 0;
    1614           0 :         r.out.lpOutBuffer = NULL;
    1615           0 :         r.out.lpBytesReturned = &lpBytesReturned;
    1616           0 :         r.out.lpcbRequired = &lpcbRequired;
    1617           0 :         r.out.rpc_status = &rpc_status;
    1618             : 
    1619           0 :         torture_assert_ntstatus_ok(tctx,
    1620             :                 dcerpc_clusapi_NodeControl_r(b, tctx, &r),
    1621             :                 "NodeControl failed");
    1622           0 :         torture_assert_werr_equal(tctx,
    1623             :                 r.out.result,
    1624             :                 WERR_INVALID_FUNCTION,
    1625             :                 "NodeControl failed");
    1626             : 
    1627           0 :         r.in.dwControlCode = dwControlCode;
    1628             : 
    1629           0 :         torture_assert_ntstatus_ok(tctx,
    1630             :                 dcerpc_clusapi_NodeControl_r(b, tctx, &r),
    1631             :                 "NodeControl failed");
    1632             : 
    1633           0 :         if (W_ERROR_EQUAL(r.out.result, WERR_MORE_DATA)) {
    1634           0 :                 r.out.lpOutBuffer = talloc_zero_array(tctx, uint8_t, *r.out.lpcbRequired);
    1635           0 :                 r.in.nOutBufferSize = *r.out.lpcbRequired;
    1636           0 :                 torture_assert_ntstatus_ok(tctx,
    1637             :                         dcerpc_clusapi_NodeControl_r(b, tctx, &r),
    1638             :                         "NodeControl failed");
    1639             :         }
    1640           0 :         torture_assert_werr_ok(tctx,
    1641             :                 r.out.result,
    1642             :                 "NodeControl failed");
    1643             : 
    1644             :         /* now try what happens when we query with a buffer large enough to hold
    1645             :          * the entire packet */
    1646             : 
    1647           0 :         r.in.nOutBufferSize = 0x4000;
    1648           0 :         r.out.lpOutBuffer = talloc_zero_array(tctx, uint8_t, r.in.nOutBufferSize);
    1649             : 
    1650           0 :         torture_assert_ntstatus_ok(tctx,
    1651             :                 dcerpc_clusapi_NodeControl_r(b, tctx, &r),
    1652             :                 "NodeControl failed");
    1653           0 :         torture_assert_werr_ok(tctx,
    1654             :                 r.out.result,
    1655             :                 "NodeControl failed");
    1656           0 :         torture_assert(tctx, *r.out.lpBytesReturned < r.in.nOutBufferSize,
    1657             :                 "lpBytesReturned expected to be smaller than input size nOutBufferSize");
    1658             : 
    1659           0 :         if (dwControlCode == CLUSCTL_NODE_GET_ID) {
    1660           0 :                 const char *str;
    1661           0 :                 DATA_BLOB blob = data_blob_const(r.out.lpOutBuffer, *r.out.lpBytesReturned);
    1662             : 
    1663           0 :                 torture_assert(tctx, *r.out.lpBytesReturned >= 4, "must be at least 4 bytes long");
    1664           0 :                 torture_assert(tctx, (*r.out.lpBytesReturned % 2) == 0, "must be a multiple of 2");
    1665             : 
    1666           0 :                 torture_assert(tctx,
    1667             :                         pull_reg_sz(tctx, &blob, &str),
    1668             :                         "failed to pull unicode string");
    1669             : 
    1670           0 :                 torture_comment(tctx, "got this node id: '%s'", str);
    1671             :         }
    1672             : 
    1673           0 :         return true;
    1674             : }
    1675             : 
    1676           0 : static bool test_NodeControl(struct torture_context *tctx,
    1677             :                              void *data)
    1678             : {
    1679           0 :         struct torture_clusapi_context *t =
    1680           0 :                 talloc_get_type_abort(data, struct torture_clusapi_context);
    1681           0 :         struct policy_handle hNode;
    1682           0 :         bool ret = true;
    1683             : 
    1684           0 :         if (!test_OpenNode_int(tctx, t->p, t->NodeName, &hNode)) {
    1685           0 :                 return false;
    1686             :         }
    1687             : 
    1688           0 :         ret = test_NodeControl_int(tctx, t->p, &hNode, CLUSCTL_NODE_GET_RO_COMMON_PROPERTIES);
    1689           0 :         if (!ret) {
    1690           0 :                 return false;
    1691             :         }
    1692             : 
    1693           0 :         ret = test_NodeControl_int(tctx, t->p, &hNode, CLUSCTL_NODE_GET_ID);
    1694           0 :         if (!ret) {
    1695           0 :                 return false;
    1696             :         }
    1697             : 
    1698           0 :         test_CloseNode_int(tctx, t->p, &hNode);
    1699             : 
    1700           0 :         return ret;
    1701             : }
    1702             : 
    1703           0 : static bool test_PauseNode_int(struct torture_context *tctx,
    1704             :                                struct dcerpc_pipe *p,
    1705             :                                struct policy_handle *hNode)
    1706             : {
    1707           0 :         struct dcerpc_binding_handle *b = p->binding_handle;
    1708           0 :         struct clusapi_PauseNode r;
    1709           0 :         WERROR rpc_status;
    1710             : 
    1711           0 :         r.in.hNode = *hNode;
    1712           0 :         r.out.rpc_status = &rpc_status;
    1713             : 
    1714           0 :         torture_assert_ntstatus_ok(tctx,
    1715             :                 dcerpc_clusapi_PauseNode_r(b, tctx, &r),
    1716             :                 "PauseNode failed");
    1717           0 :         torture_assert_werr_ok(tctx,
    1718             :                 r.out.result,
    1719             :                 "PauseNode failed");
    1720             : 
    1721           0 :         return true;
    1722             : }
    1723             : 
    1724           0 : static bool test_PauseNode(struct torture_context *tctx,
    1725             :                            void *data)
    1726             : {
    1727           0 :         struct torture_clusapi_context *t =
    1728           0 :                 talloc_get_type_abort(data, struct torture_clusapi_context);
    1729           0 :         struct policy_handle hNode;
    1730           0 :         bool ret = true;
    1731             : 
    1732           0 :         if (!test_OpenNode_int(tctx, t->p, t->NodeName, &hNode)) {
    1733           0 :                 return false;
    1734             :         }
    1735             : 
    1736           0 :         ret = test_PauseNode_int(tctx, t->p, &hNode);
    1737             : 
    1738           0 :         test_CloseNode_int(tctx, t->p, &hNode);
    1739             : 
    1740           0 :         return ret;
    1741             : }
    1742             : 
    1743           0 : static bool test_ResumeNode_int(struct torture_context *tctx,
    1744             :                                 struct dcerpc_pipe *p,
    1745             :                                 struct policy_handle *hNode)
    1746             : {
    1747           0 :         struct dcerpc_binding_handle *b = p->binding_handle;
    1748           0 :         struct clusapi_ResumeNode r;
    1749           0 :         WERROR rpc_status;
    1750             : 
    1751           0 :         r.in.hNode = *hNode;
    1752           0 :         r.out.rpc_status = &rpc_status;
    1753             : 
    1754           0 :         torture_assert_ntstatus_ok(tctx,
    1755             :                 dcerpc_clusapi_ResumeNode_r(b, tctx, &r),
    1756             :                 "ResumeNode failed");
    1757           0 :         torture_assert_werr_equal(tctx,
    1758             :                 r.out.result,
    1759             :                 WERR_CLUSTER_NODE_NOT_PAUSED,
    1760             :                 "ResumeNode gave unexpected result");
    1761             : 
    1762           0 :         return true;
    1763             : }
    1764             : 
    1765           0 : static bool test_ResumeNode(struct torture_context *tctx,
    1766             :                             void *data)
    1767             : {
    1768           0 :         struct torture_clusapi_context *t =
    1769           0 :                 talloc_get_type_abort(data, struct torture_clusapi_context);
    1770           0 :         struct policy_handle hNode;
    1771           0 :         bool ret = true;
    1772             : 
    1773           0 :         if (!test_OpenNode_int(tctx, t->p, t->NodeName, &hNode)) {
    1774           0 :                 return false;
    1775             :         }
    1776             : 
    1777           0 :         ret = test_ResumeNode_int(tctx, t->p, &hNode);
    1778             : 
    1779           0 :         test_CloseNode_int(tctx, t->p, &hNode);
    1780             : 
    1781           0 :         return ret;
    1782             : }
    1783             : 
    1784           0 : static bool test_EvictNode_int(struct torture_context *tctx,
    1785             :                                struct dcerpc_pipe *p,
    1786             :                                struct policy_handle *hNode)
    1787             : {
    1788           0 :         struct dcerpc_binding_handle *b = p->binding_handle;
    1789           0 :         struct clusapi_EvictNode r;
    1790           0 :         WERROR rpc_status;
    1791             : 
    1792           0 :         r.in.hNode = *hNode;
    1793           0 :         r.out.rpc_status = &rpc_status;
    1794             : 
    1795           0 :         torture_assert_ntstatus_ok(tctx,
    1796             :                 dcerpc_clusapi_EvictNode_r(b, tctx, &r),
    1797             :                 "EvictNode failed");
    1798           0 :         torture_assert_werr_ok(tctx,
    1799             :                 r.out.result,
    1800             :                 "EvictNode failed");
    1801             : 
    1802           0 :         return true;
    1803             : }
    1804             : 
    1805           0 : static bool test_EvictNode(struct torture_context *tctx,
    1806             :                            void *data)
    1807             : {
    1808           0 :         struct torture_clusapi_context *t =
    1809           0 :                 talloc_get_type_abort(data, struct torture_clusapi_context);
    1810           0 :         struct policy_handle hNode;
    1811           0 :         bool ret = true;
    1812             : 
    1813           0 :         if (!test_OpenNode_int(tctx, t->p, t->NodeName, &hNode)) {
    1814           0 :                 return false;
    1815             :         }
    1816             : 
    1817           0 :         ret = test_EvictNode_int(tctx, t->p, &hNode);
    1818             : 
    1819           0 :         test_CloseNode_int(tctx, t->p, &hNode);
    1820             : 
    1821           0 :         return ret;
    1822             : }
    1823             : 
    1824           0 : static bool test_one_node(struct torture_context *tctx,
    1825             :                           struct dcerpc_pipe *p,
    1826             :                           const char *node_name)
    1827             : {
    1828           0 :         struct policy_handle hNode;
    1829             : 
    1830           0 :         torture_assert(tctx,
    1831             :                 test_OpenNode_int(tctx, p, node_name, &hNode),
    1832             :                 "failed to open node");
    1833           0 :         test_CloseNode_int(tctx, p, &hNode);
    1834             : 
    1835           0 :         torture_assert(tctx,
    1836             :                 test_OpenNodeEx_int(tctx, p, node_name, &hNode),
    1837             :                 "failed to openex node");
    1838             : 
    1839           0 :         torture_assert(tctx,
    1840             :                 test_GetNodeId_int(tctx, p, &hNode),
    1841             :                 "failed to query node id");
    1842           0 :         torture_assert(tctx,
    1843             :                 test_GetNodeState_int(tctx, p, &hNode),
    1844             :                 "failed to query node id");
    1845             : 
    1846           0 :         test_CloseNode_int(tctx, p, &hNode);
    1847             : 
    1848           0 :         return true;
    1849             : }
    1850             : 
    1851           0 : static bool test_all_nodes(struct torture_context *tctx,
    1852             :                            void *data)
    1853             : {
    1854           0 :         struct torture_clusapi_context *t =
    1855           0 :                 talloc_get_type_abort(data, struct torture_clusapi_context);
    1856           0 :         struct dcerpc_binding_handle *b = t->p->binding_handle;
    1857           0 :         struct clusapi_CreateEnum r;
    1858           0 :         uint32_t dwType = CLUSTER_ENUM_NODE;
    1859           0 :         struct ENUM_LIST *ReturnEnum;
    1860           0 :         WERROR rpc_status;
    1861           0 :         int i;
    1862             : 
    1863           0 :         r.in.dwType = dwType;
    1864           0 :         r.out.ReturnEnum = &ReturnEnum;
    1865           0 :         r.out.rpc_status = &rpc_status;
    1866             : 
    1867           0 :         torture_assert_ntstatus_ok(tctx,
    1868             :                 dcerpc_clusapi_CreateEnum_r(b, tctx, &r),
    1869             :                 "CreateEnum failed");
    1870           0 :         torture_assert_werr_ok(tctx,
    1871             :                 r.out.result,
    1872             :                 "CreateEnum failed");
    1873             : 
    1874           0 :         for (i=0; i < ReturnEnum->EntryCount; i++) {
    1875             : 
    1876           0 :                 struct ENUM_ENTRY e = ReturnEnum->Entry[i];
    1877             : 
    1878           0 :                 torture_assert_int_equal(tctx, e.Type, CLUSTER_ENUM_NODE, "type mismatch");
    1879             : 
    1880           0 :                 torture_assert(tctx,
    1881             :                         test_one_node(tctx, t->p, e.Name),
    1882             :                         "failed to test one node");
    1883             :         }
    1884             : 
    1885           0 :         return true;
    1886             : }
    1887             : 
    1888           0 : static bool test_OpenGroup_int(struct torture_context *tctx,
    1889             :                                struct dcerpc_pipe *p,
    1890             :                                const char *lpszGroupName,
    1891             :                                struct policy_handle *hGroup)
    1892             : {
    1893           0 :         struct dcerpc_binding_handle *b = p->binding_handle;
    1894           0 :         struct clusapi_OpenGroup r;
    1895           0 :         WERROR Status;
    1896           0 :         WERROR rpc_status;
    1897             : 
    1898           0 :         r.in.lpszGroupName = lpszGroupName;
    1899           0 :         r.out.rpc_status = &rpc_status;
    1900           0 :         r.out.Status = &Status;
    1901           0 :         r.out.hGroup= hGroup;
    1902             : 
    1903           0 :         torture_assert_ntstatus_ok(tctx,
    1904             :                 dcerpc_clusapi_OpenGroup_r(b, tctx, &r),
    1905             :                 "OpenGroup failed");
    1906           0 :         torture_assert_werr_ok(tctx,
    1907             :                 *r.out.Status,
    1908             :                 "OpenGroup failed");
    1909             : 
    1910           0 :         return true;
    1911             : }
    1912             : 
    1913           0 : static bool test_OpenGroupEx_int(struct torture_context *tctx,
    1914             :                                  struct dcerpc_pipe *p,
    1915             :                                  const char *lpszGroupName,
    1916             :                                  struct policy_handle *hGroup)
    1917             : {
    1918           0 :         struct dcerpc_binding_handle *b = p->binding_handle;
    1919           0 :         struct clusapi_OpenGroupEx r;
    1920           0 :         uint32_t lpdwGrantedAccess;
    1921           0 :         WERROR Status;
    1922           0 :         WERROR rpc_status;
    1923             : 
    1924           0 :         r.in.lpszGroupName = lpszGroupName;
    1925           0 :         r.in.dwDesiredAccess = SEC_FLAG_MAXIMUM_ALLOWED;
    1926           0 :         r.out.lpdwGrantedAccess = &lpdwGrantedAccess;
    1927           0 :         r.out.rpc_status = &rpc_status;
    1928           0 :         r.out.Status = &Status;
    1929           0 :         r.out.hGroup= hGroup;
    1930             : 
    1931           0 :         torture_assert_ntstatus_ok(tctx,
    1932             :                 dcerpc_clusapi_OpenGroupEx_r(b, tctx, &r),
    1933             :                 "OpenGroupEx failed");
    1934           0 :         torture_assert_werr_ok(tctx,
    1935             :                 *r.out.Status,
    1936             :                 "OpenGroupEx failed");
    1937             : 
    1938           0 :         return true;
    1939             : }
    1940             : 
    1941           0 : static bool test_CloseGroup_int(struct torture_context *tctx,
    1942             :                                 struct dcerpc_pipe *p,
    1943             :                                 struct policy_handle *Group)
    1944             : {
    1945           0 :         struct dcerpc_binding_handle *b = p->binding_handle;
    1946           0 :         struct clusapi_CloseGroup r;
    1947             : 
    1948           0 :         r.in.Group = Group;
    1949           0 :         r.out.Group = Group;
    1950             : 
    1951           0 :         torture_assert_ntstatus_ok(tctx,
    1952             :                 dcerpc_clusapi_CloseGroup_r(b, tctx, &r),
    1953             :                 "CloseGroup failed");
    1954           0 :         torture_assert_werr_ok(tctx,
    1955             :                 r.out.result,
    1956             :                 "CloseGroup failed");
    1957           0 :         torture_assert(tctx,
    1958             :                 ndr_policy_handle_empty(Group),
    1959             :                 "policy_handle non empty after CloseGroup");
    1960             : 
    1961           0 :         return true;
    1962             : }
    1963             : 
    1964           0 : static bool test_OpenGroup(struct torture_context *tctx,
    1965             :                            void *data)
    1966             : {
    1967           0 :         struct torture_clusapi_context *t =
    1968           0 :                 talloc_get_type_abort(data, struct torture_clusapi_context);
    1969           0 :         struct policy_handle hGroup;
    1970             : 
    1971           0 :         if (!test_OpenGroup_int(tctx, t->p, "Cluster Group", &hGroup)) {
    1972           0 :                 return false;
    1973             :         }
    1974             : 
    1975           0 :         test_CloseGroup_int(tctx, t->p, &hGroup);
    1976             : 
    1977           0 :         return true;
    1978             : }
    1979             : 
    1980           0 : static bool test_OpenGroupEx(struct torture_context *tctx,
    1981             :                              void *data)
    1982             : {
    1983           0 :         struct torture_clusapi_context *t =
    1984           0 :                 talloc_get_type_abort(data, struct torture_clusapi_context);
    1985           0 :         struct policy_handle hGroup;
    1986             : 
    1987           0 :         if (!test_OpenGroupEx_int(tctx, t->p, "Cluster Group", &hGroup)) {
    1988           0 :                 return false;
    1989             :         }
    1990             : 
    1991           0 :         test_CloseGroup_int(tctx, t->p, &hGroup);
    1992             : 
    1993           0 :         return true;
    1994             : }
    1995             : 
    1996           0 : static bool test_CloseGroup(struct torture_context *tctx,
    1997             :                             void *data)
    1998             : {
    1999           0 :         struct torture_clusapi_context *t =
    2000           0 :                 talloc_get_type_abort(data, struct torture_clusapi_context);
    2001           0 :         struct policy_handle hGroup;
    2002             : 
    2003           0 :         if (!test_OpenGroup_int(tctx, t->p, "Cluster Group", &hGroup)) {
    2004           0 :                 return false;
    2005             :         }
    2006             : 
    2007           0 :         return test_CloseGroup_int(tctx, t->p, &hGroup);
    2008             : }
    2009             : 
    2010           0 : static bool test_GetGroupState_int(struct torture_context *tctx,
    2011             :                                    struct dcerpc_pipe *p,
    2012             :                                    struct policy_handle *hGroup)
    2013             : {
    2014           0 :         struct dcerpc_binding_handle *b = p->binding_handle;
    2015           0 :         struct clusapi_GetGroupState r;
    2016           0 :         enum clusapi_ClusterGroupState State;
    2017           0 :         const char *NodeName;
    2018           0 :         WERROR rpc_status;
    2019             : 
    2020           0 :         r.in.hGroup = *hGroup;
    2021           0 :         r.out.State = &State;
    2022           0 :         r.out.NodeName = &NodeName;
    2023           0 :         r.out.rpc_status = &rpc_status;
    2024             : 
    2025           0 :         torture_assert_ntstatus_ok(tctx,
    2026             :                 dcerpc_clusapi_GetGroupState_r(b, tctx, &r),
    2027             :                 "GetGroupState failed");
    2028           0 :         torture_assert_werr_ok(tctx,
    2029             :                 r.out.result,
    2030             :                 "GetGroupState failed");
    2031             : 
    2032           0 :         return true;
    2033             : }
    2034             : 
    2035           0 : static bool test_GetGroupState(struct torture_context *tctx,
    2036             :                                void *data)
    2037             : {
    2038           0 :         struct torture_clusapi_context *t =
    2039           0 :                 talloc_get_type_abort(data, struct torture_clusapi_context);
    2040           0 :         struct policy_handle hGroup;
    2041           0 :         bool ret = true;
    2042             : 
    2043           0 :         if (!test_OpenGroup_int(tctx, t->p, "Cluster Group", &hGroup)) {
    2044           0 :                 return false;
    2045             :         }
    2046             : 
    2047           0 :         ret = test_GetGroupState_int(tctx, t->p, &hGroup);
    2048             : 
    2049           0 :         test_CloseGroup_int(tctx, t->p, &hGroup);
    2050             : 
    2051           0 :         return ret;
    2052             : }
    2053             : 
    2054           0 : static bool test_GetGroupId_int(struct torture_context *tctx,
    2055             :                                 struct dcerpc_pipe *p,
    2056             :                                 struct policy_handle *hGroup)
    2057             : {
    2058           0 :         struct dcerpc_binding_handle *b = p->binding_handle;
    2059           0 :         struct clusapi_GetGroupId r;
    2060           0 :         const char *pGuid;
    2061           0 :         WERROR rpc_status;
    2062             : 
    2063           0 :         r.in.hGroup = *hGroup;
    2064           0 :         r.out.pGuid = &pGuid;
    2065           0 :         r.out.rpc_status = &rpc_status;
    2066             : 
    2067           0 :         torture_assert_ntstatus_ok(tctx,
    2068             :                 dcerpc_clusapi_GetGroupId_r(b, tctx, &r),
    2069             :                 "GetGroupId failed");
    2070           0 :         torture_assert_werr_ok(tctx,
    2071             :                 r.out.result,
    2072             :                 "GetGroupId failed");
    2073             : 
    2074           0 :         return true;
    2075             : }
    2076             : 
    2077           0 : static bool test_GetGroupId(struct torture_context *tctx,
    2078             :                             void *data)
    2079             : {
    2080           0 :         struct torture_clusapi_context *t =
    2081           0 :                 talloc_get_type_abort(data, struct torture_clusapi_context);
    2082           0 :         struct policy_handle hGroup;
    2083           0 :         bool ret = true;
    2084             : 
    2085           0 :         if (!test_OpenGroup_int(tctx, t->p, "Cluster Group", &hGroup)) {
    2086           0 :                 return false;
    2087             :         }
    2088             : 
    2089           0 :         ret = test_GetGroupId_int(tctx, t->p, &hGroup);
    2090             : 
    2091           0 :         test_CloseGroup_int(tctx, t->p, &hGroup);
    2092             : 
    2093           0 :         return ret;
    2094             : }
    2095             : 
    2096           0 : static bool test_GroupControl_int(struct torture_context *tctx,
    2097             :                                   struct dcerpc_pipe *p,
    2098             :                                   struct policy_handle *hGroup,
    2099             :                                   enum clusapi_GroupControlCode dwControlCode)
    2100             : {
    2101           0 :         struct dcerpc_binding_handle *b = p->binding_handle;
    2102           0 :         struct clusapi_GroupControl r;
    2103           0 :         uint32_t lpBytesReturned;
    2104           0 :         uint32_t lpcbRequired;
    2105           0 :         WERROR rpc_status;
    2106             : 
    2107           0 :         r.in.hGroup = *hGroup;
    2108           0 :         r.in.dwControlCode = 0;
    2109           0 :         r.in.lpInBuffer = NULL;
    2110           0 :         r.in.nInBufferSize = 0;
    2111           0 :         r.in.nOutBufferSize = 0;
    2112           0 :         r.out.lpOutBuffer = NULL;
    2113           0 :         r.out.lpBytesReturned = &lpBytesReturned;
    2114           0 :         r.out.lpcbRequired = &lpcbRequired;
    2115           0 :         r.out.rpc_status = &rpc_status;
    2116             : 
    2117           0 :         torture_assert_ntstatus_ok(tctx,
    2118             :                 dcerpc_clusapi_GroupControl_r(b, tctx, &r),
    2119             :                 "GroupControl failed");
    2120           0 :         torture_assert_werr_equal(tctx,
    2121             :                 r.out.result,
    2122             :                 WERR_INVALID_FUNCTION,
    2123             :                 "GroupControl failed");
    2124             : 
    2125           0 :         r.in.dwControlCode = dwControlCode;
    2126             : 
    2127           0 :         torture_assert_ntstatus_ok(tctx,
    2128             :                 dcerpc_clusapi_GroupControl_r(b, tctx, &r),
    2129             :                 "GroupControl failed");
    2130             : 
    2131           0 :         if (W_ERROR_EQUAL(r.out.result, WERR_MORE_DATA)) {
    2132           0 :                 r.out.lpOutBuffer = talloc_zero_array(tctx, uint8_t, *r.out.lpcbRequired);
    2133           0 :                 r.in.nOutBufferSize = *r.out.lpcbRequired;
    2134           0 :                 torture_assert_ntstatus_ok(tctx,
    2135             :                         dcerpc_clusapi_GroupControl_r(b, tctx, &r),
    2136             :                         "GroupControl failed");
    2137             :         }
    2138           0 :         torture_assert_werr_ok(tctx,
    2139             :                 r.out.result,
    2140             :                 "GroupControl failed");
    2141             : 
    2142             :         /* now try what happens when we query with a buffer large enough to hold
    2143             :          * the entire packet */
    2144             : 
    2145           0 :         r.in.nOutBufferSize = 0x400;
    2146           0 :         r.out.lpOutBuffer = talloc_zero_array(tctx, uint8_t, r.in.nOutBufferSize);
    2147             : 
    2148           0 :         torture_assert_ntstatus_ok(tctx,
    2149             :                 dcerpc_clusapi_GroupControl_r(b, tctx, &r),
    2150             :                 "GroupControl failed");
    2151           0 :         torture_assert_werr_ok(tctx,
    2152             :                 r.out.result,
    2153             :                 "GroupControl failed");
    2154           0 :         torture_assert(tctx, *r.out.lpBytesReturned < r.in.nOutBufferSize,
    2155             :                 "lpBytesReturned expected to be smaller than input size nOutBufferSize");
    2156             : 
    2157           0 :         return true;
    2158             : }
    2159             : 
    2160           0 : static bool test_CreateGroupResourceEnum_int(struct torture_context *tctx,
    2161             :                                              struct dcerpc_pipe *p,
    2162             :                                              struct policy_handle *hGroup)
    2163             : {
    2164           0 :         struct dcerpc_binding_handle *b = p->binding_handle;
    2165           0 :         struct clusapi_CreateGroupResourceEnum r;
    2166           0 :         uint32_t dwType[] = {
    2167             :                 CLUSTER_GROUP_ENUM_CONTAINS,
    2168             :                 CLUSTER_GROUP_ENUM_NODES
    2169             :         };
    2170           0 :         uint32_t dwType_invalid[] = {
    2171             :                 0x00000040,
    2172             :                 0x00000080,
    2173             :                 0x00000100 /* and many more ... */
    2174             :         };
    2175           0 :         struct ENUM_LIST *ReturnEnum;
    2176           0 :         WERROR rpc_status;
    2177           0 :         int i;
    2178             : 
    2179           0 :         r.in.hGroup = *hGroup;
    2180             : 
    2181           0 :         for (i=0; i < ARRAY_SIZE(dwType); i++) {
    2182             : 
    2183           0 :                 r.in.hGroup = *hGroup;
    2184           0 :                 r.in.dwType = dwType[i];
    2185           0 :                 r.out.ReturnEnum = &ReturnEnum;
    2186           0 :                 r.out.rpc_status = &rpc_status;
    2187             : 
    2188           0 :                 torture_assert_ntstatus_ok(tctx,
    2189             :                         dcerpc_clusapi_CreateGroupResourceEnum_r(b, tctx, &r),
    2190             :                         "CreateGroupResourceEnum failed");
    2191           0 :                 torture_assert_werr_ok(tctx,
    2192             :                         r.out.result,
    2193             :                         "CreateGroupResourceEnum failed");
    2194             :         }
    2195             : 
    2196           0 :         for (i=0; i < ARRAY_SIZE(dwType_invalid); i++) {
    2197             : 
    2198           0 :                 r.in.dwType = dwType_invalid[i];
    2199           0 :                 r.out.ReturnEnum = &ReturnEnum;
    2200           0 :                 r.out.rpc_status = &rpc_status;
    2201             : 
    2202           0 :                 torture_assert_ntstatus_ok(tctx,
    2203             :                         dcerpc_clusapi_CreateGroupResourceEnum_r(b, tctx, &r),
    2204             :                         "CreateGroupResourceEnum failed");
    2205           0 :                 torture_assert_werr_ok(tctx,
    2206             :                         r.out.result,
    2207             :                         "CreateGroupResourceEnum failed");
    2208             :         }
    2209             : 
    2210           0 :         return true;
    2211             : }
    2212             : 
    2213             : 
    2214           0 : static bool test_GroupControl(struct torture_context *tctx,
    2215             :                               void *data)
    2216             : {
    2217           0 :         struct torture_clusapi_context *t =
    2218           0 :                 talloc_get_type_abort(data, struct torture_clusapi_context);
    2219           0 :         struct policy_handle hGroup;
    2220           0 :         bool ret = true;
    2221             : 
    2222           0 :         if (!test_OpenGroup_int(tctx, t->p, "Cluster Group", &hGroup)) {
    2223           0 :                 return false;
    2224             :         }
    2225             : 
    2226           0 :         ret = test_GroupControl_int(tctx, t->p, &hGroup, CLUSCTL_GROUP_GET_CHARACTERISTICS);
    2227           0 :         if (!ret) {
    2228           0 :                 return false;
    2229             :         }
    2230             : 
    2231           0 :         ret = test_GroupControl_int(tctx, t->p, &hGroup, CLUSCTL_GROUP_GET_RO_COMMON_PROPERTIES);
    2232           0 :         if (!ret) {
    2233           0 :                 return false;
    2234             :         }
    2235             : 
    2236           0 :         ret = test_GroupControl_int(tctx, t->p, &hGroup, CLUSCTL_GROUP_GET_FLAGS);
    2237           0 :         if (!ret) {
    2238           0 :                 return false;
    2239             :         }
    2240             : 
    2241           0 :         test_CloseGroup_int(tctx, t->p, &hGroup);
    2242             : 
    2243           0 :         return ret;
    2244             : }
    2245             : 
    2246           0 : static bool test_OnlineGroup_int(struct torture_context *tctx,
    2247             :                                  struct dcerpc_pipe *p,
    2248             :                                  struct policy_handle *hGroup)
    2249             : {
    2250           0 :         struct dcerpc_binding_handle *b = p->binding_handle;
    2251           0 :         struct clusapi_OnlineGroup r;
    2252           0 :         WERROR rpc_status;
    2253             : 
    2254           0 :         r.in.hGroup = *hGroup;
    2255           0 :         r.out.rpc_status = &rpc_status;
    2256             : 
    2257           0 :         torture_assert_ntstatus_ok(tctx,
    2258             :                 dcerpc_clusapi_OnlineGroup_r(b, tctx, &r),
    2259             :                 "OnlineGroup failed");
    2260           0 :         torture_assert_werr_ok(tctx,
    2261             :                 r.out.result,
    2262             :                 "OnlineGroup failed");
    2263             : 
    2264           0 :         return true;
    2265             : }
    2266             : 
    2267           0 : static bool test_OnlineGroup(struct torture_context *tctx,
    2268             :                              void *data)
    2269             : {
    2270           0 :         struct torture_clusapi_context *t =
    2271           0 :                 talloc_get_type_abort(data, struct torture_clusapi_context);
    2272           0 :         struct policy_handle hGroup;
    2273           0 :         bool ret = true;
    2274             : 
    2275           0 :         if (!test_OpenGroup_int(tctx, t->p, "Cluster Group", &hGroup)) {
    2276           0 :                 return false;
    2277             :         }
    2278             : 
    2279           0 :         ret = test_OnlineGroup_int(tctx, t->p, &hGroup);
    2280             : 
    2281           0 :         test_CloseGroup_int(tctx, t->p, &hGroup);
    2282             : 
    2283           0 :         return ret;
    2284             : }
    2285             : 
    2286           0 : static bool test_OfflineGroup_int(struct torture_context *tctx,
    2287             :                                   struct dcerpc_pipe *p,
    2288             :                                   struct policy_handle *hGroup)
    2289             : {
    2290           0 :         struct dcerpc_binding_handle *b = p->binding_handle;
    2291           0 :         struct clusapi_OfflineGroup r;
    2292           0 :         WERROR rpc_status;
    2293             : 
    2294           0 :         r.in.hGroup = *hGroup;
    2295           0 :         r.out.rpc_status = &rpc_status;
    2296             : 
    2297           0 :         torture_assert_ntstatus_ok(tctx,
    2298             :                 dcerpc_clusapi_OfflineGroup_r(b, tctx, &r),
    2299             :                 "OfflineGroup failed");
    2300           0 :         torture_assert_werr_ok(tctx,
    2301             :                 r.out.result,
    2302             :                 "OfflineGroup failed");
    2303             : 
    2304           0 :         return true;
    2305             : }
    2306             : 
    2307           0 : static bool test_OfflineGroup(struct torture_context *tctx,
    2308             :                               void *data)
    2309             : {
    2310           0 :         struct torture_clusapi_context *t =
    2311           0 :                 talloc_get_type_abort(data, struct torture_clusapi_context);
    2312           0 :         struct policy_handle hGroup;
    2313           0 :         bool ret = true;
    2314             : 
    2315           0 :         if (!test_OpenGroup_int(tctx, t->p, "Cluster Group", &hGroup)) {
    2316           0 :                 return false;
    2317             :         }
    2318             : 
    2319           0 :         ret = test_OfflineGroup_int(tctx, t->p, &hGroup);
    2320             : 
    2321           0 :         test_CloseGroup_int(tctx, t->p, &hGroup);
    2322             : 
    2323           0 :         return ret;
    2324             : }
    2325             : 
    2326           0 : static bool test_one_group(struct torture_context *tctx,
    2327             :                            struct dcerpc_pipe *p,
    2328             :                            const char *group_name)
    2329             : {
    2330           0 :         struct policy_handle hGroup;
    2331             : 
    2332           0 :         torture_assert(tctx,
    2333             :                 test_OpenGroup_int(tctx, p, group_name, &hGroup),
    2334             :                 "failed to open group");
    2335           0 :         test_CloseGroup_int(tctx, p, &hGroup);
    2336             : 
    2337           0 :         torture_assert(tctx,
    2338             :                 test_OpenGroupEx_int(tctx, p, group_name, &hGroup),
    2339             :                 "failed to openex group");
    2340             : 
    2341           0 :         torture_assert(tctx,
    2342             :                 test_GetGroupId_int(tctx, p, &hGroup),
    2343             :                 "failed to query group id");
    2344           0 :         torture_assert(tctx,
    2345             :                 test_GetGroupState_int(tctx, p, &hGroup),
    2346             :                 "failed to query group id");
    2347             : 
    2348           0 :         torture_assert(tctx,
    2349             :                 test_GroupControl_int(tctx, p, &hGroup, CLUSCTL_GROUP_GET_FLAGS),
    2350             :                 "failed to query group control");
    2351             : 
    2352           0 :         torture_assert(tctx,
    2353             :                 test_CreateGroupResourceEnum_int(tctx, p, &hGroup),
    2354             :                 "failed to query resource enum");
    2355             : 
    2356           0 :         test_CloseGroup_int(tctx, p, &hGroup);
    2357             : 
    2358           0 :         return true;
    2359             : }
    2360             : 
    2361           0 : static bool test_all_groups(struct torture_context *tctx,
    2362             :                             void *data)
    2363             : {
    2364           0 :         struct torture_clusapi_context *t =
    2365           0 :                 talloc_get_type_abort(data, struct torture_clusapi_context);
    2366           0 :         struct dcerpc_binding_handle *b = t->p->binding_handle;
    2367           0 :         struct clusapi_CreateEnum r;
    2368           0 :         uint32_t dwType = CLUSTER_ENUM_GROUP;
    2369           0 :         struct ENUM_LIST *ReturnEnum;
    2370           0 :         WERROR rpc_status;
    2371           0 :         int i;
    2372             : 
    2373           0 :         r.in.dwType = dwType;
    2374           0 :         r.out.ReturnEnum = &ReturnEnum;
    2375           0 :         r.out.rpc_status = &rpc_status;
    2376             : 
    2377           0 :         torture_assert_ntstatus_ok(tctx,
    2378             :                 dcerpc_clusapi_CreateEnum_r(b, tctx, &r),
    2379             :                 "CreateEnum failed");
    2380           0 :         torture_assert_werr_ok(tctx,
    2381             :                 r.out.result,
    2382             :                 "CreateEnum failed");
    2383             : 
    2384           0 :         for (i=0; i < ReturnEnum->EntryCount; i++) {
    2385             : 
    2386           0 :                 struct ENUM_ENTRY e = ReturnEnum->Entry[i];
    2387             : 
    2388           0 :                 torture_assert_int_equal(tctx, e.Type, CLUSTER_ENUM_GROUP, "type mismatch");
    2389             : 
    2390           0 :                 torture_assert(tctx,
    2391             :                         test_one_group(tctx, t->p, e.Name),
    2392             :                         "failed to test one group");
    2393             :         }
    2394             : 
    2395           0 :         return true;
    2396             : }
    2397             : 
    2398           0 : static bool test_BackupClusterDatabase(struct torture_context *tctx,
    2399             :                                        void *data)
    2400             : {
    2401           0 :         struct torture_clusapi_context *t =
    2402           0 :                 talloc_get_type_abort(data, struct torture_clusapi_context);
    2403           0 :         struct dcerpc_binding_handle *b = t->p->binding_handle;
    2404           0 :         struct clusapi_BackupClusterDatabase r;
    2405           0 :         WERROR rpc_status;
    2406             : 
    2407           0 :         r.in.lpszPathName = "c:\\cluster_backup";
    2408           0 :         r.out.rpc_status = &rpc_status;
    2409             : 
    2410           0 :         torture_assert_ntstatus_ok(tctx,
    2411             :                 dcerpc_clusapi_BackupClusterDatabase_r(b, tctx, &r),
    2412             :                 "BackupClusterDatabase failed");
    2413           0 :         torture_assert_werr_equal(tctx,
    2414             :                 r.out.result,
    2415             :                 WERR_CALL_NOT_IMPLEMENTED,
    2416             :                 "BackupClusterDatabase failed");
    2417             : 
    2418           0 :         return true;
    2419             : }
    2420             : 
    2421           0 : static bool test_SetServiceAccountPassword(struct torture_context *tctx,
    2422             :                                            void *data)
    2423             : {
    2424           0 :         struct torture_clusapi_context *t =
    2425           0 :                 talloc_get_type_abort(data, struct torture_clusapi_context);
    2426           0 :         struct dcerpc_binding_handle *b = t->p->binding_handle;
    2427           0 :         struct clusapi_SetServiceAccountPassword r;
    2428           0 :         uint32_t SizeReturned;
    2429           0 :         uint32_t ExpectedBufferSize;
    2430             : 
    2431           0 :         r.in.lpszNewPassword = "P@ssw0rd!";
    2432           0 :         r.in.dwFlags = IDL_CLUSTER_SET_PASSWORD_IGNORE_DOWN_NODES;
    2433           0 :         r.in.ReturnStatusBufferSize = 1024;
    2434           0 :         r.out.ReturnStatusBufferPtr = NULL;
    2435           0 :         r.out.SizeReturned = &SizeReturned;
    2436           0 :         r.out.ExpectedBufferSize = &ExpectedBufferSize;
    2437             : 
    2438           0 :         torture_assert_ntstatus_ok(tctx,
    2439             :                 dcerpc_clusapi_SetServiceAccountPassword_r(b, tctx, &r),
    2440             :                 "SetServiceAccountPassword failed");
    2441           0 :         torture_assert_werr_equal(tctx,
    2442             :                 r.out.result,
    2443             :                 WERR_CALL_NOT_IMPLEMENTED,
    2444             :                 "SetServiceAccountPassword failed");
    2445             : 
    2446           0 :         return true;
    2447             : }
    2448             : 
    2449           0 : static bool test_ClusterControl_int(struct torture_context *tctx,
    2450             :                                     struct dcerpc_pipe *p,
    2451             :                                     struct policy_handle *Cluster,
    2452             :                                     enum clusapi_ClusterControlCode dwControlCode)
    2453             : {
    2454           0 :         struct dcerpc_binding_handle *b = p->binding_handle;
    2455           0 :         struct clusapi_ClusterControl r;
    2456           0 :         uint32_t lpBytesReturned;
    2457           0 :         uint32_t lpcbRequired;
    2458           0 :         WERROR rpc_status;
    2459             : 
    2460           0 :         r.in.hCluster = *Cluster;
    2461           0 :         r.in.dwControlCode = 0;
    2462           0 :         r.in.lpInBuffer = NULL;
    2463           0 :         r.in.nInBufferSize = 0;
    2464           0 :         r.in.nOutBufferSize = 0;
    2465           0 :         r.out.lpOutBuffer = NULL;
    2466           0 :         r.out.lpBytesReturned = &lpBytesReturned;
    2467           0 :         r.out.lpcbRequired = &lpcbRequired;
    2468           0 :         r.out.rpc_status = &rpc_status;
    2469             : 
    2470           0 :         torture_assert_ntstatus_ok(tctx,
    2471             :                 dcerpc_clusapi_ClusterControl_r(b, tctx, &r),
    2472             :                 "ClusterControl failed");
    2473           0 :         torture_assert_werr_equal(tctx,
    2474             :                 r.out.result,
    2475             :                 WERR_INVALID_FUNCTION,
    2476             :                 "ClusterControl failed");
    2477             : 
    2478           0 :         r.in.dwControlCode = dwControlCode;
    2479             : 
    2480           0 :         torture_assert_ntstatus_ok(tctx,
    2481             :                 dcerpc_clusapi_ClusterControl_r(b, tctx, &r),
    2482             :                 "ClusterControl failed");
    2483             : 
    2484           0 :         if (W_ERROR_EQUAL(r.out.result, WERR_MORE_DATA)) {
    2485           0 :                 r.out.lpOutBuffer = talloc_zero_array(tctx, uint8_t, *r.out.lpcbRequired);
    2486           0 :                 r.in.nOutBufferSize = *r.out.lpcbRequired;
    2487           0 :                 torture_assert_ntstatus_ok(tctx,
    2488             :                         dcerpc_clusapi_ClusterControl_r(b, tctx, &r),
    2489             :                         "ClusterControl failed");
    2490             :         }
    2491           0 :         torture_assert_werr_ok(tctx,
    2492             :                 r.out.result,
    2493             :                 "ClusterControl failed");
    2494             : 
    2495             :         /* now try what happens when we query with a buffer large enough to hold
    2496             :          * the entire packet */
    2497             : 
    2498           0 :         r.in.nOutBufferSize = 0xffff;
    2499           0 :         r.out.lpOutBuffer = talloc_zero_array(tctx, uint8_t, r.in.nOutBufferSize);
    2500             : 
    2501           0 :         torture_assert_ntstatus_ok(tctx,
    2502             :                 dcerpc_clusapi_ClusterControl_r(b, tctx, &r),
    2503             :                 "ClusterControl failed");
    2504           0 :         torture_assert_werr_ok(tctx,
    2505             :                 r.out.result,
    2506             :                 "ClusterControl failed");
    2507           0 :         torture_assert(tctx, *r.out.lpBytesReturned < r.in.nOutBufferSize,
    2508             :                 "lpBytesReturned expected to be smaller than input size nOutBufferSize");
    2509             : 
    2510           0 :         return true;
    2511             : }
    2512             : 
    2513           0 : static bool test_ClusterControl(struct torture_context *tctx,
    2514             :                                 void *data)
    2515             : {
    2516           0 :         struct torture_clusapi_context *t =
    2517           0 :                 talloc_get_type_abort(data, struct torture_clusapi_context);
    2518           0 :         struct policy_handle Cluster;
    2519           0 :         bool ret = true;
    2520           0 :         uint32_t control_codes[] = {
    2521             :                 CLUSCTL_CLUSTER_GET_COMMON_PROPERTIES,
    2522             :                 CLUSCTL_CLUSTER_GET_RO_COMMON_PROPERTIES,
    2523             :                 CLUSCTL_CLUSTER_GET_FQDN,
    2524             :                 CLUSCTL_CLUSTER_GET_PRIVATE_PROPERTIES,
    2525             :                 CLUSCTL_CLUSTER_CHECK_VOTER_DOWN
    2526             :         };
    2527           0 :         int i;
    2528             : 
    2529           0 :         if (!test_OpenCluster_int(tctx, t->p, &Cluster)) {
    2530           0 :                 return false;
    2531             :         }
    2532             : 
    2533           0 :         for (i=0; i < ARRAY_SIZE(control_codes); i++) {
    2534           0 :                 ret = test_ClusterControl_int(tctx, t->p, &Cluster,
    2535           0 :                                               control_codes[i]);
    2536           0 :                 if (!ret) {
    2537           0 :                         goto done;
    2538             :                 }
    2539             :         }
    2540             : 
    2541           0 :  done:
    2542           0 :         test_CloseCluster_int(tctx, t->p, &Cluster);
    2543             : 
    2544           0 :         return ret;
    2545             : }
    2546             : 
    2547           0 : static bool test_CreateResTypeEnum(struct torture_context *tctx,
    2548             :                                    void *data)
    2549             : {
    2550           0 :         struct torture_clusapi_context *t =
    2551           0 :                 talloc_get_type_abort(data, struct torture_clusapi_context);
    2552           0 :         struct dcerpc_binding_handle *b = t->p->binding_handle;
    2553           0 :         struct clusapi_CreateResTypeEnum r;
    2554           0 :         uint32_t dwType[] = {
    2555             :                 CLUSTER_RESOURCE_TYPE_ENUM_NODES,
    2556             :                 CLUSTER_RESOURCE_TYPE_ENUM_RESOURCES
    2557             :         };
    2558           0 :         uint32_t dwType_invalid[] = {
    2559             :                 0x00000040,
    2560             :                 0x00000080,
    2561             :                 0x00000100 /* and many more ... */
    2562             :         };
    2563           0 :         const char *valid_names[] = {
    2564             :                 "Physical Disk",
    2565             :                 "Storage Pool"
    2566             :         };
    2567           0 :         const char *invalid_names[] = {
    2568             :                 "INVALID_TYPE_XXXX"
    2569             :         };
    2570           0 :         struct ENUM_LIST *ReturnEnum;
    2571           0 :         WERROR rpc_status;
    2572           0 :         int i, s;
    2573             : 
    2574           0 :         for (s = 0; s < ARRAY_SIZE(valid_names); s++) {
    2575             : 
    2576           0 :                 r.in.lpszTypeName = valid_names[s];
    2577             : 
    2578           0 :                 for (i=0; i < ARRAY_SIZE(dwType); i++) {
    2579             : 
    2580           0 :                         r.in.dwType = dwType[i];
    2581           0 :                         r.out.ReturnEnum = &ReturnEnum;
    2582           0 :                         r.out.rpc_status = &rpc_status;
    2583             : 
    2584           0 :                         torture_assert_ntstatus_ok(tctx,
    2585             :                                 dcerpc_clusapi_CreateResTypeEnum_r(b, tctx, &r),
    2586             :                                 "CreateResTypeEnum failed");
    2587           0 :                         torture_assert_werr_ok(tctx,
    2588             :                                 r.out.result,
    2589             :                                 "CreateResTypeEnum failed");
    2590             :                 }
    2591             : 
    2592           0 :                 for (i=0; i < ARRAY_SIZE(dwType_invalid); i++) {
    2593             : 
    2594           0 :                         r.in.dwType = dwType_invalid[i];
    2595           0 :                         r.out.ReturnEnum = &ReturnEnum;
    2596           0 :                         r.out.rpc_status = &rpc_status;
    2597             : 
    2598           0 :                         torture_assert_ntstatus_ok(tctx,
    2599             :                                 dcerpc_clusapi_CreateResTypeEnum_r(b, tctx, &r),
    2600             :                                 "CreateResTypeEnum failed");
    2601           0 :                         torture_assert_werr_ok(tctx,
    2602             :                                 r.out.result,
    2603             :                                 "CreateResTypeEnum failed");
    2604             :                 }
    2605             :         }
    2606             : 
    2607           0 :         for (s = 0; s < ARRAY_SIZE(invalid_names); s++) {
    2608             : 
    2609           0 :                 r.in.lpszTypeName = invalid_names[s];
    2610             : 
    2611           0 :                 for (i=0; i < ARRAY_SIZE(dwType); i++) {
    2612             : 
    2613           0 :                         r.in.dwType = dwType[i];
    2614           0 :                         r.out.ReturnEnum = &ReturnEnum;
    2615           0 :                         r.out.rpc_status = &rpc_status;
    2616             : 
    2617           0 :                         torture_assert_ntstatus_ok(tctx,
    2618             :                                 dcerpc_clusapi_CreateResTypeEnum_r(b, tctx, &r),
    2619             :                                 "CreateResTypeEnum failed");
    2620           0 :                         torture_assert_werr_equal(tctx,
    2621             :                                 r.out.result,
    2622             :                                 WERR_CLUSTER_RESOURCE_TYPE_NOT_FOUND,
    2623             :                                 "CreateResTypeEnum failed");
    2624             :                 }
    2625             : 
    2626           0 :                 for (i=0; i < ARRAY_SIZE(dwType_invalid); i++) {
    2627             : 
    2628           0 :                         r.in.dwType = dwType_invalid[i];
    2629           0 :                         r.out.ReturnEnum = &ReturnEnum;
    2630           0 :                         r.out.rpc_status = &rpc_status;
    2631             : 
    2632           0 :                         torture_assert_ntstatus_ok(tctx,
    2633             :                                 dcerpc_clusapi_CreateResTypeEnum_r(b, tctx, &r),
    2634             :                                 "CreateResTypeEnum failed");
    2635           0 :                         torture_assert_werr_equal(tctx,
    2636             :                                 r.out.result,
    2637             :                                 WERR_CLUSTER_RESOURCE_TYPE_NOT_FOUND,
    2638             :                                 "CreateResTypeEnum failed");
    2639             :                 }
    2640             :         }
    2641             : 
    2642             : 
    2643           0 :         return true;
    2644             : }
    2645             : 
    2646           0 : static bool test_CreateGroupEnum_int(struct torture_context *tctx,
    2647             :                                      struct dcerpc_pipe *p,
    2648             :                                      struct policy_handle *Cluster,
    2649             :                                      const char **multi_sz,
    2650             :                                      const char **multi_sz_ro)
    2651             : {
    2652           0 :         struct dcerpc_binding_handle *b = p->binding_handle;
    2653           0 :         struct clusapi_CreateGroupEnum r;
    2654           0 :         struct GROUP_ENUM_LIST *pResultList;
    2655           0 :         WERROR rpc_status;
    2656           0 :         DATA_BLOB blob = data_blob_null;
    2657           0 :         DATA_BLOB blob_ro = data_blob_null;
    2658             : 
    2659           0 :         r.in.hCluster = *Cluster;
    2660           0 :         r.in.pProperties = blob.data;
    2661           0 :         r.in.cbProperties = blob.length;
    2662           0 :         r.in.pRoProperties = blob_ro.data;
    2663           0 :         r.in.cbRoProperties = blob_ro.length;
    2664           0 :         r.out.ppResultList = &pResultList;
    2665           0 :         r.out.rpc_status = &rpc_status;
    2666             : 
    2667           0 :         torture_assert_ntstatus_ok(tctx,
    2668             :                 dcerpc_clusapi_CreateGroupEnum_r(b, tctx, &r),
    2669             :                 "CreateGroupEnum failed");
    2670           0 :         torture_assert_werr_ok(tctx,
    2671             :                 r.out.result,
    2672             :                 "CreateGroupEnum failed");
    2673             : 
    2674           0 :         if (!push_reg_multi_sz(tctx, &blob, multi_sz)) {
    2675           0 :                 return false;
    2676             :         }
    2677             : 
    2678           0 :         if (!push_reg_multi_sz(tctx, &blob_ro, multi_sz_ro)) {
    2679           0 :                 return false;
    2680             :         }
    2681             : 
    2682           0 :         r.in.pProperties = blob.data;
    2683           0 :         r.in.cbProperties = blob.length;
    2684             : 
    2685           0 :         r.in.pRoProperties = blob_ro.data;
    2686           0 :         r.in.cbRoProperties = blob_ro.length;
    2687             : 
    2688           0 :         torture_assert_ntstatus_ok(tctx,
    2689             :                 dcerpc_clusapi_CreateGroupEnum_r(b, tctx, &r),
    2690             :                 "CreateGroupEnum failed");
    2691           0 :         torture_assert_werr_ok(tctx,
    2692             :                 r.out.result,
    2693             :                 "CreateGroupEnum failed");
    2694             : 
    2695             : #if 0
    2696             :         {
    2697             :                 int i;
    2698             :                 enum ndr_err_code ndr_err;
    2699             : 
    2700             :                 for (i=0; i < pResultList->EntryCount; i++) {
    2701             :                         struct clusapi_PROPERTY_LIST list;
    2702             :                         torture_comment(tctx, "entry #%d\n", i);
    2703             : 
    2704             :                         blob = data_blob_const(pResultList->Entry[i].Properties,
    2705             :                                                pResultList->Entry[i].cbProperties);
    2706             : 
    2707             :                         ndr_err = ndr_pull_struct_blob(&blob, tctx, &list,
    2708             :                                 (ndr_pull_flags_fn_t)ndr_pull_clusapi_PROPERTY_LIST);
    2709             :                         if (NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
    2710             :                                 NDR_PRINT_DEBUG(clusapi_PROPERTY_LIST, &list);
    2711             :                         }
    2712             : 
    2713             :                         blob_ro = data_blob_const(pResultList->Entry[i].RoProperties,
    2714             :                                                   pResultList->Entry[i].cbRoProperties);
    2715             : 
    2716             :                         ndr_err = ndr_pull_struct_blob(&blob_ro, tctx, &list,
    2717             :                                 (ndr_pull_flags_fn_t)ndr_pull_clusapi_PROPERTY_LIST);
    2718             :                         if (NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
    2719             :                                 NDR_PRINT_DEBUG(clusapi_PROPERTY_LIST, &list);
    2720             :                         }
    2721             :                 }
    2722             :         }
    2723             : #endif
    2724             : 
    2725           0 :         return true;
    2726             : }
    2727             : 
    2728           0 : static bool test_CreateGroupEnum(struct torture_context *tctx,
    2729             :                                  void *data)
    2730             : {
    2731           0 :         struct torture_clusapi_context *t =
    2732           0 :                 talloc_get_type_abort(data, struct torture_clusapi_context);
    2733           0 :         struct policy_handle Cluster;
    2734           0 :         bool ret;
    2735           0 :         const char *multi_sz[] = {
    2736             :                 "Priority", NULL,
    2737             :         };
    2738           0 :         const char *multi_sz_ro[] = {
    2739             :                 "GroupType", NULL,
    2740             :         };
    2741             : 
    2742           0 :         if (!test_OpenCluster_int(tctx, t->p, &Cluster)) {
    2743           0 :                 return false;
    2744             :         }
    2745             : 
    2746           0 :         ret = test_CreateGroupEnum_int(tctx, t->p, &Cluster,
    2747             :                                        multi_sz, multi_sz_ro);
    2748           0 :         if (!ret) {
    2749           0 :                 goto done;
    2750             :         }
    2751             : 
    2752           0 :  done:
    2753           0 :         test_CloseCluster_int(tctx, t->p, &Cluster);
    2754             : 
    2755           0 :         return ret;
    2756             : }
    2757             : 
    2758           0 : static bool test_OpenNetwork_int(struct torture_context *tctx,
    2759             :                                  struct dcerpc_pipe *p,
    2760             :                                  const char *lpszNetworkName,
    2761             :                                  struct policy_handle *hNetwork)
    2762             : {
    2763           0 :         struct dcerpc_binding_handle *b = p->binding_handle;
    2764           0 :         struct clusapi_OpenNetwork r;
    2765           0 :         WERROR Status;
    2766           0 :         WERROR rpc_status;
    2767             : 
    2768           0 :         r.in.lpszNetworkName = lpszNetworkName;
    2769           0 :         r.out.rpc_status = &rpc_status;
    2770           0 :         r.out.Status = &Status;
    2771           0 :         r.out.hNetwork = hNetwork ;
    2772             : 
    2773           0 :         torture_assert_ntstatus_ok(tctx,
    2774             :                 dcerpc_clusapi_OpenNetwork_r(b, tctx, &r),
    2775             :                 "OpenNetwork failed");
    2776           0 :         torture_assert_werr_ok(tctx,
    2777             :                 *r.out.Status,
    2778             :                 "OpenNetwork failed");
    2779             : 
    2780           0 :         return true;
    2781             : }
    2782             : 
    2783           0 : static bool test_OpenNetworkEx_int(struct torture_context *tctx,
    2784             :                                    struct dcerpc_pipe *p,
    2785             :                                    const char *lpszNetworkName,
    2786             :                                    struct policy_handle *hNetwork)
    2787             : {
    2788           0 :         struct dcerpc_binding_handle *b = p->binding_handle;
    2789           0 :         struct clusapi_OpenNetworkEx r;
    2790           0 :         uint32_t lpdwGrantedAccess;
    2791           0 :         WERROR Status;
    2792           0 :         WERROR rpc_status;
    2793             : 
    2794           0 :         r.in.lpszNetworkName = lpszNetworkName;
    2795           0 :         r.in.dwDesiredAccess = SEC_FLAG_MAXIMUM_ALLOWED;
    2796           0 :         r.out.lpdwGrantedAccess = &lpdwGrantedAccess;
    2797           0 :         r.out.rpc_status = &rpc_status;
    2798           0 :         r.out.Status = &Status;
    2799           0 :         r.out.hNetwork = hNetwork ;
    2800             : 
    2801           0 :         torture_assert_ntstatus_ok(tctx,
    2802             :                 dcerpc_clusapi_OpenNetworkEx_r(b, tctx, &r),
    2803             :                 "OpenNetworkEx failed");
    2804           0 :         torture_assert_werr_ok(tctx,
    2805             :                 *r.out.Status,
    2806             :                 "OpenNetworkEx failed");
    2807             : 
    2808           0 :         return true;
    2809             : }
    2810             : 
    2811           0 : static bool test_CloseNetwork_int(struct torture_context *tctx,
    2812             :                                   struct dcerpc_pipe *p,
    2813             :                                   struct policy_handle *Network)
    2814             : {
    2815           0 :         struct dcerpc_binding_handle *b = p->binding_handle;
    2816           0 :         struct clusapi_CloseNetwork r;
    2817             : 
    2818           0 :         r.in.Network = Network;
    2819           0 :         r.out.Network = Network;
    2820             : 
    2821           0 :         torture_assert_ntstatus_ok(tctx,
    2822             :                 dcerpc_clusapi_CloseNetwork_r(b, tctx, &r),
    2823             :                 "CloseNetwork failed");
    2824           0 :         torture_assert_werr_ok(tctx,
    2825             :                 r.out.result,
    2826             :                 "CloseNetwork failed");
    2827           0 :         torture_assert(tctx,
    2828             :                 ndr_policy_handle_empty(Network),
    2829             :                 "policy_handle non empty after CloseNetwork");
    2830             : 
    2831           0 :         return true;
    2832             : }
    2833             : 
    2834           0 : static bool test_OpenNetwork(struct torture_context *tctx,
    2835             :                              void *data)
    2836             : {
    2837           0 :         struct torture_clusapi_context *t =
    2838           0 :                 talloc_get_type_abort(data, struct torture_clusapi_context);
    2839           0 :         struct policy_handle hNetwork;
    2840             : 
    2841           0 :         if (!test_OpenNetwork_int(tctx, t->p, "Cluster Network 1", &hNetwork)) {
    2842           0 :                 return false;
    2843             :         }
    2844             : 
    2845           0 :         test_CloseNetwork_int(tctx, t->p, &hNetwork);
    2846             : 
    2847           0 :         return true;
    2848             : }
    2849             : 
    2850           0 : static bool test_OpenNetworkEx(struct torture_context *tctx,
    2851             :                                void *data)
    2852             : {
    2853           0 :         struct torture_clusapi_context *t =
    2854           0 :                 talloc_get_type_abort(data, struct torture_clusapi_context);
    2855           0 :         struct policy_handle hNetwork;
    2856             : 
    2857           0 :         if (!test_OpenNetworkEx_int(tctx, t->p, "Cluster Network 1", &hNetwork)) {
    2858           0 :                 return false;
    2859             :         }
    2860             : 
    2861           0 :         test_CloseNetwork_int(tctx, t->p, &hNetwork);
    2862             : 
    2863           0 :         return true;
    2864             : }
    2865             : 
    2866           0 : static bool test_CloseNetwork(struct torture_context *tctx,
    2867             :                               void *data)
    2868             : {
    2869           0 :         struct torture_clusapi_context *t =
    2870           0 :                 talloc_get_type_abort(data, struct torture_clusapi_context);
    2871           0 :         struct policy_handle hNetwork;
    2872             : 
    2873           0 :         if (!test_OpenNetwork_int(tctx, t->p, "Cluster Network 1", &hNetwork)) {
    2874           0 :                 return false;
    2875             :         }
    2876             : 
    2877           0 :         return test_CloseNetwork_int(tctx, t->p, &hNetwork);
    2878             : }
    2879             : 
    2880           0 : static bool test_GetNetworkState_int(struct torture_context *tctx,
    2881             :                                      struct dcerpc_pipe *p,
    2882             :                                      struct policy_handle *hNetwork)
    2883             : {
    2884           0 :         struct dcerpc_binding_handle *b = p->binding_handle;
    2885           0 :         struct clusapi_GetNetworkState r;
    2886           0 :         enum clusapi_ClusterNetworkState State;
    2887           0 :         WERROR rpc_status;
    2888             : 
    2889           0 :         r.in.hNetwork = *hNetwork;
    2890           0 :         r.out.State = &State;
    2891           0 :         r.out.rpc_status = &rpc_status;
    2892             : 
    2893           0 :         torture_assert_ntstatus_ok(tctx,
    2894             :                 dcerpc_clusapi_GetNetworkState_r(b, tctx, &r),
    2895             :                 "GetNetworkState failed");
    2896           0 :         torture_assert_werr_ok(tctx,
    2897             :                 r.out.result,
    2898             :                 "GetNetworkState failed");
    2899             : 
    2900           0 :         return true;
    2901             : }
    2902             : 
    2903           0 : static bool test_GetNetworkState(struct torture_context *tctx,
    2904             :                                  void *data)
    2905             : {
    2906           0 :         struct torture_clusapi_context *t =
    2907           0 :                 talloc_get_type_abort(data, struct torture_clusapi_context);
    2908           0 :         struct policy_handle hNetwork;
    2909           0 :         bool ret = true;
    2910             : 
    2911           0 :         if (!test_OpenNetwork_int(tctx, t->p, "Cluster Network 1", &hNetwork)) {
    2912           0 :                 return false;
    2913             :         }
    2914             : 
    2915           0 :         ret = test_GetNetworkState_int(tctx, t->p, &hNetwork);
    2916             : 
    2917           0 :         test_CloseNetwork_int(tctx, t->p, &hNetwork);
    2918             : 
    2919           0 :         return ret;
    2920             : }
    2921             : 
    2922           0 : static bool test_GetNetworkId_int(struct torture_context *tctx,
    2923             :                                   struct dcerpc_pipe *p,
    2924             :                                   struct policy_handle *hNetwork)
    2925             : {
    2926           0 :         struct dcerpc_binding_handle *b = p->binding_handle;
    2927           0 :         struct clusapi_GetNetworkId r;
    2928           0 :         const char *pGuid;
    2929           0 :         WERROR rpc_status;
    2930             : 
    2931           0 :         r.in.hNetwork = *hNetwork;
    2932           0 :         r.out.pGuid = &pGuid;
    2933           0 :         r.out.rpc_status = &rpc_status;
    2934             : 
    2935           0 :         torture_assert_ntstatus_ok(tctx,
    2936             :                 dcerpc_clusapi_GetNetworkId_r(b, tctx, &r),
    2937             :                 "GetNetworkId failed");
    2938           0 :         torture_assert_werr_ok(tctx,
    2939             :                 r.out.result,
    2940             :                 "GetNetworkId failed");
    2941             : 
    2942           0 :         return true;
    2943             : }
    2944             : 
    2945           0 : static bool test_GetNetworkId(struct torture_context *tctx,
    2946             :                               void *data)
    2947             : {
    2948           0 :         struct torture_clusapi_context *t =
    2949           0 :                 talloc_get_type_abort(data, struct torture_clusapi_context);
    2950           0 :         struct policy_handle hNetwork;
    2951           0 :         bool ret = true;
    2952             : 
    2953           0 :         if (!test_OpenNetwork_int(tctx, t->p, "Cluster Network 1", &hNetwork)) {
    2954           0 :                 return false;
    2955             :         }
    2956             : 
    2957           0 :         ret = test_GetNetworkId_int(tctx, t->p, &hNetwork);
    2958             : 
    2959           0 :         test_CloseNetwork_int(tctx, t->p, &hNetwork);
    2960             : 
    2961           0 :         return ret;
    2962             : }
    2963             : 
    2964           0 : static bool test_one_network(struct torture_context *tctx,
    2965             :                              struct dcerpc_pipe *p,
    2966             :                              const char *network_name)
    2967             : {
    2968           0 :         struct policy_handle hNetwork;
    2969             : 
    2970           0 :         torture_assert(tctx,
    2971             :                 test_OpenNetwork_int(tctx, p, network_name, &hNetwork),
    2972             :                 "failed to open network");
    2973           0 :         test_CloseNetwork_int(tctx, p, &hNetwork);
    2974             : 
    2975           0 :         torture_assert(tctx,
    2976             :                 test_OpenNetworkEx_int(tctx, p, network_name, &hNetwork),
    2977             :                 "failed to openex network");
    2978             : 
    2979           0 :         torture_assert(tctx,
    2980             :                 test_GetNetworkId_int(tctx, p, &hNetwork),
    2981             :                 "failed to query network id");
    2982           0 :         torture_assert(tctx,
    2983             :                 test_GetNetworkState_int(tctx, p, &hNetwork),
    2984             :                 "failed to query network id");
    2985             : 
    2986           0 :         test_CloseNetwork_int(tctx, p, &hNetwork);
    2987             : 
    2988           0 :         return true;
    2989             : }
    2990             : 
    2991           0 : static bool test_all_networks(struct torture_context *tctx,
    2992             :                               void *data)
    2993             : {
    2994           0 :         struct torture_clusapi_context *t =
    2995           0 :                 talloc_get_type_abort(data, struct torture_clusapi_context);
    2996           0 :         struct dcerpc_binding_handle *b = t->p->binding_handle;
    2997           0 :         struct clusapi_CreateEnum r;
    2998           0 :         uint32_t dwType = CLUSTER_ENUM_NETWORK;
    2999           0 :         struct ENUM_LIST *ReturnEnum;
    3000           0 :         WERROR rpc_status;
    3001           0 :         int i;
    3002             : 
    3003           0 :         r.in.dwType = dwType;
    3004           0 :         r.out.ReturnEnum = &ReturnEnum;
    3005           0 :         r.out.rpc_status = &rpc_status;
    3006             : 
    3007           0 :         torture_assert_ntstatus_ok(tctx,
    3008             :                 dcerpc_clusapi_CreateEnum_r(b, tctx, &r),
    3009             :                 "CreateEnum failed");
    3010           0 :         torture_assert_werr_ok(tctx,
    3011             :                 r.out.result,
    3012             :                 "CreateEnum failed");
    3013             : 
    3014           0 :         for (i=0; i < ReturnEnum->EntryCount; i++) {
    3015             : 
    3016           0 :                 struct ENUM_ENTRY e = ReturnEnum->Entry[i];
    3017             : 
    3018           0 :                 torture_assert_int_equal(tctx, e.Type, CLUSTER_ENUM_NETWORK, "type mismatch");
    3019             : 
    3020           0 :                 torture_assert(tctx,
    3021             :                         test_one_network(tctx, t->p, e.Name),
    3022             :                         "failed to test one network");
    3023             :         }
    3024             : 
    3025           0 :         return true;
    3026             : }
    3027             : 
    3028           0 : static bool test_OpenNetInterface_int(struct torture_context *tctx,
    3029             :                                       struct dcerpc_pipe *p,
    3030             :                                       const char *lpszNetInterfaceName,
    3031             :                                       struct policy_handle *hNetInterface)
    3032             : {
    3033           0 :         struct dcerpc_binding_handle *b = p->binding_handle;
    3034           0 :         struct clusapi_OpenNetInterface r;
    3035           0 :         WERROR Status;
    3036           0 :         WERROR rpc_status;
    3037             : 
    3038           0 :         r.in.lpszNetInterfaceName = lpszNetInterfaceName;
    3039           0 :         r.out.rpc_status = &rpc_status;
    3040           0 :         r.out.Status = &Status;
    3041           0 :         r.out.hNetInterface = hNetInterface;
    3042             : 
    3043           0 :         torture_assert_ntstatus_ok(tctx,
    3044             :                 dcerpc_clusapi_OpenNetInterface_r(b, tctx, &r),
    3045             :                 "OpenNetInterface failed");
    3046           0 :         torture_assert_werr_ok(tctx,
    3047             :                 *r.out.Status,
    3048             :                 "OpenNetInterface failed");
    3049             : 
    3050           0 :         return true;
    3051             : }
    3052             : 
    3053           0 : static bool test_OpenNetInterfaceEx_int(struct torture_context *tctx,
    3054             :                                         struct dcerpc_pipe *p,
    3055             :                                         const char *lpszNetInterfaceName,
    3056             :                                         struct policy_handle *hNetInterface)
    3057             : {
    3058           0 :         struct dcerpc_binding_handle *b = p->binding_handle;
    3059           0 :         struct clusapi_OpenNetInterfaceEx r;
    3060           0 :         uint32_t lpdwGrantedAccess;
    3061           0 :         WERROR Status;
    3062           0 :         WERROR rpc_status;
    3063             : 
    3064           0 :         r.in.lpszNetInterfaceName = lpszNetInterfaceName;
    3065           0 :         r.in.dwDesiredAccess = SEC_FLAG_MAXIMUM_ALLOWED;
    3066           0 :         r.out.lpdwGrantedAccess = &lpdwGrantedAccess;
    3067           0 :         r.out.rpc_status = &rpc_status;
    3068           0 :         r.out.Status = &Status;
    3069           0 :         r.out.hNetInterface = hNetInterface;
    3070             : 
    3071           0 :         torture_assert_ntstatus_ok(tctx,
    3072             :                 dcerpc_clusapi_OpenNetInterfaceEx_r(b, tctx, &r),
    3073             :                 "OpenNetInterfaceEx failed");
    3074           0 :         torture_assert_werr_ok(tctx,
    3075             :                 *r.out.Status,
    3076             :                 "OpenNetInterfaceEx failed");
    3077             : 
    3078           0 :         return true;
    3079             : }
    3080             : 
    3081           0 : static bool test_CloseNetInterface_int(struct torture_context *tctx,
    3082             :                                        struct dcerpc_pipe *p,
    3083             :                                        struct policy_handle *NetInterface)
    3084             : {
    3085           0 :         struct dcerpc_binding_handle *b = p->binding_handle;
    3086           0 :         struct clusapi_CloseNetInterface r;
    3087             : 
    3088           0 :         r.in.NetInterface = NetInterface;
    3089           0 :         r.out.NetInterface = NetInterface;
    3090             : 
    3091           0 :         torture_assert_ntstatus_ok(tctx,
    3092             :                 dcerpc_clusapi_CloseNetInterface_r(b, tctx, &r),
    3093             :                 "CloseNetInterface failed");
    3094           0 :         torture_assert_werr_ok(tctx,
    3095             :                 r.out.result,
    3096             :                 "CloseNetInterface failed");
    3097           0 :         torture_assert(tctx,
    3098             :                 ndr_policy_handle_empty(NetInterface),
    3099             :                 "policy_handle non empty after CloseNetInterface");
    3100             : 
    3101           0 :         return true;
    3102             : }
    3103             : 
    3104           0 : static bool test_OpenNetInterface(struct torture_context *tctx,
    3105             :                                   void *data)
    3106             : {
    3107           0 :         struct torture_clusapi_context *t =
    3108           0 :                 talloc_get_type_abort(data, struct torture_clusapi_context);
    3109           0 :         struct policy_handle hNetInterface;
    3110             : 
    3111           0 :         if (!test_OpenNetInterface_int(tctx, t->p, "node1 - Ethernet", &hNetInterface)) {
    3112           0 :                 return false;
    3113             :         }
    3114             : 
    3115           0 :         test_CloseNetInterface_int(tctx, t->p, &hNetInterface);
    3116             : 
    3117           0 :         return true;
    3118             : }
    3119             : 
    3120           0 : static bool test_OpenNetInterfaceEx(struct torture_context *tctx,
    3121             :                                     void *data)
    3122             : {
    3123           0 :         struct torture_clusapi_context *t =
    3124           0 :                 talloc_get_type_abort(data, struct torture_clusapi_context);
    3125           0 :         struct policy_handle hNetInterface;
    3126             : 
    3127           0 :         if (!test_OpenNetInterfaceEx_int(tctx, t->p, "node1 - Ethernet", &hNetInterface)) {
    3128           0 :                 return false;
    3129             :         }
    3130             : 
    3131           0 :         test_CloseNetInterface_int(tctx, t->p, &hNetInterface);
    3132             : 
    3133           0 :         return true;
    3134             : }
    3135             : 
    3136           0 : static bool test_CloseNetInterface(struct torture_context *tctx,
    3137             :                                    void *data)
    3138             : {
    3139           0 :         struct torture_clusapi_context *t =
    3140           0 :                 talloc_get_type_abort(data, struct torture_clusapi_context);
    3141           0 :         struct policy_handle hNetInterface;
    3142             : 
    3143           0 :         if (!test_OpenNetInterface_int(tctx, t->p, "node1 - Ethernet", &hNetInterface)) {
    3144           0 :                 return false;
    3145             :         }
    3146             : 
    3147           0 :         return test_CloseNetInterface_int(tctx, t->p, &hNetInterface);
    3148             : }
    3149             : 
    3150           0 : static bool test_GetNetInterfaceState_int(struct torture_context *tctx,
    3151             :                                           struct dcerpc_pipe *p,
    3152             :                                           struct policy_handle *hNetInterface)
    3153             : {
    3154           0 :         struct dcerpc_binding_handle *b = p->binding_handle;
    3155           0 :         struct clusapi_GetNetInterfaceState r;
    3156           0 :         enum clusapi_ClusterNetInterfaceState State;
    3157           0 :         WERROR rpc_status;
    3158             : 
    3159           0 :         r.in.hNetInterface = *hNetInterface;
    3160           0 :         r.out.State = &State;
    3161           0 :         r.out.rpc_status = &rpc_status;
    3162             : 
    3163           0 :         torture_assert_ntstatus_ok(tctx,
    3164             :                 dcerpc_clusapi_GetNetInterfaceState_r(b, tctx, &r),
    3165             :                 "GetNetInterfaceState failed");
    3166           0 :         torture_assert_werr_ok(tctx,
    3167             :                 r.out.result,
    3168             :                 "GetNetInterfaceState failed");
    3169             : 
    3170           0 :         return true;
    3171             : }
    3172             : 
    3173           0 : static bool test_GetNetInterfaceState(struct torture_context *tctx,
    3174             :                                       void *data)
    3175             : {
    3176           0 :         struct torture_clusapi_context *t =
    3177           0 :                 talloc_get_type_abort(data, struct torture_clusapi_context);
    3178           0 :         struct policy_handle hNetInterface;
    3179           0 :         bool ret = true;
    3180             : 
    3181           0 :         if (!test_OpenNetInterface_int(tctx, t->p, "node1 - Ethernet", &hNetInterface)) {
    3182           0 :                 return false;
    3183             :         }
    3184             : 
    3185           0 :         ret = test_GetNetInterfaceState_int(tctx, t->p, &hNetInterface);
    3186             : 
    3187           0 :         test_CloseNetInterface_int(tctx, t->p, &hNetInterface);
    3188             : 
    3189           0 :         return ret;
    3190             : }
    3191             : 
    3192           0 : static bool test_GetNetInterfaceId_int(struct torture_context *tctx,
    3193             :                                        struct dcerpc_pipe *p,
    3194             :                                        struct policy_handle *hNetInterface)
    3195             : {
    3196           0 :         struct dcerpc_binding_handle *b = p->binding_handle;
    3197           0 :         struct clusapi_GetNetInterfaceId r;
    3198           0 :         const char *pGuid;
    3199           0 :         WERROR rpc_status;
    3200             : 
    3201           0 :         r.in.hNetInterface = *hNetInterface;
    3202           0 :         r.out.pGuid = &pGuid;
    3203           0 :         r.out.rpc_status = &rpc_status;
    3204             : 
    3205           0 :         torture_assert_ntstatus_ok(tctx,
    3206             :                 dcerpc_clusapi_GetNetInterfaceId_r(b, tctx, &r),
    3207             :                 "GetNetInterfaceId failed");
    3208           0 :         torture_assert_werr_ok(tctx,
    3209             :                 r.out.result,
    3210             :                 "GetNetInterfaceId failed");
    3211             : 
    3212           0 :         return true;
    3213             : }
    3214             : 
    3215           0 : static bool test_GetNetInterfaceId(struct torture_context *tctx,
    3216             :                                    void *data)
    3217             : {
    3218           0 :         struct torture_clusapi_context *t =
    3219           0 :                 talloc_get_type_abort(data, struct torture_clusapi_context);
    3220           0 :         struct policy_handle hNetInterface;
    3221           0 :         bool ret = true;
    3222             : 
    3223           0 :         if (!test_OpenNetInterface_int(tctx, t->p, "node1 - Ethernet", &hNetInterface)) {
    3224           0 :                 return false;
    3225             :         }
    3226             : 
    3227           0 :         ret = test_GetNetInterfaceId_int(tctx, t->p, &hNetInterface);
    3228             : 
    3229           0 :         test_CloseNetInterface_int(tctx, t->p, &hNetInterface);
    3230             : 
    3231           0 :         return ret;
    3232             : }
    3233             : 
    3234           0 : static bool test_one_netinterface(struct torture_context *tctx,
    3235             :                                   struct dcerpc_pipe *p,
    3236             :                                   const char *netinterface_name)
    3237             : {
    3238           0 :         struct policy_handle hNetInterface;
    3239             : 
    3240           0 :         torture_assert(tctx,
    3241             :                 test_OpenNetInterface_int(tctx, p, netinterface_name, &hNetInterface),
    3242             :                 "failed to open netinterface");
    3243           0 :         test_CloseNetInterface_int(tctx, p, &hNetInterface);
    3244             : 
    3245           0 :         torture_assert(tctx,
    3246             :                 test_OpenNetInterfaceEx_int(tctx, p, netinterface_name, &hNetInterface),
    3247             :                 "failed to openex netinterface");
    3248             : 
    3249           0 :         torture_assert(tctx,
    3250             :                 test_GetNetInterfaceId_int(tctx, p, &hNetInterface),
    3251             :                 "failed to query netinterface id");
    3252           0 :         torture_assert(tctx,
    3253             :                 test_GetNetInterfaceState_int(tctx, p, &hNetInterface),
    3254             :                 "failed to query netinterface id");
    3255             : 
    3256           0 :         test_CloseNetInterface_int(tctx, p, &hNetInterface);
    3257             : 
    3258           0 :         return true;
    3259             : }
    3260             : 
    3261           0 : static bool test_all_netinterfaces(struct torture_context *tctx,
    3262             :                                    void *data)
    3263             : {
    3264           0 :         struct torture_clusapi_context *t =
    3265           0 :                 talloc_get_type_abort(data, struct torture_clusapi_context);
    3266           0 :         struct dcerpc_binding_handle *b = t->p->binding_handle;
    3267           0 :         struct clusapi_CreateEnum r;
    3268           0 :         uint32_t dwType = CLUSTER_ENUM_NETINTERFACE;
    3269           0 :         struct ENUM_LIST *ReturnEnum;
    3270           0 :         WERROR rpc_status;
    3271           0 :         int i;
    3272             : 
    3273           0 :         r.in.dwType = dwType;
    3274           0 :         r.out.ReturnEnum = &ReturnEnum;
    3275           0 :         r.out.rpc_status = &rpc_status;
    3276             : 
    3277           0 :         torture_assert_ntstatus_ok(tctx,
    3278             :                 dcerpc_clusapi_CreateEnum_r(b, tctx, &r),
    3279             :                 "CreateEnum failed");
    3280           0 :         torture_assert_werr_ok(tctx,
    3281             :                 r.out.result,
    3282             :                 "CreateEnum failed");
    3283             : 
    3284           0 :         for (i=0; i < ReturnEnum->EntryCount; i++) {
    3285             : 
    3286           0 :                 struct ENUM_ENTRY e = ReturnEnum->Entry[i];
    3287             : 
    3288           0 :                 torture_assert_int_equal(tctx, e.Type, CLUSTER_ENUM_NETINTERFACE, "type mismatch");
    3289             : 
    3290           0 :                 torture_assert(tctx,
    3291             :                         test_one_netinterface(tctx, t->p, e.Name),
    3292             :                         "failed to test one netinterface");
    3293             :         }
    3294             : 
    3295           0 :         return true;
    3296             : }
    3297             : 
    3298           0 : static bool test_CloseKey_int(struct torture_context *tctx,
    3299             :                               struct dcerpc_pipe *p,
    3300             :                               struct policy_handle *pKey)
    3301             : {
    3302           0 :         struct dcerpc_binding_handle *b = p->binding_handle;
    3303           0 :         struct clusapi_CloseKey r;
    3304             : 
    3305           0 :         r.in.pKey = pKey;
    3306           0 :         r.out.pKey = pKey;
    3307             : 
    3308           0 :         torture_assert_ntstatus_ok(tctx,
    3309             :                 dcerpc_clusapi_CloseKey_r(b, tctx, &r),
    3310             :                 "CloseKey failed");
    3311           0 :         torture_assert_werr_ok(tctx,
    3312             :                 r.out.result,
    3313             :                 "CloseKey failed");
    3314           0 :         torture_assert(tctx,
    3315             :                 ndr_policy_handle_empty(pKey),
    3316             :                 "policy_handle non empty after CloseKey");
    3317             : 
    3318           0 :         return true;
    3319             : }
    3320             : 
    3321           0 : static bool test_GetRootKey_int(struct torture_context *tctx,
    3322             :                                 struct dcerpc_pipe *p,
    3323             :                                 struct policy_handle *phKey)
    3324             : {
    3325           0 :         struct dcerpc_binding_handle *b = p->binding_handle;
    3326           0 :         struct clusapi_GetRootKey r;
    3327           0 :         WERROR Status;
    3328           0 :         WERROR rpc_status;
    3329             : 
    3330           0 :         r.in.samDesired = SEC_FLAG_MAXIMUM_ALLOWED;
    3331           0 :         r.out.Status = &Status;
    3332           0 :         r.out.rpc_status = &rpc_status;
    3333           0 :         r.out.phKey = phKey;
    3334             : 
    3335           0 :         torture_assert_ntstatus_ok(tctx,
    3336             :                 dcerpc_clusapi_GetRootKey_r(b, tctx, &r),
    3337             :                 "GetRootKey failed");
    3338           0 :         torture_assert_werr_ok(tctx,
    3339             :                 *r.out.Status,
    3340             :                 "GetRootKey failed");
    3341             : 
    3342           0 :         return true;
    3343             : }
    3344             : 
    3345           0 : static bool test_EnumKey_int(struct torture_context *tctx,
    3346             :                              struct dcerpc_pipe *p,
    3347             :                              struct policy_handle *hKey)
    3348             : {
    3349           0 :         struct dcerpc_binding_handle *b = p->binding_handle;
    3350           0 :         struct clusapi_EnumKey r;
    3351           0 :         const char *KeyName;
    3352           0 :         NTTIME lpftLastWriteTime;
    3353           0 :         WERROR rpc_status;
    3354             : 
    3355           0 :         r.in.hKey = *hKey;
    3356           0 :         r.in.dwIndex = 0;
    3357           0 :         r.out.KeyName = &KeyName;
    3358           0 :         r.out.lpftLastWriteTime = &lpftLastWriteTime;
    3359           0 :         r.out.rpc_status = &rpc_status;
    3360             : 
    3361           0 :         torture_assert_ntstatus_ok(tctx,
    3362             :                 dcerpc_clusapi_EnumKey_r(b, tctx, &r),
    3363             :                 "EnumKey failed");
    3364           0 :         torture_assert_werr_ok(tctx,
    3365             :                 r.out.result,
    3366             :                 "EnumKey failed");
    3367             : 
    3368           0 :         return true;
    3369             : }
    3370             : 
    3371           0 : static bool test_OpenKey_int(struct torture_context *tctx,
    3372             :                              struct dcerpc_pipe *p,
    3373             :                              struct policy_handle *hKey,
    3374             :                              const char *lpSubKey,
    3375             :                              struct policy_handle *phKey)
    3376             : {
    3377           0 :         struct dcerpc_binding_handle *b = p->binding_handle;
    3378           0 :         struct clusapi_OpenKey r;
    3379           0 :         WERROR Status;
    3380           0 :         WERROR rpc_status;
    3381             : 
    3382           0 :         r.in.hKey = *hKey;
    3383           0 :         r.in.lpSubKey = lpSubKey;
    3384           0 :         r.in.samDesired = SEC_FLAG_MAXIMUM_ALLOWED;
    3385           0 :         r.out.Status = &Status;
    3386           0 :         r.out.rpc_status = &rpc_status;
    3387           0 :         r.out.phKey = phKey;
    3388             : 
    3389           0 :         torture_assert_ntstatus_ok(tctx,
    3390             :                 dcerpc_clusapi_OpenKey_r(b, tctx, &r),
    3391             :                 "OpenKey failed");
    3392           0 :         torture_assert_werr_ok(tctx,
    3393             :                 *r.out.Status,
    3394             :                 "OpenKey failed");
    3395             : 
    3396           0 :         return true;
    3397             : }
    3398             : 
    3399           0 : static bool test_EnumValue_int(struct torture_context *tctx,
    3400             :                                struct dcerpc_pipe *p,
    3401             :                                struct policy_handle *hKey)
    3402             : {
    3403           0 :         struct dcerpc_binding_handle *b = p->binding_handle;
    3404           0 :         struct clusapi_EnumValue r;
    3405           0 :         const char *lpValueName;
    3406           0 :         uint32_t lpType;
    3407           0 :         uint32_t TotalSize;
    3408           0 :         WERROR rpc_status;
    3409           0 :         int i = 0;
    3410             : 
    3411           0 :         do {
    3412           0 :                 uint32_t lpcbData = 2048;
    3413             : 
    3414           0 :                 r.in.hKey = *hKey;
    3415           0 :                 r.in.dwIndex = i++;
    3416           0 :                 r.in.lpcbData = &lpcbData;
    3417           0 :                 r.out.lpValueName = &lpValueName;
    3418           0 :                 r.out.lpType = &lpType;
    3419           0 :                 r.out.lpData = talloc_array(tctx, uint8_t, lpcbData);
    3420           0 :                 r.out.TotalSize = &TotalSize;
    3421           0 :                 r.out.rpc_status = &rpc_status;
    3422           0 :                 r.out.lpcbData = &lpcbData;
    3423             : 
    3424           0 :                 torture_assert_ntstatus_ok(tctx,
    3425             :                         dcerpc_clusapi_EnumValue_r(b, tctx, &r),
    3426             :                         "EnumValue failed");
    3427             : 
    3428           0 :         } while (W_ERROR_IS_OK(r.out.result));
    3429             : 
    3430           0 :         torture_assert_werr_equal(tctx,
    3431             :                 r.out.result,
    3432             :                 WERR_NO_MORE_ITEMS,
    3433             :                 "EnumValue failed");
    3434             : 
    3435           0 :         return true;
    3436             : }
    3437             : 
    3438           0 : static bool test_QueryInfoKey_int(struct torture_context *tctx,
    3439             :                                   struct dcerpc_pipe *p,
    3440             :                                   struct policy_handle *hKey)
    3441             : {
    3442           0 :         struct dcerpc_binding_handle *b = p->binding_handle;
    3443           0 :         struct clusapi_QueryInfoKey r;
    3444           0 :         uint32_t lpcSubKeys;
    3445           0 :         uint32_t lpcbMaxSubKeyLen;
    3446           0 :         uint32_t lpcValues;
    3447           0 :         uint32_t lpcbMaxValueNameLen;
    3448           0 :         uint32_t lpcbMaxValueLen;
    3449           0 :         uint32_t lpcbSecurityDescriptor;
    3450           0 :         NTTIME lpftLastWriteTime;
    3451           0 :         WERROR rpc_status;
    3452             : 
    3453           0 :         r.in.hKey = *hKey;
    3454           0 :         r.out.lpcSubKeys = &lpcSubKeys;
    3455           0 :         r.out.lpcbMaxSubKeyLen = &lpcbMaxSubKeyLen;
    3456           0 :         r.out.lpcValues = &lpcValues;
    3457           0 :         r.out.lpcbMaxValueNameLen = &lpcbMaxValueNameLen;
    3458           0 :         r.out.lpcbMaxValueLen = &lpcbMaxValueLen;
    3459           0 :         r.out.lpcbSecurityDescriptor = &lpcbSecurityDescriptor;
    3460           0 :         r.out.lpftLastWriteTime = &lpftLastWriteTime;
    3461           0 :         r.out.rpc_status = &rpc_status;
    3462             : 
    3463           0 :         torture_assert_ntstatus_ok(tctx,
    3464             :                 dcerpc_clusapi_QueryInfoKey_r(b, tctx, &r),
    3465             :                 "QueryInfoKey failed");
    3466           0 :         torture_assert_werr_ok(tctx,
    3467             :                 r.out.result,
    3468             :                 "QueryInfoKey failed");
    3469             : 
    3470           0 :         return true;
    3471             : }
    3472             : 
    3473           0 : static bool test_GetKeySecurity_int(struct torture_context *tctx,
    3474             :                                     struct dcerpc_pipe *p,
    3475             :                                     struct policy_handle *hKey)
    3476             : {
    3477           0 :         struct dcerpc_binding_handle *b = p->binding_handle;
    3478           0 :         struct clusapi_GetKeySecurity r;
    3479           0 :         uint32_t SecurityInformation = SECINFO_DACL | SECINFO_OWNER | SECINFO_GROUP;
    3480           0 :         struct RPC_SECURITY_DESCRIPTOR pRpcSecurityDescriptor;
    3481           0 :         WERROR rpc_status;
    3482             : 
    3483           0 :         ZERO_STRUCT(pRpcSecurityDescriptor);
    3484             : 
    3485           0 :         r.in.hKey = *hKey;
    3486           0 :         r.in.SecurityInformation = SecurityInformation;
    3487           0 :         r.in.pRpcSecurityDescriptor = &pRpcSecurityDescriptor;
    3488           0 :         r.out.rpc_status = &rpc_status;
    3489           0 :         r.out.pRpcSecurityDescriptor = &pRpcSecurityDescriptor;
    3490             : 
    3491           0 :         torture_assert_ntstatus_ok(tctx,
    3492             :                 dcerpc_clusapi_GetKeySecurity_r(b, tctx, &r),
    3493             :                 "GetKeySecurity failed");
    3494             : 
    3495           0 :         if (W_ERROR_EQUAL(r.out.result, WERR_INSUFFICIENT_BUFFER)) {
    3496           0 :                 pRpcSecurityDescriptor.lpSecurityDescriptor = talloc_array(tctx,
    3497             :                 uint8_t, pRpcSecurityDescriptor.cbInSecurityDescriptor);
    3498             : 
    3499           0 :                 torture_assert_ntstatus_ok(tctx,
    3500             :                         dcerpc_clusapi_GetKeySecurity_r(b, tctx, &r),
    3501             :                         "GetKeySecurity failed");
    3502             :         }
    3503             : 
    3504           0 :         torture_assert_werr_ok(tctx,
    3505             :                 r.out.result,
    3506             :                 "GetKeySecurity failed");
    3507             : 
    3508           0 :         return true;
    3509             : }
    3510             : 
    3511           0 : static bool test_GetRootKey(struct torture_context *tctx,
    3512             :                             void *data)
    3513             : {
    3514           0 :         struct torture_clusapi_context *t =
    3515           0 :                 talloc_get_type_abort(data, struct torture_clusapi_context);
    3516           0 :         struct policy_handle hKey;
    3517             : 
    3518           0 :         if (!test_GetRootKey_int(tctx, t->p, &hKey)) {
    3519           0 :                 return false;
    3520             :         }
    3521             : 
    3522           0 :         test_CloseKey_int(tctx, t->p, &hKey);
    3523             : 
    3524           0 :         return true;
    3525             : }
    3526             : 
    3527           0 : static bool test_CloseKey(struct torture_context *tctx,
    3528             :                           void *data)
    3529             : {
    3530           0 :         struct torture_clusapi_context *t =
    3531           0 :                 talloc_get_type_abort(data, struct torture_clusapi_context);
    3532           0 :         struct policy_handle hKey;
    3533             : 
    3534           0 :         if (!test_GetRootKey_int(tctx, t->p, &hKey)) {
    3535           0 :                 return false;
    3536             :         }
    3537             : 
    3538           0 :         return test_CloseKey_int(tctx, t->p, &hKey);
    3539             : }
    3540             : 
    3541           0 : static bool test_EnumKey(struct torture_context *tctx,
    3542             :                          void *data)
    3543             : {
    3544           0 :         struct torture_clusapi_context *t =
    3545           0 :                 talloc_get_type_abort(data, struct torture_clusapi_context);
    3546           0 :         struct policy_handle hKey;
    3547           0 :         bool ret = true;
    3548             : 
    3549           0 :         if (!test_GetRootKey_int(tctx, t->p, &hKey)) {
    3550           0 :                 return false;
    3551             :         }
    3552             : 
    3553           0 :         ret = test_EnumKey_int(tctx, t->p, &hKey);
    3554             : 
    3555           0 :         test_CloseKey_int(tctx, t->p, &hKey);
    3556             : 
    3557           0 :         return ret;
    3558             : }
    3559             : 
    3560           0 : static bool test_QueryValue_int(struct torture_context *tctx,
    3561             :                                 struct dcerpc_pipe *p,
    3562             :                                 struct policy_handle *hKey,
    3563             :                                 const char *ValueName)
    3564             : {
    3565           0 :         struct dcerpc_binding_handle *b = p->binding_handle;
    3566           0 :         struct clusapi_QueryValue r;
    3567           0 :         uint32_t lpValueType;
    3568           0 :         uint32_t lpcbRequired;
    3569           0 :         WERROR rpc_status;
    3570             : 
    3571           0 :         r.in.hKey = *hKey;
    3572           0 :         r.in.lpValueName = ValueName;
    3573           0 :         r.in.cbData = 0;
    3574           0 :         r.out.lpValueType = &lpValueType;
    3575           0 :         r.out.lpData = NULL;
    3576           0 :         r.out.lpcbRequired = &lpcbRequired;
    3577           0 :         r.out.rpc_status = &rpc_status;
    3578             : 
    3579           0 :         torture_assert_ntstatus_ok(tctx,
    3580             :                 dcerpc_clusapi_QueryValue_r(b, tctx, &r),
    3581             :                 "QueryValue failed");
    3582             : 
    3583           0 :         if (W_ERROR_EQUAL(r.out.result, WERR_MORE_DATA)) {
    3584             : 
    3585           0 :                 r.in.cbData = lpcbRequired;
    3586           0 :                 r.out.lpData = talloc_zero_array(tctx, uint8_t, r.in.cbData);
    3587             : 
    3588           0 :                 torture_assert_ntstatus_ok(tctx,
    3589             :                         dcerpc_clusapi_QueryValue_r(b, tctx, &r),
    3590             :                         "QueryValue failed");
    3591             :         }
    3592             : 
    3593           0 :         torture_assert_werr_ok(tctx,
    3594             :                 r.out.result,
    3595             :                 "QueryValue failed");
    3596             : 
    3597           0 :         if (lpValueType == REG_SZ) {
    3598           0 :                 const char *s;
    3599           0 :                 DATA_BLOB blob = data_blob_const(r.out.lpData, lpcbRequired);
    3600           0 :                 pull_reg_sz(tctx, &blob, &s);
    3601           0 :                 torture_comment(tctx, "got: %s\n", s);
    3602             :         }
    3603             : 
    3604           0 :         return true;
    3605             : }
    3606             : 
    3607           0 : static bool test_QueryValue(struct torture_context *tctx,
    3608             :                             void *data)
    3609             : {
    3610           0 :         struct torture_clusapi_context *t =
    3611           0 :                 talloc_get_type_abort(data, struct torture_clusapi_context);
    3612           0 :         struct policy_handle hKey;
    3613           0 :         bool ret = true;
    3614             : 
    3615           0 :         if (!test_GetRootKey_int(tctx, t->p, &hKey)) {
    3616           0 :                 return false;
    3617             :         }
    3618             : 
    3619           0 :         ret = test_QueryValue_int(tctx, t->p, &hKey, "ClusterInstanceID");
    3620             : 
    3621           0 :         test_CloseKey_int(tctx, t->p, &hKey);
    3622             : 
    3623           0 :         return ret;
    3624             : }
    3625             : 
    3626             : 
    3627           0 : static bool test_one_key(struct torture_context *tctx,
    3628             :                          struct dcerpc_pipe *p,
    3629             :                          struct policy_handle *hKey,
    3630             :                          const char *KeyName)
    3631             : {
    3632           0 :         struct policy_handle phKey;
    3633             : 
    3634           0 :         torture_assert(tctx,
    3635             :                 test_OpenKey_int(tctx, p, hKey, KeyName, &phKey),
    3636             :                 "failed to open key");
    3637             : 
    3638           0 :         torture_assert(tctx,
    3639             :                 test_QueryInfoKey_int(tctx, p, &phKey),
    3640             :                 "failed to enum values");
    3641           0 :         torture_assert(tctx,
    3642             :                 test_GetKeySecurity_int(tctx, p, &phKey),
    3643             :                 "failed to get key security");
    3644             : 
    3645           0 :         torture_assert(tctx,
    3646             :                 test_EnumValue_int(tctx, p, &phKey),
    3647             :                 "failed to enum values");
    3648             : 
    3649           0 :         torture_assert(tctx,
    3650             :                 test_CloseKey_int(tctx, p, &phKey),
    3651             :                 "failed to close key");
    3652             : 
    3653           0 :         return true;
    3654             : }
    3655             : 
    3656           0 : static bool test_all_keys(struct torture_context *tctx,
    3657             :                           void *data)
    3658             : {
    3659           0 :         struct torture_clusapi_context *t =
    3660           0 :                 talloc_get_type_abort(data, struct torture_clusapi_context);
    3661           0 :         struct dcerpc_binding_handle *b = t->p->binding_handle;
    3662           0 :         struct policy_handle hKey;
    3663           0 :         struct clusapi_EnumKey r;
    3664           0 :         const char *KeyName;
    3665           0 :         NTTIME lpftLastWriteTime;
    3666           0 :         WERROR rpc_status;
    3667           0 :         int i = 0;
    3668             : 
    3669           0 :         if (!test_GetRootKey_int(tctx, t->p, &hKey)) {
    3670           0 :                 return false;
    3671             :         }
    3672             : 
    3673           0 :         do {
    3674           0 :                 r.in.hKey = hKey;
    3675           0 :                 r.in.dwIndex = i++;
    3676           0 :                 r.out.KeyName = &KeyName;
    3677           0 :                 r.out.lpftLastWriteTime = &lpftLastWriteTime;
    3678           0 :                 r.out.rpc_status = &rpc_status;
    3679             : 
    3680           0 :                 torture_assert_ntstatus_ok(tctx,
    3681             :                         dcerpc_clusapi_EnumKey_r(b, tctx, &r),
    3682             :                         "EnumKey failed");
    3683             : 
    3684           0 :                 if (W_ERROR_IS_OK(r.out.result)) {
    3685           0 :                         torture_assert(tctx,
    3686             :                                 test_one_key(tctx, t->p, &hKey, KeyName),
    3687             :                                 "failed to test one key");
    3688             :                 }
    3689             : 
    3690           0 :         } while (W_ERROR_IS_OK(r.out.result));
    3691             : 
    3692           0 :         torture_assert_werr_equal(tctx,
    3693             :                 r.out.result,
    3694             :                 WERR_NO_MORE_ITEMS,
    3695             :                 "EnumKey failed");
    3696             : 
    3697           0 :         test_CloseKey_int(tctx, t->p, &hKey);
    3698             : 
    3699           0 :         return true;
    3700             : }
    3701             : 
    3702           0 : static bool test_OpenGroupSet_int(struct torture_context *tctx,
    3703             :                                   struct dcerpc_pipe *p,
    3704             :                                   const char *lpszGroupSetName,
    3705             :                                   struct policy_handle *hGroupSet)
    3706             : {
    3707           0 :         struct dcerpc_binding_handle *b = p->binding_handle;
    3708           0 :         struct clusapi_OpenGroupSet r;
    3709           0 :         WERROR Status;
    3710           0 :         WERROR rpc_status;
    3711             : 
    3712           0 :         r.in.lpszGroupSetName = lpszGroupSetName;
    3713           0 :         r.out.rpc_status = &rpc_status;
    3714           0 :         r.out.Status = &Status;
    3715           0 :         r.out.hGroupSet = hGroupSet;
    3716             : 
    3717           0 :         torture_assert_ntstatus_ok(tctx,
    3718             :                 dcerpc_clusapi_OpenGroupSet_r(b, tctx, &r),
    3719             :                 "OpenGroupSet failed");
    3720           0 :         torture_assert_werr_ok(tctx,
    3721             :                 *r.out.Status,
    3722             :                 "OpenGroupSet failed");
    3723             : 
    3724           0 :         return true;
    3725             : }
    3726             : 
    3727           0 : static bool test_CloseGroupSet_int(struct torture_context *tctx,
    3728             :                                    struct dcerpc_pipe *p,
    3729             :                                    struct policy_handle *GroupSet)
    3730             : {
    3731           0 :         struct dcerpc_binding_handle *b = p->binding_handle;
    3732           0 :         struct clusapi_CloseGroupSet r;
    3733             : 
    3734           0 :         r.in.GroupSet = GroupSet;
    3735           0 :         r.out.GroupSet = GroupSet;
    3736             : 
    3737           0 :         torture_assert_ntstatus_ok(tctx,
    3738             :                 dcerpc_clusapi_CloseGroupSet_r(b, tctx, &r),
    3739             :                 "CloseGroupSet failed");
    3740           0 :         torture_assert_werr_ok(tctx,
    3741             :                 r.out.result,
    3742             :                 "CloseGroupSet failed");
    3743           0 :         torture_assert(tctx,
    3744             :                 ndr_policy_handle_empty(GroupSet),
    3745             :                 "policy_handle non empty after CloseGroupSet");
    3746             : 
    3747           0 :         return true;
    3748             : }
    3749             : 
    3750           0 : static bool test_OpenGroupSet(struct torture_context *tctx,
    3751             :                               void *data)
    3752             : {
    3753           0 :         struct torture_clusapi_context *t =
    3754           0 :                 talloc_get_type_abort(data, struct torture_clusapi_context);
    3755           0 :         struct policy_handle hGroupSet;
    3756             : 
    3757           0 :         if (t->lpwMajorVersion < 0x000a) {
    3758           0 :                 torture_skip(tctx, "GroupSet fn not available on old clusters");
    3759             :                 return true;
    3760             :         }
    3761             : 
    3762           0 :         if (!test_OpenGroupSet_int(tctx, t->p, "Cluster Group", &hGroupSet)) {
    3763           0 :                 return false;
    3764             :         }
    3765             : 
    3766           0 :         test_CloseGroupSet_int(tctx, t->p, &hGroupSet);
    3767             : 
    3768           0 :         return true;
    3769             : }
    3770             : 
    3771           0 : static bool test_CloseGroupSet(struct torture_context *tctx,
    3772             :                                void *data)
    3773             : {
    3774           0 :         struct torture_clusapi_context *t =
    3775           0 :                 talloc_get_type_abort(data, struct torture_clusapi_context);
    3776           0 :         struct policy_handle hGroupSet;
    3777             : 
    3778           0 :         if (t->lpwMajorVersion < 0x000a) {
    3779           0 :                 torture_skip(tctx, "GroupSet fn not available on old clusters");
    3780             :                 return true;
    3781             :         }
    3782             : 
    3783           0 :         if (!test_OpenGroupSet_int(tctx, t->p, "Cluster Group", &hGroupSet)) {
    3784           0 :                 return false;
    3785             :         }
    3786             : 
    3787           0 :         return test_CloseGroupSet_int(tctx, t->p, &hGroupSet);
    3788             : }
    3789             : 
    3790           0 : static bool test_one_groupset(struct torture_context *tctx,
    3791             :                               struct dcerpc_pipe *p,
    3792             :                               const char *groupset_name)
    3793             : {
    3794           0 :         struct policy_handle hGroupSet;
    3795             : 
    3796           0 :         torture_assert(tctx,
    3797             :                 test_OpenGroupSet_int(tctx, p, groupset_name, &hGroupSet),
    3798             :                 "failed to open groupset");
    3799             : 
    3800           0 :         test_CloseGroupSet_int(tctx, p, &hGroupSet);
    3801             : 
    3802           0 :         return true;
    3803             : }
    3804             : 
    3805           0 : static bool test_all_groupsets(struct torture_context *tctx,
    3806             :                                void *data)
    3807             : {
    3808           0 :         struct torture_clusapi_context *t =
    3809           0 :                 talloc_get_type_abort(data, struct torture_clusapi_context);
    3810           0 :         struct dcerpc_binding_handle *b = t->p->binding_handle;
    3811           0 :         struct clusapi_CreateGroupSetEnum r;
    3812           0 :         struct ENUM_LIST *ReturnEnum;
    3813           0 :         struct policy_handle Cluster;
    3814           0 :         WERROR rpc_status;
    3815           0 :         int i;
    3816             : 
    3817           0 :         if (!test_OpenCluster_int(tctx, t->p, &Cluster)) {
    3818           0 :                 return false;
    3819             :         }
    3820             : 
    3821           0 :         r.in.hCluster = Cluster;
    3822           0 :         r.out.ReturnEnum = &ReturnEnum;
    3823           0 :         r.out.rpc_status = &rpc_status;
    3824             : 
    3825           0 :         torture_assert_ntstatus_ok(tctx,
    3826             :                 dcerpc_clusapi_CreateGroupSetEnum_r(b, tctx, &r),
    3827             :                 "CreateGroupSetEnum failed");
    3828           0 :         torture_assert_werr_ok(tctx,
    3829             :                 r.out.result,
    3830             :                 "CreateGroupSetEnum failed");
    3831             : 
    3832           0 :         test_CloseCluster_int(tctx, t->p, &Cluster);
    3833             : 
    3834           0 :         for (i=0; i < ReturnEnum->EntryCount; i++) {
    3835             : 
    3836           0 :                 struct ENUM_ENTRY e = ReturnEnum->Entry[i];
    3837             : 
    3838           0 :                 torture_assert(tctx,
    3839             :                         test_one_groupset(tctx, t->p, e.Name),
    3840             :                         "failed to test one groupset");
    3841             :         }
    3842             : 
    3843           0 :         return true;
    3844             : }
    3845             : 
    3846           0 : static bool torture_rpc_clusapi_setup_common(struct torture_context *tctx,
    3847             :                                              struct torture_clusapi_context *t)
    3848             : {
    3849           0 :         struct dcerpc_binding_handle *b;
    3850             : 
    3851           0 :         torture_assert_ntstatus_ok(tctx,
    3852             :                 torture_rpc_connection(tctx, &t->p, &ndr_table_clusapi),
    3853             :                 "Error connecting to server");
    3854             : 
    3855           0 :         b = t->p->binding_handle;
    3856             : 
    3857             :         {
    3858           0 :                 struct clusapi_GetClusterName r;
    3859             : 
    3860           0 :                 r.out.ClusterName = &t->ClusterName;
    3861           0 :                 r.out.NodeName = &t->NodeName;
    3862             : 
    3863           0 :                 torture_assert_ntstatus_ok(tctx,
    3864             :                         dcerpc_clusapi_GetClusterName_r(b, tctx, &r),
    3865             :                         "GetClusterName failed");
    3866           0 :                 torture_assert_werr_ok(tctx,
    3867             :                         r.out.result,
    3868             :                         "GetClusterName failed");
    3869             :         }
    3870             :         {
    3871           0 :                 struct clusapi_GetClusterVersion2 r;
    3872           0 :                 const char *lpszVendorId;
    3873           0 :                 const char *lpszCSDVersion;
    3874           0 :                 struct CLUSTER_OPERATIONAL_VERSION_INFO *ppClusterOpVerInfo;
    3875           0 :                 WERROR rpc_status;
    3876             : 
    3877           0 :                 r.out.lpwMajorVersion = &t->lpwMajorVersion;
    3878           0 :                 r.out.lpwMinorVersion = &t->lpwMinorVersion;
    3879           0 :                 r.out.lpwBuildNumber = &t->lpwBuildNumber;
    3880           0 :                 r.out.lpszVendorId = &lpszVendorId;
    3881           0 :                 r.out.lpszCSDVersion = &lpszCSDVersion;
    3882           0 :                 r.out.ppClusterOpVerInfo = &ppClusterOpVerInfo;
    3883           0 :                 r.out.rpc_status = &rpc_status;
    3884             : 
    3885           0 :                 torture_assert_ntstatus_ok(tctx,
    3886             :                         dcerpc_clusapi_GetClusterVersion2_r(b, tctx, &r),
    3887             :                         "GetClusterVersion2 failed");
    3888           0 :                 torture_assert_werr_ok(tctx,
    3889             :                         r.out.result,
    3890             :                         "GetClusterVersion2 failed");
    3891             :         }
    3892             : 
    3893           0 :         return true;
    3894             : }
    3895             : 
    3896           0 : static bool torture_rpc_clusapi_setup(struct torture_context *tctx,
    3897             :                                       void **data)
    3898             : {
    3899           0 :         struct torture_clusapi_context *t;
    3900             : 
    3901           0 :         *data = t = talloc_zero(tctx, struct torture_clusapi_context);
    3902             : 
    3903           0 :         return torture_rpc_clusapi_setup_common(tctx, t);
    3904             : }
    3905             : 
    3906           0 : static bool torture_rpc_clusapi_teardown(struct torture_context *tctx,
    3907             :                                          void *data)
    3908             : {
    3909           0 :         talloc_free(data);
    3910             : 
    3911           0 :         return true;
    3912             : }
    3913             : 
    3914        2354 : void torture_tcase_cluster(struct torture_tcase *tcase)
    3915             : {
    3916        2354 :         torture_tcase_add_simple_test(tcase, "OpenCluster",
    3917             :                                       test_OpenCluster);
    3918        2354 :         torture_tcase_add_simple_test(tcase, "OpenClusterEx",
    3919             :                                       test_OpenClusterEx);
    3920        2354 :         torture_tcase_add_simple_test(tcase, "CloseCluster",
    3921             :                                       test_CloseCluster);
    3922        2354 :         torture_tcase_add_simple_test(tcase, "SetClusterName",
    3923             :                                       test_SetClusterName);
    3924        2354 :         torture_tcase_add_simple_test(tcase, "GetClusterName",
    3925             :                                       test_GetClusterName);
    3926        2354 :         torture_tcase_add_simple_test(tcase, "GetClusterVersion",
    3927             :                                       test_GetClusterVersion);
    3928        2354 :         torture_tcase_add_simple_test(tcase, "CreateEnum",
    3929             :                                       test_CreateEnum);
    3930        2354 :         torture_tcase_add_simple_test(tcase, "CreateEnumEx",
    3931             :                                       test_CreateEnumEx);
    3932        2354 :         torture_tcase_add_simple_test(tcase, "GetClusterVersion2",
    3933             :                                       test_GetClusterVersion2);
    3934        2354 :         torture_tcase_add_simple_test(tcase, "BackupClusterDatabase",
    3935             :                                       test_BackupClusterDatabase);
    3936        2354 :         torture_tcase_add_simple_test(tcase, "SetServiceAccountPassword",
    3937             :                                       test_SetServiceAccountPassword);
    3938        2354 :         torture_tcase_add_simple_test(tcase, "ClusterControl",
    3939             :                                       test_ClusterControl);
    3940        2354 :         torture_tcase_add_simple_test(tcase, "CreateResTypeEnum",
    3941             :                                       test_CreateResTypeEnum);
    3942        2354 :         torture_tcase_add_simple_test(tcase, "CreateGroupEnum",
    3943             :                                       test_CreateGroupEnum);
    3944             : 
    3945        2354 : }
    3946             : 
    3947        2354 : void torture_tcase_resource(struct torture_tcase *tcase)
    3948             : {
    3949         125 :         struct torture_test *test;
    3950             : 
    3951        2354 :         torture_tcase_add_simple_test(tcase, "GetQuorumResource",
    3952             :                                       test_GetQuorumResource);
    3953        2354 :         torture_tcase_add_simple_test(tcase, "SetQuorumResource",
    3954             :                                       test_SetQuorumResource);
    3955        2354 :         torture_tcase_add_simple_test(tcase, "OpenResource",
    3956             :                                       test_OpenResource);
    3957        2354 :         torture_tcase_add_simple_test(tcase, "OpenResourceEx",
    3958             :                                       test_OpenResourceEx);
    3959        2354 :         torture_tcase_add_simple_test(tcase, "CloseResource",
    3960             :                                       test_CloseResource);
    3961        2354 :         torture_tcase_add_simple_test(tcase, "CreateResource",
    3962             :                                       test_CreateResource);
    3963        2354 :         torture_tcase_add_simple_test(tcase, "DeleteResource",
    3964             :                                       test_DeleteResource);
    3965        2354 :         torture_tcase_add_simple_test(tcase, "SetResourceName",
    3966             :                                       test_SetResourceName);
    3967        2354 :         torture_tcase_add_simple_test(tcase, "GetResourceState",
    3968             :                                       test_GetResourceState);
    3969        2354 :         torture_tcase_add_simple_test(tcase, "GetResourceId",
    3970             :                                       test_GetResourceId);
    3971        2354 :         torture_tcase_add_simple_test(tcase, "GetResourceType",
    3972             :                                       test_GetResourceType);
    3973        2354 :         torture_tcase_add_simple_test(tcase, "CreateResEnum",
    3974             :                                       test_CreateResEnum);
    3975        2354 :         test = torture_tcase_add_simple_test(tcase, "FailResource",
    3976             :                                       test_FailResource);
    3977        2354 :         test->dangerous = true;
    3978        2354 :         torture_tcase_add_simple_test(tcase, "OnlineResource",
    3979             :                                       test_OnlineResource);
    3980        2354 :         test = torture_tcase_add_simple_test(tcase, "OfflineResource",
    3981             :                                       test_OfflineResource);
    3982        2354 :         test->dangerous = true;
    3983        2354 :         torture_tcase_add_simple_test(tcase, "GetResourceDependencyExpression",
    3984             :                                       test_GetResourceDependencyExpression);
    3985        2354 :         torture_tcase_add_simple_test(tcase, "GetResourceNetworkName",
    3986             :                                       test_GetResourceNetworkName);
    3987        2354 :         torture_tcase_add_simple_test(tcase, "all_resources",
    3988             :                                       test_all_resources);
    3989        2354 : }
    3990             : 
    3991        2354 : void torture_tcase_resourcetype(struct torture_tcase *tcase)
    3992             : {
    3993        2354 :         torture_tcase_add_simple_test(tcase, "all_resourcetypes",
    3994             :                                       test_all_resourcetypes);
    3995        2354 : }
    3996             : 
    3997        2354 : void torture_tcase_node(struct torture_tcase *tcase)
    3998             : {
    3999         125 :         struct torture_test *test;
    4000             : 
    4001        2354 :         torture_tcase_add_simple_test(tcase, "OpenNode",
    4002             :                                       test_OpenNode);
    4003        2354 :         torture_tcase_add_simple_test(tcase, "OpenNodeEx",
    4004             :                                       test_OpenNodeEx);
    4005        2354 :         torture_tcase_add_simple_test(tcase, "CloseNode",
    4006             :                                       test_CloseNode);
    4007        2354 :         torture_tcase_add_simple_test(tcase, "GetNodeState",
    4008             :                                       test_GetNodeState);
    4009        2354 :         torture_tcase_add_simple_test(tcase, "GetNodeId",
    4010             :                                       test_GetNodeId);
    4011        2354 :         torture_tcase_add_simple_test(tcase, "NodeControl",
    4012             :                                       test_NodeControl);
    4013        2354 :         test = torture_tcase_add_simple_test(tcase, "PauseNode",
    4014             :                                              test_PauseNode);
    4015        2354 :         test->dangerous = true;
    4016        2354 :         torture_tcase_add_simple_test(tcase, "ResumeNode",
    4017             :                                       test_ResumeNode);
    4018        2354 :         test = torture_tcase_add_simple_test(tcase, "EvictNode",
    4019             :                                              test_EvictNode);
    4020        2354 :         test->dangerous = true;
    4021        2354 :         torture_tcase_add_simple_test(tcase, "all_nodes",
    4022             :                                       test_all_nodes);
    4023        2354 : }
    4024             : 
    4025        2354 : void torture_tcase_group(struct torture_tcase *tcase)
    4026             : {
    4027         125 :         struct torture_test *test;
    4028             : 
    4029        2354 :         torture_tcase_add_simple_test(tcase, "OpenGroup",
    4030             :                                       test_OpenGroup);
    4031        2354 :         torture_tcase_add_simple_test(tcase, "OpenGroupEx",
    4032             :                                       test_OpenGroupEx);
    4033        2354 :         torture_tcase_add_simple_test(tcase, "CloseGroup",
    4034             :                                       test_CloseGroup);
    4035        2354 :         torture_tcase_add_simple_test(tcase, "GetGroupState",
    4036             :                                       test_GetGroupState);
    4037        2354 :         torture_tcase_add_simple_test(tcase, "GetGroupId",
    4038             :                                       test_GetGroupId);
    4039        2354 :         torture_tcase_add_simple_test(tcase, "GroupControl",
    4040             :                                       test_GroupControl);
    4041        2354 :         torture_tcase_add_simple_test(tcase, "OnlineGroup",
    4042             :                                       test_OnlineGroup);
    4043        2354 :         test = torture_tcase_add_simple_test(tcase, "OfflineGroup",
    4044             :                                       test_OfflineGroup);
    4045        2354 :         test->dangerous = true;
    4046        2354 :         torture_tcase_add_simple_test(tcase, "all_groups",
    4047             :                                       test_all_groups);
    4048        2354 : }
    4049             : 
    4050        2354 : void torture_tcase_network(struct torture_tcase *tcase)
    4051             : {
    4052        2354 :         torture_tcase_add_simple_test(tcase, "OpenNetwork",
    4053             :                                       test_OpenNetwork);
    4054        2354 :         torture_tcase_add_simple_test(tcase, "OpenNetworkEx",
    4055             :                                       test_OpenNetworkEx);
    4056        2354 :         torture_tcase_add_simple_test(tcase, "CloseNetwork",
    4057             :                                       test_CloseNetwork);
    4058        2354 :         torture_tcase_add_simple_test(tcase, "GetNetworkState",
    4059             :                                       test_GetNetworkState);
    4060        2354 :         torture_tcase_add_simple_test(tcase, "GetNetworkId",
    4061             :                                       test_GetNetworkId);
    4062        2354 :         torture_tcase_add_simple_test(tcase, "all_networks",
    4063             :                                       test_all_networks);
    4064        2354 : }
    4065             : 
    4066        2354 : void torture_tcase_netinterface(struct torture_tcase *tcase)
    4067             : {
    4068        2354 :         torture_tcase_add_simple_test(tcase, "OpenNetInterface",
    4069             :                                       test_OpenNetInterface);
    4070        2354 :         torture_tcase_add_simple_test(tcase, "OpenNetInterfaceEx",
    4071             :                                       test_OpenNetInterfaceEx);
    4072        2354 :         torture_tcase_add_simple_test(tcase, "CloseNetInterface",
    4073             :                                       test_CloseNetInterface);
    4074        2354 :         torture_tcase_add_simple_test(tcase, "GetNetInterfaceState",
    4075             :                                       test_GetNetInterfaceState);
    4076        2354 :         torture_tcase_add_simple_test(tcase, "GetNetInterfaceId",
    4077             :                                       test_GetNetInterfaceId);
    4078        2354 :         torture_tcase_add_simple_test(tcase, "all_netinterfaces",
    4079             :                                       test_all_netinterfaces);
    4080        2354 : }
    4081             : 
    4082        2354 : void torture_tcase_registry(struct torture_tcase *tcase)
    4083             : {
    4084        2354 :         torture_tcase_add_simple_test(tcase, "GetRootKey",
    4085             :                                       test_GetRootKey);
    4086        2354 :         torture_tcase_add_simple_test(tcase, "CloseKey",
    4087             :                                       test_CloseKey);
    4088        2354 :         torture_tcase_add_simple_test(tcase, "EnumKey",
    4089             :                                       test_EnumKey);
    4090        2354 :         torture_tcase_add_simple_test(tcase, "QueryValue",
    4091             :                                       test_QueryValue);
    4092        2354 :         torture_tcase_add_simple_test(tcase, "all_keys",
    4093             :                                       test_all_keys);
    4094        2354 : }
    4095             : 
    4096        2354 : void torture_tcase_groupset(struct torture_tcase *tcase)
    4097             : {
    4098        2354 :         torture_tcase_add_simple_test(tcase, "OpenGroupSet",
    4099             :                                       test_OpenGroupSet);
    4100        2354 :         torture_tcase_add_simple_test(tcase, "CloseGroupSet",
    4101             :                                       test_CloseGroupSet);
    4102        2354 :         torture_tcase_add_simple_test(tcase, "all_groupsets",
    4103             :                                       test_all_groupsets);
    4104        2354 : }
    4105             : 
    4106        2354 : struct torture_suite *torture_rpc_clusapi(TALLOC_CTX *mem_ctx)
    4107             : {
    4108         125 :         struct torture_tcase *tcase;
    4109        2354 :         struct torture_suite *suite = torture_suite_create(mem_ctx, "clusapi");
    4110             : 
    4111        2354 :         tcase = torture_suite_add_tcase(suite, "cluster");
    4112             : 
    4113        2354 :         torture_tcase_set_fixture(tcase,
    4114             :                                   torture_rpc_clusapi_setup,
    4115             :                                   torture_rpc_clusapi_teardown);
    4116             : 
    4117        2354 :         torture_tcase_cluster(tcase);
    4118             : 
    4119        2354 :         tcase = torture_suite_add_tcase(suite, "resource");
    4120             : 
    4121        2354 :         torture_tcase_set_fixture(tcase,
    4122             :                                   torture_rpc_clusapi_setup,
    4123             :                                   torture_rpc_clusapi_teardown);
    4124             : 
    4125        2354 :         torture_tcase_resource(tcase);
    4126             : 
    4127        2354 :         tcase = torture_suite_add_tcase(suite, "resourcetype");
    4128             : 
    4129        2354 :         torture_tcase_set_fixture(tcase,
    4130             :                                   torture_rpc_clusapi_setup,
    4131             :                                   torture_rpc_clusapi_teardown);
    4132             : 
    4133        2354 :         torture_tcase_resourcetype(tcase);
    4134             : 
    4135             : 
    4136        2354 :         tcase = torture_suite_add_tcase(suite, "node");
    4137             : 
    4138        2354 :         torture_tcase_set_fixture(tcase,
    4139             :                                   torture_rpc_clusapi_setup,
    4140             :                                   torture_rpc_clusapi_teardown);
    4141             : 
    4142        2354 :         torture_tcase_node(tcase);
    4143             : 
    4144        2354 :         tcase = torture_suite_add_tcase(suite, "group");
    4145             : 
    4146        2354 :         torture_tcase_set_fixture(tcase,
    4147             :                                   torture_rpc_clusapi_setup,
    4148             :                                   torture_rpc_clusapi_teardown);
    4149             : 
    4150        2354 :         torture_tcase_group(tcase);
    4151             : 
    4152        2354 :         tcase = torture_suite_add_tcase(suite, "network");
    4153             : 
    4154        2354 :         torture_tcase_set_fixture(tcase,
    4155             :                                   torture_rpc_clusapi_setup,
    4156             :                                   torture_rpc_clusapi_teardown);
    4157             : 
    4158        2354 :         torture_tcase_network(tcase);
    4159             : 
    4160        2354 :         tcase = torture_suite_add_tcase(suite, "netinterface");
    4161             : 
    4162        2354 :         torture_tcase_set_fixture(tcase,
    4163             :                                   torture_rpc_clusapi_setup,
    4164             :                                   torture_rpc_clusapi_teardown);
    4165             : 
    4166        2354 :         torture_tcase_netinterface(tcase);
    4167             : 
    4168        2354 :         tcase = torture_suite_add_tcase(suite, "registry");
    4169             : 
    4170        2354 :         torture_tcase_set_fixture(tcase,
    4171             :                                   torture_rpc_clusapi_setup,
    4172             :                                   torture_rpc_clusapi_teardown);
    4173             : 
    4174        2354 :         torture_tcase_registry(tcase);
    4175             : 
    4176        2354 :         tcase = torture_suite_add_tcase(suite, "groupset");
    4177             : 
    4178        2354 :         torture_tcase_set_fixture(tcase,
    4179             :                                   torture_rpc_clusapi_setup,
    4180             :                                   torture_rpc_clusapi_teardown);
    4181             : 
    4182        2354 :         torture_tcase_groupset(tcase);
    4183             : 
    4184        2354 :         return suite;
    4185             : }

Generated by: LCOV version 1.14