xref: /aosp_15_r20/external/cronet/testing/scripts/run_flatbuffers_unittests.py (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
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