return ::cynara_admin_list_policies(p_cynara_admin, bucket, client, user, privilege, policies);
}
+int AdminApiWrapper::cynara_admin_list_policies_descriptions(struct cynara_admin *p_cynara_admin,
+ struct cynara_admin_policy_descr ***descriptions) {
+ return ::cynara_admin_list_policies_descriptions(p_cynara_admin, descriptions);
+}
+
} /* namespace Cynara */
virtual int cynara_admin_erase(struct cynara_admin *p_cynara_admin, const char *start_bucket,
int recursive, const char *client, const char *user,
const char *privilege);
+ virtual int cynara_admin_list_policies_descriptions(struct cynara_admin *p_cynara_admin,
+ struct cynara_admin_policy_descr ***descriptions);
};
} /* namespace Cynara */
virtual int cynara_admin_erase(struct cynara_admin *p_cynara_admin, const char *start_bucket,
int recursive, const char *client, const char *user,
const char *privilege) = 0;
+ virtual int cynara_admin_list_policies_descriptions(struct cynara_admin *p_cynara_admin,
+ struct cynara_admin_policy_descr ***descriptions) = 0;
};
} /* namespace Cynara */
{ CmdlineOpt::ListPolicies,
{ "list-policies", CmdlineOpt::ListPolicies, "list-policies=<bucket>",
"name of bucket to erase policies from", OptHasArg::RequiredArgument } },
+ { CmdlineOpt::ListPoliciesDesc,
+ { "list-policies-descriptions", CmdlineOpt::ListPoliciesDesc, "list-policies-descriptions",
+ "", OptHasArg::NoArgument } },
{ CmdlineOpt::Type,
{ "type", CmdlineOpt::Type, "type=<type>",
helpStr << opt(CmdlineOpt::Privilege) << std::endl;
helpStr << std::endl;
+ helpStr << head("Policies descriptions list options", CmdlineOpt::ListPoliciesDesc)
+ << std::endl;
+ helpStr << opt(CmdlineOpt::ListPoliciesDesc) << std::endl;
+ helpStr << std::endl;
+
helpStr << head("Help options", CmdlineOpt::Help) << std::endl;
helpStr << opt(CmdlineOpt::Help);
Erase = 'e',
Check = 'a',
ListPolicies = 'l',
+ ListPoliciesDesc = 'g',
Type = 't',
Metadata = 'm',
return dispatcher.execute(*this);
}
+int ListPoliciesDescCyadCommand::run(CommandsDispatcher &dispatcher) {
+ return dispatcher.execute(*this);
+}
+
} /* namespace Cynara */
PolicyKey m_policyKey;
};
+class ListPoliciesDescCyadCommand : public CyadCommand {
+public:
+ ListPoliciesDescCyadCommand() {}
+ virtual ~ListPoliciesDescCyadCommand() {}
+
+ virtual int run(CommandsDispatcher &dispatcher);
+};
+
} /* namespace Cynara */
#endif /* SRC_CYAD_COMMANDLINEPARSER_CYADCOMMAND_H_ */
CmdlineOpt::SetPolicy,
CmdlineOpt::Erase,
CmdlineOpt::Check,
- CmdlineOpt::ListPolicies
+ CmdlineOpt::ListPolicies,
+ CmdlineOpt::ListPoliciesDesc
};
const auto longOpts = Opts::makeLongOptions(opts);
case CmdlineOpt::ListPolicies:
return parseListPolicies(optarg);
+ case CmdlineOpt::ListPoliciesDesc:
+ return std::make_shared<ListPoliciesDescCyadCommand>();
+
case '?': // Unknown option
return sharedError(Err::unknownOption());
return ret;
}
+int CommandsDispatcher::execute(ListPoliciesDescCyadCommand &) {
+ // Initialization is needed to make compiler happy (-Werror=maybe-uninitialized, FTW)
+ cynara_admin_policy_descr **descs = nullptr;
+
+ auto ret = m_adminApiWrapper.cynara_admin_list_policies_descriptions(m_cynaraAdmin, &descs);
+
+ auto printPolicyDesc = [this] (cynara_admin_policy_descr *pd) {
+ m_io.cout() << pd->result << ";"
+ << pd->name << std::endl;
+ };
+
+ auto freePolicyDesc = [] (cynara_admin_policy_descr *pd) {
+ free(pd->name);
+ free(pd);
+ };
+
+ if (ret == CYNARA_API_SUCCESS) {
+ for (int i = 0; descs[i]; ++i) {
+ auto p = descs[i];
+ printPolicyDesc(p);
+ freePolicyDesc(p);
+ }
+ free(descs);
+ }
+
+ return ret;
+}
+
} /* namespace Cynara */
virtual int execute(EraseCyadCommand &);
virtual int execute(CheckCyadCommand &);
virtual int execute(ListPoliciesCyadCommand &);
+ virtual int execute(ListPoliciesDescCyadCommand &);
private:
BaseDispatcherIO &m_io;
MOCK_METHOD6(cynara_admin_erase,
int(struct cynara_admin *p_cynara_admin, const char *start_bucket, int recursive,
const char *client, const char *user, const char *privilege));
+ MOCK_METHOD2(cynara_admin_list_policies_descriptions,
+ int(struct cynara_admin *p_cynara_admin,
+ struct cynara_admin_policy_descr ***descriptions));
};
#endif /* TEST_CYAD_FAKEADMINAPIWRAPPER_H_ */
ASSERT_EQ("some-bucket", result->bucketId());
ASSERT_EQ(Cynara::PolicyKey("c", "u", "p"), result->policyKey());
}
+
+TEST_F(CyadCommandlineTest, listPoliciesDesc) {
+ prepare_argv({ "./cyad", "--list-policies-descriptions" });
+ Cynara::CyadCommandlineParser parser(this->argc(), this->argv());
+
+ auto result = std::dynamic_pointer_cast<Cynara::ListPoliciesDescCyadCommand>(
+ parser.parseMain());
+ ASSERT_NE(nullptr, result);
+}
using Cynara::CmdlineOpts::commandlineOptions;
// A cheap trick to make sure this test is updated, when new options are added
- ASSERT_EQ(15, commandlineOptions.size());
+ ASSERT_EQ(16, commandlineOptions.size());
ASSERT_NO_THROW(commandlineOptions.at(CmdlineOpt::SetBucket));
ASSERT_NO_THROW(commandlineOptions.at(CmdlineOpt::DeleteBucket));
ASSERT_NO_THROW(commandlineOptions.at(CmdlineOpt::Erase));
ASSERT_NO_THROW(commandlineOptions.at(CmdlineOpt::Check));
ASSERT_NO_THROW(commandlineOptions.at(CmdlineOpt::ListPolicies));
+ ASSERT_NO_THROW(commandlineOptions.at(CmdlineOpt::ListPoliciesDesc));
ASSERT_NO_THROW(commandlineOptions.at(CmdlineOpt::Type));
ASSERT_NO_THROW(commandlineOptions.at(CmdlineOpt::Metadata));
ASSERT_EQ("bucket;cli;usr;privilege;0;metadata\nbucket-2;cli;usr;privilege;65535;\n",
m_io.coutRaw().str());
}
+
+TEST_F(CyadCommandlineDispatcherTest, listPoliciesDescNone) {
+ using ::testing::_;
+ using ::testing::DoAll;
+ using ::testing::NotNull;
+ using ::testing::Return;
+ using ::testing::SetArgPointee;
+
+ FakeAdminApiWrapper adminApi;
+
+ EXPECT_CALL(adminApi, cynara_admin_initialize(_)).WillOnce(Return(CYNARA_API_SUCCESS));
+ EXPECT_CALL(adminApi, cynara_admin_finish(_)).WillOnce(Return(CYNARA_API_SUCCESS));
+
+ Cynara::CommandsDispatcher dispatcher(m_io, adminApi);
+
+ Cynara::ListPoliciesDescCyadCommand command;
+
+ auto descs = static_cast<cynara_admin_policy_descr **>(
+ calloc(1, sizeof(cynara_admin_policy_descr *)));
+ descs[0] = nullptr;
+
+ EXPECT_CALL(adminApi, cynara_admin_list_policies_descriptions(_, NotNull()))
+ .WillOnce(DoAll(SetArgPointee<1>(descs), Return(CYNARA_API_SUCCESS)));
+
+ dispatcher.execute(command);
+
+ ASSERT_EQ("", m_io.coutRaw().str());
+}
+
+TEST_F(CyadCommandlineDispatcherTest, listPoliciesDescOne) {
+ using ::testing::_;
+ using ::testing::DoAll;
+ using ::testing::NotNull;
+ using ::testing::Return;
+ using ::testing::SetArgPointee;
+
+ FakeAdminApiWrapper adminApi;
+
+ EXPECT_CALL(adminApi, cynara_admin_initialize(_)).WillOnce(Return(CYNARA_API_SUCCESS));
+ EXPECT_CALL(adminApi, cynara_admin_finish(_)).WillOnce(Return(CYNARA_API_SUCCESS));
+
+ Cynara::CommandsDispatcher dispatcher(m_io, adminApi);
+
+ Cynara::ListPoliciesDescCyadCommand command;
+
+ auto descs = static_cast<cynara_admin_policy_descr **>(
+ calloc(2, sizeof(cynara_admin_policy_descr *)));
+
+ descs[0] = static_cast<cynara_admin_policy_descr *>(malloc(sizeof(cynara_admin_policy_descr)));
+ descs[0]->result = 42;
+ descs[0]->name = strdup("adams");
+ descs[1] = nullptr;
+
+ EXPECT_CALL(adminApi, cynara_admin_list_policies_descriptions(_, NotNull()))
+ .WillOnce(DoAll(SetArgPointee<1>(descs), Return(CYNARA_API_SUCCESS)));
+
+ dispatcher.execute(command);
+
+ ASSERT_EQ("42;adams\n", m_io.coutRaw().str());
+}