summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorvladlosev <vladlosev@861a406c-534a-0410-8894-cb66d6ee9925>2012-09-19 17:58:01 +0000
committervladlosev <vladlosev@861a406c-534a-0410-8894-cb66d6ee9925>2012-09-19 17:58:01 +0000
commit5d9f11fe81eaca3989ec7e8dbfe5b31608a75121 (patch)
tree1a0e97a3ff6a98ca233732392ae3ccf322df2bdb
parentdf246651195747a948cad465dc717133e22973d6 (diff)
downloadgtest-5d9f11fe81eaca3989ec7e8dbfe5b31608a75121.tar.gz
gtest-5d9f11fe81eaca3989ec7e8dbfe5b31608a75121.tar.bz2
gtest-5d9f11fe81eaca3989ec7e8dbfe5b31608a75121.tar.xz
Improves Android support (by David Turner).
git-svn-id: http://googletest.googlecode.com/svn/trunk@625 861a406c-534a-0410-8894-cb66d6ee9925
-rw-r--r--include/gtest/internal/gtest-port.h45
-rw-r--r--src/gtest-port.cc22
-rw-r--r--test/gtest-filepath_test.cc2
-rw-r--r--test/gtest_unittest.cc2
4 files changed, 60 insertions, 11 deletions
diff --git a/include/gtest/internal/gtest-port.h b/include/gtest/internal/gtest-port.h
index e5a4551..89bb97c 100644
--- a/include/gtest/internal/gtest-port.h
+++ b/include/gtest/internal/gtest-port.h
@@ -242,9 +242,9 @@
# endif
#elif defined __linux__
# define GTEST_OS_LINUX 1
-# ifdef ANDROID
+# if defined __ANDROID__
# define GTEST_OS_LINUX_ANDROID 1
-# endif // ANDROID
+# endif
#elif defined __MVS__
# define GTEST_OS_ZOS 1
#elif defined(__sun) && defined(__SVR4)
@@ -288,9 +288,19 @@
# include <io.h>
#endif
+#if GTEST_OS_LINUX_ANDROID
+// Used to define __ANDROID_API__ matching the target NDK API level.
+# include <android/api-level.h> // NOLINT
+#endif
+
// Defines this to true iff Google Test can use POSIX regular expressions.
#ifndef GTEST_HAS_POSIX_RE
-# define GTEST_HAS_POSIX_RE (!GTEST_OS_WINDOWS)
+# if GTEST_OS_LINUX_ANDROID
+// On Android, <regex.h> is only available starting with Gingerbread.
+# define GTEST_HAS_POSIX_RE (__ANDROID_API__ >= 9)
+# else
+# define GTEST_HAS_POSIX_RE (!GTEST_OS_WINDOWS)
+# endif
#endif
#if GTEST_HAS_POSIX_RE
@@ -405,7 +415,16 @@
# elif defined(__GNUC__) && (GTEST_GCC_VER_ >= 40302)
# ifdef __GXX_RTTI
-# define GTEST_HAS_RTTI 1
+// When building against STLport with the Android NDK and with
+// -frtti -fno-exceptions, the build fails at link time with undefined
+// references to __cxa_bad_typeid. Note sure if STL or toolchain bug,
+// so disable RTTI when detected.
+# if GTEST_OS_LINUX_ANDROID && defined(_STLPORT_MAJOR) && \
+ !defined(__EXCEPTIONS)
+# define GTEST_HAS_RTTI 0
+# else
+# define GTEST_HAS_RTTI 1
+# endif // GTEST_OS_LINUX_ANDROID && __STLPORT_MAJOR && !__EXCEPTIONS
# else
# define GTEST_HAS_RTTI 0
# endif // __GXX_RTTI
@@ -466,8 +485,13 @@
// this macro to 0 to prevent Google Test from using tuple (any
// feature depending on tuple with be disabled in this mode).
#ifndef GTEST_HAS_TR1_TUPLE
+# if GTEST_OS_LINUX_ANDROID && defined(_STLPORT_MAJOR)
+// STLport, provided with the Android NDK, has neither <tr1/tuple> or <tuple>.
+# define GTEST_HAS_TR1_TUPLE 0
+# else
// The user didn't tell us not to do it, so we assume it's OK.
-# define GTEST_HAS_TR1_TUPLE 1
+# define GTEST_HAS_TR1_TUPLE 1
+# endif
#endif // GTEST_HAS_TR1_TUPLE
// Determines whether Google Test's own tr1 tuple implementation
@@ -578,7 +602,16 @@ using ::std::tuple_size;
// The user didn't tell us, so we need to figure it out.
# if GTEST_OS_LINUX && !defined(__ia64__)
-# define GTEST_HAS_CLONE 1
+# if GTEST_OS_LINUX_ANDROID
+// On Android, clone() is only available on ARM starting with Gingerbread.
+# if defined(__arm__) && __ANDROID_API__ >= 9
+# define GTEST_HAS_CLONE 1
+# else
+# define GTEST_HAS_CLONE 0
+# endif
+# else
+# define GTEST_HAS_CLONE 1
+# endif
# else
# define GTEST_HAS_CLONE 0
# endif // GTEST_OS_LINUX && !defined(__ia64__)
diff --git a/src/gtest-port.cc b/src/gtest-port.cc
index a0e2d7c..9cfe4e9 100644
--- a/src/gtest-port.cc
+++ b/src/gtest-port.cc
@@ -531,11 +531,25 @@ class CapturedStream {
filename_ = temp_file_path;
# else
// There's no guarantee that a test has write access to the current
- // directory, so we create the temporary file in the /tmp directory instead.
- // We use /tmp on most systems, and /mnt/sdcard on Android. That's because
- // Android doesn't have /tmp.
+ // directory, so we create the temporary file in the /tmp directory
+ // instead. We use /tmp on most systems, and /sdcard on Android.
+ // That's because Android doesn't have /tmp.
# if GTEST_OS_LINUX_ANDROID
- char name_template[] = "/mnt/sdcard/gtest_captured_stream.XXXXXX";
+ // Note: Android applications are expected to call the framework's
+ // Context.getExternalStorageDirectory() method through JNI to get
+ // the location of the world-writable SD Card directory. However,
+ // this requires a Context handle, which cannot be retrieved
+ // globally from native code. Doing so also precludes running the
+ // code as part of a regular standalone executable, which doesn't
+ // run in a Dalvik process (e.g. when running it through 'adb shell').
+ //
+ // The location /sdcard is directly accessible from native code
+ // and is the only location (unofficially) supported by the Android
+ // team. It's generally a symlink to the real SD Card mount point
+ // which can be /mnt/sdcard, /mnt/sdcard0, /system/media/sdcard, or
+ // other OEM-customized locations. Never rely on these, and always
+ // use /sdcard.
+ char name_template[] = "/sdcard/gtest_captured_stream.XXXXXX";
# else
char name_template[] = "/tmp/captured_stream.XXXXXX";
# endif // GTEST_OS_LINUX_ANDROID
diff --git a/test/gtest-filepath_test.cc b/test/gtest-filepath_test.cc
index 66d4118..3196ea0 100644
--- a/test/gtest-filepath_test.cc
+++ b/test/gtest-filepath_test.cc
@@ -543,6 +543,8 @@ class DirectoryCreationTest : public Test {
return String(temp_dir);
else
return String::Format("%s\\", temp_dir);
+#elif GTEST_OS_LINUX_ANDROID
+ return String("/sdcard/");
#else
return String("/tmp/");
#endif // GTEST_OS_WINDOWS_MOBILE
diff --git a/test/gtest_unittest.cc b/test/gtest_unittest.cc
index 31a4565..79e11b6 100644
--- a/test/gtest_unittest.cc
+++ b/test/gtest_unittest.cc
@@ -1275,7 +1275,7 @@ TEST(StringTest, FormatWorks) {
EXPECT_STREQ("<formatting error or buffer exceeded>",
String::Format("x%s", buffer).c_str());
-#if GTEST_OS_LINUX
+#if GTEST_OS_LINUX && !GTEST_OS_LINUX_ANDROID
// On Linux, invalid format spec should lead to an error message.
// In other environment (e.g. MSVC on Windows), String::Format() may
// simply ignore a bad format spec, so this assertion is run on