diff --git a/cobalt/black_box_tests/black_box_cobalt_runner.py b/cobalt/black_box_tests/black_box_cobalt_runner.py index 9e83f096871e..fbea13b862d0 100644 --- a/cobalt/black_box_tests/black_box_cobalt_runner.py +++ b/cobalt/black_box_tests/black_box_cobalt_runner.py @@ -43,14 +43,17 @@ class BlackBoxCobaltRunner(cobalt_runner.CobaltRunner): class AssertException(Exception): """Raised when assert condition fails.""" - def __init__(self, - launcher_params, - url, - log_file=None, - target_params=None, - success_message=None, - poll_until_wait_seconds=POLL_UNTIL_WAIT_SECONDS, - **kwargs): + def __init__( + self, + launcher_params, + url, + log_file=None, + target_params=None, + success_message=None, + poll_until_wait_seconds=POLL_UNTIL_WAIT_SECONDS, + web_server_port=None, + **kwargs, + ): # For black box tests, don't log inline script warnings, we intend to # explicitly control timings for suspends and resumes, so we are not # concerned about a "suspend at the wrong time". @@ -65,7 +68,9 @@ def __init__(self, target_params, success_message, poll_until_wait_seconds=poll_until_wait_seconds, - **kwargs) + web_server_port=web_server_port, + **kwargs, + ) self.poll_until_wait_seconds = poll_until_wait_seconds @@ -82,10 +87,12 @@ def PollUntilFoundOrTestsFailedWithReconnects(self, css_selector): if self.FindElements(css_selector): break is_failed = self.JSTestsFailed() - except (cobalt_runner.CobaltRunner.AssertException, - selenium_exceptions.NoSuchElementException, - selenium_exceptions.NoSuchWindowException, - selenium_exceptions.WebDriverException) as e: + except ( + cobalt_runner.CobaltRunner.AssertException, + selenium_exceptions.NoSuchElementException, + selenium_exceptions.NoSuchWindowException, + selenium_exceptions.WebDriverException, + ) as e: # If the page is reloaded, the webdriver client status becomes # stale and should be reconnected. logging.warning(e) @@ -103,8 +110,8 @@ def JSTestsSucceeded(self): # JavaScript test logic completion. self.PollUntilFound('[' + _TEST_STATUS_ELEMENT_NAME + ']') body_element = self.UniqueFind('body') - return body_element.get_attribute( - _TEST_STATUS_ELEMENT_NAME) == _JS_TEST_SUCCESS_MESSAGE + return (body_element.get_attribute(_TEST_STATUS_ELEMENT_NAME) == + _JS_TEST_SUCCESS_MESSAGE) def JSTestsFailed(self): """Check failed test assertion in HTML page.""" @@ -112,8 +119,9 @@ def JSTestsFailed(self): # Call onTestEnd() in black_box_js_test_utils.js to unblock the waiting for # JavaScript test logic completion. body_element = self.UniqueFind('body') - return body_element and body_element.get_attribute( - _TEST_STATUS_ELEMENT_NAME) == _JS_TEST_FAILURE_MESSAGE + return (body_element and + body_element.get_attribute(_TEST_STATUS_ELEMENT_NAME) + == _JS_TEST_FAILURE_MESSAGE) def WaitForJSTestsSetup(self): """Poll setup status until JavaScript gives green light.""" diff --git a/cobalt/black_box_tests/black_box_tests.py b/cobalt/black_box_tests/black_box_tests.py index ca5129ea317f..4d942eba6181 100755 --- a/cobalt/black_box_tests/black_box_tests.py +++ b/cobalt/black_box_tests/black_box_tests.py @@ -34,7 +34,6 @@ from starboard.tools import log_level _DISABLED_BLACKBOXTEST_CONFIGS = [ - 'android-arm/devel', 'android-arm64/devel', 'android-x86/devel', 'evergreen-arm/devel', @@ -146,7 +145,11 @@ def tearDownClass(cls): super(BlackBoxTestCase, cls).tearDownClass() logging.info('Done %s', cls.__name__) - def CreateCobaltRunner(self, url=None, target_params=None, **kwargs): + def CreateCobaltRunner(self, + url=None, + target_params=None, + web_server_port=None, + **kwargs): all_target_params = list(target_params) if target_params else [] if _launcher_params.target_params is not None: all_target_params += _launcher_params.target_params @@ -155,7 +158,9 @@ def CreateCobaltRunner(self, url=None, target_params=None, **kwargs): launcher_params=_launcher_params, url=url, target_params=all_target_params, - **kwargs) + web_server_port=web_server_port, + **kwargs, + ) def GetBindingAddress(self): return _server_binding_address @@ -175,7 +180,8 @@ def LoadTests(launcher_params, test_set): out_directory=launcher_params.out_directory, loader_platform=launcher_params.loader_platform, loader_config=launcher_params.loader_config, - loader_out_directory=launcher_params.loader_out_directory) + loader_out_directory=launcher_params.loader_out_directory, + ) test_targets = [] @@ -212,7 +218,8 @@ def LoadEvergreenEndToEndTests(launcher_params): loader_out_directory=launcher_params.loader_out_directory, # The more lightweight elf_loader_sandbox can't be used since it has no # knowledge of updates or installations. - loader_target='loader_app') + loader_target='loader_app', + ) test_targets = _TESTS_EVERGREEN_END_TO_END @@ -227,10 +234,9 @@ class BlackBoxTests(object): """Helper class to run all black box tests and return results.""" def __init__(self, args): - self.args = args - #TODO(b/137905502): These globals should be refactored + # TODO(b/137905502): These globals should be refactored # Setup global variables used by test cases. global _launcher_params _launcher_params = command_line.CreateLauncherParams() @@ -273,9 +279,12 @@ def __init__(self, args): # Test domains used in web platform tests to be resolved to the server # binding address. hosts = [ - 'web-platform.test', 'www.web-platform.test', 'www1.web-platform.test', - 'www2.web-platform.test', 'xn--n8j6ds53lwwkrqhv28a.web-platform.test', - 'xn--lve-6lad.web-platform.test' + 'web-platform.test', + 'www.web-platform.test', + 'www1.web-platform.test', + 'www2.web-platform.test', + 'xn--n8j6ds53lwwkrqhv28a.web-platform.test', + 'xn--lve-6lad.web-platform.test', ] self.host_resolve_map = {host: _server_binding_address for host in hosts} @@ -292,7 +301,9 @@ def Run(self): run_cobalt_tests = False logging.warning( 'Cobalt blackbox tests disabled for platform:%s config:%s', - _launcher_params.platform, _launcher_params.config) + _launcher_params.platform, + _launcher_params.config, + ) if launch_config in _EVERGREEN_COMPATIBLE_CONFIGS: run_evergreen_tests = self.args.test_set in ['all', 'evergreen'] @@ -304,22 +315,22 @@ def LoadAndRunTests(): if self.args.test_name: suite = unittest.TestLoader().loadTestsFromName(_TEST_DIR_PATH + self.args.test_name) - return_code = not unittest.TextTestRunner( - verbosity=2, stream=sys.stdout).run(suite).wasSuccessful() + return_code = (not unittest.TextTestRunner( + verbosity=2, stream=sys.stdout).run(suite).wasSuccessful()) return return_code else: cobalt_tests_return_code = 0 if run_cobalt_tests: suite = LoadTests(_launcher_params, self.args.test_set) # Using verbosity=2 to log individual test function names and results. - cobalt_tests_return_code = not unittest.TextTestRunner( - verbosity=2, stream=sys.stdout).run(suite).wasSuccessful() + cobalt_tests_return_code = (not unittest.TextTestRunner( + verbosity=2, stream=sys.stdout).run(suite).wasSuccessful()) evergreen_tests_return_code = 0 if run_evergreen_tests: suite = LoadEvergreenEndToEndTests(_launcher_params) - evergreen_tests_return_code = not unittest.TextTestRunner( - verbosity=2, stream=sys.stdout).run(suite).wasSuccessful() + evergreen_tests_return_code = (not unittest.TextTestRunner( + verbosity=2, stream=sys.stdout).run(suite).wasSuccessful()) return cobalt_tests_return_code or evergreen_tests_return_code @@ -328,7 +339,8 @@ def LoadAndRunTests(): with ProxyServer( port=self.proxy_port, host_resolve_map=self.host_resolve_map, - client_ips=self.args.device_ips): + client_ips=self.args.device_ips, + ): return LoadAndRunTests() else: return LoadAndRunTests() @@ -357,8 +369,10 @@ def GetUnusedPort(self, addresses): break if unused: return port - logging.error('Can not find unused port on addresses within %s attempts.', - _PORT_SELECTION_RETRY_LIMIT) + logging.error( + 'Can not find unused port on addresses within %s attempts.', + _PORT_SELECTION_RETRY_LIMIT, + ) return -1 finally: for sock in socks: @@ -394,45 +408,52 @@ def main(): parser.add_argument( '--server_binding_address', default='127.0.0.1', - help='Binding address used to create the test server.') + help='Binding address used to create the test server.', + ) parser.add_argument( '--proxy_address', default=None, help=('Address to the proxy server that all black box' 'tests are run through. If not specified, the' - 'server binding address is used.')) + 'server binding address is used.'), + ) parser.add_argument( '--proxy_port', default=None, help=('Port used to create the proxy server that all' 'black box tests are run through. If not' - 'specified, a random free port is used.')) + 'specified, a random free port is used.'), + ) parser.add_argument( '--test_name', default=None, - help=('Name of test to be run. If not specified, all ' - 'tests are run.')) + help='Name of test to be run. If not specified, all tests are run.', + ) parser.add_argument( '--wpt_http_port', default=None, help=('Port used to create the web platform test http' 'server. If not specified, a random free port is' - 'used.')) + 'used.'), + ) parser.add_argument( '--device_id', default=None, help=('ID of test device to connect. If specified, it will be passed ' - 'as --dev_servers_listen_ip param on the test device.')) + 'as --dev_servers_listen_ip param on the test device.'), + ) parser.add_argument( '--device_ips', default=None, nargs='*', help=('IPs of test devices that will be allowed to connect. If not ' - 'specified, all IPs will be allowed to connect.')) + 'specified, all IPs will be allowed to connect.'), + ) parser.add_argument( '--test_set', choices=['all', 'wpt', 'blackbox', 'evergreen'], - default='all') + default='all', + ) args, _ = parser.parse_known_args() log_level.InitializeLogging(args) diff --git a/cobalt/black_box_tests/proxy_server.py b/cobalt/black_box_tests/proxy_server.py index 70ef34d4385f..d1ac1ba788f1 100644 --- a/cobalt/black_box_tests/proxy_server.py +++ b/cobalt/black_box_tests/proxy_server.py @@ -33,15 +33,22 @@ class ProxyServer(object): """HTTP Proxy Server.""" - def __init__(self, - hostname='0.0.0.0', - port='8000', - host_resolve_map=None, - client_ips=None): + def __init__( + self, + hostname='0.0.0.0', + port='8000', + host_resolve_map=None, + client_ips=None, + ): self.command = [ 'python3', os.path.join(SRC_DIR, 'third_party', 'proxy_py', 'proxy.py'), - '--hostname', hostname, '--port', port, '--log-level', 'WARNING' + '--hostname', + hostname, + '--port', + port, + '--log-level', + 'WARNING', ] self.host_resolver_path = None diff --git a/cobalt/black_box_tests/tests/allow_eval.py b/cobalt/black_box_tests/tests/allow_eval.py index 4f5137d2e911..8d8c55361bee 100644 --- a/cobalt/black_box_tests/tests/allow_eval.py +++ b/cobalt/black_box_tests/tests/allow_eval.py @@ -25,9 +25,9 @@ class AllowEvalTest(black_box_tests.BlackBoxTestCase): """Ensure that client page can use eval() when CSP is missing.""" def test_allow_eval(self): - with ThreadedWebServer(binding_address=self.GetBindingAddress()) as server: url = server.GetURL(file_name='testdata/allow_eval.html') - with self.CreateCobaltRunner(url=url) as runner: + with self.CreateCobaltRunner( + url=url, web_server_port=server.GetPort()) as runner: self.assertTrue(runner.JSTestsSucceeded()) diff --git a/cobalt/black_box_tests/tests/cancel_sync_loads_when_suspended.py b/cobalt/black_box_tests/tests/cancel_sync_loads_when_suspended.py index a40956a92704..27dd677b4b6d 100644 --- a/cobalt/black_box_tests/tests/cancel_sync_loads_when_suspended.py +++ b/cobalt/black_box_tests/tests/cancel_sync_loads_when_suspended.py @@ -38,14 +38,14 @@ import logging import os -from six.moves import SimpleHTTPServer -from six.moves.urllib.parse import urlparse import threading import traceback from cobalt.black_box_tests import black_box_tests from cobalt.black_box_tests.threaded_web_server import MakeRequestHandlerClass from cobalt.black_box_tests.threaded_web_server import ThreadedWebServer +from six.moves import SimpleHTTPServer +from six.moves.urllib.parse import urlparse _CANCEL_SYNC_LOADS_WHEN_SUSPENDED_HTML = 'cancel_sync_loads_when_suspended.html' _CANCEL_SYNC_LOADS_WHEN_SUSPENDED_JS = 'cancel_sync_loads_when_suspended.js' @@ -90,17 +90,18 @@ def _load_page(self, webdriver, url): traceback.print_exc() def test_cancel_sync_loads_when_suspended(self): - # Step 2. Start Cobalt, and point it to the socket created in Step 1. try: with ThreadedWebServer(JavascriptRequestDetector, self.GetBindingAddress()) as server: - with self.CreateCobaltRunner(url='about:blank') as runner: + with self.CreateCobaltRunner( + url='about:blank', web_server_port=server.GetPort()) as runner: target_url = server.GetURL(file_name='../testdata/' + _CANCEL_SYNC_LOADS_WHEN_SUSPENDED_HTML) cobalt_launcher_thread = threading.Thread( target=CancelSyncLoadsWhenSuspended._load_page, - args=(self, runner.webdriver, target_url)) + args=(self, runner.webdriver, target_url), + ) cobalt_launcher_thread.start() # Step 3. Wait HTTP request for html resource. diff --git a/cobalt/black_box_tests/tests/compression_test.py b/cobalt/black_box_tests/tests/compression_test.py index 27ea24aef65d..56d24d2c1d91 100644 --- a/cobalt/black_box_tests/tests/compression_test.py +++ b/cobalt/black_box_tests/tests/compression_test.py @@ -125,10 +125,12 @@ def execute_test(test_runner, encoding_type): path = os.path.abspath(os.path.join(os.path.dirname(__file__), '..')) with ThreadedWebServer( binding_address=test_runner.GetBindingAddress(), - handler=make_request_handler_class(path, encoding_type)) as server: + handler=make_request_handler_class(path, encoding_type), + ) as server: url = server.GetURL(file_name='testdata/compression.html') - with test_runner.CreateCobaltRunner(url=url) as runner: + with test_runner.CreateCobaltRunner( + url=url, web_server_port=server.GetPort()) as runner: test_runner.assertTrue(runner.JSTestsSucceeded()) diff --git a/cobalt/black_box_tests/tests/conceal_visibility.py b/cobalt/black_box_tests/tests/conceal_visibility.py index b4d76f1399e0..b959c2052ee4 100644 --- a/cobalt/black_box_tests/tests/conceal_visibility.py +++ b/cobalt/black_box_tests/tests/conceal_visibility.py @@ -25,11 +25,11 @@ class ConcealVisibilityTest(black_box_tests.BlackBoxTestCase): """Verify correct visibility changes during and after conceal event.""" def test_conceal_visibility(self): - with ThreadedWebServer(binding_address=self.GetBindingAddress()) as server: url = server.GetURL(file_name='testdata/conceal_visibility.html') - with self.CreateCobaltRunner(url=url) as runner: + with self.CreateCobaltRunner( + url=url, web_server_port=server.GetPort()) as runner: runner.WaitForJSTestsSetup() runner.SendConceal() runner.SendFocus() diff --git a/cobalt/black_box_tests/tests/deep_links.py b/cobalt/black_box_tests/tests/deep_links.py index 211e867c53ad..d73bed4ca3b5 100644 --- a/cobalt/black_box_tests/tests/deep_links.py +++ b/cobalt/black_box_tests/tests/deep_links.py @@ -35,8 +35,6 @@ import inspect import logging import os -from six.moves import SimpleHTTPServer -from six.moves.urllib.parse import urlparse import threading import time import traceback @@ -44,6 +42,8 @@ from cobalt.black_box_tests import black_box_tests from cobalt.black_box_tests.threaded_web_server import MakeRequestHandlerClass from cobalt.black_box_tests.threaded_web_server import ThreadedWebServer +from six.moves import SimpleHTTPServer +from six.moves.urllib.parse import urlparse _DEEP_LINKS_HTML = 'deep_links.html' _DEEP_LINKS_JS = 'deep_links.js' @@ -104,14 +104,16 @@ def _send_link(self, query_parameter=''): try: with ThreadedWebServer(JavascriptRequestDetector, self.GetBindingAddress()) as server: - with self.CreateCobaltRunner(url='about:blank') as runner: + with self.CreateCobaltRunner( + url='about:blank', web_server_port=server.GetPort()) as runner: target_url = server.GetURL(file_name='../testdata/' + _DEEP_LINKS_HTML) if query_parameter != '': target_url += '?' + query_parameter cobalt_launcher_thread = threading.Thread( target=DeepLink._load_page, - args=(self, runner.webdriver, target_url)) + args=(self, runner.webdriver, target_url), + ) cobalt_launcher_thread.start() # Step 3. Send 3 deep links @@ -151,7 +153,10 @@ def _start_link(self, query_parameter=''): initial_deep_link = 'link 3' # Expected by our test JS with self.CreateCobaltRunner( - url=url, target_params=['--link=' + initial_deep_link]) as runner: + url=url, + target_params=['--link=' + initial_deep_link], + web_server_port=server.GetPort(), + ) as runner: success = runner.JSTestsSucceeded() if success: logging.info('[ OK ] %s', inspect.stack()[1][3]) @@ -167,14 +172,16 @@ def _delayed_link(self, query_parameter=''): try: with ThreadedWebServer(JavascriptRequestDetector, self.GetBindingAddress()) as server: - with self.CreateCobaltRunner(url='about:blank') as runner: + with self.CreateCobaltRunner( + url='about:blank', web_server_port=server.GetPort()) as runner: target_url = server.GetURL(file_name='../testdata/' + _DEEP_LINKS_HTML) if query_parameter != '': target_url += '?' + query_parameter cobalt_launcher_thread = threading.Thread( target=DeepLink._load_page, - args=(self, runner.webdriver, target_url)) + args=(self, runner.webdriver, target_url), + ) cobalt_launcher_thread.start() # Step 3. Load & run the javascript resource. @@ -239,8 +246,9 @@ def test_send_link_and_navigate_and_consume_with_initial_deep_link(self): return self._send_link('navigate_immediate&initial') def test_send_link_and_navigate_with_delay_and_consume_with_initial_deep_link( - self): + self,): """Test that the link is received in initialDeepLink after navigating with + a delay. """ return self._send_link('navigate_delayed&initial') @@ -251,12 +259,14 @@ def test_send_link_and_consume_and_navigate(self): def test_send_link_and_consume_and_navigate_with_delay(self): """Test that a consumed link is not received again after navigating with a + delay. """ return self._send_link('consume&navigate_delayed') def test_send_link_and_consume_with_initial_deep_link_and_navigate(self): """Test that a link consumed with initialDeepLink is not received again + after navigating. """ return self._send_link('consume&initial&navigate_immediate') @@ -286,8 +296,9 @@ def test_start_link_and_navigate_and_consume_with_initial_deep_link(self): return self._start_link('navigate_immediate&initial') def test_start_link_and_navigate_with_delay_and_consume_with_initial_deep_link( # pylint:disable=line-too-long - self): + self,): """Test that the link is received in initialDeepLink after navigating with a + delay. """ return self._start_link('navigate_delayed&initial') @@ -298,12 +309,14 @@ def test_start_link_and_consume_and_navigate(self): def test_start_link_and_consume_and_navigate_with_delay(self): """Test that a consumed link is not received again after navigating with a + delay. """ return self._start_link('consume&navigate_delayed') def test_start_link_and_consume_with_initial_deep_link_and_navigate(self): """Test that a link consumed with initialDeepLink is not received again + after navigating. """ return self._start_link('consume&initial&navigate_immediate') diff --git a/cobalt/black_box_tests/tests/default_site_can_load.py b/cobalt/black_box_tests/tests/default_site_can_load.py index 591bd2bb1ec2..0dec396867fa 100644 --- a/cobalt/black_box_tests/tests/default_site_can_load.py +++ b/cobalt/black_box_tests/tests/default_site_can_load.py @@ -14,8 +14,8 @@ """Tests that Cobalt can load the default site.""" import logging -import traceback import time +import traceback from cobalt.black_box_tests import black_box_tests from cobalt.black_box_tests.threaded_web_server import ThreadedWebServer @@ -43,7 +43,9 @@ def test_default_site_can_load(self): time.sleep(1) logging.info( ('Checking for consistent html, head, body, script, and div' - ' elements: %d'), i) + ' elements: %d'), + i, + ) # Expect at least one (root) element in the page self.assertTrue(runner.FindElements('html')) # Expect at least one element in the page diff --git a/cobalt/black_box_tests/tests/disable_eval_with_csp.py b/cobalt/black_box_tests/tests/disable_eval_with_csp.py index 82d1076c29f8..162c628ce1b3 100644 --- a/cobalt/black_box_tests/tests/disable_eval_with_csp.py +++ b/cobalt/black_box_tests/tests/disable_eval_with_csp.py @@ -25,9 +25,9 @@ class DisableEvalWithCSPTest(black_box_tests.BlackBoxTestCase): """Ensure that Cobalt prohibits eval() when CSP is present in client page.""" def test_disable_eval_with_csp(self): - with ThreadedWebServer(binding_address=self.GetBindingAddress()) as server: url = server.GetURL(file_name='testdata/disable_eval_with_csp.html') - with self.CreateCobaltRunner(url=url) as runner: + with self.CreateCobaltRunner( + url=url, web_server_port=server.GetPort()) as runner: self.assertTrue(runner.JSTestsSucceeded()) diff --git a/cobalt/black_box_tests/tests/evergreen_verify_qa_channel_update_test.py b/cobalt/black_box_tests/tests/evergreen_verify_qa_channel_update_test.py index 12e422bbba7a..34229db351e8 100644 --- a/cobalt/black_box_tests/tests/evergreen_verify_qa_channel_update_test.py +++ b/cobalt/black_box_tests/tests/evergreen_verify_qa_channel_update_test.py @@ -31,29 +31,41 @@ def test_evergreen_verify_qa_channel_update(self): with self.CreateCobaltRunner( url=url, target_params=['--update_check_delay_seconds=300'], - loader_target='loader_app') as runner: + loader_target='loader_app', + web_server_port=server.GetPort(), + ) as runner: runner.WaitForJSTestsSetup() self.assertTrue(runner.JSTestsSucceeded()) url = server.GetURL( - file_name='testdata/evergreen_test.html?channel=test&status=Update installed, pending restart' # pylint: disable=line-too-long - .replace(' ', '%20')) + file_name=( + 'testdata/evergreen_test.html?channel=test&status=Update' + ' installed, pending restart'.replace( # pylint: disable=line-too-long + ' ', '%20'))) # 100 seconds provides enough time for the initial update delay, the prod # channel update, and the target channel update. with self.CreateCobaltRunner( - url=url, poll_until_wait_seconds=100, - loader_target='loader_app') as runner: + url=url, + poll_until_wait_seconds=100, + loader_target='loader_app', + web_server_port=server.GetPort(), + ) as runner: runner.WaitForJSTestsSetup() self.assertTrue(runner.JSTestsSucceeded()) url = server.GetURL( - file_name='testdata/evergreen_test.html?channel=test&status=App is up to date' # pylint: disable=line-too-long - .replace(' ', '%20')) + file_name=( + 'testdata/evergreen_test.html?channel=test&status=App is up to' + ' date'.replace(' ', '%20') # pylint: disable=line-too-long + )) # 60 seconds provides enough time for the initial update delay and target # channel update check. with self.CreateCobaltRunner( - url=url, poll_until_wait_seconds=60, - loader_target='loader_app') as runner: + url=url, + poll_until_wait_seconds=60, + loader_target='loader_app', + web_server_port=server.GetPort(), + ) as runner: runner.WaitForJSTestsSetup() self.assertTrue(runner.JSTestsSucceeded()) @@ -63,6 +75,8 @@ def test_evergreen_verify_qa_channel_update(self): with self.CreateCobaltRunner( url=url, target_params=['--update_check_delay_seconds=300'], - loader_target='loader_app') as runner: + loader_target='loader_app', + web_server_port=server.GetPort(), + ) as runner: runner.WaitForJSTestsSetup() self.assertTrue(runner.JSTestsSucceeded()) diff --git a/cobalt/black_box_tests/tests/freeze_timers.py b/cobalt/black_box_tests/tests/freeze_timers.py index ba56d58fe479..e296da51453c 100644 --- a/cobalt/black_box_tests/tests/freeze_timers.py +++ b/cobalt/black_box_tests/tests/freeze_timers.py @@ -27,11 +27,11 @@ class FreezeVisibilityTest(black_box_tests.BlackBoxTestCase): """Verify correct timer suspend and resume during and after freeze event.""" def test_freeze_visibility(self): - with ThreadedWebServer(binding_address=self.GetBindingAddress()) as server: url = server.GetURL(file_name='testdata/freeze_timers.html') - with self.CreateCobaltRunner(url=url) as runner: + with self.CreateCobaltRunner( + url=url, web_server_port=server.GetPort()) as runner: runner.WaitForJSTestsSetup() time.sleep(2.5) runner.SendConceal() diff --git a/cobalt/black_box_tests/tests/freeze_visibility.py b/cobalt/black_box_tests/tests/freeze_visibility.py index e3b9f5135866..128c20884bc8 100644 --- a/cobalt/black_box_tests/tests/freeze_visibility.py +++ b/cobalt/black_box_tests/tests/freeze_visibility.py @@ -25,11 +25,11 @@ class FreezeVisibilityTest(black_box_tests.BlackBoxTestCase): """Verify correct visibility changes during and after freeze event.""" def test_freeze_visibility(self): - with ThreadedWebServer(binding_address=self.GetBindingAddress()) as server: url = server.GetURL(file_name='testdata/freeze_visibility.html') - with self.CreateCobaltRunner(url=url) as runner: + with self.CreateCobaltRunner( + url=url, web_server_port=server.GetPort()) as runner: runner.WaitForJSTestsSetup() runner.SendFreeze() runner.SendFocus() diff --git a/cobalt/black_box_tests/tests/h5vcc_storage_write_verify_test.py b/cobalt/black_box_tests/tests/h5vcc_storage_write_verify_test.py index 4727fde86e1e..72e99598b59a 100644 --- a/cobalt/black_box_tests/tests/h5vcc_storage_write_verify_test.py +++ b/cobalt/black_box_tests/tests/h5vcc_storage_write_verify_test.py @@ -27,6 +27,7 @@ def test_h5vcc_storage_write_verify_test(self): with ThreadedWebServer(binding_address=self.GetBindingAddress()) as server: url = server.GetURL( file_name='testdata/h5vcc_storage_write_verify_test.html') - with self.CreateCobaltRunner(url=url) as runner: + with self.CreateCobaltRunner( + url=url, web_server_port=server.GetPort()) as runner: runner.WaitForActiveElement() self.assertTrue(runner.JSTestsSucceeded()) diff --git a/cobalt/black_box_tests/tests/http_cache.py b/cobalt/black_box_tests/tests/http_cache.py index 43958ec63f5c..c904c31a4f65 100644 --- a/cobalt/black_box_tests/tests/http_cache.py +++ b/cobalt/black_box_tests/tests/http_cache.py @@ -14,13 +14,13 @@ """Tests if Cobalt properly caches resources that were previously loaded.""" import os -from six.moves import SimpleHTTPServer -from six.moves.urllib.parse import urlparse import time from cobalt.black_box_tests import black_box_tests from cobalt.black_box_tests.threaded_web_server import MakeRequestHandlerClass from cobalt.black_box_tests.threaded_web_server import ThreadedWebServer +from six.moves import SimpleHTTPServer +from six.moves.urllib.parse import urlparse # The base path of the requested assets is the parent directory. _SERVER_ROOT_PATH = os.path.join(os.path.dirname(__file__), os.pardir) @@ -44,10 +44,11 @@ class HttpCacheTest(black_box_tests.BlackBoxTestCase): """Load resources, then reload the page and verify.""" def test_http_cache(self): - with ThreadedWebServer( binding_address=self.GetBindingAddress(), - handler=DelayedHttpRequestHandler) as server: + handler=DelayedHttpRequestHandler, + ) as server: url = server.GetURL(file_name='testdata/http_cache.html') - with self.CreateCobaltRunner(url=url) as runner: + with self.CreateCobaltRunner( + url=url, web_server_port=server.GetPort()) as runner: self.assertTrue(runner.JSTestsSucceeded()) diff --git a/cobalt/black_box_tests/tests/override_ua_parameters.py b/cobalt/black_box_tests/tests/override_ua_parameters.py index bc9eb3f692ea..cf1df0010f08 100644 --- a/cobalt/black_box_tests/tests/override_ua_parameters.py +++ b/cobalt/black_box_tests/tests/override_ua_parameters.py @@ -18,11 +18,11 @@ from __future__ import print_function import os -from six.moves import SimpleHTTPServer from cobalt.black_box_tests import black_box_tests from cobalt.black_box_tests.threaded_web_server import MakeRequestHandlerClass from cobalt.black_box_tests.threaded_web_server import ThreadedWebServer +from six.moves import SimpleHTTPServer # The base path of the requested assets is the parent directory. _SERVER_ROOT_PATH = os.path.join(os.path.dirname(__file__), os.pardir) @@ -36,11 +36,12 @@ def do_GET(self): # pylint: disable=invalid-name # Check if UA string in the request header reflects correct UA params # overrides ua_request_header = self.headers.get('user-agent', '') - expected_ua_request_header = 'Mozilla/5.0 (Corge grault-v7a; '\ - 'Garply 7.1.2; Waldo OS 6.0) Cobalt/21.lts.2.289852-debug '\ - '(unlike Gecko) v8/7.7.299.8-jit gles Starboard/12, '\ - 'Quuz_ATV_foobar0000_2018/Unknown (Cobalt, QUUX, Wireless) '\ - 'foo.bar.baz.qux/21.2.1.41.0' + expected_ua_request_header = ( + 'Mozilla/5.0 (Corge grault-v7a; ' + 'Garply 7.1.2; Waldo OS 6.0) Cobalt/21.lts.2.289852-debug ' + '(unlike Gecko) v8/7.7.299.8-jit gles Starboard/12, ' + 'Quuz_ATV_foobar0000_2018/Unknown (Cobalt, QUUX, Wireless) ' + 'foo.bar.baz.qux/21.2.1.41.0') if not ua_request_header == expected_ua_request_header: raise ValueError('UA string in HTTP request header does not match with ' @@ -62,26 +63,28 @@ def test_override_ua_parameters(self): with self.CreateCobaltRunner( url=server.GetURL(file_name='testdata/override_ua_parameters.html'), target_params=[ - '--user_agent_client_hints='\ - 'aux_field=foo.bar.baz.qux/21.2.1.41.0;'\ - 'brand=Cobalt;'\ - 'build_configuration=debug;'\ - 'chipset_model_number=foobar0000;'\ - 'cobalt_build_version_number=289852;'\ - 'cobalt_version=21.lts.2;'\ - 'connection_type=Wireless;'\ - 'device_type=ATV;'\ - 'evergreen_type=;'\ - 'evergreen_version=;'\ - 'javascript_engine_version=v8/7.7.299.8-jit;'\ - 'firmware_version=;'\ - 'model=QUUX;'\ - 'model_year=2018;'\ - 'original_design_manufacturer=Quuz;'\ - 'os_name_and_version=Corge grault-v7a\\; Garply 7.1.2\\; '\ - 'Waldo OS 6.0;'\ - 'starboard_version=Starboard/12;'\ + '--user_agent_client_hints=' + 'aux_field=foo.bar.baz.qux/21.2.1.41.0;' + 'brand=Cobalt;' + 'build_configuration=debug;' + 'chipset_model_number=foobar0000;' + 'cobalt_build_version_number=289852;' + 'cobalt_version=21.lts.2;' + 'connection_type=Wireless;' + 'device_type=ATV;' + 'evergreen_type=;' + 'evergreen_version=;' + 'javascript_engine_version=v8/7.7.299.8-jit;' + 'firmware_version=;' + 'model=QUUX;' + 'model_year=2018;' + 'original_design_manufacturer=Quuz;' + 'os_name_and_version=Corge grault-v7a\\; Garply 7.1.2\\; ' + 'Waldo OS 6.0;' + 'starboard_version=Starboard/12;' 'rasterizer_type=gles' - ]) as runner: + ], + web_server_port=server.GetPort(), + ) as runner: runner.WaitForJSTestsSetup() self.assertTrue(runner.JSTestsSucceeded()) diff --git a/cobalt/black_box_tests/tests/persistent_cookie.py b/cobalt/black_box_tests/tests/persistent_cookie.py index ab30bb4fa84b..5107c0f20150 100644 --- a/cobalt/black_box_tests/tests/persistent_cookie.py +++ b/cobalt/black_box_tests/tests/persistent_cookie.py @@ -30,19 +30,20 @@ class PersistentCookieTest(black_box_tests.BlackBoxTestCase): # The same page has to be used since cookie are stored per URL. def test_persistent_cookie(self): - with ThreadedWebServer(binding_address=self.GetBindingAddress()) as server: url = server.GetURL(file_name='testdata/persistent_cookie.html') # The webpage listens for NUMPAD1, NUMPAD2 and NUMPAD3 at opening. - with self.CreateCobaltRunner(url=url) as runner: + with self.CreateCobaltRunner( + url=url, web_server_port=server.GetPort()) as runner: # Press NUMPAD1 to verify basic cookie functionality and set # a persistent cookie. runner.WaitForJSTestsSetup() runner.SendKeys(keys.Keys.NUMPAD1) self.assertTrue(runner.JSTestsSucceeded()) - with self.CreateCobaltRunner(url=url) as runner: + with self.CreateCobaltRunner( + url=url, web_server_port=server.GetPort()) as runner: runner.WaitForJSTestsSetup() # Press NUMPAD2 to indicate this is the second time we opened # the webpage and verify a persistent cookie is on device. Then @@ -50,7 +51,8 @@ def test_persistent_cookie(self): runner.SendKeys(keys.Keys.NUMPAD2) self.assertTrue(runner.JSTestsSucceeded()) - with self.CreateCobaltRunner(url=url) as runner: + with self.CreateCobaltRunner( + url=url, web_server_port=server.GetPort()) as runner: runner.WaitForJSTestsSetup() # Press NUMPAD3 to verify the persistent cookie we cleared is # not on the device for this URL any more. diff --git a/cobalt/black_box_tests/tests/pointer_test.py b/cobalt/black_box_tests/tests/pointer_test.py index be12585ff8ea..66e2b1d03b43 100644 --- a/cobalt/black_box_tests/tests/pointer_test.py +++ b/cobalt/black_box_tests/tests/pointer_test.py @@ -48,7 +48,8 @@ def test_pointer_events(self): binding_address=self.GetBindingAddress()) as server: url = server.GetURL(file_name='testdata/pointer_test.html') - with self.CreateCobaltRunner(url=url) as runner: + with self.CreateCobaltRunner( + url=url, web_server_port=server.GetPort()) as runner: logging.info('JS Test Setup WaitForJSTestsSetup') runner.WaitForJSTestsSetup() logging.info('JS Test Setup') diff --git a/cobalt/black_box_tests/tests/preload_font.py b/cobalt/black_box_tests/tests/preload_font.py index b43a00a2bcac..2f55f7c12239 100644 --- a/cobalt/black_box_tests/tests/preload_font.py +++ b/cobalt/black_box_tests/tests/preload_font.py @@ -29,19 +29,20 @@ class PreloadFontTest(black_box_tests.BlackBoxTestCase): """Verify that fonts are loaded correctly after preload event.""" def test_preload_font(self): - with ThreadedWebServer(binding_address=self.GetBindingAddress()) as server: url = server.GetURL(file_name='testdata/preload_font.html') with self.CreateCobaltRunner( - url=url, target_params=['--preload']) as runner: + url=url, + target_params=['--preload'], + web_server_port=server.GetPort()) as runner: runner.WaitForJSTestsSetup() runner.SendResume() start_time = time.time() while runner.IsInPreload(): if time.time() - start_time > _MAX_RESUME_WAIT_SECONDS: - raise Exception('Cobalt can not exit preload mode after receiving' - 'resume signal') - time.sleep(.1) + raise Exception( + 'Cobalt can not exit preload mode after receivingresume signal') + time.sleep(0.1) # At this point, Cobalt is in started mode. self.assertTrue(runner.JSTestsSucceeded()) diff --git a/cobalt/black_box_tests/tests/preload_launch_parameter.py b/cobalt/black_box_tests/tests/preload_launch_parameter.py index e23fb388531c..1b39bec6b613 100644 --- a/cobalt/black_box_tests/tests/preload_launch_parameter.py +++ b/cobalt/black_box_tests/tests/preload_launch_parameter.py @@ -25,13 +25,14 @@ class PreloadLaunchParameterTest(black_box_tests.BlackBoxTestCase): """Set a JS timer that expires after exiting preload mode.""" def test_preload_launch_parameter(self): - with ThreadedWebServer(binding_address=self.GetBindingAddress()) as server: url = server.GetURL(file_name='testdata/preload_launch_parameter.html') # Test without other parameters. with self.CreateCobaltRunner( - url=url, target_params=['--preload']) as runner: + url=url, + target_params=['--preload'], + web_server_port=server.GetPort()) as runner: runner.WaitForJSTestsSetup() self.assertTrue(runner.IsInPreload()) runner.SendResume() @@ -39,7 +40,10 @@ def test_preload_launch_parameter(self): # Test with another parameter. with self.CreateCobaltRunner( - url=url + '?foo=bar', target_params=['--preload']) as runner: + url=url + '?foo=bar', + target_params=['--preload'], + web_server_port=server.GetPort(), + ) as runner: runner.WaitForJSTestsSetup() self.assertTrue(runner.IsInPreload()) runner.SendResume() diff --git a/cobalt/black_box_tests/tests/preload_visibility.py b/cobalt/black_box_tests/tests/preload_visibility.py index 6eab66f4f842..fc7912e80182 100644 --- a/cobalt/black_box_tests/tests/preload_visibility.py +++ b/cobalt/black_box_tests/tests/preload_visibility.py @@ -25,12 +25,13 @@ class PreloadVisibilityTest(black_box_tests.BlackBoxTestCase): """Set a JS timer that expires after exiting preload mode.""" def test_preload_visibility(self): - with ThreadedWebServer(binding_address=self.GetBindingAddress()) as server: url = server.GetURL(file_name='testdata/preload_visibility.html') with self.CreateCobaltRunner( - url=url, target_params=['--preload']) as runner: + url=url, + target_params=['--preload'], + web_server_port=server.GetPort()) as runner: runner.WaitForJSTestsSetup() self.assertTrue(runner.IsInPreload()) runner.SendResume() diff --git a/cobalt/black_box_tests/tests/retry_async_script_loads_after_suspend.py b/cobalt/black_box_tests/tests/retry_async_script_loads_after_suspend.py index 1420463b45dc..5281047144b6 100644 --- a/cobalt/black_box_tests/tests/retry_async_script_loads_after_suspend.py +++ b/cobalt/black_box_tests/tests/retry_async_script_loads_after_suspend.py @@ -39,14 +39,14 @@ import logging import os -from six.moves import SimpleHTTPServer -from six.moves.urllib.parse import urlparse import threading import traceback from cobalt.black_box_tests import black_box_tests from cobalt.black_box_tests.threaded_web_server import MakeRequestHandlerClass from cobalt.black_box_tests.threaded_web_server import ThreadedWebServer +from six.moves import SimpleHTTPServer +from six.moves.urllib.parse import urlparse _HTML_FILE_TO_REQUEST = 'retry_async_script_loads_after_suspend.html' _JS_FILE_TO_REQUEST = 'script_executed.js' @@ -61,6 +61,7 @@ class JavascriptRequestDetector(MakeRequestHandlerClass(_SERVER_ROOT_PATH)): """Proxies everything to SimpleHTTPRequestHandler, except some paths.""" + _counter_lock = threading.Lock() _request_counter = 0 @@ -101,17 +102,18 @@ def _load_page(self, webdriver, url): traceback.print_exc() def test_retry_async_script_loads_after_suspend(self): - # Step 2. Start Cobalt, and point it to the socket created in Step 1. try: with ThreadedWebServer(JavascriptRequestDetector, self.GetBindingAddress()) as server: - with self.CreateCobaltRunner(url='about:blank') as runner: + with self.CreateCobaltRunner( + url='about:blank', web_server_port=server.GetPort()) as runner: target_url = server.GetURL(file_name='../testdata/' + _HTML_FILE_TO_REQUEST) cobalt_launcher_thread = threading.Thread( target=RetryAsyncScriptLoadsAfterSuspend._load_page, - args=(self, runner.webdriver, target_url)) + args=(self, runner.webdriver, target_url), + ) cobalt_launcher_thread.start() # Step 3. Wait HTTP request for html resource. diff --git a/cobalt/black_box_tests/tests/service_worker_add_to_cache_test.py b/cobalt/black_box_tests/tests/service_worker_add_to_cache_test.py index eaa8051079e1..9315210f3796 100644 --- a/cobalt/black_box_tests/tests/service_worker_add_to_cache_test.py +++ b/cobalt/black_box_tests/tests/service_worker_add_to_cache_test.py @@ -23,6 +23,7 @@ def test_service_worker_add_to_cache(self): with ThreadedWebServer(binding_address=self.GetBindingAddress()) as server: url = server.GetURL( file_name='testdata/service_worker_add_to_cache_test.html') - with self.CreateCobaltRunner(url=url) as runner: + with self.CreateCobaltRunner( + url=url, web_server_port=server.GetPort()) as runner: runner.WaitForJSTestsSetup() self.assertTrue(runner.JSTestsSucceeded()) diff --git a/cobalt/black_box_tests/tests/service_worker_cache_keys_test.py b/cobalt/black_box_tests/tests/service_worker_cache_keys_test.py index 996e3adbd6c2..93048ef14b91 100644 --- a/cobalt/black_box_tests/tests/service_worker_cache_keys_test.py +++ b/cobalt/black_box_tests/tests/service_worker_cache_keys_test.py @@ -23,6 +23,7 @@ def test_service_worker_cache_keys(self): with ThreadedWebServer(binding_address=self.GetBindingAddress()) as server: url = server.GetURL( file_name='testdata/service_worker_cache_keys_test.html') - with self.CreateCobaltRunner(url=url) as runner: + with self.CreateCobaltRunner( + url=url, web_server_port=server.GetPort()) as runner: runner.WaitForJSTestsSetup() self.assertTrue(runner.JSTestsSucceeded()) diff --git a/cobalt/black_box_tests/tests/service_worker_controller_activation_test.py b/cobalt/black_box_tests/tests/service_worker_controller_activation_test.py index cf79f718ad53..3cc95b6fb10c 100644 --- a/cobalt/black_box_tests/tests/service_worker_controller_activation_test.py +++ b/cobalt/black_box_tests/tests/service_worker_controller_activation_test.py @@ -15,12 +15,11 @@ import logging import os -from six.moves import SimpleHTTPServer - from cobalt.black_box_tests import black_box_tests from cobalt.black_box_tests.threaded_web_server import MakeRequestHandlerClass from cobalt.black_box_tests.threaded_web_server import ThreadedWebServer from cobalt.tools.automated_testing import webdriver_utils +from six.moves import SimpleHTTPServer # The base path of the requested assets is the parent directory. _SERVER_ROOT_PATH = os.path.join(os.path.dirname(__file__), os.pardir) @@ -55,14 +54,14 @@ class ServiceWorkerControllerActivationTest(black_box_tests.BlackBoxTestCase): """Test basic Service Worker functionality.""" def test_service_worker_controller_activation(self): - with ThreadedWebServer( ServiceWorkerRequestDetector, binding_address=self.GetBindingAddress()) as server: url = server.GetURL( file_name='testdata/service_worker_controller_activation_test.html') - with self.CreateCobaltRunner(url=url) as runner: + with self.CreateCobaltRunner( + url=url, web_server_port=server.GetPort()) as runner: runner.WaitForJSTestsSetup() logging.info('SendKeys NUMPAD0.') diff --git a/cobalt/black_box_tests/tests/service_worker_fetch_main_resource_test.py b/cobalt/black_box_tests/tests/service_worker_fetch_main_resource_test.py index aeec28dd5c2f..377fdfb53f44 100644 --- a/cobalt/black_box_tests/tests/service_worker_fetch_main_resource_test.py +++ b/cobalt/black_box_tests/tests/service_worker_fetch_main_resource_test.py @@ -23,6 +23,7 @@ def test_service_worker_fetch_main_resource(self): with ThreadedWebServer(binding_address=self.GetBindingAddress()) as server: url = server.GetURL( file_name='testdata/service_worker_fetch_main_resource_test.html') - with self.CreateCobaltRunner(url=url) as runner: + with self.CreateCobaltRunner( + url=url, web_server_port=server.GetPort()) as runner: runner.WaitForJSTestsSetup() self.assertTrue(runner.JSTestsSucceeded()) diff --git a/cobalt/black_box_tests/tests/service_worker_fetch_test.py b/cobalt/black_box_tests/tests/service_worker_fetch_test.py index 27dac0e0ce1e..808a81a59513 100644 --- a/cobalt/black_box_tests/tests/service_worker_fetch_test.py +++ b/cobalt/black_box_tests/tests/service_worker_fetch_test.py @@ -22,6 +22,7 @@ class ServiceWorkerFetchTest(black_box_tests.BlackBoxTestCase): def test_service_worker_fetch(self): with ThreadedWebServer(binding_address=self.GetBindingAddress()) as server: url = server.GetURL(file_name='testdata/service_worker_fetch_test.html') - with self.CreateCobaltRunner(url=url) as runner: + with self.CreateCobaltRunner( + url=url, web_server_port=server.GetPort()) as runner: runner.WaitForJSTestsSetup() self.assertTrue(runner.JSTestsSucceeded()) diff --git a/cobalt/black_box_tests/tests/service_worker_get_registrations_test.py b/cobalt/black_box_tests/tests/service_worker_get_registrations_test.py index ebe059ec4fa2..c180a4e29b68 100644 --- a/cobalt/black_box_tests/tests/service_worker_get_registrations_test.py +++ b/cobalt/black_box_tests/tests/service_worker_get_registrations_test.py @@ -23,6 +23,7 @@ def test_service_worker_get_registrations(self): with ThreadedWebServer(binding_address=self.GetBindingAddress()) as server: url = server.GetURL( file_name='testdata/service_worker_get_registrations_test.html') - with self.CreateCobaltRunner(url=url) as runner: + with self.CreateCobaltRunner( + url=url, web_server_port=server.GetPort()) as runner: runner.WaitForJSTestsSetup() self.assertTrue(runner.JSTestsSucceeded()) diff --git a/cobalt/black_box_tests/tests/service_worker_message_test.py b/cobalt/black_box_tests/tests/service_worker_message_test.py index b4c467560f72..438974fcfb0c 100644 --- a/cobalt/black_box_tests/tests/service_worker_message_test.py +++ b/cobalt/black_box_tests/tests/service_worker_message_test.py @@ -21,10 +21,10 @@ class ServiceWorkerMessageTest(black_box_tests.BlackBoxTestCase): """Test basic Service Worker functionality.""" def test_service_worker_message(self): - with ThreadedWebServer(binding_address=self.GetBindingAddress()) as server: url = server.GetURL(file_name='testdata/service_worker_message_test.html') - with self.CreateCobaltRunner(url=url) as runner: + with self.CreateCobaltRunner( + url=url, web_server_port=server.GetPort()) as runner: runner.WaitForJSTestsSetup() self.assertTrue(runner.JSTestsSucceeded()) diff --git a/cobalt/black_box_tests/tests/service_worker_persist_test.py b/cobalt/black_box_tests/tests/service_worker_persist_test.py index 6505b0cfc571..d7847346eadb 100644 --- a/cobalt/black_box_tests/tests/service_worker_persist_test.py +++ b/cobalt/black_box_tests/tests/service_worker_persist_test.py @@ -14,9 +14,9 @@ """Tests Service Worker Persistence functionality.""" from cobalt.black_box_tests import black_box_tests +from cobalt.black_box_tests.tests.service_worker_test import ServiceWorkerRequestDetector from cobalt.black_box_tests.threaded_web_server import ThreadedWebServer from cobalt.tools.automated_testing import webdriver_utils -from cobalt.black_box_tests.tests.service_worker_test import ServiceWorkerRequestDetector keys = webdriver_utils.import_selenium_module('webdriver.common.keys') @@ -25,24 +25,26 @@ class ServiceWorkerPersistTest(black_box_tests.BlackBoxTestCase): """Test basic Service Worker functionality.""" def test_service_worker_persist(self): - with ThreadedWebServer( ServiceWorkerRequestDetector, binding_address=self.GetBindingAddress()) as server: url = server.GetURL(file_name='testdata/service_worker_persist_test.html') # NUMPAD0 calls test_successful_registration() - with self.CreateCobaltRunner(url=url) as runner: + with self.CreateCobaltRunner( + url=url, web_server_port=server.GetPort()) as runner: runner.WaitForActiveElement() runner.SendKeys(keys.Keys.NUMPAD0) self.assertTrue(runner.JSTestsSucceeded()) # NUMPAD1 calls test_persistent_registration() - with self.CreateCobaltRunner(url=url) as runner: + with self.CreateCobaltRunner( + url=url, web_server_port=server.GetPort()) as runner: runner.WaitForActiveElement() runner.SendKeys(keys.Keys.NUMPAD1) self.assertTrue(runner.JSTestsSucceeded()) # NUMPAD2 calls test_persistent_registration_does_not_exist() - with self.CreateCobaltRunner(url=url) as runner: + with self.CreateCobaltRunner( + url=url, web_server_port=server.GetPort()) as runner: runner.WaitForActiveElement() runner.SendKeys(keys.Keys.NUMPAD2) self.assertTrue(runner.JSTestsSucceeded()) diff --git a/cobalt/black_box_tests/tests/service_worker_post_message_test.py b/cobalt/black_box_tests/tests/service_worker_post_message_test.py index c6f6ceff2963..2d33416d897b 100644 --- a/cobalt/black_box_tests/tests/service_worker_post_message_test.py +++ b/cobalt/black_box_tests/tests/service_worker_post_message_test.py @@ -23,6 +23,7 @@ def test_service_worker_post_message(self): with ThreadedWebServer(binding_address=self.GetBindingAddress()) as server: url = server.GetURL( file_name='testdata/service_worker_post_message_test.html') - with self.CreateCobaltRunner(url=url) as runner: + with self.CreateCobaltRunner( + url=url, web_server_port=server.GetPort()) as runner: runner.WaitForJSTestsSetup() self.assertTrue(runner.JSTestsSucceeded()) diff --git a/cobalt/black_box_tests/tests/service_worker_test.py b/cobalt/black_box_tests/tests/service_worker_test.py index fc5c7e5279ad..1d862c84865b 100644 --- a/cobalt/black_box_tests/tests/service_worker_test.py +++ b/cobalt/black_box_tests/tests/service_worker_test.py @@ -14,11 +14,10 @@ """Tests basic Service Worker functionality.""" import os -from six.moves import SimpleHTTPServer - from cobalt.black_box_tests import black_box_tests from cobalt.black_box_tests.threaded_web_server import MakeRequestHandlerClass from cobalt.black_box_tests.threaded_web_server import ThreadedWebServer +from six.moves import SimpleHTTPServer # The base path of the requested assets is the parent directory. _SERVER_ROOT_PATH = os.path.join(os.path.dirname(__file__), os.pardir) @@ -26,15 +25,15 @@ paths_to_headers = { 'service_worker_test.html': { 'Content-Security-Policy': - "script-src 'nonce-blackboxtest' ; worker-src 'self'" + ("script-src 'nonce-blackboxtest' ; worker-src 'self'") }, 'service_worker_test_worker.js': { 'Content-Security-Policy': - "connect-src 'self' ; script-src 'none' ; worker-src 'self'" - } + ("connect-src 'self' ; script-src 'none' ; worker-src 'self'") + }, } -#path = os.path.abspath(os.path.join(os.path.dirname(__file__), '..')) +# path = os.path.abspath(os.path.join(os.path.dirname(__file__), '..')) class ServiceWorkerRequestDetector(MakeRequestHandlerClass(_SERVER_ROOT_PATH)): @@ -90,12 +89,12 @@ class ServiceWorkerTest(black_box_tests.BlackBoxTestCase): """Test basic Service Worker functionality.""" def test_service_worker(self): - with ThreadedWebServer( ServiceWorkerRequestDetector, binding_address=self.GetBindingAddress()) as server: url = server.GetURL(file_name='testdata/service_worker_test.html') - with self.CreateCobaltRunner(url=url) as runner: + with self.CreateCobaltRunner( + url=url, web_server_port=server.GetPort()) as runner: runner.WaitForJSTestsSetup() self.assertTrue(runner.JSTestsSucceeded()) diff --git a/cobalt/black_box_tests/tests/signal_handler_doesnt_crash.py b/cobalt/black_box_tests/tests/signal_handler_doesnt_crash.py index ce2cc14bac82..bb16ed962e6b 100644 --- a/cobalt/black_box_tests/tests/signal_handler_doesnt_crash.py +++ b/cobalt/black_box_tests/tests/signal_handler_doesnt_crash.py @@ -31,7 +31,8 @@ def setUp(self): self.skipTest('This test needs POSIX system signal handlers') def test_signal_handler_doesnt_crash(self): - with self.CreateCobaltRunner(url='', target_params=[]) as runner: + with self.CreateCobaltRunner( + url='', target_params=[], web_server_port=server.GetPort()) as runner: runner.WaitForUrlLoadedEvents() # About minimum duration to trigger the original crash issue consistently diff --git a/cobalt/black_box_tests/tests/soft_mic_platform_service_test.py b/cobalt/black_box_tests/tests/soft_mic_platform_service_test.py index caf506ee4942..a529783b0e68 100644 --- a/cobalt/black_box_tests/tests/soft_mic_platform_service_test.py +++ b/cobalt/black_box_tests/tests/soft_mic_platform_service_test.py @@ -33,34 +33,45 @@ def test_soft_mic_platform_service(self): # The webpage listens for NUMPAD0 through NUMPAD9 at opening # to test hasHardMicSupport and hasSoftMicSupport switch values. - with self.CreateCobaltRunner(url=url) as runner: + with self.CreateCobaltRunner( + url=url, web_server_port=server.GetPort()) as runner: runner.WaitForActiveElement() # Press NUMPAD0 to test testIncorrectRequests runner.SendKeys(keys.Keys.NUMPAD0) self.assertTrue(runner.JSTestsSucceeded()) - with self.CreateCobaltRunner(url=url) as runner: + with self.CreateCobaltRunner( + url=url, web_server_port=server.GetPort()) as runner: runner.WaitForActiveElement() # Press NUMPAD1 to test bothUndefined runner.SendKeys(keys.Keys.NUMPAD1) self.assertTrue(runner.JSTestsSucceeded()) with self.CreateCobaltRunner( - url=url, target_params=['--has_soft_mic_support=true']) as runner: + url=url, + target_params=['--has_soft_mic_support=true'], + web_server_port=server.GetPort(), + ) as runner: runner.WaitForActiveElement() # Press NUMPAD2 to test hardMicUndefinedSoftMicTrue runner.SendKeys(keys.Keys.NUMPAD2) self.assertTrue(runner.JSTestsSucceeded()) with self.CreateCobaltRunner( - url=url, target_params=['--has_soft_mic_support=false']) as runner: + url=url, + target_params=['--has_soft_mic_support=false'], + web_server_port=server.GetPort(), + ) as runner: runner.WaitForActiveElement() # Press NUMPAD3 to test hardMicUndefinedSoftMicFalse runner.SendKeys(keys.Keys.NUMPAD3) self.assertTrue(runner.JSTestsSucceeded()) with self.CreateCobaltRunner( - url=url, target_params=['--has_hard_mic_support=true']) as runner: + url=url, + target_params=['--has_hard_mic_support=true'], + web_server_port=server.GetPort(), + ) as runner: runner.WaitForActiveElement() # Press NUMPAD4 to test hardMicTrueSoftMicUndefined runner.SendKeys(keys.Keys.NUMPAD4) @@ -69,8 +80,11 @@ def test_soft_mic_platform_service(self): with self.CreateCobaltRunner( url=url, target_params=([ - '--has_hard_mic_support=true', '--has_soft_mic_support=true' - ])) as runner: + '--has_hard_mic_support=true', + '--has_soft_mic_support=true', + ]), + web_server_port=server.GetPort(), + ) as runner: runner.WaitForActiveElement() # Press NUMPAD5 to test hardMicTrueSoftMicTrue runner.SendKeys(keys.Keys.NUMPAD5) @@ -79,15 +93,21 @@ def test_soft_mic_platform_service(self): with self.CreateCobaltRunner( url=url, target_params=([ - '--has_hard_mic_support=true', '--has_soft_mic_support=false' - ])) as runner: + '--has_hard_mic_support=true', + '--has_soft_mic_support=false', + ]), + web_server_port=server.GetPort(), + ) as runner: runner.WaitForActiveElement() # Press NUMPAD6 to test hardMicTrueSoftMicFalse runner.SendKeys(keys.Keys.NUMPAD6) self.assertTrue(runner.JSTestsSucceeded()) with self.CreateCobaltRunner( - url=url, target_params=['--has_hard_mic_support=false']) as runner: + url=url, + target_params=['--has_hard_mic_support=false'], + web_server_port=server.GetPort(), + ) as runner: runner.WaitForActiveElement() # Press NUMPAD7 to test hardMicFalseSoftMicUndefined runner.SendKeys(keys.Keys.NUMPAD7) @@ -96,8 +116,11 @@ def test_soft_mic_platform_service(self): with self.CreateCobaltRunner( url=url, target_params=([ - '--has_hard_mic_support=false', '--has_soft_mic_support=true' - ])) as runner: + '--has_hard_mic_support=false', + '--has_soft_mic_support=true', + ]), + web_server_port=server.GetPort(), + ) as runner: runner.WaitForActiveElement() # Press NUMPAD8 to test hardMicFalseSoftMicTrue runner.SendKeys(keys.Keys.NUMPAD8) @@ -106,8 +129,11 @@ def test_soft_mic_platform_service(self): with self.CreateCobaltRunner( url=url, target_params=([ - '--has_hard_mic_support=false', '--has_soft_mic_support=false' - ])) as runner: + '--has_hard_mic_support=false', + '--has_soft_mic_support=false', + ]), + web_server_port=server.GetPort(), + ) as runner: runner.WaitForActiveElement() # Press NUMPAD9 to test hardMicFalseSoftMicFalse runner.SendKeys(keys.Keys.NUMPAD9) @@ -115,28 +141,38 @@ def test_soft_mic_platform_service(self): # The webpage listens for NUMPAD0 through NUMPAD9 at opening with SHIFT # to test micGesture tap and hold switch values. - with self.CreateCobaltRunner(url=url) as runner: + with self.CreateCobaltRunner( + url=url, web_server_port=server.GetPort()) as runner: runner.WaitForActiveElement() # Press SHIFT, NUMPAD0 to test micGestureNull runner.SendKeys([keys.Keys.SHIFT, keys.Keys.NUMPAD0]) self.assertTrue(runner.JSTestsSucceeded()) with self.CreateCobaltRunner( - url=url, target_params=['--mic_gesture=foo']) as runner: + url=url, + target_params=['--mic_gesture=foo'], + web_server_port=server.GetPort(), + ) as runner: runner.WaitForActiveElement() # Press SHIFT, NUMPAD0 to test micGestureNull runner.SendKeys([keys.Keys.SHIFT, keys.Keys.NUMPAD0]) self.assertTrue(runner.JSTestsSucceeded()) with self.CreateCobaltRunner( - url=url, target_params=['--mic_gesture=hold']) as runner: + url=url, + target_params=['--mic_gesture=hold'], + web_server_port=server.GetPort(), + ) as runner: runner.WaitForActiveElement() # Press SHIFT, NUMPAD1 to test micGestureHold runner.SendKeys([keys.Keys.SHIFT, keys.Keys.NUMPAD1]) self.assertTrue(runner.JSTestsSucceeded()) with self.CreateCobaltRunner( - url=url, target_params=['--mic_gesture=tap']) as runner: + url=url, + target_params=['--mic_gesture=tap'], + web_server_port=server.GetPort(), + ) as runner: runner.WaitForActiveElement() # Press SHIFT, NUMPAD2 to test micGestureTap runner.SendKeys([keys.Keys.SHIFT, keys.Keys.NUMPAD2]) diff --git a/cobalt/black_box_tests/tests/suspend_visibility.py b/cobalt/black_box_tests/tests/suspend_visibility.py index 33205a1393b4..8f92efa41049 100644 --- a/cobalt/black_box_tests/tests/suspend_visibility.py +++ b/cobalt/black_box_tests/tests/suspend_visibility.py @@ -25,11 +25,11 @@ class SuspendVisibilityTest(black_box_tests.BlackBoxTestCase): """Verify correct visibility changes during and after suspend event.""" def test_suspend_visibility(self): - with ThreadedWebServer(binding_address=self.GetBindingAddress()) as server: url = server.GetURL(file_name='testdata/suspend_visibility.html') - with self.CreateCobaltRunner(url=url) as runner: + with self.CreateCobaltRunner( + url=url, web_server_port=server.GetPort()) as runner: runner.WaitForJSTestsSetup() runner.SendSuspend() runner.SendResume() diff --git a/cobalt/black_box_tests/tests/text_encoding_test.py b/cobalt/black_box_tests/tests/text_encoding_test.py index e1c3563f4a23..0c900db36df3 100644 --- a/cobalt/black_box_tests/tests/text_encoding_test.py +++ b/cobalt/black_box_tests/tests/text_encoding_test.py @@ -21,10 +21,10 @@ class TextEncodingTest(black_box_tests.BlackBoxTestCase): """Test basic TextEncoder and TextDecoder functionality.""" def test_text_encoding(self): - with ThreadedWebServer(binding_address=self.GetBindingAddress()) as server: url = server.GetURL(file_name='testdata/text_encoding_test.html') - with self.CreateCobaltRunner(url=url) as runner: + with self.CreateCobaltRunner( + url=url, web_server_port=server.GetPort()) as runner: runner.WaitForJSTestsSetup() self.assertTrue(runner.JSTestsSucceeded()) diff --git a/cobalt/black_box_tests/tests/timer_hit_after_preload.py b/cobalt/black_box_tests/tests/timer_hit_after_preload.py index 5a97dfca88fc..d2b27acc7f03 100644 --- a/cobalt/black_box_tests/tests/timer_hit_after_preload.py +++ b/cobalt/black_box_tests/tests/timer_hit_after_preload.py @@ -25,11 +25,12 @@ class TimerAfterPreloadTest(black_box_tests.BlackBoxTestCase): """Set a JS timer that expires after exiting preload mode.""" def test_timer_after_preload(self): - with ThreadedWebServer(binding_address=self.GetBindingAddress()) as server: url = server.GetURL(file_name='testdata/timer_hit_after_preload.html') with self.CreateCobaltRunner( - url=url, target_params=['--preload']) as runner: + url=url, + target_params=['--preload'], + web_server_port=server.GetPort()) as runner: self.assertTrue(runner.IsInPreload()) # setInterval will hit once during the .5 seconds. runner.PollUntilFound('#script_executed') diff --git a/cobalt/black_box_tests/tests/timer_hit_in_preload.py b/cobalt/black_box_tests/tests/timer_hit_in_preload.py index fc88ec7a737c..f70490895c22 100644 --- a/cobalt/black_box_tests/tests/timer_hit_in_preload.py +++ b/cobalt/black_box_tests/tests/timer_hit_in_preload.py @@ -25,10 +25,11 @@ class TimerInPreloadTest(black_box_tests.BlackBoxTestCase): """Set a JS timer that expires during preload mode.""" def test_timer_in_preload(self): - with ThreadedWebServer(binding_address=self.GetBindingAddress()) as server: url = server.GetURL(file_name='testdata/timer_hit_in_preload.html') with self.CreateCobaltRunner( - url=url, target_params=['--preload']) as runner: + url=url, + target_params=['--preload'], + web_server_port=server.GetPort()) as runner: self.assertTrue(runner.JSTestsSucceeded()) self.assertTrue(runner.IsInPreload()) diff --git a/cobalt/black_box_tests/tests/wasm_basic_test.py b/cobalt/black_box_tests/tests/wasm_basic_test.py index 2515b53d306f..255acb622188 100644 --- a/cobalt/black_box_tests/tests/wasm_basic_test.py +++ b/cobalt/black_box_tests/tests/wasm_basic_test.py @@ -13,9 +13,9 @@ # limitations under the License. """Tests Cobalt can load and use WebAssembly.""" +import logging from cobalt.black_box_tests import black_box_tests from cobalt.black_box_tests.threaded_web_server import ThreadedWebServer -import logging PLATFORMS_SUPPORTED = [ 'stub', @@ -38,11 +38,14 @@ class WasmBasicTest(black_box_tests.BlackBoxTestCase): def test_wasm_basic(self): if self.launcher_params.platform not in PLATFORMS_SUPPORTED: - logging.warning('Blackbox tests disabled for platform:%s', - self.launcher_params.platform) + logging.warning( + 'Blackbox tests disabled for platform:%s', + self.launcher_params.platform, + ) return with ThreadedWebServer(binding_address=self.GetBindingAddress()) as server: url = server.GetURL(file_name='testdata/wasm_basic_test.html') - with self.CreateCobaltRunner(url=url) as runner: + with self.CreateCobaltRunner( + url=url, web_server_port=server.GetPort()) as runner: self.assertTrue(runner.JSTestsSucceeded()) diff --git a/cobalt/black_box_tests/tests/web_debugger.py b/cobalt/black_box_tests/tests/web_debugger.py index f55a037c94c4..bf517dc6f2df 100644 --- a/cobalt/black_box_tests/tests/web_debugger.py +++ b/cobalt/black_box_tests/tests/web_debugger.py @@ -22,18 +22,23 @@ import json import logging import os -from six.moves.urllib.parse import urlsplit -from six.moves.urllib.parse import urlunsplit import sys from cobalt.black_box_tests import black_box_tests from cobalt.black_box_tests.threaded_web_server import ThreadedWebServer +from six.moves.urllib.parse import urlsplit +from six.moves.urllib.parse import urlunsplit from starboard.tools import config sys.path.append( os.path.join( - os.path.dirname(__file__), '..', '..', '..', 'third_party', - 'websocket-client')) + os.path.dirname(__file__), + '..', + '..', + '..', + 'third_party', + 'websocket-client', + )) import websocket # pylint: disable=wrong-import-position # Set to True to add additional logging to debug the test. @@ -111,8 +116,10 @@ def send_command(self, method, params=None): if params: msg['params'] = params if _DEBUG: - logging.debug('send >>>>>>>>\n%s\n>>>>>>>>', - json.dumps(msg, sort_keys=True, indent=4)) + logging.debug( + 'send >>>>>>>>\n%s\n>>>>>>>>', + json.dumps(msg, sort_keys=True, indent=4), + ) logging.debug('send command: %s', method) self.ws.send(json.dumps(msg)) self.commands[self.last_id] = msg @@ -175,8 +182,10 @@ def _receive_message(self): """Receives one message and stores it in either responses or events.""" msg = json.loads(self.ws.recv()) if _DEBUG: - logging.debug('recv <<<<<<<<\n%s\n<<<<<<<<', - json.dumps(msg, sort_keys=True, indent=4)) + logging.debug( + 'recv <<<<<<<<\n%s\n<<<<<<<<', + json.dumps(msg, sort_keys=True, indent=4), + ) if 'id' in msg: self.responses[msg['id']] = msg elif 'method' in msg: @@ -203,10 +212,13 @@ def evaluate_js(self, expression): """Helper for the 'Runtime.evaluate' command to run some JavaScript.""" if _DEBUG: logging.debug('JavaScript eval -------- %s', expression) - response = self.run_command('Runtime.evaluate', { - 'contextId': self.context_id, - 'expression': expression, - }) + response = self.run_command( + 'Runtime.evaluate', + { + 'contextId': self.context_id, + 'expression': expression, + }, + ) if 'exceptionDetails' in response['result']: raise JavaScriptError(response['result']['exceptionDetails']) return response['result'] @@ -298,7 +310,8 @@ def test_dom_tree(self): { 'nodeId': body_node['nodeId'], 'depth': -1, # entire subtree - }) + }, + ) child_nodes_event = self.debugger.wait_event('DOM.setChildNodes') self.assertEqual(3, len(child_nodes_event['params']['nodes'])) @@ -358,10 +371,13 @@ def test_dom_tree(self): # Request children of BODY to depth 2. # Not reporting children of & . # Reporting lone text child of - self.debugger.run_command('DOM.requestChildNodes', { - 'nodeId': body_node['nodeId'], - 'depth': 2, - }) + self.debugger.run_command( + 'DOM.requestChildNodes', + { + 'nodeId': body_node['nodeId'], + 'depth': 2, + }, + ) child_nodes_event = self.debugger.wait_event('DOM.setChildNodes') self.assertEqual(3, len(child_nodes_event['params']['nodes'])) @@ -396,9 +412,12 @@ def test_dom_tree(self): # Request children of BODY to default depth of 1. # Not reporting children of - self.debugger.run_command('DOM.requestChildNodes', { - 'nodeId': body_node['nodeId'], - }) + self.debugger.run_command( + 'DOM.requestChildNodes', + { + 'nodeId': body_node['nodeId'], + }, + ) child_nodes_event = self.debugger.wait_event('DOM.setChildNodes') self.assertEqual(3, len(child_nodes_event['params']['nodes'])) @@ -414,9 +433,12 @@ def test_dom_remote_object(self): doc_root = self.debugger.enable_dom() html_node = doc_root['children'][0] body_node = html_node['children'][1] - self.debugger.run_command('DOM.requestChildNodes', { - 'nodeId': body_node['nodeId'], - }) + self.debugger.run_command( + 'DOM.requestChildNodes', + { + 'nodeId': body_node['nodeId'], + }, + ) child_nodes_event = self.debugger.wait_event('DOM.setChildNodes') div_test = child_nodes_event['params']['nodes'][1] @@ -424,9 +446,12 @@ def test_dom_remote_object(self): # This sends 'DOM.setChildNodes' events for unknown nodes on the path from # , which is the nearest ancestor that was already reported. eval_result = self.debugger.evaluate_js('document.getElementById("A1")') - node_response = self.debugger.run_command('DOM.requestNode', { - 'objectId': eval_result['result']['objectId'], - }) + node_response = self.debugger.run_command( + 'DOM.requestNode', + { + 'objectId': eval_result['result']['objectId'], + }, + ) # Event reporting the children of child_nodes_event = self.debugger.wait_event('DOM.setChildNodes') @@ -449,12 +474,18 @@ def test_dom_remote_object(self): self.assertEqual(div_a1['nodeId'], node_response['result']['nodeId']) # Round trip resolving test div to an object, then back to a node. - resolve_response = self.debugger.run_command('DOM.resolveNode', { - 'nodeId': div_test['nodeId'], - }) - node_response = self.debugger.run_command('DOM.requestNode', { - 'objectId': resolve_response['result']['object']['objectId'], - }) + resolve_response = self.debugger.run_command( + 'DOM.resolveNode', + { + 'nodeId': div_test['nodeId'], + }, + ) + node_response = self.debugger.run_command( + 'DOM.requestNode', + { + 'objectId': resolve_response['result']['object']['objectId'], + }, + ) self.assertEqual(div_test['nodeId'], node_response['result']['nodeId']) def test_dom_childlist_mutation(self): @@ -472,10 +503,13 @@ def test_dom_childlist_mutation(self): self.assertNotIn('children', body_node) # Request 1 level of children in the BODY - self.debugger.run_command('DOM.requestChildNodes', { - 'nodeId': body_node['nodeId'], - 'depth': 1, - }) + self.debugger.run_command( + 'DOM.requestChildNodes', + { + 'nodeId': body_node['nodeId'], + 'depth': 1, + }, + ) child_nodes_event = self.debugger.wait_event('DOM.setChildNodes') self.assertEqual(body_node['childNodeCount'], len(child_nodes_event['params']['nodes'])) @@ -508,10 +542,13 @@ def test_dom_childlist_mutation(self): # Request the children of the test div to repeat the insert/remove tests # after its children have been reported. - self.debugger.run_command('DOM.requestChildNodes', { - 'nodeId': div_test['nodeId'], - 'depth': 1, - }) + self.debugger.run_command( + 'DOM.requestChildNodes', + { + 'nodeId': div_test['nodeId'], + 'depth': 1, + }, + ) child_nodes_event = self.debugger.wait_event('DOM.setChildNodes') self.assertEqual(div_test['nodeId'], child_nodes_event['params']['parentId']) @@ -527,8 +564,10 @@ def test_dom_childlist_mutation(self): inserted_event = self.debugger.wait_event('DOM.childNodeInserted') self.assertEqual(div_test['nodeId'], inserted_event['params']['parentNodeId']) - self.assertEqual(child_nodes_event['params']['nodes'][-1]['nodeId'], - inserted_event['params']['previousNodeId']) + self.assertEqual( + child_nodes_event['params']['nodes'][-1]['nodeId'], + inserted_event['params']['previousNodeId'], + ) # Remove a child from a node whose children have been reported. self.debugger.evaluate_js('elem = document.getElementById("test");' @@ -536,15 +575,20 @@ def test_dom_childlist_mutation(self): removed_event = self.debugger.wait_event('DOM.childNodeRemoved') self.assertEqual(div_test['nodeId'], removed_event['params']['parentNodeId']) - self.assertEqual(inserted_event['params']['node']['nodeId'], - removed_event['params']['nodeId']) + self.assertEqual( + inserted_event['params']['node']['nodeId'], + removed_event['params']['nodeId'], + ) # Move a subtree to another part of the DOM that has not yet been reported. # (Get the original children of to depth 1) - self.debugger.run_command('DOM.requestChildNodes', { - 'nodeId': div_test['nodeId'], - 'depth': 1, - }) + self.debugger.run_command( + 'DOM.requestChildNodes', + { + 'nodeId': div_test['nodeId'], + 'depth': 1, + }, + ) child_nodes_event = self.debugger.wait_event('DOM.setChildNodes') orig_num_children = len(child_nodes_event['params']['nodes']) orig_div_a = child_nodes_event['params']['nodes'][0] @@ -559,13 +603,18 @@ def test_dom_childlist_mutation(self): self.assertEqual(orig_span_c['nodeId'], removed_event['params']['nodeId']) count_event = self.debugger.wait_event('DOM.childNodeCountUpdated') self.assertEqual(orig_div_a['nodeId'], count_event['params']['nodeId']) - self.assertEqual(orig_div_a['childNodeCount'] + 1, - count_event['params']['childNodeCount']) + self.assertEqual( + orig_div_a['childNodeCount'] + 1, + count_event['params']['childNodeCount'], + ) # (Check the moved children of ) - self.debugger.run_command('DOM.requestChildNodes', { - 'nodeId': div_test['nodeId'], - 'depth': 2, - }) + self.debugger.run_command( + 'DOM.requestChildNodes', + { + 'nodeId': div_test['nodeId'], + 'depth': 2, + }, + ) child_nodes_event = self.debugger.wait_event('DOM.setChildNodes') div_a = child_nodes_event['params']['nodes'][0] moved_span_c = div_a['children'][2] @@ -588,9 +637,12 @@ def test_dom_childlist_mutation(self): self.assertEqual(['id', 'B'], moved_div_b['attributes']) self.assertNotEqual(orig_div_b['nodeId'], moved_div_b['nodeId']) # (Check the children of moved ) - self.debugger.run_command('DOM.requestChildNodes', { - 'nodeId': moved_div_b['nodeId'], - }) + self.debugger.run_command( + 'DOM.requestChildNodes', + { + 'nodeId': moved_div_b['nodeId'], + }, + ) child_nodes_event = self.debugger.wait_event('DOM.setChildNodes') moved_span_b1 = child_nodes_event['params']['nodes'][0] self.assertEqual(['id', 'B1'], moved_span_b1['attributes']) @@ -599,8 +651,8 @@ def test_dom_childlist_mutation(self): # Replace a subtree with innerHTML # (replace all children of ) inner_html = "
\\n
" - self.debugger.evaluate_js('b = document.getElementById("B");' - f'b.innerHTML = "{inner_html}"') + self.debugger.evaluate_js( + f'b = document.getElementById("B");b.innerHTML = "{inner_html}"') removed_event = self.debugger.wait_event('DOM.childNodeRemoved') self.assertEqual(moved_span_b1['nodeId'], removed_event['params']['nodeId']) inserted_event = self.debugger.wait_event('DOM.childNodeInserted') @@ -617,10 +669,13 @@ def test_dom_text_mutation(self): body_node = html_node['children'][1] # Request 2 levels of children in the BODY - self.debugger.run_command('DOM.requestChildNodes', { - 'nodeId': body_node['nodeId'], - 'depth': 2, - }) + self.debugger.run_command( + 'DOM.requestChildNodes', + { + 'nodeId': body_node['nodeId'], + 'depth': 2, + }, + ) child_nodes_event = self.debugger.wait_event('DOM.setChildNodes') div_test = child_nodes_event['params']['nodes'][1] @@ -634,10 +689,13 @@ def test_dom_text_mutation(self): # Unrequested lone whitespace text node at depth+1 in div_b = div_test['children'][1] - self.debugger.run_command('DOM.requestChildNodes', { - 'nodeId': div_b['nodeId'], - 'depth': 1, - }) + self.debugger.run_command( + 'DOM.requestChildNodes', + { + 'nodeId': div_b['nodeId'], + 'depth': 1, + }, + ) child_nodes_event = self.debugger.wait_event('DOM.setChildNodes') span_b1 = child_nodes_event['params']['nodes'][0] text_b1 = span_b1['children'][0] @@ -652,8 +710,8 @@ def test_dom_text_mutation(self): self.assertEqual('Hello', data_event['params']['characterData']) # Setting whitespace in a lone text node reports it removed. - self.debugger.evaluate_js('text = document.getElementById("B1").firstChild;' - 'text.nodeValue = "";') + self.debugger.evaluate_js( + 'text = document.getElementById("B1").firstChild;text.nodeValue = "";') removed_event = self.debugger.wait_event('DOM.childNodeRemoved') self.assertEqual(span_b1['nodeId'], removed_event['params']['parentNodeId']) self.assertEqual(text_b1['nodeId'], removed_event['params']['nodeId']) @@ -685,12 +743,13 @@ def test_dom_text_mutation(self): # Setting whitespace in a sibling text node reports it removed. self.debugger.evaluate_js( - 'text = document.getElementById("B1").nextSibling;' - 'text.nodeValue = "";') + 'text = document.getElementById("B1").nextSibling;text.nodeValue = "";') removed_event = self.debugger.wait_event('DOM.childNodeRemoved') self.assertEqual(div_b['nodeId'], removed_event['params']['parentNodeId']) - self.assertEqual(inserted_event['params']['node']['nodeId'], - removed_event['params']['nodeId']) + self.assertEqual( + inserted_event['params']['node']['nodeId'], + removed_event['params']['nodeId'], + ) # Setting textContent removes all children and inserts a new text node. self.debugger.evaluate_js( @@ -708,8 +767,10 @@ def test_dom_text_mutation(self): self.debugger.evaluate_js('document.getElementById("B").textContent = "";') removed_event = self.debugger.wait_event('DOM.childNodeRemoved') self.assertEqual(div_b['nodeId'], removed_event['params']['parentNodeId']) - self.assertEqual(inserted_event['params']['node']['nodeId'], - removed_event['params']['nodeId']) + self.assertEqual( + inserted_event['params']['node']['nodeId'], + removed_event['params']['nodeId'], + ) # Setting textContent over empty text only inserts a new text node. self.debugger.evaluate_js( @@ -725,8 +786,10 @@ def test_dom_text_mutation(self): 'document.getElementById("B").textContent = "Three";') removed_event = self.debugger.wait_event('DOM.childNodeRemoved') self.assertEqual(div_b['nodeId'], removed_event['params']['parentNodeId']) - self.assertEqual(inserted_event['params']['node']['nodeId'], - removed_event['params']['nodeId']) + self.assertEqual( + inserted_event['params']['node']['nodeId'], + removed_event['params']['nodeId'], + ) inserted_event = self.debugger.wait_event('DOM.childNodeInserted') self.assertEqual(div_b['nodeId'], inserted_event['params']['parentNodeId']) self.assertEqual(0, inserted_event['params']['previousNodeId']) @@ -738,8 +801,10 @@ def test_dom_text_mutation(self): 'document.getElementById("B").textContent = "\\n";') removed_event = self.debugger.wait_event('DOM.childNodeRemoved') self.assertEqual(div_b['nodeId'], removed_event['params']['parentNodeId']) - self.assertEqual(inserted_event['params']['node']['nodeId'], - removed_event['params']['nodeId']) + self.assertEqual( + inserted_event['params']['node']['nodeId'], + removed_event['params']['nodeId'], + ) # Setting textContent over whitespace text only inserts a new text node. self.debugger.evaluate_js( @@ -757,10 +822,13 @@ def test_dom_attribute_mutation(self): body_node = html_node['children'][1] # Request 1 level of children in the BODY - self.debugger.run_command('DOM.requestChildNodes', { - 'nodeId': body_node['nodeId'], - 'depth': 1, - }) + self.debugger.run_command( + 'DOM.requestChildNodes', + { + 'nodeId': body_node['nodeId'], + 'depth': 1, + }, + ) child_nodes_event = self.debugger.wait_event('DOM.setChildNodes') h1 = child_nodes_event['params']['nodes'][0] @@ -854,23 +922,32 @@ def test_debugger_breakpoint(self): script_url = script_event['params']['url'] if script_url.endswith('web_debugger_test_utils.js'): script_id = script_event['params']['scriptId'] - source_response = self.debugger.run_command('Debugger.getScriptSource', { - 'scriptId': script_id, - }) + source_response = self.debugger.run_command( + 'Debugger.getScriptSource', + { + 'scriptId': script_id, + }, + ) script_source = source_response['result']['scriptSource'].splitlines() # Set a breakpoint on the asyncBreak() function. line_number = next(n for n, l in enumerate(script_source) if l.startswith('function asyncBreak')) - self.debugger.run_command('Debugger.setBreakpoint', { - 'location': { - 'scriptId': script_id, - 'lineNumber': line_number, + self.debugger.run_command( + 'Debugger.setBreakpoint', + { + 'location': { + 'scriptId': script_id, + 'lineNumber': line_number, + }, + }, + ) + self.debugger.run_command( + 'Debugger.setAsyncCallStackDepth', + { + 'maxDepth': 99, }, - }) - self.debugger.run_command('Debugger.setAsyncCallStackDepth', { - 'maxDepth': 99, - }) + ) # Check the breakpoint within a SetTimeout() callback. self.debugger.evaluate_js('testSetTimeout()') diff --git a/cobalt/black_box_tests/tests/web_platform_tests.py b/cobalt/black_box_tests/tests/web_platform_tests.py index dc11142e8b80..2cc8e47fed88 100644 --- a/cobalt/black_box_tests/tests/web_platform_tests.py +++ b/cobalt/black_box_tests/tests/web_platform_tests.py @@ -34,7 +34,8 @@ def setUp(self): def test_web_platform(self): with WebPlatformTestServer( binding_address=self.GetBindingAddress(), - wpt_http_port=self.GetWptHttpPort()): + wpt_http_port=self.GetWptHttpPort(), + ): target_params = [] filters = self.cobalt_config.GetWebPlatformTestFilters() @@ -86,6 +87,7 @@ def test_web_platform(self): env_variables={'ASAN_OPTIONS': 'intercept_tls_get_addr=0'}, loader_platform=self.launcher_params.loader_platform, loader_config=self.launcher_params.loader_config, - loader_out_directory=self.launcher_params.loader_out_directory) + loader_out_directory=self.launcher_params.loader_out_directory, + ) status = launcher.Run() self.assertEqual(status, 0) diff --git a/cobalt/black_box_tests/tests/web_worker_test.py b/cobalt/black_box_tests/tests/web_worker_test.py index 0dcb550d6707..a82c7b27bce0 100644 --- a/cobalt/black_box_tests/tests/web_worker_test.py +++ b/cobalt/black_box_tests/tests/web_worker_test.py @@ -21,9 +21,9 @@ class WebWorkerTest(black_box_tests.BlackBoxTestCase): """Test basic Web Worker functionality.""" def test_web_worker(self): - with ThreadedWebServer(binding_address=self.GetBindingAddress()) as server: url = server.GetURL(file_name='testdata/web_worker_test.html') - with self.CreateCobaltRunner(url=url) as runner: + with self.CreateCobaltRunner( + url=url, web_server_port=server.GetPort()) as runner: self.assertTrue(runner.JSTestsSucceeded()) diff --git a/cobalt/black_box_tests/tests/worker_csp_test.py b/cobalt/black_box_tests/tests/worker_csp_test.py index 9c988e11407e..05c1d19515cb 100644 --- a/cobalt/black_box_tests/tests/worker_csp_test.py +++ b/cobalt/black_box_tests/tests/worker_csp_test.py @@ -16,20 +16,20 @@ import os from cobalt.black_box_tests import black_box_tests -from cobalt.black_box_tests.threaded_web_server import ThreadedWebServer, MakeCustomHeaderRequestHandlerClass +from cobalt.black_box_tests.threaded_web_server import MakeCustomHeaderRequestHandlerClass, ThreadedWebServer paths_to_headers = { 'worker_load_csp_test.html': { 'Content-Security-Policy': - "script-src 'unsafe-inline' 'self'; worker-src 'self'" + ("script-src 'unsafe-inline' 'self'; worker-src 'self'") }, 'worker_csp_test.html': { 'Content-Security-Policy': - "script-src 'unsafe-inline' 'self'; connect-src 'self'" + ("script-src 'unsafe-inline' 'self'; connect-src 'self'") }, 'worker_csp_test.js': { 'Content-Security-Policy': "connect-src 'self';" - } + }, } @@ -40,31 +40,34 @@ def test_1_worker_csp(self): path = os.path.abspath(os.path.join(os.path.dirname(__file__), '..')) with ThreadedWebServer( binding_address=self.GetBindingAddress(), - handler=MakeCustomHeaderRequestHandlerClass( - path, paths_to_headers)) as server: + handler=MakeCustomHeaderRequestHandlerClass(path, paths_to_headers), + ) as server: url = server.GetURL(file_name='testdata/worker_csp_test.html') - with self.CreateCobaltRunner(url=url) as runner: + with self.CreateCobaltRunner( + url=url, web_server_port=server.GetPort()) as runner: self.assertTrue(runner.JSTestsSucceeded()) def test_2_worker_load_csp(self): path = os.path.abspath(os.path.join(os.path.dirname(__file__), '..')) with ThreadedWebServer( binding_address=self.GetBindingAddress(), - handler=MakeCustomHeaderRequestHandlerClass( - path, paths_to_headers)) as server: + handler=MakeCustomHeaderRequestHandlerClass(path, paths_to_headers), + ) as server: url = server.GetURL(file_name='testdata/worker_load_csp_test.html') - with self.CreateCobaltRunner(url=url) as runner: + with self.CreateCobaltRunner( + url=url, web_server_port=server.GetPort()) as runner: self.assertTrue(runner.JSTestsSucceeded()) def test_3_service_worker_csp(self): path = os.path.abspath(os.path.join(os.path.dirname(__file__), '..')) with ThreadedWebServer( binding_address=self.GetBindingAddress(), - handler=MakeCustomHeaderRequestHandlerClass( - path, paths_to_headers)) as server: + handler=MakeCustomHeaderRequestHandlerClass(path, paths_to_headers), + ) as server: url = server.GetURL(file_name='testdata/service_worker_csp_test.html') - with self.CreateCobaltRunner(url=url) as runner: + with self.CreateCobaltRunner( + url=url, web_server_port=server.GetPort()) as runner: self.assertTrue(runner.JSTestsSucceeded()) diff --git a/cobalt/black_box_tests/tests/worker_load_test.py b/cobalt/black_box_tests/tests/worker_load_test.py index 3a337b69a0f7..e4e2fa02108d 100644 --- a/cobalt/black_box_tests/tests/worker_load_test.py +++ b/cobalt/black_box_tests/tests/worker_load_test.py @@ -24,5 +24,6 @@ def test_worker_load(self): with ThreadedWebServer(binding_address=self.GetBindingAddress()) as server: url = server.GetURL(file_name='testdata/worker_load_test.html') - with self.CreateCobaltRunner(url=url) as runner: + with self.CreateCobaltRunner( + url=url, web_server_port=server.GetPort()) as runner: self.assertTrue(runner.JSTestsSucceeded()) diff --git a/cobalt/black_box_tests/tests/worker_post_message_test.py b/cobalt/black_box_tests/tests/worker_post_message_test.py index ecd5f3d0d262..f559499a2aca 100644 --- a/cobalt/black_box_tests/tests/worker_post_message_test.py +++ b/cobalt/black_box_tests/tests/worker_post_message_test.py @@ -22,6 +22,7 @@ class WorkerPostMessageTest(black_box_tests.BlackBoxTestCase): def test_worker_post_message(self): with ThreadedWebServer(binding_address=self.GetBindingAddress()) as server: url = server.GetURL(file_name='testdata/worker_post_message_test.html') - with self.CreateCobaltRunner(url=url) as runner: + with self.CreateCobaltRunner( + url=url, web_server_port=server.GetPort()) as runner: runner.WaitForJSTestsSetup() self.assertTrue(runner.JSTestsSucceeded()) diff --git a/cobalt/black_box_tests/threaded_web_server.py b/cobalt/black_box_tests/threaded_web_server.py index d305ea3007ca..e1876d34ef21 100644 --- a/cobalt/black_box_tests/threaded_web_server.py +++ b/cobalt/black_box_tests/threaded_web_server.py @@ -19,11 +19,12 @@ import logging import os -from six.moves import SimpleHTTPServer -from six.moves import socketserver import socket import threading +from six.moves import SimpleHTTPServer +from six.moves import socketserver + class _ThreadedTCPServer(socketserver.ThreadingMixIn, socketserver.TCPServer): pass @@ -66,16 +67,11 @@ def MakeCustomHeaderRequestHandlerClass(base_path, paths_to_headers): Args: base_path: A path considered to be the root directory. paths_to_headers: A dictionary with keys partial paths and values of header - dicts. Key is expected to be a substring of a file being served. - - E.g. if you have a test with files foo.html and foo.js, you can serve them - separate headers with the following: - paths_to_headers = { - 'foo.html': { - 'Content-Security-Policy', "script-src 'unsafe-inline';" - }, - 'foo.js': {'Content-Security-Policy', "default-src 'self';"} - } + dicts. Key is expected to be a substring of a file being served. E.g. if + you have a test with files foo.html and foo.js, you can serve them + separate headers with the following: paths_to_headers = { 'foo.html': { + 'Content-Security-Policy', "script-src 'unsafe-inline';" }, 'foo.js': + {'Content-Security-Policy', "default-src 'self';"} } Returns: A RequestHandler class. @@ -145,9 +141,11 @@ def get_content(self): class ThreadedWebServer(object): """A HTTP WebServer that serves requests in a separate thread.""" - def __init__(self, - handler=MakeRequestHandlerClass(os.path.dirname(__file__)), - binding_address=None): + def __init__( + self, + handler=MakeRequestHandlerClass(os.path.dirname(__file__)), + binding_address=None, + ): _ThreadedTCPServer.allow_reuse_address = True _ThreadedTCPServer.block_on_close = False @@ -164,6 +162,9 @@ def __init__(self, # When listening to any interfaces, get the IPv4 address of the hostname. self._bound_host = socket.gethostbyname(socket.gethostname()) + def GetPort(self): + return self._bound_port + def GetURL(self, file_name): """Given a |file_name|, return a HTTP URI that can be fetched. diff --git a/cobalt/black_box_tests/web_platform_test_server.py b/cobalt/black_box_tests/web_platform_test_server.py index 50ebda84646d..4d5d38a6cf82 100644 --- a/cobalt/black_box_tests/web_platform_test_server.py +++ b/cobalt/black_box_tests/web_platform_test_server.py @@ -73,7 +73,7 @@ def __enter__(self): self._server_thread = threading.Thread(target=self.main) self._server_thread.start() while not self._server_started: - time.sleep(.1) + time.sleep(0.1) return self def __exit__(self, exc_type, exc_value, traceback): diff --git a/cobalt/tools/automated_testing/cobalt_runner.py b/cobalt/tools/automated_testing/cobalt_runner.py index 82db23a9ae76..6512ff20fbfa 100644 --- a/cobalt/tools/automated_testing/cobalt_runner.py +++ b/cobalt/tools/automated_testing/cobalt_runner.py @@ -100,6 +100,7 @@ def __init__(self, success_message=None, log_handler=None, poll_until_wait_seconds=POLL_UNTIL_WAIT_SECONDS, + web_server_port=None, **kwargs): """CobaltRunner constructor. @@ -113,6 +114,7 @@ def __init__(self, success_message: Optional success message to be printed on successful exit. pull_until_wait_seconds: Seconds to wait while polling for an event. + web_server_port: The port to host testdata server before Cobalt starts. **kwargs: Additional parameters to be passed to the launcher. """ @@ -127,6 +129,7 @@ def __init__(self, self.launcher_is_running = False self.windowdriver_created = threading.Event() self.webmodule_loaded = threading.Event() + self.web_server_port = web_server_port self.selenium_webdriver_module = webdriver_utils.import_selenium_module( 'webdriver') @@ -190,6 +193,12 @@ def SendDeepLink(self, link): """Sends a deep link to Cobalt.""" return self.launcher.SendDeepLink(link) + def CreateDeviceToHostTunnel(self, host_port, device_port): + self.launcher.CreateDeviceToHostTunnel(host_port, device_port) + + def RemoveDeviceToHostTunnel(self, host_port): + self.launcher.RemoveDeviceToHostTunnel(host_port) + def GetURL(self): return self.url @@ -261,6 +270,15 @@ def Run(self): self.launcher_read_pipe = os.fdopen(read_fd, 'r') self.launcher_write_pipe = os.fdopen(write_fd, 'w') + launcher_args = {} + if self.launcher_params.target_params: + for param in self.launcher_params.target_params: + pname = param.replace('--','') + val = True + if '=' in pname: + pname, val = pname.split('=') + launcher_args[pname] = val + self.launcher = abstract_launcher.LauncherFactory( self.launcher_params.platform, 'cobalt', @@ -272,7 +290,11 @@ def Run(self): loader_platform=self.launcher_params.loader_platform, loader_config=self.launcher_params.loader_config, loader_out_directory=self.launcher_params.loader_out_directory, + launcher_args=launcher_args, **self.kwargs) + #Start the Device->Host tunnel now in case Cobalt connects the host. + if self.web_server_port: + self.CreateDeviceToHostTunnel(self.web_server_port, self.web_server_port) self.runner_thread = threading.Thread(target=self._RunLauncher) self.runner_thread.start() diff --git a/starboard/android/shared/launcher.py b/starboard/android/shared/launcher.py index ead7a0db550c..8926fbb46eb7 100644 --- a/starboard/android/shared/launcher.py +++ b/starboard/android/shared/launcher.py @@ -148,10 +148,11 @@ def __init__(self, platform, target_name, config, device_id, **kwargs): # Verify connection and dump target build fingerprint. self._CheckCallAdb('shell', 'getprop', 'ro.build.fingerprint') - out_directory = os.path.split(self.GetTargetPath())[0] - self.apk_path = os.path.join(out_directory, f'{target_name}.apk') - if not os.path.exists(self.apk_path): - raise Exception(f"Can't find APK {self.apk_path}") + if abstract_launcher.ARG_NOINSTALL not in self.launcher_args: + out_directory = os.path.split(self.GetTargetPath())[0] + self.apk_path = os.path.join(out_directory, f'{target_name}.apk') + if not os.path.exists(self.apk_path): + raise Exception(f"Can't find APK {self.apk_path}") # This flag is set when the main Run() loop exits. If Kill() is called # after this flag is set, it will not do anything. @@ -161,6 +162,10 @@ def __init__(self, platform, target_name, config, device_id, **kwargs): # on. self.local_port = None + # Keep track of the port used by ADB reverse in order to remove it later + # on. + self.web_server_port = None + def _IsValidIPv4Address(self, address): """Returns True if address is a valid IPv4 address, False otherwise.""" try: @@ -384,6 +389,8 @@ def Run(self): self._Shutdown() if self.local_port is not None: self.CallAdb('forward', '--remove', f'tcp:{self.local_port}') + if self.web_server_port is not None: + self.RemoveDeviceToHostTunnel(self.web_server_port) am_monitor.Shutdown() self.killed.set() run_timer.Stop() @@ -444,6 +451,21 @@ def GetHostAndPortGivenPort(self, port): # pylint: disable=g-socket-gethostbyname return socket.gethostbyname('localhost'), self.local_port + def CreateDeviceToHostTunnel(self, host_port, device_port): + self.web_server_port = host_port + reverse_p = self._PopenAdb( + 'reverse', f'tcp:{device_port}', f'tcp:{host_port}', stdout=subprocess.PIPE) + reverse_p.wait() + sys.stderr.write(f'ADB reverse host port {host_port} ' + f'=> device port {device_port}\n') + return True + + def RemoveDeviceToHostTunnel(self, host_port): + reverse_p = self._PopenAdb( + 'reverse --remove ', f'tcp:{host_port}', stdout=subprocess.PIPE) + reverse_p.wait() + sys.stderr.write(f'ADB reverse --remove tcp:{host_port}\n') + def GetDeviceIp(self): """Gets the device IP. TODO: Implement.""" return None diff --git a/starboard/tools/abstract_launcher.py b/starboard/tools/abstract_launcher.py index ff361cf6df1e..fa28d7c4b89e 100644 --- a/starboard/tools/abstract_launcher.py +++ b/starboard/tools/abstract_launcher.py @@ -283,6 +283,20 @@ def GetHostAndPortGivenPort(self, port): """ return self.device_id, port + def CreateDeviceToHostTunnel(self, host_port, device_port): + """Creates a tunnel that transfers requests from device to host. + + This is used by on-device processes to connect to services on the host. + + Args: + host_port: The host_port to receive requests from the device. + device_port: The port on device to proxy on-device requests. + + Returns: + True if succeed and false otherwise. + """ + return False + def GetTargetPath(self): """Constructs the path to an executable target.