xref: /aosp_15_r20/external/cronet/build/fuchsia/test/isolate_daemon.py (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1*6777b538SAndroid Build Coastguard Worker#!/usr/bin/env vpython3
2*6777b538SAndroid Build Coastguard Worker# Copyright 2023 The Chromium Authors
3*6777b538SAndroid Build Coastguard Worker# Use of this source code is governed by a BSD-style license that can be
4*6777b538SAndroid Build Coastguard Worker# found in the LICENSE file.
5*6777b538SAndroid Build Coastguard Worker"""Sets up the isolate daemon environment to run test on the bots."""
6*6777b538SAndroid Build Coastguard Worker
7*6777b538SAndroid Build Coastguard Workerimport os
8*6777b538SAndroid Build Coastguard Workerimport sys
9*6777b538SAndroid Build Coastguard Workerimport tempfile
10*6777b538SAndroid Build Coastguard Worker
11*6777b538SAndroid Build Coastguard Workerfrom contextlib import AbstractContextManager
12*6777b538SAndroid Build Coastguard Workerfrom typing import List
13*6777b538SAndroid Build Coastguard Worker
14*6777b538SAndroid Build Coastguard Workerfrom common import catch_sigterm, set_ffx_isolate_dir, start_ffx_daemon, \
15*6777b538SAndroid Build Coastguard Worker                   stop_ffx_daemon, wait_for_sigterm
16*6777b538SAndroid Build Coastguard Workerfrom ffx_integration import ScopedFfxConfig
17*6777b538SAndroid Build Coastguard Worker
18*6777b538SAndroid Build Coastguard Worker
19*6777b538SAndroid Build Coastguard Workerclass IsolateDaemon(AbstractContextManager):
20*6777b538SAndroid Build Coastguard Worker    """Sets up the environment of an isolate ffx daemon."""
21*6777b538SAndroid Build Coastguard Worker    class IsolateDir(AbstractContextManager):
22*6777b538SAndroid Build Coastguard Worker        """Sets up the ffx isolate dir to a temporary folder."""
23*6777b538SAndroid Build Coastguard Worker        def __init__(self):
24*6777b538SAndroid Build Coastguard Worker            self._temp_dir = tempfile.TemporaryDirectory()
25*6777b538SAndroid Build Coastguard Worker
26*6777b538SAndroid Build Coastguard Worker        def __enter__(self):
27*6777b538SAndroid Build Coastguard Worker            set_ffx_isolate_dir(self._temp_dir.__enter__())
28*6777b538SAndroid Build Coastguard Worker            return self
29*6777b538SAndroid Build Coastguard Worker
30*6777b538SAndroid Build Coastguard Worker        def __exit__(self, exc_type, exc_value, traceback):
31*6777b538SAndroid Build Coastguard Worker            return self._temp_dir.__exit__(exc_type, exc_value, traceback)
32*6777b538SAndroid Build Coastguard Worker
33*6777b538SAndroid Build Coastguard Worker        def name(self):
34*6777b538SAndroid Build Coastguard Worker            """Returns the location of the isolate dir."""
35*6777b538SAndroid Build Coastguard Worker            return self._temp_dir.name
36*6777b538SAndroid Build Coastguard Worker
37*6777b538SAndroid Build Coastguard Worker    def __init__(self, extra_inits: List[AbstractContextManager] = None):
38*6777b538SAndroid Build Coastguard Worker        # Keep the alphabetical order.
39*6777b538SAndroid Build Coastguard Worker        self._extra_inits = [
40*6777b538SAndroid Build Coastguard Worker            self.IsolateDir(),
41*6777b538SAndroid Build Coastguard Worker            ScopedFfxConfig('ffx.isolated', 'true'),
42*6777b538SAndroid Build Coastguard Worker            ScopedFfxConfig('daemon.autostart', 'false'),
43*6777b538SAndroid Build Coastguard Worker            # fxb/126212: The timeout rate determines the timeout for each file
44*6777b538SAndroid Build Coastguard Worker            # transfer based on the size of the file / this rate (in MB).
45*6777b538SAndroid Build Coastguard Worker            # Decreasing the rate to 1 (from 5) increases the timeout in
46*6777b538SAndroid Build Coastguard Worker            # swarming, where large files can take longer to transfer.
47*6777b538SAndroid Build Coastguard Worker            ScopedFfxConfig('fastboot.flash.timeout_rate', '1'),
48*6777b538SAndroid Build Coastguard Worker            ScopedFfxConfig('fastboot.reboot.reconnect_timeout', '120'),
49*6777b538SAndroid Build Coastguard Worker            ScopedFfxConfig('fastboot.usb.disabled', 'true'),
50*6777b538SAndroid Build Coastguard Worker            ScopedFfxConfig('log.level', 'debug'),
51*6777b538SAndroid Build Coastguard Worker            ScopedFfxConfig('repository.server.listen', '"[::]:0"'),
52*6777b538SAndroid Build Coastguard Worker        ] + (extra_inits or [])
53*6777b538SAndroid Build Coastguard Worker
54*6777b538SAndroid Build Coastguard Worker    # Updating configurations to meet the requirement of isolate.
55*6777b538SAndroid Build Coastguard Worker    def __enter__(self):
56*6777b538SAndroid Build Coastguard Worker        # This environment variable needs to be set before stopping ffx daemon
57*6777b538SAndroid Build Coastguard Worker        # to avoid sending unnecessary analytics.
58*6777b538SAndroid Build Coastguard Worker        os.environ['FUCHSIA_ANALYTICS_DISABLED'] = '1'
59*6777b538SAndroid Build Coastguard Worker        stop_ffx_daemon()
60*6777b538SAndroid Build Coastguard Worker        for extra_init in self._extra_inits:
61*6777b538SAndroid Build Coastguard Worker            extra_init.__enter__()
62*6777b538SAndroid Build Coastguard Worker        start_ffx_daemon()
63*6777b538SAndroid Build Coastguard Worker        return self
64*6777b538SAndroid Build Coastguard Worker
65*6777b538SAndroid Build Coastguard Worker    def __exit__(self, exc_type, exc_value, traceback):
66*6777b538SAndroid Build Coastguard Worker        for extra_init in self._extra_inits:
67*6777b538SAndroid Build Coastguard Worker            extra_init.__exit__(exc_type, exc_value, traceback)
68*6777b538SAndroid Build Coastguard Worker        stop_ffx_daemon()
69*6777b538SAndroid Build Coastguard Worker
70*6777b538SAndroid Build Coastguard Worker    def isolate_dir(self):
71*6777b538SAndroid Build Coastguard Worker        """Returns the location of the isolate dir."""
72*6777b538SAndroid Build Coastguard Worker        return self._extra_inits[0].name()
73*6777b538SAndroid Build Coastguard Worker
74*6777b538SAndroid Build Coastguard Worker
75*6777b538SAndroid Build Coastguard Workerdef main():
76*6777b538SAndroid Build Coastguard Worker    """Executes the IsolateDaemon and waits for the sigterm."""
77*6777b538SAndroid Build Coastguard Worker    catch_sigterm()
78*6777b538SAndroid Build Coastguard Worker    with IsolateDaemon() as daemon:
79*6777b538SAndroid Build Coastguard Worker        # Clients can assume the daemon is up and running when the output is
80*6777b538SAndroid Build Coastguard Worker        # captured. Note, the client may rely on the printed isolate_dir.
81*6777b538SAndroid Build Coastguard Worker        print(daemon.isolate_dir(), flush=True)
82*6777b538SAndroid Build Coastguard Worker        wait_for_sigterm('shutting down the daemon.')
83*6777b538SAndroid Build Coastguard Worker
84*6777b538SAndroid Build Coastguard Worker
85*6777b538SAndroid Build Coastguard Workerif __name__ == '__main__':
86*6777b538SAndroid Build Coastguard Worker    sys.exit(main())
87