예제 #1
0
    def test_sort_run_data(self):
        """
        Test sort runs by different field types.
        """
        # Sort runs by number of unresolved reports field.
        sort_mode = RunSortMode(RunSortType.UNRESOLVED_REPORTS, Order.ASC)
        runs = self._cc_client.getRunData(None, None, 0, sort_mode)

        for i in range(len(runs) - 1):
            self.assertTrue(runs[i].resultCount <= runs[i + 1].resultCount)

        # Sort runs by date field.
        sort_mode = RunSortMode(RunSortType.DATE, Order.ASC)
        runs = self._cc_client.getRunData(None, None, 0, sort_mode)

        for i in range(len(runs) - 1):
            date1 = datetime.strptime(runs[i].runDate, '%Y-%m-%d %H:%M:%S.%f')
            date2 = datetime.strptime(runs[i + 1].runDate,
                                      '%Y-%m-%d %H:%M:%S.%f')
            self.assertTrue(date1 <= date2)

        # Sort runs by CodeChecker version field.
        sort_mode = RunSortMode(RunSortType.CC_VERSION, Order.ASC)
        runs = self._cc_client.getRunData(None, None, 0, sort_mode)

        for i in range(len(runs) - 1):
            cc_version1 = runs[i].codeCheckerVersion
            cc_version2 = runs[i + 1].codeCheckerVersion
            self.assertTrue(cc_version1 <= cc_version2)

        # Sort runs by name field. We are not comparing the run names in python
        # code because Python and SQL compare strings differently if it
        # contains special characters.
        sort_mode = RunSortMode(RunSortType.NAME, Order.ASC)
        self._cc_client.getRunData(None, None, 0, sort_mode)
    def setUp(self):
        test_workspace = os.environ['TEST_WORKSPACE']

        test_class = self.__class__.__name__
        print('Running ' + test_class + ' tests in ' + test_workspace)

        self._codechecker_cfg = env.import_codechecker_cfg(test_workspace)
        self._test_dir = os.path.join(test_workspace, 'test_files')

        # Get the clang version which is tested.
        self._clang_to_test = env.clang_to_test()

        self._testproject_data = env.setup_test_proj_cfg(test_workspace)
        self.assertIsNotNone(self._testproject_data)

        self._cc_client = env.setup_viewer_client(test_workspace)
        self.assertIsNotNone(self._cc_client)

        # Get the run names which belong to this test.
        run_names = env.get_run_names(test_workspace)

        sort_mode = RunSortMode(RunSortType.DATE, Order.ASC)
        runs = self._cc_client.getRunData(None, None, 0, sort_mode)

        test_runs = [run for run in runs if run.name in run_names]

        self._runid = test_runs[0].runId
예제 #3
0
    def test_sort_run_data_order(self):
        """
        Test sort runs by different order types.
        """
        # Sort runs in ascending order.
        sort_mode = RunSortMode(RunSortType.DURATION, Order.ASC)
        runs = self._cc_client.getRunData(None, None, 0, sort_mode)

        for i in range(len(runs) - 1):
            self.assertTrue(runs[i].duration <= runs[i + 1].duration)

        # Sort runs in descending order.
        sort_mode = RunSortMode(RunSortType.DURATION, Order.DESC)
        runs = self._cc_client.getRunData(None, None, 0, sort_mode)

        for i in range(len(runs) - 1):
            self.assertTrue(runs[i].duration >= runs[i + 1].duration)
