#!/usr/bin/env bash # Copyright (C) 2016 The Android Open Source Project # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. ### ### Scan this directory for any testng classes ### Outputs a testng.xml formatted list of classes ### DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" test_property_files="$(find "$DIR" -name TEST.properties)" function debug_print { if [[ $DEBUG == "true" ]]; then echo "DEBUG:" "$@" >& 2 fi } function error_print { echo "ERROR:" "$@" >& 2 exit 1 } function class_name_from_class_file { # Reads a list of .java files from stdin, spits out their fully qualified class name. local file_name local package_string local package_name local class_name while read file_name; do package_string="$(grep "package" "$file_name")" [[ $? -ne 0 ]] && error_print "File $file_name missing package declaration." debug_print "File: $file_name" # Parse the package name by looking inside of the file. package_name=${package_string#package[[:space:]]*} # remove package followed by any spaces package_name=${package_name%;} # remove semicolon at the end # Assumes class name == file name. Almost always the case. class_name="$(basename "$file_name")" class_name="${class_name%.java}" # remove ".java" from the end debug_print "Package: <$package_name>" echo "$package_name.$class_name" done } function list_classes_in_dir { find "$1" -name "*.java" | class_name_from_class_file } function list_all_classes { local file for file in $test_property_files; do debug_print "File: $file" if ! grep "TestNG.dirs" "$file" > /dev/null; then continue fi debug_print "Has TestNG files" list_classes_in_dir "$(dirname "$file")" done } function class_name_to_testng_entry { local class_name while read class_name; do echo "<class name=\"$class_name\" />" done } list_all_classes | class_name_to_testng_entry