xref: /aosp_15_r20/art/test/648-many-direct-methods/util-src/generate_java.py (revision 795d594fd825385562da6b089ea9b2033f3abf5a)
1*795d594fSAndroid Build Coastguard Worker#! /usr/bin/python3
2*795d594fSAndroid Build Coastguard Worker#
3*795d594fSAndroid Build Coastguard Worker# Copyright (C) 2017 The Android Open Source Project
4*795d594fSAndroid Build Coastguard Worker#
5*795d594fSAndroid Build Coastguard Worker# Licensed under the Apache License, Version 2.0 (the "License");
6*795d594fSAndroid Build Coastguard Worker# you may not use this file except in compliance with the License.
7*795d594fSAndroid Build Coastguard Worker# You may obtain a copy of the License at
8*795d594fSAndroid Build Coastguard Worker#
9*795d594fSAndroid Build Coastguard Worker#     http://www.apache.org/licenses/LICENSE-2.0
10*795d594fSAndroid Build Coastguard Worker#
11*795d594fSAndroid Build Coastguard Worker# Unless required by applicable law or agreed to in writing, software
12*795d594fSAndroid Build Coastguard Worker# distributed under the License is distributed on an "AS IS" BASIS,
13*795d594fSAndroid Build Coastguard Worker# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14*795d594fSAndroid Build Coastguard Worker# See the License for the specific language governing permissions and
15*795d594fSAndroid Build Coastguard Worker# limitations under the License.
16*795d594fSAndroid Build Coastguard Worker
17*795d594fSAndroid Build Coastguard Worker"""
18*795d594fSAndroid Build Coastguard WorkerGenerate Java test files for test 648-many-direct-methods.
19*795d594fSAndroid Build Coastguard Worker"""
20*795d594fSAndroid Build Coastguard Worker
21*795d594fSAndroid Build Coastguard Workerimport os
22*795d594fSAndroid Build Coastguard Workerimport sys
23*795d594fSAndroid Build Coastguard Workerfrom pathlib import Path
24*795d594fSAndroid Build Coastguard Worker
25*795d594fSAndroid Build Coastguard WorkerBUILD_TOP = os.getenv("ANDROID_BUILD_TOP")
26*795d594fSAndroid Build Coastguard Workerif BUILD_TOP is None:
27*795d594fSAndroid Build Coastguard Worker  print("ANDROID_BUILD_TOP not set. Please run build/envsetup.sh", file=sys.stderr)
28*795d594fSAndroid Build Coastguard Worker  sys.exit(1)
29*795d594fSAndroid Build Coastguard Worker
30*795d594fSAndroid Build Coastguard Worker# Allow us to import utils and mixins.
31*795d594fSAndroid Build Coastguard Workersys.path.append(str(Path(BUILD_TOP)/"art"/"test"/"utils"/"python"))
32*795d594fSAndroid Build Coastguard Worker
33*795d594fSAndroid Build Coastguard Workerfrom testgen.utils import get_copyright, subtree_sizes, gensym, filter_blanks
34*795d594fSAndroid Build Coastguard Workerimport testgen.mixins as mixins
35*795d594fSAndroid Build Coastguard Worker
36*795d594fSAndroid Build Coastguard Workerclass MainClass(mixins.DumpMixin, mixins.Named, mixins.JavaFileMixin):
37*795d594fSAndroid Build Coastguard Worker  """
38*795d594fSAndroid Build Coastguard Worker  A Main.java file containing the Main class and the main function. It will run
39*795d594fSAndroid Build Coastguard Worker  all the test functions we have.
40*795d594fSAndroid Build Coastguard Worker  """
41*795d594fSAndroid Build Coastguard Worker
42*795d594fSAndroid Build Coastguard Worker  MAIN_CLASS_TEMPLATE = """{copyright}
43*795d594fSAndroid Build Coastguard Workerpublic class Main {{
44*795d594fSAndroid Build Coastguard Worker{main_func}
45*795d594fSAndroid Build Coastguard Worker{test_groups}
46*795d594fSAndroid Build Coastguard Worker
47*795d594fSAndroid Build Coastguard Worker}}"""
48*795d594fSAndroid Build Coastguard Worker
49*795d594fSAndroid Build Coastguard Worker  MAIN_FUNCTION_TEMPLATE = """
50*795d594fSAndroid Build Coastguard Worker  public static void main(String[] args) {
51*795d594fSAndroid Build Coastguard Worker    System.out.println("passed");
52*795d594fSAndroid Build Coastguard Worker  }"""
53*795d594fSAndroid Build Coastguard Worker
54*795d594fSAndroid Build Coastguard Worker  def __init__(self):
55*795d594fSAndroid Build Coastguard Worker    """
56*795d594fSAndroid Build Coastguard Worker    Initialize this MainClass. We start out with no tests.
57*795d594fSAndroid Build Coastguard Worker    """
58*795d594fSAndroid Build Coastguard Worker    self.tests = set()
59*795d594fSAndroid Build Coastguard Worker
60*795d594fSAndroid Build Coastguard Worker  def add_test_method(self, num):
61*795d594fSAndroid Build Coastguard Worker    """
62*795d594fSAndroid Build Coastguard Worker    Add test method number 'num'
63*795d594fSAndroid Build Coastguard Worker    """
64*795d594fSAndroid Build Coastguard Worker    self.tests.add(TestMethod(num))
65*795d594fSAndroid Build Coastguard Worker
66*795d594fSAndroid Build Coastguard Worker  def get_name(self):
67*795d594fSAndroid Build Coastguard Worker    """
68*795d594fSAndroid Build Coastguard Worker    Get the name of this class
69*795d594fSAndroid Build Coastguard Worker    """
70*795d594fSAndroid Build Coastguard Worker    return "Main"
71*795d594fSAndroid Build Coastguard Worker
72*795d594fSAndroid Build Coastguard Worker  def __str__(self):
73*795d594fSAndroid Build Coastguard Worker    """
74*795d594fSAndroid Build Coastguard Worker    Print the MainClass Java code.
75*795d594fSAndroid Build Coastguard Worker    """
76*795d594fSAndroid Build Coastguard Worker    all_tests = sorted(self.tests)
77*795d594fSAndroid Build Coastguard Worker    test_groups = ""
78*795d594fSAndroid Build Coastguard Worker    for t in all_tests:
79*795d594fSAndroid Build Coastguard Worker      test_groups += str(t)
80*795d594fSAndroid Build Coastguard Worker    main_func = self.MAIN_FUNCTION_TEMPLATE
81*795d594fSAndroid Build Coastguard Worker
82*795d594fSAndroid Build Coastguard Worker    return self.MAIN_CLASS_TEMPLATE.format(copyright = get_copyright("java"),
83*795d594fSAndroid Build Coastguard Worker                                           main_func = main_func,
84*795d594fSAndroid Build Coastguard Worker                                           test_groups = test_groups)
85*795d594fSAndroid Build Coastguard Worker
86*795d594fSAndroid Build Coastguard Workerclass TestMethod(mixins.Named, mixins.NameComparableMixin):
87*795d594fSAndroid Build Coastguard Worker  """
88*795d594fSAndroid Build Coastguard Worker  A function that represents a test method. Should only be
89*795d594fSAndroid Build Coastguard Worker  constructed by MainClass.add_test_method.
90*795d594fSAndroid Build Coastguard Worker  """
91*795d594fSAndroid Build Coastguard Worker
92*795d594fSAndroid Build Coastguard Worker  TEST_FUNCTION_TEMPLATE = """
93*795d594fSAndroid Build Coastguard Worker  public static void {fname}() {{}}"""
94*795d594fSAndroid Build Coastguard Worker
95*795d594fSAndroid Build Coastguard Worker  def __init__(self, farg):
96*795d594fSAndroid Build Coastguard Worker    """
97*795d594fSAndroid Build Coastguard Worker    Initialize a test method for the given argument.
98*795d594fSAndroid Build Coastguard Worker    """
99*795d594fSAndroid Build Coastguard Worker    self.farg = farg
100*795d594fSAndroid Build Coastguard Worker
101*795d594fSAndroid Build Coastguard Worker  def get_name(self):
102*795d594fSAndroid Build Coastguard Worker    """
103*795d594fSAndroid Build Coastguard Worker    Get the name of this test method.
104*795d594fSAndroid Build Coastguard Worker    """
105*795d594fSAndroid Build Coastguard Worker    return "method{:05d}".format(self.farg)
106*795d594fSAndroid Build Coastguard Worker
107*795d594fSAndroid Build Coastguard Worker  def __str__(self):
108*795d594fSAndroid Build Coastguard Worker    """
109*795d594fSAndroid Build Coastguard Worker    Print the Java code of this test method.
110*795d594fSAndroid Build Coastguard Worker    """
111*795d594fSAndroid Build Coastguard Worker    return self.TEST_FUNCTION_TEMPLATE.format(fname=self.get_name())
112*795d594fSAndroid Build Coastguard Worker
113*795d594fSAndroid Build Coastguard Worker# Number of generated test methods. This number has been chosen to
114*795d594fSAndroid Build Coastguard Worker# make sure the number of direct methods in class Main is greater or
115*795d594fSAndroid Build Coastguard Worker# equal to 2^16, and thus requires an *unsigned* 16-bit (short)
116*795d594fSAndroid Build Coastguard Worker# integer to be represented (b/33650497).
117*795d594fSAndroid Build Coastguard WorkerNUM_TEST_METHODS = 32768
118*795d594fSAndroid Build Coastguard Worker
119*795d594fSAndroid Build Coastguard Workerdef create_test_file():
120*795d594fSAndroid Build Coastguard Worker  """
121*795d594fSAndroid Build Coastguard Worker  Creates the object representing the test file. It just needs to be dumped.
122*795d594fSAndroid Build Coastguard Worker  """
123*795d594fSAndroid Build Coastguard Worker  mc = MainClass()
124*795d594fSAndroid Build Coastguard Worker  for i in range(1, NUM_TEST_METHODS + 1):
125*795d594fSAndroid Build Coastguard Worker    mc.add_test_method(i)
126*795d594fSAndroid Build Coastguard Worker  return mc
127*795d594fSAndroid Build Coastguard Worker
128*795d594fSAndroid Build Coastguard Workerdef main(argv):
129*795d594fSAndroid Build Coastguard Worker  java_dir = Path(argv[1])
130*795d594fSAndroid Build Coastguard Worker  if not java_dir.exists() or not java_dir.is_dir():
131*795d594fSAndroid Build Coastguard Worker    print("{} is not a valid Java dir".format(java_dir), file=sys.stderr)
132*795d594fSAndroid Build Coastguard Worker    sys.exit(1)
133*795d594fSAndroid Build Coastguard Worker  mainclass = create_test_file()
134*795d594fSAndroid Build Coastguard Worker  mainclass.dump(java_dir)
135*795d594fSAndroid Build Coastguard Worker
136*795d594fSAndroid Build Coastguard Workerif __name__ == '__main__':
137*795d594fSAndroid Build Coastguard Worker  main(sys.argv)
138