예제 #4
0
    def setUp(self):

        # TEST_WORKSPACE is automatically set by test package __init__.py .
        self.test_workspace = os.environ['TEST_WORKSPACE']

        test_class = self.__class__.__name__
        print('Running ' + test_class + ' tests in ' + self.test_workspace)

        # Get the test configuration from the prepared int the test workspace.
        self.test_cfg = env.import_test_cfg(self.test_workspace)

        # Get the clang version which is tested.
        self._clang_to_test = env.clang_to_test()

        # Get the test project configuration from the prepared test workspace.
        self._testproject_data = env.setup_test_proj_cfg(self.test_workspace)
        self.assertIsNotNone(self._testproject_data)

        # Setup a viewer client to test viewer API calls.
        self._cc_client = env.setup_viewer_client(self.test_workspace)
        self.assertIsNotNone(self._cc_client)

        # Get the CodeChecker cmd if needed for the tests.
        self._codechecker_cmd = env.codechecker_cmd()

        # Get the run names which belong to this test.
        # Name order matters from __init__ !
        run_names = env.get_run_names(self.test_workspace)

        sort_mode = RunSortMode(RunSortType.DATE, Order.ASC)
        runs = self._cc_client.getRunData(None, None, 0, sort_mode)
        self._test_runs = [run for run in runs if run.name in run_names]

        # There should be at least two runs for this test.
        self.assertIsNotNone(runs)
        self.assertNotEqual(len(runs), 0)
        self.assertGreaterEqual(len(runs), 2)

        # Name order matters from __init__ !
        self._base_runid = self._test_runs[0].runId
        self._new_runid = self._test_runs[1].runId
        self._update_runid = self._test_runs[2].runId

        self._url = env.parts_to_url(self.test_cfg['codechecker_cfg'])

        self._env = self.test_cfg['codechecker_cfg']['check_env']
    def test_remove_run_results(self):
        """
        Test for removing run results and run.
        """
        # Run the anaysis again with different setup.
        test_project_path = self._testproject_data['project_path']
        ret = project.clean(test_project_path)
        if ret:
            sys.exit(ret)

        codechecker.check_and_store(self._codechecker_cfg,
                                    'remove_run_results', test_project_path)

        run_filter = RunFilter(names=['remove_run_results'], exactMatch=True)
        sort_mode = RunSortMode(RunSortType.DATE, Order.ASC)
        runs = self._cc_client.getRunData(run_filter, None, 0, sort_mode)
        self.assertEqual(len(runs), 1)

        run_id = runs[0].runId

        orig_results_count = \
            self._cc_client.getRunResultCount([run_id], None, None)
        self.assertNotEqual(orig_results_count, 0)

        checker_filter = ReportFilter(checkerName=["core.CallAndMessage"])
        res_count = self._cc_client.getRunResultCount([run_id], checker_filter,
                                                      None)
        self.assertNotEqual(res_count, 0)

        self._cc_client.removeRunReports([run_id], checker_filter, None)

        res_count = self._cc_client.getRunResultCount([run_id], checker_filter,
                                                      None)
        self.assertEqual(res_count, 0)

        # Remove the run.
        self._cc_client.removeRun(run_id, None)

        # Check that we removed all results from the run.
        res = self._cc_client.getRunResultCount([run_id], None, None)
        self.assertEqual(res, 0)
예제 #6
0
    def setUp(self):
        test_workspace = os.environ['TEST_WORKSPACE']
        self.maxDiff = None

        test_class = self.__class__.__name__
        print('Running ' + test_class + ' tests in ' + test_workspace)

        # Get the clang version which is tested.
        self._clang_to_test = env.clang_to_test()

        self._testproject_data = env.setup_test_proj_cfg(test_workspace)
        self.assertIsNotNone(self._testproject_data)

        self._cc_client = env.setup_viewer_client(test_workspace)
        self.assertIsNotNone(self._cc_client)

        # Get the run names which belong to this test.
        run_names = env.get_run_names(test_workspace)

        sort_mode = RunSortMode(RunSortType.DATE, Order.ASC)
        runs = self._cc_client.getRunData(None, None, 0, sort_mode)

        self._test_runs = [run for run in runs if run.name in run_names]
        self._runids = [r.runId for r in self._test_runs]

        self.run1_checkers = \
            {'core.CallAndMessage': 5,
             'core.DivideZero': 10,
             'core.NullDereference': 4,
             'core.StackAddrEscapeBase': 3,
             'cplusplus.NewDelete': 5,
             'deadcode.DeadStores': 6,
             'unix.Malloc': 1}

        self.run2_checkers = \
            {'core.CallAndMessage': 5,
             'core.DivideZero': 10,
             'core.NullDereference': 4,
             'cplusplus.NewDelete': 5,
             'deadcode.DeadStores': 6,
             'unix.MismatchedDeallocator': 1}

        self.run1_sev_counts = {
            Severity.UNSPECIFIED: 3,
            Severity.MEDIUM: 1,
            Severity.LOW: 6,
            Severity.HIGH: 24
        }

        self.run2_sev_counts = {
            Severity.MEDIUM: 1,
            Severity.LOW: 6,
            Severity.HIGH: 24
        }

        self.run1_detection_counts = \
            {DetectionStatus.NEW: 34}

        self.run2_detection_counts = \
            {DetectionStatus.NEW: 31}

        self.run1_files = \
            {'file_to_be_skipped.cpp': 2,
             'null_dereference.cpp': 5,
             'new_delete.cpp': 6,
             'stack_address_escape.cpp': 3,
             'call_and_message.cpp': 5,
             'divide_zero.cpp': 4,
             'divide_zero_duplicate.cpp': 2,
             'has a space.cpp': 1,
             'skip_header.cpp': 1,
             'skip.h': 1,
             'path_begin.cpp': 2,
             'path_end.h': 2
             }

        self.run2_files = \
            {'call_and_message.cpp': 5,
             'new_delete.cpp': 6,
             'divide_zero.cpp': 4,
             'divide_zero_duplicate.cpp': 2,
             'null_dereference.cpp': 5,
             'file_to_be_skipped.cpp': 2,
             'has a space.cpp': 1,
             'skip_header.cpp': 1,
             'skip.h': 1,
             'path_begin.cpp': 2,
             'path_end.h': 2
             }
