chromium/tools/android/test_health/test_health_extractor_unittest.py

#!/usr/bin/env python3
# Copyright 2022 The Chromium Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
"""Tests for test_health_extractor."""

import logging
import pathlib
import sys
import unittest

import java_test_utils
import test_health_extractor

_TOOLS_ANDROID_PATH = pathlib.Path(__file__).resolve(strict=True).parents[1]
if str(_TOOLS_ANDROID_PATH) not in sys.path:
    sys.path.append(str(_TOOLS_ANDROID_PATH))
from python_utils import git_metadata_utils

_CHROMIUM_SRC_PATH = git_metadata_utils.get_chromium_src_path()
_CHROMIUM_REPO_INFO = test_health_extractor.GitRepoInfo(
    git_head=git_metadata_utils.get_head_commit_hash(),
    git_head_time=git_metadata_utils.get_head_commit_datetime())

_TEST_FILES_PATH = (_CHROMIUM_SRC_PATH / 'tools' / 'android' / 'test_health' /
                    'testdata' / 'javatests' / 'org' / 'chromium' / 'chrome' /
                    'browser' / 'test_health').relative_to(_CHROMIUM_SRC_PATH)
_HEALTHY_TESTS_PATH = _TEST_FILES_PATH / 'healthy_tests'
_UNHEALTHY_TESTS_PATH = _TEST_FILES_PATH / 'unhealthy_tests'
_INVALID_SYNTAX_TEST_PATH = (
    _UNHEALTHY_TESTS_PATH /
    'InvalidSyntaxTest.java').relative_to(_TEST_FILES_PATH)

_IGNORED_DIRS = ('disabled_tests', 'unhealthy_tests')

_BASE_JAVA_PACKAGE = 'org.chromium.chrome.browser.test_health'
_JAVA_PACKAGE_HEALTHY_TESTS = _BASE_JAVA_PACKAGE + '.healthy_tests'
_JAVA_PACKAGE_UNHEALTHY_TESTS = _BASE_JAVA_PACKAGE + '.unhealthy_tests'


class GetRepoTestHealth(unittest.TestCase):
    """Tests for the get_repo_test_health function."""

    def test_get_test_health_healthy_test(self):
        sample_test_path = _HEALTHY_TESTS_PATH / 'SampleTest.java'
        expected_test_health_info = test_health_extractor.TestHealthInfo(
            test_name=sample_test_path.stem,
            test_dir=sample_test_path.parent,
            test_filename=sample_test_path.name,
            java_test_health=java_test_utils.JavaTestHealth(
                java_package=_JAVA_PACKAGE_HEALTHY_TESTS,
                disabled_tests_count=0,
                disable_if_tests_count=0,
                tests_count=1),
            git_repo_info=_CHROMIUM_REPO_INFO)

        test_health_infos = test_health_extractor.get_repo_test_health(
            test_dir=_TEST_FILES_PATH,
            ignored_dirs=_IGNORED_DIRS,
            ignored_files={
                str((_HEALTHY_TESTS_PATH /
                     'SampleNoPackageTest.java').relative_to(_TEST_FILES_PATH))
            })

        self.assertEqual(expected_test_health_info, test_health_infos[0])

    def test_get_test_health_unhealthy_test(self):
        sample_test_path = _UNHEALTHY_TESTS_PATH / 'SampleTest.java'
        expected_test_health_info = test_health_extractor.TestHealthInfo(
            test_name=sample_test_path.stem,
            test_dir=sample_test_path.parent,
            test_filename=sample_test_path.name,
            java_test_health=java_test_utils.JavaTestHealth(
                java_package=_JAVA_PACKAGE_UNHEALTHY_TESTS,
                disabled_tests_count=1,
                disable_if_tests_count=1,
                tests_count=4),
            git_repo_info=_CHROMIUM_REPO_INFO)

        test_health_infos = test_health_extractor.get_repo_test_health(
            test_dir=_TEST_FILES_PATH,
            ignored_dirs=('disabled_tests', 'healthy_tests'),
            ignored_files={str(_INVALID_SYNTAX_TEST_PATH)})

        self.assertEqual(expected_test_health_info, test_health_infos[0])

    def test_get_test_health_all_files_and_folders_ignored(self):
        test_health_info = test_health_extractor.get_repo_test_health(
            test_dir=_TEST_FILES_PATH,
            ignored_dirs=_IGNORED_DIRS,
            ignored_files={
                str((_HEALTHY_TESTS_PATH /
                     'SampleTest.java').relative_to(_TEST_FILES_PATH)),
                str((_HEALTHY_TESTS_PATH /
                     'SampleNoPackageTest.java').relative_to(_TEST_FILES_PATH))
            })

        self.assertListEqual([], test_health_info)

    def test_get_test_health_invalid_syntax_test_skipped(self):
        with self.assertLogs(level=logging.WARNING) as logging_cm:
            test_health_infos = test_health_extractor.get_repo_test_health(
                test_dir=_TEST_FILES_PATH,
                ignored_dirs=('disabled_tests', 'healthy_tests'),
                ignored_files={
                    str((_UNHEALTHY_TESTS_PATH /
                         'SampleTest.java').relative_to(_TEST_FILES_PATH))
                })

        self.assertListEqual([], test_health_infos)
        self.assertIn(str(_INVALID_SYNTAX_TEST_PATH), logging_cm.output[0])

    def test_get_test_health_checks_all_files(self):
        all_files = [
            f.relative_to(_CHROMIUM_SRC_PATH)
            for f in (_CHROMIUM_SRC_PATH /
                      _TEST_FILES_PATH).resolve(strict=True).rglob('*.java')
            if f.name != 'InvalidSyntaxTest.java'
        ]

        test_health_infos = [
            f.test_dir / f.test_filename
            for f in test_health_extractor.get_repo_test_health(
                test_dir=_TEST_FILES_PATH,
                ignored_files={str(_INVALID_SYNTAX_TEST_PATH)})
        ]

        self.assertListEqual(all_files, test_health_infos)


if __name__ == '__main__':
    unittest.main()