Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 1a223796 authored by Treehugger Robot's avatar Treehugger Robot Committed by Gerrit Code Review
Browse files

Merge changes from topic "modify_setup_teardown"

* changes:
  Cert: generate coverage report in teardown_class
  Cert: do not count coverage report in external and out dirs
  Construct and destroy rootcanal and gd device objects per test
parents 418f31a1 368af498
Loading
Loading
Loading
Loading
+45 −15
Original line number Diff line number Diff line
@@ -21,11 +21,12 @@ import traceback
from functools import wraps
from grpc import RpcError

from cert.gd_base_test_lib import setup_class_core
from cert.gd_base_test_lib import teardown_class_core
from cert.gd_base_test_lib import setup_rootcanal
from cert.gd_base_test_lib import teardown_rootcanal
from cert.gd_base_test_lib import setup_test_core
from cert.gd_base_test_lib import teardown_test_core
from cert.gd_base_test_lib import dump_crashes_core
from cert.gd_device_lib import generate_coverage_report_for_host

from blueberry.tests.gd.cert.context import get_current_context
from blueberry.tests.gd.cert.gd_device import MOBLY_CONTROLLER_CONFIG_NAME as CONTROLLER_CONFIG_NAME
@@ -40,20 +41,34 @@ class GdBaseTestClass(base_test.BaseTestClass):
    SUBPROCESS_WAIT_TIMEOUT_SECONDS = 10

    def setup_class(self, dut_module, cert_module):
        self.dut_module = dut_module
        self.cert_module = cert_module
        self.log = TraceLogger(logging.getLogger())
        self.dut_coverage_info = None
        self.cert_coverage_info = None

    def teardown_class(self):
        # assume each test runs the same binary for dut and cert
        # generate coverage report after running all tests in a class
        if self.dut_coverage_info:
            generate_coverage_report_for_host(self.dut_coverage_info)
            self.dut_coverage_info = None
        if self.cert_coverage_info:
            generate_coverage_report_for_host(self.cert_coverage_info)
            self.cert_coverage_info = None

    def setup_test(self):
        self.log_path_base = get_current_context().get_full_output_path()
        self.verbose_mode = bool(self.user_params.get('verbose_mode', False))
        for config in self.controller_configs[CONTROLLER_CONFIG_NAME]:
            config['verbose_mode'] = self.verbose_mode

        self.info = setup_class_core(
            dut_module=dut_module,
            cert_module=cert_module,
        self.info = setup_rootcanal(
            dut_module=self.dut_module,
            cert_module=self.cert_module,
            verbose_mode=self.verbose_mode,
            log_path_base=self.log_path_base,
            controller_configs=self.controller_configs)
        self.dut_module = self.info['dut_module']
        self.cert_module = self.info['cert_module']
        self.rootcanal_running = self.info['rootcanal_running']
        self.rootcanal_logpath = self.info['rootcanal_logpath']
        self.rootcanal_process = self.info['rootcanal_process']
@@ -77,19 +92,34 @@ class GdBaseTestClass(base_test.BaseTestClass):
        self.register_controller(importlib.import_module('blueberry.tests.gd.cert.gd_device'), builtin=True)
        self.dut = self.gd_device[1]
        self.cert = self.gd_device[0]
        if self.dut.host_only_device:
            new_dut_coverage_info = self.dut.get_coverage_info()
            if self.dut_coverage_info:
                asserts.assert_true(
                    self.dut_coverage_info == new_dut_coverage_info,
                    msg="DUT coverage info must be the same for each test run, old: {}, new: {}".format(
                        self.dut_coverage_info, new_dut_coverage_info))
            self.dut_coverage_info = new_dut_coverage_info
        if self.cert.host_only_device:
            new_cert_coverage_info = self.cert.get_coverage_info()
            if self.cert_coverage_info:
                asserts.assert_true(
                    self.cert_coverage_info == new_cert_coverage_info,
                    msg="CERT coverage info must be the same for each test run, old: {}, new: {}".format(
                        self.cert_coverage_info, new_cert_coverage_info))
            self.cert_coverage_info = new_cert_coverage_info

    def teardown_class(self):
        teardown_class_core(
            rootcanal_running=self.rootcanal_running,
            rootcanal_process=self.rootcanal_process,
            rootcanal_logger=self.rootcanal_logger,
            subprocess_wait_timeout_seconds=self.SUBPROCESS_WAIT_TIMEOUT_SECONDS)

    def setup_test(self):
        setup_test_core(dut=self.dut, cert=self.cert, dut_module=self.dut_module, cert_module=self.cert_module)

    def teardown_test(self):
        teardown_test_core(cert=self.cert, dut=self.dut)
        # Destroy GD device objects
        self._controller_manager.unregister_controllers()
        teardown_rootcanal(
            rootcanal_running=self.rootcanal_running,
            rootcanal_process=self.rootcanal_process,
            rootcanal_logger=self.rootcanal_logger,
            subprocess_wait_timeout_seconds=self.SUBPROCESS_WAIT_TIMEOUT_SECONDS)

    @staticmethod
    def get_module_reference_name(a_module):
+18 −5
Original line number Diff line number Diff line
@@ -35,7 +35,8 @@ from cert.gd_device_lib import destroy_core
from cert.gd_device_lib import get_info
from cert.gd_device_lib import replace_vars
from cert.gd_device_lib import GdDeviceBaseCore
from cert.gd_device_lib import GdHostOnlyDeviceCore
from cert.gd_device_lib import get_coverage_profdata_path_for_host
from cert.gd_device_lib import merge_coverage_profdata_for_host
from cert.gd_device_lib import MOBLY_CONTROLLER_CONFIG_NAME
from cert.logging_client_interceptor import LoggingClientInterceptor
from cert.os_utils import get_gd_root
@@ -167,6 +168,7 @@ class GdHostOnlyDevice(GdDeviceBase):
                 type_identifier: str, name: str, verbose_mode: bool):
        super().__init__(grpc_port, grpc_root_server_port, signal_port, cmd, label, MOBLY_CONTROLLER_CONFIG_NAME, name,
                         verbose_mode)
        self.host_only_device = True
        # Enable LLVM code coverage output for host only tests
        self.backing_process_profraw_path = pathlib.Path(self.log_path_base).joinpath(
            "%s_%s_backing_coverage.profraw" % (self.type_identifier, self.label))
