14c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin#!/usr/bin/env bash
24c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin
34c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin# Copyright (C) 2016 The Android Open Source Project
44c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin#
54c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin# Licensed under the Apache License, Version 2.0 (the "License");
64c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin# you may not use this file except in compliance with the License.
74c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin# You may obtain a copy of the License at
84c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin#
94c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin#     http://www.apache.org/licenses/LICENSE-2.0
104c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin#
114c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin# Unless required by applicable law or agreed to in writing, software
124c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin# distributed under the License is distributed on an "AS IS" BASIS,
134c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
144c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin# See the License for the specific language governing permissions and
154c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin# limitations under the License.
164c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin
174c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin###
184c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin### Scan this directory for any testng classes
194c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin### Outputs a testng.xml formatted list of classes
204c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin###
214c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin
224c65c01a4fcfe8c68cd73914370bd269712b91d9Igor MurashkinDIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
234c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkintest_property_files="$(find "$DIR" -name TEST.properties)"
244c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin
254c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkinfunction debug_print {
264c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin  if [[ $DEBUG == "true" ]]; then
274c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin    echo "DEBUG:" "$@" >& 2
284c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin  fi
294c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin}
304c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin
314c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkinfunction error_print {
324c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin  echo "ERROR:" "$@" >& 2
334c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin  exit 1
344c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin}
354c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin
364c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkinfunction class_name_from_class_file {
374c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin  # Reads a list of .java files from stdin, spits out their fully qualified class name.
384c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin  local file_name
394c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin  local package_string
404c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin  local package_name
414c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin  local class_name
424c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin  while read file_name; do
434c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin    package_string="$(grep "package" "$file_name")"
444c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin    [[ $? -ne 0 ]] && error_print "File $file_name missing package declaration."
454c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin    debug_print "File: $file_name"
464c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin
474c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin    # Parse the package name by looking inside of the file.
484c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin    package_name=${package_string#package[[:space:]]*}  # remove package followed by any spaces
494c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin    package_name=${package_name%;} # remove semicolon at the end
504c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin
514c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin    # Assumes class name == file name. Almost always the case.
524c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin    class_name="$(basename "$file_name")"
534c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin    class_name="${class_name%.java}" # remove ".java" from the end
544c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin    debug_print "Package: <$package_name>"
554c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin
564c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin    echo "$package_name.$class_name"
574c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin  done
584c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin}
594c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin
604c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkinfunction list_classes_in_dir {
614c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin  find "$1" -name "*.java" | class_name_from_class_file
624c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin}
634c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin
644c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkinfunction list_all_classes {
654c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin  local file
664c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin  for file in $test_property_files; do
674c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin    debug_print "File: $file"
684c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin
694c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin    if ! grep "TestNG.dirs" "$file" > /dev/null; then
704c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin      continue
714c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin    fi
724c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin
734c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin    debug_print "Has TestNG files"
744c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin
754c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin    list_classes_in_dir "$(dirname "$file")"
764c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin  done
774c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin}
784c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin
794c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkinfunction class_name_to_testng_entry {
804c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin  local class_name
814c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin  while read class_name; do
824c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin    echo "<class name=\"$class_name\" />"
834c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin  done
844c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin}
854c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkin
864c65c01a4fcfe8c68cd73914370bd269712b91d9Igor Murashkinlist_all_classes | class_name_to_testng_entry
87