1 #!/usr/bin/env bash 2 3 # Copyright (C) 2016 The Android Open Source Project 4 # 5 # Licensed under the Apache License, Version 2.0 (the "License"); 6 # you may not use this file except in compliance with the License. 7 # You may obtain a copy of the License at 8 # 9 # http://www.apache.org/licenses/LICENSE-2.0 10 # 11 # Unless required by applicable law or agreed to in writing, software 12 # distributed under the License is distributed on an "AS IS" BASIS, 13 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 # See the License for the specific language governing permissions and 15 # limitations under the License. 16 17 ### 18 ### Scan this directory for any testng classes 19 ### Outputs a testng.xml formatted list of classes 20 ### 21 22 DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" 23 test_property_files="$(find "$DIR" -name TEST.properties)" 24 25 function debug_print { 26 if [[ $DEBUG == "true" ]]; then 27 echo "DEBUG:" "$@" >& 2 28 fi 29 } 30 31 function error_print { 32 echo "ERROR:" "$@" >& 2 33 exit 1 34 } 35 36 function class_name_from_class_file { 37 # Reads a list of .java files from stdin, spits out their fully qualified class name. 38 local file_name 39 local package_string 40 local package_name 41 local class_name 42 while read file_name; do 43 package_string="$(grep "package" "$file_name")" 44 [[ $? -ne 0 ]] && error_print "File $file_name missing package declaration." 45 debug_print "File: $file_name" 46 47 # Parse the package name by looking inside of the file. 48 package_name=${package_string#package[[:space:]]*} # remove package followed by any spaces 49 package_name=${package_name%;} # remove semicolon at the end 50 51 # Assumes class name == file name. Almost always the case. 52 class_name="$(basename "$file_name")" 53 class_name="${class_name%.java}" # remove ".java" from the end 54 debug_print "Package: <$package_name>" 55 56 echo "$package_name.$class_name" 57 done 58 } 59 60 function list_classes_in_dir { 61 find "$1" -name "*.java" | class_name_from_class_file 62 } 63 64 function list_all_classes { 65 local file 66 for file in $test_property_files; do 67 debug_print "File: $file" 68 69 if ! grep "TestNG.dirs" "$file" > /dev/null; then 70 continue 71 fi 72 73 debug_print "Has TestNG files" 74 75 list_classes_in_dir "$(dirname "$file")" 76 done 77 } 78 79 function class_name_to_testng_entry { 80 local class_name 81 while read class_name; do 82 echo "<class name=\"$class_name\" />" 83 done 84 } 85 86 list_all_classes | class_name_to_testng_entry 87