Add cynara test admin class
[platform/core/test/security-tests.git] / tests / cynara-tests / common / cynara_test_admin.cpp
1 #include <cynara_test_admin.h>
2 #include <tests_common.h>
3
4 #include <fstream>
5
6 namespace
7 {
8
9 std::string formatCstr(const char *cstr)
10 {
11     if (!cstr)
12         return std::string("nullptr");
13     return std::string("\"") + cstr + "\"";
14 }
15
16 std::ostream& operator<<(std::ostream& os, const cynara_admin_policy *const *policies)
17 {
18
19     os << "{" << std::endl;
20     for (size_t i=0; policies[i] != nullptr; ++i) {
21         os << "{";
22         os << " " << formatCstr(policies[i]->bucket);
23         os << " " << formatCstr(policies[i]->client);
24         os << " " << formatCstr(policies[i]->user);
25         os << " " << formatCstr(policies[i]->privilege);
26         os << " " << policies[i]->result;
27         os << " " << formatCstr(policies[i]->result_extra);
28         if (policies[i+1] != nullptr)
29             os << " }," << std::endl;
30         else
31             os << " }" << std::endl;
32     }
33     os << "}";
34     return os;
35 }
36
37 }
38
39 CynaraPoliciesContainer::CynaraPoliciesContainer()
40 {
41 }
42
43 CynaraPoliciesContainer::~CynaraPoliciesContainer()
44 {
45     for (struct cynara_admin_policy &policy : m_policies) {
46         free(policy.bucket);
47         free(policy.client);
48         free(policy.user);
49         free(policy.privilege);
50         free(policy.result_extra);
51     }
52 }
53
54 void CynaraPoliciesContainer::add(const char *bucket,
55                                   const char *client,
56                                   const char *user,
57                                   const char *privilege,
58                                   const int result,
59                                   const char *resultExtra)
60 {
61     m_policies.push_back({ nullptr, nullptr, nullptr, nullptr, 0, nullptr });
62     struct cynara_admin_policy &policy = m_policies.back();
63     if (bucket)
64         policy.bucket = strdup(bucket);
65     if (client)
66         policy.client = strdup(client);
67     if (user)
68         policy.user = strdup(user);
69     if (privilege)
70         policy.privilege = strdup(privilege);
71     policy.result = result;
72     if (resultExtra)
73         policy.result_extra = strdup(resultExtra);
74 }
75
76 CynaraTestAdmin::CynaraTestAdmin()
77     : m_admin(nullptr)
78 {
79     int ret = cynara_admin_initialize(&m_admin);
80     RUNNER_ASSERT_MSG_BT(ret == CYNARA_ADMIN_API_SUCCESS,
81                          "cynara_admin_initialize failed. ret: " << ret);
82     RUNNER_ASSERT_MSG_BT(m_admin != nullptr, "cynara_admin struct was not initialized");
83 }
84
85 CynaraTestAdmin::~CynaraTestAdmin()
86 {
87     cynara_admin_finish(m_admin);
88 }
89
90 void CynaraTestAdmin::setPolicies(const CynaraPoliciesContainer &policiesContainer,
91                                   int expectedResult)
92 {
93     const cynara_admin_policy *policies[policiesContainer.m_policies.size()+1];
94
95     for (size_t i = 0; i < policiesContainer.m_policies.size(); ++i) {
96         policies[i] = &policiesContainer.m_policies[i];
97     }
98     policies[policiesContainer.m_policies.size()] = nullptr;
99
100     int ret = cynara_admin_set_policies(m_admin, policies);
101     RUNNER_ASSERT_MSG_BT(ret == expectedResult,
102                          "cynara_admin_set_policies returned wrong value: "
103                              << ret << " != " << expectedResult << ". "
104                              << "policies:\n" << policies);
105 }
106
107 void CynaraTestAdmin::setBucket(const char *bucket, int operation, const char *extra,
108                                 int expectedResult)
109 {
110     int ret = cynara_admin_set_bucket(m_admin, bucket, operation, extra);
111     RUNNER_ASSERT_MSG_BT(ret == expectedResult,
112                          "cynara_admin_set_bucket returned wrong value: "
113                              << ret << " != " << expectedResult << "."
114                              << " bucket: " << formatCstr(bucket) << ","
115                              << " operation: " << operation << ","
116                              << " extra: " << formatCstr(extra));
117 }