Home | History | Annotate | Download | only in test
      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