blob: 084448d0a797411a00d3dd93f2e06b2aa0081011 [file] [log] [blame]
#!/bin/bash
# Copyright (C) 2023 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.
# This command is expected to be executed with: atest hoststubgen-invoke-test
set -e # Exit when any command files
# This script runs HostStubGen directly with various arguments and make sure
# the tool behaves in the expected way.
echo "# Listing files in the test environment"
ls -lR
echo "# Dumping the environment variables"
env
# Set up the constants and variables
# Bazel sets $TEST_TMPDIR.
export TEMP=$TEST_TMPDIR
if [[ "$TEMP" == "" ]] ; then
TEMP=./tmp
mkdir -p $TEMP
fi
cleanup_temp() {
rm -fr $TEMP/*
}
cleanup_temp
INJAR=hoststubgen-test-tiny-framework.jar
OUTJAR=$TEMP/host.jar
ANNOTATION_FILTER=$TEMP/annotation-filter.txt
HOSTSTUBGEN_OUT=$TEMP/output.txt
EXTRA_ARGS=""
# Because of `set -e`, we can't return non-zero from functions, so we store
# HostStubGen result in it.
HOSTSTUBGEN_RC=0
# Note, because the build rule will only install hoststubgen.jar, but not the wrapper script,
# we need to execute it manually with the java command.
hoststubgen() {
echo "Running hoststubgen with: $*"
java -jar ./hoststubgen.jar "$@"
}
run_hoststubgen() {
local test_name="$1"
local annotation_filter="$2"
echo "# Test: $test_name"
cleanup_temp
local filter_arg=""
if [[ "$annotation_filter" != "" ]] ; then
echo "$annotation_filter" > $ANNOTATION_FILTER
filter_arg="--annotation-allowed-classes-file $ANNOTATION_FILTER"
echo "=== filter ==="
cat $ANNOTATION_FILTER
fi
local out_arg=""
if [[ "$OUTJAR" != "" ]] ; then
out_arg="--out-jar $OUTJAR"
fi
hoststubgen \
--debug \
--in-jar $INJAR \
$out_arg \
--keep-annotation \
android.hosttest.annotation.HostSideTestKeep \
--keep-class-annotation \
android.hosttest.annotation.HostSideTestWholeClassKeep \
--throw-annotation \
android.hosttest.annotation.HostSideTestThrow \
--remove-annotation \
android.hosttest.annotation.HostSideTestRemove \
--substitute-annotation \
android.hosttest.annotation.HostSideTestSubstitute \
--redirect-annotation \
android.hosttest.annotation.HostSideTestRedirect \
--redirection-class-annotation \
android.hosttest.annotation.HostSideTestRedirectionClass \
--class-load-hook-annotation \
android.hosttest.annotation.HostSideTestClassLoadHook \
--keep-static-initializer-annotation \
android.hosttest.annotation.HostSideTestStaticInitializerKeep \
$filter_arg \
$EXTRA_ARGS \
|& tee $HOSTSTUBGEN_OUT
HOSTSTUBGEN_RC=${PIPESTATUS[0]}
echo "HostStubGen exited with $HOSTSTUBGEN_RC"
return 0
}
assert_file_generated() {
local file="$1"
if [[ "$file" == "" ]] ; then
if [[ -f "$file" ]] ; then
echo "HostStubGen shouldn't have generated $file"
return 1
fi
else
if ! [[ -f "$file" ]] ; then
echo "HostStubGen didn't generate $file"
return 1
fi
fi
}
run_hoststubgen_for_success() {
run_hoststubgen "$@"
if (( $HOSTSTUBGEN_RC != 0 )) ; then
echo "HostStubGen expected to finish successfully, but failed with $rc"
return 1
fi
assert_file_generated "$STUB"
assert_file_generated "$IMPL"
}
run_hoststubgen_for_failure() {
local test_name="$1"
local expected_error_message="$2"
shift 2
run_hoststubgen "$test_name" "$@"
if (( $HOSTSTUBGEN_RC == 0 )) ; then
echo "HostStubGen expected to fail, but it didn't fail"
return 1
fi
# The output should contain the expected message. (note we se fgrep here.)
grep -Fq "$expected_error_message" $HOSTSTUBGEN_OUT
}
# Start the tests...
# Pass "" as a filter to _not_ add `--annotation-allowed-classes-file`.
run_hoststubgen_for_success "No annotation filter" ""
# Now, we use " ", so we do add `--annotation-allowed-classes-file`.
run_hoststubgen_for_failure "No classes are allowed to have annotations" \
"not allowed to have Ravenwood annotations" \
" "
run_hoststubgen_for_success "All classes allowed (wildcard)" \
"
* # Allow all classes
"
run_hoststubgen_for_failure "All classes disallowed (wildcard)" \
"not allowed to have Ravenwood annotations" \
"
!* # Disallow all classes
"
run_hoststubgen_for_failure "Some classes not allowed (1)" \
"not allowed to have Ravenwood annotations" \
"
android.hosttest.*
com.android.hoststubgen.*
com.supported.*
"
run_hoststubgen_for_failure "Some classes not allowed (2)" \
"not allowed to have Ravenwood annotations" \
"
android.hosttest.*
com.android.hoststubgen.*
com.unsupported.*
"
run_hoststubgen_for_success "All classes allowed (package wildcard)" \
"
android.hosttest.*
com.android.hoststubgen.*
com.supported.*
com.unsupported.*
"
run_hoststubgen_for_failure "One specific class disallowed" \
"TinyFrameworkAnnotations is not allowed to have Ravenwood annotations" \
"
!com.android.hoststubgen.test.tinyframework.TinyFrameworkAnnotations
* # All other classes allowed
"
run_hoststubgen_for_success "One specific class disallowed, but it doesn't use annotations" \
"
!com.android.hoststubgen.test.tinyframework.TinyFrameworkForTextPolicy
* # All other classes allowed
"
OUTJAR="" run_hoststubgen_for_success "No output generation" ""
EXTRA_ARGS="--in-jar abc" run_hoststubgen_for_failure "Duplicate arg" \
"Duplicate or conflicting argument found: --in-jar" \
""
echo "All tests passed"
exit 0