--- /dev/null
+#include <cynara_test_admin.h>
+#include <tests_common.h>
+
+#include <fstream>
+
+namespace
+{
+
+std::string formatCstr(const char *cstr)
+{
+ if (!cstr)
+ return std::string("nullptr");
+ return std::string("\"") + cstr + "\"";
+}
+
+std::ostream& operator<<(std::ostream& os, const cynara_admin_policy *const *policies)
+{
+
+ os << "{" << std::endl;
+ for (size_t i=0; policies[i] != nullptr; ++i) {
+ os << "{";
+ os << " " << formatCstr(policies[i]->bucket);
+ os << " " << formatCstr(policies[i]->client);
+ os << " " << formatCstr(policies[i]->user);
+ os << " " << formatCstr(policies[i]->privilege);
+ os << " " << policies[i]->result;
+ os << " " << formatCstr(policies[i]->result_extra);
+ if (policies[i+1] != nullptr)
+ os << " }," << std::endl;
+ else
+ os << " }" << std::endl;
+ }
+ os << "}";
+ return os;
+}
+
+}
+
+CynaraPoliciesContainer::CynaraPoliciesContainer()
+{
+}
+
+CynaraPoliciesContainer::~CynaraPoliciesContainer()
+{
+ for (struct cynara_admin_policy &policy : m_policies) {
+ free(policy.bucket);
+ free(policy.client);
+ free(policy.user);
+ free(policy.privilege);
+ free(policy.result_extra);
+ }
+}
+
+void CynaraPoliciesContainer::add(const char *bucket,
+ const char *client,
+ const char *user,
+ const char *privilege,
+ const int result,
+ const char *resultExtra)
+{
+ m_policies.push_back({ nullptr, nullptr, nullptr, nullptr, 0, nullptr });
+ struct cynara_admin_policy &policy = m_policies.back();
+ if (bucket)
+ policy.bucket = strdup(bucket);
+ if (client)
+ policy.client = strdup(client);
+ if (user)
+ policy.user = strdup(user);
+ if (privilege)
+ policy.privilege = strdup(privilege);
+ policy.result = result;
+ if (resultExtra)
+ policy.result_extra = strdup(resultExtra);
+}
+
+CynaraTestAdmin::CynaraTestAdmin()
+ : m_admin(nullptr)
+{
+ int ret = cynara_admin_initialize(&m_admin);
+ RUNNER_ASSERT_MSG_BT(ret == CYNARA_ADMIN_API_SUCCESS,
+ "cynara_admin_initialize failed. ret: " << ret);
+ RUNNER_ASSERT_MSG_BT(m_admin != nullptr, "cynara_admin struct was not initialized");
+}
+
+CynaraTestAdmin::~CynaraTestAdmin()
+{
+ cynara_admin_finish(m_admin);
+}
+
+void CynaraTestAdmin::setPolicies(const CynaraPoliciesContainer &policiesContainer,
+ int expectedResult)
+{
+ const cynara_admin_policy *policies[policiesContainer.m_policies.size()+1];
+
+ for (size_t i = 0; i < policiesContainer.m_policies.size(); ++i) {
+ policies[i] = &policiesContainer.m_policies[i];
+ }
+ policies[policiesContainer.m_policies.size()] = nullptr;
+
+ int ret = cynara_admin_set_policies(m_admin, policies);
+ RUNNER_ASSERT_MSG_BT(ret == expectedResult,
+ "cynara_admin_set_policies returned wrong value: "
+ << ret << " != " << expectedResult << ". "
+ << "policies:\n" << policies);
+}
+
+void CynaraTestAdmin::setBucket(const char *bucket, int operation, const char *extra,
+ int expectedResult)
+{
+ int ret = cynara_admin_set_bucket(m_admin, bucket, operation, extra);
+ RUNNER_ASSERT_MSG_BT(ret == expectedResult,
+ "cynara_admin_set_bucket returned wrong value: "
+ << ret << " != " << expectedResult << "."
+ << " bucket: " << formatCstr(bucket) << ","
+ << " operation: " << operation << ","
+ << " extra: " << formatCstr(extra));
+}
--- /dev/null
+#ifndef CYNARA_TEST_ADMIN_H
+#define CYNARA_TEST_ADMIN_H
+
+#include <cynara-admin.h>
+#include <vector>
+
+class CynaraTestAdmin;
+
+class CynaraPoliciesContainer
+{
+public:
+ CynaraPoliciesContainer();
+ virtual ~CynaraPoliciesContainer();
+
+ void add(const char *bucket,
+ const char *client,
+ const char *user,
+ const char *privilege,
+ const int result,
+ const char *resultExtra);
+private:
+ friend class CynaraTestAdmin;
+
+ std::vector<struct cynara_admin_policy> m_policies;
+};
+
+class CynaraTestAdmin
+{
+public:
+ CynaraTestAdmin();
+ virtual ~CynaraTestAdmin();
+
+ void setPolicies(const CynaraPoliciesContainer &policiesContainer,
+ int expectedResult = CYNARA_ADMIN_API_SUCCESS);
+ void setBucket(const char *bucket, int operation, const char *extra,
+ int expectedResult = CYNARA_ADMIN_API_SUCCESS);
+private:
+ struct cynara_admin *m_admin;
+};
+
+#endif // CYNARA_TEST_ADMIN_H