blob: b389a67a8e4cebf945230bb244bc4a7b607c6970 [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.
help() {
cat <<'EOF'
diff-and-update-golden.sh [OPTIONS]
Compare the generated jar files from tiny-framework to the "golden" files.
OPTIONS:
-u: Update the golden files.
-3: Run `meld` to compare original, stub and impl jar files in 3-way diff.
This is useful to visualize the exact differences between 3 jar files.
-2: Run `meld` to compare original <-> impl, and impl <-> stub as two different diffs.
EOF
}
source "${0%/*}"/../common.sh
SCRIPT_NAME="${0##*/}"
GOLDEN_DIR=golden-output
mkdir -p $GOLDEN_DIR
DIFF_CMD=${DIFF:-diff -u --ignore-blank-lines --ignore-space-change}
update=0
three_way=0
two_way=0
while getopts "u32" opt; do
case "$opt" in
u)
update=1
;;
3)
three_way=1
;;
2)
two_way=1
;;
'?')
help
exit 1
;;
esac
done
shift $(($OPTIND - 1))
# Build the dump files, which are the input of this test.
run m dump-jar tiny-framework-dump-test
# Get the path to the generate text files. (not the golden files.)
# We get them from $OUT/module-info.json
files=(
$(python3 -c '
import sys
import os
import json
with open(sys.argv[1], "r") as f:
data = json.load(f)
# Equivalent to: jq -r '.["tiny-framework-dump-test"]["installed"][]'
for path in data["tiny-framework-dump-test"]["installed"]:
if "golden-output" in path:
continue
if path.endswith(".txt"):
print(os.getenv("ANDROID_BUILD_TOP") + "/" + path)
' $OUT/module-info.json)
)
# Next, compare each file and update them in $GOLDEN_DIR
any_file_changed=0
for file in ${files[*]} ; do
name=$(basename $file)
echo "# Checking $name ..."
file_changed=0
if run $DIFF_CMD $GOLDEN_DIR/$name $file; then
: # No diff
else
file_changed=1
any_file_changed=1
fi
if (( $update && $file_changed )) ; then
echo "# Updating $name ..."
run cp $file $GOLDEN_DIR/$name
fi
done
if (( $three_way )) ; then
echo "# Running 3-way diff with meld..."
run meld ${files[0]} ${files[1]} ${files[2]} &
fi
if (( $two_way )) ; then
echo "# Running meld..."
run meld --diff ${files[0]} ${files[1]} --diff ${files[1]} ${files[2]} --diff ${files[0]} ${files[2]}
fi
if (( $any_file_changed == 0 )) ; then
echo "$SCRIPT_NAME: Success: no changes detected."
exit 0
else
if (( $update )) ; then
echo "$SCRIPT_NAME: Warning: golden files have been updated."
exit 2
else
echo "$SCRIPT_NAME: Failure: changes detected. See above diff for the details."
exit 3
fi
fi