Implement --list-policies-descriptions option 03/33903/2
authorAleksander Zdyb <a.zdyb@samsung.com>
Fri, 16 Jan 2015 09:50:55 +0000 (10:50 +0100)
committerAleksander Zdyb <a.zdyb@samsung.com>
Fri, 16 Jan 2015 10:06:29 +0000 (11:06 +0100)
Change-Id: I5be0664a33191863d7a38ab1b5e42004a77b912e

14 files changed:
src/cyad/AdminApiWrapper.cpp
src/cyad/AdminApiWrapper.h
src/cyad/BaseAdminApiWrapper.h
src/cyad/CommandlineParser/CmdlineOpts.cpp
src/cyad/CommandlineParser/CmdlineOpts.h
src/cyad/CommandlineParser/CyadCommand.cpp
src/cyad/CommandlineParser/CyadCommand.h
src/cyad/CommandlineParser/CyadCommandlineParser.cpp
src/cyad/CommandsDispatcher.cpp
src/cyad/CommandsDispatcher.h
test/cyad/FakeAdminApiWrapper.h
test/cyad/commandline.cpp
test/cyad/commandline_options.cpp
test/cyad/commands_dispatcher.cpp

index 6224a1b..9cca101 100644 (file)
@@ -69,4 +69,9 @@ int AdminApiWrapper::cynara_admin_list_policies(struct cynara_admin *p_cynara_ad
     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 */
index 19663dc..62c076a 100644 (file)
@@ -52,6 +52,8 @@ public:
     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 */
index 41710f9..dff1a7c 100644 (file)
@@ -48,6 +48,8 @@ public:
     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 */
index a356287..5d1246f 100644 (file)
@@ -48,6 +48,9 @@ const OptionsMap commandlineOptions = {
     { 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>",
@@ -172,6 +175,11 @@ std::string makeHelp(void) {
     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);
 
index 8c357f4..6053bf5 100644 (file)
@@ -40,6 +40,7 @@ enum CmdlineOpt {
     Erase = 'e',
     Check = 'a',
     ListPolicies = 'l',
+    ListPoliciesDesc = 'g',
 
     Type = 't',
     Metadata = 'm',
index 6d5f0ca..cdd63d6 100644 (file)
@@ -66,4 +66,8 @@ int ListPoliciesCyadCommand::run(CommandsDispatcher &dispatcher) {
     return dispatcher.execute(*this);
 }
 
+int ListPoliciesDescCyadCommand::run(CommandsDispatcher &dispatcher) {
+    return dispatcher.execute(*this);
+}
+
 } /* namespace Cynara */
index 9973b7c..2133e2b 100644 (file)
@@ -229,6 +229,14 @@ private:
     PolicyKey m_policyKey;
 };
 
+class ListPoliciesDescCyadCommand : public CyadCommand {
+public:
+    ListPoliciesDescCyadCommand() {}
+    virtual ~ListPoliciesDescCyadCommand() {}
+
+    virtual int run(CommandsDispatcher &dispatcher);
+};
+
 } /* namespace Cynara */
 
 #endif /* SRC_CYAD_COMMANDLINEPARSER_CYADCOMMAND_H_ */
index 0ef406e..a775be1 100644 (file)
@@ -59,7 +59,8 @@ std::shared_ptr<CyadCommand> CyadCommandlineParser::parseMain(void) {
         CmdlineOpt::SetPolicy,
         CmdlineOpt::Erase,
         CmdlineOpt::Check,
-        CmdlineOpt::ListPolicies
+        CmdlineOpt::ListPolicies,
+        CmdlineOpt::ListPoliciesDesc
     };
 
     const auto longOpts = Opts::makeLongOptions(opts);
@@ -90,6 +91,9 @@ std::shared_ptr<CyadCommand> CyadCommandlineParser::parseMain(void) {
             case CmdlineOpt::ListPolicies:
                 return parseListPolicies(optarg);
 
+            case CmdlineOpt::ListPoliciesDesc:
+                return std::make_shared<ListPoliciesDescCyadCommand>();
+
             case '?': // Unknown option
                 return sharedError(Err::unknownOption());
 
index 2be90c5..0b8f0c0 100644 (file)
@@ -185,4 +185,32 @@ int CommandsDispatcher::execute(ListPoliciesCyadCommand &command) {
     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 */
index 396bbe6..b8b7f29 100644 (file)
@@ -47,6 +47,7 @@ public:
     virtual int execute(EraseCyadCommand &);
     virtual int execute(CheckCyadCommand &);
     virtual int execute(ListPoliciesCyadCommand &);
+    virtual int execute(ListPoliciesDescCyadCommand &);
 
 private:
     BaseDispatcherIO &m_io;
index 3dc3d4b..528b57d 100644 (file)
@@ -53,6 +53,9 @@ public:
     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_ */
index af503eb..b935685 100644 (file)
@@ -242,3 +242,12 @@ TEST_F(CyadCommandlineTest, listPoliciesOtherBucket) {
     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);
+}
index 0dca2f5..59dd0b8 100644 (file)
@@ -30,7 +30,7 @@ TEST(CommandlineOptions, allOptionsPresent) {
     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));
@@ -38,6 +38,7 @@ TEST(CommandlineOptions, allOptionsPresent) {
     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));
index e962312..471997e 100644 (file)
@@ -395,3 +395,63 @@ TEST_F(CyadCommandlineDispatcherTest, listPoliciesTwo) {
     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());
+}