Enhance CynaraTestAdmin with adminCheck() method
[platform/core/test/security-tests.git] / tests / cynara-tests / common / cynara_test_admin.cpp
1 #include <cynara_test_admin.h>
2 #include <memory.h>
3 #include <tests_common.h>
4
5 #include <fstream>
6 #include <string>
7 #include <sstream>
8
9 namespace
10 {
11
12 std::ostream& operator<<(std::ostream& os, const cynara_admin_policy *const *policies)
13 {
14
15     os << "{" << std::endl;
16     for (size_t i=0; policies[i] != nullptr; ++i) {
17         os << "{";
18         os << " " << formatCstr(policies[i]->bucket);
19         os << " " << formatCstr(policies[i]->client);
20         os << " " << formatCstr(policies[i]->user);
21         os << " " << formatCstr(policies[i]->privilege);
22         os << " " << policies[i]->result;
23         os << " " << formatCstr(policies[i]->result_extra);
24         if (policies[i+1] != nullptr)
25             os << " }," << std::endl;
26         else
27             os << " }" << std::endl;
28     }
29     os << "}";
30     return os;
31 }
32
33 }
34
35 CynaraPoliciesContainer::CynaraPoliciesContainer()
36 {
37 }
38
39 CynaraPoliciesContainer::~CynaraPoliciesContainer()
40 {
41     for (struct cynara_admin_policy &policy : m_policies) {
42         free(policy.bucket);
43         free(policy.client);
44         free(policy.user);
45         free(policy.privilege);
46         free(policy.result_extra);
47     }
48 }
49
50 void CynaraPoliciesContainer::add(const char *bucket,
51                                   const char *client,
52                                   const char *user,
53                                   const char *privilege,
54                                   const int result,
55                                   const char *resultExtra)
56 {
57     m_policies.push_back({ nullptr, nullptr, nullptr, nullptr, 0, nullptr });
58     struct cynara_admin_policy &policy = m_policies.back();
59     if (bucket)
60         policy.bucket = strdup(bucket);
61     if (client)
62         policy.client = strdup(client);
63     if (user)
64         policy.user = strdup(user);
65     if (privilege)
66         policy.privilege = strdup(privilege);
67     policy.result = result;
68     if (resultExtra)
69         policy.result_extra = strdup(resultExtra);
70 }
71
72 CynaraTestAdmin::CynaraTestAdmin()
73     : m_admin(nullptr)
74 {
75     int ret = cynara_admin_initialize(&m_admin);
76     RUNNER_ASSERT_MSG(ret == CYNARA_ADMIN_API_SUCCESS,
77                          "cynara_admin_initialize failed. ret: " << ret);
78     RUNNER_ASSERT_MSG(m_admin != nullptr, "cynara_admin struct was not initialized");
79 }
80
81 CynaraTestAdmin::~CynaraTestAdmin()
82 {
83     cynara_admin_finish(m_admin);
84 }
85
86 void CynaraTestAdmin::setPolicies(const CynaraPoliciesContainer &policiesContainer,
87                                   int expectedResult)
88 {
89     const cynara_admin_policy *policies[policiesContainer.m_policies.size()+1];
90
91     for (size_t i = 0; i < policiesContainer.m_policies.size(); ++i) {
92         policies[i] = &policiesContainer.m_policies[i];
93     }
94     policies[policiesContainer.m_policies.size()] = nullptr;
95
96     int ret = cynara_admin_set_policies(m_admin, policies);
97     RUNNER_ASSERT_MSG(ret == expectedResult,
98                          "cynara_admin_set_policies returned wrong value: "
99                              << ret << " != " << expectedResult << ". "
100                              << "policies:\n" << policies);
101 }
102
103 void CynaraTestAdmin::setBucket(const char *bucket, int operation, const char *extra,
104                                 int expectedResult)
105 {
106     int ret = cynara_admin_set_bucket(m_admin, bucket, operation, extra);
107     RUNNER_ASSERT_MSG(ret == expectedResult,
108                          "cynara_admin_set_bucket returned wrong value: "
109                              << ret << " != " << expectedResult << "."
110                              << " bucket: " << formatCstr(bucket) << ","
111                              << " operation: " << operation << ","
112                              << " extra: " << formatCstr(extra));
113 }
114
115 void CynaraTestAdmin::adminCheck(const char *startBucket, int recursive,
116                                  const char *client, const char *user, const char *privilege,
117                                  int expectedCheckResult, const char *expectedCheckResultExtra,
118                                  int expectedResult)
119 {
120     int checkResult;
121     char *checkResultExtra = nullptr;
122
123     int ret = cynara_admin_check(m_admin,
124                                  startBucket, recursive,
125                                  client, user, privilege,
126                                  &checkResult, &checkResultExtra);
127     CStringPtr extra(checkResultExtra);
128
129     auto dump = [&]() -> std::string
130     {
131         std::stringstream s;
132         s  << " functionReturn: " << ret << ","
133            << " functionExpectedReturn: " << expectedResult << ",";
134
135         s  << " startBucket: " << formatCstr(startBucket) << ","
136            << " recursive: " << recursive << ","
137            << " client: " << formatCstr(client) << ","
138            << " user: " << formatCstr(user) << ","
139            << " privilege: " << formatCstr(privilege) << ",";
140
141         s  << " checkResult: " << checkResult << ","
142            << " expectedCheckResult: " << expectedCheckResult << ","
143            << " checkResultExtra: " << formatCstr(checkResultExtra) << ","
144            << " expectedCheckResultExtra: " << formatCstr(expectedCheckResultExtra);
145         return s.str();
146     };
147
148     RUNNER_ASSERT_MSG(ret == expectedResult,
149                          "cynara_admin_check returned wrong value: "
150                              << ret << " != " << expectedResult << "."
151                              << dump());
152
153     RUNNER_ASSERT_MSG(checkResult == expectedCheckResult,
154                          "cynara_admin_check returned wrong check result: "
155                              << checkResult << " != " << expectedCheckResult << "."
156                              << dump());
157
158     RUNNER_ASSERT_MSG(formatCstr(checkResultExtra) == formatCstr(expectedCheckResultExtra),
159                          "cynara_admin_check returned wrong check result extra: "
160                              << formatCstr(checkResultExtra) << " != "
161                              << formatCstr(expectedCheckResultExtra) << "."
162                              << dump());
163 }
164