diff options
author | digit@chromium.org <digit@chromium.org@4c0a9323-5329-0410-9bdc-e9ce6186880e> | 2013-12-13 16:49:11 +0000 |
---|---|---|
committer | digit@chromium.org <digit@chromium.org@4c0a9323-5329-0410-9bdc-e9ce6186880e> | 2013-12-13 16:49:11 +0000 |
commit | ba1f54c0934bd0420fbe79d1f774404967d63abf (patch) | |
tree | efe89bfea29527b6e12757e6947843c533bd7bc8 | |
parent | Expose the ability to supply additional user streams in the windows dump gene... (diff) | |
download | breakpad-ba1f54c0934bd0420fbe79d1f774404967d63abf.tar.xz |
Misc Android-related fixes.
- src/common/android/testing/mkdtemp.h:
Fixes a compilation error when using the (recent) NDK r9b,
see comments in the source file for details.
- android/test-driver, Makefile.am, Makefile.in:
Autotools 1.12 changed the way tests are run during "make check"
so add a new "custom test driver" to run tests on Android, and
modify Makefile.am / Makefile.in accordingly. Otherwise,
'make check' tried to run the tests on the host.
- android/test-shell.sh:
Allow several tests to run in parallel on the device, by
creating a custom test directory for each test process.
This allows running "make check -j8" reliably.
- src/common/linux/file_id_unittest.cc:
Disable the SelfStrip test on Android, since it assumes a 'strip'
executable is available on the target system where the test runs.
BUG=NONE
R=mark@chromium.org, ted.mielczarek@gmail.com
TEST=android/run-checks.sh --ndk-dir=/path/to/android-ndk-r9b
Review URL: https://breakpad.appspot.com/904003
git-svn-id: http://google-breakpad.googlecode.com/svn/trunk@1259 4c0a9323-5329-0410-9bdc-e9ce6186880e
-rw-r--r-- | Makefile.am | 10 | ||||
-rw-r--r-- | Makefile.in | 13 | ||||
-rwxr-xr-x | android/test-driver | 131 | ||||
-rwxr-xr-x | android/test-shell.sh | 5 | ||||
-rw-r--r-- | src/common/android/testing/mkdtemp.h | 15 | ||||
-rw-r--r-- | src/common/linux/file_id_unittest.cc | 4 |
6 files changed, 164 insertions, 14 deletions
diff --git a/Makefile.am b/Makefile.am index eb9b518d..002c5566 100644 --- a/Makefile.am +++ b/Makefile.am @@ -334,10 +334,14 @@ endif TESTS = $(check_PROGRAMS) $(check_SCRIPTS) if ANDROID_HOST -# Wrapper script to run unit test programs on a connected Android device. -TESTS_ENVIRONMENT = $(top_srcdir)/android/test-shell.sh +# Since Autotools 1.2, tests are run through a special "test driver" script. +# Unfortunately, it's not possible anymore to specify an alternative shell to +# run them on connected devices, so use a slightly modified version of the +# driver for Android. +LOG_DRIVER = $(top_srcdir)/android/test-driver else -TESTS_ENVIRONMENT = +# The default Autotools test driver script. +LOG_DRIVER = $(top_srcdir)/autotools/test-driver endif if LINUX_HOST diff --git a/Makefile.in b/Makefile.in index af07670a..4a0a012b 100644 --- a/Makefile.in +++ b/Makefile.in @@ -1598,7 +1598,6 @@ am__set_TESTS_bases = \ RECHECK_LOGS = $(TEST_LOGS) TEST_SUITE_LOG = test-suite.log TEST_EXTENSIONS = @EXEEXT@ .test -LOG_DRIVER = $(SHELL) $(top_srcdir)/autotools/test-driver LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS) am__set_b = \ case '$@' in \ @@ -1917,10 +1916,14 @@ lib_LIBRARIES = $(am__append_5) $(am__append_7) @DISABLE_PROCESSOR_FALSE@ src/processor/minidump_stackwalk_machine_readable_test TESTS = $(check_PROGRAMS) $(check_SCRIPTS) -@ANDROID_HOST_FALSE@TESTS_ENVIRONMENT = - -# Wrapper script to run unit test programs on a connected Android device. -@ANDROID_HOST_TRUE@TESTS_ENVIRONMENT = $(top_srcdir)/android/test-shell.sh +# The default Autotools test driver script. +@ANDROID_HOST_FALSE@LOG_DRIVER = $(top_srcdir)/autotools/test-driver + +# Since Autotools 1.2, tests are run through a special "test driver" script. +# Unfortunately, it's not possible anymore to specify an alternative shell to +# run them on connected devices, so use a slightly modified version of the +# driver for Android. +@ANDROID_HOST_TRUE@LOG_DRIVER = $(top_srcdir)/android/test-driver @LINUX_HOST_TRUE@src_client_linux_linux_dumper_unittest_helper_SOURCES = \ @LINUX_HOST_TRUE@ src/client/linux/minidump_writer/linux_dumper_unittest_helper.cc diff --git a/android/test-driver b/android/test-driver new file mode 100755 index 00000000..eaaac6b2 --- /dev/null +++ b/android/test-driver @@ -0,0 +1,131 @@ +#! /bin/sh +# test-driver - basic testsuite driver script. + +# Slightly modified for Android, see ANDROID comment below. + +scriptversion=2012-06-27.10; # UTC + +# Copyright (C) 2011-2013 Free Software Foundation, Inc. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. + +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# This file is maintained in Automake, please report +# bugs to <bug-automake@gnu.org> or send patches to +# <automake-patches@gnu.org>. + +# Make unconditional expansion of undefined variables an error. This +# helps a lot in preventing typo-related bugs. +set -u + +usage_error () +{ + echo "$0: $*" >&2 + print_usage >&2 + exit 2 +} + +print_usage () +{ + cat <<END +Usage: + test-driver --test-name=NAME --log-file=PATH --trs-file=PATH + [--expect-failure={yes|no}] [--color-tests={yes|no}] + [--enable-hard-errors={yes|no}] [--] TEST-SCRIPT +The '--test-name', '--log-file' and '--trs-file' options are mandatory. +END +} + +# TODO: better error handling in option parsing (in particular, ensure +# TODO: $log_file, $trs_file and $test_name are defined). +test_name= # Used for reporting. +log_file= # Where to save the output of the test script. +trs_file= # Where to save the metadata of the test run. +expect_failure=no +color_tests=no +enable_hard_errors=yes +while test $# -gt 0; do + case $1 in + --help) print_usage; exit $?;; + --version) echo "test-driver $scriptversion"; exit $?;; + --test-name) test_name=$2; shift;; + --log-file) log_file=$2; shift;; + --trs-file) trs_file=$2; shift;; + --color-tests) color_tests=$2; shift;; + --expect-failure) expect_failure=$2; shift;; + --enable-hard-errors) enable_hard_errors=$2; shift;; + --) shift; break;; + -*) usage_error "invalid option: '$1'";; + esac + shift +done + +if test $color_tests = yes; then + # Keep this in sync with 'lib/am/check.am:$(am__tty_colors)'. + red='[0;31m' # Red. + grn='[0;32m' # Green. + lgn='[1;32m' # Light green. + blu='[1;34m' # Blue. + mgn='[0;35m' # Magenta. + std='[m' # No color. +else + red= grn= lgn= blu= mgn= std= +fi + +do_exit='rm -f $log_file $trs_file; (exit $st); exit $st' +trap "st=129; $do_exit" 1 +trap "st=130; $do_exit" 2 +trap "st=141; $do_exit" 13 +trap "st=143; $do_exit" 15 + +# Test script is run here. +# ANDROID: old line was: "$@" > $log_file 2>&1 +progdir=$(dirname "$0") +"$progdir/test-shell.sh" "$@" > $log_file 2>&1 +estatus=$? +if test $enable_hard_errors = no && test $estatus -eq 99; then + estatus=1 +fi + +case $estatus:$expect_failure in + 0:yes) col=$red res=XPASS recheck=yes gcopy=yes;; + 0:*) col=$grn res=PASS recheck=no gcopy=no;; + 77:*) col=$blu res=SKIP recheck=no gcopy=yes;; + 99:*) col=$mgn res=ERROR recheck=yes gcopy=yes;; + *:yes) col=$lgn res=XFAIL recheck=no gcopy=yes;; + *:*) col=$red res=FAIL recheck=yes gcopy=yes;; +esac + +# Report outcome to console. +echo "${col}${res}${std}: $test_name" + +# Register the test result, and other relevant metadata. +echo ":test-result: $res" > $trs_file +echo ":global-test-result: $res" >> $trs_file +echo ":recheck: $recheck" >> $trs_file +echo ":copy-in-global-log: $gcopy" >> $trs_file + +# Local Variables: +# mode: shell-script +# sh-indentation: 2 +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-time-zone: "UTC" +# time-stamp-end: "; # UTC" +# End: diff --git a/android/test-shell.sh b/android/test-shell.sh index 526e926a..3677d875 100755 --- a/android/test-shell.sh +++ b/android/test-shell.sh @@ -52,8 +52,9 @@ if [ ! -f "$TEST_PROGRAM" ]; then 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=/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 () { diff --git a/src/common/android/testing/mkdtemp.h b/src/common/android/testing/mkdtemp.h index 85644c9f..b86e2cd7 100644 --- a/src/common/android/testing/mkdtemp.h +++ b/src/common/android/testing/mkdtemp.h @@ -27,9 +27,11 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -// Android doesn't provide mkdtemp(). Keep this implementation in an -// C++ anonymous namespace to avoid conflicts on Chromium (which -// already provides an extern "C" mkdtemp function). +// mkdtemp() wasn't declared in <stdlib.h> until NDK r9b due to a simple +// packaging bug (the function has always been implemented in all versions +// of the C library). This header is provided to build Breakpad with earlier +// NDK revisions (e.g. the one used by Chromium). It may be removed in the +// future once all major projects upgrade to use a more recent NDK. // // The reason this is inlined here is to avoid linking a new object file // into each unit test program (i.e. keep build files simple). @@ -44,9 +46,14 @@ #include <string.h> #include <sys/stat.h> +// Using a macro renaming trick here is necessary when building against +// NDK r9b. Otherwise the compiler will complain that calls to mkdtemp() +// are ambiguous. +#define mkdtemp breakpad_mkdtemp + namespace { -char* mkdtemp(char* path) { +char* breakpad_mkdtemp(char* path) { if (path == NULL) { errno = EINVAL; return NULL; diff --git a/src/common/linux/file_id_unittest.cc b/src/common/linux/file_id_unittest.cc index 4bf4f8df..760eae82 100644 --- a/src/common/linux/file_id_unittest.cc +++ b/src/common/linux/file_id_unittest.cc @@ -66,6 +66,9 @@ void PopulateSection(Section* section, int size, int prime_number) { } // namespace +#ifndef __ANDROID__ +// This test is disabled on Android: It will always fail, since there is no +// 'strip' binary installed on test devices. TEST(FileIDStripTest, StripSelf) { // Calculate the File ID of this binary using // FileID::ElfFileIdentifier, then make a copy of this binary, @@ -98,6 +101,7 @@ TEST(FileIDStripTest, StripSelf) { 37); EXPECT_STREQ(identifier_string1, identifier_string2); } +#endif // !__ANDROID__ template<typename ElfClass> class FileIDTest : public testing::Test { |