#!/bin/bash
#
# Copyright (C) 2015 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.

# Set up prog to be the path of this script, including following symlinks,
# and set up progdir to be the fully-qualified pathname of its directory.
prog="$0"
while [ -h "${prog}" ]; do
    newProg=`/bin/ls -ld "${prog}"`
    newProg=`expr "${newProg}" : ".* -> \(.*\)$"`
    if expr "x${newProg}" : 'x/' >/dev/null; then
        prog="${newProg}"
    else
        progdir=`dirname "${prog}"`
        prog="${progdir}/${newProg}"
    fi
done
oldwd=`pwd`
progdir=`dirname "${prog}"`
cd "${progdir}"
progdir=`pwd`
prog="${progdir}"/`basename "${prog}"`

# Set up a temp directory for output.
tmpdir=/tmp/test-$$
mkdir ${tmpdir}

# Set up dexdump binary and flags to test.
DEXD="${ANDROID_HOST_OUT}/bin/dexdump2"
DEXDFLAGS1="-dfh"
DEXDFLAGS2="-e -l xml"

# Set up dexlist binary and flags to test.
DEXL="${ANDROID_HOST_OUT}/bin/dexlist"
DEXLFLAGS=""

# Run the tests.
passed=0
failed=0
for i in *.dex; do
    echo $i
    basenm=`basename "${i}" .dex`
    txtfile=${basenm}.txt
    xmlfile=${basenm}.xml
    lstfile=${basenm}.lst
    gentxtfile=${tmpdir}/${txtfile}
    genxmlfile=${tmpdir}/${xmlfile}
    genlstfile=${tmpdir}/${lstfile}
    ${DEXD} ${DEXDFLAGS1} ${i} > ${gentxtfile}
    cmp ${txtfile} ${gentxtfile}
    if [ "$?" = "0" ]; then
        ((passed += 1))
    else
        ((failed += 1))
        echo failed: ${i}
    fi
    ${DEXD} ${DEXDFLAGS2} ${i} > ${genxmlfile}
    cmp ${xmlfile} ${genxmlfile}
    if [ "$?" = "0" ]; then
        ((passed += 1))
    else
        ((failed += 1))
        echo failed: ${i}
    fi
    ${DEXL} ${DEXLFLAGS} ${i} > ${genlstfile}
    cmp ${lstfile} ${genlstfile}
    if [ "$?" = "0" ]; then
        ((passed += 1))
    else
        ((failed += 1))
        echo failed: ${i}
    fi
done

# Report results.
echo
echo "passed: ${passed} test(s)"
echo "failed: ${failed} test(s)"
echo

# Clean up, cd back to original dir.
rm -rf ${tmpdir}
cd ${oldwd}

# Return status.
if [ "${failed}" != "0" ]; then
  echo failed
  exit 1
fi
exit 0

