2 * Copyright (c) 2014-2015 Samsung Electronics Co., Ltd All Rights Reserved
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
17 #include <cynara_test_admin.h>
20 #include <tests_common.h>
29 namespace CynaraTestAdmin {
34 std::ostream& operator<<(std::ostream& os, const cynara_admin_policy &policy)
37 os << " " << formatCstr(policy.bucket) << ",";
38 os << " " << formatCstr(policy.client) << ",";
39 os << " " << formatCstr(policy.user) << ",";
40 os << " " << formatCstr(policy.privilege) << ",";
41 os << " " << policy.result << ",";
42 os << " " << formatCstr(policy.result_extra);
43 os << " }" << std::endl;
47 std::ostream& operator<<(std::ostream& os, const cynara_admin_policy *const *policies)
49 os << "{" << std::endl;
50 for (size_t i = 0; policies[i] != nullptr; ++i)
56 int string_compare(const char *s1, const char *s2)
66 return strcmp(s1, s2);
69 bool policy_less(const cynara_admin_policy &p1, const cynara_admin_policy &p2)
71 auto sc = string_compare(p1.bucket, p2.bucket);
74 sc = string_compare(p1.client, p2.client);
77 sc = string_compare(p1.user, p2.user);
80 sc = string_compare(p1.privilege, p2.privilege);
83 sc = string_compare(p1.result_extra, p2.result_extra);
86 return p1.result < p2.result;
89 bool policy_equal(const cynara_admin_policy &p1, const cynara_admin_policy &p2)
91 return (p1.result == p2.result
92 && string_compare(p1.bucket, p2.bucket) == 0
93 && string_compare(p1.client, p2.client) == 0
94 && string_compare(p1.user, p2.user) == 0
95 && string_compare(p1.privilege, p2.privilege) == 0
96 && string_compare(p1.result_extra, p2.result_extra) == 0);
99 std::ostream& operator<<(std::ostream& os, const CynaraTestPlugins::Descriptions &descriptions)
101 os << "{" << std::endl;
102 for (const auto &desc : descriptions)
103 os << "{ [" << desc.type << "], <" << desc.name << "> }" << std::endl;
108 } // namespace anonymous
110 CynaraPoliciesContainer::CynaraPoliciesContainer()
114 CynaraPoliciesContainer::CynaraPoliciesContainer(struct cynara_admin_policy **policies)
119 for (int i = 0; policies[i]; ++i) {
120 auto policyPtr = policies[i];
121 m_policies.push_back(*policyPtr);
127 CynaraPoliciesContainer::~CynaraPoliciesContainer()
129 for (struct cynara_admin_policy &policy : m_policies) {
133 free(policy.privilege);
134 free(policy.result_extra);
138 void CynaraPoliciesContainer::add(const char *bucket,
141 const char *privilege,
143 const char *resultExtra)
145 m_policies.push_back({ nullptr, nullptr, nullptr, nullptr, 0, nullptr });
146 struct cynara_admin_policy &policy = m_policies.back();
148 policy.bucket = strdup(bucket);
150 policy.client = strdup(client);
152 policy.user = strdup(user);
154 policy.privilege = strdup(privilege);
155 policy.result = result;
157 policy.result_extra = strdup(resultExtra);
160 void CynaraPoliciesContainer::add(const char *bucket,
161 const CheckKey &checkKey,
163 const char *resultExtra)
165 add(bucket, checkKey.m_client, checkKey.m_user, checkKey.m_privilege, result, resultExtra);
168 void CynaraPoliciesContainer::sort()
170 std::sort(m_policies.begin(), m_policies.end(), policy_less);
173 std::ostream& operator<<(std::ostream& os, const CynaraPoliciesContainer &policies)
175 os << "{" << std::endl;
176 for (const auto & policy : policies.m_policies)
185 int ret = cynara_admin_initialize(&m_admin);
186 RUNNER_ASSERT_MSG(ret == CYNARA_API_SUCCESS,
187 "cynara_admin_initialize failed. ret: " << ret);
188 RUNNER_ASSERT_MSG(m_admin != nullptr, "cynara_admin struct was not initialized");
193 cynara_admin_finish(m_admin);
196 void Admin::setPolicies(const CynaraPoliciesContainer &policiesContainer,
199 const cynara_admin_policy *policies[policiesContainer.m_policies.size()+1];
201 for (size_t i = 0; i < policiesContainer.m_policies.size(); ++i) {
202 policies[i] = &policiesContainer.m_policies[i];
204 policies[policiesContainer.m_policies.size()] = nullptr;
206 int ret = cynara_admin_set_policies(m_admin, policies);
207 RUNNER_ASSERT_MSG(ret == expectedResult,
208 "cynara_admin_set_policies returned wrong value: "
209 << ret << " != " << expectedResult << ". "
210 << "policies:\n" << policies);
213 void Admin::setBucket(const char *bucket, int operation, const char *extra,
216 int ret = cynara_admin_set_bucket(m_admin, bucket, operation, extra);
217 RUNNER_ASSERT_MSG(ret == expectedResult,
218 "cynara_admin_set_bucket returned wrong value: "
219 << ret << " != " << expectedResult << "."
220 << " bucket: " << formatCstr(bucket) << ","
221 << " operation: " << operation << ","
222 << " extra: " << formatCstr(extra));
225 void Admin::adminCheck(const char *startBucket, int recursive,
226 const char *client, const char *user, const char *privilege,
227 int expectedCheckResult, const char *expectedCheckResultExtra,
231 char *checkResultExtra = nullptr;
233 int ret = cynara_admin_check(m_admin,
234 startBucket, recursive,
235 client, user, privilege,
236 &checkResult, &checkResultExtra);
237 CStringPtr extra(checkResultExtra);
239 auto dump = [&]() -> std::string
242 s << " functionReturn: " << ret << ","
243 << " functionExpectedReturn: " << expectedResult << ",";
245 s << " startBucket: " << formatCstr(startBucket) << ","
246 << " recursive: " << recursive << ","
247 << " client: " << formatCstr(client) << ","
248 << " user: " << formatCstr(user) << ","
249 << " privilege: " << formatCstr(privilege) << ",";
251 s << " checkResult: " << checkResult << ","
252 << " expectedCheckResult: " << expectedCheckResult << ","
253 << " checkResultExtra: " << formatCstr(checkResultExtra) << ","
254 << " expectedCheckResultExtra: " << formatCstr(expectedCheckResultExtra);
258 RUNNER_ASSERT_MSG(ret == expectedResult,
259 "cynara_admin_check returned wrong value: "
260 << ret << " != " << expectedResult << "."
263 RUNNER_ASSERT_MSG(checkResult == expectedCheckResult,
264 "cynara_admin_check returned wrong check result: "
265 << checkResult << " != " << expectedCheckResult << "."
268 RUNNER_ASSERT_MSG(formatCstr(checkResultExtra) == formatCstr(expectedCheckResultExtra),
269 "cynara_admin_check returned wrong check result extra: "
270 << formatCstr(checkResultExtra) << " != "
271 << formatCstr(expectedCheckResultExtra) << "."
275 void Admin::listPolicies(const char *startBucket,
276 const char *client, const char *user, const char *privilege,
277 CynaraPoliciesContainer &expectedPolicyList,
278 int expectedResult) {
280 struct cynara_admin_policy **policies = nullptr;
282 int ret = cynara_admin_list_policies(m_admin,
284 client, user, privilege,
287 CynaraPoliciesContainer receivedPolicyList(policies);
288 receivedPolicyList.sort();
289 expectedPolicyList.sort();
291 auto dump = [&]() -> std::string
294 s << " functionReturn: " << ret << ","
295 << " functionExpectedReturn: " << expectedResult << ",";
297 s << " startBucket: " << formatCstr(startBucket) << ","
298 << " client: " << formatCstr(client) << ","
299 << " user: " << formatCstr(user) << ","
300 << " privilege: " << formatCstr(privilege) << ",";
302 s << " receivedPolicyList: " << receivedPolicyList << ","
303 << " expectedPolicyList: " << expectedPolicyList;
307 RUNNER_ASSERT_MSG(ret == expectedResult,
308 "cynara_admin_list_policies returned wrong value: "
309 << ret << " != " << expectedResult << "."
312 RUNNER_ASSERT_MSG(receivedPolicyList.m_policies.size() == expectedPolicyList.m_policies.size(),
313 "size of list returned by cynara_admin_list_policies: "
314 << receivedPolicyList.m_policies.size()
315 << " doesn't match expected list size: "
316 << expectedPolicyList.m_policies.size() << "."
319 RUNNER_ASSERT_MSG(std::equal(receivedPolicyList.m_policies.begin(),
320 receivedPolicyList.m_policies.end(),
321 expectedPolicyList.m_policies.begin(),
323 "list returned by cynara_admin_list_policies doesn't match expected: "
327 void Admin::erasePolicies(const char *startBucket, int recursive,
328 const char *client, const char *user, const char *privilege,
331 int ret = cynara_admin_erase(m_admin,
332 startBucket, recursive,
333 client, user, privilege);
335 auto dump = [&]() -> std::string
338 s << " functionReturn: " << ret << ","
339 << " functionExpectedReturn: " << expectedResult << ",";
341 s << " startBucket: " << formatCstr(startBucket) << ","
342 << " recursive: " << recursive << ","
343 << " client: " << formatCstr(client) << ","
344 << " user: " << formatCstr(user) << ","
345 << " privilege: " << formatCstr(privilege);
350 RUNNER_ASSERT_MSG(ret == expectedResult,
351 "cynara_admin_erase returned wrong value: "
352 << ret << " != " << expectedResult << "."
356 CynaraTestPlugins::Descriptions parseAndRelease(cynara_admin_policy_descr **descriptions)
358 CynaraTestPlugins::Descriptions ret;
361 for (size_t i = 0; descriptions[i] != nullptr; ++i) {
362 auto descPtr = descriptions[i];
363 ret.push_back({ static_cast<Cynara::PolicyType>(descPtr->result),
364 std::string(descPtr->name) });
373 void Admin::listPoliciesDescriptions(CynaraTestPlugins::Descriptions &expectedDescriptions,
376 struct cynara_admin_policy_descr **descriptions = nullptr;
378 int ret = cynara_admin_list_policies_descriptions(m_admin, &descriptions);
380 CynaraTestPlugins::Descriptions receivedDescriptions = parseAndRelease(descriptions);
382 auto description_less = [](const Cynara::PolicyDescription &d1,
383 const Cynara::PolicyDescription &d2) -> bool {
384 return d1.type != d2.type ? d1.type < d2.type : d1.name < d2.name;
387 auto description_equal = [](const Cynara::PolicyDescription &d1,
388 const Cynara::PolicyDescription &d2) -> bool {
389 return d1.type == d2.type && d1.name == d2.name;
392 std::sort(receivedDescriptions.begin(), receivedDescriptions.end(), description_less);
393 std::sort(expectedDescriptions.begin(), expectedDescriptions.end(), description_less);
395 auto dump = [&]() -> std::string
398 s << " functionReturn: " << ret << ","
399 << " functionExpectedReturn: " << expectedResult << ",";
401 s << " receivedPolicyDescriptionList: " << receivedDescriptions << ","
402 << " expectedPolicyDescriptionList: " << expectedDescriptions << ".";
406 RUNNER_ASSERT_MSG(ret == expectedResult,
407 "cynara_admin_list_policies_descriptions returned wrong value: "
408 << ret << " != " << expectedResult << "."
411 RUNNER_ASSERT_MSG(receivedDescriptions.size() == expectedDescriptions.size(),
412 "size of list returned by cynara_admin_list_policies_descriptions: "
413 << receivedDescriptions.size()
414 << " doesn't match expected list size: "
415 << expectedDescriptions.size() << "."
418 RUNNER_ASSERT_MSG(std::equal(receivedDescriptions.begin(),
419 receivedDescriptions.end(),
420 expectedDescriptions.begin(),
422 "list returned by cynara_admin_list_policies_descriptions "
423 "doesn't match expected. " << dump());
426 } // namespace CynaraTestAdmin