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