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);
72 void getAgentRequest(Agent &agent, AgentRequest &request, Client &client,
73 int expectedResult = CYNARA_API_SUCCESS,
74 Timeout::ExpectMode expectTimeoutMode = Timeout::ExpectMode::TIMEOUT)
76 auto timeLimit = std::chrono::seconds(2);
77 auto hangOnGetRequest = [&agent, &request, &expectedResult]() {
78 agent.getRequest(request, expectedResult);
80 Timeout::CancelFunction sendClientRequest = [&client]() {
82 client.assertStatus(READ);
85 Timeout::callAndWait(timeLimit, expectTimeoutMode,
86 sendClientRequest, hangOnGetRequest);
89 RUNNER_TEST_GROUP_INIT(cynara_agent_tests)
91 RUN_CYNARA_TEST(tcag01_set_agent_type_policy_without_plugin_func)
93 loadServicePlugins(DirectoryPaths());
94 setAgentPolicy(CYNARA_API_INVALID_PARAM);
97 RUN_CYNARA_TEST(tcag02_set_agent_type_policy_with_plugin_loaded_func)
103 RUN_CYNARA_TEST(tcag03_check_with_no_agent_func)
105 std::string testNo("03");
107 RequestEntity callbackData = {RequestFunction(),
108 CYNARA_API_ACCESS_DENIED,
109 CYNARA_CALL_CAUSE_ANSWER};
115 client.createRequest({testNo}, id, callbackData);
116 client.assertStatus(READWRITE);
120 client.process(CYNARA_API_SUCCESS, Client::IGNORE_TIMEOUT);
123 RUN_CYNARA_TEST(tcag04_agent_initialize_func)
128 RUN_CYNARA_TEST(tcag05_agent_request_timeout_func)
131 AgentRequest request;
133 auto testTimeLimit = std::chrono::seconds(2);
134 auto hangOnGetRequest = [&agent, &request]() {
135 agent.getRequest(request, CYNARA_API_SERVICE_NOT_AVAILABLE);
138 Timeout::callAndWait(testTimeLimit, Timeout::ExpectMode::TIMEOUT,
139 restartCynaraServiceAndSockets, hangOnGetRequest);
142 RUN_CYNARA_TEST(tcag06_check_with_unregistered_agent_func)
144 std::string testNo("06");
146 RequestEntity callbackData = {RequestFunction(),
147 CYNARA_API_ACCESS_DENIED,
148 CYNARA_CALL_CAUSE_ANSWER};
156 client.createRequest({testNo}, id, callbackData);
157 client.assertStatus(READWRITE);
161 client.process(CYNARA_API_SUCCESS, Client::IGNORE_TIMEOUT);
164 RUN_CYNARA_TEST(tcag07_get_request_func)
166 std::string testNo("07");
167 CheckData data(testNo);
169 RequestEntity callbackData = {RequestFunction(),
170 CYNARA_API_ACCESS_ALLOWED,
171 CYNARA_CALL_CAUSE_ANSWER};
177 AgentRequest agentRequest;
179 client.createRequest(data, id, callbackData);
180 client.assertStatus(READWRITE);
182 auto testTimeLimit = std::chrono::seconds(5);
183 Timeout::callAndWait(testTimeLimit, Timeout::ExpectMode::FINISHED,
184 restartCynaraServiceAndSockets, getAgentRequest,
185 std::ref(agent), std::ref(agentRequest), std::ref(client),
186 CYNARA_API_SUCCESS, Timeout::ExpectMode::TIMEOUT);
188 agentRequest.assertAction(data.m_client, data.m_user, data.m_privilege);
189 agent.putResponse(AgentResponse::createAllow(agentRequest.id()));
193 RUN_CYNARA_TEST(tcag08_get_request_and_respond_with_wrong_id_func)
195 std::string testNo("08");
196 CheckData data(testNo);
198 RequestEntity callbackData = {RequestFunction(),
200 CYNARA_CALL_CAUSE_FINISH};
206 AgentRequest agentRequest;
208 client.createRequest(data, id, callbackData);
209 client.assertStatus(READWRITE);
211 auto testTimeLimit = std::chrono::seconds(5);
212 Timeout::callAndWait(testTimeLimit, Timeout::ExpectMode::FINISHED,
213 restartCynaraServiceAndSockets, getAgentRequest,
214 std::ref(agent), std::ref(agentRequest), std::ref(client),
215 CYNARA_API_SUCCESS, Timeout::ExpectMode::TIMEOUT);
216 agentRequest.assertAction(data.m_client, data.m_user, data.m_privilege);
217 agent.putResponse(AgentResponse::createAllow(agentRequest.id() + 1));
218 client.process(CYNARA_API_SUCCESS, Client::TimeoutExpectation::EXPECT_TIMEOUT, 2);
221 RUN_CYNARA_TEST(tcag09_get_request_and_correct_responded_id_func)
223 std::string testNo("09");
224 CheckData data(testNo);
226 RequestEntity callbackData = {RequestFunction(),
227 CYNARA_API_ACCESS_ALLOWED,
228 CYNARA_CALL_CAUSE_ANSWER};
234 AgentRequest agentRequest;
236 client.createRequest(data, id, callbackData);
237 client.assertStatus(READWRITE);
239 auto testTimeLimit = std::chrono::seconds(5);
240 Timeout::callAndWait(testTimeLimit, Timeout::ExpectMode::FINISHED,
241 restartCynaraServiceAndSockets, getAgentRequest,
242 std::ref(agent), std::ref(agentRequest), std::ref(client),
243 CYNARA_API_SUCCESS, Timeout::ExpectMode::TIMEOUT);
244 agentRequest.assertAction(data.m_client, data.m_user, data.m_privilege);
245 agent.putResponse(AgentResponse::createAllow(agentRequest.id() + 1));
246 client.process(CYNARA_API_SUCCESS, Client::TimeoutExpectation::EXPECT_TIMEOUT, 2);
247 agent.putResponse(AgentResponse::createAllow(agentRequest.id()));
251 RUN_CYNARA_TEST(tcag10_cancel_request_func)
253 std::string testNo("10");
254 CheckData data(testNo);
256 RequestEntity callbackData = {RequestFunction(),
257 CYNARA_API_ACCESS_ALLOWED,
258 CYNARA_CALL_CAUSE_CANCEL};
264 AgentRequest agentRequest;
267 client.createRequest(data, id, callbackData);
268 client.assertStatus(READWRITE);
270 auto testTimeLimit = std::chrono::seconds(5);
271 Timeout::callAndWait(testTimeLimit, Timeout::ExpectMode::FINISHED,
272 restartCynaraServiceAndSockets, getAgentRequest,
273 std::ref(agent), std::ref(agentRequest), std::ref(client),
274 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 restartCynaraServiceAndSockets, getAgentRequest,
279 std::ref(agent), std::ref(agentRequest), std::ref(client),
280 CYNARA_API_SUCCESS, Timeout::ExpectMode::TIMEOUT);
281 agentRequest.assertCancel();
282 agent.putResponse(AgentResponse::createCancel(id));
283 client.process(CYNARA_API_SUCCESS, Client::TimeoutExpectation::EXPECT_NO_TIMEOUT, 2);
286 RUN_CYNARA_TEST(tcag11_cancel_processed_request_func)
288 std::string testNo("11");
289 CheckData data(testNo);
291 RequestEntity callbackData = {RequestFunction(),
292 CYNARA_API_ACCESS_ALLOWED,
293 CYNARA_CALL_CAUSE_CANCEL};
299 AgentRequest agentRequest;
302 client.createRequest(data, id, callbackData);
303 client.assertStatus(READWRITE);
305 auto testTimeLimit = std::chrono::seconds(5);
306 Timeout::callAndWait(testTimeLimit, Timeout::ExpectMode::FINISHED,
307 restartCynaraServiceAndSockets, getAgentRequest,
308 std::ref(agent), std::ref(agentRequest), std::ref(client),
309 CYNARA_API_SUCCESS, Timeout::ExpectMode::TIMEOUT);
310 agentRequest.assertAction(data.m_client, data.m_user, data.m_privilege);
311 agent.putResponse(AgentResponse::createCancel(id));
313 // we do not expect getting the cancel request in the agent
314 Timeout::callAndWait(testTimeLimit, Timeout::ExpectMode::TIMEOUT,
315 restartCynaraServiceAndSockets, getAgentRequest,
316 std::ref(agent), std::ref(agentRequest), std::ref(client),
317 CYNARA_API_SERVICE_NOT_AVAILABLE, Timeout::ExpectMode::TIMEOUT);
318 client.process(CYNARA_API_SUCCESS, Client::TimeoutExpectation::EXPECT_NO_TIMEOUT, 2);
321 RUN_CYNARA_TEST(tcag12_create_two_requests_func)
323 std::string testNo("12");
324 CheckData data1(testNo, 1), data2(testNo, 2);
325 cynara_check_id id1, id2;
326 RequestEntity callbackData1 = {RequestFunction(),
327 CYNARA_API_ACCESS_DENIED,
328 CYNARA_CALL_CAUSE_ANSWER};
329 RequestEntity callbackData2 = {RequestFunction(),
330 CYNARA_API_ACCESS_ALLOWED,
331 CYNARA_CALL_CAUSE_CANCEL};
337 AgentRequest agentRequest1, agentRequest2, agentRequest3;
339 client.createRequest(data1, id1, callbackData1);
340 client.assertStatus(READWRITE);
341 client.createRequest(data2, id2, callbackData2);
342 client.assertStatus(READWRITE);
344 auto testTimeLimit = std::chrono::seconds(5);
345 Timeout::callAndWait(testTimeLimit, Timeout::ExpectMode::FINISHED,
346 restartCynaraServiceAndSockets, getAgentRequest,
347 std::ref(agent), std::ref(agentRequest1), std::ref(client),
348 CYNARA_API_SUCCESS, Timeout::ExpectMode::TIMEOUT);
349 Timeout::callAndWait(testTimeLimit, Timeout::ExpectMode::FINISHED,
350 restartCynaraServiceAndSockets, getAgentRequest,
351 std::ref(agent), std::ref(agentRequest2), std::ref(client),
352 CYNARA_API_SUCCESS, Timeout::ExpectMode::IGNORE);
354 client.assertStatus(READWRITE);
355 Timeout::callAndWait(testTimeLimit, Timeout::ExpectMode::FINISHED,
356 restartCynaraServiceAndSockets, getAgentRequest,
357 std::ref(agent), std::ref(agentRequest3), std::ref(client),
358 CYNARA_API_SUCCESS, Timeout::ExpectMode::TIMEOUT);
359 agentRequest1.assertAction(data1.m_client, data1.m_user, data1.m_privilege);
360 agentRequest2.assertAction(data2.m_client, data2.m_user, data2.m_privilege);
361 agentRequest3.assertCancel();
363 agent.putResponse(AgentResponse::createDeny(id1));
364 agent.putResponse(AgentResponse::createCancel(id2));
366 client.process(CYNARA_API_SUCCESS, Client::TimeoutExpectation::EXPECT_NO_TIMEOUT, 3);
367 client.process(CYNARA_API_SUCCESS, Client::TimeoutExpectation::IGNORE_TIMEOUT, 1);
370 RUN_CYNARA_TEST(tcag13_create_many_requests_func)
372 const int numberOfRequests = 4;
373 std::string testNo("13");
374 cynara_check_id ids[numberOfRequests];
375 RequestEntity callbackData = {RequestFunction(),
376 CYNARA_API_ACCESS_DENIED,
377 CYNARA_CALL_CAUSE_ANSWER};
382 AgentRequest agentRequests[numberOfRequests];
384 for (int i = 0; i < numberOfRequests; i++) {
385 CheckData data(testNo, i);
386 client.createRequest(data, ids[i], callbackData);
387 client.assertStatus(READWRITE);
388 auto testTimeLimit = std::chrono::seconds(5);
389 Timeout::callAndWait(testTimeLimit, Timeout::ExpectMode::FINISHED,
390 restartCynaraServiceAndSockets, getAgentRequest,
391 std::ref(agent), std::ref(agentRequests[i]), std::ref(client),
392 CYNARA_API_SUCCESS, Timeout::ExpectMode::TIMEOUT);
393 agentRequests[i].assertAction(data.m_client, data.m_user, data.m_privilege);
395 for (int i = numberOfRequests - 1; i >= 0; i--) {
396 agent.putResponse(AgentResponse::createDeny(ids[i]));
397 client.process(CYNARA_API_SUCCESS, Client::TimeoutExpectation::EXPECT_NO_TIMEOUT, 2);
401 RUN_CYNARA_TEST(tcag14_client_disconnects_func)
403 std::string testNo("14");
404 CheckData data(testNo);
406 RequestEntity callbackData = {RequestFunction(),
407 CYNARA_API_ACCESS_ALLOWED,
408 CYNARA_CALL_CAUSE_FINISH};
413 AgentRequest agentRequest;
414 auto testTimeLimit = std::chrono::seconds(5);
417 client.createRequest(data, id, callbackData);
418 client.assertStatus(READWRITE);
419 Timeout::callAndWait(testTimeLimit, Timeout::ExpectMode::FINISHED,
420 restartCynaraServiceAndSockets, getAgentRequest,
421 std::ref(agent), std::ref(agentRequest), std::ref(client),
422 CYNARA_API_SUCCESS, Timeout::ExpectMode::TIMEOUT);
424 auto getAgentRequestWrap = [&agent, &agentRequest]() {
425 agent.getRequest(agentRequest, CYNARA_API_SUCCESS);
427 Timeout::callAndWait(testTimeLimit, Timeout::ExpectMode::FINISHED,
428 restartCynaraServiceAndSockets, getAgentRequestWrap);
429 agentRequest.assertCancel();
432 RUN_CYNARA_TEST(tcag15_agent_disconnects_func)
434 std::string testNo("15");
435 CheckData data(testNo);
437 RequestEntity callbackData = {RequestFunction(),
438 CYNARA_API_ACCESS_DENIED,
439 CYNARA_CALL_CAUSE_ANSWER};
444 client.createRequest(data, id, callbackData);
445 client.assertStatus(READWRITE);
446 AgentRequest agentRequest;
449 auto testTimeLimit = std::chrono::seconds(5);
450 Timeout::callAndWait(testTimeLimit, Timeout::ExpectMode::FINISHED,
451 restartCynaraServiceAndSockets, getAgentRequest,
452 std::ref(agent), std::ref(agentRequest), std::ref(client),
453 CYNARA_API_SUCCESS, Timeout::ExpectMode::TIMEOUT);
455 client.process(CYNARA_API_SUCCESS, Client::TimeoutExpectation::EXPECT_NO_TIMEOUT, 2);