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) \
36 std::unique_lock<std::mutex> l(actual.m); \
37 if (!actual.isDone()) { \
42 ASSERT_IF_MSG(actual.scannedCnt, scan, "scanned count mismatch."); \
44 ASSERT_IF_MSG(actual.detectedCnt, detect, "detected count mismatch."); \
46 ASSERT_IF_MSG(actual.completedCnt, complete, "completed count mismatch."); \
48 ASSERT_IF_MSG(actual.cancelledCnt, cancel, "cancelled count mismatch."); \
50 ASSERT_IF_MSG(actual.errorCnt, error, "error count mismatch."); \
56 struct AsyncTestContext {
59 std::condition_variable cv;
65 std::vector<std::string> scannedList;
66 std::vector<csr_cs_malware_h> detectedList;
70 AsyncTestContext(bool raceTest = false) :
76 apiReturned(!raceTest) {}
78 bool isDone(void) const {
79 return this->completedCnt != 0 || this->cancelledCnt != 0 || this->errorCnt != 0;
83 void on_scanned(const char *file, void *userdata)
85 auto ctx = reinterpret_cast<AsyncTestContext *>(userdata);
87 BOOST_REQUIRE_MESSAGE(ctx->apiReturned,
88 "API not returned yet but scanned callback called on file: " << file);
90 BOOST_MESSAGE("on_scanned. file[" << file << "] scanned!");
92 std::lock_guard<std::mutex> l(ctx->m_vec);
95 ctx->scannedList.push_back(file);
98 void on_detected(csr_cs_malware_h detected, void *userdata)
100 auto ctx = reinterpret_cast<AsyncTestContext *>(userdata);
102 BOOST_REQUIRE_MESSAGE(ctx->apiReturned,
103 "API not returned yet but detected callback called");
105 Test::ScopedCstr file_name;
106 ASSERT_SUCCESS(csr_cs_malware_get_file_name(detected, &file_name.ptr));
107 BOOST_MESSAGE("on_detected. file[" << file_name.ptr << "] detected!");
109 std::lock_guard<std::mutex> l(ctx->m_vec);
112 ctx->detectedList.push_back(detected);
115 void on_error(int ec, void *userdata)
117 auto ctx = reinterpret_cast<AsyncTestContext *>(userdata);
119 BOOST_REQUIRE_MESSAGE(ctx->apiReturned,
120 "API not returned yet but error callback called with error: " <<
121 Test::capi_ec_to_string(ec));
123 BOOST_MESSAGE("on_error. async request done with error: " <<
124 Test::capi_ec_to_string(ec));
128 ctx->cv.notify_one();
131 void on_completed(void *userdata)
133 auto ctx = reinterpret_cast<AsyncTestContext *>(userdata);
135 BOOST_REQUIRE_MESSAGE(ctx->apiReturned,
136 "API not returned yet but completed callback called");
138 BOOST_MESSAGE("on_completed. async request completed succesfully.");
140 ctx->cv.notify_one();
143 void on_cancelled(void *userdata)
145 auto ctx = reinterpret_cast<AsyncTestContext *>(userdata);
147 BOOST_REQUIRE_MESSAGE(ctx->apiReturned,
148 "API not returned yet but cancelled callback called");
150 BOOST_MESSAGE("on_cancelled. async request canceled!");
152 ctx->cv.notify_one();
155 void set_default_callback(csr_cs_context_h context)
157 ASSERT_SUCCESS(csr_cs_set_detected_cb(context, on_detected));
158 ASSERT_SUCCESS(csr_cs_set_completed_cb(context, on_completed));
159 ASSERT_SUCCESS(csr_cs_set_cancelled_cb(context, on_cancelled));
160 ASSERT_SUCCESS(csr_cs_set_error_cb(context, on_error));
161 ASSERT_SUCCESS(csr_cs_set_file_scanned_cb(context, on_scanned));
164 void install_test_files()
166 Test::copy_file(TEST_FILE_HIGH, TEST_FILE_MEDIA());
167 Test::copy_file(TEST_FILE_HIGH, TEST_FILE_TMP);
169 Test::make_dir(TEST_FAKE_APP_ROOT());
170 Test::copy_file(TEST_FILE_HIGH, TEST_FAKE_APP_FILE());
173 void uninstall_test_files()
175 Test::remove_file(TEST_FILE_MEDIA());
176 Test::remove_file(TEST_FILE_TMP);
177 Test::remove_file(TEST_FAKE_APP_FILE());
178 Test::remove_file(TEST_FAKE_APP_ROOT());
181 void uninstall_test_apps()
183 Test::uninstall_app(TEST_WGT_PKG_ID);
184 Test::uninstall_app(TEST_TPK_PKG_ID);
185 Test::uninstall_app(TEST_SAFE_WGT_PKG_ID);
188 void install_test_apps()
190 uninstall_test_apps();
192 ASSERT_INSTALL_APP(TEST_WGT_PATH, TEST_WGT_TYPE);
193 ASSERT_INSTALL_APP(TEST_TPK_PATH, TEST_TPK_TYPE);
194 ASSERT_INSTALL_APP(TEST_SAFE_WGT_PATH, TEST_SAFE_WGT_TYPE);
197 } // end of namespace
199 BOOST_AUTO_TEST_SUITE(API_CONTENT_SCREENING_ASYNC)
201 BOOST_AUTO_TEST_CASE(set_callbacks_positive)
203 EXCEPTION_GUARD_START
205 auto c = Test::Context<csr_cs_context_h>();
206 auto context = c.get();
208 set_default_callback(context);
213 BOOST_AUTO_TEST_CASE(set_callbacks_negative)
215 EXCEPTION_GUARD_START
217 auto c = Test::Context<csr_cs_context_h>();
218 auto context = c.get();
220 ASSERT_IF(csr_cs_set_detected_cb(nullptr, on_detected), CSR_ERROR_INVALID_HANDLE);
221 ASSERT_IF(csr_cs_set_detected_cb(context, nullptr), CSR_ERROR_INVALID_PARAMETER);
222 ASSERT_IF(csr_cs_set_completed_cb(nullptr, on_completed), CSR_ERROR_INVALID_HANDLE);
223 ASSERT_IF(csr_cs_set_completed_cb(context, nullptr), CSR_ERROR_INVALID_PARAMETER);
224 ASSERT_IF(csr_cs_set_cancelled_cb(nullptr, on_cancelled), CSR_ERROR_INVALID_HANDLE);
225 ASSERT_IF(csr_cs_set_cancelled_cb(context, nullptr), CSR_ERROR_INVALID_PARAMETER);
226 ASSERT_IF(csr_cs_set_error_cb(nullptr, on_error), CSR_ERROR_INVALID_HANDLE);
227 ASSERT_IF(csr_cs_set_error_cb(context, nullptr), CSR_ERROR_INVALID_PARAMETER);
228 ASSERT_IF(csr_cs_set_file_scanned_cb(nullptr, on_scanned), CSR_ERROR_INVALID_HANDLE);
229 ASSERT_IF(csr_cs_set_file_scanned_cb(context, nullptr), CSR_ERROR_INVALID_PARAMETER);
234 BOOST_AUTO_TEST_CASE(scan_files_async_positive)
236 EXCEPTION_GUARD_START
238 auto c = Test::Context<csr_cs_context_h>();
239 auto context = c.get();
241 set_default_callback(context);
243 const char *files[4] = {
250 AsyncTestContext testCtx;
252 ASSERT_SUCCESS(csr_cs_scan_files_async(context, files, 4, &testCtx));
254 ASSERT_CALLBACK(testCtx, -1, 3, 1, 0, 0);
256 ASSERT_DETECTED_IN_LIST(testCtx.detectedList,
257 TEST_FILE_HIGH, MALWARE_HIGH_NAME, MALWARE_HIGH_SEVERITY, MALWARE_HIGH_DETAILED_URL);
258 ASSERT_DETECTED_IN_LIST_EXT(testCtx.detectedList, TEST_FILE_HIGH, false, "");
260 ASSERT_DETECTED_IN_LIST(testCtx.detectedList, TEST_FILE_MEDIUM, MALWARE_MEDIUM_NAME,
261 MALWARE_MEDIUM_SEVERITY, MALWARE_MEDIUM_DETAILED_URL);
262 ASSERT_DETECTED_IN_LIST_EXT(testCtx.detectedList, TEST_FILE_MEDIUM, false, "");
264 ASSERT_DETECTED_IN_LIST(testCtx.detectedList, TEST_FILE_LOW, MALWARE_LOW_NAME,
265 MALWARE_LOW_SEVERITY, MALWARE_LOW_DETAILED_URL);
266 ASSERT_DETECTED_IN_LIST_EXT(testCtx.detectedList, TEST_FILE_LOW, false, "");
271 BOOST_AUTO_TEST_CASE(scan_files_async_negative)
273 EXCEPTION_GUARD_START
275 auto c = Test::Context<csr_cs_context_h>();
276 auto context = c.get();
278 const char *files[3] = {
284 AsyncTestContext testCtx;
286 ASSERT_IF(csr_cs_scan_files_async(nullptr, files, 3, nullptr), CSR_ERROR_INVALID_HANDLE);
287 ASSERT_IF(csr_cs_scan_files_async(context, nullptr, 3, nullptr), CSR_ERROR_INVALID_PARAMETER);
292 BOOST_AUTO_TEST_CASE(scan_dir_positive)
294 EXCEPTION_GUARD_START
296 auto c = Test::Context<csr_cs_context_h>();
297 auto context = c.get();
299 set_default_callback(context);
301 AsyncTestContext testCtx;
303 ASSERT_SUCCESS(csr_cs_scan_dir_async(context, TEST_DIR_MALWARES, &testCtx));
305 //scanned, detected, completed, cancelled, error
306 ASSERT_CALLBACK(testCtx, -1, -1, 1, 0, 0);
307 ASSERT_DETECTED_IN_LIST(testCtx.detectedList, TEST_FILE_UNREMOVABLE,
308 MALWARE_HIGH_NAME, MALWARE_HIGH_SEVERITY,
309 MALWARE_HIGH_DETAILED_URL);
310 ASSERT_DETECTED_IN_LIST_EXT(testCtx.detectedList, TEST_FILE_UNREMOVABLE, false, "");
315 BOOST_AUTO_TEST_CASE(scan_dir_negative)
317 EXCEPTION_GUARD_START
319 auto c = Test::Context<csr_cs_context_h>();
320 auto context = c.get();
322 AsyncTestContext testCtx;
324 ASSERT_IF(csr_cs_scan_dir_async(nullptr, TEST_DIR_MALWARES, nullptr), CSR_ERROR_INVALID_HANDLE);
325 ASSERT_IF(csr_cs_scan_dir_async(context, nullptr, nullptr), CSR_ERROR_INVALID_PARAMETER);
330 BOOST_AUTO_TEST_CASE(scan_dir_root)
332 EXCEPTION_GUARD_START
334 auto c = Test::Context<csr_cs_context_h>();
335 auto context = c.get();
337 install_test_files();
340 set_default_callback(context);
342 AsyncTestContext testCtx;
344 ASSERT_SUCCESS(csr_cs_scan_dir_async(context, TEST_DIR_ROOT, &testCtx));
346 //scanned, detected, completed, cancelled, error
347 ASSERT_CALLBACK(testCtx, -1, -1, 1, 0, 0);
349 Test::uninstall_app(TEST_WGT_PKG_ID);
350 Test::uninstall_app(TEST_TPK_PKG_ID);
352 std::string homeDirPrefix;
353 #ifdef PLATFORM_VERSION_3
354 // "/home" is symlinked of "/opt/home" so in root directory scanning,
355 // user directory prefix("/opt") is additionally needed to check file_name field
357 homeDirPrefix = "/opt";
360 ASSERT_DETECTED_IN_LIST(testCtx.detectedList, TEST_FILE_HIGH, MALWARE_HIGH_NAME,
361 MALWARE_HIGH_SEVERITY, MALWARE_HIGH_DETAILED_URL);
362 ASSERT_DETECTED_IN_LIST_EXT(testCtx.detectedList, TEST_FILE_HIGH, false, "");
364 ASSERT_DETECTED_IN_LIST(testCtx.detectedList, homeDirPrefix + TEST_FILE_MEDIA(),
365 MALWARE_HIGH_NAME, MALWARE_HIGH_SEVERITY,
366 MALWARE_HIGH_DETAILED_URL);
367 ASSERT_DETECTED_IN_LIST_EXT(testCtx.detectedList, homeDirPrefix + TEST_FILE_MEDIA(),
370 ASSERT_DETECTED_IN_LIST(testCtx.detectedList, TEST_FILE_TMP, MALWARE_HIGH_NAME,
371 MALWARE_HIGH_SEVERITY, MALWARE_HIGH_DETAILED_URL);
372 ASSERT_DETECTED_IN_LIST_EXT(testCtx.detectedList, TEST_FILE_TMP, false, "");
374 ASSERT_DETECTED_IN_LIST(testCtx.detectedList, homeDirPrefix + TEST_WGT_APP_ROOT(),
375 MALWARE_HIGH_NAME, MALWARE_HIGH_SEVERITY,
376 MALWARE_HIGH_DETAILED_URL);
377 ASSERT_DETECTED_IN_LIST_EXT(testCtx.detectedList, homeDirPrefix + TEST_WGT_APP_ROOT(),
378 true, TEST_WGT_PKG_ID);
380 ASSERT_DETECTED_IN_LIST(testCtx.detectedList, homeDirPrefix + TEST_TPK_APP_ROOT(),
381 MALWARE_HIGH_NAME, MALWARE_HIGH_SEVERITY,
382 MALWARE_HIGH_DETAILED_URL);
383 ASSERT_DETECTED_IN_LIST_EXT(testCtx.detectedList, homeDirPrefix + TEST_TPK_APP_ROOT(),
384 true, TEST_TPK_PKG_ID);
386 ASSERT_DETECTED_IN_LIST(testCtx.detectedList, homeDirPrefix + TEST_FAKE_APP_FILE(),
387 MALWARE_HIGH_NAME, MALWARE_HIGH_SEVERITY,
388 MALWARE_HIGH_DETAILED_URL);
389 ASSERT_DETECTED_IN_LIST_EXT(testCtx.detectedList, homeDirPrefix + TEST_FAKE_APP_FILE(),
392 ASSERT_DETECTED_IN_LIST(testCtx.detectedList, TEST_FILE_MEDIUM, MALWARE_MEDIUM_NAME,
393 MALWARE_MEDIUM_SEVERITY, MALWARE_MEDIUM_DETAILED_URL);
394 ASSERT_DETECTED_IN_LIST_EXT(testCtx.detectedList, TEST_FILE_MEDIUM, false, "");
396 ASSERT_DETECTED_IN_LIST(testCtx.detectedList, TEST_FILE_LOW, MALWARE_LOW_NAME,
397 MALWARE_LOW_SEVERITY, MALWARE_LOW_DETAILED_URL);
398 ASSERT_DETECTED_IN_LIST_EXT(testCtx.detectedList, TEST_FILE_LOW, false, "");
403 BOOST_AUTO_TEST_CASE(scan_dir_media)
405 EXCEPTION_GUARD_START
407 auto c = Test::Context<csr_cs_context_h>();
408 auto context = c.get();
410 install_test_files();
412 set_default_callback(context);
414 AsyncTestContext testCtx;
416 ASSERT_SUCCESS(csr_cs_scan_dir_async(context, TEST_DIR_MEDIA(), &testCtx));
418 // scanned, detected, completed, cancelled, error
419 ASSERT_CALLBACK(testCtx, -1, 1, 1, 0, 0);
421 ASSERT_DETECTED_IN_LIST(testCtx.detectedList, TEST_FILE_MEDIA(), MALWARE_HIGH_NAME,
422 MALWARE_HIGH_SEVERITY, MALWARE_HIGH_DETAILED_URL);
423 ASSERT_DETECTED_IN_LIST_EXT(testCtx.detectedList, TEST_FILE_MEDIA(), false, "");
428 BOOST_AUTO_TEST_CASE(scan_dir_tmp)
430 EXCEPTION_GUARD_START
432 auto c = Test::Context<csr_cs_context_h>();
433 auto context = c.get();
435 install_test_files();
437 set_default_callback(context);
439 AsyncTestContext testCtx;
441 ASSERT_SUCCESS(csr_cs_scan_dir_async(context, TEST_DIR_TMP, &testCtx));
443 //scanned, detected, completed, cancelled, error
444 ASSERT_CALLBACK(testCtx, -1, 1, 1, 0, 0);
446 ASSERT_DETECTED_IN_LIST(testCtx.detectedList, TEST_FILE_TMP, MALWARE_HIGH_NAME,
447 MALWARE_HIGH_SEVERITY, MALWARE_HIGH_DETAILED_URL);
448 ASSERT_DETECTED_IN_LIST_EXT(testCtx.detectedList, TEST_FILE_TMP, false, "");
453 BOOST_AUTO_TEST_CASE(scan_dir_apps)
455 EXCEPTION_GUARD_START
457 auto c = Test::Context<csr_cs_context_h>();
458 auto context = c.get();
460 install_test_files();
463 set_default_callback(context);
465 AsyncTestContext testCtx;
467 ASSERT_SUCCESS(csr_cs_scan_dir_async(context, TEST_DIR_APPS(), &testCtx));
469 //scanned, detected, completed, cancelled, error
470 ASSERT_CALLBACK(testCtx, -1, 3, 1, 0, 0);
472 ASSERT_DETECTED_IN_LIST(testCtx.detectedList, TEST_WGT_APP_ROOT(), MALWARE_HIGH_NAME,
473 MALWARE_HIGH_SEVERITY, MALWARE_HIGH_DETAILED_URL);
474 ASSERT_DETECTED_IN_LIST_EXT(testCtx.detectedList, TEST_WGT_APP_ROOT(), true,
477 ASSERT_DETECTED_IN_LIST(testCtx.detectedList, TEST_TPK_APP_ROOT(), MALWARE_HIGH_NAME,
478 MALWARE_HIGH_SEVERITY, MALWARE_HIGH_DETAILED_URL);
479 ASSERT_DETECTED_IN_LIST_EXT(testCtx.detectedList, TEST_TPK_APP_ROOT(), true,
482 ASSERT_DETECTED_IN_LIST(testCtx.detectedList, TEST_FAKE_APP_FILE(), MALWARE_HIGH_NAME,
483 MALWARE_HIGH_SEVERITY, MALWARE_HIGH_DETAILED_URL);
484 ASSERT_DETECTED_IN_LIST_EXT(testCtx.detectedList, TEST_FAKE_APP_FILE(), false, "");
486 uninstall_test_apps();
491 BOOST_AUTO_TEST_CASE(scan_dir_wgt)
493 EXCEPTION_GUARD_START
495 auto c = Test::Context<csr_cs_context_h>();
496 auto context = c.get();
498 Test::uninstall_app(TEST_WGT_PKG_ID);
499 ASSERT_INSTALL_APP(TEST_WGT_PATH, TEST_WGT_TYPE);
501 set_default_callback(context);
503 AsyncTestContext testCtx;
505 ASSERT_SUCCESS(csr_cs_scan_dir_async(context, TEST_WGT_APP_ROOT(), &testCtx));
507 //scanned, detected, completed, cancelled, error
508 ASSERT_CALLBACK(testCtx, -1, 1, 1, 0, 0);
510 ASSERT_DETECTED_IN_LIST(testCtx.detectedList, TEST_WGT_APP_ROOT(), MALWARE_HIGH_NAME,
511 MALWARE_HIGH_SEVERITY, MALWARE_HIGH_DETAILED_URL);
512 ASSERT_DETECTED_IN_LIST_EXT(testCtx.detectedList, TEST_WGT_APP_ROOT(), true,
515 Test::uninstall_app(TEST_WGT_PKG_ID);
520 BOOST_AUTO_TEST_CASE(scan_dir_tpk)
522 EXCEPTION_GUARD_START
524 auto c = Test::Context<csr_cs_context_h>();
525 auto context = c.get();
527 Test::uninstall_app(TEST_TPK_PKG_ID);
528 ASSERT_INSTALL_APP(TEST_TPK_PATH, TEST_TPK_TYPE);
530 set_default_callback(context);
532 AsyncTestContext testCtx;
534 ASSERT_SUCCESS(csr_cs_scan_dir_async(context, TEST_TPK_APP_ROOT(), &testCtx));
536 //scanned, detected, completed, cancelled, error
537 ASSERT_CALLBACK(testCtx, -1, 1, 1, 0, 0);
539 ASSERT_DETECTED_IN_LIST(testCtx.detectedList, TEST_TPK_APP_ROOT(), MALWARE_HIGH_NAME,
540 MALWARE_HIGH_SEVERITY, MALWARE_HIGH_DETAILED_URL);
541 ASSERT_DETECTED_IN_LIST_EXT(testCtx.detectedList, TEST_TPK_APP_ROOT(), true,
544 Test::uninstall_app(TEST_TPK_PKG_ID);
549 BOOST_AUTO_TEST_CASE(scan_dirs_positive)
551 EXCEPTION_GUARD_START
553 auto c = Test::Context<csr_cs_context_h>();
554 auto context = c.get();
556 set_default_callback(context);
558 AsyncTestContext testCtx;
560 const char *dirs[1] = {
564 ASSERT_SUCCESS(csr_cs_scan_dirs_async(context, dirs, 1, &testCtx));
566 //scanned, detected, completed, cancelled, error
567 ASSERT_CALLBACK(testCtx, -1, -1, 1, 0, 0);
568 ASSERT_DETECTED_IN_LIST(testCtx.detectedList, TEST_FILE_UNREMOVABLE,
569 MALWARE_HIGH_NAME, MALWARE_HIGH_SEVERITY,
570 MALWARE_HIGH_DETAILED_URL);
571 ASSERT_DETECTED_IN_LIST_EXT(testCtx.detectedList, TEST_FILE_UNREMOVABLE, false, "");
576 BOOST_AUTO_TEST_CASE(scan_dirs_negative)
578 EXCEPTION_GUARD_START
580 auto c = Test::Context<csr_cs_context_h>();
581 auto context = c.get();
583 const char *dirs[1] = {
587 ASSERT_IF(csr_cs_scan_dirs_async(nullptr, dirs, 1, nullptr), CSR_ERROR_INVALID_HANDLE);
588 ASSERT_IF(csr_cs_scan_dirs_async(context, nullptr, 1, nullptr), CSR_ERROR_INVALID_PARAMETER);
594 BOOST_AUTO_TEST_CASE(scan_cancel_positiive)
596 EXCEPTION_GUARD_START
598 auto c = Test::Context<csr_cs_context_h>();
599 auto context = c.get();
601 set_default_callback(context);
603 AsyncTestContext testCtx;
605 const char *dirs[1] = {
609 // touch a file : in case of no target file to scan, we cannot cancel to scan.
610 Test::touch_file(TEST_FILE_HIGH);
612 ASSERT_SUCCESS(csr_cs_scan_dirs_async(context, dirs, 1, &testCtx));
613 ASSERT_SUCCESS(csr_cs_cancel_scanning(context));
615 //scanned, detected, completed, cancelled, error
616 ASSERT_CALLBACK(testCtx, -1, -1, 0, 1, 0);
621 BOOST_AUTO_TEST_CASE(scan_cancel_negative)
623 EXCEPTION_GUARD_START
625 auto c = Test::Context<csr_cs_context_h>();
626 auto context = c.get();
628 ASSERT_IF(csr_cs_cancel_scanning(nullptr), CSR_ERROR_INVALID_HANDLE);
629 ASSERT_IF(csr_cs_cancel_scanning(context), CSR_ERROR_NO_TASK);
634 BOOST_AUTO_TEST_CASE(delta_scan_basic)
636 EXCEPTION_GUARD_START
638 Test::initialize_db();
640 auto c = Test::Context<csr_cs_context_h>();
641 auto context = c.get();
643 install_test_files();
646 set_default_callback(context);
649 AsyncTestContext testBaseCtx;
651 ASSERT_SUCCESS(csr_cs_scan_dir_async(context, TEST_DIR_APPS(), &testBaseCtx));
653 // scanned, detected, completed, cancelled, error
654 ASSERT_CALLBACK(testBaseCtx, -1, -1, 1, 0, 0);
655 BOOST_REQUIRE_MESSAGE(testBaseCtx.scannedCnt > 0,
656 "Base Scan count should not be zero");
658 ASSERT_DETECTED_IN_LIST(testBaseCtx.detectedList, TEST_WGT_APP_ROOT(),
659 MALWARE_HIGH_NAME, MALWARE_HIGH_SEVERITY,
660 MALWARE_HIGH_DETAILED_URL);
661 ASSERT_DETECTED_IN_LIST_EXT(testBaseCtx.detectedList, TEST_WGT_APP_ROOT(), true,
664 ASSERT_DETECTED_IN_LIST(testBaseCtx.detectedList, TEST_TPK_APP_ROOT(),
665 MALWARE_HIGH_NAME, MALWARE_HIGH_SEVERITY,
666 MALWARE_HIGH_DETAILED_URL);
667 ASSERT_DETECTED_IN_LIST_EXT(testBaseCtx.detectedList, TEST_TPK_APP_ROOT(), true,
670 ASSERT_DETECTED_IN_LIST(testBaseCtx.detectedList, TEST_FAKE_APP_FILE(),
671 MALWARE_HIGH_NAME, MALWARE_HIGH_SEVERITY,
672 MALWARE_HIGH_DETAILED_URL);
673 ASSERT_DETECTED_IN_LIST_EXT(testBaseCtx.detectedList, TEST_FAKE_APP_FILE(), false, "");
675 // Rescan the same dir
676 AsyncTestContext testRescanCtx;
678 ASSERT_SUCCESS(csr_cs_scan_dir_async(context, TEST_DIR_APPS(), &testRescanCtx));
680 // scanned, detected, completed, cancelled, error
681 ASSERT_CALLBACK(testRescanCtx, -1, -1, 1, 0, 0);
682 BOOST_REQUIRE_MESSAGE(testBaseCtx.scannedCnt > testRescanCtx.scannedCnt,
683 "Scan count of the base[" << testBaseCtx.scannedCnt <<
684 "] should be bigger than the delta-scan[" << testRescanCtx.scannedCnt << "]");
686 ASSERT_DETECTED_IN_LIST(testRescanCtx.detectedList, TEST_WGT_APP_ROOT(),
687 MALWARE_HIGH_NAME, MALWARE_HIGH_SEVERITY,
688 MALWARE_HIGH_DETAILED_URL);
689 ASSERT_DETECTED_IN_LIST_EXT(testRescanCtx.detectedList, TEST_WGT_APP_ROOT(), true,
692 ASSERT_DETECTED_IN_LIST(testRescanCtx.detectedList, TEST_TPK_APP_ROOT(),
693 MALWARE_HIGH_NAME, MALWARE_HIGH_SEVERITY,
694 MALWARE_HIGH_DETAILED_URL);
695 ASSERT_DETECTED_IN_LIST_EXT(testRescanCtx.detectedList, TEST_TPK_APP_ROOT(), true,
698 ASSERT_DETECTED_IN_LIST(testRescanCtx.detectedList, TEST_FAKE_APP_FILE(),
699 MALWARE_HIGH_NAME, MALWARE_HIGH_SEVERITY,
700 MALWARE_HIGH_DETAILED_URL);
701 ASSERT_DETECTED_IN_LIST_EXT(testRescanCtx.detectedList, TEST_FAKE_APP_FILE(), false,
704 // Rescan the sub dir
705 AsyncTestContext testRescanSubCtx;
707 ASSERT_SUCCESS(csr_cs_scan_dir_async(context, TEST_WGT_APP_ROOT(), &testRescanSubCtx));
709 // scanned, detected, completed, cancelled, error
710 ASSERT_CALLBACK(testRescanSubCtx, 0, 1, 1, 0, 0);
712 ASSERT_DETECTED_IN_LIST(testRescanSubCtx.detectedList, TEST_WGT_APP_ROOT(),
713 MALWARE_HIGH_NAME, MALWARE_HIGH_SEVERITY,
714 MALWARE_HIGH_DETAILED_URL);
715 ASSERT_DETECTED_IN_LIST_EXT(testRescanSubCtx.detectedList, TEST_WGT_APP_ROOT(), true,
718 uninstall_test_apps();
723 BOOST_AUTO_TEST_CASE(delta_scan_changed_after_scan)
725 EXCEPTION_GUARD_START
727 Test::initialize_db();
729 auto c = Test::Context<csr_cs_context_h>();
730 auto context = c.get();
732 install_test_files();
735 set_default_callback(context);
738 AsyncTestContext testBaseCtx;
740 ASSERT_SUCCESS(csr_cs_scan_dir_async(context, TEST_DIR_APPS(), &testBaseCtx));
742 // scanned, detected, completed, cancelled, error
743 ASSERT_CALLBACK(testBaseCtx, -1, 3, 1, 0, 0);
744 BOOST_REQUIRE_MESSAGE(testBaseCtx.scannedCnt != 0,
745 "Base Scan count should not be zero");
748 Test::uninstall_app(TEST_SAFE_WGT_PKG_ID);
749 ASSERT_INSTALL_APP(TEST_SAFE_WGT_PATH, TEST_SAFE_WGT_TYPE);
751 // Rescan the same dir
752 AsyncTestContext testRescanCtx;
754 ASSERT_SUCCESS(csr_cs_scan_dir_async(context, TEST_DIR_APPS(), &testRescanCtx));
756 // scanned, detected, completed, cancelled, error
757 ASSERT_CALLBACK(testRescanCtx, -1, -1, 1, 0, 0);
758 BOOST_REQUIRE_MESSAGE(testRescanCtx.scannedCnt >= 1,
759 "reinstalled app(non-malicious wgt) should be counted in scanned.");
761 ASSERT_DETECTED_IN_LIST(testRescanCtx.detectedList, TEST_WGT_APP_ROOT(),
762 MALWARE_HIGH_NAME, MALWARE_HIGH_SEVERITY,
763 MALWARE_HIGH_DETAILED_URL);
764 ASSERT_DETECTED_IN_LIST_EXT(testRescanCtx.detectedList, TEST_WGT_APP_ROOT(), true,
767 ASSERT_DETECTED_IN_LIST(testRescanCtx.detectedList, TEST_TPK_APP_ROOT(),
768 MALWARE_HIGH_NAME, MALWARE_HIGH_SEVERITY,
769 MALWARE_HIGH_DETAILED_URL);
770 ASSERT_DETECTED_IN_LIST_EXT(testRescanCtx.detectedList, TEST_TPK_APP_ROOT(), true,
773 ASSERT_DETECTED_IN_LIST(testRescanCtx.detectedList, TEST_FAKE_APP_FILE(),
774 MALWARE_HIGH_NAME, MALWARE_HIGH_SEVERITY,
775 MALWARE_HIGH_DETAILED_URL);
776 ASSERT_DETECTED_IN_LIST_EXT(testRescanCtx.detectedList, TEST_FAKE_APP_FILE(), false,
779 uninstall_test_apps();
784 BOOST_AUTO_TEST_CASE(canonicalize_files_absolute_path)
786 EXCEPTION_GUARD_START
788 Test::initialize_db();
790 auto c = Test::Context<csr_cs_context_h>();
791 auto context = c.get();
793 install_test_files();
795 set_default_callback(context);
797 // four files are all same as realpath.
798 const char *files[4] = {
800 TEST_DIR "/./test_normal_file",
801 TEST_DIR "/.././././csr-test/test_normal_file",
802 TEST_DIR "/././.././csr-test/test_normal_file"
805 AsyncTestContext testCtx;
807 ASSERT_SUCCESS(csr_cs_scan_files_async(context, files, 4, &testCtx));
809 ASSERT_CALLBACK(testCtx, 1, 0, 1, 0, 0);
810 ASSERT_IF(testCtx.scannedList.size(), static_cast<std::size_t>(1));
811 ASSERT_IF(testCtx.scannedList.front(), static_cast<const char *>(TEST_FILE_NORMAL));
816 BOOST_AUTO_TEST_CASE(canonicalize_files_relative_path)
818 EXCEPTION_GUARD_START
820 Test::initialize_db();
822 auto c = Test::Context<csr_cs_context_h>();
823 auto context = c.get();
825 install_test_files();
827 set_default_callback(context);
829 // four files are all same as realpath.
830 const char *files[4] = {
832 "./test_normal_file",
833 ".././././csr-test/test_normal_file",
834 "././.././csr-test/test_normal_file"
837 AsyncTestContext testCtx;
839 Test::ScopedChDir scopedCd(TEST_DIR);
841 ASSERT_SUCCESS(csr_cs_scan_files_async(context, files, 4, &testCtx));
843 ASSERT_CALLBACK(testCtx, 1, 0, 1, 0, 0);
844 ASSERT_IF(testCtx.scannedList.size(), static_cast<std::size_t>(1));
845 ASSERT_IF(testCtx.scannedList.front(), static_cast<const char *>(TEST_FILE_NORMAL));
850 BOOST_AUTO_TEST_CASE(multiple_async_dispatch_negative)
852 EXCEPTION_GUARD_START
854 Test::initialize_db();
856 auto c = Test::Context<csr_cs_context_h>();
857 auto context = c.get();
859 install_test_files();
862 set_default_callback(context);
864 AsyncTestContext testCtx;
866 // first call. it'll running in background asynchronously.
867 ASSERT_SUCCESS(csr_cs_scan_dir_async(context, TEST_DIR_APPS(), &testCtx));
869 AsyncTestContext testCtx2;
871 // second call while first call is running in background. It should blocked because
872 // only one operation can be running asynchronously on one handle.
873 ASSERT_IF(csr_cs_scan_dir_async(context, TEST_DIR_APPS(), &testCtx2), CSR_ERROR_BUSY);
875 ASSERT_CALLBACK(testCtx, -1, 3, 1, 0, 0);
880 BOOST_AUTO_TEST_CASE(get_malware_after_async)
882 EXCEPTION_GUARD_START
884 auto c = Test::Context<csr_cs_context_h>();
885 auto context = c.get();
887 set_default_callback(context);
889 const char *dirs[4] = {
896 csr_cs_malware_list_h malwares = nullptr;
897 csr_cs_malware_h malware = nullptr;
900 ASSERT_SUCCESS(csr_cs_get_detected_malwares(context, dirs, 4, &malwares, &count));
901 BOOST_MESSAGE("detected malware exist count before scanning: " << count);
903 AsyncTestContext testCtx;
905 ASSERT_SUCCESS(csr_cs_scan_dirs_async(context, dirs, 4, &testCtx));
907 ASSERT_CALLBACK(testCtx, -1, -1, -1, -1, -1);
909 BOOST_MESSAGE("scanned count: " << testCtx.scannedCnt);
910 BOOST_MESSAGE("detected count: " << testCtx.detectedCnt);
911 BOOST_MESSAGE("completed count: " << testCtx.completedCnt);
912 BOOST_MESSAGE("cancelled count: " << testCtx.cancelledCnt);
913 BOOST_MESSAGE("error count: " << testCtx.errorCnt);
915 ASSERT_SUCCESS(csr_cs_get_detected_malwares(context, dirs, 4, &malwares, &count));
917 CHECK_IS_NOT_NULL(malwares);
919 for (size_t i = 0; i < count; ++i) {
921 Test::ScopedCstr filepath;
922 ASSERT_SUCCESS(csr_cs_malware_list_get_malware(malwares, i, &malware));
923 CHECK_IS_NOT_NULL(malware);
924 ASSERT_SUCCESS(csr_cs_malware_get_file_name(malware, &filepath.ptr));
925 CHECK_IS_NOT_NULL(filepath.ptr);
926 BOOST_MESSAGE("detect malware from file: " << filepath.ptr);
932 BOOST_AUTO_TEST_CASE(async_api_returning_and_callback_race)
934 EXCEPTION_GUARD_START
936 auto c = Test::Context<csr_cs_context_h>();
937 auto context = c.get();
939 install_test_files();
941 set_default_callback(context);
943 const char *files[2] = {
948 AsyncTestContext testCtx(true);
950 ASSERT_SUCCESS(csr_cs_scan_files_async(context, files, 2, &testCtx));
951 testCtx.apiReturned = true;
953 ASSERT_CALLBACK(testCtx, -1, -1, -1, -1, -1);
958 BOOST_AUTO_TEST_CASE(scan_app_on_cloud)
960 EXCEPTION_GUARD_START
962 BOOST_MESSAGE("Only valid for engines which supports scan on cloud feature");
964 auto c = Test::Context<csr_cs_context_h>();
965 auto context = c.get();
967 install_test_files();
970 set_default_callback(context);
971 ASSERT_SUCCESS(csr_cs_set_scan_on_cloud(context, true));
973 AsyncTestContext testCtx;
975 ASSERT_SUCCESS(csr_cs_scan_dir_async(context, TEST_DIR_APPS(), &testCtx));
977 ASSERT_CALLBACK(testCtx, -1, -1, 1, 0, 0);
979 ASSERT_DETECTED_IN_LIST(testCtx.detectedList, TEST_WGT_APP_ROOT(),
980 MALWARE_HIGH_NAME, MALWARE_HIGH_SEVERITY,
981 MALWARE_HIGH_DETAILED_URL);
982 ASSERT_DETECTED_IN_LIST_EXT(testCtx.detectedList, TEST_WGT_APP_ROOT(), true,
985 ASSERT_DETECTED_IN_LIST(testCtx.detectedList, TEST_TPK_APP_ROOT(),
986 MALWARE_HIGH_NAME, MALWARE_HIGH_SEVERITY,
987 MALWARE_HIGH_DETAILED_URL);
988 ASSERT_DETECTED_IN_LIST_EXT(testCtx.detectedList, TEST_TPK_APP_ROOT(), true,
991 ASSERT_DETECTED_IN_LIST(testCtx.detectedList, TEST_FAKE_APP_FILE(),
992 MALWARE_HIGH_NAME, MALWARE_HIGH_SEVERITY,
993 MALWARE_HIGH_DETAILED_URL);
994 ASSERT_DETECTED_IN_LIST_EXT(testCtx.detectedList, TEST_FAKE_APP_FILE(), false, "");
996 const char *dirs[1] = {
999 csr_cs_malware_list_h malwares = nullptr;
1002 ASSERT_SUCCESS(csr_cs_get_detected_malwares(context, dirs, 1, &malwares, &count));
1003 CHECK_IS_NOT_NULL(malwares);
1005 std::vector<csr_cs_malware_h> malware_vec;
1006 for (size_t i = 0; i < count; ++i) {
1007 csr_cs_malware_h malware = nullptr;
1008 ASSERT_SUCCESS(csr_cs_malware_list_get_malware(malwares, i, &malware));
1010 malware_vec.push_back(malware);
1013 ASSERT_DETECTED_IN_LIST(malware_vec, TEST_WGT_APP_ROOT(), MALWARE_HIGH_NAME,
1014 MALWARE_HIGH_SEVERITY, MALWARE_HIGH_DETAILED_URL);
1015 ASSERT_DETECTED_IN_LIST_EXT(malware_vec, TEST_WGT_APP_ROOT(), true, TEST_WGT_PKG_ID);
1017 ASSERT_DETECTED_IN_LIST(malware_vec, TEST_TPK_APP_ROOT(), MALWARE_HIGH_NAME,
1018 MALWARE_HIGH_SEVERITY, MALWARE_HIGH_DETAILED_URL);
1019 ASSERT_DETECTED_IN_LIST_EXT(malware_vec, TEST_TPK_APP_ROOT(), true, TEST_TPK_PKG_ID);
1021 ASSERT_DETECTED_IN_LIST(malware_vec, TEST_FAKE_APP_FILE(), MALWARE_HIGH_NAME,
1022 MALWARE_HIGH_SEVERITY, MALWARE_HIGH_DETAILED_URL);
1023 ASSERT_DETECTED_IN_LIST_EXT(malware_vec, TEST_FAKE_APP_FILE(), false, "");
1028 BOOST_AUTO_TEST_SUITE_END()