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 = +# The default Autotools test driver script. +@ANDROID_HOST_FALSE@LOG_DRIVER = $(top_srcdir)/autotools/test-driver -# Wrapper script to run unit test programs on a connected Android device. -@ANDROID_HOST_TRUE@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. +@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 . + +# 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 or send patches to +# . + +# 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 < $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 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 #include +// 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 class FileIDTest : public testing::Test {