tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

mach_commands_base.py (3127B)


      1 # This Source Code Form is subject to the terms of the Mozilla Public
      2 # License, v. 2.0. If a copy of the MPL was not distributed with this
      3 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
      4 
      5 import sys
      6 
      7 from mozlog import handlers
      8 from mozlog.structuredlog import log_levels
      9 
     10 
     11 def create_parser_wpt():
     12    from wptrunner import wptcommandline
     13 
     14    result = wptcommandline.create_parser()
     15 
     16    result.add_argument(
     17        "--no-install",
     18        action="store_true",
     19        default=False,
     20        help="Do not install test runner application",
     21    )
     22    return result
     23 
     24 
     25 class CriticalLogBuffer(handlers.BaseHandler):
     26    """
     27    Buffer critical log entries
     28    """
     29 
     30    def __init__(self):
     31        self.log_entries = []
     32 
     33    def __call__(self, data):
     34        if (
     35            data["action"] == "log"
     36            and log_levels[data["level"]] <= log_levels["CRITICAL"]
     37        ):
     38            self.log_entries.append(data)
     39 
     40 
     41 class WebPlatformTestsRunner:
     42    """Run web platform tests."""
     43 
     44    def __init__(self, setup):
     45        self.setup = setup
     46 
     47    def setup_logging(self, **kwargs):
     48        from tools.wpt import run
     49 
     50        return run.setup_logging(
     51            kwargs,
     52            {self.setup.default_log_type: sys.stdout},
     53            formatter_defaults={"screenshot": True},
     54        )
     55 
     56    def run(self, logger, **kwargs):
     57        from mozbuild.base import BinaryNotFoundException
     58        from wptrunner import wptrunner
     59 
     60        if kwargs["manifest_update"] is not False:
     61            self.update_manifest(logger)
     62        kwargs["manifest_update"] = False
     63 
     64        if kwargs["product"] == "firefox":
     65            try:
     66                kwargs = self.setup.kwargs_firefox(kwargs)
     67            except BinaryNotFoundException as e:
     68                logger.error(e)
     69                logger.info(e.help())
     70                return 1
     71        elif kwargs["product"] == "firefox_android":
     72            kwargs = self.setup.kwargs_firefox_android(kwargs)
     73        else:
     74            kwargs = self.setup.kwargs_wptrun(kwargs)
     75 
     76        log_buffer = CriticalLogBuffer()
     77        logger.add_handler(log_buffer)
     78 
     79        result = 1
     80        try:
     81            result = wptrunner.start(**kwargs)
     82        finally:
     83            if int(result) != 0:
     84                self._process_log_errors(logger, log_buffer, kwargs)
     85            logger.remove_handler(log_buffer)
     86        return int(result)
     87 
     88    def _process_log_errors(self, logger, log_buffer, kwargs):
     89        for item in log_buffer.log_entries:
     90            if (
     91                kwargs["webdriver_binary"] is None
     92                and "webdriver" in item["message"]
     93                and self.setup.topobjdir
     94            ):
     95                print(
     96                    "ERROR: Couldn't find geckodriver binary required to run wdspec tests, consider `ac_add_options --enable-geckodriver` in your build configuration"
     97                )
     98 
     99    def update_manifest(self, logger, **kwargs):
    100        import manifestupdate
    101 
    102        return manifestupdate.run(
    103            logger=logger,
    104            src_root=self.setup.topsrcdir,
    105            obj_root=self.setup.topobjdir,
    106            **kwargs,
    107        )