summaryrefslogtreecommitdiffstats
path: root/toolkit/crashreporter/google-breakpad/src/client/linux/microdump_writer/microdump_writer_unittest.cc
diff options
context:
space:
mode:
Diffstat (limited to 'toolkit/crashreporter/google-breakpad/src/client/linux/microdump_writer/microdump_writer_unittest.cc')
-rw-r--r--toolkit/crashreporter/google-breakpad/src/client/linux/microdump_writer/microdump_writer_unittest.cc257
1 files changed, 0 insertions, 257 deletions
diff --git a/toolkit/crashreporter/google-breakpad/src/client/linux/microdump_writer/microdump_writer_unittest.cc b/toolkit/crashreporter/google-breakpad/src/client/linux/microdump_writer/microdump_writer_unittest.cc
deleted file mode 100644
index 58a731188..000000000
--- a/toolkit/crashreporter/google-breakpad/src/client/linux/microdump_writer/microdump_writer_unittest.cc
+++ /dev/null
@@ -1,257 +0,0 @@
-// Copyright (c) 2014 Google Inc.
-// All rights reserved.
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-#include <ctype.h>
-#include <sys/syscall.h>
-#include <sys/types.h>
-#include <unistd.h>
-
-#include <sstream>
-#include <string>
-
-#include "breakpad_googletest_includes.h"
-#include "client/linux/handler/exception_handler.h"
-#include "client/linux/handler/microdump_extra_info.h"
-#include "client/linux/microdump_writer/microdump_writer.h"
-#include "common/linux/eintr_wrapper.h"
-#include "common/linux/ignore_ret.h"
-#include "common/scoped_ptr.h"
-#include "common/tests/auto_tempdir.h"
-#include "common/using_std_string.h"
-
-using namespace google_breakpad;
-
-namespace {
-
-typedef testing::Test MicrodumpWriterTest;
-
-MicrodumpExtraInfo MakeMicrodumpExtraInfo(
- const char* build_fingerprint,
- const char* product_info,
- const char* gpu_fingerprint) {
- MicrodumpExtraInfo info;
- info.build_fingerprint = build_fingerprint;
- info.product_info = product_info;
- info.gpu_fingerprint = gpu_fingerprint;
- return info;
-}
-
-void CrashAndGetMicrodump(
- const MappingList& mappings,
- const MicrodumpExtraInfo& microdump_extra_info,
- scoped_array<char>* buf) {
- int fds[2];
- ASSERT_NE(-1, pipe(fds));
-
- AutoTempDir temp_dir;
- string stderr_file = temp_dir.path() + "/stderr.log";
- int err_fd = open(stderr_file.c_str(), O_CREAT | O_RDWR, S_IRUSR | S_IWUSR);
- ASSERT_NE(-1, err_fd);
-
- const pid_t child = fork();
- if (child == 0) {
- close(fds[1]);
- char b;
- IGNORE_RET(HANDLE_EINTR(read(fds[0], &b, sizeof(b))));
- close(fds[0]);
- syscall(__NR_exit);
- }
- close(fds[0]);
-
- ExceptionHandler::CrashContext context;
- memset(&context, 0, sizeof(context));
-
- // Set a non-zero tid to avoid tripping asserts.
- context.tid = child;
-
- // Redirect temporarily stderr to the stderr.log file.
- int save_err = dup(STDERR_FILENO);
- ASSERT_NE(-1, save_err);
- ASSERT_NE(-1, dup2(err_fd, STDERR_FILENO));
-
- ASSERT_TRUE(WriteMicrodump(child, &context, sizeof(context), mappings,
- microdump_extra_info));
-
- // Revert stderr back to the console.
- dup2(save_err, STDERR_FILENO);
- close(save_err);
-
- // Read back the stderr file and check for the microdump marker.
- fsync(err_fd);
- lseek(err_fd, 0, SEEK_SET);
- const size_t kBufSize = 64 * 1024;
- buf->reset(new char[kBufSize]);
- ASSERT_GT(read(err_fd, buf->get(), kBufSize), 0);
-
- close(err_fd);
- close(fds[1]);
-
- ASSERT_NE(static_cast<char*>(0), strstr(
- buf->get(), "-----BEGIN BREAKPAD MICRODUMP-----"));
- ASSERT_NE(static_cast<char*>(0), strstr(
- buf->get(), "-----END BREAKPAD MICRODUMP-----"));
-}
-
-void CheckMicrodumpContents(const string& microdump_content,
- const MicrodumpExtraInfo& expected_info) {
- std::istringstream iss(microdump_content);
- bool did_find_os_info = false;
- bool did_find_product_info = false;
- bool did_find_gpu_info = false;
- for (string line; std::getline(iss, line);) {
- if (line.find("O ") == 0) {
- std::istringstream os_info_tokens(line);
- string token;
- os_info_tokens.ignore(2); // Ignore the "O " preamble.
- // Check the OS descriptor char (L=Linux, A=Android).
- os_info_tokens >> token;
- ASSERT_TRUE(token == "L" || token == "A");
-
- os_info_tokens >> token; // HW architecture.
- os_info_tokens >> token; // Number of cpus.
- for (size_t i = 0; i < token.size(); ++i)
- ASSERT_TRUE(isxdigit(token[i]));
- os_info_tokens >> token; // SW architecture.
-
- // Check that the build fingerprint is in the right place.
- os_info_tokens >> token;
- if (expected_info.build_fingerprint)
- ASSERT_EQ(expected_info.build_fingerprint, token);
- did_find_os_info = true;
- } else if (line.find("V ") == 0) {
- if (expected_info.product_info)
- ASSERT_EQ(string("V ") + expected_info.product_info, line);
- did_find_product_info = true;
- } else if (line.find("G ") == 0) {
- if (expected_info.gpu_fingerprint)
- ASSERT_EQ(string("G ") + expected_info.gpu_fingerprint, line);
- did_find_gpu_info = true;
- }
- }
- ASSERT_TRUE(did_find_os_info);
- ASSERT_TRUE(did_find_product_info);
- ASSERT_TRUE(did_find_gpu_info);
-}
-
-void CheckMicrodumpContents(const string& microdump_content,
- const string& expected_fingerprint,
- const string& expected_product_info,
- const string& expected_gpu_fingerprint) {
- CheckMicrodumpContents(
- microdump_content,
- MakeMicrodumpExtraInfo(expected_fingerprint.c_str(),
- expected_product_info.c_str(),
- expected_gpu_fingerprint.c_str()));
-}
-
-TEST(MicrodumpWriterTest, BasicWithMappings) {
- // Push some extra mapping to check the MappingList logic.
- const uint32_t memory_size = sysconf(_SC_PAGESIZE);
- const char* kMemoryName = "libfoo.so";
- const uint8_t kModuleGUID[sizeof(MDGUID)] = {
- 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77,
- 0x88, 0x99, 0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0xFF
- };
-
- MappingInfo info;
- info.start_addr = memory_size;
- info.size = memory_size;
- info.offset = 42;
- strcpy(info.name, kMemoryName);
-
- MappingList mappings;
- MappingEntry mapping;
- mapping.first = info;
- memcpy(mapping.second, kModuleGUID, sizeof(MDGUID));
- mappings.push_back(mapping);
-
- scoped_array<char> buf;
- CrashAndGetMicrodump(mappings, MicrodumpExtraInfo(), &buf);
-
-#ifdef __LP64__
- ASSERT_NE(static_cast<char*>(0), strstr(
- buf.get(), "M 0000000000001000 000000000000002A 0000000000001000 "
- "33221100554477668899AABBCCDDEEFF0 libfoo.so"));
-#else
- ASSERT_NE(static_cast<char*>(0), strstr(
- buf.get(), "M 00001000 0000002A 00001000 "
- "33221100554477668899AABBCCDDEEFF0 libfoo.so"));
-#endif
-
- // In absence of a product info in the minidump, the writer should just write
- // an unknown marker.
- ASSERT_NE(static_cast<char*>(0), strstr(
- buf.get(), "V UNKNOWN:0.0.0.0"));
-}
-
-// Ensure that the product info and build fingerprint metadata show up in the
-// final microdump if present.
-TEST(MicrodumpWriterTest, BuildFingerprintAndProductInfo) {
- const char kProductInfo[] = "MockProduct:42.0.2311.99";
- const char kBuildFingerprint[] =
- "aosp/occam/mako:5.1.1/LMY47W/12345678:userdegbug/dev-keys";
- const char kGPUFingerprint[] =
- "Qualcomm;Adreno (TM) 330;OpenGL ES 3.0 V@104.0 AU@ (GIT@Id3510ff6dc)";
- const MicrodumpExtraInfo kMicrodumpExtraInfo(
- MakeMicrodumpExtraInfo(kBuildFingerprint, kProductInfo, kGPUFingerprint));
- scoped_array<char> buf;
- MappingList no_mappings;
-
- CrashAndGetMicrodump(no_mappings, kMicrodumpExtraInfo, &buf);
- CheckMicrodumpContents(string(buf.get()), kMicrodumpExtraInfo);
-}
-
-TEST(MicrodumpWriterTest, NoProductInfo) {
- const char kBuildFingerprint[] = "foobar";
- const char kGPUFingerprint[] = "bazqux";
- scoped_array<char> buf;
- MappingList no_mappings;
-
- const MicrodumpExtraInfo kMicrodumpExtraInfoNoProductInfo(
- MakeMicrodumpExtraInfo(kBuildFingerprint, NULL, kGPUFingerprint));
-
- CrashAndGetMicrodump(no_mappings, kMicrodumpExtraInfoNoProductInfo, &buf);
- CheckMicrodumpContents(string(buf.get()), kBuildFingerprint,
- "UNKNOWN:0.0.0.0", kGPUFingerprint);
-}
-
-TEST(MicrodumpWriterTest, NoGPUInfo) {
- const char kProductInfo[] = "bazqux";
- const char kBuildFingerprint[] = "foobar";
- scoped_array<char> buf;
- MappingList no_mappings;
-
- const MicrodumpExtraInfo kMicrodumpExtraInfoNoGPUInfo(
- MakeMicrodumpExtraInfo(kBuildFingerprint, kProductInfo, NULL));
-
- CrashAndGetMicrodump(no_mappings, kMicrodumpExtraInfoNoGPUInfo, &buf);
- CheckMicrodumpContents(string(buf.get()), kBuildFingerprint,
- kProductInfo, "UNKNOWN");
-}
-} // namespace