2 * Copyright (c) 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.
18 * @file test_cases_agent.cpp
19 * @author Lukasz Wojciechowski <l.wojciechow@partner.samsung.com>
20 * @author Radoslaw Bartosiak <r.bartosiak@samsung.com>
22 * @brief Tests for libcynara-agent
28 #include <cynara-error.h>
29 #include <cynara-admin-types.h>
30 #include <cynara-client-async.h>
32 #include <dpl/test/test_runner.h>
33 #include <cynara_test_admin.h>
34 #include <cynara_test_agent.h>
35 #include <cynara_test_agent_request.h>
36 #include <cynara_test_agent_response.h>
37 #include <cynara_test_client_async_client.h>
38 #include <cynara_test_commons.h>
39 #include <cynara_test_env.h>
40 #include <service_manager.h>
43 using namespace CynaraTestAdmin;
44 using namespace CynaraTestAgent;
45 using namespace CynaraTestClientAsync;
46 using namespace CynaraTestPlugins;
48 void loadAgentPlugin()
51 paths.push_back(TEST_PLUGIN_PATH + TEST_AGENT);
52 loadServicePlugins(paths);
55 void setAgentPolicy(int expectedResult = CYNARA_API_SUCCESS)
57 const char *bucket = CYNARA_ADMIN_DEFAULT_BUCKET;
58 const char *wildcard = CYNARA_ADMIN_WILDCARD;
59 const char *extra = nullptr;
60 // collection of policy descriptions defined by plugin that causes use of TestAgent
61 auto testAgentPolicies = POLICY_DESCRIPTIONS.at(TEST_AGENT);
62 // any policy type from above collection
63 auto policyType = testAgentPolicies[0].type;
65 CynaraPoliciesContainer cp;
66 cp.add(bucket, wildcard, wildcard, wildcard, policyType, extra);
69 admin.setPolicies(cp, expectedResult);
74 ServiceManager serviceManager(CynaraTestConsts::SERVICE);
75 serviceManager.restartService();
78 void getAgentRequest(Agent &agent, AgentRequest &request, Client &client,
79 int expectedResult = CYNARA_API_SUCCESS,
80 Timeout::ExpectMode expectTimeoutMode = Timeout::ExpectMode::TIMEOUT)
82 auto timeLimit = std::chrono::seconds(2);
83 auto hangOnGetRequest = [&agent, &request, &expectedResult]() {
84 agent.getRequest(request, expectedResult);
86 Timeout::CancelFunction sendClientRequest = [&client]() {
88 client.assertStatus(READ);
91 Timeout::callAndWait(timeLimit, expectTimeoutMode,
92 sendClientRequest, hangOnGetRequest);
95 void tcag01_set_agent_type_policy_without_plugin_func()
97 loadServicePlugins(DirectoryPaths());
98 setAgentPolicy(CYNARA_API_INVALID_PARAM);
101 void tcag02_set_agent_type_policy_with_plugin_loaded_func()
107 void tcag03_check_with_no_agent_func()
109 std::string testNo("03");
111 RequestEntity callbackData = {RequestFunction(),
112 CYNARA_API_ACCESS_DENIED,
113 CYNARA_CALL_CAUSE_ANSWER};
119 client.createRequest({testNo}, id, callbackData);
120 client.assertStatus(READWRITE);
124 client.process(CYNARA_API_SUCCESS, Client::IGNORE_TIMEOUT);
127 void tcag04_agent_initialize_func()
132 void tcag05_agent_request_timeout_func()
135 AgentRequest request;
137 auto testTimeLimit = std::chrono::seconds(2);
138 auto hangOnGetRequest = [&agent, &request]() {
139 agent.getRequest(request, CYNARA_API_SERVICE_NOT_AVAILABLE);
142 Timeout::callAndWait(testTimeLimit, Timeout::ExpectMode::TIMEOUT,
143 restartCynara, hangOnGetRequest);
146 void tcag06_check_with_unregistered_agent_func()
148 std::string testNo("06");
150 RequestEntity callbackData = {RequestFunction(),
151 CYNARA_API_ACCESS_DENIED,
152 CYNARA_CALL_CAUSE_ANSWER};
160 client.createRequest({testNo}, id, callbackData);
161 client.assertStatus(READWRITE);
165 client.process(CYNARA_API_SUCCESS, Client::IGNORE_TIMEOUT);
168 void tcag07_get_request_func()
170 std::string testNo("07");
171 CheckData data(testNo);
173 RequestEntity callbackData = {RequestFunction(),
174 CYNARA_API_ACCESS_ALLOWED,
175 CYNARA_CALL_CAUSE_ANSWER};
181 AgentRequest agentRequest;
183 client.createRequest(data, id, callbackData);
184 client.assertStatus(READWRITE);
186 auto testTimeLimit = std::chrono::seconds(5);
187 Timeout::callAndWait(testTimeLimit, Timeout::ExpectMode::FINISHED,
188 restartCynara, getAgentRequest, std::ref(agent), std::ref(agentRequest),
189 std::ref(client), CYNARA_API_SUCCESS, Timeout::ExpectMode::TIMEOUT);
191 agentRequest.assertAction(data.m_client, data.m_user, data.m_privilege);
192 agent.putResponse(AgentResponse::createAllow(agentRequest.id()));
196 void tcag08_get_request_and_respond_with_wrong_id_func()
198 std::string testNo("08");
199 CheckData data(testNo);
201 RequestEntity callbackData = {RequestFunction(),
203 CYNARA_CALL_CAUSE_FINISH};
209 AgentRequest agentRequest;
211 client.createRequest(data, id, callbackData);
212 client.assertStatus(READWRITE);
214 auto testTimeLimit = std::chrono::seconds(5);
215 Timeout::callAndWait(testTimeLimit, Timeout::ExpectMode::FINISHED,
216 restartCynara, getAgentRequest, std::ref(agent), std::ref(agentRequest),
217 std::ref(client), CYNARA_API_SUCCESS, Timeout::ExpectMode::TIMEOUT);
218 agentRequest.assertAction(data.m_client, data.m_user, data.m_privilege);
219 agent.putResponse(AgentResponse::createAllow(agentRequest.id() + 1));
220 client.process(CYNARA_API_SUCCESS, Client::TimeoutExpectation::EXPECT_TIMEOUT, 2);
223 void tcag09_get_request_and_correct_responded_id_func()
225 std::string testNo("09");
226 CheckData data(testNo);
228 RequestEntity callbackData = {RequestFunction(),
229 CYNARA_API_ACCESS_ALLOWED,
230 CYNARA_CALL_CAUSE_ANSWER};
236 AgentRequest agentRequest;
238 client.createRequest(data, id, callbackData);
239 client.assertStatus(READWRITE);
241 auto testTimeLimit = std::chrono::seconds(5);
242 Timeout::callAndWait(testTimeLimit, Timeout::ExpectMode::FINISHED,
243 restartCynara, getAgentRequest, std::ref(agent), std::ref(agentRequest),
244 std::ref(client), CYNARA_API_SUCCESS, Timeout::ExpectMode::TIMEOUT);
245 agentRequest.assertAction(data.m_client, data.m_user, data.m_privilege);
246 agent.putResponse(AgentResponse::createAllow(agentRequest.id() + 1));
247 client.process(CYNARA_API_SUCCESS, Client::TimeoutExpectation::EXPECT_TIMEOUT, 2);
248 agent.putResponse(AgentResponse::createAllow(agentRequest.id()));
252 void tcag10_cancel_request_func()
254 std::string testNo("10");
255 CheckData data(testNo);
257 RequestEntity callbackData = {RequestFunction(),
258 CYNARA_API_ACCESS_ALLOWED,
259 CYNARA_CALL_CAUSE_CANCEL};
265 AgentRequest agentRequest;
268 client.createRequest(data, id, callbackData);
269 client.assertStatus(READWRITE);
271 auto testTimeLimit = std::chrono::seconds(5);
272 Timeout::callAndWait(testTimeLimit, Timeout::ExpectMode::FINISHED,
273 restartCynara, getAgentRequest, std::ref(agent), std::ref(agentRequest),
274 std::ref(client), CYNARA_API_SUCCESS, Timeout::ExpectMode::TIMEOUT);
275 agentRequest.assertAction(data.m_client, data.m_user, data.m_privilege);
277 Timeout::callAndWait(testTimeLimit, Timeout::ExpectMode::FINISHED,
278 restartCynara, getAgentRequest, std::ref(agent), std::ref(agentRequest),
279 std::ref(client), CYNARA_API_SUCCESS, Timeout::ExpectMode::TIMEOUT);
280 agentRequest.assertCancel();
281 agent.putResponse(AgentResponse::createCancel(id));
282 client.process(CYNARA_API_SUCCESS, Client::TimeoutExpectation::EXPECT_NO_TIMEOUT, 2);
285 void tcag11_cancel_processed_request_func()
287 std::string testNo("11");
288 CheckData data(testNo);
290 RequestEntity callbackData = {RequestFunction(),
291 CYNARA_API_ACCESS_ALLOWED,
292 CYNARA_CALL_CAUSE_CANCEL};
298 AgentRequest agentRequest;
301 client.createRequest(data, id, callbackData);
302 client.assertStatus(READWRITE);
304 auto testTimeLimit = std::chrono::seconds(5);
305 Timeout::callAndWait(testTimeLimit, Timeout::ExpectMode::FINISHED,
306 restartCynara, getAgentRequest, std::ref(agent), std::ref(agentRequest),
307 std::ref(client), CYNARA_API_SUCCESS, Timeout::ExpectMode::TIMEOUT);
308 agentRequest.assertAction(data.m_client, data.m_user, data.m_privilege);
309 agent.putResponse(AgentResponse::createCancel(id));
311 // we do not expect getting the cancel request in the agent
312 Timeout::callAndWait(testTimeLimit, Timeout::ExpectMode::TIMEOUT,
313 restartCynara, getAgentRequest, std::ref(agent), std::ref(agentRequest),
314 std::ref(client), CYNARA_API_SERVICE_NOT_AVAILABLE, Timeout::ExpectMode::TIMEOUT);
315 client.process(CYNARA_API_SUCCESS, Client::TimeoutExpectation::EXPECT_NO_TIMEOUT, 2);
318 void tcag12_create_two_requests_func()
320 std::string testNo("12");
321 CheckData data1(testNo, 1), data2(testNo, 2);
322 cynara_check_id id1, id2;
323 RequestEntity callbackData1 = {RequestFunction(),
324 CYNARA_API_ACCESS_DENIED,
325 CYNARA_CALL_CAUSE_ANSWER};
326 RequestEntity callbackData2 = {RequestFunction(),
327 CYNARA_API_ACCESS_ALLOWED,
328 CYNARA_CALL_CAUSE_CANCEL};
334 AgentRequest agentRequest1, agentRequest2, agentRequest3;
336 client.createRequest(data1, id1, callbackData1);
337 client.assertStatus(READWRITE);
338 client.createRequest(data2, id2, callbackData2);
339 client.assertStatus(READWRITE);
341 auto testTimeLimit = std::chrono::seconds(5);
342 Timeout::callAndWait(testTimeLimit, Timeout::ExpectMode::FINISHED,
343 restartCynara, getAgentRequest, std::ref(agent), std::ref(agentRequest1),
344 std::ref(client), CYNARA_API_SUCCESS, Timeout::ExpectMode::TIMEOUT);
345 Timeout::callAndWait(testTimeLimit, Timeout::ExpectMode::FINISHED,
346 restartCynara, getAgentRequest, std::ref(agent), std::ref(agentRequest2),
347 std::ref(client), CYNARA_API_SUCCESS, Timeout::ExpectMode::IGNORE);
349 client.assertStatus(READWRITE);
350 Timeout::callAndWait(testTimeLimit, Timeout::ExpectMode::FINISHED,
351 restartCynara, getAgentRequest, std::ref(agent), std::ref(agentRequest3),
352 std::ref(client), CYNARA_API_SUCCESS, Timeout::ExpectMode::TIMEOUT);
353 agentRequest1.assertAction(data1.m_client, data1.m_user, data1.m_privilege);
354 agentRequest2.assertAction(data2.m_client, data2.m_user, data2.m_privilege);
355 agentRequest3.assertCancel();
357 agent.putResponse(AgentResponse::createDeny(id1));
358 agent.putResponse(AgentResponse::createCancel(id2));
360 client.process(CYNARA_API_SUCCESS, Client::TimeoutExpectation::EXPECT_NO_TIMEOUT, 3);
361 client.process(CYNARA_API_SUCCESS, Client::TimeoutExpectation::IGNORE_TIMEOUT, 1);
364 void tcag13_create_many_requests_func()
366 const int numberOfRequests = 4;
367 std::string testNo("13");
368 cynara_check_id ids[numberOfRequests];
369 RequestEntity callbackData = {RequestFunction(),
370 CYNARA_API_ACCESS_DENIED,
371 CYNARA_CALL_CAUSE_ANSWER};
376 AgentRequest agentRequests[numberOfRequests];
378 for (int i = 0; i < numberOfRequests; i++) {
379 CheckData data(testNo, i);
380 client.createRequest(data, ids[i], callbackData);
381 client.assertStatus(READWRITE);
382 auto testTimeLimit = std::chrono::seconds(5);
383 Timeout::callAndWait(testTimeLimit, Timeout::ExpectMode::FINISHED, restartCynara,
384 getAgentRequest, std::ref(agent), std::ref(agentRequests[i]),
385 std::ref(client), CYNARA_API_SUCCESS, Timeout::ExpectMode::TIMEOUT);
386 agentRequests[i].assertAction(data.m_client, data.m_user, data.m_privilege);
388 for (int i = numberOfRequests - 1; i >= 0; i--) {
389 agent.putResponse(AgentResponse::createDeny(ids[i]));
390 client.process(CYNARA_API_SUCCESS, Client::TimeoutExpectation::EXPECT_NO_TIMEOUT, 2);
394 void tcag14_client_disconnects_func()
396 std::string testNo("14");
397 CheckData data(testNo);
399 RequestEntity callbackData = {RequestFunction(),
400 CYNARA_API_ACCESS_ALLOWED,
401 CYNARA_CALL_CAUSE_FINISH};
406 AgentRequest agentRequest;
407 auto testTimeLimit = std::chrono::seconds(5);
410 client.createRequest(data, id, callbackData);
411 client.assertStatus(READWRITE);
412 Timeout::callAndWait(testTimeLimit, Timeout::ExpectMode::FINISHED,
413 restartCynara, getAgentRequest, std::ref(agent),
414 std::ref(agentRequest), std::ref(client),
415 CYNARA_API_SUCCESS, Timeout::ExpectMode::TIMEOUT);
417 auto getAgentRequestWrap = [&agent, &agentRequest]() {
418 agent.getRequest(agentRequest, CYNARA_API_SUCCESS);
420 Timeout::callAndWait(testTimeLimit, Timeout::ExpectMode::FINISHED,
421 restartCynara, getAgentRequestWrap);
422 agentRequest.assertCancel();
425 void tcag15_agent_disconnects_func()
427 std::string testNo("15");
428 CheckData data(testNo);
430 RequestEntity callbackData = {RequestFunction(),
431 CYNARA_API_ACCESS_DENIED,
432 CYNARA_CALL_CAUSE_ANSWER};
437 client.createRequest(data, id, callbackData);
438 client.assertStatus(READWRITE);
439 AgentRequest agentRequest;
442 auto testTimeLimit = std::chrono::seconds(5);
443 Timeout::callAndWait(testTimeLimit, Timeout::ExpectMode::FINISHED, restartCynara,
444 getAgentRequest, std::ref(agent), std::ref(agentRequest),
445 std::ref(client), CYNARA_API_SUCCESS, Timeout::ExpectMode::TIMEOUT);
447 client.process(CYNARA_API_SUCCESS, Client::TimeoutExpectation::EXPECT_NO_TIMEOUT, 2);
450 RUNNER_TEST_GROUP_INIT(cynara_agent_tests)
452 RUN_CYNARA_TEST(tcag01_set_agent_type_policy_without_plugin)
453 RUN_CYNARA_TEST(tcag02_set_agent_type_policy_with_plugin_loaded)
454 RUN_CYNARA_TEST(tcag03_check_with_no_agent)
455 RUN_CYNARA_TEST(tcag04_agent_initialize)
456 RUN_CYNARA_TEST(tcag05_agent_request_timeout)
457 RUN_CYNARA_TEST(tcag06_check_with_unregistered_agent)
458 RUN_CYNARA_TEST(tcag07_get_request)
459 RUN_CYNARA_TEST(tcag08_get_request_and_respond_with_wrong_id)
460 RUN_CYNARA_TEST(tcag09_get_request_and_correct_responded_id)
461 RUN_CYNARA_TEST(tcag10_cancel_request)
462 RUN_CYNARA_TEST(tcag11_cancel_processed_request)
463 RUN_CYNARA_TEST(tcag12_create_two_requests)
464 RUN_CYNARA_TEST(tcag13_create_many_requests)
465 RUN_CYNARA_TEST(tcag14_client_disconnects)
466 RUN_CYNARA_TEST(tcag15_agent_disconnects)