@@ -177,14 +179,25 @@ class GdHostOnlyDevice(GdDeviceBase):
            self.environment["ASAN_SYMBOLIZER_PATH"] = llvm_symbolizer
        else:
            logging.warning("[%s] Cannot find LLVM symbolizer at %s" % (self.label, str(llvm_symbolizer)))
        self.profdata_path = get_coverage_profdata_path_for_host(self.test_runner_base_path, self.type_identifier,
                                                                 self.label)

    def teardown(self):
        super().teardown()
        self.generate_coverage_report()
        merge_coverage_profdata_for_host(self.backing_process_profraw_path, self.profdata_path, self.label)

    def generate_coverage_report(self):
        GdHostOnlyDeviceCore.generate_coverage_report(self, self.backing_process_profraw_path, self.label,
                                                      self.test_runner_base_path, self.type_identifier, self.cmd)
    def get_coverage_info(self):
        """
        Get information needed for coverage reporting
        :return: a dictionary with all information needed for coverage reporting
        """
        return {
            "profdata_path": self.profdata_path,
            "label": self.label,
            "test_runner_base_path": self.test_runner_base_path,
            "type_identifier": self.type_identifier,
            "stack_bin": self.cmd[0]
        }

    def setup(self):
        # Ensure ports are available
+45 −15
Original line number Diff line number Diff line
@@ -36,11 +36,12 @@ from cert.os_utils import make_ports_available
from cert.os_utils import TerminalColor
from cert.gd_device import MOBLY_CONTROLLER_CONFIG_NAME as CONTROLLER_CONFIG_NAME
from facade import rootservice_pb2 as facade_rootservice
from cert.gd_base_test_lib import setup_class_core
from cert.gd_base_test_lib import teardown_class_core
from cert.gd_base_test_lib import setup_rootcanal
from cert.gd_base_test_lib import teardown_rootcanal
from cert.gd_base_test_lib import setup_test_core
from cert.gd_base_test_lib import teardown_test_core
from cert.gd_base_test_lib import dump_crashes_core
from cert.gd_device_lib import generate_coverage_report_for_host


