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