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;
72 void on_scanned(const char *file, void *userdata)
74 BOOST_MESSAGE("on_scanned. file[" << file << "] scanned!");
75 auto ctx = reinterpret_cast<AsyncTestContext *>(userdata);
77 std::lock_guard<std::mutex> l(ctx->m_vec);
80 ctx->scannedList.push_back(file);
83 void on_detected(csr_cs_malware_h detected, void *userdata)
85 Test::ScopedCstr file_name;
86 ASSERT_IF(csr_cs_malware_get_file_name(detected, &file_name.ptr), CSR_ERROR_NONE);
87 BOOST_MESSAGE("on_detected. file[" << file_name.ptr << "] detected!");
88 auto ctx = reinterpret_cast<AsyncTestContext *>(userdata);
90 std::lock_guard<std::mutex> l(ctx->m_vec);
93 ctx->detectedList.push_back(detected);
96 void on_error(int ec, void *userdata)
98 BOOST_MESSAGE("on_error. async request done with error code[" << ec << "]");
99 auto ctx = reinterpret_cast<AsyncTestContext *>(userdata);
103 ctx->cv.notify_one();
106 void on_completed(void *userdata)
108 BOOST_MESSAGE("on_completed. async request completed succesfully.");
109 auto ctx = reinterpret_cast<AsyncTestContext *>(userdata);
111 ctx->cv.notify_one();
114 void on_cancelled(void *userdata)
116 BOOST_MESSAGE("on_cancelled. async request canceled!");
117 auto ctx = reinterpret_cast<AsyncTestContext *>(userdata);
119 ctx->cv.notify_one();
122 void set_default_callback(csr_cs_context_h context)
124 ASSERT_IF(csr_cs_set_detected_cb(context, on_detected), CSR_ERROR_NONE);
125 ASSERT_IF(csr_cs_set_completed_cb(context, on_completed), CSR_ERROR_NONE);
126 ASSERT_IF(csr_cs_set_cancelled_cb(context, on_cancelled), CSR_ERROR_NONE);
127 ASSERT_IF(csr_cs_set_error_cb(context, on_error), CSR_ERROR_NONE);
128 ASSERT_IF(csr_cs_set_file_scanned_cb(context, on_scanned), CSR_ERROR_NONE);
131 void install_test_files()
133 Test::copy_file(TEST_FILE_HIGH, TEST_FILE_MEDIA);
134 Test::copy_file(TEST_FILE_HIGH, TEST_FILE_TMP);
136 Test::make_dir(TEST_FAKE_APP_ROOT);
137 Test::copy_file(TEST_FILE_HIGH, TEST_FAKE_APP_FILE);
140 void uninstall_test_files()
142 Test::remove_file(TEST_FILE_MEDIA);
143 Test::remove_file(TEST_FILE_TMP);
144 Test::remove_file(TEST_FAKE_APP_FILE);
145 Test::remove_file(TEST_FAKE_APP_ROOT);
148 void uninstall_test_apps()
150 Test::uninstall_app(TEST_WGT_PKG_ID);
151 Test::uninstall_app(TEST_TPK_PKG_ID);
152 Test::uninstall_app(TEST_SAFE_WGT_PKG_ID);
155 void install_test_apps()
157 uninstall_test_apps();
159 ASSERT_INSTALL_APP(TEST_WGT_PATH, TEST_WGT_TYPE);
160 ASSERT_INSTALL_APP(TEST_TPK_PATH, TEST_TPK_TYPE);
161 ASSERT_INSTALL_APP(TEST_SAFE_WGT_PATH, TEST_SAFE_WGT_TYPE);
164 } // end of namespace
166 BOOST_AUTO_TEST_SUITE(API_CONTENT_SCREENING_ASYNC)
168 BOOST_AUTO_TEST_CASE(set_callbacks_positive)
170 EXCEPTION_GUARD_START
172 auto c = Test::Context<csr_cs_context_h>();
173 auto context = c.get();
175 set_default_callback(context);
180 BOOST_AUTO_TEST_CASE(set_callbacks_negative)
182 EXCEPTION_GUARD_START
184 auto c = Test::Context<csr_cs_context_h>();
185 auto context = c.get();
187 ASSERT_IF(csr_cs_set_detected_cb(nullptr, on_detected), CSR_ERROR_INVALID_HANDLE);
188 ASSERT_IF(csr_cs_set_detected_cb(context, nullptr), CSR_ERROR_INVALID_PARAMETER);
189 ASSERT_IF(csr_cs_set_completed_cb(nullptr, on_completed), CSR_ERROR_INVALID_HANDLE);
190 ASSERT_IF(csr_cs_set_completed_cb(context, nullptr), CSR_ERROR_INVALID_PARAMETER);
191 ASSERT_IF(csr_cs_set_cancelled_cb(nullptr, on_cancelled), CSR_ERROR_INVALID_HANDLE);
192 ASSERT_IF(csr_cs_set_cancelled_cb(context, nullptr), CSR_ERROR_INVALID_PARAMETER);
193 ASSERT_IF(csr_cs_set_error_cb(nullptr, on_error), CSR_ERROR_INVALID_HANDLE);
194 ASSERT_IF(csr_cs_set_error_cb(context, nullptr), CSR_ERROR_INVALID_PARAMETER);
195 ASSERT_IF(csr_cs_set_file_scanned_cb(nullptr, on_scanned), CSR_ERROR_INVALID_HANDLE);
196 ASSERT_IF(csr_cs_set_file_scanned_cb(context, nullptr), CSR_ERROR_INVALID_PARAMETER);
201 BOOST_AUTO_TEST_CASE(scan_files_async_positive)
203 EXCEPTION_GUARD_START
205 auto c = Test::Context<csr_cs_context_h>();
206 auto context = c.get();
208 set_default_callback(context);
210 const char *files[4] = {
217 AsyncTestContext testCtx;
220 csr_cs_scan_files_async(context, files, sizeof(files) / sizeof(const char *),
224 std::unique_lock<std::mutex> l(testCtx.m);
228 ASSERT_CALLBACK(testCtx, -1, 3, 1, 0, 0); //scanned, detected, completed, cancelled, error
230 ASSERT_DETECTED_IN_LIST(testCtx.detectedList,
231 TEST_FILE_HIGH, MALWARE_HIGH_NAME, MALWARE_HIGH_SEVERITY, MALWARE_HIGH_DETAILED_URL);
232 ASSERT_DETECTED_IN_LIST_EXT(testCtx.detectedList,
233 TEST_FILE_HIGH, false, nullptr);
235 ASSERT_DETECTED_IN_LIST(testCtx.detectedList,
236 TEST_FILE_MEDIUM, MALWARE_MEDIUM_NAME, MALWARE_MEDIUM_SEVERITY, MALWARE_MEDIUM_DETAILED_URL);
237 ASSERT_DETECTED_IN_LIST_EXT(testCtx.detectedList,
238 TEST_FILE_MEDIUM, false, nullptr);
240 ASSERT_DETECTED_IN_LIST(testCtx.detectedList,
241 TEST_FILE_LOW, MALWARE_LOW_NAME, MALWARE_LOW_SEVERITY, MALWARE_LOW_DETAILED_URL);
242 ASSERT_DETECTED_IN_LIST_EXT(testCtx.detectedList,
243 TEST_FILE_LOW, false, nullptr);
248 BOOST_AUTO_TEST_CASE(scan_files_async_negative)
250 EXCEPTION_GUARD_START
252 auto c = Test::Context<csr_cs_context_h>();
253 auto context = c.get();
255 const char *files[3] = {
261 AsyncTestContext testCtx;
264 csr_cs_scan_files_async(nullptr, files, sizeof(files) / sizeof(const char *),
266 CSR_ERROR_INVALID_HANDLE);
269 csr_cs_scan_files_async(context, nullptr, sizeof(files) / sizeof(const char *),
271 CSR_ERROR_INVALID_PARAMETER);
276 BOOST_AUTO_TEST_CASE(scan_dir_positive)
278 EXCEPTION_GUARD_START
280 auto c = Test::Context<csr_cs_context_h>();
281 auto context = c.get();
283 set_default_callback(context);
285 AsyncTestContext testCtx;
287 ASSERT_IF(csr_cs_scan_dir_async(context, TEST_DIR_MALWARES, &testCtx), CSR_ERROR_NONE);
289 std::unique_lock<std::mutex> l(testCtx.m);
293 //scanned, detected, completed, cancelled, error
294 ASSERT_CALLBACK(testCtx, -1, 0, 1, 0, 0);
299 BOOST_AUTO_TEST_CASE(scan_dir_negative)
301 EXCEPTION_GUARD_START
303 auto c = Test::Context<csr_cs_context_h>();
304 auto context = c.get();
306 AsyncTestContext testCtx;
308 ASSERT_IF(csr_cs_scan_dir_async(nullptr, TEST_DIR_MALWARES, nullptr),
309 CSR_ERROR_INVALID_HANDLE);
310 ASSERT_IF(csr_cs_scan_dir_async(context, nullptr, nullptr),
311 CSR_ERROR_INVALID_PARAMETER);
316 BOOST_AUTO_TEST_CASE(scan_dir_root)
318 EXCEPTION_GUARD_START
320 auto c = Test::Context<csr_cs_context_h>();
321 auto context = c.get();
323 install_test_files();
326 set_default_callback(context);
328 AsyncTestContext testCtx;
330 ASSERT_IF(csr_cs_scan_dir_async(context, TEST_DIR_ROOT, &testCtx), CSR_ERROR_NONE);
332 std::unique_lock<std::mutex> l(testCtx.m);
336 Test::uninstall_app(TEST_WGT_PKG_ID);
337 Test::uninstall_app(TEST_TPK_PKG_ID);
339 //scanned, detected, completed, cancelled, error
340 ASSERT_CALLBACK(testCtx, -1, 12, 1, 0, 0);
342 ASSERT_DETECTED_IN_LIST(testCtx.detectedList,
343 TEST_FILE_HIGH, MALWARE_HIGH_NAME, MALWARE_HIGH_SEVERITY, MALWARE_HIGH_DETAILED_URL);
344 ASSERT_DETECTED_IN_LIST_EXT(testCtx.detectedList,
345 TEST_FILE_HIGH, false, nullptr);
347 ASSERT_DETECTED_IN_LIST(testCtx.detectedList,
348 TEST_FILE_MEDIUM, MALWARE_MEDIUM_NAME, MALWARE_MEDIUM_SEVERITY, MALWARE_MEDIUM_DETAILED_URL);
349 ASSERT_DETECTED_IN_LIST_EXT(testCtx.detectedList,
350 TEST_FILE_MEDIUM, false, nullptr);
352 ASSERT_DETECTED_IN_LIST(testCtx.detectedList,
353 TEST_FILE_LOW, MALWARE_LOW_NAME, MALWARE_LOW_SEVERITY, MALWARE_LOW_DETAILED_URL);
354 ASSERT_DETECTED_IN_LIST_EXT(testCtx.detectedList,
355 TEST_FILE_LOW, false, nullptr);
357 ASSERT_DETECTED_IN_LIST(testCtx.detectedList,
358 TEST_FILE_MEDIA, MALWARE_HIGH_NAME, MALWARE_HIGH_SEVERITY, MALWARE_HIGH_DETAILED_URL);
359 ASSERT_DETECTED_IN_LIST_EXT(testCtx.detectedList,
360 TEST_FILE_MEDIA, false, nullptr);
362 ASSERT_DETECTED_IN_LIST(testCtx.detectedList,
363 TEST_FILE_TMP, MALWARE_HIGH_NAME, MALWARE_HIGH_SEVERITY, MALWARE_HIGH_DETAILED_URL);
364 ASSERT_DETECTED_IN_LIST_EXT(testCtx.detectedList,
365 TEST_FILE_TMP, false, nullptr);
367 ASSERT_DETECTED_IN_LIST(testCtx.detectedList,
368 TEST_WGT_APP_ROOT, MALWARE_HIGH_NAME, MALWARE_HIGH_SEVERITY, MALWARE_HIGH_DETAILED_URL);
369 ASSERT_DETECTED_IN_LIST_EXT(testCtx.detectedList,
370 TEST_WGT_APP_ROOT, true, TEST_WGT_PKG_ID);
372 ASSERT_DETECTED_IN_LIST(testCtx.detectedList,
373 TEST_TPK_APP_ROOT, MALWARE_HIGH_NAME, MALWARE_HIGH_SEVERITY, MALWARE_HIGH_DETAILED_URL);
374 ASSERT_DETECTED_IN_LIST_EXT(testCtx.detectedList,
375 TEST_TPK_APP_ROOT, true, TEST_TPK_PKG_ID);
377 ASSERT_DETECTED_IN_LIST(testCtx.detectedList,
378 TEST_FAKE_APP_FILE, MALWARE_HIGH_NAME, MALWARE_HIGH_SEVERITY, MALWARE_HIGH_DETAILED_URL);
379 ASSERT_DETECTED_IN_LIST_EXT(testCtx.detectedList,
380 TEST_FAKE_APP_FILE, false, nullptr);
385 BOOST_AUTO_TEST_CASE(scan_dir_media)
387 EXCEPTION_GUARD_START
389 auto c = Test::Context<csr_cs_context_h>();
390 auto context = c.get();
392 install_test_files();
394 set_default_callback(context);
396 AsyncTestContext testCtx;
398 ASSERT_IF(csr_cs_scan_dir_async(context, TEST_DIR_MEDIA, &testCtx), CSR_ERROR_NONE);
400 std::unique_lock<std::mutex> l(testCtx.m);
404 // scanned, detected, completed, cancelled, error
405 ASSERT_CALLBACK(testCtx, -1, 1, 1, 0, 0);
407 ASSERT_DETECTED_IN_LIST(testCtx.detectedList,
408 TEST_FILE_MEDIA, MALWARE_HIGH_NAME, MALWARE_HIGH_SEVERITY, MALWARE_HIGH_DETAILED_URL);
409 ASSERT_DETECTED_IN_LIST_EXT(testCtx.detectedList,
410 TEST_FILE_MEDIA, false, nullptr);
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_IF(csr_cs_scan_dir_async(context, TEST_DIR_TMP, &testCtx), CSR_ERROR_NONE);
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,
440 TEST_FILE_TMP, false, nullptr);
445 BOOST_AUTO_TEST_CASE(scan_dir_apps)
447 EXCEPTION_GUARD_START
449 auto c = Test::Context<csr_cs_context_h>();
450 auto context = c.get();
452 install_test_files();
455 set_default_callback(context);
457 AsyncTestContext testCtx;
459 ASSERT_SUCCESS(csr_cs_scan_dir_async(context, TEST_DIR_APPS, &testCtx));
461 std::unique_lock<std::mutex> l(testCtx.m);
465 //scanned, detected, completed, cancelled, error
466 ASSERT_CALLBACK(testCtx, -1, 3, 1, 0, 0);
468 ASSERT_DETECTED_IN_LIST(testCtx.detectedList,
469 TEST_WGT_APP_ROOT, MALWARE_HIGH_NAME, MALWARE_HIGH_SEVERITY, MALWARE_HIGH_DETAILED_URL);
470 ASSERT_DETECTED_IN_LIST_EXT(testCtx.detectedList,
471 TEST_WGT_APP_ROOT, true, TEST_WGT_PKG_ID);
473 ASSERT_DETECTED_IN_LIST(testCtx.detectedList,
474 TEST_TPK_APP_ROOT, MALWARE_HIGH_NAME, MALWARE_HIGH_SEVERITY, MALWARE_HIGH_DETAILED_URL);
475 ASSERT_DETECTED_IN_LIST_EXT(testCtx.detectedList,
476 TEST_TPK_APP_ROOT, true, TEST_TPK_PKG_ID);
478 ASSERT_DETECTED_IN_LIST(testCtx.detectedList,
479 TEST_FAKE_APP_FILE, MALWARE_HIGH_NAME, MALWARE_HIGH_SEVERITY, MALWARE_HIGH_DETAILED_URL);
480 ASSERT_DETECTED_IN_LIST_EXT(testCtx.detectedList,
481 TEST_FAKE_APP_FILE, false, nullptr);
483 uninstall_test_apps();
488 BOOST_AUTO_TEST_CASE(scan_dir_wgt)
490 EXCEPTION_GUARD_START
492 auto c = Test::Context<csr_cs_context_h>();
493 auto context = c.get();
495 Test::uninstall_app(TEST_WGT_PKG_ID);
496 ASSERT_INSTALL_APP(TEST_WGT_PATH, TEST_WGT_TYPE);
498 set_default_callback(context);
500 AsyncTestContext testCtx;
502 ASSERT_IF(csr_cs_scan_dir_async(context, TEST_WGT_APP_ROOT, &testCtx), CSR_ERROR_NONE);
504 std::unique_lock<std::mutex> l(testCtx.m);
508 //scanned, detected, completed, cancelled, error
509 ASSERT_CALLBACK(testCtx, -1, 1, 1, 0, 0);
511 ASSERT_DETECTED_IN_LIST(testCtx.detectedList,
512 TEST_WGT_APP_ROOT, MALWARE_HIGH_NAME, MALWARE_HIGH_SEVERITY, MALWARE_HIGH_DETAILED_URL);
513 ASSERT_DETECTED_IN_LIST_EXT(testCtx.detectedList,
514 TEST_WGT_APP_ROOT, true, TEST_WGT_PKG_ID);
516 Test::uninstall_app(TEST_WGT_PKG_ID);
521 BOOST_AUTO_TEST_CASE(scan_dir_tpk)
523 EXCEPTION_GUARD_START
525 auto c = Test::Context<csr_cs_context_h>();
526 auto context = c.get();
528 Test::uninstall_app(TEST_TPK_PKG_ID);
529 ASSERT_INSTALL_APP(TEST_TPK_PATH, TEST_TPK_TYPE);
531 set_default_callback(context);
533 AsyncTestContext testCtx;
535 ASSERT_IF(csr_cs_scan_dir_async(context, TEST_TPK_APP_ROOT, &testCtx), CSR_ERROR_NONE);
537 std::unique_lock<std::mutex> l(testCtx.m);
541 //scanned, detected, completed, cancelled, error
542 ASSERT_CALLBACK(testCtx, -1, 1, 1, 0, 0);
544 ASSERT_DETECTED_IN_LIST(testCtx.detectedList,
545 TEST_TPK_APP_ROOT, MALWARE_HIGH_NAME, MALWARE_HIGH_SEVERITY, MALWARE_HIGH_DETAILED_URL);
546 ASSERT_DETECTED_IN_LIST_EXT(testCtx.detectedList,
547 TEST_TPK_APP_ROOT, true, TEST_TPK_PKG_ID);
549 Test::uninstall_app(TEST_TPK_PKG_ID);
554 BOOST_AUTO_TEST_CASE(scan_dirs_positive)
556 EXCEPTION_GUARD_START
558 auto c = Test::Context<csr_cs_context_h>();
559 auto context = c.get();
561 set_default_callback(context);
563 AsyncTestContext testCtx;
565 const char *dirs[1] = {
570 csr_cs_scan_dirs_async(context, dirs, sizeof(dirs) / sizeof(const char *),
574 std::unique_lock<std::mutex> l(testCtx.m);
578 //scanned, detected, completed, cancelled, error
579 ASSERT_CALLBACK(testCtx, -1, 0, 1, 0, 0);
584 BOOST_AUTO_TEST_CASE(scan_dirs_negative)
586 EXCEPTION_GUARD_START
588 auto c = Test::Context<csr_cs_context_h>();
589 auto context = c.get();
591 const char *dirs[1] = {
596 csr_cs_scan_dirs_async(nullptr, dirs, sizeof(dirs) / sizeof(const char *),
598 CSR_ERROR_INVALID_HANDLE);
601 csr_cs_scan_dirs_async(context, nullptr, sizeof(dirs) / sizeof(const char *),
603 CSR_ERROR_INVALID_PARAMETER);
609 BOOST_AUTO_TEST_CASE(scan_cancel_positiive)
611 EXCEPTION_GUARD_START
613 auto c = Test::Context<csr_cs_context_h>();
614 auto context = c.get();
616 set_default_callback(context);
618 AsyncTestContext testCtx;
620 const char *dirs[1] = {
624 // touch a file : in case of no target file to scan, we cannot cancel to scan.
625 Test::touch_file(TEST_FILE_HIGH);
627 ASSERT_IF(csr_cs_scan_dirs_async(context, dirs,
628 sizeof(dirs) / sizeof(const char *), &testCtx),
631 // TODO: check the reason
632 // Without sleep, sometimes the first run of this TC fails with core dump.
633 std::this_thread::sleep_for(std::chrono::milliseconds(100));
635 ASSERT_IF(csr_cs_cancel_scanning(context), CSR_ERROR_NONE);
637 std::this_thread::sleep_for(std::chrono::milliseconds(100));
639 //scanned, detected, completed, cancelled, error
640 ASSERT_CALLBACK(testCtx, -1, 0, 0, 1, 0);
645 BOOST_AUTO_TEST_CASE(scan_cancel_negative)
647 EXCEPTION_GUARD_START
649 auto c = Test::Context<csr_cs_context_h>();
650 auto context = c.get();
652 ASSERT_IF(csr_cs_cancel_scanning(nullptr), CSR_ERROR_INVALID_HANDLE);
653 ASSERT_IF(csr_cs_cancel_scanning(context), CSR_ERROR_NO_TASK);
658 BOOST_AUTO_TEST_CASE(delta_scan_basic)
660 EXCEPTION_GUARD_START
662 Test::initialize_db();
664 auto c = Test::Context<csr_cs_context_h>();
665 auto context = c.get();
667 install_test_files();
670 set_default_callback(context);
673 AsyncTestContext testBaseCtx;
675 ASSERT_IF(csr_cs_scan_dir_async(context, TEST_DIR_APPS, &testBaseCtx), CSR_ERROR_NONE);
677 std::unique_lock<std::mutex> lBase(testBaseCtx.m);
678 testBaseCtx.cv.wait(lBase);
681 // scanned, detected, completed, cancelled, error
682 ASSERT_CALLBACK(testBaseCtx, -1, 3, 1, 0, 0);
683 BOOST_REQUIRE_MESSAGE(testBaseCtx.scannedCnt != 0,
684 "Base Scan count should not be zero");
686 // Rescan the same dir
687 AsyncTestContext testRescanCtx;
689 ASSERT_IF(csr_cs_scan_dir_async(context, TEST_DIR_APPS, &testRescanCtx),
692 std::unique_lock<std::mutex> lRescan(testRescanCtx.m);
693 testRescanCtx.cv.wait(lRescan);
696 // scanned, detected, completed, cancelled, error
697 ASSERT_CALLBACK(testRescanCtx, 0, 3, 1, 0, 0);
699 ASSERT_DETECTED_IN_LIST(testRescanCtx.detectedList,
700 TEST_WGT_APP_ROOT, MALWARE_HIGH_NAME, MALWARE_HIGH_SEVERITY, MALWARE_HIGH_DETAILED_URL);
701 ASSERT_DETECTED_IN_LIST_EXT(testRescanCtx.detectedList,
702 TEST_WGT_APP_ROOT, true, TEST_WGT_PKG_ID);
704 ASSERT_DETECTED_IN_LIST(testRescanCtx.detectedList,
705 TEST_TPK_APP_ROOT, MALWARE_HIGH_NAME, MALWARE_HIGH_SEVERITY, MALWARE_HIGH_DETAILED_URL);
706 ASSERT_DETECTED_IN_LIST_EXT(testRescanCtx.detectedList,
707 TEST_TPK_APP_ROOT, true, TEST_TPK_PKG_ID);
709 ASSERT_DETECTED_IN_LIST(testRescanCtx.detectedList,
710 TEST_FAKE_APP_FILE, MALWARE_HIGH_NAME, MALWARE_HIGH_SEVERITY, MALWARE_HIGH_DETAILED_URL);
711 ASSERT_DETECTED_IN_LIST_EXT(testRescanCtx.detectedList,
712 TEST_FAKE_APP_FILE, false, nullptr);
714 // Rescan the sub dir
715 AsyncTestContext testRescanSubCtx;
717 ASSERT_IF(csr_cs_scan_dir_async(context, TEST_WGT_APP_ROOT, &testRescanSubCtx), CSR_ERROR_NONE);
719 std::unique_lock<std::mutex> lRescanSub(testRescanSubCtx.m);
720 testRescanSubCtx.cv.wait(lRescanSub);
723 // scanned, detected, completed, cancelled, error
724 ASSERT_CALLBACK(testRescanSubCtx, 0, 1, 1, 0, 0);
726 ASSERT_DETECTED_IN_LIST(testRescanSubCtx.detectedList,
727 TEST_WGT_APP_ROOT, MALWARE_HIGH_NAME, MALWARE_HIGH_SEVERITY, MALWARE_HIGH_DETAILED_URL);
728 ASSERT_DETECTED_IN_LIST_EXT(testRescanSubCtx.detectedList,
729 TEST_WGT_APP_ROOT, true, TEST_WGT_PKG_ID);
731 uninstall_test_apps();
736 BOOST_AUTO_TEST_CASE(delta_scan_changed_after_scan)
738 EXCEPTION_GUARD_START
740 Test::initialize_db();
742 auto c = Test::Context<csr_cs_context_h>();
743 auto context = c.get();
745 install_test_files();
748 set_default_callback(context);
751 AsyncTestContext testBaseCtx;
753 ASSERT_IF(csr_cs_scan_dir_async(context, TEST_DIR_APPS, &testBaseCtx), CSR_ERROR_NONE);
755 std::unique_lock<std::mutex> lBase(testBaseCtx.m);
756 testBaseCtx.cv.wait(lBase);
759 // scanned, detected, completed, cancelled, error
760 ASSERT_CALLBACK(testBaseCtx, -1, 3, 1, 0, 0);
761 BOOST_REQUIRE_MESSAGE(testBaseCtx.scannedCnt != 0,
762 "Base Scan count should not be zero");
765 Test::uninstall_app(TEST_SAFE_WGT_PKG_ID);
766 ASSERT_INSTALL_APP(TEST_SAFE_WGT_PATH, TEST_SAFE_WGT_TYPE);
768 // Rescan the same dir
769 AsyncTestContext testRescanCtx;
771 ASSERT_IF(csr_cs_scan_dir_async(context, TEST_DIR_APPS, &testRescanCtx),
774 std::unique_lock<std::mutex> lRescan(testRescanCtx.m);
775 testRescanCtx.cv.wait(lRescan);
778 // scanned, detected, completed, cancelled, error
779 ASSERT_CALLBACK(testRescanCtx, 1, 3, 1, 0, 0);
781 ASSERT_DETECTED_IN_LIST(testRescanCtx.detectedList,
782 TEST_WGT_APP_ROOT, MALWARE_HIGH_NAME, MALWARE_HIGH_SEVERITY, MALWARE_HIGH_DETAILED_URL);
783 ASSERT_DETECTED_IN_LIST_EXT(testRescanCtx.detectedList,
784 TEST_WGT_APP_ROOT, true, TEST_WGT_PKG_ID);
786 ASSERT_DETECTED_IN_LIST(testRescanCtx.detectedList,
787 TEST_TPK_APP_ROOT, MALWARE_HIGH_NAME, MALWARE_HIGH_SEVERITY, MALWARE_HIGH_DETAILED_URL);
788 ASSERT_DETECTED_IN_LIST_EXT(testRescanCtx.detectedList,
789 TEST_TPK_APP_ROOT, true, TEST_TPK_PKG_ID);
791 ASSERT_DETECTED_IN_LIST(testRescanCtx.detectedList,
792 TEST_FAKE_APP_FILE, MALWARE_HIGH_NAME, MALWARE_HIGH_SEVERITY, MALWARE_HIGH_DETAILED_URL);
793 ASSERT_DETECTED_IN_LIST_EXT(testRescanCtx.detectedList,
794 TEST_FAKE_APP_FILE, false, nullptr);
796 uninstall_test_apps();
801 BOOST_AUTO_TEST_CASE(canonicalize_files_absolute_path)
803 EXCEPTION_GUARD_START
805 Test::initialize_db();
807 auto c = Test::Context<csr_cs_context_h>();
808 auto context = c.get();
810 install_test_files();
812 set_default_callback(context);
814 // four files are all same as realpath.
815 const char *files[4] = {
817 TEST_DIR "/./test_normal_file",
818 TEST_DIR "/.././././csr-test/test_normal_file",
819 TEST_DIR "/././.././csr-test/test_normal_file"
822 AsyncTestContext testCtx;
824 ASSERT_IF(csr_cs_scan_files_async(context, files, sizeof(files) / sizeof(const char *),
828 std::unique_lock<std::mutex> l(testCtx.m);
832 ASSERT_CALLBACK(testCtx, 1, 0, 1, 0, 0);
833 ASSERT_IF(testCtx.scannedList.size(), static_cast<std::size_t>(1));
834 ASSERT_IF(testCtx.scannedList.front(), static_cast<const char *>(TEST_FILE_NORMAL));
839 BOOST_AUTO_TEST_CASE(canonicalize_files_relative_path)
841 EXCEPTION_GUARD_START
843 Test::initialize_db();
845 auto c = Test::Context<csr_cs_context_h>();
846 auto context = c.get();
848 install_test_files();
850 set_default_callback(context);
852 // four files are all same as realpath.
853 const char *files[4] = {
855 "./test_normal_file",
856 ".././././csr-test/test_normal_file",
857 "././.././csr-test/test_normal_file"
860 AsyncTestContext testCtx;
862 Test::ScopedChDir scopedCd(TEST_DIR);
864 ASSERT_IF(csr_cs_scan_files_async(context, files, sizeof(files) / sizeof(const char *),
868 std::unique_lock<std::mutex> l(testCtx.m);
872 ASSERT_CALLBACK(testCtx, 1, 0, 1, 0, 0);
873 ASSERT_IF(testCtx.scannedList.size(), static_cast<std::size_t>(1));
874 ASSERT_IF(testCtx.scannedList.front(), static_cast<const char *>(TEST_FILE_NORMAL));
879 BOOST_AUTO_TEST_CASE(multiple_async_dispatch_negative)
881 EXCEPTION_GUARD_START
883 Test::initialize_db();
885 auto c = Test::Context<csr_cs_context_h>();
886 auto context = c.get();
888 install_test_files();
891 set_default_callback(context);
893 AsyncTestContext testCtx;
895 // first call. it'll running in background asynchronously.
896 ASSERT_SUCCESS(csr_cs_scan_dir_async(context, TEST_DIR_APPS, &testCtx));
898 AsyncTestContext testCtx2;
900 // second call while first call is running in background. It should blocked because
901 // only one operation can be running asynchronously on one handle.
902 ASSERT_IF(csr_cs_scan_dir_async(context, TEST_DIR_APPS, &testCtx2),
905 std::unique_lock<std::mutex> l(testCtx.m);
909 ASSERT_CALLBACK(testCtx, -1, 3, 1, 0, 0);
914 BOOST_AUTO_TEST_SUITE_END()