Index: base/process_util_unittest.cc |
=================================================================== |
--- base/process_util_unittest.cc (revision 32206) |
+++ base/process_util_unittest.cc (working copy) |
@@ -4,6 +4,8 @@ |
#define _CRT_SECURE_NO_WARNINGS |
+#include <limits> |
+ |
#include "base/command_line.h" |
#include "base/eintr_wrapper.h" |
#include "base/file_path.h" |
@@ -15,6 +17,7 @@ |
#if defined(OS_LINUX) |
#include <dlfcn.h> |
+#include <malloc.h> |
#endif |
#if defined(OS_POSIX) |
#include <fcntl.h> |
@@ -361,4 +364,95 @@ |
#endif // defined(OS_POSIX) |
+#if defined(OS_LINUX) |
+// TODO(vandebo) make this work on Windows and Mac too. |
+ |
+class OutOfMemoryTest : public testing::Test { |
+ public: |
+ OutOfMemoryTest() |
+ : value_(NULL), |
+ // Make test size as large as possible minus a few pages so |
+ // that alignment or other rounding doesn't make it wrap. |
+ test_size_(std::numeric_limits<std::size_t>::max() - 8192) { |
+ } |
+ |
+ virtual void SetUp() { |
+ // Must call EnableTerminationOnOutOfMemory() because that is called from |
+ // chrome's main function and therefore hasn't been called yet. |
+ EnableTerminationOnOutOfMemory(); |
+ } |
+ |
+ void* value_; |
+ size_t test_size_; |
+}; |
+ |
+TEST_F(OutOfMemoryTest, New) { |
+ ASSERT_DEATH(value_ = new char[test_size_], ""); |
+} |
+ |
+TEST_F(OutOfMemoryTest, Malloc) { |
+ ASSERT_DEATH(value_ = malloc(test_size_), ""); |
+} |
+ |
+TEST_F(OutOfMemoryTest, Realloc) { |
+ ASSERT_DEATH(value_ = realloc(NULL, test_size_), ""); |
+} |
+ |
+TEST_F(OutOfMemoryTest, Calloc) { |
+ ASSERT_DEATH(value_ = calloc(1024, test_size_ / 1024L), ""); |
+} |
+ |
+TEST_F(OutOfMemoryTest, Valloc) { |
+ ASSERT_DEATH(value_ = valloc(test_size_), ""); |
+} |
+ |
+TEST_F(OutOfMemoryTest, Pvalloc) { |
+ ASSERT_DEATH(value_ = pvalloc(test_size_), ""); |
+} |
+ |
+TEST_F(OutOfMemoryTest, Memalign) { |
+ ASSERT_DEATH(value_ = memalign(4, test_size_), ""); |
+} |
+ |
+TEST_F(OutOfMemoryTest, Posix_memalign) { |
+ ASSERT_DEATH(posix_memalign(&value_, 8, test_size_), ""); |
+} |
+ |
+extern "C" { |
+ |
+void* __libc_malloc(size_t size); |
+void* __libc_realloc(void* ptr, size_t size); |
+void* __libc_calloc(size_t nmemb, size_t size); |
+void* __libc_valloc(size_t size); |
+void* __libc_pvalloc(size_t size); |
+void* __libc_memalign(size_t alignment, size_t size); |
+ |
+} // extern "C" |
+ |
+TEST_F(OutOfMemoryTest, __libc_malloc) { |
+ ASSERT_DEATH(value_ = __libc_malloc(test_size_), ""); |
+} |
+ |
+TEST_F(OutOfMemoryTest, __libc_realloc) { |
+ ASSERT_DEATH(value_ = __libc_realloc(NULL, test_size_), ""); |
+} |
+ |
+TEST_F(OutOfMemoryTest, __libc_calloc) { |
+ ASSERT_DEATH(value_ = __libc_calloc(1024, test_size_ / 1024L), ""); |
+} |
+ |
+TEST_F(OutOfMemoryTest, __libc_valloc) { |
+ ASSERT_DEATH(value_ = __libc_valloc(test_size_), ""); |
+} |
+ |
+TEST_F(OutOfMemoryTest, __libc_pvalloc) { |
+ ASSERT_DEATH(value_ = __libc_pvalloc(test_size_), ""); |
+} |
+ |
+TEST_F(OutOfMemoryTest, __libc_memalign) { |
+ ASSERT_DEATH(value_ = __libc_memalign(4, test_size_), ""); |
+} |
+ |
+#endif // defined(OS_LINUX) |
+ |
} // namespace base |