예제 #7
0
    def test_file_change(self):
        """
        This tests the change of the detection status of bugs when the file
        content changes.

        CHECK 1 ----- CHECK 2 --------- CHECK 3 ---------- CHECK 4
           |             |                 |                  |
          42             |                 |                  |
           |             |                 |                  |
          43             |                 |                  |
                         |                 |                  |
                        42 ---------- [RESOLVED]              |
                         |                 |                  |
                        43 --------- [UNRESOLVED] ------- [RESOLVED]
                                           |                  |
                                          44 ------------ [RESOLVED]
                                           |                  |
                                          45 ----------- [UNRESOLVED]
        """

        # ######################## 1st check #################################

        # Check the first file version.
        self._create_source_file(0, 'test_run_tag')

        # ######################## 2nd check #################################

        # Check the first file versions again with different run name to see
        # that set a run tag filter will filter the reports by the run id.
        self._create_source_file(0, 'test_run_tag_update')

        # Get the run names which belong to this test

        sort_mode = RunSortMode(RunSortType.DATE, Order.ASC)
        runs = self._cc_client.getRunData(None, None, 0, sort_mode)
        test_run_ids = [run.runId for run in runs]

        self.assertEqual(len(test_run_ids), 2)

        run_id = test_run_ids[1]
        test_run_tags = self.__get_run_tag_counts(run_id, 100, 0)
        run_tags_v0 = [t for t in test_run_tags if t.name == self.tags[0]]

        self.assertEqual(len(run_tags_v0), 1)
        run_tags_v0 = run_tags_v0[0]

        reports = self.__reports_by_tag([run_tags_v0.id])
        self.assertEqual(run_tags_v0.count, len(reports))

        # ######################## 3rd check #################################

        # Check the second file version.
        self._create_source_file(1, 'test_run_tag_update')

        # We do not show future bugs for later tags.
        reports = self.__reports_by_tag([run_tags_v0.id])
        self.assertEqual(run_tags_v0.count, len(reports))

        test_run_tags = self.__get_run_tag_counts(run_id)
        run_tags_v1 = [t for t in test_run_tags if t.name == self.tags[1]]

        self.assertEqual(len(run_tags_v1), 1)
        run_tags_v1 = run_tags_v1[0]
        self.__check_reports(run_tags_v1)

        # ######################## 4th check #################################

        # Check the third file version.
        self._create_source_file(2, 'test_run_tag_update')

        # We do not show future bugs for later tags.
        reports = self.__reports_by_tag([run_tags_v0.id])
        self.assertEqual(run_tags_v0.count, len(reports))

        test_run_tags = self.__get_run_tag_counts(run_id)
        run_tags_v2 = [t for t in test_run_tags if t.name == self.tags[2]]

        self.assertEqual(len(run_tags_v2), 1)
        run_tags_v2 = run_tags_v2[0]
        self.__check_reports(run_tags_v2)