2 * Copyright (c) 2016 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
17 * @file test-api-content-screening-async.cpp
18 * @author Kyungwook Tak (k.tak@samsung.com)
20 * @brief CSR Content screening async API test
22 #include <csr-content-screening.h>
24 #include <condition_variable>
28 #include <boost/test/unit_test.hpp>
30 #include "test-common.h"
31 #include "test-helper.h"
32 #include "test-resource.h"
34 #define ASSERT_CALLBACK(actual, scan, detect, complete, cancel, error) \
37 ASSERT_IF_MSG(actual.scannedCnt, scan, "scanned count mismatch."); \
39 ASSERT_IF_MSG(actual.detectedCnt, detect, "detected count mismatch."); \
41 ASSERT_IF_MSG(actual.completedCnt, complete, "completed count mismatch."); \
43 ASSERT_IF_MSG(actual.cancelledCnt, cancel, "cancelled count mismatch."); \
45 ASSERT_IF_MSG(actual.errorCnt, error, "error count mismatch."); \
51 struct AsyncTestContext {
54 std::condition_variable cv;
60 std::vector<std::string> scannedList;
61 std::vector<csr_cs_malware_h> detectedList;
65 AsyncTestContext(bool raceTest = false) :
71 apiReturned(!raceTest) {}
74 void on_scanned(const char *file, void *userdata)
76 auto ctx = reinterpret_cast<AsyncTestContext *>(userdata);
78 BOOST_REQUIRE_MESSAGE(ctx->apiReturned,
79 "API not returned yet but scanned callback called on file: " << file);
81 BOOST_MESSAGE("on_scanned. file[" << file << "] scanned!");
83 std::lock_guard<std::mutex> l(ctx->m_vec);
86 ctx->scannedList.push_back(file);
89 void on_detected(csr_cs_malware_h detected, void *userdata)
91 auto ctx = reinterpret_cast<AsyncTestContext *>(userdata);
93 BOOST_REQUIRE_MESSAGE(ctx->apiReturned,
94 "API not returned yet but detected callback called");
96 Test::ScopedCstr file_name;
97 ASSERT_SUCCESS(csr_cs_malware_get_file_name(detected, &file_name.ptr));
98 BOOST_MESSAGE("on_detected. file[" << file_name.ptr << "] detected!");
100 std::lock_guard<std::mutex> l(ctx->m_vec);
103 ctx->detectedList.push_back(detected);
106 void on_error(int ec, void *userdata)
108 auto ctx = reinterpret_cast<AsyncTestContext *>(userdata);
110 BOOST_REQUIRE_MESSAGE(ctx->apiReturned,
111 "API not returned yet but error callback called with error: " <<
112 Test::capi_ec_to_string(ec));
114 BOOST_MESSAGE("on_error. async request done with error: " <<
115 Test::capi_ec_to_string(ec));
119 ctx->cv.notify_one();
122 void on_completed(void *userdata)
124 auto ctx = reinterpret_cast<AsyncTestContext *>(userdata);
126 BOOST_REQUIRE_MESSAGE(ctx->apiReturned,
127 "API not returned yet but completed callback called");
129 BOOST_MESSAGE("on_completed. async request completed succesfully.");
131 ctx->cv.notify_one();
134 void on_cancelled(void *userdata)
136 auto ctx = reinterpret_cast<AsyncTestContext *>(userdata);
138 BOOST_REQUIRE_MESSAGE(ctx->apiReturned,
139 "API not returned yet but cancelled callback called");
141 BOOST_MESSAGE("on_cancelled. async request canceled!");
143 ctx->cv.notify_one();
146 void set_default_callback(csr_cs_context_h context)
148 ASSERT_SUCCESS(csr_cs_set_detected_cb(context, on_detected));
149 ASSERT_SUCCESS(csr_cs_set_completed_cb(context, on_completed));
150 ASSERT_SUCCESS(csr_cs_set_cancelled_cb(context, on_cancelled));
151 ASSERT_SUCCESS(csr_cs_set_error_cb(context, on_error));
152 ASSERT_SUCCESS(csr_cs_set_file_scanned_cb(context, on_scanned));
155 void install_test_files()
157 Test::copy_file(TEST_FILE_HIGH, TEST_FILE_MEDIA);
158 Test::copy_file(TEST_FILE_HIGH, TEST_FILE_TMP);
160 Test::make_dir(TEST_FAKE_APP_ROOT);
161 Test::copy_file(TEST_FILE_HIGH, TEST_FAKE_APP_FILE);
164 void uninstall_test_files()
166 Test::remove_file(TEST_FILE_MEDIA);
167 Test::remove_file(TEST_FILE_TMP);
168 Test::remove_file(TEST_FAKE_APP_FILE);
169 Test::remove_file(TEST_FAKE_APP_ROOT);
172 void uninstall_test_apps()
174 Test::uninstall_app(TEST_WGT_PKG_ID);
175 Test::uninstall_app(TEST_TPK_PKG_ID);
176 Test::uninstall_app(TEST_SAFE_WGT_PKG_ID);
179 void install_test_apps()
181 uninstall_test_apps();
183 ASSERT_INSTALL_APP(TEST_WGT_PATH, TEST_WGT_TYPE);
184 ASSERT_INSTALL_APP(TEST_TPK_PATH, TEST_TPK_TYPE);
185 ASSERT_INSTALL_APP(TEST_SAFE_WGT_PATH, TEST_SAFE_WGT_TYPE);
188 } // end of namespace
190 BOOST_AUTO_TEST_SUITE(API_CONTENT_SCREENING_ASYNC)
192 BOOST_AUTO_TEST_CASE(set_callbacks_positive)
194 EXCEPTION_GUARD_START
196 auto c = Test::Context<csr_cs_context_h>();
197 auto context = c.get();
199 set_default_callback(context);
204 BOOST_AUTO_TEST_CASE(set_callbacks_negative)
206 EXCEPTION_GUARD_START
208 auto c = Test::Context<csr_cs_context_h>();
209 auto context = c.get();
211 ASSERT_IF(csr_cs_set_detected_cb(nullptr, on_detected), CSR_ERROR_INVALID_HANDLE);
212 ASSERT_IF(csr_cs_set_detected_cb(context, nullptr), CSR_ERROR_INVALID_PARAMETER);
213 ASSERT_IF(csr_cs_set_completed_cb(nullptr, on_completed), CSR_ERROR_INVALID_HANDLE);
214 ASSERT_IF(csr_cs_set_completed_cb(context, nullptr), CSR_ERROR_INVALID_PARAMETER);
215 ASSERT_IF(csr_cs_set_cancelled_cb(nullptr, on_cancelled), CSR_ERROR_INVALID_HANDLE);
216 ASSERT_IF(csr_cs_set_cancelled_cb(context, nullptr), CSR_ERROR_INVALID_PARAMETER);
217 ASSERT_IF(csr_cs_set_error_cb(nullptr, on_error), CSR_ERROR_INVALID_HANDLE);
218 ASSERT_IF(csr_cs_set_error_cb(context, nullptr), CSR_ERROR_INVALID_PARAMETER);
219 ASSERT_IF(csr_cs_set_file_scanned_cb(nullptr, on_scanned), CSR_ERROR_INVALID_HANDLE);
220 ASSERT_IF(csr_cs_set_file_scanned_cb(context, nullptr), CSR_ERROR_INVALID_PARAMETER);
225 BOOST_AUTO_TEST_CASE(scan_files_async_positive)
227 EXCEPTION_GUARD_START
229 auto c = Test::Context<csr_cs_context_h>();
230 auto context = c.get();
232 set_default_callback(context);
234 const char *files[4] = {
241 AsyncTestContext testCtx;
243 ASSERT_SUCCESS(csr_cs_scan_files_async(context, files, 4, &testCtx));
245 std::unique_lock<std::mutex> l(testCtx.m);
249 ASSERT_CALLBACK(testCtx, -1, 3, 1, 0, 0); //scanned, detected, completed, cancelled, error
251 ASSERT_DETECTED_IN_LIST(testCtx.detectedList,
252 TEST_FILE_HIGH, MALWARE_HIGH_NAME, MALWARE_HIGH_SEVERITY, MALWARE_HIGH_DETAILED_URL);
253 ASSERT_DETECTED_IN_LIST_EXT(testCtx.detectedList, TEST_FILE_HIGH, false, "");
255 ASSERT_DETECTED_IN_LIST(testCtx.detectedList,
256 TEST_FILE_MEDIUM, MALWARE_MEDIUM_NAME, MALWARE_MEDIUM_SEVERITY, MALWARE_MEDIUM_DETAILED_URL);
257 ASSERT_DETECTED_IN_LIST_EXT(testCtx.detectedList, TEST_FILE_MEDIUM, false, "");
259 ASSERT_DETECTED_IN_LIST(testCtx.detectedList,
260 TEST_FILE_LOW, MALWARE_LOW_NAME, MALWARE_LOW_SEVERITY, MALWARE_LOW_DETAILED_URL);
261 ASSERT_DETECTED_IN_LIST_EXT(testCtx.detectedList, TEST_FILE_LOW, false, "");
266 BOOST_AUTO_TEST_CASE(scan_files_async_negative)
268 EXCEPTION_GUARD_START
270 auto c = Test::Context<csr_cs_context_h>();
271 auto context = c.get();
273 const char *files[3] = {
279 AsyncTestContext testCtx;
281 ASSERT_IF(csr_cs_scan_files_async(nullptr, files, 3, nullptr), CSR_ERROR_INVALID_HANDLE);
282 ASSERT_IF(csr_cs_scan_files_async(context, nullptr, 3, nullptr), CSR_ERROR_INVALID_PARAMETER);
287 BOOST_AUTO_TEST_CASE(scan_dir_positive)
289 EXCEPTION_GUARD_START
291 auto c = Test::Context<csr_cs_context_h>();
292 auto context = c.get();
294 set_default_callback(context);
296 AsyncTestContext testCtx;
298 ASSERT_SUCCESS(csr_cs_scan_dir_async(context, TEST_DIR_MALWARES, &testCtx));
300 std::unique_lock<std::mutex> l(testCtx.m);
304 //scanned, detected, completed, cancelled, error
305 ASSERT_CALLBACK(testCtx, -1, 0, 1, 0, 0);
310 BOOST_AUTO_TEST_CASE(scan_dir_negative)
312 EXCEPTION_GUARD_START
314 auto c = Test::Context<csr_cs_context_h>();
315 auto context = c.get();
317 AsyncTestContext testCtx;
319 ASSERT_IF(csr_cs_scan_dir_async(nullptr, TEST_DIR_MALWARES, nullptr), CSR_ERROR_INVALID_HANDLE);
320 ASSERT_IF(csr_cs_scan_dir_async(context, nullptr, nullptr), CSR_ERROR_INVALID_PARAMETER);
325 BOOST_AUTO_TEST_CASE(scan_dir_root)
327 EXCEPTION_GUARD_START
329 auto c = Test::Context<csr_cs_context_h>();
330 auto context = c.get();
332 install_test_files();
335 set_default_callback(context);
337 AsyncTestContext testCtx;
339 ASSERT_SUCCESS(csr_cs_scan_dir_async(context, TEST_DIR_ROOT, &testCtx));
341 std::unique_lock<std::mutex> l(testCtx.m);
345 Test::uninstall_app(TEST_WGT_PKG_ID);
346 Test::uninstall_app(TEST_TPK_PKG_ID);
348 //scanned, detected, completed, cancelled, error
349 ASSERT_CALLBACK(testCtx, -1, 12, 1, 0, 0);
351 ASSERT_DETECTED_IN_LIST(testCtx.detectedList,
352 TEST_FILE_HIGH, MALWARE_HIGH_NAME, MALWARE_HIGH_SEVERITY, MALWARE_HIGH_DETAILED_URL);
353 ASSERT_DETECTED_IN_LIST_EXT(testCtx.detectedList, TEST_FILE_HIGH, false, "");
355 ASSERT_DETECTED_IN_LIST(testCtx.detectedList,
356 TEST_FILE_MEDIUM, MALWARE_MEDIUM_NAME, MALWARE_MEDIUM_SEVERITY, MALWARE_MEDIUM_DETAILED_URL);
357 ASSERT_DETECTED_IN_LIST_EXT(testCtx.detectedList, TEST_FILE_MEDIUM, false, "");
359 ASSERT_DETECTED_IN_LIST(testCtx.detectedList,
360 TEST_FILE_LOW, MALWARE_LOW_NAME, MALWARE_LOW_SEVERITY, MALWARE_LOW_DETAILED_URL);
361 ASSERT_DETECTED_IN_LIST_EXT(testCtx.detectedList, TEST_FILE_LOW, false, "");
363 ASSERT_DETECTED_IN_LIST(testCtx.detectedList,
364 TEST_FILE_MEDIA, MALWARE_HIGH_NAME, MALWARE_HIGH_SEVERITY, MALWARE_HIGH_DETAILED_URL);
365 ASSERT_DETECTED_IN_LIST_EXT(testCtx.detectedList, TEST_FILE_MEDIA, false, "");
367 ASSERT_DETECTED_IN_LIST(testCtx.detectedList,
368 TEST_FILE_TMP, MALWARE_HIGH_NAME, MALWARE_HIGH_SEVERITY, MALWARE_HIGH_DETAILED_URL);
369 ASSERT_DETECTED_IN_LIST_EXT(testCtx.detectedList, TEST_FILE_TMP, false, "");
371 ASSERT_DETECTED_IN_LIST(testCtx.detectedList,
372 TEST_WGT_APP_ROOT(), MALWARE_HIGH_NAME, MALWARE_HIGH_SEVERITY, MALWARE_HIGH_DETAILED_URL);
373 ASSERT_DETECTED_IN_LIST_EXT(testCtx.detectedList, TEST_WGT_APP_ROOT(), true, TEST_WGT_PKG_ID);
375 ASSERT_DETECTED_IN_LIST(testCtx.detectedList,
376 TEST_TPK_APP_ROOT(), MALWARE_HIGH_NAME, MALWARE_HIGH_SEVERITY, MALWARE_HIGH_DETAILED_URL);
377 ASSERT_DETECTED_IN_LIST_EXT(testCtx.detectedList, TEST_TPK_APP_ROOT(), true, TEST_TPK_PKG_ID);
379 ASSERT_DETECTED_IN_LIST(testCtx.detectedList,
380 TEST_FAKE_APP_FILE, MALWARE_HIGH_NAME, MALWARE_HIGH_SEVERITY, MALWARE_HIGH_DETAILED_URL);
381 ASSERT_DETECTED_IN_LIST_EXT(testCtx.detectedList, TEST_FAKE_APP_FILE, false, "");
386 BOOST_AUTO_TEST_CASE(scan_dir_media)
388 EXCEPTION_GUARD_START
390 auto c = Test::Context<csr_cs_context_h>();
391 auto context = c.get();
393 install_test_files();
395 set_default_callback(context);
397 AsyncTestContext testCtx;
399 ASSERT_SUCCESS(csr_cs_scan_dir_async(context, TEST_DIR_MEDIA, &testCtx));
401 std::unique_lock<std::mutex> l(testCtx.m);
405 // scanned, detected, completed, cancelled, error
406 ASSERT_CALLBACK(testCtx, -1, 1, 1, 0, 0);
408 ASSERT_DETECTED_IN_LIST(testCtx.detectedList,
409 TEST_FILE_MEDIA, MALWARE_HIGH_NAME, MALWARE_HIGH_SEVERITY, MALWARE_HIGH_DETAILED_URL);
410 ASSERT_DETECTED_IN_LIST_EXT(testCtx.detectedList, TEST_FILE_MEDIA, false, "");
415 BOOST_AUTO_TEST_CASE(scan_dir_tmp)
417 EXCEPTION_GUARD_START
419 auto c = Test::Context<csr_cs_context_h>();
420 auto context = c.get();
422 install_test_files();
424 set_default_callback(context);
426 AsyncTestContext testCtx;
428 ASSERT_SUCCESS(csr_cs_scan_dir_async(context, TEST_DIR_TMP, &testCtx));
430 std::unique_lock<std::mutex> l(testCtx.m);
434 //scanned, detected, completed, cancelled, error
435 ASSERT_CALLBACK(testCtx, -1, 1, 1, 0, 0);
437 ASSERT_DETECTED_IN_LIST(testCtx.detectedList,
438 TEST_FILE_TMP, MALWARE_HIGH_NAME, MALWARE_HIGH_SEVERITY, MALWARE_HIGH_DETAILED_URL);
439 ASSERT_DETECTED_IN_LIST_EXT(testCtx.detectedList, TEST_FILE_TMP, false, "");
444 BOOST_AUTO_TEST_CASE(scan_dir_apps)
446 EXCEPTION_GUARD_START
448 auto c = Test::Context<csr_cs_context_h>();
449 auto context = c.get();
451 install_test_files();
454 set_default_callback(context);
456 AsyncTestContext testCtx;
458 ASSERT_SUCCESS(csr_cs_scan_dir_async(context, TEST_DIR_APPS, &testCtx));
460 std::unique_lock<std::mutex> l(testCtx.m);
464 //scanned, detected, completed, cancelled, error
465 ASSERT_CALLBACK(testCtx, -1, 3, 1, 0, 0);
467 ASSERT_DETECTED_IN_LIST(testCtx.detectedList,
468 TEST_WGT_APP_ROOT(), MALWARE_HIGH_NAME, MALWARE_HIGH_SEVERITY, MALWARE_HIGH_DETAILED_URL);
469 ASSERT_DETECTED_IN_LIST_EXT(testCtx.detectedList, TEST_WGT_APP_ROOT(), true, TEST_WGT_PKG_ID);
471 ASSERT_DETECTED_IN_LIST(testCtx.detectedList,
472 TEST_TPK_APP_ROOT(), MALWARE_HIGH_NAME, MALWARE_HIGH_SEVERITY, MALWARE_HIGH_DETAILED_URL);
473 ASSERT_DETECTED_IN_LIST_EXT(testCtx.detectedList, TEST_TPK_APP_ROOT(), true, TEST_TPK_PKG_ID);
475 ASSERT_DETECTED_IN_LIST(testCtx.detectedList,
476 TEST_FAKE_APP_FILE, MALWARE_HIGH_NAME, MALWARE_HIGH_SEVERITY, MALWARE_HIGH_DETAILED_URL);
477 ASSERT_DETECTED_IN_LIST_EXT(testCtx.detectedList, TEST_FAKE_APP_FILE, false, "");
479 uninstall_test_apps();
484 BOOST_AUTO_TEST_CASE(scan_dir_wgt)
486 EXCEPTION_GUARD_START
488 auto c = Test::Context<csr_cs_context_h>();
489 auto context = c.get();
491 Test::uninstall_app(TEST_WGT_PKG_ID);
492 ASSERT_INSTALL_APP(TEST_WGT_PATH, TEST_WGT_TYPE);
494 set_default_callback(context);
496 AsyncTestContext testCtx;
498 ASSERT_SUCCESS(csr_cs_scan_dir_async(context, TEST_WGT_APP_ROOT().c_str(), &testCtx));
500 std::unique_lock<std::mutex> l(testCtx.m);
504 //scanned, detected, completed, cancelled, error
505 ASSERT_CALLBACK(testCtx, -1, 1, 1, 0, 0);
507 ASSERT_DETECTED_IN_LIST(testCtx.detectedList,
508 TEST_WGT_APP_ROOT(), MALWARE_HIGH_NAME, MALWARE_HIGH_SEVERITY, MALWARE_HIGH_DETAILED_URL);
509 ASSERT_DETECTED_IN_LIST_EXT(testCtx.detectedList, TEST_WGT_APP_ROOT(), true, TEST_WGT_PKG_ID);
511 Test::uninstall_app(TEST_WGT_PKG_ID);
516 BOOST_AUTO_TEST_CASE(scan_dir_tpk)
518 EXCEPTION_GUARD_START
520 auto c = Test::Context<csr_cs_context_h>();
521 auto context = c.get();
523 Test::uninstall_app(TEST_TPK_PKG_ID);
524 ASSERT_INSTALL_APP(TEST_TPK_PATH, TEST_TPK_TYPE);
526 set_default_callback(context);
528 AsyncTestContext testCtx;
530 ASSERT_SUCCESS(csr_cs_scan_dir_async(context, TEST_TPK_APP_ROOT().c_str(), &testCtx));
532 std::unique_lock<std::mutex> l(testCtx.m);
536 //scanned, detected, completed, cancelled, error
537 ASSERT_CALLBACK(testCtx, -1, 1, 1, 0, 0);
539 ASSERT_DETECTED_IN_LIST(testCtx.detectedList,
540 TEST_TPK_APP_ROOT(), MALWARE_HIGH_NAME, MALWARE_HIGH_SEVERITY, MALWARE_HIGH_DETAILED_URL);
541 ASSERT_DETECTED_IN_LIST_EXT(testCtx.detectedList, TEST_TPK_APP_ROOT(), true, TEST_TPK_PKG_ID);
543 Test::uninstall_app(TEST_TPK_PKG_ID);
548 BOOST_AUTO_TEST_CASE(scan_dirs_positive)
550 EXCEPTION_GUARD_START
552 auto c = Test::Context<csr_cs_context_h>();
553 auto context = c.get();
555 set_default_callback(context);
557 AsyncTestContext testCtx;
559 const char *dirs[1] = {
563 ASSERT_SUCCESS(csr_cs_scan_dirs_async(context, dirs, 1, &testCtx));
565 std::unique_lock<std::mutex> l(testCtx.m);
569 //scanned, detected, completed, cancelled, error
570 ASSERT_CALLBACK(testCtx, -1, 0, 1, 0, 0);
575 BOOST_AUTO_TEST_CASE(scan_dirs_negative)
577 EXCEPTION_GUARD_START
579 auto c = Test::Context<csr_cs_context_h>();
580 auto context = c.get();
582 const char *dirs[1] = {
586 ASSERT_IF(csr_cs_scan_dirs_async(nullptr, dirs, 1, nullptr), CSR_ERROR_INVALID_HANDLE);
587 ASSERT_IF(csr_cs_scan_dirs_async(context, nullptr, 1, nullptr), CSR_ERROR_INVALID_PARAMETER);
593 BOOST_AUTO_TEST_CASE(scan_cancel_positiive)
595 EXCEPTION_GUARD_START
597 auto c = Test::Context<csr_cs_context_h>();
598 auto context = c.get();
600 set_default_callback(context);
602 AsyncTestContext testCtx;
604 const char *dirs[1] = {
608 // touch a file : in case of no target file to scan, we cannot cancel to scan.
609 Test::touch_file(TEST_FILE_HIGH);
611 ASSERT_SUCCESS(csr_cs_scan_dirs_async(context, dirs, 1, &testCtx));
612 ASSERT_SUCCESS(csr_cs_cancel_scanning(context));
614 //scanned, detected, completed, cancelled, error
615 ASSERT_CALLBACK(testCtx, -1, -1, 0, 1, 0);
620 BOOST_AUTO_TEST_CASE(scan_cancel_negative)
622 EXCEPTION_GUARD_START
624 auto c = Test::Context<csr_cs_context_h>();
625 auto context = c.get();
627 ASSERT_IF(csr_cs_cancel_scanning(nullptr), CSR_ERROR_INVALID_HANDLE);
628 ASSERT_IF(csr_cs_cancel_scanning(context), CSR_ERROR_NO_TASK);
633 BOOST_AUTO_TEST_CASE(delta_scan_basic)
635 EXCEPTION_GUARD_START
637 Test::initialize_db();
639 auto c = Test::Context<csr_cs_context_h>();
640 auto context = c.get();
642 install_test_files();
645 set_default_callback(context);
648 AsyncTestContext testBaseCtx;
650 ASSERT_SUCCESS(csr_cs_scan_dir_async(context, TEST_DIR_APPS, &testBaseCtx));
652 std::unique_lock<std::mutex> lBase(testBaseCtx.m);
653 testBaseCtx.cv.wait(lBase);
656 // scanned, detected, completed, cancelled, error
657 ASSERT_CALLBACK(testBaseCtx, -1, 3, 1, 0, 0);
658 BOOST_REQUIRE_MESSAGE(testBaseCtx.scannedCnt != 0,
659 "Base Scan count should not be zero");
661 // Rescan the same dir
662 AsyncTestContext testRescanCtx;
664 ASSERT_SUCCESS(csr_cs_scan_dir_async(context, TEST_DIR_APPS, &testRescanCtx));
666 std::unique_lock<std::mutex> lRescan(testRescanCtx.m);
667 testRescanCtx.cv.wait(lRescan);
670 // scanned, detected, completed, cancelled, error
671 ASSERT_CALLBACK(testRescanCtx, 0, 3, 1, 0, 0);
673 ASSERT_DETECTED_IN_LIST(testRescanCtx.detectedList,
674 TEST_WGT_APP_ROOT(), MALWARE_HIGH_NAME, MALWARE_HIGH_SEVERITY, MALWARE_HIGH_DETAILED_URL);
675 ASSERT_DETECTED_IN_LIST_EXT(testRescanCtx.detectedList, TEST_WGT_APP_ROOT(), true, TEST_WGT_PKG_ID);
677 ASSERT_DETECTED_IN_LIST(testRescanCtx.detectedList,
678 TEST_TPK_APP_ROOT(), MALWARE_HIGH_NAME, MALWARE_HIGH_SEVERITY, MALWARE_HIGH_DETAILED_URL);
679 ASSERT_DETECTED_IN_LIST_EXT(testRescanCtx.detectedList, TEST_TPK_APP_ROOT(), true, TEST_TPK_PKG_ID);
681 ASSERT_DETECTED_IN_LIST(testRescanCtx.detectedList,
682 TEST_FAKE_APP_FILE, MALWARE_HIGH_NAME, MALWARE_HIGH_SEVERITY, MALWARE_HIGH_DETAILED_URL);
683 ASSERT_DETECTED_IN_LIST_EXT(testRescanCtx.detectedList, TEST_FAKE_APP_FILE, false, "");
685 // Rescan the sub dir
686 AsyncTestContext testRescanSubCtx;
688 ASSERT_SUCCESS(csr_cs_scan_dir_async(context, TEST_WGT_APP_ROOT().c_str(), &testRescanSubCtx));
690 std::unique_lock<std::mutex> lRescanSub(testRescanSubCtx.m);
691 testRescanSubCtx.cv.wait(lRescanSub);
694 // scanned, detected, completed, cancelled, error
695 ASSERT_CALLBACK(testRescanSubCtx, 0, 1, 1, 0, 0);
697 ASSERT_DETECTED_IN_LIST(testRescanSubCtx.detectedList,
698 TEST_WGT_APP_ROOT(), MALWARE_HIGH_NAME, MALWARE_HIGH_SEVERITY, MALWARE_HIGH_DETAILED_URL);
699 ASSERT_DETECTED_IN_LIST_EXT(testRescanSubCtx.detectedList, TEST_WGT_APP_ROOT(), true, TEST_WGT_PKG_ID);
701 uninstall_test_apps();
706 BOOST_AUTO_TEST_CASE(delta_scan_changed_after_scan)
708 EXCEPTION_GUARD_START
710 Test::initialize_db();
712 auto c = Test::Context<csr_cs_context_h>();
713 auto context = c.get();
715 install_test_files();
718 set_default_callback(context);
721 AsyncTestContext testBaseCtx;
723 ASSERT_SUCCESS(csr_cs_scan_dir_async(context, TEST_DIR_APPS, &testBaseCtx));
725 std::unique_lock<std::mutex> lBase(testBaseCtx.m);
726 testBaseCtx.cv.wait(lBase);
729 // scanned, detected, completed, cancelled, error
730 ASSERT_CALLBACK(testBaseCtx, -1, 3, 1, 0, 0);
731 BOOST_REQUIRE_MESSAGE(testBaseCtx.scannedCnt != 0,
732 "Base Scan count should not be zero");
735 Test::uninstall_app(TEST_SAFE_WGT_PKG_ID);
736 ASSERT_INSTALL_APP(TEST_SAFE_WGT_PATH, TEST_SAFE_WGT_TYPE);
738 // Rescan the same dir
739 AsyncTestContext testRescanCtx;
741 ASSERT_SUCCESS(csr_cs_scan_dir_async(context, TEST_DIR_APPS, &testRescanCtx));
743 std::unique_lock<std::mutex> lRescan(testRescanCtx.m);
744 testRescanCtx.cv.wait(lRescan);
747 // scanned, detected, completed, cancelled, error
748 ASSERT_CALLBACK(testRescanCtx, 1, 3, 1, 0, 0);
750 ASSERT_DETECTED_IN_LIST(testRescanCtx.detectedList,
751 TEST_WGT_APP_ROOT(), MALWARE_HIGH_NAME, MALWARE_HIGH_SEVERITY, MALWARE_HIGH_DETAILED_URL);
752 ASSERT_DETECTED_IN_LIST_EXT(testRescanCtx.detectedList, TEST_WGT_APP_ROOT(), true, TEST_WGT_PKG_ID);
754 ASSERT_DETECTED_IN_LIST(testRescanCtx.detectedList,
755 TEST_TPK_APP_ROOT(), MALWARE_HIGH_NAME, MALWARE_HIGH_SEVERITY, MALWARE_HIGH_DETAILED_URL);
756 ASSERT_DETECTED_IN_LIST_EXT(testRescanCtx.detectedList, TEST_TPK_APP_ROOT(), true, TEST_TPK_PKG_ID);
758 ASSERT_DETECTED_IN_LIST(testRescanCtx.detectedList,
759 TEST_FAKE_APP_FILE, MALWARE_HIGH_NAME, MALWARE_HIGH_SEVERITY, MALWARE_HIGH_DETAILED_URL);
760 ASSERT_DETECTED_IN_LIST_EXT(testRescanCtx.detectedList, TEST_FAKE_APP_FILE, false, "");
762 uninstall_test_apps();
767 BOOST_AUTO_TEST_CASE(canonicalize_files_absolute_path)
769 EXCEPTION_GUARD_START
771 Test::initialize_db();
773 auto c = Test::Context<csr_cs_context_h>();
774 auto context = c.get();
776 install_test_files();
778 set_default_callback(context);
780 // four files are all same as realpath.
781 const char *files[4] = {
783 TEST_DIR "/./test_normal_file",
784 TEST_DIR "/.././././csr-test/test_normal_file",
785 TEST_DIR "/././.././csr-test/test_normal_file"
788 AsyncTestContext testCtx;
790 ASSERT_SUCCESS(csr_cs_scan_files_async(context, files, 4, &testCtx));
792 std::unique_lock<std::mutex> l(testCtx.m);
796 ASSERT_CALLBACK(testCtx, 1, 0, 1, 0, 0);
797 ASSERT_IF(testCtx.scannedList.size(), static_cast<std::size_t>(1));
798 ASSERT_IF(testCtx.scannedList.front(), static_cast<const char *>(TEST_FILE_NORMAL));
803 BOOST_AUTO_TEST_CASE(canonicalize_files_relative_path)
805 EXCEPTION_GUARD_START
807 Test::initialize_db();
809 auto c = Test::Context<csr_cs_context_h>();
810 auto context = c.get();
812 install_test_files();
814 set_default_callback(context);
816 // four files are all same as realpath.
817 const char *files[4] = {
819 "./test_normal_file",
820 ".././././csr-test/test_normal_file",
821 "././.././csr-test/test_normal_file"
824 AsyncTestContext testCtx;
826 Test::ScopedChDir scopedCd(TEST_DIR);
828 ASSERT_SUCCESS(csr_cs_scan_files_async(context, files, 4, &testCtx));
830 std::unique_lock<std::mutex> l(testCtx.m);
834 ASSERT_CALLBACK(testCtx, 1, 0, 1, 0, 0);
835 ASSERT_IF(testCtx.scannedList.size(), static_cast<std::size_t>(1));
836 ASSERT_IF(testCtx.scannedList.front(), static_cast<const char *>(TEST_FILE_NORMAL));
841 BOOST_AUTO_TEST_CASE(multiple_async_dispatch_negative)
843 EXCEPTION_GUARD_START
845 Test::initialize_db();
847 auto c = Test::Context<csr_cs_context_h>();
848 auto context = c.get();
850 install_test_files();
853 set_default_callback(context);
855 AsyncTestContext testCtx;
857 // first call. it'll running in background asynchronously.
858 ASSERT_SUCCESS(csr_cs_scan_dir_async(context, TEST_DIR_APPS, &testCtx));
860 AsyncTestContext testCtx2;
862 // second call while first call is running in background. It should blocked because
863 // only one operation can be running asynchronously on one handle.
864 ASSERT_IF(csr_cs_scan_dir_async(context, TEST_DIR_APPS, &testCtx2), CSR_ERROR_BUSY);
866 std::unique_lock<std::mutex> l(testCtx.m);
870 ASSERT_CALLBACK(testCtx, -1, 3, 1, 0, 0);
875 BOOST_AUTO_TEST_CASE(get_malware_after_async)
877 EXCEPTION_GUARD_START
879 auto c = Test::Context<csr_cs_context_h>();
880 auto context = c.get();
882 set_default_callback(context);
884 const char *dirs[4] = {
891 csr_cs_malware_list_h malwares = nullptr;
892 csr_cs_malware_h malware = nullptr;
895 ASSERT_SUCCESS(csr_cs_get_detected_malwares(context, dirs, 4, &malwares, &count));
896 BOOST_MESSAGE("detected malware exist count before scanning: " << count);
898 AsyncTestContext testCtx;
900 ASSERT_SUCCESS(csr_cs_scan_dirs_async(context, dirs, 4, &testCtx));
902 std::unique_lock<std::mutex> l(testCtx.m);
906 BOOST_MESSAGE("scanned count: " << testCtx.scannedCnt);
907 BOOST_MESSAGE("detected count: " << testCtx.detectedCnt);
908 BOOST_MESSAGE("completed count: " << testCtx.completedCnt);
909 BOOST_MESSAGE("cancelled count: " << testCtx.cancelledCnt);
910 BOOST_MESSAGE("error count: " << testCtx.errorCnt);
912 ASSERT_SUCCESS(csr_cs_get_detected_malwares(context, dirs, 4, &malwares, &count));
914 CHECK_IS_NOT_NULL(malwares);
916 for (size_t i = 0; i < count; ++i) {
918 Test::ScopedCstr filepath;
919 ASSERT_SUCCESS(csr_cs_malware_list_get_malware(malwares, i, &malware));
920 CHECK_IS_NOT_NULL(malware);
921 ASSERT_SUCCESS(csr_cs_malware_get_file_name(malware, &filepath.ptr));
922 CHECK_IS_NOT_NULL(filepath.ptr);
923 BOOST_MESSAGE("detect malware from file: " << filepath.ptr);
929 BOOST_AUTO_TEST_CASE(async_api_returning_and_callback_race)
931 EXCEPTION_GUARD_START
933 auto c = Test::Context<csr_cs_context_h>();
934 auto context = c.get();
936 install_test_files();
938 set_default_callback(context);
940 const char *files[2] = {
945 AsyncTestContext testCtx(true);
947 ASSERT_SUCCESS(csr_cs_scan_files_async(context, files, 2, &testCtx));
948 testCtx.apiReturned = true;
950 std::unique_lock<std::mutex> l(testCtx.m);
957 BOOST_AUTO_TEST_SUITE_END()