1818import sys
1919
2020from subprocess import CompletedProcess
21- from typing import List , Set
21+ from typing import Any , Iterable , List , Mapping , NamedTuple , Set
2222
2323# The import is coming from vpython wheel and pylint cannot find it.
2424import yaml # pylint: disable=import-error
2929# is guaranteed.
3030
3131sys .path .insert (
32- 0 ,
33- os .path .join (
34- os .path .dirname (__file__ ), '../../tools/fuchsia/test_scripts/test/'
35- )
32+ 0 , os .path .join (os .path .dirname (__file__ ), '../../tools/fuchsia/test_scripts/test/' )
3633)
3734
3835# pylint: disable=import-error, wrong-import-position
5148OUT_DIR = os .path .join (DIR_SRC_ROOT , 'out' , VARIANT )
5249
5350
54- class BundledTestRunner (TestRunner ):
51+ # Visible for testing
52+ class TestCase (NamedTuple ):
53+ package : str
54+ args : str = ''
55+
56+
57+ class _BundledTestRunner (TestRunner ):
5558
5659 # private, use bundled_test_runner_of function instead.
57- def __init__ (
58- self , target_id : str , package_deps : Set [str ], tests : List [str ],
59- logs_dir : str
60- ):
60+ def __init__ (self , target_id : str , package_deps : Set [str ], tests : List [TestCase ], logs_dir : str ):
6161 super ().__init__ (OUT_DIR , [], None , target_id , list (package_deps ))
6262 self .tests = tests
6363 self .logs_dir = logs_dir
6464
6565 def run_test (self ) -> CompletedProcess :
6666 returncode = 0
6767 for test in self .tests :
68- # pylint: disable=protected-access
68+ assert test . package . endswith ( '.cm' )
6969 test_runner = ExecutableTestRunner (
70- OUT_DIR , [] , test , self ._target_id , None , self .logs_dir , [], None
70+ OUT_DIR , test . args . split () , test . package , self ._target_id , None , self .logs_dir , [], None
7171 )
72+ # pylint: disable=protected-access
7273 test_runner ._package_deps = self ._package_deps
7374 result = test_runner .run_test ().returncode
7475 logging .info ('Result of test %s is %s' , test , result )
@@ -77,33 +78,8 @@ def run_test(self) -> CompletedProcess:
7778 return CompletedProcess (args = '' , returncode = returncode )
7879
7980
80- def bundled_test_runner_of (target_id : str ) -> BundledTestRunner :
81- log_dir = os .environ .get ('FLUTTER_LOGS_DIR' , '/tmp/log' )
82- with open (os .path .join (os .path .dirname (__file__ ), 'test_suites.yaml' ),
83- 'r' ) as file :
84- tests = yaml .safe_load (file )
85- # TODO(zijiehe-google-com): Run tests with extra test arguments,
86- # https://github.com/flutter/flutter/issues/140179.
87- tests = list (
88- filter (
89- lambda test : test ['test_command' ].startswith ('test run ' ) and test [
90- 'test_command' ].endswith ('.cm' ), tests
91- )
92- )
93- # TODO(zijiehe-google-com): Run tests with dart aot,
94- # https://github.com/flutter/flutter/issues/140179.
95- tests = list (
96- filter (
97- lambda test : 'run_with_dart_aot' not in test or test [
98- 'run_with_dart_aot' ] != 'true' , tests
99- )
100- )
101- tests = list (
102- filter (
103- lambda test : 'variant' not in test or VARIANT == test ['variant' ],
104- tests
105- )
106- )
81+ # Visible for testing
82+ def resolve_packages (tests : Iterable [Mapping [str , Any ]]) -> Set [str ]:
10783 packages = set ()
10884 for test in tests :
10985 if 'package' in test :
@@ -128,14 +104,43 @@ def bundled_test_runner_of(target_id: str) -> BundledTestRunner:
128104 resolved_packages .add (new_package )
129105 else :
130106 resolved_packages .add (os .path .join (OUT_DIR , package ))
131- return BundledTestRunner (
132- target_id , resolved_packages ,
133- [test ['test_command' ][len ('test run ' ):] for test in tests ], log_dir
134- )
107+ return resolved_packages
108+
109+
110+ # Visible for testing
111+ def build_test_cases (tests : Iterable [Mapping [str , Any ]]) -> List [TestCase ]:
112+ test_cases = []
113+ for test in [t ['test_command' ] for t in tests ]:
114+ assert test .startswith ('test run ' )
115+ test = test [len ('test run ' ):]
116+ if ' -- ' in test :
117+ package , args = test .split (' -- ' , 1 )
118+ test_cases .append (TestCase (package = package , args = args ))
119+ else :
120+ test_cases .append (TestCase (package = test ))
121+ return test_cases
122+
123+
124+ def _bundled_test_runner_of (target_id : str ) -> _BundledTestRunner :
125+ log_dir = os .environ .get ('FLUTTER_LOGS_DIR' , '/tmp/log' )
126+ with open (os .path .join (os .path .dirname (__file__ ), 'test_suites.yaml' ), 'r' ) as file :
127+ tests = yaml .safe_load (file )
128+ # TODO(zijiehe-google-com): Run tests with dart aot,
129+ # https://github.com/flutter/flutter/issues/140179.
130+ def dart_jit (test ) -> bool :
131+ return 'run_with_dart_aot' not in test or test ['run_with_dart_aot' ] != 'true'
132+
133+ # TODO(zijiehe-google-com): Run all tests in release build,
134+ # https://github.com/flutter/flutter/issues/140179.
135+ def variant (test ) -> bool :
136+ return 'variant' not in test or test ['variant' ] == VARIANT
137+
138+ tests = [t for t in tests if dart_jit (t ) and variant (t )]
139+ return _BundledTestRunner (target_id , resolve_packages (tests ), build_test_cases (tests ), log_dir )
135140
136141
137142def _get_test_runner (runner_args : argparse .Namespace , * _ ) -> TestRunner :
138- return bundled_test_runner_of (runner_args .target_id )
143+ return _bundled_test_runner_of (runner_args .target_id )
139144
140145
141146if __name__ == '__main__' :
0 commit comments