1*6777b538SAndroid Build Coastguard Worker#!/usr/bin/env python 2*6777b538SAndroid Build Coastguard Worker# Copyright 2019 The Chromium Authors 3*6777b538SAndroid Build Coastguard Worker# Use of this source code is governed by a BSD-style license that can be 4*6777b538SAndroid Build Coastguard Worker# found in the LICENSE file. 5*6777b538SAndroid Build Coastguard Worker 6*6777b538SAndroid Build Coastguard Worker"""Runs a python script under an isolate 7*6777b538SAndroid Build Coastguard Worker 8*6777b538SAndroid Build Coastguard WorkerThis script attempts to emulate the contract of gtest-style tests 9*6777b538SAndroid Build Coastguard Workerinvoked via recipes. 10*6777b538SAndroid Build Coastguard Worker 11*6777b538SAndroid Build Coastguard WorkerIf optional argument --isolated-script-test-output=[FILENAME] is passed 12*6777b538SAndroid Build Coastguard Workerto the script, json is written to that file in the format detailed in 13*6777b538SAndroid Build Coastguard Worker//docs/testing/json-test-results-format.md. 14*6777b538SAndroid Build Coastguard Worker 15*6777b538SAndroid Build Coastguard WorkerThis script is intended to be the base command invoked by the isolate, 16*6777b538SAndroid Build Coastguard Workerfollowed by a subsequent Python script.""" 17*6777b538SAndroid Build Coastguard Worker 18*6777b538SAndroid Build Coastguard Workerimport argparse 19*6777b538SAndroid Build Coastguard Workerimport json 20*6777b538SAndroid Build Coastguard Workerimport os 21*6777b538SAndroid Build Coastguard Workerimport sys 22*6777b538SAndroid Build Coastguard Worker 23*6777b538SAndroid Build Coastguard Worker# Add src/testing/ into sys.path for importing xvfb and common. 24*6777b538SAndroid Build Coastguard Workersys.path.append( 25*6777b538SAndroid Build Coastguard Worker os.path.abspath(os.path.join(os.path.dirname(__file__), os.path.pardir))) 26*6777b538SAndroid Build Coastguard Workerimport xvfb 27*6777b538SAndroid Build Coastguard Workerfrom scripts import common 28*6777b538SAndroid Build Coastguard Worker 29*6777b538SAndroid Build Coastguard Worker# pylint: disable=super-with-arguments 30*6777b538SAndroid Build Coastguard Worker 31*6777b538SAndroid Build Coastguard Worker 32*6777b538SAndroid Build Coastguard Workerdef main(): 33*6777b538SAndroid Build Coastguard Worker parser = argparse.ArgumentParser() 34*6777b538SAndroid Build Coastguard Worker parser.add_argument('--isolated-script-test-output', type=str) 35*6777b538SAndroid Build Coastguard Worker args, _ = parser.parse_known_args() 36*6777b538SAndroid Build Coastguard Worker 37*6777b538SAndroid Build Coastguard Worker if sys.platform == 'win32': 38*6777b538SAndroid Build Coastguard Worker exe = os.path.join('.', 'flatbuffers_unittests.exe') 39*6777b538SAndroid Build Coastguard Worker else: 40*6777b538SAndroid Build Coastguard Worker exe = os.path.join('.', 'flatbuffers_unittests') 41*6777b538SAndroid Build Coastguard Worker 42*6777b538SAndroid Build Coastguard Worker env = os.environ.copy() 43*6777b538SAndroid Build Coastguard Worker failures = [] 44*6777b538SAndroid Build Coastguard Worker with common.temporary_file() as tempfile_path: 45*6777b538SAndroid Build Coastguard Worker rc = xvfb.run_executable([exe], env, stdoutfile=tempfile_path) 46*6777b538SAndroid Build Coastguard Worker 47*6777b538SAndroid Build Coastguard Worker # The flatbuffer tests do not really conform to anything parsable, except 48*6777b538SAndroid Build Coastguard Worker # that they will succeed with "ALL TESTS PASSED". We cannot test for 49*6777b538SAndroid Build Coastguard Worker # equality because some tests operate on invalid input and produce error 50*6777b538SAndroid Build Coastguard Worker # messages (e.g. "Field id in struct ProtoMessage has a non positive number 51*6777b538SAndroid Build Coastguard Worker # value" in a test that verifies behavior if a proto message does contain 52*6777b538SAndroid Build Coastguard Worker # a non positive number). 53*6777b538SAndroid Build Coastguard Worker with open(tempfile_path) as f: 54*6777b538SAndroid Build Coastguard Worker output = f.read() 55*6777b538SAndroid Build Coastguard Worker if "ALL TESTS PASSED\n" not in output: 56*6777b538SAndroid Build Coastguard Worker failures = [output] 57*6777b538SAndroid Build Coastguard Worker 58*6777b538SAndroid Build Coastguard Worker if args.isolated_script_test_output: 59*6777b538SAndroid Build Coastguard Worker with open(args.isolated_script_test_output, 'w') as fp: 60*6777b538SAndroid Build Coastguard Worker json.dump({'valid': True,'failures': failures}, fp) 61*6777b538SAndroid Build Coastguard Worker 62*6777b538SAndroid Build Coastguard Worker return rc 63*6777b538SAndroid Build Coastguard Worker 64*6777b538SAndroid Build Coastguard Worker 65*6777b538SAndroid Build Coastguard Workerdef main_compile_targets(args): 66*6777b538SAndroid Build Coastguard Worker json.dump(['flatbuffers_unittests'], args.output) 67*6777b538SAndroid Build Coastguard Worker 68*6777b538SAndroid Build Coastguard Worker 69*6777b538SAndroid Build Coastguard Workerif __name__ == '__main__': 70*6777b538SAndroid Build Coastguard Worker # Conform minimally to the protocol defined by ScriptTest. 71*6777b538SAndroid Build Coastguard Worker if 'compile_targets' in sys.argv: 72*6777b538SAndroid Build Coastguard Worker funcs = { 73*6777b538SAndroid Build Coastguard Worker 'run': None, 74*6777b538SAndroid Build Coastguard Worker 'compile_targets': main_compile_targets, 75*6777b538SAndroid Build Coastguard Worker } 76*6777b538SAndroid Build Coastguard Worker sys.exit(common.run_script(sys.argv[1:], funcs)) 77*6777b538SAndroid Build Coastguard Worker sys.exit(main()) 78