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 RUNNER_TEST_GROUP_INIT(cynara_async_tests)
41 RUN_CYNARA_TEST(tca01_initialize)
46 RUN_CYNARA_TEST(tca02_empty_cache_miss)
48 std::string testNo("02");
51 client.checkCache({testNo}, CYNARA_API_CACHE_MISS);
52 client.checkCache({testNo}, CYNARA_API_CACHE_MISS);
55 RUN_CYNARA_TEST(tca03_create_max_requests)
57 std::string testNo("03");
59 RequestEntity callbackData = {RequestFunction(), 0, CYNARA_CALL_CAUSE_FINISH};
63 for (auto i = 0; i <= UINT16_MAX; ++i) {
64 client.createRequest({testNo, i}, id, callbackData, CYNARA_API_SUCCESS);
65 client.assertStatus(READWRITE);
68 client.createRequest({testNo}, id, callbackData, CYNARA_API_MAX_PENDING_REQUESTS);
69 client.assertStatus(READWRITE);
72 RUN_CYNARA_TEST(tca04_request_and_process)
74 std::string testNo("04");
76 RequestEntity callbackData = {RequestFunction(),
77 CYNARA_API_ACCESS_DENIED,
78 CYNARA_CALL_CAUSE_ANSWER};
82 client.createRequest({testNo}, id, callbackData);
83 client.assertStatus(READWRITE);
87 client.assertStatus(READ);
90 client.process(CYNARA_API_SUCCESS, Client::IGNORE_TIMEOUT);
93 RUN_CYNARA_TEST(tca05_request_and_cancel1)
95 std::string testNo("05");
98 RequestEntity callbackData = {RequestFunction(),
99 CYNARA_API_ACCESS_DENIED,
100 CYNARA_CALL_CAUSE_CANCEL};
104 client.createRequest({testNo, subtest}, id, callbackData);
105 client.assertStatus(READWRITE);
108 client.assertStatus(READWRITE);
110 //send request and cancel
112 client.assertStatus(READ);
115 client.process(CYNARA_API_SUCCESS, Client::IGNORE_TIMEOUT);
118 RUN_CYNARA_TEST(tca05_request_and_cancel2)
120 std::string testNo("05");
122 cynara_check_id id1, id2;
125 RequestEntity callbackData1 = {[&]()->void {client.cancel(id2);},
126 CYNARA_API_ACCESS_DENIED,
127 CYNARA_CALL_CAUSE_ANSWER};
128 RequestEntity callbackData2 = {RequestFunction(),
129 CYNARA_API_ACCESS_DENIED,
130 CYNARA_CALL_CAUSE_CANCEL};
132 client.createRequest({testNo, subtest}, id1, callbackData1);
133 client.createRequest({testNo, subtest}, id2, callbackData2);
134 client.assertStatus(READWRITE);
138 client.process(CYNARA_API_SUCCESS, Client::IGNORE_TIMEOUT);
139 client.process(CYNARA_API_SUCCESS, Client::IGNORE_TIMEOUT);
142 RUN_CYNARA_TEST(tca05_request_and_cancel3)
144 std::string testNo("05");
147 RequestEntity callbackData = {RequestFunction(),
148 CYNARA_API_ACCESS_DENIED,
149 CYNARA_CALL_CAUSE_ANSWER};
153 client.createRequest({testNo, subtest}, id, callbackData);
154 client.assertStatus(READWRITE);
158 client.assertStatus(READ);
161 client.process(CYNARA_API_SUCCESS, Client::IGNORE_TIMEOUT);
162 client.assertStatus(READ);
164 client.cancel(id, CYNARA_API_INVALID_PARAM);
167 RUN_CYNARA_TEST(tca06_cancel_fail)
169 cynara_check_id id = 0xDEAD;
173 client.cancel(id, CYNARA_API_INVALID_PARAM);
176 RUN_CYNARA_TEST(tca07_request_with_data_insertion)
178 std::string testNo("07");
180 const char *bucket = CYNARA_ADMIN_DEFAULT_BUCKET;
181 const int resultAllow = CYNARA_ADMIN_ALLOW;
182 CheckData data[2] = {{testNo, 1}, {testNo, 2}};
183 RequestEntity callbackAllow = {RequestFunction(),
184 CYNARA_API_ACCESS_ALLOWED,
185 CYNARA_CALL_CAUSE_ANSWER};
186 RequestEntity callbackDeny = {RequestFunction(),
187 CYNARA_API_ACCESS_DENIED,
188 CYNARA_CALL_CAUSE_ANSWER};
192 client.checkCache(data[0], CYNARA_API_CACHE_MISS);
193 client.checkCache(data[1], CYNARA_API_CACHE_MISS);
195 client.createRequest(data[0], id, callbackDeny);
196 client.assertStatus(READWRITE);
198 client.assertStatus(READ);
199 client.process(CYNARA_API_SUCCESS, Client::IGNORE_TIMEOUT);
200 client.assertStatus(READ);
202 client.checkCache(data[0], CYNARA_API_ACCESS_DENIED);
203 client.checkCache(data[1], CYNARA_API_CACHE_MISS);
206 CynaraPoliciesContainer cp;
207 cp.add(bucket, data[0].toAdminPolicy(), resultAllow);
208 admin.setPolicies(cp);
211 client.checkCache(data[0], CYNARA_API_CACHE_MISS);
212 client.checkCache(data[1], CYNARA_API_CACHE_MISS);
214 client.createRequest(data[0], id, callbackAllow);
215 client.assertStatus(READWRITE);
217 client.assertStatus(READ);
218 client.process(CYNARA_API_SUCCESS, Client::IGNORE_TIMEOUT);
219 client.assertStatus(READ);
221 client.checkCache(data[0], CYNARA_API_ACCESS_ALLOWED);
222 client.checkCache(data[1], CYNARA_API_CACHE_MISS);
225 RUN_CYNARA_TEST(tca08_disconnect1)
227 std::string testNo("08");
230 RequestEntity callbackData = {RequestFunction(),
231 CYNARA_API_ACCESS_DENIED,
232 CYNARA_CALL_CAUSE_ANSWER};
235 client.createRequest({testNo, subtest}, id, callbackData);
236 client.assertStatus(READWRITE);
238 restartCynaraServiceAndSockets();
241 client.assertStatus(READ);
242 client.process(CYNARA_API_SUCCESS, Client::IGNORE_TIMEOUT);
245 RUN_CYNARA_TEST(tca08_disconnect2)
247 std::string testNo("08");
250 RequestEntity callbackData = {RequestFunction(),
251 CYNARA_API_ACCESS_DENIED,
252 CYNARA_CALL_CAUSE_ANSWER};
255 client.createRequest({testNo, subtest}, id, callbackData);
256 client.assertStatus(READWRITE);
258 restartCynaraServiceAndSockets();
261 client.assertStatus(READ);
263 restartCynaraServiceAndSockets();
266 client.process(CYNARA_API_SUCCESS, Client::IGNORE_TIMEOUT);
269 RUN_CYNARA_TEST(tca08_disconnect3)
271 std::string testNo("08");
274 RequestEntity callbackData = {restartCynaraServiceAndSockets,
275 CYNARA_API_ACCESS_DENIED,
276 CYNARA_CALL_CAUSE_ANSWER};
279 client.createRequest({testNo, subtest}, id, callbackData);
280 client.assertStatus(READWRITE);
283 client.assertStatus(READ);
285 client.process(CYNARA_API_SUCCESS, Client::IGNORE_TIMEOUT);
286 client.process(CYNARA_API_SUCCESS, Client::IGNORE_TIMEOUT);
289 RUN_CYNARA_TEST(tca09_disconnect_and_cancel1)
291 std::string testNo("09");
294 RequestEntity callbackData = {RequestFunction(),
295 CYNARA_API_ACCESS_DENIED,
296 CYNARA_CALL_CAUSE_CANCEL};
300 client.createRequest({testNo, subtest}, id, callbackData);
301 client.assertStatus(READWRITE);
305 client.assertStatus(READ);
307 restartCynaraServiceAndSockets();
310 client.assertStatus(READWRITE);
314 client.assertStatus(READ);
317 client.process(CYNARA_API_SUCCESS, Client::IGNORE_TIMEOUT);
318 client.assertStatus(READ);
321 RUN_CYNARA_TEST(tca09_disconnect_and_cancel2)
323 std::string testNo("09");
326 RequestEntity callbackData = {RequestFunction(),
327 CYNARA_API_ACCESS_DENIED,
328 CYNARA_CALL_CAUSE_CANCEL};
332 client.createRequest({testNo, subtest}, id, callbackData);
333 client.assertStatus(READWRITE);
337 client.assertStatus(READ);
340 client.assertStatus(READWRITE);
342 restartCynaraServiceAndSockets();
346 client.assertStatus(READ);
349 client.process(CYNARA_API_SUCCESS, Client::EXPECT_TIMEOUT);
350 client.assertStatus(READ);
353 RUN_CYNARA_TEST(tca10_double_request)
355 std::string testNo("10");
356 cynara_check_id id, id2;
359 RequestEntity callbackData2 = {RequestFunction(),
360 CYNARA_API_ACCESS_DENIED,
361 CYNARA_CALL_CAUSE_ANSWER};
363 RequestEntity callbackData = {[&](){client.createRequest({testNo}, id2, callbackData2);},
364 CYNARA_API_ACCESS_DENIED,
365 CYNARA_CALL_CAUSE_ANSWER};
368 client.createRequest({testNo}, id, callbackData);
369 client.assertStatus(READWRITE);
373 client.process(CYNARA_API_SUCCESS, Client::IGNORE_TIMEOUT);
374 client.process(CYNARA_API_SUCCESS, Client::IGNORE_TIMEOUT);
377 RUN_CYNARA_TEST(tca11_double_request_with_restart)
379 std::string testNo("11");
380 cynara_check_id id, id2;
383 RequestEntity callbackData2 = {RequestFunction(),
384 CYNARA_API_ACCESS_DENIED,
385 CYNARA_CALL_CAUSE_ANSWER};
387 RequestEntity callbackData = {[&](){
388 restartCynaraServiceAndSockets();
389 client.createRequest({testNo}, id2, callbackData2);
391 CYNARA_API_ACCESS_DENIED,
392 CYNARA_CALL_CAUSE_ANSWER};
395 client.createRequest({testNo}, id, callbackData);
396 client.assertStatus(READWRITE);
400 client.process(CYNARA_API_SUCCESS, Client::IGNORE_TIMEOUT);
401 client.process(CYNARA_API_SUCCESS, Client::IGNORE_TIMEOUT);
404 RUN_CYNARA_TEST(tca12_multiple_connections_without_requests)
406 std::string testNo("12");
409 RequestEntity callbackData = {RequestFunction(),
410 CYNARA_API_ACCESS_DENIED,
411 CYNARA_CALL_CAUSE_FINISH};
413 ServiceManager serviceManager(CynaraTestConsts::SERVICE);
414 pid_t before = serviceManager.getServicePid();
415 timeval beforeTimestamp = serviceManager.getServiceStartTimestamp();
417 for (int i = 0; i < 10; ++i)
420 client.createRequest({testNo}, id, callbackData);
421 client.assertStatus(READWRITE);
424 //wait until cynara possibly restarts
427 pid_t after = serviceManager.getServicePid();
428 timeval afterTimestamp = serviceManager.getServiceStartTimestamp();
429 RUNNER_ASSERT_MSG(after != 0,
430 "cynara service not running. After = " << after << ".");
431 RUNNER_ASSERT_MSG(before == after
432 && beforeTimestamp.tv_sec == afterTimestamp.tv_sec
433 && beforeTimestamp.tv_usec == afterTimestamp.tv_usec,
434 "cynara service was restarted during the test. Before pid / timestamp = "
435 << before << " / " << beforeTimestamp.tv_sec << "."
436 << beforeTimestamp.tv_usec << " and after pid / timestamp = "
437 << after << " / " << afterTimestamp.tv_sec << "."
438 << afterTimestamp.tv_usec);