186cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org// Copyright (c) 2011, Google Inc.
286cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org// All rights reserved.
386cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org//
486cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org// Redistribution and use in source and binary forms, with or without
586cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org// modification, are permitted provided that the following conditions are
686cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org// met:
786cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org//
886cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org//     * Redistributions of source code must retain the above copyright
986cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org// notice, this list of conditions and the following disclaimer.
1086cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org//     * Redistributions in binary form must reproduce the above
1186cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org// copyright notice, this list of conditions and the following disclaimer
1286cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org// in the documentation and/or other materials provided with the
1386cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org// distribution.
1486cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org//     * Neither the name of Google Inc. nor the names of its
1586cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org// contributors may be used to endorse or promote products derived from
1686cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org// this software without specific prior written permission.
1786cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org//
1886cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
1986cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
2086cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
2186cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
2286cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
2386cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
2486cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2586cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2686cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2786cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
2886cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2986cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org
3086cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org// elf_core_dump_unittest.cc: Unit tests for google_breakpad::ElfCoreDump.
3186cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org
3286cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org#include <sys/procfs.h>
3386cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org
3486cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org#include <set>
3586cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org#include <string>
3686cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org
3786cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org#include "breakpad_googletest_includes.h"
3886cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org#include "common/linux/elf_core_dump.h"
3986cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org#include "common/linux/memory_mapped_file.h"
4086cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org#include "common/tests/file_utils.h"
4186cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org#include "common/linux/tests/crash_generator.h"
424e518a4357a2d1c379d4a91df6d4e153ee791101ivan.penkov@gmail.com#include "common/using_std_string.h"
4386cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org
4486cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.orgusing google_breakpad::AutoTempDir;
4586cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.orgusing google_breakpad::CrashGenerator;
4686cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.orgusing google_breakpad::ElfCoreDump;
4786cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.orgusing google_breakpad::MemoryMappedFile;
4886cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.orgusing google_breakpad::MemoryRange;
4986cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.orgusing google_breakpad::WriteFile;
5086cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.orgusing std::set;
5186cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org
5286cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.orgTEST(ElfCoreDumpTest, DefaultConstructor) {
5386cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org  ElfCoreDump core;
5486cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org  EXPECT_FALSE(core.IsValid());
5586cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org  EXPECT_EQ(NULL, core.GetHeader());
562971a050754f48aaa807db47a29e0d0beddbdcf7ivan.penkov@gmail.com  EXPECT_EQ(0U, core.GetProgramHeaderCount());
5786cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org  EXPECT_EQ(NULL, core.GetProgramHeader(0));
5886cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org  EXPECT_EQ(NULL, core.GetFirstProgramHeaderOfType(PT_LOAD));
5986cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org  EXPECT_FALSE(core.GetFirstNote().IsValid());
6086cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org}
6186cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org
6286cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.orgTEST(ElfCoreDumpTest, TestElfHeader) {
6386cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org  ElfCoreDump::Ehdr header;
6486cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org  memset(&header, 0, sizeof(header));
6586cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org
6686cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org  AutoTempDir temp_dir;
6786cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org  string core_path = temp_dir.path() + "/core";
6886cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org  const char* core_file = core_path.c_str();
6986cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org  MemoryMappedFile mapped_core_file;
7086cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org  ElfCoreDump core;
7186cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org
7286cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org  ASSERT_TRUE(WriteFile(core_file, &header, sizeof(header) - 1));
73dd5dd85f3795609723082a2b34f81e19b4f1679frmcilroy@chromium.org  ASSERT_TRUE(mapped_core_file.Map(core_file, 0));
7486cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org  core.SetContent(mapped_core_file.content());
7586cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org  EXPECT_FALSE(core.IsValid());
7686cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org  EXPECT_EQ(NULL, core.GetHeader());
772971a050754f48aaa807db47a29e0d0beddbdcf7ivan.penkov@gmail.com  EXPECT_EQ(0U, core.GetProgramHeaderCount());
7886cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org  EXPECT_EQ(NULL, core.GetProgramHeader(0));
7986cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org  EXPECT_EQ(NULL, core.GetFirstProgramHeaderOfType(PT_LOAD));
8086cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org  EXPECT_FALSE(core.GetFirstNote().IsValid());
8186cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org
8286cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org  ASSERT_TRUE(WriteFile(core_file, &header, sizeof(header)));
83dd5dd85f3795609723082a2b34f81e19b4f1679frmcilroy@chromium.org  ASSERT_TRUE(mapped_core_file.Map(core_file, 0));
8486cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org  core.SetContent(mapped_core_file.content());
8586cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org  EXPECT_FALSE(core.IsValid());
8686cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org
8786cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org  header.e_ident[0] = ELFMAG0;
8886cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org  ASSERT_TRUE(WriteFile(core_file, &header, sizeof(header)));
89dd5dd85f3795609723082a2b34f81e19b4f1679frmcilroy@chromium.org  ASSERT_TRUE(mapped_core_file.Map(core_file, 0));
9086cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org  core.SetContent(mapped_core_file.content());
9186cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org  EXPECT_FALSE(core.IsValid());
9286cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org
9386cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org  header.e_ident[1] = ELFMAG1;
9486cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org  ASSERT_TRUE(WriteFile(core_file, &header, sizeof(header)));
95dd5dd85f3795609723082a2b34f81e19b4f1679frmcilroy@chromium.org  ASSERT_TRUE(mapped_core_file.Map(core_file, 0));
9686cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org  core.SetContent(mapped_core_file.content());
9786cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org  EXPECT_FALSE(core.IsValid());
9886cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org
9986cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org  header.e_ident[2] = ELFMAG2;
10086cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org  ASSERT_TRUE(WriteFile(core_file, &header, sizeof(header)));
101dd5dd85f3795609723082a2b34f81e19b4f1679frmcilroy@chromium.org  ASSERT_TRUE(mapped_core_file.Map(core_file, 0));
10286cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org  core.SetContent(mapped_core_file.content());
10386cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org  EXPECT_FALSE(core.IsValid());
10486cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org
10586cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org  header.e_ident[3] = ELFMAG3;
10686cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org  ASSERT_TRUE(WriteFile(core_file, &header, sizeof(header)));
107dd5dd85f3795609723082a2b34f81e19b4f1679frmcilroy@chromium.org  ASSERT_TRUE(mapped_core_file.Map(core_file, 0));
10886cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org  core.SetContent(mapped_core_file.content());
10986cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org  EXPECT_FALSE(core.IsValid());
11086cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org
11186cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org  header.e_ident[4] = ElfCoreDump::kClass;
11286cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org  ASSERT_TRUE(WriteFile(core_file, &header, sizeof(header)));
113dd5dd85f3795609723082a2b34f81e19b4f1679frmcilroy@chromium.org  ASSERT_TRUE(mapped_core_file.Map(core_file, 0));
11486cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org  core.SetContent(mapped_core_file.content());
11586cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org  EXPECT_FALSE(core.IsValid());
11686cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org
11786cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org  header.e_version = EV_CURRENT;
11886cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org  ASSERT_TRUE(WriteFile(core_file, &header, sizeof(header)));
119dd5dd85f3795609723082a2b34f81e19b4f1679frmcilroy@chromium.org  ASSERT_TRUE(mapped_core_file.Map(core_file, 0));
12086cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org  core.SetContent(mapped_core_file.content());
12186cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org  EXPECT_FALSE(core.IsValid());
12286cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org
12386cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org  header.e_type = ET_CORE;
12486cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org  ASSERT_TRUE(WriteFile(core_file, &header, sizeof(header)));
125dd5dd85f3795609723082a2b34f81e19b4f1679frmcilroy@chromium.org  ASSERT_TRUE(mapped_core_file.Map(core_file, 0));
12686cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org  core.SetContent(mapped_core_file.content());
12786cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org  EXPECT_TRUE(core.IsValid());
12886cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org}
12986cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org
13086cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.orgTEST(ElfCoreDumpTest, ValidCoreFile) {
13186cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org  CrashGenerator crash_generator;
13286cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org  if (!crash_generator.HasDefaultCorePattern()) {
133d0765367cb68452e580bcb3531b38db822ea17f3benchan@chromium.org    fprintf(stderr, "ElfCoreDumpTest.ValidCoreFile test is skipped "
134d0765367cb68452e580bcb3531b38db822ea17f3benchan@chromium.org            "due to non-default core pattern");
13586cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org    return;
13686cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org  }
13786cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org
13886cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org  const unsigned kNumOfThreads = 3;
13986cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org  const unsigned kCrashThread = 1;
14086cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org  const int kCrashSignal = SIGABRT;
141548501df371a517683d8b4d05c05b3929ad43141vapier@chromium.org  ASSERT_TRUE(crash_generator.CreateChildCrash(kNumOfThreads, kCrashThread,
142548501df371a517683d8b4d05c05b3929ad43141vapier@chromium.org                                               kCrashSignal, NULL));
14386cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org  pid_t expected_crash_thread_id = crash_generator.GetThreadId(kCrashThread);
14486cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org  set<pid_t> expected_thread_ids;
14586cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org  for (unsigned i = 0; i < kNumOfThreads; ++i) {
14686cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org    expected_thread_ids.insert(crash_generator.GetThreadId(i));
14786cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org  }
14886cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org
149850b8dc0f0ddab5c042ac61fecbbf493fac3c66brmcilroy@chromium.org#if defined(__ANDROID__)
150850b8dc0f0ddab5c042ac61fecbbf493fac3c66brmcilroy@chromium.org  struct stat st;
151850b8dc0f0ddab5c042ac61fecbbf493fac3c66brmcilroy@chromium.org  if (stat(crash_generator.GetCoreFilePath().c_str(), &st) != 0) {
152850b8dc0f0ddab5c042ac61fecbbf493fac3c66brmcilroy@chromium.org    fprintf(stderr, "ElfCoreDumpTest.ValidCoreFile test is skipped "
153850b8dc0f0ddab5c042ac61fecbbf493fac3c66brmcilroy@chromium.org            "due to no core file being generated");
154850b8dc0f0ddab5c042ac61fecbbf493fac3c66brmcilroy@chromium.org    return;
155850b8dc0f0ddab5c042ac61fecbbf493fac3c66brmcilroy@chromium.org  }
156850b8dc0f0ddab5c042ac61fecbbf493fac3c66brmcilroy@chromium.org#endif
157850b8dc0f0ddab5c042ac61fecbbf493fac3c66brmcilroy@chromium.org
15886cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org  MemoryMappedFile mapped_core_file;
159dd5dd85f3795609723082a2b34f81e19b4f1679frmcilroy@chromium.org  ASSERT_TRUE(
160dd5dd85f3795609723082a2b34f81e19b4f1679frmcilroy@chromium.org      mapped_core_file.Map(crash_generator.GetCoreFilePath().c_str(), 0));
16186cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org
16286cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org  ElfCoreDump core;
16386cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org  core.SetContent(mapped_core_file.content());
16486cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org  EXPECT_TRUE(core.IsValid());
16586cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org
16686cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org  // Based on write_note_info() in linux/kernel/fs/binfmt_elf.c, notes are
16786cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org  // ordered as follows (NT_PRXFPREG and NT_386_TLS are i386 specific):
16886cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org  //   Thread           Name          Type
16986cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org  //   -------------------------------------------------------------------
17086cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org  //   1st thread       CORE          NT_PRSTATUS
17186cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org  //   process-wide     CORE          NT_PRPSINFO
17286cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org  //   process-wide     CORE          NT_AUXV
17386cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org  //   1st thread       CORE          NT_FPREGSET
17486cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org  //   1st thread       LINUX         NT_PRXFPREG
17586cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org  //   1st thread       LINUX         NT_386_TLS
17686cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org  //
17786cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org  //   2nd thread       CORE          NT_PRSTATUS
17886cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org  //   2nd thread       CORE          NT_FPREGSET
17986cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org  //   2nd thread       LINUX         NT_PRXFPREG
18086cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org  //   2nd thread       LINUX         NT_386_TLS
18186cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org  //
18286cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org  //   3rd thread       CORE          NT_PRSTATUS
18386cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org  //   3rd thread       CORE          NT_FPREGSET
18486cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org  //   3rd thread       LINUX         NT_PRXFPREG
18586cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org  //   3rd thread       LINUX         NT_386_TLS
18686cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org
18786cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org  size_t num_nt_prpsinfo = 0;
18886cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org  size_t num_nt_prstatus = 0;
1895905ae142336d408826e28545f13d97107f0f114benchan@chromium.org  size_t num_pr_fpvalid = 0;
1904ac3c240983991b6358baad732e2fbe3fd4f7245digit@chromium.org#if defined(__i386__) || defined(__x86_64__)
19186cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org  size_t num_nt_fpregset = 0;
1924ac3c240983991b6358baad732e2fbe3fd4f7245digit@chromium.org#endif
193b732342313268422c0c0794dfb1a82cd17ce9e05ivan.penkov@gmail.com#if defined(__i386__)
19486cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org  size_t num_nt_prxfpreg = 0;
195b732342313268422c0c0794dfb1a82cd17ce9e05ivan.penkov@gmail.com#endif
19686cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org  set<pid_t> actual_thread_ids;
19786cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org  ElfCoreDump::Note note = core.GetFirstNote();
19886cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org  while (note.IsValid()) {
19986cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org    MemoryRange name = note.GetName();
20086cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org    MemoryRange description = note.GetDescription();
20186cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org    EXPECT_FALSE(name.IsEmpty());
20286cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org    EXPECT_FALSE(description.IsEmpty());
20386cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org
20486cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org    switch (note.GetType()) {
20586cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org      case NT_PRPSINFO: {
20686cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org        EXPECT_TRUE(description.data() != NULL);
20786cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org        EXPECT_EQ(sizeof(elf_prpsinfo), description.length());
20886cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org        ++num_nt_prpsinfo;
20986cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org        break;
21086cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org      }
21186cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org      case NT_PRSTATUS: {
21286cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org        EXPECT_TRUE(description.data() != NULL);
21386cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org        EXPECT_EQ(sizeof(elf_prstatus), description.length());
21486cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org        const elf_prstatus* status = description.GetData<elf_prstatus>(0);
21586cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org        actual_thread_ids.insert(status->pr_pid);
21686cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org        if (num_nt_prstatus == 0) {
21786cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org          EXPECT_EQ(expected_crash_thread_id, status->pr_pid);
21886cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org          EXPECT_EQ(kCrashSignal, status->pr_info.si_signo);
21986cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org        }
22086cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org        ++num_nt_prstatus;
2215905ae142336d408826e28545f13d97107f0f114benchan@chromium.org        if (status->pr_fpvalid)
2225905ae142336d408826e28545f13d97107f0f114benchan@chromium.org          ++num_pr_fpvalid;
22386cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org        break;
22486cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org      }
225b732342313268422c0c0794dfb1a82cd17ce9e05ivan.penkov@gmail.com#if defined(__i386__) || defined(__x86_64__)
22686cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org      case NT_FPREGSET: {
22786cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org        EXPECT_TRUE(description.data() != NULL);
22886cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org        EXPECT_EQ(sizeof(user_fpregs_struct), description.length());
22986cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org        ++num_nt_fpregset;
23086cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org        break;
23186cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org      }
23286cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org#endif
233b732342313268422c0c0794dfb1a82cd17ce9e05ivan.penkov@gmail.com#if defined(__i386__)
23486cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org      case NT_PRXFPREG: {
23586cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org        EXPECT_TRUE(description.data() != NULL);
23686cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org        EXPECT_EQ(sizeof(user_fpxregs_struct), description.length());
23786cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org        ++num_nt_prxfpreg;
23886cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org        break;
23986cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org      }
24086cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org#endif
24186cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org      default:
24286cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org        break;
24386cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org    }
24486cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org    note = note.GetNextNote();
24586cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org  }
24686cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org
24786cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org  EXPECT_TRUE(expected_thread_ids == actual_thread_ids);
2482971a050754f48aaa807db47a29e0d0beddbdcf7ivan.penkov@gmail.com  EXPECT_EQ(1U, num_nt_prpsinfo);
24986cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org  EXPECT_EQ(kNumOfThreads, num_nt_prstatus);
250b732342313268422c0c0794dfb1a82cd17ce9e05ivan.penkov@gmail.com#if defined(__i386__) || defined(__x86_64__)
2515905ae142336d408826e28545f13d97107f0f114benchan@chromium.org  EXPECT_EQ(num_pr_fpvalid, num_nt_fpregset);
25286cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org#endif
253b732342313268422c0c0794dfb1a82cd17ce9e05ivan.penkov@gmail.com#if defined(__i386__)
2545905ae142336d408826e28545f13d97107f0f114benchan@chromium.org  EXPECT_EQ(num_pr_fpvalid, num_nt_prxfpreg);
25586cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org#endif
25686cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org}
257