#!/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_DIR:-golden-output} mkdir -p $GOLDEN_DIR DIFF_CMD=${DIFF_CMD:-./tiny-framework-dump-test.py run-diff} 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 ${BUILD_CMD:-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