PageRenderTime 29ms CodeModel.GetById 0ms RepoModel.GetById 0ms app.codeStats 0ms

/test/cyad/commands_dispatcher.cpp

https://gitlab.com/github-cloud-corporation/cynara
C++ | 433 lines | 302 code | 101 blank | 30 comment | 4 complexity | 6360715b6b3e2215eeeaba313895ec04 MD5 | raw file
  1. /*
  2. * Copyright (c) 2014-2015 Samsung Electronics Co., Ltd All Rights Reserved
  3. *
  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
  7. *
  8. * http://www.apache.org/licenses/LICENSE-2.0
  9. *
  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.
  15. */
  16. /**
  17. * @file test/cyad/commands_dispatcher.cpp
  18. * @author Aleksander Zdyb <a.zdyb@samsung.com>
  19. * @version 1.0
  20. * @brief Tests for CommandsDispatcher
  21. */
  22. #include <cstring>
  23. #include <ostream>
  24. #include <tuple>
  25. #include <vector>
  26. #include <gmock/gmock.h>
  27. #include <gtest/gtest.h>
  28. #include <cynara-admin-types.h>
  29. #include <cynara-error.h>
  30. #include <cynara-policy-types.h>
  31. #include <common/types/PolicyKey.h>
  32. #include <common/types/PolicyResult.h>
  33. #include <common/types/PolicyType.h>
  34. #include <cyad/CynaraAdminPolicies.h>
  35. #include <cyad/CommandlineParser/CyadCommand.h>
  36. #include <cyad/CommandsDispatcher.h>
  37. #include "CyadCommandlineDispatcherTest.h"
  38. #include "helpers.h"
  39. /**
  40. * @brief Dispatcher should not touch admin API on help or error
  41. * @test Scenario:
  42. * - Prepare some parsing results not requiring API calls
  43. * - Check if no API calls were made
  44. */
  45. TEST_F(CyadCommandlineDispatcherTest, noApi) {
  46. using ::testing::_;
  47. using ::testing::Return;
  48. Cynara::CommandsDispatcher dispatcher(m_io, m_adminApi, m_errorApi);
  49. Cynara::CyadCommand result;
  50. Cynara::HelpCyadCommand helpResult;
  51. Cynara::ErrorCyadCommand errorResult("Fake error");
  52. dispatcher.execute(result);
  53. dispatcher.execute(helpResult);
  54. dispatcher.execute(errorResult);
  55. }
  56. TEST_F(CyadCommandlineDispatcherTest, deleteBucket) {
  57. using ::testing::_;
  58. using ::testing::Return;
  59. using ::testing::StrEq;
  60. using ::testing::IsNull;
  61. Cynara::CommandsDispatcher dispatcher(m_io, m_adminApi, m_errorApi);
  62. Cynara::DeleteBucketCyadCommand result("test-bucket");
  63. EXPECT_CALL(m_adminApi,
  64. cynara_admin_set_bucket(_, StrEq("test-bucket"), CYNARA_ADMIN_DELETE, IsNull()))
  65. .WillOnce(Return(CYNARA_API_SUCCESS));
  66. dispatcher.execute(result);
  67. }
  68. TEST_F(CyadCommandlineDispatcherTest, setBucket) {
  69. using ::testing::_;
  70. using ::testing::Return;
  71. using ::testing::StrEq;
  72. using ::testing::IsNull;
  73. using ::testing::NotNull;
  74. using Cynara::PolicyBucketId;
  75. using Cynara::PolicyType;
  76. using Cynara::PolicyResult;
  77. addDescriptions({ { 42, "hitchhiker" } });
  78. Cynara::CommandsDispatcher dispatcher(m_io, m_adminApi, m_errorApi);
  79. typedef std::string RawPolicyType;
  80. typedef std::string Metadata;
  81. typedef std::tuple<PolicyBucketId, PolicyType, RawPolicyType, Metadata> BucketData;
  82. typedef std::vector<BucketData> Buckets;
  83. const Buckets buckets = {
  84. BucketData("test-bucket-1", CYNARA_ADMIN_ALLOW, "ALLOW", ""),
  85. BucketData("test-bucket-2", CYNARA_ADMIN_DENY, "DENY", ""),
  86. BucketData("test-bucket-3", CYNARA_ADMIN_BUCKET, "BUCKET", "other-bucket"),
  87. BucketData("test-bucket-2", CYNARA_ADMIN_NONE, "NONE", ""),
  88. BucketData("test-bucket-4", 42, "hitchhiker", "douglas-noel-adams") };
  89. for (const auto &bucket : buckets) {
  90. const auto &bucketId = std::get<0>(bucket);
  91. const auto &policyType = std::get<1>(bucket);
  92. const auto &rawPolicyType = std::get<2>(bucket);
  93. const auto &metadata = std::get<3>(bucket);
  94. SCOPED_TRACE(bucketId);
  95. Cynara::SetBucketCyadCommand result(bucketId, { rawPolicyType, metadata });
  96. if (metadata.empty() == false) {
  97. EXPECT_CALL(m_adminApi,
  98. cynara_admin_set_bucket(_, StrEq(bucketId.c_str()), policyType,
  99. StrEq(metadata.c_str())))
  100. .WillOnce(Return(CYNARA_API_SUCCESS));
  101. } else {
  102. EXPECT_CALL(m_adminApi,
  103. cynara_admin_set_bucket(_, StrEq(bucketId.c_str()), policyType, IsNull()))
  104. .WillOnce(Return(CYNARA_API_SUCCESS));
  105. }
  106. dispatcher.execute(result);
  107. }
  108. }
  109. TEST_F(CyadCommandlineDispatcherTest, setPolicy) {
  110. using ::testing::_;
  111. using ::testing::Return;
  112. Cynara::CommandsDispatcher dispatcher(m_io, m_adminApi, m_errorApi);
  113. Cynara::SetPolicyCyadCommand result("test-bucket", { "allow", "" },
  114. { "client", "user", "privilege" });
  115. Cynara::CynaraAdminPolicies expectedPolicies;
  116. expectedPolicies.add("test-bucket", { CYNARA_ADMIN_ALLOW, "" },
  117. { "client", "user", "privilege"} );
  118. expectedPolicies.seal();
  119. EXPECT_CALL(m_adminApi, cynara_admin_set_policies(_, AdmPolicyListEq(expectedPolicies.data())))
  120. .WillOnce(Return(CYNARA_API_SUCCESS));
  121. dispatcher.execute(result);
  122. }
  123. TEST_F(CyadCommandlineDispatcherTest, setPolicyWithMetadata) {
  124. using ::testing::_;
  125. using ::testing::Return;
  126. Cynara::CommandsDispatcher dispatcher(m_io, m_adminApi, m_errorApi);
  127. Cynara::SetPolicyCyadCommand result("test-bucket", { "allow", "metadata" },
  128. Cynara::PolicyKey("client", "user", "privilege"));
  129. Cynara::CynaraAdminPolicies expectedPolicies;
  130. expectedPolicies.add("test-bucket", { CYNARA_ADMIN_ALLOW, "metadata" },
  131. { "client", "user", "privilege"} );
  132. expectedPolicies.seal();
  133. EXPECT_CALL(m_adminApi, cynara_admin_set_policies(_, AdmPolicyListEq(expectedPolicies.data())))
  134. .WillOnce(Return(CYNARA_API_SUCCESS));
  135. dispatcher.execute(result);
  136. }
  137. TEST_F(CyadCommandlineDispatcherTest, setPoliciesBulk) {
  138. using ::testing::_;
  139. using ::testing::Return;
  140. Cynara::CommandsDispatcher dispatcher(m_io, m_adminApi, m_errorApi);
  141. Cynara::SetPolicyBulkCyadCommand result("-");
  142. // fake stdin ;)
  143. m_io.file() << "bucket;cli;usr;privilege;0;metadata" << std::endl;
  144. m_io.file() << "bucket-2;cli;usr;privilege;0xFFFF;" << std::endl;
  145. m_io.file() << "bucket-3;cli;usr;priv;bucket;bucket-2";
  146. Cynara::CynaraAdminPolicies expectedPolicies;
  147. expectedPolicies.add("bucket", { CYNARA_ADMIN_DENY, "metadata" }, {"cli", "usr", "privilege"} );
  148. expectedPolicies.add("bucket-2", { CYNARA_ADMIN_ALLOW, "" }, {"cli", "usr", "privilege"} );
  149. expectedPolicies.add("bucket-3", { CYNARA_ADMIN_BUCKET, "bucket-2" }, {"cli", "usr", "priv"} );
  150. expectedPolicies.seal();
  151. EXPECT_CALL(m_adminApi, cynara_admin_set_policies(_, AdmPolicyListEq(expectedPolicies.data())))
  152. .WillOnce(Return(CYNARA_API_SUCCESS));
  153. dispatcher.execute(result);
  154. }
  155. TEST_F(CyadCommandlineDispatcherTest, setPoliciesBulkInputError) {
  156. using ::testing::_;
  157. using ::testing::Return;
  158. Cynara::CommandsDispatcher dispatcher(m_io, m_adminApi, m_errorApi);
  159. Cynara::SetPolicyBulkCyadCommand result("-");
  160. // fake stdin ;)
  161. m_io.file() << "invalid input" << std::endl;
  162. dispatcher.execute(result);
  163. ASSERT_FALSE(m_io.cerrRaw().str().empty());
  164. }
  165. TEST_F(CyadCommandlineDispatcherTest, erase) {
  166. using ::testing::_;
  167. using ::testing::Return;
  168. using ::testing::StrEq;
  169. Cynara::CommandsDispatcher dispatcher(m_io, m_adminApi, m_errorApi);
  170. Cynara::EraseCyadCommand command("", true, { "client", "user", "privilege" });
  171. EXPECT_CALL(m_adminApi, cynara_admin_erase(_, StrEq(""), true, StrEq("client"), StrEq("user"),
  172. StrEq("privilege")))
  173. .WillOnce(Return(CYNARA_API_SUCCESS));
  174. dispatcher.execute(command);
  175. }
  176. TEST_F(CyadCommandlineDispatcherTest, check) {
  177. using ::testing::_;
  178. using ::testing::DoAll;
  179. using ::testing::NotNull;
  180. using ::testing::Return;
  181. using ::testing::SetArgPointee;
  182. using ::testing::StrEq;
  183. Cynara::CommandsDispatcher dispatcher(m_io, m_adminApi, m_errorApi);
  184. Cynara::CheckCyadCommand command("", true, { "client", "user", "privilege" });
  185. int result = 42;
  186. EXPECT_CALL(m_adminApi, cynara_admin_check(_, StrEq(""), true, StrEq("client"), StrEq("user"),
  187. StrEq("privilege"), NotNull(), NotNull()))
  188. .WillOnce(DoAll(SetArgPointee<6>(result), SetArgPointee<7>(nullptr),
  189. Return(CYNARA_API_SUCCESS)));
  190. dispatcher.execute(command);
  191. ASSERT_EQ("42;\n", m_io.coutRaw().str());
  192. }
  193. TEST_F(CyadCommandlineDispatcherTest, checkWithMetadata) {
  194. using ::testing::_;
  195. using ::testing::DoAll;
  196. using ::testing::NotNull;
  197. using ::testing::Return;
  198. using ::testing::SetArgPointee;
  199. using ::testing::StrEq;
  200. Cynara::CommandsDispatcher dispatcher(m_io, m_adminApi, m_errorApi);
  201. Cynara::CheckCyadCommand command("", true, { "client", "user", "privilege" });
  202. int result = 42;
  203. char *resultExtra = strdup("adams");
  204. EXPECT_CALL(m_adminApi, cynara_admin_check(_, StrEq(""), true, StrEq("client"), StrEq("user"),
  205. StrEq("privilege"), NotNull(), NotNull()))
  206. .WillOnce(DoAll(SetArgPointee<6>(result), SetArgPointee<7>(resultExtra),
  207. Return(CYNARA_API_SUCCESS)));
  208. dispatcher.execute(command);
  209. ASSERT_EQ("42;adams\n", m_io.coutRaw().str());
  210. }
  211. TEST_F(CyadCommandlineDispatcherTest, checkWithError) {
  212. using ::testing::_;
  213. using ::testing::HasSubstr;
  214. using ::testing::Invoke;
  215. using ::testing::NotNull;
  216. using ::testing::Return;
  217. using ::testing::StrEq;
  218. using ::testing::Unused;
  219. Cynara::CommandsDispatcher dispatcher(m_io, m_adminApi, m_errorApi);
  220. Cynara::CheckCyadCommand command("", true, { "client", "user", "privilege" });
  221. auto setErrorMessage = [] (Unused, char *buf, std::size_t buflen) {
  222. strncpy(buf, "Test error message", buflen);
  223. };
  224. EXPECT_CALL(m_adminApi, cynara_admin_check(_, StrEq(""), true, StrEq("client"), StrEq("user"),
  225. StrEq("privilege"), NotNull(), NotNull()))
  226. .WillOnce(Return(CYNARA_API_UNKNOWN_ERROR));
  227. // Should we expect some minimal buflen here?
  228. EXPECT_CALL(m_errorApi, cynara_strerror(CYNARA_API_UNKNOWN_ERROR, NotNull(), _))
  229. .WillOnce(DoAll(Invoke(setErrorMessage), Return(CYNARA_API_SUCCESS)));
  230. dispatcher.execute(command);
  231. ASSERT_THAT(m_io.cerrRaw().str(), HasSubstr("Test error message"));
  232. }
  233. TEST_F(CyadCommandlineDispatcherTest, listPoliciesNone) {
  234. using ::testing::_;
  235. using ::testing::DoAll;
  236. using ::testing::NotNull;
  237. using ::testing::Return;
  238. using ::testing::SetArgPointee;
  239. using ::testing::StrEq;
  240. Cynara::CommandsDispatcher dispatcher(m_io, m_adminApi, m_errorApi);
  241. Cynara::ListPoliciesCyadCommand command("", { "client", "user", "privilege" });
  242. Cynara::CynaraAdminPolicies resultPolicies;
  243. resultPolicies.seal();
  244. auto policies = resultPolicies.duplicate();
  245. EXPECT_CALL(m_adminApi, cynara_admin_list_policies(_, StrEq(""), StrEq("client"), StrEq("user"),
  246. StrEq("privilege"), NotNull()))
  247. .WillOnce(DoAll(SetArgPointee<5>(policies), Return(CYNARA_API_SUCCESS)));
  248. dispatcher.execute(command);
  249. ASSERT_EQ("", m_io.coutRaw().str());
  250. }
  251. TEST_F(CyadCommandlineDispatcherTest, listPoliciesTwo) {
  252. using ::testing::_;
  253. using ::testing::DoAll;
  254. using ::testing::NotNull;
  255. using ::testing::Return;
  256. using ::testing::SetArgPointee;
  257. using ::testing::StrEq;
  258. Cynara::CommandsDispatcher dispatcher(m_io, m_adminApi, m_errorApi);
  259. Cynara::ListPoliciesCyadCommand command("", { "client", "user", "privilege" });
  260. Cynara::CynaraAdminPolicies resultPolicies;
  261. resultPolicies.add("bucket", { CYNARA_ADMIN_DENY, "metadata" }, {"cli", "usr", "privilege"} );
  262. resultPolicies.add("bucket-2", { CYNARA_ADMIN_ALLOW, "" }, {"cli", "usr", "privilege"} );
  263. resultPolicies.seal();
  264. auto policies = resultPolicies.duplicate();
  265. EXPECT_CALL(m_adminApi, cynara_admin_list_policies(_, StrEq(""), StrEq("client"), StrEq("user"),
  266. StrEq("privilege"), NotNull()))
  267. .WillOnce(DoAll(SetArgPointee<5>(policies), Return(CYNARA_API_SUCCESS)));
  268. dispatcher.execute(command);
  269. ASSERT_EQ("bucket;cli;usr;privilege;0;metadata\nbucket-2;cli;usr;privilege;65535;\n",
  270. m_io.coutRaw().str());
  271. }
  272. TEST_F(CyadCommandlineDispatcherTest, listPoliciesAllSimpleTypes) {
  273. using ::testing::_;
  274. using ::testing::DoAll;
  275. using ::testing::NotNull;
  276. using ::testing::Return;
  277. using ::testing::SetArgPointee;
  278. using ::testing::StrEq;
  279. Cynara::CommandsDispatcher dispatcher(m_io, m_adminApi, m_errorApi);
  280. Cynara::ListPoliciesCyadCommand command("", { "client", "user", "privilege" });
  281. Cynara::CynaraAdminPolicies resultPolicies;
  282. resultPolicies.add("bucket", { CYNARA_ADMIN_DENY, "metadata" }, {"cli", "usr", "privilege"} );
  283. resultPolicies.add("bucket-2", { CYNARA_ADMIN_ALLOW, "" }, {"cli", "usr", "privilege"} );
  284. resultPolicies.add("bucket", { CYNARA_ADMIN_BUCKET, "bucket" }, {"*", "*", "*"} );
  285. resultPolicies.add("bucket", { CYNARA_ADMIN_NONE, "" }, {"*", "*", "*"} );
  286. resultPolicies.seal();
  287. auto policies = resultPolicies.duplicate();
  288. EXPECT_CALL(m_adminApi, cynara_admin_list_policies(_, StrEq(""), StrEq("client"), StrEq("user"),
  289. StrEq("privilege"), NotNull()))
  290. .WillOnce(DoAll(SetArgPointee<5>(policies), Return(CYNARA_API_SUCCESS)));
  291. dispatcher.execute(command);
  292. ASSERT_EQ("bucket;cli;usr;privilege;0;metadata\nbucket-2;cli;usr;privilege;65535;\n"
  293. "bucket;*;*;*;65534;bucket\nbucket;*;*;*;1;\n",
  294. m_io.coutRaw().str());
  295. }
  296. TEST_F(CyadCommandlineDispatcherTest, listPoliciesAllSimpleTypesHumanize) {
  297. using ::testing::_;
  298. using ::testing::DoAll;
  299. using ::testing::NotNull;
  300. using ::testing::Return;
  301. using ::testing::SetArgPointee;
  302. using ::testing::StrEq;
  303. Cynara::CommandsDispatcher dispatcher(m_io, m_adminApi, m_errorApi);
  304. Cynara::ListPoliciesCyadCommand command("", { "client", "user", "privilege" }, true);
  305. Cynara::CynaraAdminPolicies resultPolicies;
  306. resultPolicies.add("bucket", { CYNARA_ADMIN_DENY, "metadata" }, {"cli", "usr", "privilege"} );
  307. resultPolicies.add("bucket-2", { CYNARA_ADMIN_ALLOW, "" }, {"cli", "usr", "privilege"} );
  308. resultPolicies.add("bucket", { CYNARA_ADMIN_BUCKET, "bucket" }, {"*", "*", "*"} );
  309. resultPolicies.add("bucket", { CYNARA_ADMIN_NONE, "" }, {"*", "*", "*"} );
  310. resultPolicies.seal();
  311. auto policies = resultPolicies.duplicate();
  312. EXPECT_CALL(m_adminApi, cynara_admin_list_policies(_, StrEq(""), StrEq("client"), StrEq("user"),
  313. StrEq("privilege"), NotNull()))
  314. .WillOnce(DoAll(SetArgPointee<5>(policies), Return(CYNARA_API_SUCCESS)));
  315. dispatcher.execute(command);
  316. ASSERT_EQ("bucket;cli;usr;privilege;deny;metadata\nbucket-2;cli;usr;privilege;allow;\n"
  317. "bucket;*;*;*;bucket;bucket\nbucket;*;*;*;none;\n",
  318. m_io.coutRaw().str());
  319. }
  320. TEST_F(CyadCommandlineDispatcherTest, listPoliciesDesc) {
  321. using ::testing::_;
  322. using ::testing::DoAll;
  323. using ::testing::NotNull;
  324. using ::testing::Return;
  325. using ::testing::SetArgPointee;
  326. using ::testing::HasSubstr;
  327. addDescriptions({ { 42, "adams" } });
  328. Cynara::CommandsDispatcher dispatcher(m_io, m_adminApi, m_errorApi);
  329. Cynara::ListPoliciesDescCyadCommand command;
  330. dispatcher.execute(command);
  331. EXPECT_THAT(m_io.coutRaw().str(), HasSubstr("42;adams\n"));
  332. }