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>
29 #include <boost/test/unit_test.hpp>
31 #include "test-common.h"
32 #include "test-helper.h"
33 #include "test-resource.h"
35 #define ASSERT_CALLBACK(actual, scan, detect, complete, cancel, error) \
37 std::unique_lock<std::mutex> l(actual.m); \
38 if (!actual.isDone()) { \
43 ASSERT_IF_MSG(actual.completedCnt, complete, \
44 "completed count mismatch! " \
45 "Async isn't successfully completed!"); \
47 ASSERT_IF_MSG(actual.cancelledCnt, cancel, "cancelled count mismatch."); \
49 ASSERT_IF_MSG(actual.errorCnt, error, "error count mismatch."); \
51 ASSERT_IF_MSG(actual.detectedCnt, detect, "detected count mismatch."); \
53 ASSERT_IF_MSG(actual.scannedCnt, scan, "scanned count mismatch."); \
59 struct AsyncTestContext {
62 std::condition_variable cv;
68 std::vector<std::string> scannedList;
69 std::vector<csr_cs_malware_h> detectedList;
73 AsyncTestContext(bool raceTest) :
79 apiReturned(!raceTest) {}
89 bool isDone(void) const {
90 return this->completedCnt != 0 || this->cancelledCnt != 0 || this->errorCnt != 0;
94 void on_scanned(const char *file, void *userdata)
96 auto ctx = reinterpret_cast<AsyncTestContext *>(userdata);
98 BOOST_REQUIRE_MESSAGE(ctx->apiReturned,
99 "API not returned yet but scanned callback called on file: " << file);
101 BOOST_MESSAGE("on_scanned. file[" << file << "] scanned!");
103 std::lock_guard<std::mutex> l(ctx->m_vec);
106 ctx->scannedList.push_back(file);
109 void on_detected(csr_cs_malware_h detected, void *userdata)
111 auto ctx = reinterpret_cast<AsyncTestContext *>(userdata);
113 BOOST_REQUIRE_MESSAGE(ctx->apiReturned,
114 "API not returned yet but detected callback called");
116 Test::ScopedCstr file_name;
117 ASSERT_SUCCESS(csr_cs_malware_get_file_name(detected, &file_name.ptr));
118 BOOST_MESSAGE("on_detected. file[" << file_name.ptr << "] detected!");
120 std::lock_guard<std::mutex> l(ctx->m_vec);
123 ctx->detectedList.push_back(detected);
126 void on_error(int ec, void *userdata)
128 auto ctx = reinterpret_cast<AsyncTestContext *>(userdata);
130 BOOST_REQUIRE_MESSAGE(ctx->apiReturned,
131 "API not returned yet but error callback called with error: " <<
132 Test::capi_ec_to_string(ec));
134 BOOST_MESSAGE("on_error. async request done with error: " <<
135 Test::capi_ec_to_string(ec));
139 ctx->cv.notify_one();
142 void on_completed(void *userdata)
144 auto ctx = reinterpret_cast<AsyncTestContext *>(userdata);
146 BOOST_REQUIRE_MESSAGE(ctx->apiReturned,
147 "API not returned yet but completed callback called");
149 BOOST_MESSAGE("on_completed. async request completed succesfully.");
151 ctx->cv.notify_one();
154 void on_cancelled(void *userdata)
156 auto ctx = reinterpret_cast<AsyncTestContext *>(userdata);
158 BOOST_REQUIRE_MESSAGE(ctx->apiReturned,
159 "API not returned yet but cancelled callback called");
161 BOOST_MESSAGE("on_cancelled. async request canceled!");
163 ctx->cv.notify_one();
166 void set_default_callback(csr_cs_context_h context)
168 ASSERT_SUCCESS(csr_cs_set_detected_cb(context, on_detected));
169 ASSERT_SUCCESS(csr_cs_set_completed_cb(context, on_completed));
170 ASSERT_SUCCESS(csr_cs_set_cancelled_cb(context, on_cancelled));
171 ASSERT_SUCCESS(csr_cs_set_error_cb(context, on_error));
172 ASSERT_SUCCESS(csr_cs_set_file_scanned_cb(context, on_scanned));
175 void install_test_files()
177 Test::copy_file(TEST_FILE_HIGH, TEST_FILE_MEDIA());
178 Test::copy_file(TEST_FILE_HIGH, TEST_FILE_TMP);
180 Test::make_dir(TEST_FAKE_APP_ROOT());
181 Test::copy_file(TEST_FILE_HIGH, TEST_FAKE_APP_FILE());
184 void uninstall_test_files()
186 Test::remove_file(TEST_FILE_MEDIA());
187 Test::remove_file(TEST_FILE_TMP);
188 Test::remove_file(TEST_FAKE_APP_FILE());
189 Test::remove_file(TEST_FAKE_APP_ROOT());
192 void uninstall_test_apps()
194 Test::uninstall_app(TEST_WGT_PKG_ID);
195 Test::uninstall_app(TEST_TPK_PKG_ID);
196 Test::uninstall_app(TEST_SAFE_WGT_PKG_ID);
199 void install_test_apps()
201 uninstall_test_apps();
203 ASSERT_INSTALL_APP(TEST_WGT_PATH, TEST_WGT_TYPE);
204 ASSERT_INSTALL_APP(TEST_TPK_PATH, TEST_TPK_TYPE);
205 ASSERT_INSTALL_APP(TEST_SAFE_WGT_PATH, TEST_SAFE_WGT_TYPE);
208 } // end of namespace
210 BOOST_AUTO_TEST_SUITE(API_CONTENT_SCREENING_ASYNC)
212 BOOST_AUTO_TEST_CASE(set_callbacks_positive)
214 EXCEPTION_GUARD_START
216 auto c = Test::Context<csr_cs_context_h>();
217 auto context = c.get();
219 set_default_callback(context);
224 BOOST_AUTO_TEST_CASE(set_callbacks_negative)
226 EXCEPTION_GUARD_START
228 auto c = Test::Context<csr_cs_context_h>();
229 auto context = c.get();
231 ASSERT_IF(csr_cs_set_detected_cb(nullptr, on_detected), CSR_ERROR_INVALID_HANDLE);
232 ASSERT_IF(csr_cs_set_detected_cb(context, nullptr), CSR_ERROR_INVALID_PARAMETER);
233 ASSERT_IF(csr_cs_set_completed_cb(nullptr, on_completed), CSR_ERROR_INVALID_HANDLE);
234 ASSERT_IF(csr_cs_set_completed_cb(context, nullptr), CSR_ERROR_INVALID_PARAMETER);
235 ASSERT_IF(csr_cs_set_cancelled_cb(nullptr, on_cancelled), CSR_ERROR_INVALID_HANDLE);
236 ASSERT_IF(csr_cs_set_cancelled_cb(context, nullptr), CSR_ERROR_INVALID_PARAMETER);
237 ASSERT_IF(csr_cs_set_error_cb(nullptr, on_error), CSR_ERROR_INVALID_HANDLE);
238 ASSERT_IF(csr_cs_set_error_cb(context, nullptr), CSR_ERROR_INVALID_PARAMETER);
239 ASSERT_IF(csr_cs_set_file_scanned_cb(nullptr, on_scanned), CSR_ERROR_INVALID_HANDLE);
240 ASSERT_IF(csr_cs_set_file_scanned_cb(context, nullptr), CSR_ERROR_INVALID_PARAMETER);
245 BOOST_AUTO_TEST_CASE(scan_files_async_positive)
247 EXCEPTION_GUARD_START
249 auto c = Test::Context<csr_cs_context_h>();
250 auto context = c.get();
252 set_default_callback(context);
254 const char *files[4] = {
261 AsyncTestContext testCtx;
263 ASSERT_SUCCESS(csr_cs_scan_files_async(context, files, 4, &testCtx));
265 ASSERT_CALLBACK(testCtx, -1, 3, 1, 0, 0);
267 ASSERT_DETECTED_IN_LIST(testCtx.detectedList,
268 TEST_FILE_HIGH, MALWARE_HIGH_NAME, MALWARE_HIGH_SEVERITY, MALWARE_HIGH_DETAILED_URL);
269 ASSERT_DETECTED_IN_LIST_EXT(testCtx.detectedList, TEST_FILE_HIGH, false, "");
271 ASSERT_DETECTED_IN_LIST(testCtx.detectedList, TEST_FILE_MEDIUM, MALWARE_MEDIUM_NAME,
272 MALWARE_MEDIUM_SEVERITY, MALWARE_MEDIUM_DETAILED_URL);
273 ASSERT_DETECTED_IN_LIST_EXT(testCtx.detectedList, TEST_FILE_MEDIUM, false, "");
275 ASSERT_DETECTED_IN_LIST(testCtx.detectedList, TEST_FILE_LOW, MALWARE_LOW_NAME,
276 MALWARE_LOW_SEVERITY, MALWARE_LOW_DETAILED_URL);
277 ASSERT_DETECTED_IN_LIST_EXT(testCtx.detectedList, TEST_FILE_LOW, false, "");
282 BOOST_AUTO_TEST_CASE(scan_files_async_negative)
284 EXCEPTION_GUARD_START
286 auto c = Test::Context<csr_cs_context_h>();
287 auto context = c.get();
289 const char *files[3] = {
295 AsyncTestContext testCtx;
297 ASSERT_IF(csr_cs_scan_files_async(nullptr, files, 3, nullptr), CSR_ERROR_INVALID_HANDLE);
298 ASSERT_IF(csr_cs_scan_files_async(context, nullptr, 3, nullptr), CSR_ERROR_INVALID_PARAMETER);
303 BOOST_AUTO_TEST_CASE(scan_dir_positive)
305 EXCEPTION_GUARD_START
307 auto c = Test::Context<csr_cs_context_h>();
308 auto context = c.get();
310 set_default_callback(context);
312 AsyncTestContext testCtx;
314 ASSERT_SUCCESS(csr_cs_scan_dir_async(context, TEST_DIR_MALWARES, &testCtx));
316 //scanned, detected, completed, cancelled, error
317 ASSERT_CALLBACK(testCtx, -1, -1, 1, 0, 0);
318 ASSERT_DETECTED_IN_LIST(testCtx.detectedList, TEST_FILE_UNREMOVABLE,
319 MALWARE_HIGH_NAME, MALWARE_HIGH_SEVERITY,
320 MALWARE_HIGH_DETAILED_URL);
321 ASSERT_DETECTED_IN_LIST_EXT(testCtx.detectedList, TEST_FILE_UNREMOVABLE, false, "");
326 BOOST_AUTO_TEST_CASE(scan_dir_negative)
328 EXCEPTION_GUARD_START
330 auto c = Test::Context<csr_cs_context_h>();
331 auto context = c.get();
333 AsyncTestContext testCtx;
335 ASSERT_IF(csr_cs_scan_dir_async(nullptr, TEST_DIR_MALWARES, nullptr), CSR_ERROR_INVALID_HANDLE);
336 ASSERT_IF(csr_cs_scan_dir_async(context, nullptr, nullptr), CSR_ERROR_INVALID_PARAMETER);
341 BOOST_AUTO_TEST_CASE(scan_dir_root)
343 EXCEPTION_GUARD_START
345 auto c = Test::Context<csr_cs_context_h>();
346 auto context = c.get();
348 install_test_files();
351 set_default_callback(context);
353 AsyncTestContext testCtx;
355 ASSERT_SUCCESS(csr_cs_scan_dir_async(context, TEST_DIR_ROOT, &testCtx));
357 //scanned, detected, completed, cancelled, error
358 ASSERT_CALLBACK(testCtx, -1, -1, 1, 0, 0);
360 Test::uninstall_app(TEST_WGT_PKG_ID);
361 Test::uninstall_app(TEST_TPK_PKG_ID);
363 std::string homeDirPrefix;
364 #ifdef PLATFORM_VERSION_3
365 // "/home" is symlinked of "/opt/home" so in root directory scanning,
366 // user directory prefix("/opt") is additionally needed to check file_name field
368 homeDirPrefix = "/opt";
371 ASSERT_DETECTED_IN_LIST(testCtx.detectedList, TEST_FILE_HIGH, MALWARE_HIGH_NAME,
372 MALWARE_HIGH_SEVERITY, MALWARE_HIGH_DETAILED_URL);
373 ASSERT_DETECTED_IN_LIST_EXT(testCtx.detectedList, TEST_FILE_HIGH, false, "");
375 ASSERT_DETECTED_IN_LIST(testCtx.detectedList, homeDirPrefix + TEST_FILE_MEDIA(),
376 MALWARE_HIGH_NAME, MALWARE_HIGH_SEVERITY,
377 MALWARE_HIGH_DETAILED_URL);
378 ASSERT_DETECTED_IN_LIST_EXT(testCtx.detectedList, homeDirPrefix + TEST_FILE_MEDIA(),
381 ASSERT_DETECTED_IN_LIST(testCtx.detectedList, TEST_FILE_TMP, MALWARE_HIGH_NAME,
382 MALWARE_HIGH_SEVERITY, MALWARE_HIGH_DETAILED_URL);
383 ASSERT_DETECTED_IN_LIST_EXT(testCtx.detectedList, TEST_FILE_TMP, false, "");
385 ASSERT_DETECTED_IN_LIST(testCtx.detectedList, homeDirPrefix + TEST_WGT_APP_ROOT(),
386 MALWARE_HIGH_NAME, MALWARE_HIGH_SEVERITY,
387 MALWARE_HIGH_DETAILED_URL);
388 ASSERT_DETECTED_IN_LIST_EXT(testCtx.detectedList, homeDirPrefix + TEST_WGT_APP_ROOT(),
389 true, TEST_WGT_PKG_ID);
391 ASSERT_DETECTED_IN_LIST(testCtx.detectedList, homeDirPrefix + TEST_TPK_APP_ROOT(),
392 MALWARE_HIGH_NAME, MALWARE_HIGH_SEVERITY,
393 MALWARE_HIGH_DETAILED_URL);
394 ASSERT_DETECTED_IN_LIST_EXT(testCtx.detectedList, homeDirPrefix + TEST_TPK_APP_ROOT(),
395 true, TEST_TPK_PKG_ID);
397 ASSERT_DETECTED_IN_LIST(testCtx.detectedList, homeDirPrefix + TEST_FAKE_APP_FILE(),
398 MALWARE_HIGH_NAME, MALWARE_HIGH_SEVERITY,
399 MALWARE_HIGH_DETAILED_URL);
400 ASSERT_DETECTED_IN_LIST_EXT(testCtx.detectedList, homeDirPrefix + TEST_FAKE_APP_FILE(),
403 ASSERT_DETECTED_IN_LIST(testCtx.detectedList, TEST_FILE_MEDIUM, MALWARE_MEDIUM_NAME,
404 MALWARE_MEDIUM_SEVERITY, MALWARE_MEDIUM_DETAILED_URL);
405 ASSERT_DETECTED_IN_LIST_EXT(testCtx.detectedList, TEST_FILE_MEDIUM, false, "");
407 ASSERT_DETECTED_IN_LIST(testCtx.detectedList, TEST_FILE_LOW, MALWARE_LOW_NAME,
408 MALWARE_LOW_SEVERITY, MALWARE_LOW_DETAILED_URL);
409 ASSERT_DETECTED_IN_LIST_EXT(testCtx.detectedList, TEST_FILE_LOW, false, "");
414 BOOST_AUTO_TEST_CASE(scan_dir_media)
416 EXCEPTION_GUARD_START
418 auto c = Test::Context<csr_cs_context_h>();
419 auto context = c.get();
421 install_test_files();
423 set_default_callback(context);
425 AsyncTestContext testCtx;
427 ASSERT_SUCCESS(csr_cs_scan_dir_async(context, TEST_DIR_MEDIA(), &testCtx));
429 // scanned, detected, completed, cancelled, error
430 ASSERT_CALLBACK(testCtx, -1, 1, 1, 0, 0);
432 ASSERT_DETECTED_IN_LIST(testCtx.detectedList, TEST_FILE_MEDIA(), MALWARE_HIGH_NAME,
433 MALWARE_HIGH_SEVERITY, MALWARE_HIGH_DETAILED_URL);
434 ASSERT_DETECTED_IN_LIST_EXT(testCtx.detectedList, TEST_FILE_MEDIA(), false, "");
439 BOOST_AUTO_TEST_CASE(scan_dir_tmp)
441 EXCEPTION_GUARD_START
443 auto c = Test::Context<csr_cs_context_h>();
444 auto context = c.get();
446 install_test_files();
448 set_default_callback(context);
450 AsyncTestContext testCtx;
452 ASSERT_SUCCESS(csr_cs_scan_dir_async(context, TEST_DIR_TMP, &testCtx));
454 //scanned, detected, completed, cancelled, error
455 ASSERT_CALLBACK(testCtx, -1, 1, 1, 0, 0);
457 ASSERT_DETECTED_IN_LIST(testCtx.detectedList, TEST_FILE_TMP, MALWARE_HIGH_NAME,
458 MALWARE_HIGH_SEVERITY, MALWARE_HIGH_DETAILED_URL);
459 ASSERT_DETECTED_IN_LIST_EXT(testCtx.detectedList, TEST_FILE_TMP, false, "");
464 BOOST_AUTO_TEST_CASE(scan_dir_apps)
466 EXCEPTION_GUARD_START
468 auto c = Test::Context<csr_cs_context_h>();
469 auto context = c.get();
471 install_test_files();
474 set_default_callback(context);
476 AsyncTestContext testCtx;
478 ASSERT_SUCCESS(csr_cs_scan_dir_async(context, TEST_DIR_APPS(), &testCtx));
480 //scanned, detected, completed, cancelled, error
481 ASSERT_CALLBACK(testCtx, -1, 3, 1, 0, 0);
483 ASSERT_DETECTED_IN_LIST(testCtx.detectedList, TEST_WGT_APP_ROOT(), MALWARE_HIGH_NAME,
484 MALWARE_HIGH_SEVERITY, MALWARE_HIGH_DETAILED_URL);
485 ASSERT_DETECTED_IN_LIST_EXT(testCtx.detectedList, TEST_WGT_APP_ROOT(), true,
488 ASSERT_DETECTED_IN_LIST(testCtx.detectedList, TEST_TPK_APP_ROOT(), MALWARE_HIGH_NAME,
489 MALWARE_HIGH_SEVERITY, MALWARE_HIGH_DETAILED_URL);
490 ASSERT_DETECTED_IN_LIST_EXT(testCtx.detectedList, TEST_TPK_APP_ROOT(), true,
493 ASSERT_DETECTED_IN_LIST(testCtx.detectedList, TEST_FAKE_APP_FILE(), MALWARE_HIGH_NAME,
494 MALWARE_HIGH_SEVERITY, MALWARE_HIGH_DETAILED_URL);
495 ASSERT_DETECTED_IN_LIST_EXT(testCtx.detectedList, TEST_FAKE_APP_FILE(), false, "");
497 uninstall_test_apps();
502 BOOST_AUTO_TEST_CASE(scan_dir_wgt)
504 EXCEPTION_GUARD_START
506 auto c = Test::Context<csr_cs_context_h>();
507 auto context = c.get();
509 Test::uninstall_app(TEST_WGT_PKG_ID);
510 ASSERT_INSTALL_APP(TEST_WGT_PATH, TEST_WGT_TYPE);
512 set_default_callback(context);
514 AsyncTestContext testCtx;
516 ASSERT_SUCCESS(csr_cs_scan_dir_async(context, TEST_WGT_APP_ROOT(), &testCtx));
518 //scanned, detected, completed, cancelled, error
519 ASSERT_CALLBACK(testCtx, -1, 1, 1, 0, 0);
521 ASSERT_DETECTED_IN_LIST(testCtx.detectedList, TEST_WGT_APP_ROOT(), MALWARE_HIGH_NAME,
522 MALWARE_HIGH_SEVERITY, MALWARE_HIGH_DETAILED_URL);
523 ASSERT_DETECTED_IN_LIST_EXT(testCtx.detectedList, TEST_WGT_APP_ROOT(), true,
526 Test::uninstall_app(TEST_WGT_PKG_ID);
531 BOOST_AUTO_TEST_CASE(scan_dir_tpk)
533 EXCEPTION_GUARD_START
535 auto c = Test::Context<csr_cs_context_h>();
536 auto context = c.get();
538 Test::uninstall_app(TEST_TPK_PKG_ID);
539 ASSERT_INSTALL_APP(TEST_TPK_PATH, TEST_TPK_TYPE);
541 set_default_callback(context);
543 AsyncTestContext testCtx;
545 ASSERT_SUCCESS(csr_cs_scan_dir_async(context, TEST_TPK_APP_ROOT(), &testCtx));
547 //scanned, detected, completed, cancelled, error
548 ASSERT_CALLBACK(testCtx, -1, 1, 1, 0, 0);
550 ASSERT_DETECTED_IN_LIST(testCtx.detectedList, TEST_TPK_APP_ROOT(), MALWARE_HIGH_NAME,
551 MALWARE_HIGH_SEVERITY, MALWARE_HIGH_DETAILED_URL);
552 ASSERT_DETECTED_IN_LIST_EXT(testCtx.detectedList, TEST_TPK_APP_ROOT(), true,
555 Test::uninstall_app(TEST_TPK_PKG_ID);
560 BOOST_AUTO_TEST_CASE(scan_dirs_positive)
562 EXCEPTION_GUARD_START
564 auto c = Test::Context<csr_cs_context_h>();
565 auto context = c.get();
567 set_default_callback(context);
569 AsyncTestContext testCtx;
571 const char *dirs[1] = {
575 ASSERT_SUCCESS(csr_cs_scan_dirs_async(context, dirs, 1, &testCtx));
577 //scanned, detected, completed, cancelled, error
578 ASSERT_CALLBACK(testCtx, -1, -1, 1, 0, 0);
579 ASSERT_DETECTED_IN_LIST(testCtx.detectedList, TEST_FILE_UNREMOVABLE,
580 MALWARE_HIGH_NAME, MALWARE_HIGH_SEVERITY,
581 MALWARE_HIGH_DETAILED_URL);
582 ASSERT_DETECTED_IN_LIST_EXT(testCtx.detectedList, TEST_FILE_UNREMOVABLE, false, "");
587 BOOST_AUTO_TEST_CASE(scan_dirs_negative)
589 EXCEPTION_GUARD_START
591 auto c = Test::Context<csr_cs_context_h>();
592 auto context = c.get();
594 const char *dirs[1] = {
598 ASSERT_IF(csr_cs_scan_dirs_async(nullptr, dirs, 1, nullptr), CSR_ERROR_INVALID_HANDLE);
599 ASSERT_IF(csr_cs_scan_dirs_async(context, nullptr, 1, nullptr), CSR_ERROR_INVALID_PARAMETER);
604 BOOST_AUTO_TEST_CASE(scan_cancel_positive)
606 EXCEPTION_GUARD_START
608 auto c = Test::Context<csr_cs_context_h>();
609 auto context = c.get();
611 set_default_callback(context);
613 AsyncTestContext testCtx;
615 const char *dirs[1] = {
619 // touch a file : in case of no target file to scan, we cannot cancel to scan.
620 Test::touch_file(TEST_FILE_HIGH);
622 ASSERT_SUCCESS(csr_cs_scan_dirs_async(context, dirs, 1, &testCtx));
623 ASSERT_SUCCESS(csr_cs_cancel_scanning(context));
625 //scanned, detected, completed, cancelled, error
626 ASSERT_CALLBACK(testCtx, -1, -1, 0, 1, 0);
631 BOOST_AUTO_TEST_CASE(scan_cancel_positive_100)
633 EXCEPTION_GUARD_START
635 auto c = Test::Context<csr_cs_context_h>();
636 auto context = c.get();
638 set_default_callback(context);
640 AsyncTestContext testCtx;
642 const char *dirs[1] = {
646 // touch a file : in case of no target file to scan, we cannot cancel to scan.
647 Test::touch_file(TEST_FILE_HIGH);
649 ASSERT_SUCCESS(csr_cs_scan_dirs_async(context, dirs, 1, &testCtx));
651 std::this_thread::sleep_for(std::chrono::milliseconds(100));
653 ASSERT_SUCCESS(csr_cs_cancel_scanning(context));
655 //scanned, detected, completed, cancelled, error
656 ASSERT_CALLBACK(testCtx, -1, -1, 0, 1, 0);
661 BOOST_AUTO_TEST_CASE(scan_cancel_positive_500)
663 EXCEPTION_GUARD_START
665 auto c = Test::Context<csr_cs_context_h>();
666 auto context = c.get();
668 set_default_callback(context);
670 AsyncTestContext testCtx;
672 const char *dirs[1] = {
676 // touch a file : in case of no target file to scan, we cannot cancel to scan.
677 Test::touch_file(TEST_FILE_HIGH);
679 ASSERT_SUCCESS(csr_cs_scan_dirs_async(context, dirs, 1, &testCtx));
681 std::this_thread::sleep_for(std::chrono::milliseconds(500));
683 ASSERT_SUCCESS(csr_cs_cancel_scanning(context));
685 //scanned, detected, completed, cancelled, error
686 ASSERT_CALLBACK(testCtx, -1, -1, 0, 1, 0);
691 BOOST_AUTO_TEST_CASE(scan_cancel_negative)
693 EXCEPTION_GUARD_START
695 auto c = Test::Context<csr_cs_context_h>();
696 auto context = c.get();
698 ASSERT_IF(csr_cs_cancel_scanning(nullptr), CSR_ERROR_INVALID_HANDLE);
699 ASSERT_IF(csr_cs_cancel_scanning(context), CSR_ERROR_NO_TASK);
704 BOOST_AUTO_TEST_CASE(delta_scan_basic)
706 EXCEPTION_GUARD_START
708 Test::initialize_db();
710 auto c = Test::Context<csr_cs_context_h>();
711 auto context = c.get();
713 install_test_files();
716 set_default_callback(context);
719 AsyncTestContext testBaseCtx;
721 ASSERT_SUCCESS(csr_cs_scan_dir_async(context, TEST_DIR_APPS(), &testBaseCtx));
723 // scanned, detected, completed, cancelled, error
724 ASSERT_CALLBACK(testBaseCtx, -1, -1, 1, 0, 0);
725 BOOST_REQUIRE_MESSAGE(testBaseCtx.scannedCnt > 0,
726 "Base Scan count should not be zero");
728 ASSERT_DETECTED_IN_LIST(testBaseCtx.detectedList, TEST_WGT_APP_ROOT(),
729 MALWARE_HIGH_NAME, MALWARE_HIGH_SEVERITY,
730 MALWARE_HIGH_DETAILED_URL);
731 ASSERT_DETECTED_IN_LIST_EXT(testBaseCtx.detectedList, TEST_WGT_APP_ROOT(), true,
734 ASSERT_DETECTED_IN_LIST(testBaseCtx.detectedList, TEST_TPK_APP_ROOT(),
735 MALWARE_HIGH_NAME, MALWARE_HIGH_SEVERITY,
736 MALWARE_HIGH_DETAILED_URL);
737 ASSERT_DETECTED_IN_LIST_EXT(testBaseCtx.detectedList, TEST_TPK_APP_ROOT(), true,
740 ASSERT_DETECTED_IN_LIST(testBaseCtx.detectedList, TEST_FAKE_APP_FILE(),
741 MALWARE_HIGH_NAME, MALWARE_HIGH_SEVERITY,
742 MALWARE_HIGH_DETAILED_URL);
743 ASSERT_DETECTED_IN_LIST_EXT(testBaseCtx.detectedList, TEST_FAKE_APP_FILE(), false, "");
745 // Rescan the same dir
746 AsyncTestContext testRescanCtx;
748 ASSERT_SUCCESS(csr_cs_scan_dir_async(context, TEST_DIR_APPS(), &testRescanCtx));
750 // scanned, detected, completed, cancelled, error
751 ASSERT_CALLBACK(testRescanCtx, -1, -1, 1, 0, 0);
752 BOOST_REQUIRE_MESSAGE(testBaseCtx.scannedCnt > testRescanCtx.scannedCnt,
753 "Scan count of the base[" << testBaseCtx.scannedCnt <<
754 "] should be bigger than the delta-scan[" << testRescanCtx.scannedCnt << "]");
756 ASSERT_DETECTED_IN_LIST(testRescanCtx.detectedList, TEST_WGT_APP_ROOT(),
757 MALWARE_HIGH_NAME, MALWARE_HIGH_SEVERITY,
758 MALWARE_HIGH_DETAILED_URL);
759 ASSERT_DETECTED_IN_LIST_EXT(testRescanCtx.detectedList, TEST_WGT_APP_ROOT(), true,
762 ASSERT_DETECTED_IN_LIST(testRescanCtx.detectedList, TEST_TPK_APP_ROOT(),
763 MALWARE_HIGH_NAME, MALWARE_HIGH_SEVERITY,
764 MALWARE_HIGH_DETAILED_URL);
765 ASSERT_DETECTED_IN_LIST_EXT(testRescanCtx.detectedList, TEST_TPK_APP_ROOT(), true,
768 ASSERT_DETECTED_IN_LIST(testRescanCtx.detectedList, TEST_FAKE_APP_FILE(),
769 MALWARE_HIGH_NAME, MALWARE_HIGH_SEVERITY,
770 MALWARE_HIGH_DETAILED_URL);
771 ASSERT_DETECTED_IN_LIST_EXT(testRescanCtx.detectedList, TEST_FAKE_APP_FILE(), false,
774 // Rescan the sub dir
775 AsyncTestContext testRescanSubCtx;
777 ASSERT_SUCCESS(csr_cs_scan_dir_async(context, TEST_WGT_APP_ROOT(), &testRescanSubCtx));
779 // scanned, detected, completed, cancelled, error
780 ASSERT_CALLBACK(testRescanSubCtx, 0, 1, 1, 0, 0);
782 ASSERT_DETECTED_IN_LIST(testRescanSubCtx.detectedList, TEST_WGT_APP_ROOT(),
783 MALWARE_HIGH_NAME, MALWARE_HIGH_SEVERITY,
784 MALWARE_HIGH_DETAILED_URL);
785 ASSERT_DETECTED_IN_LIST_EXT(testRescanSubCtx.detectedList, TEST_WGT_APP_ROOT(), true,
788 uninstall_test_apps();
793 BOOST_AUTO_TEST_CASE(delta_scan_changed_after_scan)
795 EXCEPTION_GUARD_START
797 Test::initialize_db();
799 auto c = Test::Context<csr_cs_context_h>();
800 auto context = c.get();
802 install_test_files();
805 set_default_callback(context);
808 AsyncTestContext testBaseCtx;
810 ASSERT_SUCCESS(csr_cs_scan_dir_async(context, TEST_DIR_APPS(), &testBaseCtx));
812 // scanned, detected, completed, cancelled, error
813 ASSERT_CALLBACK(testBaseCtx, -1, 3, 1, 0, 0);
814 BOOST_REQUIRE_MESSAGE(testBaseCtx.scannedCnt != 0,
815 "Base Scan count should not be zero");
818 Test::uninstall_app(TEST_SAFE_WGT_PKG_ID);
819 ASSERT_INSTALL_APP(TEST_SAFE_WGT_PATH, TEST_SAFE_WGT_TYPE);
821 // Rescan the same dir
822 AsyncTestContext testRescanCtx;
824 ASSERT_SUCCESS(csr_cs_scan_dir_async(context, TEST_DIR_APPS(), &testRescanCtx));
826 // scanned, detected, completed, cancelled, error
827 ASSERT_CALLBACK(testRescanCtx, -1, -1, 1, 0, 0);
828 BOOST_REQUIRE_MESSAGE(testRescanCtx.scannedCnt >= 1,
829 "reinstalled app(non-malicious wgt) should be counted in scanned.");
831 ASSERT_DETECTED_IN_LIST(testRescanCtx.detectedList, TEST_WGT_APP_ROOT(),
832 MALWARE_HIGH_NAME, MALWARE_HIGH_SEVERITY,
833 MALWARE_HIGH_DETAILED_URL);
834 ASSERT_DETECTED_IN_LIST_EXT(testRescanCtx.detectedList, TEST_WGT_APP_ROOT(), true,
837 ASSERT_DETECTED_IN_LIST(testRescanCtx.detectedList, TEST_TPK_APP_ROOT(),
838 MALWARE_HIGH_NAME, MALWARE_HIGH_SEVERITY,
839 MALWARE_HIGH_DETAILED_URL);
840 ASSERT_DETECTED_IN_LIST_EXT(testRescanCtx.detectedList, TEST_TPK_APP_ROOT(), true,
843 ASSERT_DETECTED_IN_LIST(testRescanCtx.detectedList, TEST_FAKE_APP_FILE(),
844 MALWARE_HIGH_NAME, MALWARE_HIGH_SEVERITY,
845 MALWARE_HIGH_DETAILED_URL);
846 ASSERT_DETECTED_IN_LIST_EXT(testRescanCtx.detectedList, TEST_FAKE_APP_FILE(), false,
849 uninstall_test_apps();
854 BOOST_AUTO_TEST_CASE(canonicalize_files_absolute_path)
856 EXCEPTION_GUARD_START
858 Test::initialize_db();
860 auto c = Test::Context<csr_cs_context_h>();
861 auto context = c.get();
863 install_test_files();
865 set_default_callback(context);
867 // four files are all same as realpath.
868 const char *files[4] = {
870 TEST_DIR "/./test_normal_file",
871 TEST_DIR "/.././././csr-test/test_normal_file",
872 TEST_DIR "/././.././csr-test/test_normal_file"
875 AsyncTestContext testCtx;
877 ASSERT_SUCCESS(csr_cs_scan_files_async(context, files, 4, &testCtx));
879 ASSERT_CALLBACK(testCtx, 1, 0, 1, 0, 0);
880 ASSERT_IF(testCtx.scannedList.size(), static_cast<std::size_t>(1));
881 ASSERT_IF(testCtx.scannedList.front(), static_cast<const char *>(TEST_FILE_NORMAL));
886 BOOST_AUTO_TEST_CASE(canonicalize_files_relative_path)
888 EXCEPTION_GUARD_START
890 Test::initialize_db();
892 auto c = Test::Context<csr_cs_context_h>();
893 auto context = c.get();
895 install_test_files();
897 set_default_callback(context);
899 // four files are all same as realpath.
900 const char *files[4] = {
902 "./test_normal_file",
903 ".././././csr-test/test_normal_file",
904 "././.././csr-test/test_normal_file"
907 AsyncTestContext testCtx;
909 Test::ScopedChDir scopedCd(TEST_DIR);
911 ASSERT_SUCCESS(csr_cs_scan_files_async(context, files, 4, &testCtx));
913 ASSERT_CALLBACK(testCtx, 1, 0, 1, 0, 0);
914 ASSERT_IF(testCtx.scannedList.size(), static_cast<std::size_t>(1));
915 ASSERT_IF(testCtx.scannedList.front(), static_cast<const char *>(TEST_FILE_NORMAL));
920 BOOST_AUTO_TEST_CASE(multiple_async_dispatch_negative)
922 EXCEPTION_GUARD_START
924 Test::initialize_db();
926 auto c = Test::Context<csr_cs_context_h>();
927 auto context = c.get();
929 install_test_files();
932 set_default_callback(context);
934 AsyncTestContext testCtx;
936 // first call. it'll running in background asynchronously.
937 ASSERT_SUCCESS(csr_cs_scan_dir_async(context, TEST_DIR_APPS(), &testCtx));
939 AsyncTestContext testCtx2;
941 // second call while first call is running in background. It should blocked because
942 // only one operation can be running asynchronously on one handle.
943 ASSERT_IF(csr_cs_scan_dir_async(context, TEST_DIR_APPS(), &testCtx2), CSR_ERROR_BUSY);
945 ASSERT_CALLBACK(testCtx, -1, 3, 1, 0, 0);
950 BOOST_AUTO_TEST_CASE(get_malware_after_async)
952 EXCEPTION_GUARD_START
954 auto c = Test::Context<csr_cs_context_h>();
955 auto context = c.get();
957 set_default_callback(context);
959 const char *dirs[4] = {
966 csr_cs_malware_list_h malwares = nullptr;
967 csr_cs_malware_h malware = nullptr;
970 ASSERT_SUCCESS(csr_cs_get_detected_malwares(context, dirs, 4, &malwares, &count));
971 BOOST_MESSAGE("detected malware exist count before scanning: " << count);
973 AsyncTestContext testCtx;
975 ASSERT_SUCCESS(csr_cs_scan_dirs_async(context, dirs, 4, &testCtx));
977 ASSERT_CALLBACK(testCtx, -1, -1, -1, -1, -1);
979 BOOST_MESSAGE("scanned count: " << testCtx.scannedCnt);
980 BOOST_MESSAGE("detected count: " << testCtx.detectedCnt);
981 BOOST_MESSAGE("completed count: " << testCtx.completedCnt);
982 BOOST_MESSAGE("cancelled count: " << testCtx.cancelledCnt);
983 BOOST_MESSAGE("error count: " << testCtx.errorCnt);
985 ASSERT_SUCCESS(csr_cs_get_detected_malwares(context, dirs, 4, &malwares, &count));
987 CHECK_IS_NOT_NULL(malwares);
989 for (size_t i = 0; i < count; ++i) {
991 Test::ScopedCstr filepath;
992 ASSERT_SUCCESS(csr_cs_malware_list_get_malware(malwares, i, &malware));
993 CHECK_IS_NOT_NULL(malware);
994 ASSERT_SUCCESS(csr_cs_malware_get_file_name(malware, &filepath.ptr));
995 CHECK_IS_NOT_NULL(filepath.ptr);
996 BOOST_MESSAGE("detect malware from file: " << filepath.ptr);
1002 BOOST_AUTO_TEST_CASE(async_api_returning_and_callback_race)
1004 EXCEPTION_GUARD_START
1006 auto c = Test::Context<csr_cs_context_h>();
1007 auto context = c.get();
1009 install_test_files();
1011 set_default_callback(context);
1013 const char *files[2] = {
1018 AsyncTestContext testCtx(true);
1020 ASSERT_SUCCESS(csr_cs_scan_files_async(context, files, 2, &testCtx));
1021 testCtx.apiReturned = true;
1023 ASSERT_CALLBACK(testCtx, -1, -1, -1, -1, -1);
1028 BOOST_AUTO_TEST_CASE(scan_app_on_cloud)
1030 EXCEPTION_GUARD_START
1032 BOOST_MESSAGE("Only valid for engines which supports scan on cloud feature");
1034 auto c = Test::Context<csr_cs_context_h>();
1035 auto context = c.get();
1037 install_test_files();
1038 install_test_apps();
1040 set_default_callback(context);
1041 ASSERT_SUCCESS(csr_cs_set_scan_on_cloud(context, true));
1043 AsyncTestContext testCtx;
1045 ASSERT_SUCCESS(csr_cs_scan_dir_async(context, TEST_DIR_APPS(), &testCtx));
1047 ASSERT_CALLBACK(testCtx, -1, -1, 1, 0, 0);
1049 ASSERT_DETECTED_IN_LIST(testCtx.detectedList, TEST_WGT_APP_ROOT(),
1050 MALWARE_HIGH_NAME, MALWARE_HIGH_SEVERITY,
1051 MALWARE_HIGH_DETAILED_URL);
1052 ASSERT_DETECTED_IN_LIST_EXT(testCtx.detectedList, TEST_WGT_APP_ROOT(), true,
1055 ASSERT_DETECTED_IN_LIST(testCtx.detectedList, TEST_TPK_APP_ROOT(),
1056 MALWARE_HIGH_NAME, MALWARE_HIGH_SEVERITY,
1057 MALWARE_HIGH_DETAILED_URL);
1058 ASSERT_DETECTED_IN_LIST_EXT(testCtx.detectedList, TEST_TPK_APP_ROOT(), true,
1061 ASSERT_DETECTED_IN_LIST(testCtx.detectedList, TEST_FAKE_APP_FILE(),
1062 MALWARE_HIGH_NAME, MALWARE_HIGH_SEVERITY,
1063 MALWARE_HIGH_DETAILED_URL);
1064 ASSERT_DETECTED_IN_LIST_EXT(testCtx.detectedList, TEST_FAKE_APP_FILE(), false, "");
1066 const char *dirs[1] = {
1069 csr_cs_malware_list_h malwares = nullptr;
1072 ASSERT_SUCCESS(csr_cs_get_detected_malwares(context, dirs, 1, &malwares, &count));
1073 CHECK_IS_NOT_NULL(malwares);
1075 std::vector<csr_cs_malware_h> malware_vec;
1076 for (size_t i = 0; i < count; ++i) {
1077 csr_cs_malware_h malware = nullptr;
1078 ASSERT_SUCCESS(csr_cs_malware_list_get_malware(malwares, i, &malware));
1080 malware_vec.push_back(malware);
1083 ASSERT_DETECTED_IN_LIST(malware_vec, TEST_WGT_APP_ROOT(), MALWARE_HIGH_NAME,
1084 MALWARE_HIGH_SEVERITY, MALWARE_HIGH_DETAILED_URL);
1085 ASSERT_DETECTED_IN_LIST_EXT(malware_vec, TEST_WGT_APP_ROOT(), true, TEST_WGT_PKG_ID);
1087 ASSERT_DETECTED_IN_LIST(malware_vec, TEST_TPK_APP_ROOT(), MALWARE_HIGH_NAME,
1088 MALWARE_HIGH_SEVERITY, MALWARE_HIGH_DETAILED_URL);
1089 ASSERT_DETECTED_IN_LIST_EXT(malware_vec, TEST_TPK_APP_ROOT(), true, TEST_TPK_PKG_ID);
1091 ASSERT_DETECTED_IN_LIST(malware_vec, TEST_FAKE_APP_FILE(), MALWARE_HIGH_NAME,
1092 MALWARE_HIGH_SEVERITY, MALWARE_HIGH_DETAILED_URL);
1093 ASSERT_DETECTED_IN_LIST_EXT(malware_vec, TEST_FAKE_APP_FILE(), false, "");
1098 BOOST_AUTO_TEST_CASE(scan_async_multiple)
1100 EXCEPTION_GUARD_START
1102 constexpr size_t NUM = 3;
1104 install_test_files();
1105 install_test_apps();
1107 std::vector<Test::Context<csr_cs_context_h>> cs(NUM);
1108 std::vector<csr_cs_context_h> contexts(NUM);
1109 std::vector<AsyncTestContext> testCtxs(NUM);
1111 for (size_t i = 0; i < NUM; ++i) {
1112 contexts[i] = cs[i].get();
1114 set_default_callback(contexts[i]);
1116 ASSERT_SUCCESS(csr_cs_scan_dir_async(contexts[i], TEST_DIR_ROOT, &testCtxs[i]));
1119 for (size_t i = 0; i < NUM; ++i)
1120 ASSERT_CALLBACK(testCtxs[i], -1, -1, 1, 0, 0);
1122 std::string homeDirPrefix;
1123 #ifdef PLATFORM_VERSION_3
1124 // "/home" is symlinked of "/opt/home" so in root directory scanning,
1125 // user directory prefix("/opt") is additionally needed to check file_name field
1126 // in malware handle
1127 homeDirPrefix = "/opt";
1130 for (size_t i = 0; i < NUM; ++i) {
1131 ASSERT_DETECTED_IN_LIST(testCtxs[i].detectedList, TEST_FILE_HIGH, MALWARE_HIGH_NAME,
1132 MALWARE_HIGH_SEVERITY, MALWARE_HIGH_DETAILED_URL);
1133 ASSERT_DETECTED_IN_LIST_EXT(testCtxs[i].detectedList, TEST_FILE_HIGH, false, "");
1135 ASSERT_DETECTED_IN_LIST(testCtxs[i].detectedList, homeDirPrefix + TEST_FILE_MEDIA(),
1136 MALWARE_HIGH_NAME, MALWARE_HIGH_SEVERITY,
1137 MALWARE_HIGH_DETAILED_URL);
1138 ASSERT_DETECTED_IN_LIST_EXT(testCtxs[i].detectedList, homeDirPrefix + TEST_FILE_MEDIA(),
1141 ASSERT_DETECTED_IN_LIST(testCtxs[i].detectedList, TEST_FILE_TMP, MALWARE_HIGH_NAME,
1142 MALWARE_HIGH_SEVERITY, MALWARE_HIGH_DETAILED_URL);
1143 ASSERT_DETECTED_IN_LIST_EXT(testCtxs[i].detectedList, TEST_FILE_TMP, false, "");
1145 ASSERT_DETECTED_IN_LIST(testCtxs[i].detectedList, homeDirPrefix + TEST_WGT_APP_ROOT(),
1146 MALWARE_HIGH_NAME, MALWARE_HIGH_SEVERITY,
1147 MALWARE_HIGH_DETAILED_URL);
1148 ASSERT_DETECTED_IN_LIST_EXT(testCtxs[i].detectedList, homeDirPrefix + TEST_WGT_APP_ROOT(),
1149 true, TEST_WGT_PKG_ID);
1151 ASSERT_DETECTED_IN_LIST(testCtxs[i].detectedList, homeDirPrefix + TEST_TPK_APP_ROOT(),
1152 MALWARE_HIGH_NAME, MALWARE_HIGH_SEVERITY,
1153 MALWARE_HIGH_DETAILED_URL);
1154 ASSERT_DETECTED_IN_LIST_EXT(testCtxs[i].detectedList, homeDirPrefix + TEST_TPK_APP_ROOT(),
1155 true, TEST_TPK_PKG_ID);
1157 ASSERT_DETECTED_IN_LIST(testCtxs[i].detectedList, homeDirPrefix + TEST_FAKE_APP_FILE(),
1158 MALWARE_HIGH_NAME, MALWARE_HIGH_SEVERITY,
1159 MALWARE_HIGH_DETAILED_URL);
1160 ASSERT_DETECTED_IN_LIST_EXT(testCtxs[i].detectedList, homeDirPrefix + TEST_FAKE_APP_FILE(),
1163 ASSERT_DETECTED_IN_LIST(testCtxs[i].detectedList, TEST_FILE_MEDIUM, MALWARE_MEDIUM_NAME,
1164 MALWARE_MEDIUM_SEVERITY, MALWARE_MEDIUM_DETAILED_URL);
1165 ASSERT_DETECTED_IN_LIST_EXT(testCtxs[i].detectedList, TEST_FILE_MEDIUM, false, "");
1167 ASSERT_DETECTED_IN_LIST(testCtxs[i].detectedList, TEST_FILE_LOW, MALWARE_LOW_NAME,
1168 MALWARE_LOW_SEVERITY, MALWARE_LOW_DETAILED_URL);
1169 ASSERT_DETECTED_IN_LIST_EXT(testCtxs[i].detectedList, TEST_FILE_LOW, false, "");
1176 BOOST_AUTO_TEST_SUITE_END()