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 {