2 * Copyright (c) 2014 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_async.cpp
19 * @author Lukasz Wojciechowski <l.wojciechow@partner.samsung.com>
21 * @brief Tests for libcynara-client-async
24 #include <cynara_test_admin.h>
25 #include <cynara_test_commons.h>
26 #include <cynara_test_client_async_client.h>
28 #include <service_manager.h>
29 #include <dpl/test/test_runner.h>
31 #include <cynara-client-async.h>
36 using namespace CynaraTestClientAsync;
37 using namespace CynaraTestAdmin;
39 void tca01_initialize_func()
44 void tca02_empty_cache_miss_func()
46 std::string testNo("02");
49 client.checkCache({testNo}, CYNARA_API_CACHE_MISS);
50 client.checkCache({testNo}, CYNARA_API_CACHE_MISS);
53 void tca03_create_max_requests_func()
55 std::string testNo("03");
57 RequestEntity callbackData = {RequestFunction(), 0, CYNARA_CALL_CAUSE_FINISH};
61 for (auto i = 0; i <= UINT16_MAX; ++i) {
62 client.createRequest({testNo, i}, id, callbackData, CYNARA_API_SUCCESS);
63 client.assertStatus(READWRITE);
66 client.createRequest({testNo}, id, callbackData, CYNARA_API_MAX_PENDING_REQUESTS);
67 client.assertStatus(READWRITE);
70 void tca04_request_and_process_func()
72 std::string testNo("04");
74 RequestEntity callbackData = {RequestFunction(),
75 CYNARA_API_ACCESS_DENIED,
76 CYNARA_CALL_CAUSE_ANSWER};
80 client.createRequest({testNo}, id, callbackData);
81 client.assertStatus(READWRITE);
85 client.assertStatus(READ);
88 client.process(CYNARA_API_SUCCESS, Client::IGNORE_TIMEOUT);
91 void tca05_request_and_cancel1_func()
93 std::string testNo("05");
96 RequestEntity callbackData = {RequestFunction(),
97 CYNARA_API_ACCESS_DENIED,
98 CYNARA_CALL_CAUSE_CANCEL};
102 client.createRequest({testNo, subtest}, id, callbackData);
103 client.assertStatus(READWRITE);
106 client.assertStatus(READWRITE);
108 //send request and cancel
110 client.assertStatus(READ);
113 client.process(CYNARA_API_SUCCESS, Client::IGNORE_TIMEOUT);
116 void tca05_request_and_cancel2_func()
118 std::string testNo("05");
120 cynara_check_id id1, id2;
123 RequestEntity callbackData1 = {[&]()->void {client.cancel(id2);},
124 CYNARA_API_ACCESS_DENIED,
125 CYNARA_CALL_CAUSE_ANSWER};
126 RequestEntity callbackData2 = {RequestFunction(),
127 CYNARA_API_ACCESS_DENIED,
128 CYNARA_CALL_CAUSE_CANCEL};
130 client.createRequest({testNo, subtest}, id1, callbackData1);
131 client.createRequest({testNo, subtest}, id2, callbackData2);
132 client.assertStatus(READWRITE);
136 client.process(CYNARA_API_SUCCESS, Client::IGNORE_TIMEOUT);
137 client.process(CYNARA_API_SUCCESS, Client::IGNORE_TIMEOUT);
140 void tca05_request_and_cancel3_func()
142 std::string testNo("05");
145 RequestEntity callbackData = {RequestFunction(),
146 CYNARA_API_ACCESS_DENIED,
147 CYNARA_CALL_CAUSE_ANSWER};
151 client.createRequest({testNo, subtest}, id, callbackData);
152 client.assertStatus(READWRITE);
156 client.assertStatus(READ);
159 client.process(CYNARA_API_SUCCESS, Client::IGNORE_TIMEOUT);
160 client.assertStatus(READ);
162 client.cancel(id, CYNARA_API_INVALID_PARAM);
165 void tca06_cancel_fail_func()
167 cynara_check_id id = 0xDEAD;
171 client.cancel(id, CYNARA_API_INVALID_PARAM);
174 void tca07_request_with_data_insertion_func()
176 std::string testNo("07");
178 const char *bucket = CYNARA_ADMIN_DEFAULT_BUCKET;
179 const int resultAllow = CYNARA_ADMIN_ALLOW;
180 CheckData data[2] = {{testNo, 1}, {testNo, 2}};
181 RequestEntity callbackAllow = {RequestFunction(),
182 CYNARA_API_ACCESS_ALLOWED,
183 CYNARA_CALL_CAUSE_ANSWER};
184 RequestEntity callbackDeny = {RequestFunction(),
185 CYNARA_API_ACCESS_DENIED,
186 CYNARA_CALL_CAUSE_ANSWER};
190 client.checkCache(data[0], CYNARA_API_CACHE_MISS);
191 client.checkCache(data[1], CYNARA_API_CACHE_MISS);
193 client.createRequest(data[0], id, callbackDeny);
194 client.assertStatus(READWRITE);
196 client.assertStatus(READ);
197 client.process(CYNARA_API_SUCCESS, Client::IGNORE_TIMEOUT);
198 client.assertStatus(READ);
200 client.checkCache(data[0], CYNARA_API_ACCESS_DENIED);
201 client.checkCache(data[1], CYNARA_API_CACHE_MISS);
204 CynaraPoliciesContainer cp;
205 cp.add(bucket, data[0].toAdminPolicy(), resultAllow);
206 admin.setPolicies(cp);
209 client.checkCache(data[0], CYNARA_API_CACHE_MISS);
210 client.checkCache(data[1], CYNARA_API_CACHE_MISS);
212 client.createRequest(data[0], id, callbackAllow);
213 client.assertStatus(READWRITE);
215 client.assertStatus(READ);
216 client.process(CYNARA_API_SUCCESS, Client::IGNORE_TIMEOUT);
217 client.assertStatus(READ);
219 client.checkCache(data[0], CYNARA_API_ACCESS_ALLOWED);
220 client.checkCache(data[1], CYNARA_API_CACHE_MISS);
223 void tca08_disconnect1_func()
225 std::string testNo("08");
228 RequestEntity callbackData = {RequestFunction(),
229 CYNARA_API_ACCESS_DENIED,
230 CYNARA_CALL_CAUSE_ANSWER};
233 client.createRequest({testNo, subtest}, id, callbackData);
234 client.assertStatus(READWRITE);
236 restartCynaraServiceAndSockets();
239 client.assertStatus(READ);
240 client.process(CYNARA_API_SUCCESS, Client::IGNORE_TIMEOUT);
243 void tca08_disconnect2_func()
245 std::string testNo("08");
248 RequestEntity callbackData = {RequestFunction(),
249 CYNARA_API_ACCESS_DENIED,
250 CYNARA_CALL_CAUSE_ANSWER};
253 client.createRequest({testNo, subtest}, id, callbackData);
254 client.assertStatus(READWRITE);
256 restartCynaraServiceAndSockets();
259 client.assertStatus(READ);
261 restartCynaraServiceAndSockets();
264 client.process(CYNARA_API_SUCCESS, Client::IGNORE_TIMEOUT);
267 void tca08_disconnect3_func()
269 std::string testNo("08");
272 RequestEntity callbackData = {restartCynaraServiceAndSockets,
273 CYNARA_API_ACCESS_DENIED,
274 CYNARA_CALL_CAUSE_ANSWER};
277 client.createRequest({testNo, subtest}, id, callbackData);
278 client.assertStatus(READWRITE);
281 client.assertStatus(READ);
283 client.process(CYNARA_API_SUCCESS, Client::IGNORE_TIMEOUT);
284 client.process(CYNARA_API_SUCCESS, Client::IGNORE_TIMEOUT);
287 void tca09_disconnect_and_cancel1_func()
289 std::string testNo("09");
292 RequestEntity callbackData = {RequestFunction(),
293 CYNARA_API_ACCESS_DENIED,
294 CYNARA_CALL_CAUSE_CANCEL};
298 client.createRequest({testNo, subtest}, id, callbackData);
299 client.assertStatus(READWRITE);
303 client.assertStatus(READ);
305 restartCynaraServiceAndSockets();
308 client.assertStatus(READWRITE);
312 client.assertStatus(READ);
315 client.process(CYNARA_API_SUCCESS, Client::IGNORE_TIMEOUT);
316 client.assertStatus(READ);
319 void tca09_disconnect_and_cancel2_func()
321 std::string testNo("09");
324 RequestEntity callbackData = {RequestFunction(),
325 CYNARA_API_ACCESS_DENIED,
326 CYNARA_CALL_CAUSE_CANCEL};
330 client.createRequest({testNo, subtest}, id, callbackData);
331 client.assertStatus(READWRITE);
335 client.assertStatus(READ);
338 client.assertStatus(READWRITE);
340 restartCynaraServiceAndSockets();
344 client.assertStatus(READ);
347 client.process(CYNARA_API_SUCCESS, Client::EXPECT_TIMEOUT);
348 client.assertStatus(READ);
351 void tca10_double_request_func()
353 std::string testNo("10");
354 cynara_check_id id, id2;
357 RequestEntity callbackData2 = {RequestFunction(),
358 CYNARA_API_ACCESS_DENIED,
359 CYNARA_CALL_CAUSE_ANSWER};
361 RequestEntity callbackData = {[&](){client.createRequest({testNo}, id2, callbackData2);},
362 CYNARA_API_ACCESS_DENIED,
363 CYNARA_CALL_CAUSE_ANSWER};
366 client.createRequest({testNo}, id, callbackData);
367 client.assertStatus(READWRITE);
371 client.process(CYNARA_API_SUCCESS, Client::IGNORE_TIMEOUT);
372 client.process(CYNARA_API_SUCCESS, Client::IGNORE_TIMEOUT);
375 void tca11_double_request_with_restart_func()
377 std::string testNo("11");
378 cynara_check_id id, id2;
381 RequestEntity callbackData2 = {RequestFunction(),
382 CYNARA_API_ACCESS_DENIED,
383 CYNARA_CALL_CAUSE_ANSWER};
385 RequestEntity callbackData = {[&](){
386 restartCynaraServiceAndSockets();
387 client.createRequest({testNo}, id2, callbackData2);
389 CYNARA_API_ACCESS_DENIED,
390 CYNARA_CALL_CAUSE_ANSWER};
393 client.createRequest({testNo}, id, callbackData);
394 client.assertStatus(READWRITE);
398 client.process(CYNARA_API_SUCCESS, Client::IGNORE_TIMEOUT);
399 client.process(CYNARA_API_SUCCESS, Client::IGNORE_TIMEOUT);
402 void tca12_multiple_connections_without_requests_func()
404 std::string testNo("12");
407 RequestEntity callbackData = {RequestFunction(),
408 CYNARA_API_ACCESS_DENIED,
409 CYNARA_CALL_CAUSE_FINISH};
411 ServiceManager serviceManager(CynaraTestConsts::SERVICE);
412 pid_t before = serviceManager.getServicePid();
413 timeval beforeTimestamp = serviceManager.getServiceStartTimestamp();
415 for (int i = 0; i < 10; ++i)
418 client.createRequest({testNo}, id, callbackData);
419 client.assertStatus(READWRITE);
422 //wait until cynara possibly restarts
425 pid_t after = serviceManager.getServicePid();
426 timeval afterTimestamp = serviceManager.getServiceStartTimestamp();
427 RUNNER_ASSERT_MSG(after != 0,
428 "cynara service not running. After = " << after << ".");
429 RUNNER_ASSERT_MSG(before == after
430 && beforeTimestamp.tv_sec == afterTimestamp.tv_sec
431 && beforeTimestamp.tv_usec == afterTimestamp.tv_usec,
432 "cynara service was restarted during the test. Before pid / timestamp = "
433 << before << " / " << beforeTimestamp.tv_sec << "."
434 << beforeTimestamp.tv_usec << " and after pid / timestamp = "
435 << after << " / " << afterTimestamp.tv_sec << "."
436 << afterTimestamp.tv_usec);
439 RUNNER_TEST_GROUP_INIT(cynara_async_tests)
441 RUN_CYNARA_TEST(tca01_initialize)
442 RUN_CYNARA_TEST(tca02_empty_cache_miss)
443 RUN_CYNARA_TEST(tca03_create_max_requests)
444 RUN_CYNARA_TEST(tca04_request_and_process)
445 RUN_CYNARA_TEST(tca05_request_and_cancel1)
446 RUN_CYNARA_TEST(tca05_request_and_cancel2)
447 RUN_CYNARA_TEST(tca05_request_and_cancel3)
448 RUN_CYNARA_TEST(tca06_cancel_fail)
449 RUN_CYNARA_TEST(tca07_request_with_data_insertion)
450 RUN_CYNARA_TEST(tca08_disconnect1)
451 RUN_CYNARA_TEST(tca08_disconnect2)
452 RUN_CYNARA_TEST(tca08_disconnect3)
453 RUN_CYNARA_TEST(tca09_disconnect_and_cancel1)
454 RUN_CYNARA_TEST(tca09_disconnect_and_cancel2)
455 RUN_CYNARA_TEST(tca10_double_request)
456 RUN_CYNARA_TEST(tca11_double_request_with_restart)
457 RUN_CYNARA_TEST(tca12_multiple_connections_without_requests)