#!/bin/sh
#
# Copyright (c) 2012 Google Inc.
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are
# met:
#
#     * Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
#     * Redistributions in binary form must reproduce the above
# copyright notice, this list of conditions and the following disclaimer
# in the documentation and/or other materials provided with the
# distribution.
#     * Neither the name of Google Inc. nor the names of its
# contributors may be used to endorse or promote products derived from
# this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

# A special shell wrapper that can be used to run the Google Breakpad unit
# tests on a connected Android device.
#
# This is designed to be called from the Makefile during 'make check'
#

PROGDIR=$(dirname "$0")
PROGNAME=$(basename "$0")
. $PROGDIR/common-functions.sh

# Extract test program name first.
TEST_PROGRAM=$1
shift

if [ -z "$TEST_PROGRAM" ]; then
  panic "No test program/script name on the command-line!"
fi

if [ ! -f "$TEST_PROGRAM" ]; then
  panic "Can't find test program/script: $TEST_PROGRAM"
fi

# Create test directory on the device
TEST_DIR=/data/local/tmp/test-google-breakpad-$$
adb_shell mkdir "$TEST_DIR" ||
    panic "Can't create test directory on device: $TEST_DIR"

# Ensure that it is always removed when the script exits.
clean_test_dir () {
  # Don't care about success/failure, use '$ADB shell' directly.
  adb_shell rm -r "$TEST_DIR"
}

atexit clean_test_dir

TEST_PROGRAM_NAME=$(basename "$TEST_PROGRAM")
TEST_PROGRAM_DIR=$(dirname "$TEST_PROGRAM")

# Handle special case(s) here.
DATA_FILES=
case $TEST_PROGRAM_NAME in
  linux_client_unittest)
    # linux_client_unittest will call another executable at runtime, ensure
    # it is installed too.
    adb_install "$TEST_PROGRAM_DIR/linux_dumper_unittest_helper" "$TEST_DIR"
    # linux_client_unittest loads a shared library at runtime, ensure it is
    # installed too.
    adb_install "$TEST_PROGRAM_DIR/linux_client_unittest_shlib" "$TEST_DIR"
    ;;
  basic_source_line_resolver_unittest)
    DATA_FILES="module1.out \
                module2.out \
                module3_bad.out \
                module4_bad.out"
    ;;
  exploitability_unittest)
    DATA_FILES="scii_read_av.dmp \
                ascii_read_av_block_write.dmp \
                ascii_read_av_clobber_write.dmp \
                ascii_read_av_conditional.dmp \
                ascii_read_av_non_null.dmp \
                ascii_read_av_then_jmp.dmp \
                ascii_read_av_xchg_write.dmp \
                ascii_write_av.dmp \
                ascii_write_av_arg_to_call.dmp \
                exec_av_on_stack.dmp \
                null_read_av.dmp \
                null_write_av.dmp \
                read_av.dmp \
                null_read_av.dmp \
                write_av_non_null.dmp"
    ;;
  fast_source_line_resolver_unittest)
    DATA_FILES="module0.out \
                module1.out \
                module2.out \
                module3_bad.out \
                module4_bad.out"
    ;;
  minidump_processor_unittest|minidump_unittest)
    DATA_FILES="src/processor/testdata/minidump2.dmp"
    ;;
esac

# Install the data files, their path is relative to the environment
# variable 'srcdir'
for FILE in $DATA_FILES; do
  FILEDIR=src/processor/testdata/$(dirname "$FILE")
  adb_shell mkdir -p "$TEST_DIR/$FILEDIR"
  adb_install "${srcdir:-.}/$FILE" "$TEST_DIR"/"$FILE"
done

# Copy test program to device
adb_install "$TEST_PROGRAM" "$TEST_DIR"

# Run it
adb_shell "cd $TEST_DIR && LD_LIBRARY_PATH=. ./$TEST_PROGRAM_NAME $@"

# Note: exiting here will call cleanup_exit which will remove the temporary
#       files from the device.