class GdBaseTestClass(BaseTestClass):
@@ -48,19 +49,33 @@ class GdBaseTestClass(BaseTestClass):
    SUBPROCESS_WAIT_TIMEOUT_SECONDS = 10

    def setup_class(self, dut_module, cert_module):
        self.dut_module = dut_module
        self.cert_module = cert_module
        self.dut_coverage_info = None
        self.cert_coverage_info = None

    def teardown_class(self):
        # assume each test runs the same binary for dut and cert
        # generate coverage report after running all tests in a class
        if self.dut_coverage_info:
            generate_coverage_report_for_host(self.dut_coverage_info)
            self.dut_coverage_info = None
        if self.cert_coverage_info:
            generate_coverage_report_for_host(self.cert_coverage_info)
            self.cert_coverage_info = None

    def setup_test(self):
        self.log_path_base = get_current_context().get_full_output_path()
        self.verbose_mode = bool(self.user_params.get('verbose_mode', False))
        for config in self.controller_configs[CONTROLLER_CONFIG_NAME]:
            config['verbose_mode'] = self.verbose_mode

        self.info = setup_class_core(
            dut_module=dut_module,
            cert_module=cert_module,
        self.info = setup_rootcanal(
            dut_module=self.dut_module,
            cert_module=self.cert_module,
            verbose_mode=self.verbose_mode,
            log_path_base=self.log_path_base,
            controller_configs=self.controller_configs)
        self.dut_module = self.info['dut_module']
        self.cert_module = self.info['cert_module']
        self.rootcanal_running = self.info['rootcanal_running']
        self.rootcanal_logpath = self.info['rootcanal_logpath']
        self.rootcanal_process = self.info['rootcanal_process']
@@ -84,19 +99,34 @@ class GdBaseTestClass(BaseTestClass):
        self.register_controller(importlib.import_module('cert.gd_device'), builtin=True)
        self.dut = self.gd_devices[1]
        self.cert = self.gd_devices[0]
        if self.dut.host_only_device:
            new_dut_coverage_info = self.dut.get_coverage_info()
            if self.dut_coverage_info:
                asserts.assert_true(
                    self.dut_coverage_info == new_dut_coverage_info,
                    msg="DUT coverage info must be the same for each test run, old: {}, new: {}".format(
                        self.dut_coverage_info, new_dut_coverage_info))
            self.dut_coverage_info = new_dut_coverage_info
        if self.cert.host_only_device:
            new_cert_coverage_info = self.cert.get_coverage_info()
            if self.cert_coverage_info:
                asserts.assert_true(
                    self.cert_coverage_info == new_cert_coverage_info,
                    msg="CERT coverage info must be the same for each test run, old: {}, new: {}".format(
                        self.cert_coverage_info, new_cert_coverage_info))
            self.cert_coverage_info = new_cert_coverage_info

    def teardown_class(self):
        teardown_class_core(
            rootcanal_running=self.rootcanal_running,
            rootcanal_process=self.rootcanal_process,
            rootcanal_logger=self.rootcanal_logger,
            subprocess_wait_timeout_seconds=self.SUBPROCESS_WAIT_TIMEOUT_SECONDS)

    def setup_test(self):
        setup_test_core(dut=self.dut, cert=self.cert, dut_module=self.dut_module, cert_module=self.cert_module)

    def teardown_test(self):
        teardown_test_core(cert=self.cert, dut=self.dut)
        # Destroy GD device objects
        self._controller_manager.unregister_controllers()
        teardown_rootcanal(
            rootcanal_running=self.rootcanal_running,
            rootcanal_process=self.rootcanal_process,
            rootcanal_logger=self.rootcanal_logger,
            subprocess_wait_timeout_seconds=self.SUBPROCESS_WAIT_TIMEOUT_SECONDS)

    def __getattribute__(self, name):
        attr = super().__getattribute__(name)
+2 −2
Original line number Diff line number Diff line
@@ -34,7 +34,7 @@ from cert.gd_device import MOBLY_CONTROLLER_CONFIG_NAME as CONTROLLER_CONFIG_NAM
from facade import rootservice_pb2 as facade_rootservice


def setup_class_core(dut_module, cert_module, verbose_mode, log_path_base, controller_configs):
def setup_rootcanal(dut_module, cert_module, verbose_mode, log_path_base, controller_configs):
    info = {}
    info['dut_module'] = dut_module
    info['cert_module'] = cert_module
@@ -104,7 +104,7 @@ def setup_class_core(dut_module, cert_module, verbose_mode, log_path_base, contr
    return info


def teardown_class_core(rootcanal_running, rootcanal_process, rootcanal_logger, subprocess_wait_timeout_seconds):
def teardown_rootcanal(rootcanal_running, rootcanal_process, rootcanal_logger, subprocess_wait_timeout_seconds):
    if rootcanal_running:
        stop_signal = signal.SIGINT
        rootcanal_process.send_signal(stop_signal)
+18 −5
Original line number Diff line number Diff line
@@ -42,7 +42,8 @@ from cert.gd_device_lib import destroy_core
from cert.gd_device_lib import get_info
from cert.gd_device_lib import replace_vars
from cert.gd_device_lib import GdDeviceBaseCore
from cert.gd_device_lib import GdHostOnlyDeviceCore
from cert.gd_device_lib import get_coverage_profdata_path_for_host
from cert.gd_device_lib import merge_coverage_profdata_for_host
from cert.gd_device_lib import MOBLY_CONTROLLER_CONFIG_NAME
from cert.gd_device_lib import ACTS_CONTROLLER_REFERENCE_NAME
from cert.logging_client_interceptor import LoggingClientInterceptor
@@ -170,6 +171,7 @@ class GdHostOnlyDevice(GdDeviceBase):
                 type_identifier: str, name: str, verbose_mode: bool):
        super().__init__(grpc_port, grpc_root_server_port, signal_port, cmd, label, MOBLY_CONTROLLER_CONFIG_NAME, name,
                         verbose_mode)
        self.host_only_device = True
        # Enable LLVM code coverage output for host only tests
        self.backing_process_profraw_path = pathlib.Path(self.log_path_base).joinpath(
            "%s_%s_backing_coverage.profraw" % (self.type_identifier, self.label))
@@ -180,14 +182,25 @@ class GdHostOnlyDevice(GdDeviceBase):
            self.environment["ASAN_SYMBOLIZER_PATH"] = llvm_symbolizer
        else:
            logging.warning("[%s] Cannot find LLVM symbolizer at %s" % (self.label, str(llvm_symbolizer)))
        self.profdata_path = get_coverage_profdata_path_for_host(self.test_runner_base_path, self.type_identifier,
                                                                 self.label)

    def teardown(self):
        super().teardown()
        self.generate_coverage_report()
        merge_coverage_profdata_for_host(self.backing_process_profraw_path, self.profdata_path, self.label)

    def generate_coverage_report(self):
        GdHostOnlyDeviceCore.generate_coverage_report(self, self.backing_process_profraw_path, self.label,
                                                      self.test_runner_base_path, self.type_identifier, self.cmd)
    def get_coverage_info(self):
        """
        Get information needed for coverage reporting
        :return: a dictionary with all information needed for coverage reporting
        """
        return {
            "profdata_path": self.profdata_path,
            "label": self.label,
            "test_runner_base_path": self.test_runner_base_path,
            "type_identifier": self.type_identifier,
            "stack_bin": self.cmd[0]
        }

    def setup(self):
        # Ensure ports are available
Loading