1*d57664e9SAndroid Build Coastguard Worker#!/usr/bin/env python3 2*d57664e9SAndroid Build Coastguard Worker# 3*d57664e9SAndroid Build Coastguard Worker# Copyright (C) 2024 The Android Open Source Project 4*d57664e9SAndroid Build Coastguard Worker# 5*d57664e9SAndroid Build Coastguard Worker# Licensed under the Apache License, Version 2.0 (the "License"); 6*d57664e9SAndroid Build Coastguard Worker# you may not use this file except in compliance with the License. 7*d57664e9SAndroid Build Coastguard Worker# You may obtain a copy of the License at 8*d57664e9SAndroid Build Coastguard Worker# 9*d57664e9SAndroid Build Coastguard Worker# http://www.apache.org/licenses/LICENSE-2.0 10*d57664e9SAndroid Build Coastguard Worker# 11*d57664e9SAndroid Build Coastguard Worker# Unless required by applicable law or agreed to in writing, software 12*d57664e9SAndroid Build Coastguard Worker# distributed under the License is distributed on an "AS IS" BASIS, 13*d57664e9SAndroid Build Coastguard Worker# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14*d57664e9SAndroid Build Coastguard Worker# See the License for the specific language governing permissions and 15*d57664e9SAndroid Build Coastguard Worker# limitations under the License. 16*d57664e9SAndroid Build Coastguard Worker 17*d57664e9SAndroid Build Coastguard Worker""" 18*d57664e9SAndroid Build Coastguard WorkerTool to bulk-enable tests that are now passing on Ravenwood. 19*d57664e9SAndroid Build Coastguard Worker 20*d57664e9SAndroid Build Coastguard WorkerCurrently only offers to include classes which are fully passing; ignores 21*d57664e9SAndroid Build Coastguard Workerclasses that have partial success. 22*d57664e9SAndroid Build Coastguard Worker 23*d57664e9SAndroid Build Coastguard WorkerTypical usage: 24*d57664e9SAndroid Build Coastguard Worker$ RAVENWOOD_RUN_DISABLED_TESTS=1 atest MyTestsRavenwood 25*d57664e9SAndroid Build Coastguard Worker$ cd /path/to/tests/root 26*d57664e9SAndroid Build Coastguard Worker$ python bulk_enable.py /path/to/atest/output/host_log.txt 27*d57664e9SAndroid Build Coastguard Worker""" 28*d57664e9SAndroid Build Coastguard Worker 29*d57664e9SAndroid Build Coastguard Workerimport collections 30*d57664e9SAndroid Build Coastguard Workerimport os 31*d57664e9SAndroid Build Coastguard Workerimport re 32*d57664e9SAndroid Build Coastguard Workerimport subprocess 33*d57664e9SAndroid Build Coastguard Workerimport sys 34*d57664e9SAndroid Build Coastguard Worker 35*d57664e9SAndroid Build Coastguard Workerre_result = re.compile("I/ModuleListener.+?null-device-0 (.+?)#(.+?) ([A-Z_]+)(.*)$") 36*d57664e9SAndroid Build Coastguard Worker 37*d57664e9SAndroid Build Coastguard WorkerDRY_RUN = "-n" in sys.argv 38*d57664e9SAndroid Build Coastguard Worker 39*d57664e9SAndroid Build Coastguard WorkerANNOTATION = "@android.platform.test.annotations.EnabledOnRavenwood" 40*d57664e9SAndroid Build Coastguard WorkerSED_ARG = "s/^((public )?class )/%s\\n\\1/g" % (ANNOTATION) 41*d57664e9SAndroid Build Coastguard Worker 42*d57664e9SAndroid Build Coastguard WorkerSTATE_PASSED = "PASSED" 43*d57664e9SAndroid Build Coastguard WorkerSTATE_FAILURE = "FAILURE" 44*d57664e9SAndroid Build Coastguard WorkerSTATE_ASSUMPTION_FAILURE = "ASSUMPTION_FAILURE" 45*d57664e9SAndroid Build Coastguard WorkerSTATE_CANDIDATE = "CANDIDATE" 46*d57664e9SAndroid Build Coastguard Worker 47*d57664e9SAndroid Build Coastguard Workerstats_total = collections.defaultdict(int) 48*d57664e9SAndroid Build Coastguard Workerstats_class = collections.defaultdict(lambda: collections.defaultdict(int)) 49*d57664e9SAndroid Build Coastguard Workerstats_method = collections.defaultdict() 50*d57664e9SAndroid Build Coastguard Worker 51*d57664e9SAndroid Build Coastguard Workerwith open(sys.argv[-1]) as f: 52*d57664e9SAndroid Build Coastguard Worker for line in f.readlines(): 53*d57664e9SAndroid Build Coastguard Worker result = re_result.search(line) 54*d57664e9SAndroid Build Coastguard Worker if result: 55*d57664e9SAndroid Build Coastguard Worker clazz, method, state, msg = result.groups() 56*d57664e9SAndroid Build Coastguard Worker if state == STATE_FAILURE and "actually passed under Ravenwood" in msg: 57*d57664e9SAndroid Build Coastguard Worker state = STATE_CANDIDATE 58*d57664e9SAndroid Build Coastguard Worker stats_total[state] += 1 59*d57664e9SAndroid Build Coastguard Worker stats_class[clazz][state] += 1 60*d57664e9SAndroid Build Coastguard Worker stats_method[(clazz, method)] = state 61*d57664e9SAndroid Build Coastguard Worker 62*d57664e9SAndroid Build Coastguard Worker# Find classes who are fully "candidates" (would be entirely green if enabled) 63*d57664e9SAndroid Build Coastguard Workernum_enabled = 0 64*d57664e9SAndroid Build Coastguard Workerfor clazz in stats_class.keys(): 65*d57664e9SAndroid Build Coastguard Worker stats = stats_class[clazz] 66*d57664e9SAndroid Build Coastguard Worker if STATE_CANDIDATE in stats and len(stats) == 1: 67*d57664e9SAndroid Build Coastguard Worker num_enabled += stats[STATE_CANDIDATE] 68*d57664e9SAndroid Build Coastguard Worker print("Enabling fully-passing class", clazz) 69*d57664e9SAndroid Build Coastguard Worker clazz_match = re.compile("%s\.(kt|java)" % (clazz.split(".")[-1])) 70*d57664e9SAndroid Build Coastguard Worker for root, dirs, files in os.walk("."): 71*d57664e9SAndroid Build Coastguard Worker for f in files: 72*d57664e9SAndroid Build Coastguard Worker if clazz_match.match(f) and not DRY_RUN: 73*d57664e9SAndroid Build Coastguard Worker path = os.path.join(root, f) 74*d57664e9SAndroid Build Coastguard Worker subprocess.run(["sed", "-i", "-E", SED_ARG, path]) 75*d57664e9SAndroid Build Coastguard Worker 76*d57664e9SAndroid Build Coastguard Workerprint("Overall stats", stats_total) 77*d57664e9SAndroid Build Coastguard Workerprint("Candidates actually enabled", num_enabled) 78