2 * Copyright (c) 2014-2015 Samsung Electronics Co., Ltd All Rights Reserved
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
8 * http://www.apache.org/licenses/LICENSE-2.0
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.
17 * @file test/cyad/commands_dispatcher.cpp
18 * @author Aleksander Zdyb <a.zdyb@samsung.com>
20 * @brief Tests for CommandsDispatcher
28 #include <gmock/gmock.h>
29 #include <gtest/gtest.h>
31 #include <cynara-admin-types.h>
32 #include <cynara-error.h>
33 #include <cynara-policy-types.h>
35 #include <common/types/PolicyKey.h>
36 #include <common/types/PolicyResult.h>
37 #include <common/types/PolicyType.h>
38 #include <cyad/CynaraAdminPolicies.h>
39 #include <cyad/CommandlineParser/CyadCommand.h>
40 #include <cyad/CommandsDispatcher.h>
42 #include "CyadCommandlineDispatcherTest.h"
46 * @brief Dispatcher should not touch admin API on help or error
48 * - Prepare some parsing results not requiring API calls
49 * - Check if no API calls were made
51 TEST_F(CyadCommandlineDispatcherTest, noApi) {
53 using ::testing::Return;
55 Cynara::CommandsDispatcher dispatcher(m_io, m_adminApi, m_errorApi);
57 Cynara::CyadCommand result;
58 Cynara::HelpCyadCommand helpResult;
59 Cynara::ErrorCyadCommand errorResult("Fake error");
61 dispatcher.execute(result);
62 dispatcher.execute(helpResult);
63 dispatcher.execute(errorResult);
66 TEST_F(CyadCommandlineDispatcherTest, deleteBucket) {
68 using ::testing::Return;
69 using ::testing::StrEq;
70 using ::testing::IsNull;
72 Cynara::CommandsDispatcher dispatcher(m_io, m_adminApi, m_errorApi);
73 Cynara::DeleteBucketCyadCommand result("test-bucket");
75 EXPECT_CALL(m_adminApi,
76 cynara_admin_set_bucket(_, StrEq("test-bucket"), CYNARA_ADMIN_DELETE, IsNull()))
77 .WillOnce(Return(CYNARA_API_SUCCESS));
79 dispatcher.execute(result);
82 TEST_F(CyadCommandlineDispatcherTest, setBucket) {
84 using ::testing::Return;
85 using ::testing::StrEq;
86 using ::testing::IsNull;
87 using ::testing::NotNull;
88 using Cynara::PolicyBucketId;
89 using Cynara::PolicyType;
90 using Cynara::PolicyResult;
92 addDescriptions({ { 42, "hitchhiker" } });
94 Cynara::CommandsDispatcher dispatcher(m_io, m_adminApi, m_errorApi);
96 typedef std::string RawPolicyType;
97 typedef std::string Metadata;
98 typedef std::tuple<PolicyBucketId, PolicyType, RawPolicyType, Metadata> BucketData;
99 typedef std::vector<BucketData> Buckets;
100 const Buckets buckets = {
101 BucketData("test-bucket-1", CYNARA_ADMIN_ALLOW, "ALLOW", ""),
102 BucketData("test-bucket-2", CYNARA_ADMIN_DENY, "DENY", ""),
103 BucketData("test-bucket-3", CYNARA_ADMIN_BUCKET, "BUCKET", "other-bucket"),
104 BucketData("test-bucket-2", CYNARA_ADMIN_NONE, "NONE", ""),
105 BucketData("test-bucket-4", 42, "hitchhiker", "douglas-noel-adams") };
107 for (const auto &bucket : buckets) {
108 const auto &bucketId = std::get<0>(bucket);
109 const auto &policyType = std::get<1>(bucket);
110 const auto &rawPolicyType = std::get<2>(bucket);
111 const auto &metadata = std::get<3>(bucket);
113 SCOPED_TRACE(bucketId);
115 Cynara::SetBucketCyadCommand result(bucketId, { rawPolicyType, metadata });
117 if (metadata.empty() == false) {
118 EXPECT_CALL(m_adminApi,
119 cynara_admin_set_bucket(_, StrEq(bucketId.c_str()), policyType,
120 StrEq(metadata.c_str())))
121 .WillOnce(Return(CYNARA_API_SUCCESS));
123 EXPECT_CALL(m_adminApi,
124 cynara_admin_set_bucket(_, StrEq(bucketId.c_str()), policyType, IsNull()))
125 .WillOnce(Return(CYNARA_API_SUCCESS));
128 dispatcher.execute(result);
132 TEST_F(CyadCommandlineDispatcherTest, setPolicy) {
134 using ::testing::Return;
136 Cynara::CommandsDispatcher dispatcher(m_io, m_adminApi, m_errorApi);
137 Cynara::SetPolicyCyadCommand result("test-bucket", { "allow", "" },
138 { "client", "user", "privilege" });
140 Cynara::CynaraAdminPolicies expectedPolicies;
141 expectedPolicies.add("test-bucket", { CYNARA_ADMIN_ALLOW, "" },
142 { "client", "user", "privilege"} );
143 expectedPolicies.seal();
145 EXPECT_CALL(m_adminApi, cynara_admin_set_policies(_, AdmPolicyListEq(expectedPolicies.data())))
146 .WillOnce(Return(CYNARA_API_SUCCESS));
148 dispatcher.execute(result);
151 TEST_F(CyadCommandlineDispatcherTest, setPolicyWithMetadata) {
153 using ::testing::Return;
155 Cynara::CommandsDispatcher dispatcher(m_io, m_adminApi, m_errorApi);
156 Cynara::SetPolicyCyadCommand result("test-bucket", { "allow", "metadata" },
157 Cynara::PolicyKey("client", "user", "privilege"));
159 Cynara::CynaraAdminPolicies expectedPolicies;
160 expectedPolicies.add("test-bucket", { CYNARA_ADMIN_ALLOW, "metadata" },
161 { "client", "user", "privilege"} );
162 expectedPolicies.seal();
164 EXPECT_CALL(m_adminApi, cynara_admin_set_policies(_, AdmPolicyListEq(expectedPolicies.data())))
165 .WillOnce(Return(CYNARA_API_SUCCESS));
167 dispatcher.execute(result);
170 TEST_F(CyadCommandlineDispatcherTest, setPoliciesBulk) {
172 using ::testing::Return;
174 Cynara::CommandsDispatcher dispatcher(m_io, m_adminApi, m_errorApi);
175 Cynara::SetPolicyBulkCyadCommand result("-");
178 m_io.file() << "bucket;cli;usr;privilege;0;metadata" << std::endl;
179 m_io.file() << "bucket-2;cli;usr;privilege;0xFFFF;" << std::endl;
180 m_io.file() << "bucket-3;cli;usr;priv;bucket;bucket-2";
182 Cynara::CynaraAdminPolicies expectedPolicies;
183 expectedPolicies.add("bucket", { CYNARA_ADMIN_DENY, "metadata" }, {"cli", "usr", "privilege"} );
184 expectedPolicies.add("bucket-2", { CYNARA_ADMIN_ALLOW, "" }, {"cli", "usr", "privilege"} );
185 expectedPolicies.add("bucket-3", { CYNARA_ADMIN_BUCKET, "bucket-2" }, {"cli", "usr", "priv"} );
186 expectedPolicies.seal();
188 EXPECT_CALL(m_adminApi, cynara_admin_set_policies(_, AdmPolicyListEq(expectedPolicies.data())))
189 .WillOnce(Return(CYNARA_API_SUCCESS));
191 dispatcher.execute(result);
194 TEST_F(CyadCommandlineDispatcherTest, setPoliciesBulkInputError) {
196 using ::testing::Return;
198 Cynara::CommandsDispatcher dispatcher(m_io, m_adminApi, m_errorApi);
199 Cynara::SetPolicyBulkCyadCommand result("-");
202 m_io.file() << "invalid input" << std::endl;
204 dispatcher.execute(result);
206 ASSERT_FALSE(m_io.cerrRaw().str().empty());
209 TEST_F(CyadCommandlineDispatcherTest, erase) {
211 using ::testing::Return;
212 using ::testing::StrEq;
214 Cynara::CommandsDispatcher dispatcher(m_io, m_adminApi, m_errorApi);
216 Cynara::EraseCyadCommand command("", true, { "client", "user", "privilege" });
218 EXPECT_CALL(m_adminApi, cynara_admin_erase(_, StrEq(""), true, StrEq("client"), StrEq("user"),
220 .WillOnce(Return(CYNARA_API_SUCCESS));
222 dispatcher.execute(command);
225 TEST_F(CyadCommandlineDispatcherTest, check) {
227 using ::testing::DoAll;
228 using ::testing::NotNull;
229 using ::testing::Return;
230 using ::testing::SetArgPointee;
231 using ::testing::StrEq;
233 Cynara::CommandsDispatcher dispatcher(m_io, m_adminApi, m_errorApi);
235 Cynara::CheckCyadCommand command("", true, { "client", "user", "privilege" });
238 EXPECT_CALL(m_adminApi, cynara_admin_check(_, StrEq(""), true, StrEq("client"), StrEq("user"),
239 StrEq("privilege"), NotNull(), NotNull()))
240 .WillOnce(DoAll(SetArgPointee<6>(result), SetArgPointee<7>(nullptr),
241 Return(CYNARA_API_SUCCESS)));
243 dispatcher.execute(command);
245 ASSERT_EQ("42;\n", m_io.coutRaw().str());
248 TEST_F(CyadCommandlineDispatcherTest, checkWithMetadata) {
250 using ::testing::DoAll;
251 using ::testing::NotNull;
252 using ::testing::Return;
253 using ::testing::SetArgPointee;
254 using ::testing::StrEq;
256 Cynara::CommandsDispatcher dispatcher(m_io, m_adminApi, m_errorApi);
258 Cynara::CheckCyadCommand command("", true, { "client", "user", "privilege" });
260 char *resultExtra = strdup("adams");
262 EXPECT_CALL(m_adminApi, cynara_admin_check(_, StrEq(""), true, StrEq("client"), StrEq("user"),
263 StrEq("privilege"), NotNull(), NotNull()))
264 .WillOnce(DoAll(SetArgPointee<6>(result), SetArgPointee<7>(resultExtra),
265 Return(CYNARA_API_SUCCESS)));
267 dispatcher.execute(command);
269 ASSERT_EQ("42;adams\n", m_io.coutRaw().str());
272 TEST_F(CyadCommandlineDispatcherTest, checkWithError) {
274 using ::testing::HasSubstr;
275 using ::testing::Invoke;
276 using ::testing::NotNull;
277 using ::testing::Return;
278 using ::testing::StrEq;
279 using ::testing::Unused;
281 Cynara::CommandsDispatcher dispatcher(m_io, m_adminApi, m_errorApi);
283 Cynara::CheckCyadCommand command("", true, { "client", "user", "privilege" });
285 auto setErrorMessage = [] (Unused, char *buf, std::size_t buflen) {
286 strncpy(buf, "Test error message", buflen);
289 EXPECT_CALL(m_adminApi, cynara_admin_check(_, StrEq(""), true, StrEq("client"), StrEq("user"),
290 StrEq("privilege"), NotNull(), NotNull()))
291 .WillOnce(Return(CYNARA_API_UNKNOWN_ERROR));
293 // Should we expect some minimal buflen here?
294 EXPECT_CALL(m_errorApi, cynara_strerror(CYNARA_API_UNKNOWN_ERROR, NotNull(), _))
295 .WillOnce(DoAll(Invoke(setErrorMessage), Return(CYNARA_API_SUCCESS)));
297 dispatcher.execute(command);
299 ASSERT_THAT(m_io.cerrRaw().str(), HasSubstr("Test error message"));
302 TEST_F(CyadCommandlineDispatcherTest, listPoliciesNone) {
304 using ::testing::DoAll;
305 using ::testing::NotNull;
306 using ::testing::Return;
307 using ::testing::SetArgPointee;
308 using ::testing::StrEq;
310 Cynara::CommandsDispatcher dispatcher(m_io, m_adminApi, m_errorApi);
312 Cynara::ListPoliciesCyadCommand command("", { "client", "user", "privilege" });
314 Cynara::CynaraAdminPolicies resultPolicies;
315 resultPolicies.seal();
316 auto policies = resultPolicies.duplicate();
318 EXPECT_CALL(m_adminApi, cynara_admin_list_policies(_, StrEq(""), StrEq("client"), StrEq("user"),
319 StrEq("privilege"), NotNull()))
320 .WillOnce(DoAll(SetArgPointee<5>(policies), Return(CYNARA_API_SUCCESS)));
322 dispatcher.execute(command);
324 ASSERT_EQ("", m_io.coutRaw().str());
327 TEST_F(CyadCommandlineDispatcherTest, listPoliciesTwo) {
329 using ::testing::DoAll;
330 using ::testing::NotNull;
331 using ::testing::Return;
332 using ::testing::SetArgPointee;
333 using ::testing::StrEq;
335 Cynara::CommandsDispatcher dispatcher(m_io, m_adminApi, m_errorApi);
337 Cynara::ListPoliciesCyadCommand command("", { "client", "user", "privilege" });
339 Cynara::CynaraAdminPolicies resultPolicies;
340 resultPolicies.add("bucket", { CYNARA_ADMIN_DENY, "metadata" }, {"cli", "usr", "privilege"} );
341 resultPolicies.add("bucket-2", { CYNARA_ADMIN_ALLOW, "" }, {"cli", "usr", "privilege"} );
342 resultPolicies.seal();
343 auto policies = resultPolicies.duplicate();
345 EXPECT_CALL(m_adminApi, cynara_admin_list_policies(_, StrEq(""), StrEq("client"), StrEq("user"),
346 StrEq("privilege"), NotNull()))
347 .WillOnce(DoAll(SetArgPointee<5>(policies), Return(CYNARA_API_SUCCESS)));
349 dispatcher.execute(command);
351 ASSERT_EQ("bucket;cli;usr;privilege;0;metadata\nbucket-2;cli;usr;privilege;65535;\n",
352 m_io.coutRaw().str());
355 TEST_F(CyadCommandlineDispatcherTest, listPoliciesDesc) {
357 using ::testing::DoAll;
358 using ::testing::NotNull;
359 using ::testing::Return;
360 using ::testing::SetArgPointee;
361 using ::testing::HasSubstr;
363 addDescriptions({ { 42, "adams" } });
365 Cynara::CommandsDispatcher dispatcher(m_io, m_adminApi, m_errorApi);
367 Cynara::ListPoliciesDescCyadCommand command;
368 dispatcher.execute(command);
370 EXPECT_THAT(m_io.coutRaw().str(), HasSubstr("42;adams\n"));