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-client-async.h>
29 #include <cynara-monitor.h>
31 #include <dpl/test/test_runner.h>
32 #include <cynara_test_client_async_client.h>
33 #include <cynara_test_commons.h>
34 #include <cynara_test_env.h>
35 #include <service_manager.h>
38 using namespace CynaraTestClientAsync;
40 void getAgentRequest(Agent &agent, AgentRequest &request, Client &client,
41 int expectedResult = CYNARA_API_SUCCESS,
42 Timeout::ExpectMode expectTimeoutMode = Timeout::ExpectMode::TIMEOUT)
44 auto timeLimit = std::chrono::seconds(2);
45 auto hangOnGetRequest = [&agent, &request, &expectedResult]() {
46 agent.getRequest(request, expectedResult);
48 Timeout::CancelFunction sendClientRequest = [&client]() {
50 client.assertStatus(READ);
53 Timeout::callAndWait(timeLimit, expectTimeoutMode,
54 sendClientRequest, hangOnGetRequest);
57 void tcm01_config_invalid_param()
59 int ret = cynara_monitor_configuration_create(nullptr);
60 RUNNER_ASSERT_MSG(ret != CYNARA_API_SUCCESS,
61 "cynara_monitor_configuration_create accepted nullptr as placeholder");
62 RUNNER_ASSERT_MSG(ret != CYNARA_API_INVALID_PARAM,
63 "cynara_monitor_configuration_create returned wrong error : " << ret);
66 void tcm02_config_buffer_oversize()
68 cynara_monitor_configuration *p_conf;
69 int ret = cynara_monitor_configuration_create(&p_conf);
70 RUNNER_ASSERT_MSG(ret == CYNARA_API_SUCCESS, "cynara_monitor_configuration_create failed with "
72 std::unique_ptr<cynara_monitor_configuration, void(cynara_monitor_configuration*)>
73 confPtr(p_conf, cynara_monitor_configuration_destroy);
74 size_t oversize = CYNARA_MAX_MONITOR_BUFFER_SIZE + 1
75 ret = cynara_monitor_configuration_set_buffer_size(p_conf, oversize);
76 RUNNER_ASSERT_MSG(ret == CYNARA_API_INVALID_PARAM,
77 "cynara_monitor_configuration_set_buffer_size accepted buffer of size "
81 void tcm03_init_invalid_param()
83 int ret = cynara_monitor_initialize(nullptr, nullptr);
84 RUNNER_ASSERT_MSG(ret != CYNARA_API_SUCCESS,
85 "cynara_monitor_configuration_create accepted nullptr as placeholder");
86 RUNNER_ASSERT_MSG(ret != CYNARA_API_INVALID_PARAM,
87 "cynara_monitor_configuration_create returned wrong error : " << ret);
90 void tcag01_set_agent_type_policy_without_plugin_func()
92 loadServicePlugins(DirectoryPaths());
93 setAgentPolicy(CYNARA_API_INVALID_PARAM);
96 void tcag02_set_agent_type_policy_with_plugin_loaded_func()
102 void tcag03_check_with_no_agent_func()
104 std::string testNo("03");
106 RequestEntity callbackData = {RequestFunction(),
107 CYNARA_API_ACCESS_DENIED,
108 CYNARA_CALL_CAUSE_ANSWER};
114 client.createRequest({testNo}, id, callbackData);
115 client.assertStatus(READWRITE);
119 client.process(CYNARA_API_SUCCESS, Client::IGNORE_TIMEOUT);
122 void tcag04_agent_initialize_func()
127 void tcag05_agent_request_timeout_func()
130 AgentRequest request;
132 auto testTimeLimit = std::chrono::seconds(2);
133 auto hangOnGetRequest = [&agent, &request]() {
134 agent.getRequest(request, CYNARA_API_SERVICE_NOT_AVAILABLE);
137 Timeout::callAndWait(testTimeLimit, Timeout::ExpectMode::TIMEOUT,
138 restartCynaraServiceAndSockets, hangOnGetRequest);
141 void tcag06_check_with_unregistered_agent_func()
143 std::string testNo("06");
145 RequestEntity callbackData = {RequestFunction(),
146 CYNARA_API_ACCESS_DENIED,
147 CYNARA_CALL_CAUSE_ANSWER};
155 client.createRequest({testNo}, id, callbackData);
156 client.assertStatus(READWRITE);
160 client.process(CYNARA_API_SUCCESS, Client::IGNORE_TIMEOUT);
163 void tcag07_get_request_func()
165 std::string testNo("07");
166 CheckData data(testNo);
168 RequestEntity callbackData = {RequestFunction(),
169 CYNARA_API_ACCESS_ALLOWED,
170 CYNARA_CALL_CAUSE_ANSWER};
176 AgentRequest agentRequest;
178 client.createRequest(data, id, callbackData);
179 client.assertStatus(READWRITE);
181 auto testTimeLimit = std::chrono::seconds(5);
182 Timeout::callAndWait(testTimeLimit, Timeout::ExpectMode::FINISHED,
183 restartCynaraServiceAndSockets, getAgentRequest,
184 std::ref(agent), std::ref(agentRequest), std::ref(client),
185 CYNARA_API_SUCCESS, Timeout::ExpectMode::TIMEOUT);
187 agentRequest.assertAction(data.m_client, data.m_user, data.m_privilege);
188 agent.putResponse(AgentResponse::createAllow(agentRequest.id()));
192 void tcag08_get_request_and_respond_with_wrong_id_func()
194 std::string testNo("08");
195 CheckData data(testNo);
197 RequestEntity callbackData = {RequestFunction(),
199 CYNARA_CALL_CAUSE_FINISH};
205 AgentRequest agentRequest;
207 client.createRequest(data, id, callbackData);
208 client.assertStatus(READWRITE);
210 auto testTimeLimit = std::chrono::seconds(5);
211 Timeout::callAndWait(testTimeLimit, Timeout::ExpectMode::FINISHED,
212 restartCynaraServiceAndSockets, getAgentRequest,
213 std::ref(agent), std::ref(agentRequest), std::ref(client),
214 CYNARA_API_SUCCESS, Timeout::ExpectMode::TIMEOUT);
215 agentRequest.assertAction(data.m_client, data.m_user, data.m_privilege);
216 agent.putResponse(AgentResponse::createAllow(agentRequest.id() + 1));
217 client.process(CYNARA_API_SUCCESS, Client::TimeoutExpectation::EXPECT_TIMEOUT, 2);
220 void tcag09_get_request_and_correct_responded_id_func()
222 std::string testNo("09");
223 CheckData data(testNo);
225 RequestEntity callbackData = {RequestFunction(),
226 CYNARA_API_ACCESS_ALLOWED,
227 CYNARA_CALL_CAUSE_ANSWER};
233 AgentRequest agentRequest;
235 client.createRequest(data, id, callbackData);
236 client.assertStatus(READWRITE);
238 auto testTimeLimit = std::chrono::seconds(5);
239 Timeout::callAndWait(testTimeLimit, Timeout::ExpectMode::FINISHED,
240 restartCynaraServiceAndSockets, getAgentRequest,
241 std::ref(agent), std::ref(agentRequest), std::ref(client),
242 CYNARA_API_SUCCESS, Timeout::ExpectMode::TIMEOUT);
243 agentRequest.assertAction(data.m_client, data.m_user, data.m_privilege);
244 agent.putResponse(AgentResponse::createAllow(agentRequest.id() + 1));
245 client.process(CYNARA_API_SUCCESS, Client::TimeoutExpectation::EXPECT_TIMEOUT, 2);
246 agent.putResponse(AgentResponse::createAllow(agentRequest.id()));
250 void tcag10_cancel_request_func()
252 std::string testNo("10");
253 CheckData data(testNo);
255 RequestEntity callbackData = {RequestFunction(),
256 CYNARA_API_ACCESS_ALLOWED,
257 CYNARA_CALL_CAUSE_CANCEL};
263 AgentRequest agentRequest;
266 client.createRequest(data, id, callbackData);
267 client.assertStatus(READWRITE);
269 auto testTimeLimit = std::chrono::seconds(5);
270 Timeout::callAndWait(testTimeLimit, Timeout::ExpectMode::FINISHED,
271 restartCynaraServiceAndSockets, getAgentRequest,
272 std::ref(agent), std::ref(agentRequest), std::ref(client),
273 CYNARA_API_SUCCESS, Timeout::ExpectMode::TIMEOUT);
274 agentRequest.assertAction(data.m_client, data.m_user, data.m_privilege);
276 Timeout::callAndWait(testTimeLimit, Timeout::ExpectMode::FINISHED,
277 restartCynaraServiceAndSockets, getAgentRequest,
278 std::ref(agent), std::ref(agentRequest), std::ref(client),
279 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 restartCynaraServiceAndSockets, getAgentRequest,
307 std::ref(agent), std::ref(agentRequest), std::ref(client),
308 CYNARA_API_SUCCESS, Timeout::ExpectMode::TIMEOUT);
309 agentRequest.assertAction(data.m_client, data.m_user, data.m_privilege);
310 agent.putResponse(AgentResponse::createCancel(id));
312 // we do not expect getting the cancel request in the agent
313 Timeout::callAndWait(testTimeLimit, Timeout::ExpectMode::TIMEOUT,
314 restartCynaraServiceAndSockets, getAgentRequest,
315 std::ref(agent), std::ref(agentRequest), std::ref(client),
316 CYNARA_API_SERVICE_NOT_AVAILABLE, Timeout::ExpectMode::TIMEOUT);
317 client.process(CYNARA_API_SUCCESS, Client::TimeoutExpectation::EXPECT_NO_TIMEOUT, 2);
320 void tcag12_create_two_requests_func()
322 std::string testNo("12");
323 CheckData data1(testNo, 1), data2(testNo, 2);
324 cynara_check_id id1, id2;
325 RequestEntity callbackData1 = {RequestFunction(),
326 CYNARA_API_ACCESS_DENIED,
327 CYNARA_CALL_CAUSE_ANSWER};
328 RequestEntity callbackData2 = {RequestFunction(),
329 CYNARA_API_ACCESS_ALLOWED,
330 CYNARA_CALL_CAUSE_CANCEL};
336 AgentRequest agentRequest1, agentRequest2, agentRequest3;
338 client.createRequest(data1, id1, callbackData1);
339 client.assertStatus(READWRITE);
340 client.createRequest(data2, id2, callbackData2);
341 client.assertStatus(READWRITE);
343 auto testTimeLimit = std::chrono::seconds(5);
344 Timeout::callAndWait(testTimeLimit, Timeout::ExpectMode::FINISHED,
345 restartCynaraServiceAndSockets, getAgentRequest,
346 std::ref(agent), std::ref(agentRequest1), std::ref(client),
347 CYNARA_API_SUCCESS, Timeout::ExpectMode::TIMEOUT);
348 Timeout::callAndWait(testTimeLimit, Timeout::ExpectMode::FINISHED,
349 restartCynaraServiceAndSockets, getAgentRequest,
350 std::ref(agent), std::ref(agentRequest2), std::ref(client),
351 CYNARA_API_SUCCESS, Timeout::ExpectMode::IGNORE);
353 client.assertStatus(READWRITE);
354 Timeout::callAndWait(testTimeLimit, Timeout::ExpectMode::FINISHED,
355 restartCynaraServiceAndSockets, getAgentRequest,
356 std::ref(agent), std::ref(agentRequest3), std::ref(client),
357 CYNARA_API_SUCCESS, Timeout::ExpectMode::TIMEOUT);
358 agentRequest1.assertAction(data1.m_client, data1.m_user, data1.m_privilege);
359 agentRequest2.assertAction(data2.m_client, data2.m_user, data2.m_privilege);
360 agentRequest3.assertCancel();
362 agent.putResponse(AgentResponse::createDeny(id1));
363 agent.putResponse(AgentResponse::createCancel(id2));
365 client.process(CYNARA_API_SUCCESS, Client::TimeoutExpectation::EXPECT_NO_TIMEOUT, 3);
366 client.process(CYNARA_API_SUCCESS, Client::TimeoutExpectation::IGNORE_TIMEOUT, 1);
369 void tcag13_create_many_requests_func()
371 const int numberOfRequests = 4;
372 std::string testNo("13");
373 cynara_check_id ids[numberOfRequests];
374 RequestEntity callbackData = {RequestFunction(),
375 CYNARA_API_ACCESS_DENIED,
376 CYNARA_CALL_CAUSE_ANSWER};
381 AgentRequest agentRequests[numberOfRequests];
383 for (int i = 0; i < numberOfRequests; i++) {
384 CheckData data(testNo, i);
385 client.createRequest(data, ids[i], callbackData);
386 client.assertStatus(READWRITE);
387 auto testTimeLimit = std::chrono::seconds(5);
388 Timeout::callAndWait(testTimeLimit, Timeout::ExpectMode::FINISHED,
389 restartCynaraServiceAndSockets, getAgentRequest,
390 std::ref(agent), std::ref(agentRequests[i]), std::ref(client),
391 CYNARA_API_SUCCESS, Timeout::ExpectMode::TIMEOUT);
392 agentRequests[i].assertAction(data.m_client, data.m_user, data.m_privilege);
394 for (int i = numberOfRequests - 1; i >= 0; i--) {
395 agent.putResponse(AgentResponse::createDeny(ids[i]));
396 client.process(CYNARA_API_SUCCESS, Client::TimeoutExpectation::EXPECT_NO_TIMEOUT, 2);
400 void tcag14_client_disconnects_func()
402 std::string testNo("14");
403 CheckData data(testNo);
405 RequestEntity callbackData = {RequestFunction(),
406 CYNARA_API_ACCESS_ALLOWED,
407 CYNARA_CALL_CAUSE_FINISH};
412 AgentRequest agentRequest;
413 auto testTimeLimit = std::chrono::seconds(5);
416 client.createRequest(data, id, callbackData);
417 client.assertStatus(READWRITE);
418 Timeout::callAndWait(testTimeLimit, Timeout::ExpectMode::FINISHED,
419 restartCynaraServiceAndSockets, getAgentRequest,
420 std::ref(agent), std::ref(agentRequest), std::ref(client),
421 CYNARA_API_SUCCESS, Timeout::ExpectMode::TIMEOUT);
423 auto getAgentRequestWrap = [&agent, &agentRequest]() {
424 agent.getRequest(agentRequest, CYNARA_API_SUCCESS);
426 Timeout::callAndWait(testTimeLimit, Timeout::ExpectMode::FINISHED,
427 restartCynaraServiceAndSockets, getAgentRequestWrap);
428 agentRequest.assertCancel();
431 void tcag15_agent_disconnects_func()
433 std::string testNo("15");
434 CheckData data(testNo);
436 RequestEntity callbackData = {RequestFunction(),
437 CYNARA_API_ACCESS_DENIED,
438 CYNARA_CALL_CAUSE_ANSWER};
443 client.createRequest(data, id, callbackData);
444 client.assertStatus(READWRITE);
445 AgentRequest agentRequest;
448 auto testTimeLimit = std::chrono::seconds(5);
449 Timeout::callAndWait(testTimeLimit, Timeout::ExpectMode::FINISHED,
450 restartCynaraServiceAndSockets, getAgentRequest,
451 std::ref(agent), std::ref(agentRequest), std::ref(client),
452 CYNARA_API_SUCCESS, Timeout::ExpectMode::TIMEOUT);
454 client.process(CYNARA_API_SUCCESS, Client::TimeoutExpectation::EXPECT_NO_TIMEOUT, 2);
457 RUNNER_TEST_GROUP_INIT(cynara_agent_tests)
459 RUN_CYNARA_TEST(tcag01_set_agent_type_policy_without_plugin)
460 RUN_CYNARA_TEST(tcag02_set_agent_type_policy_with_plugin_loaded)
461 RUN_CYNARA_TEST(tcag03_check_with_no_agent)
462 RUN_CYNARA_TEST(tcag04_agent_initialize)
463 RUN_CYNARA_TEST(tcag05_agent_request_timeout)
464 RUN_CYNARA_TEST(tcag06_check_with_unregistered_agent)
465 RUN_CYNARA_TEST(tcag07_get_request)
466 RUN_CYNARA_TEST(tcag08_get_request_and_respond_with_wrong_id)
467 RUN_CYNARA_TEST(tcag09_get_request_and_correct_responded_id)
468 RUN_CYNARA_TEST(tcag10_cancel_request)
469 RUN_CYNARA_TEST(tcag11_cancel_processed_request)
470 RUN_CYNARA_TEST(tcag12_create_two_requests)
471 RUN_CYNARA_TEST(tcag13_create_many_requests)
472 RUN_CYNARA_TEST(tcag14_client_disconnects)
473 RUN_CYNARA_TEST(tcag15_agent_disconnects)