19244496c6f875ef1f7166d65f218d57ae92cabaajimblandy// Copyright (c) 2010, Google Inc.
20cbd50c975c1680a6cd0f1ce2760e157e2bfd46fted.mielczarek// All rights reserved.
30cbd50c975c1680a6cd0f1ce2760e157e2bfd46fted.mielczarek//
40cbd50c975c1680a6cd0f1ce2760e157e2bfd46fted.mielczarek// Redistribution and use in source and binary forms, with or without
50cbd50c975c1680a6cd0f1ce2760e157e2bfd46fted.mielczarek// modification, are permitted provided that the following conditions are
60cbd50c975c1680a6cd0f1ce2760e157e2bfd46fted.mielczarek// met:
70cbd50c975c1680a6cd0f1ce2760e157e2bfd46fted.mielczarek//
80cbd50c975c1680a6cd0f1ce2760e157e2bfd46fted.mielczarek//     * Redistributions of source code must retain the above copyright
90cbd50c975c1680a6cd0f1ce2760e157e2bfd46fted.mielczarek// notice, this list of conditions and the following disclaimer.
100cbd50c975c1680a6cd0f1ce2760e157e2bfd46fted.mielczarek//     * Redistributions in binary form must reproduce the above
110cbd50c975c1680a6cd0f1ce2760e157e2bfd46fted.mielczarek// copyright notice, this list of conditions and the following disclaimer
120cbd50c975c1680a6cd0f1ce2760e157e2bfd46fted.mielczarek// in the documentation and/or other materials provided with the
130cbd50c975c1680a6cd0f1ce2760e157e2bfd46fted.mielczarek// distribution.
140cbd50c975c1680a6cd0f1ce2760e157e2bfd46fted.mielczarek//     * Neither the name of Google Inc. nor the names of its
150cbd50c975c1680a6cd0f1ce2760e157e2bfd46fted.mielczarek// contributors may be used to endorse or promote products derived from
160cbd50c975c1680a6cd0f1ce2760e157e2bfd46fted.mielczarek// this software without specific prior written permission.
170cbd50c975c1680a6cd0f1ce2760e157e2bfd46fted.mielczarek//
180cbd50c975c1680a6cd0f1ce2760e157e2bfd46fted.mielczarek// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
190cbd50c975c1680a6cd0f1ce2760e157e2bfd46fted.mielczarek// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
200cbd50c975c1680a6cd0f1ce2760e157e2bfd46fted.mielczarek// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
210cbd50c975c1680a6cd0f1ce2760e157e2bfd46fted.mielczarek// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
220cbd50c975c1680a6cd0f1ce2760e157e2bfd46fted.mielczarek// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
230cbd50c975c1680a6cd0f1ce2760e157e2bfd46fted.mielczarek// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
240cbd50c975c1680a6cd0f1ce2760e157e2bfd46fted.mielczarek// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
250cbd50c975c1680a6cd0f1ce2760e157e2bfd46fted.mielczarek// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
260cbd50c975c1680a6cd0f1ce2760e157e2bfd46fted.mielczarek// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
270cbd50c975c1680a6cd0f1ce2760e157e2bfd46fted.mielczarek// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
280cbd50c975c1680a6cd0f1ce2760e157e2bfd46fted.mielczarek// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
290cbd50c975c1680a6cd0f1ce2760e157e2bfd46fted.mielczarek
300cbd50c975c1680a6cd0f1ce2760e157e2bfd46fted.mielczarek// Unit test for Minidump.  Uses a pre-generated minidump and
310cbd50c975c1680a6cd0f1ce2760e157e2bfd46fted.mielczarek// verifies that certain streams are correct.
320cbd50c975c1680a6cd0f1ce2760e157e2bfd46fted.mielczarek
330cbd50c975c1680a6cd0f1ce2760e157e2bfd46fted.mielczarek#include <iostream>
340cbd50c975c1680a6cd0f1ce2760e157e2bfd46fted.mielczarek#include <fstream>
350cbd50c975c1680a6cd0f1ce2760e157e2bfd46fted.mielczarek#include <sstream>
369244496c6f875ef1f7166d65f218d57ae92cabaajimblandy#include <stdlib.h>
370cbd50c975c1680a6cd0f1ce2760e157e2bfd46fted.mielczarek#include <string>
380cbd50c975c1680a6cd0f1ce2760e157e2bfd46fted.mielczarek#include <vector>
394e518a4357a2d1c379d4a91df6d4e153ee791101ivan.penkov@gmail.com
400cbd50c975c1680a6cd0f1ce2760e157e2bfd46fted.mielczarek#include "breakpad_googletest_includes.h"
414e518a4357a2d1c379d4a91df6d4e153ee791101ivan.penkov@gmail.com#include "common/using_std_string.h"
420cbd50c975c1680a6cd0f1ce2760e157e2bfd46fted.mielczarek#include "google_breakpad/common/minidump_format.h"
430cbd50c975c1680a6cd0f1ce2760e157e2bfd46fted.mielczarek#include "google_breakpad/processor/minidump.h"
440cbd50c975c1680a6cd0f1ce2760e157e2bfd46fted.mielczarek#include "processor/logging.h"
459244496c6f875ef1f7166d65f218d57ae92cabaajimblandy#include "processor/synth_minidump.h"
460cbd50c975c1680a6cd0f1ce2760e157e2bfd46fted.mielczarek
470cbd50c975c1680a6cd0f1ce2760e157e2bfd46fted.mielczareknamespace {
480cbd50c975c1680a6cd0f1ce2760e157e2bfd46fted.mielczarek
490cbd50c975c1680a6cd0f1ce2760e157e2bfd46fted.mielczarekusing google_breakpad::Minidump;
509244496c6f875ef1f7166d65f218d57ae92cabaajimblandyusing google_breakpad::MinidumpContext;
511a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarekusing google_breakpad::MinidumpException;
527b8e2b7e090b2d1223d0944d1e7da1d4c571bb5dted.mielczarekusing google_breakpad::MinidumpMemoryInfo;
537b8e2b7e090b2d1223d0944d1e7da1d4c571bb5dted.mielczarekusing google_breakpad::MinidumpMemoryInfoList;
549244496c6f875ef1f7166d65f218d57ae92cabaajimblandyusing google_breakpad::MinidumpMemoryList;
559244496c6f875ef1f7166d65f218d57ae92cabaajimblandyusing google_breakpad::MinidumpMemoryRegion;
569244496c6f875ef1f7166d65f218d57ae92cabaajimblandyusing google_breakpad::MinidumpModule;
579244496c6f875ef1f7166d65f218d57ae92cabaajimblandyusing google_breakpad::MinidumpModuleList;
589244496c6f875ef1f7166d65f218d57ae92cabaajimblandyusing google_breakpad::MinidumpSystemInfo;
599244496c6f875ef1f7166d65f218d57ae92cabaajimblandyusing google_breakpad::MinidumpThread;
609244496c6f875ef1f7166d65f218d57ae92cabaajimblandyusing google_breakpad::MinidumpThreadList;
619244496c6f875ef1f7166d65f218d57ae92cabaajimblandyusing google_breakpad::SynthMinidump::Context;
629244496c6f875ef1f7166d65f218d57ae92cabaajimblandyusing google_breakpad::SynthMinidump::Dump;
631a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarekusing google_breakpad::SynthMinidump::Exception;
649244496c6f875ef1f7166d65f218d57ae92cabaajimblandyusing google_breakpad::SynthMinidump::Memory;
659244496c6f875ef1f7166d65f218d57ae92cabaajimblandyusing google_breakpad::SynthMinidump::Module;
669244496c6f875ef1f7166d65f218d57ae92cabaajimblandyusing google_breakpad::SynthMinidump::Stream;
679244496c6f875ef1f7166d65f218d57ae92cabaajimblandyusing google_breakpad::SynthMinidump::String;
689244496c6f875ef1f7166d65f218d57ae92cabaajimblandyusing google_breakpad::SynthMinidump::SystemInfo;
699244496c6f875ef1f7166d65f218d57ae92cabaajimblandyusing google_breakpad::SynthMinidump::Thread;
706f598cc435f8c557b33f85802f1571ef745c37b0ted.mielczarekusing google_breakpad::test_assembler::kBigEndian;
716f598cc435f8c557b33f85802f1571ef745c37b0ted.mielczarekusing google_breakpad::test_assembler::kLittleEndian;
720cbd50c975c1680a6cd0f1ce2760e157e2bfd46fted.mielczarekusing std::ifstream;
730cbd50c975c1680a6cd0f1ce2760e157e2bfd46fted.mielczarekusing std::istringstream;
740cbd50c975c1680a6cd0f1ce2760e157e2bfd46fted.mielczarekusing std::vector;
750cbd50c975c1680a6cd0f1ce2760e157e2bfd46fted.mielczarekusing ::testing::Return;
760cbd50c975c1680a6cd0f1ce2760e157e2bfd46fted.mielczarek
770cbd50c975c1680a6cd0f1ce2760e157e2bfd46fted.mielczarekclass MinidumpTest : public ::testing::Test {
780cbd50c975c1680a6cd0f1ce2760e157e2bfd46fted.mielczarekpublic:
790cbd50c975c1680a6cd0f1ce2760e157e2bfd46fted.mielczarek  void SetUp() {
800cbd50c975c1680a6cd0f1ce2760e157e2bfd46fted.mielczarek    minidump_file_ = string(getenv("srcdir") ? getenv("srcdir") : ".") +
810cbd50c975c1680a6cd0f1ce2760e157e2bfd46fted.mielczarek      "/src/processor/testdata/minidump2.dmp";
820cbd50c975c1680a6cd0f1ce2760e157e2bfd46fted.mielczarek  }
830cbd50c975c1680a6cd0f1ce2760e157e2bfd46fted.mielczarek  string minidump_file_;
840cbd50c975c1680a6cd0f1ce2760e157e2bfd46fted.mielczarek};
850cbd50c975c1680a6cd0f1ce2760e157e2bfd46fted.mielczarek
860cbd50c975c1680a6cd0f1ce2760e157e2bfd46fted.mielczarekTEST_F(MinidumpTest, TestMinidumpFromFile) {
870cbd50c975c1680a6cd0f1ce2760e157e2bfd46fted.mielczarek  Minidump minidump(minidump_file_);
880cbd50c975c1680a6cd0f1ce2760e157e2bfd46fted.mielczarek  ASSERT_EQ(minidump.path(), minidump_file_);
890cbd50c975c1680a6cd0f1ce2760e157e2bfd46fted.mielczarek  ASSERT_TRUE(minidump.Read());
900cbd50c975c1680a6cd0f1ce2760e157e2bfd46fted.mielczarek  const MDRawHeader* header = minidump.header();
910cbd50c975c1680a6cd0f1ce2760e157e2bfd46fted.mielczarek  ASSERT_NE(header, (MDRawHeader*)NULL);
926162aed3c3fcfc53373c963ac375d39a5dfa5a25ted.mielczarek@gmail.com  ASSERT_EQ(header->signature, uint32_t(MD_HEADER_SIGNATURE));
930cbd50c975c1680a6cd0f1ce2760e157e2bfd46fted.mielczarek  //TODO: add more checks here
940cbd50c975c1680a6cd0f1ce2760e157e2bfd46fted.mielczarek}
950cbd50c975c1680a6cd0f1ce2760e157e2bfd46fted.mielczarek
960cbd50c975c1680a6cd0f1ce2760e157e2bfd46fted.mielczarekTEST_F(MinidumpTest, TestMinidumpFromStream) {
970cbd50c975c1680a6cd0f1ce2760e157e2bfd46fted.mielczarek  // read minidump contents into memory, construct a stringstream around them
980cbd50c975c1680a6cd0f1ce2760e157e2bfd46fted.mielczarek  ifstream file_stream(minidump_file_.c_str(), std::ios::in);
990cbd50c975c1680a6cd0f1ce2760e157e2bfd46fted.mielczarek  ASSERT_TRUE(file_stream.good());
1000cbd50c975c1680a6cd0f1ce2760e157e2bfd46fted.mielczarek  vector<char> bytes;
1010cbd50c975c1680a6cd0f1ce2760e157e2bfd46fted.mielczarek  file_stream.seekg(0, std::ios_base::end);
1020cbd50c975c1680a6cd0f1ce2760e157e2bfd46fted.mielczarek  ASSERT_TRUE(file_stream.good());
1030cbd50c975c1680a6cd0f1ce2760e157e2bfd46fted.mielczarek  bytes.resize(file_stream.tellg());
1040cbd50c975c1680a6cd0f1ce2760e157e2bfd46fted.mielczarek  file_stream.seekg(0, std::ios_base::beg);
1050cbd50c975c1680a6cd0f1ce2760e157e2bfd46fted.mielczarek  ASSERT_TRUE(file_stream.good());
1060cbd50c975c1680a6cd0f1ce2760e157e2bfd46fted.mielczarek  file_stream.read(&bytes[0], bytes.size());
1070cbd50c975c1680a6cd0f1ce2760e157e2bfd46fted.mielczarek  ASSERT_TRUE(file_stream.good());
1080cbd50c975c1680a6cd0f1ce2760e157e2bfd46fted.mielczarek  string str(&bytes[0], bytes.size());
1090cbd50c975c1680a6cd0f1ce2760e157e2bfd46fted.mielczarek  istringstream stream(str);
1100cbd50c975c1680a6cd0f1ce2760e157e2bfd46fted.mielczarek  ASSERT_TRUE(stream.good());
1110cbd50c975c1680a6cd0f1ce2760e157e2bfd46fted.mielczarek
1120cbd50c975c1680a6cd0f1ce2760e157e2bfd46fted.mielczarek  // now read minidump from stringstream
1130cbd50c975c1680a6cd0f1ce2760e157e2bfd46fted.mielczarek  Minidump minidump(stream);
1140cbd50c975c1680a6cd0f1ce2760e157e2bfd46fted.mielczarek  ASSERT_EQ(minidump.path(), "");
1150cbd50c975c1680a6cd0f1ce2760e157e2bfd46fted.mielczarek  ASSERT_TRUE(minidump.Read());
1160cbd50c975c1680a6cd0f1ce2760e157e2bfd46fted.mielczarek  const MDRawHeader* header = minidump.header();
1170cbd50c975c1680a6cd0f1ce2760e157e2bfd46fted.mielczarek  ASSERT_NE(header, (MDRawHeader*)NULL);
1186162aed3c3fcfc53373c963ac375d39a5dfa5a25ted.mielczarek@gmail.com  ASSERT_EQ(header->signature, uint32_t(MD_HEADER_SIGNATURE));
1190cbd50c975c1680a6cd0f1ce2760e157e2bfd46fted.mielczarek  //TODO: add more checks here
1200cbd50c975c1680a6cd0f1ce2760e157e2bfd46fted.mielczarek}
1210cbd50c975c1680a6cd0f1ce2760e157e2bfd46fted.mielczarek
1229244496c6f875ef1f7166d65f218d57ae92cabaajimblandyTEST(Dump, ReadBackEmpty) {
1239244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  Dump dump(0);
1249244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  dump.Finish();
1259244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  string contents;
1269244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  ASSERT_TRUE(dump.GetContents(&contents));
1279244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  istringstream stream(contents);
1289244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  Minidump minidump(stream);
1299244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  ASSERT_TRUE(minidump.Read());
1309244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  ASSERT_EQ(0U, minidump.GetDirectoryEntryCount());
1319244496c6f875ef1f7166d65f218d57ae92cabaajimblandy}
1329244496c6f875ef1f7166d65f218d57ae92cabaajimblandy
1339244496c6f875ef1f7166d65f218d57ae92cabaajimblandyTEST(Dump, ReadBackEmptyBigEndian) {
1349244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  Dump big_minidump(0, kBigEndian);
1359244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  big_minidump.Finish();
1369244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  string contents;
1379244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  ASSERT_TRUE(big_minidump.GetContents(&contents));
1389244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  istringstream stream(contents);
1399244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  Minidump minidump(stream);
1409244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  ASSERT_TRUE(minidump.Read());
1419244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  ASSERT_EQ(0U, minidump.GetDirectoryEntryCount());
1429244496c6f875ef1f7166d65f218d57ae92cabaajimblandy}
1439244496c6f875ef1f7166d65f218d57ae92cabaajimblandy
1449244496c6f875ef1f7166d65f218d57ae92cabaajimblandyTEST(Dump, OneStream) {
1459244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  Dump dump(0, kBigEndian);
1469244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  Stream stream(dump, 0xfbb7fa2bU);
1479244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  stream.Append("stream contents");
1489244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  dump.Add(&stream);
1499244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  dump.Finish();
1509244496c6f875ef1f7166d65f218d57ae92cabaajimblandy
1519244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  string contents;
1529244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  ASSERT_TRUE(dump.GetContents(&contents));
1539244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  istringstream minidump_stream(contents);
1549244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  Minidump minidump(minidump_stream);
1559244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  ASSERT_TRUE(minidump.Read());
1569244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  ASSERT_EQ(1U, minidump.GetDirectoryEntryCount());
1579244496c6f875ef1f7166d65f218d57ae92cabaajimblandy
1589244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  const MDRawDirectory *dir = minidump.GetDirectoryEntryAtIndex(0);
1599244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  ASSERT_TRUE(dir != NULL);
1609244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  EXPECT_EQ(0xfbb7fa2bU, dir->stream_type);
1619244496c6f875ef1f7166d65f218d57ae92cabaajimblandy
1626162aed3c3fcfc53373c963ac375d39a5dfa5a25ted.mielczarek@gmail.com  uint32_t stream_length;
1639244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  ASSERT_TRUE(minidump.SeekToStreamType(0xfbb7fa2bU, &stream_length));
1649244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  ASSERT_EQ(15U, stream_length);
1659244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  char stream_contents[15];
1669244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  ASSERT_TRUE(minidump.ReadBytes(stream_contents, sizeof(stream_contents)));
1679244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  EXPECT_EQ(string("stream contents"),
1689244496c6f875ef1f7166d65f218d57ae92cabaajimblandy            string(stream_contents, sizeof(stream_contents)));
1699244496c6f875ef1f7166d65f218d57ae92cabaajimblandy
1709244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  EXPECT_FALSE(minidump.GetThreadList());
1719244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  EXPECT_FALSE(minidump.GetModuleList());
1729244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  EXPECT_FALSE(minidump.GetMemoryList());
1739244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  EXPECT_FALSE(minidump.GetException());
1749244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  EXPECT_FALSE(minidump.GetAssertion());
1759244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  EXPECT_FALSE(minidump.GetSystemInfo());
1769244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  EXPECT_FALSE(minidump.GetMiscInfo());
1779244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  EXPECT_FALSE(minidump.GetBreakpadInfo());
1789244496c6f875ef1f7166d65f218d57ae92cabaajimblandy}
1799244496c6f875ef1f7166d65f218d57ae92cabaajimblandy
1809244496c6f875ef1f7166d65f218d57ae92cabaajimblandyTEST(Dump, OneMemory) {
1819244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  Dump dump(0, kBigEndian);
1829244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  Memory memory(dump, 0x309d68010bd21b2cULL);
1839244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  memory.Append("memory contents");
1849244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  dump.Add(&memory);
1859244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  dump.Finish();
1869244496c6f875ef1f7166d65f218d57ae92cabaajimblandy
1879244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  string contents;
1889244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  ASSERT_TRUE(dump.GetContents(&contents));
1899244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  istringstream minidump_stream(contents);
1909244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  Minidump minidump(minidump_stream);
1919244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  ASSERT_TRUE(minidump.Read());
1929244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  ASSERT_EQ(1U, minidump.GetDirectoryEntryCount());
1939244496c6f875ef1f7166d65f218d57ae92cabaajimblandy
1949244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  const MDRawDirectory *dir = minidump.GetDirectoryEntryAtIndex(0);
1959244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  ASSERT_TRUE(dir != NULL);
1966162aed3c3fcfc53373c963ac375d39a5dfa5a25ted.mielczarek@gmail.com  EXPECT_EQ((uint32_t) MD_MEMORY_LIST_STREAM, dir->stream_type);
1979244496c6f875ef1f7166d65f218d57ae92cabaajimblandy
1989244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  MinidumpMemoryList *memory_list = minidump.GetMemoryList();
1999244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  ASSERT_TRUE(memory_list != NULL);
2009244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  ASSERT_EQ(1U, memory_list->region_count());
2019244496c6f875ef1f7166d65f218d57ae92cabaajimblandy
2029244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  MinidumpMemoryRegion *region1 = memory_list->GetMemoryRegionAtIndex(0);
2039244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  ASSERT_EQ(0x309d68010bd21b2cULL, region1->GetBase());
2049244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  ASSERT_EQ(15U, region1->GetSize());
2056162aed3c3fcfc53373c963ac375d39a5dfa5a25ted.mielczarek@gmail.com  const uint8_t *region1_bytes = region1->GetMemory();
2069244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  ASSERT_TRUE(memcmp("memory contents", region1_bytes, 15) == 0);
2079244496c6f875ef1f7166d65f218d57ae92cabaajimblandy}
2089244496c6f875ef1f7166d65f218d57ae92cabaajimblandy
2099244496c6f875ef1f7166d65f218d57ae92cabaajimblandy// One thread --- and its requisite entourage.
2109244496c6f875ef1f7166d65f218d57ae92cabaajimblandyTEST(Dump, OneThread) {
2119244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  Dump dump(0, kLittleEndian);
2129244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  Memory stack(dump, 0x2326a0fa);
2139244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  stack.Append("stack for thread");
2149244496c6f875ef1f7166d65f218d57ae92cabaajimblandy
2159244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  MDRawContextX86 raw_context;
2166162aed3c3fcfc53373c963ac375d39a5dfa5a25ted.mielczarek@gmail.com  const uint32_t kExpectedEIP = 0x6913f540;
2179244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  raw_context.context_flags = MD_CONTEXT_X86_INTEGER | MD_CONTEXT_X86_CONTROL;
2189244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  raw_context.edi = 0x3ecba80d;
2199244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  raw_context.esi = 0x382583b9;
2209244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  raw_context.ebx = 0x7fccc03f;
2219244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  raw_context.edx = 0xf62f8ec2;
2229244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  raw_context.ecx = 0x46a6a6a8;
2239244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  raw_context.eax = 0x6a5025e2;
2249244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  raw_context.ebp = 0xd9fabb4a;
225c551efe9b6129aa5a7911e3469630b52478057fcted.mielczarek@gmail.com  raw_context.eip = kExpectedEIP;
2269244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  raw_context.cs = 0xbffe6eda;
2279244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  raw_context.eflags = 0xb2ce1e2d;
2289244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  raw_context.esp = 0x659caaa4;
2299244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  raw_context.ss = 0x2e951ef7;
2309244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  Context context(dump, raw_context);
2319244496c6f875ef1f7166d65f218d57ae92cabaajimblandy
2329244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  Thread thread(dump, 0xa898f11b, stack, context,
2339244496c6f875ef1f7166d65f218d57ae92cabaajimblandy                0x9e39439f, 0x4abfc15f, 0xe499898a, 0x0d43e939dcfd0372ULL);
2349244496c6f875ef1f7166d65f218d57ae92cabaajimblandy
2359244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  dump.Add(&stack);
2369244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  dump.Add(&context);
2379244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  dump.Add(&thread);
2389244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  dump.Finish();
2399244496c6f875ef1f7166d65f218d57ae92cabaajimblandy
2409244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  string contents;
2419244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  ASSERT_TRUE(dump.GetContents(&contents));
2429244496c6f875ef1f7166d65f218d57ae92cabaajimblandy
2439244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  istringstream minidump_stream(contents);
2449244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  Minidump minidump(minidump_stream);
2459244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  ASSERT_TRUE(minidump.Read());
2469244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  ASSERT_EQ(2U, minidump.GetDirectoryEntryCount());
2479244496c6f875ef1f7166d65f218d57ae92cabaajimblandy
2489244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  MinidumpMemoryList *md_memory_list = minidump.GetMemoryList();
2499244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  ASSERT_TRUE(md_memory_list != NULL);
2509244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  ASSERT_EQ(1U, md_memory_list->region_count());
2519244496c6f875ef1f7166d65f218d57ae92cabaajimblandy
2529244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  MinidumpMemoryRegion *md_region = md_memory_list->GetMemoryRegionAtIndex(0);
2539244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  ASSERT_EQ(0x2326a0faU, md_region->GetBase());
2549244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  ASSERT_EQ(16U, md_region->GetSize());
2556162aed3c3fcfc53373c963ac375d39a5dfa5a25ted.mielczarek@gmail.com  const uint8_t *region_bytes = md_region->GetMemory();
2569244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  ASSERT_TRUE(memcmp("stack for thread", region_bytes, 16) == 0);
2579244496c6f875ef1f7166d65f218d57ae92cabaajimblandy
2589244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  MinidumpThreadList *thread_list = minidump.GetThreadList();
2599244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  ASSERT_TRUE(thread_list != NULL);
2609244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  ASSERT_EQ(1U, thread_list->thread_count());
2619244496c6f875ef1f7166d65f218d57ae92cabaajimblandy
2629244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  MinidumpThread *md_thread = thread_list->GetThreadAtIndex(0);
2639244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  ASSERT_TRUE(md_thread != NULL);
2646162aed3c3fcfc53373c963ac375d39a5dfa5a25ted.mielczarek@gmail.com  uint32_t thread_id;
2659244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  ASSERT_TRUE(md_thread->GetThreadID(&thread_id));
2669244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  ASSERT_EQ(0xa898f11bU, thread_id);
2679244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  MinidumpMemoryRegion *md_stack = md_thread->GetMemory();
2689244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  ASSERT_TRUE(md_stack != NULL);
2699244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  ASSERT_EQ(0x2326a0faU, md_stack->GetBase());
2709244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  ASSERT_EQ(16U, md_stack->GetSize());
2716162aed3c3fcfc53373c963ac375d39a5dfa5a25ted.mielczarek@gmail.com  const uint8_t *md_stack_bytes = md_stack->GetMemory();
2729244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  ASSERT_TRUE(memcmp("stack for thread", md_stack_bytes, 16) == 0);
2739244496c6f875ef1f7166d65f218d57ae92cabaajimblandy
2749244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  MinidumpContext *md_context = md_thread->GetContext();
2759244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  ASSERT_TRUE(md_context != NULL);
2766162aed3c3fcfc53373c963ac375d39a5dfa5a25ted.mielczarek@gmail.com  ASSERT_EQ((uint32_t) MD_CONTEXT_X86, md_context->GetContextCPU());
277c551efe9b6129aa5a7911e3469630b52478057fcted.mielczarek@gmail.com
2786162aed3c3fcfc53373c963ac375d39a5dfa5a25ted.mielczarek@gmail.com  uint64_t eip;
279c551efe9b6129aa5a7911e3469630b52478057fcted.mielczarek@gmail.com  ASSERT_TRUE(md_context->GetInstructionPointer(&eip));
280c551efe9b6129aa5a7911e3469630b52478057fcted.mielczarek@gmail.com  EXPECT_EQ(kExpectedEIP, eip);
281c551efe9b6129aa5a7911e3469630b52478057fcted.mielczarek@gmail.com
2829244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  const MDRawContextX86 *md_raw_context = md_context->GetContextX86();
2839244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  ASSERT_TRUE(md_raw_context != NULL);
2846162aed3c3fcfc53373c963ac375d39a5dfa5a25ted.mielczarek@gmail.com  ASSERT_EQ((uint32_t) (MD_CONTEXT_X86_INTEGER | MD_CONTEXT_X86_CONTROL),
2859244496c6f875ef1f7166d65f218d57ae92cabaajimblandy            (md_raw_context->context_flags
2869244496c6f875ef1f7166d65f218d57ae92cabaajimblandy             & (MD_CONTEXT_X86_INTEGER | MD_CONTEXT_X86_CONTROL)));
2879244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  EXPECT_EQ(0x3ecba80dU, raw_context.edi);
2889244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  EXPECT_EQ(0x382583b9U, raw_context.esi);
2899244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  EXPECT_EQ(0x7fccc03fU, raw_context.ebx);
2909244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  EXPECT_EQ(0xf62f8ec2U, raw_context.edx);
2919244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  EXPECT_EQ(0x46a6a6a8U, raw_context.ecx);
2929244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  EXPECT_EQ(0x6a5025e2U, raw_context.eax);
2939244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  EXPECT_EQ(0xd9fabb4aU, raw_context.ebp);
294c551efe9b6129aa5a7911e3469630b52478057fcted.mielczarek@gmail.com  EXPECT_EQ(kExpectedEIP, raw_context.eip);
2959244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  EXPECT_EQ(0xbffe6edaU, raw_context.cs);
2969244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  EXPECT_EQ(0xb2ce1e2dU, raw_context.eflags);
2979244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  EXPECT_EQ(0x659caaa4U, raw_context.esp);
2989244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  EXPECT_EQ(0x2e951ef7U, raw_context.ss);
2999244496c6f875ef1f7166d65f218d57ae92cabaajimblandy}
3009244496c6f875ef1f7166d65f218d57ae92cabaajimblandy
301e721e628ec10381c96e38cfc82c1816983097165ted.mielczarek@gmail.comTEST(Dump, ThreadMissingMemory) {
302e721e628ec10381c96e38cfc82c1816983097165ted.mielczarek@gmail.com  Dump dump(0, kLittleEndian);
303e721e628ec10381c96e38cfc82c1816983097165ted.mielczarek@gmail.com  Memory stack(dump, 0x2326a0fa);
304e721e628ec10381c96e38cfc82c1816983097165ted.mielczarek@gmail.com  // Stack has no contents.
305e721e628ec10381c96e38cfc82c1816983097165ted.mielczarek@gmail.com
306e721e628ec10381c96e38cfc82c1816983097165ted.mielczarek@gmail.com  MDRawContextX86 raw_context;
307e721e628ec10381c96e38cfc82c1816983097165ted.mielczarek@gmail.com  memset(&raw_context, 0, sizeof(raw_context));
308e721e628ec10381c96e38cfc82c1816983097165ted.mielczarek@gmail.com  raw_context.context_flags = MD_CONTEXT_X86_INTEGER | MD_CONTEXT_X86_CONTROL;
309e721e628ec10381c96e38cfc82c1816983097165ted.mielczarek@gmail.com  Context context(dump, raw_context);
310e721e628ec10381c96e38cfc82c1816983097165ted.mielczarek@gmail.com
311e721e628ec10381c96e38cfc82c1816983097165ted.mielczarek@gmail.com  Thread thread(dump, 0xa898f11b, stack, context,
312e721e628ec10381c96e38cfc82c1816983097165ted.mielczarek@gmail.com                0x9e39439f, 0x4abfc15f, 0xe499898a, 0x0d43e939dcfd0372ULL);
313e721e628ec10381c96e38cfc82c1816983097165ted.mielczarek@gmail.com
314e721e628ec10381c96e38cfc82c1816983097165ted.mielczarek@gmail.com  dump.Add(&stack);
315e721e628ec10381c96e38cfc82c1816983097165ted.mielczarek@gmail.com  dump.Add(&context);
316e721e628ec10381c96e38cfc82c1816983097165ted.mielczarek@gmail.com  dump.Add(&thread);
317e721e628ec10381c96e38cfc82c1816983097165ted.mielczarek@gmail.com  dump.Finish();
318e721e628ec10381c96e38cfc82c1816983097165ted.mielczarek@gmail.com
319e721e628ec10381c96e38cfc82c1816983097165ted.mielczarek@gmail.com  string contents;
320e721e628ec10381c96e38cfc82c1816983097165ted.mielczarek@gmail.com  ASSERT_TRUE(dump.GetContents(&contents));
321e721e628ec10381c96e38cfc82c1816983097165ted.mielczarek@gmail.com
322e721e628ec10381c96e38cfc82c1816983097165ted.mielczarek@gmail.com  istringstream minidump_stream(contents);
323e721e628ec10381c96e38cfc82c1816983097165ted.mielczarek@gmail.com  Minidump minidump(minidump_stream);
324e721e628ec10381c96e38cfc82c1816983097165ted.mielczarek@gmail.com  ASSERT_TRUE(minidump.Read());
325e721e628ec10381c96e38cfc82c1816983097165ted.mielczarek@gmail.com  ASSERT_EQ(2U, minidump.GetDirectoryEntryCount());
326e721e628ec10381c96e38cfc82c1816983097165ted.mielczarek@gmail.com
327e721e628ec10381c96e38cfc82c1816983097165ted.mielczarek@gmail.com  // This should succeed even though the thread has no stack memory.
328e721e628ec10381c96e38cfc82c1816983097165ted.mielczarek@gmail.com  MinidumpThreadList* thread_list = minidump.GetThreadList();
329e721e628ec10381c96e38cfc82c1816983097165ted.mielczarek@gmail.com  ASSERT_TRUE(thread_list != NULL);
330e721e628ec10381c96e38cfc82c1816983097165ted.mielczarek@gmail.com  ASSERT_EQ(1U, thread_list->thread_count());
331e721e628ec10381c96e38cfc82c1816983097165ted.mielczarek@gmail.com
332e721e628ec10381c96e38cfc82c1816983097165ted.mielczarek@gmail.com  MinidumpThread* md_thread = thread_list->GetThreadAtIndex(0);
333e721e628ec10381c96e38cfc82c1816983097165ted.mielczarek@gmail.com  ASSERT_TRUE(md_thread != NULL);
334e721e628ec10381c96e38cfc82c1816983097165ted.mielczarek@gmail.com
3356162aed3c3fcfc53373c963ac375d39a5dfa5a25ted.mielczarek@gmail.com  uint32_t thread_id;
336e721e628ec10381c96e38cfc82c1816983097165ted.mielczarek@gmail.com  ASSERT_TRUE(md_thread->GetThreadID(&thread_id));
337e721e628ec10381c96e38cfc82c1816983097165ted.mielczarek@gmail.com  ASSERT_EQ(0xa898f11bU, thread_id);
338e721e628ec10381c96e38cfc82c1816983097165ted.mielczarek@gmail.com
339e721e628ec10381c96e38cfc82c1816983097165ted.mielczarek@gmail.com  MinidumpContext* md_context = md_thread->GetContext();
340e721e628ec10381c96e38cfc82c1816983097165ted.mielczarek@gmail.com  ASSERT_NE(reinterpret_cast<MinidumpContext*>(NULL), md_context);
341e721e628ec10381c96e38cfc82c1816983097165ted.mielczarek@gmail.com
342e721e628ec10381c96e38cfc82c1816983097165ted.mielczarek@gmail.com  MinidumpMemoryRegion* md_stack = md_thread->GetMemory();
343e721e628ec10381c96e38cfc82c1816983097165ted.mielczarek@gmail.com  ASSERT_EQ(reinterpret_cast<MinidumpMemoryRegion*>(NULL), md_stack);
344e721e628ec10381c96e38cfc82c1816983097165ted.mielczarek@gmail.com}
345e721e628ec10381c96e38cfc82c1816983097165ted.mielczarek@gmail.com
346e721e628ec10381c96e38cfc82c1816983097165ted.mielczarek@gmail.comTEST(Dump, ThreadMissingContext) {
347e721e628ec10381c96e38cfc82c1816983097165ted.mielczarek@gmail.com  Dump dump(0, kLittleEndian);
348e721e628ec10381c96e38cfc82c1816983097165ted.mielczarek@gmail.com  Memory stack(dump, 0x2326a0fa);
349e721e628ec10381c96e38cfc82c1816983097165ted.mielczarek@gmail.com  stack.Append("stack for thread");
350e721e628ec10381c96e38cfc82c1816983097165ted.mielczarek@gmail.com
351e721e628ec10381c96e38cfc82c1816983097165ted.mielczarek@gmail.com  // Context is empty.
352e721e628ec10381c96e38cfc82c1816983097165ted.mielczarek@gmail.com  Context context(dump);
353e721e628ec10381c96e38cfc82c1816983097165ted.mielczarek@gmail.com
354e721e628ec10381c96e38cfc82c1816983097165ted.mielczarek@gmail.com  Thread thread(dump, 0xa898f11b, stack, context,
355e721e628ec10381c96e38cfc82c1816983097165ted.mielczarek@gmail.com                0x9e39439f, 0x4abfc15f, 0xe499898a, 0x0d43e939dcfd0372ULL);
356e721e628ec10381c96e38cfc82c1816983097165ted.mielczarek@gmail.com
357e721e628ec10381c96e38cfc82c1816983097165ted.mielczarek@gmail.com  dump.Add(&stack);
358e721e628ec10381c96e38cfc82c1816983097165ted.mielczarek@gmail.com  dump.Add(&context);
359e721e628ec10381c96e38cfc82c1816983097165ted.mielczarek@gmail.com  dump.Add(&thread);
360e721e628ec10381c96e38cfc82c1816983097165ted.mielczarek@gmail.com  dump.Finish();
361e721e628ec10381c96e38cfc82c1816983097165ted.mielczarek@gmail.com
362e721e628ec10381c96e38cfc82c1816983097165ted.mielczarek@gmail.com  string contents;
363e721e628ec10381c96e38cfc82c1816983097165ted.mielczarek@gmail.com  ASSERT_TRUE(dump.GetContents(&contents));
364e721e628ec10381c96e38cfc82c1816983097165ted.mielczarek@gmail.com
365e721e628ec10381c96e38cfc82c1816983097165ted.mielczarek@gmail.com  istringstream minidump_stream(contents);
366e721e628ec10381c96e38cfc82c1816983097165ted.mielczarek@gmail.com  Minidump minidump(minidump_stream);
367e721e628ec10381c96e38cfc82c1816983097165ted.mielczarek@gmail.com  ASSERT_TRUE(minidump.Read());
368e721e628ec10381c96e38cfc82c1816983097165ted.mielczarek@gmail.com  ASSERT_EQ(2U, minidump.GetDirectoryEntryCount());
369e721e628ec10381c96e38cfc82c1816983097165ted.mielczarek@gmail.com
370e721e628ec10381c96e38cfc82c1816983097165ted.mielczarek@gmail.com  // This should succeed even though the thread has no stack memory.
371e721e628ec10381c96e38cfc82c1816983097165ted.mielczarek@gmail.com  MinidumpThreadList* thread_list = minidump.GetThreadList();
372e721e628ec10381c96e38cfc82c1816983097165ted.mielczarek@gmail.com  ASSERT_TRUE(thread_list != NULL);
373e721e628ec10381c96e38cfc82c1816983097165ted.mielczarek@gmail.com  ASSERT_EQ(1U, thread_list->thread_count());
374e721e628ec10381c96e38cfc82c1816983097165ted.mielczarek@gmail.com
375e721e628ec10381c96e38cfc82c1816983097165ted.mielczarek@gmail.com  MinidumpThread* md_thread = thread_list->GetThreadAtIndex(0);
376e721e628ec10381c96e38cfc82c1816983097165ted.mielczarek@gmail.com  ASSERT_TRUE(md_thread != NULL);
377e721e628ec10381c96e38cfc82c1816983097165ted.mielczarek@gmail.com
3786162aed3c3fcfc53373c963ac375d39a5dfa5a25ted.mielczarek@gmail.com  uint32_t thread_id;
379e721e628ec10381c96e38cfc82c1816983097165ted.mielczarek@gmail.com  ASSERT_TRUE(md_thread->GetThreadID(&thread_id));
380e721e628ec10381c96e38cfc82c1816983097165ted.mielczarek@gmail.com  ASSERT_EQ(0xa898f11bU, thread_id);
381e721e628ec10381c96e38cfc82c1816983097165ted.mielczarek@gmail.com  MinidumpMemoryRegion* md_stack = md_thread->GetMemory();
382e721e628ec10381c96e38cfc82c1816983097165ted.mielczarek@gmail.com  ASSERT_NE(reinterpret_cast<MinidumpMemoryRegion*>(NULL), md_stack);
383e721e628ec10381c96e38cfc82c1816983097165ted.mielczarek@gmail.com
384e721e628ec10381c96e38cfc82c1816983097165ted.mielczarek@gmail.com  MinidumpContext* md_context = md_thread->GetContext();
385e721e628ec10381c96e38cfc82c1816983097165ted.mielczarek@gmail.com  ASSERT_EQ(reinterpret_cast<MinidumpContext*>(NULL), md_context);
386e721e628ec10381c96e38cfc82c1816983097165ted.mielczarek@gmail.com}
387e721e628ec10381c96e38cfc82c1816983097165ted.mielczarek@gmail.com
3889244496c6f875ef1f7166d65f218d57ae92cabaajimblandyTEST(Dump, OneModule) {
3899244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  static const MDVSFixedFileInfo fixed_file_info = {
3909244496c6f875ef1f7166d65f218d57ae92cabaajimblandy    0xb2fba33a,                           // signature
3919244496c6f875ef1f7166d65f218d57ae92cabaajimblandy    0x33d7a728,                           // struct_version
3929244496c6f875ef1f7166d65f218d57ae92cabaajimblandy    0x31afcb20,                           // file_version_hi
3939244496c6f875ef1f7166d65f218d57ae92cabaajimblandy    0xe51cdab1,                           // file_version_lo
3949244496c6f875ef1f7166d65f218d57ae92cabaajimblandy    0xd1ea6907,                           // product_version_hi
3959244496c6f875ef1f7166d65f218d57ae92cabaajimblandy    0x03032857,                           // product_version_lo
3969244496c6f875ef1f7166d65f218d57ae92cabaajimblandy    0x11bf71d7,                           // file_flags_mask
3979244496c6f875ef1f7166d65f218d57ae92cabaajimblandy    0x5fb8cdbf,                           // file_flags
3989244496c6f875ef1f7166d65f218d57ae92cabaajimblandy    0xe45d0d5d,                           // file_os
3999244496c6f875ef1f7166d65f218d57ae92cabaajimblandy    0x107d9562,                           // file_type
4009244496c6f875ef1f7166d65f218d57ae92cabaajimblandy    0x5a8844d4,                           // file_subtype
4019244496c6f875ef1f7166d65f218d57ae92cabaajimblandy    0xa8d30b20,                           // file_date_hi
4029244496c6f875ef1f7166d65f218d57ae92cabaajimblandy    0x651c3e4e                            // file_date_lo
4039244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  };
4049244496c6f875ef1f7166d65f218d57ae92cabaajimblandy
4059244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  Dump dump(0, kBigEndian);
4069244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  String module_name(dump, "single module");
4079244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  Module module(dump, 0xa90206ca83eb2852ULL, 0xada542bd,
4089244496c6f875ef1f7166d65f218d57ae92cabaajimblandy                module_name,
4099244496c6f875ef1f7166d65f218d57ae92cabaajimblandy                0xb1054d2a,
4109244496c6f875ef1f7166d65f218d57ae92cabaajimblandy                0x34571371,
4119244496c6f875ef1f7166d65f218d57ae92cabaajimblandy                fixed_file_info, // from synth_minidump_unittest_data.h
4129244496c6f875ef1f7166d65f218d57ae92cabaajimblandy                NULL, NULL);
4130cbd50c975c1680a6cd0f1ce2760e157e2bfd46fted.mielczarek
4149244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  dump.Add(&module);
4159244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  dump.Add(&module_name);
4169244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  dump.Finish();
4179244496c6f875ef1f7166d65f218d57ae92cabaajimblandy
4189244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  string contents;
4199244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  ASSERT_TRUE(dump.GetContents(&contents));
4209244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  istringstream minidump_stream(contents);
4219244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  Minidump minidump(minidump_stream);
4229244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  ASSERT_TRUE(minidump.Read());
4239244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  ASSERT_EQ(1U, minidump.GetDirectoryEntryCount());
4249244496c6f875ef1f7166d65f218d57ae92cabaajimblandy
4259244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  const MDRawDirectory *dir = minidump.GetDirectoryEntryAtIndex(0);
4269244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  ASSERT_TRUE(dir != NULL);
4276162aed3c3fcfc53373c963ac375d39a5dfa5a25ted.mielczarek@gmail.com  EXPECT_EQ((uint32_t) MD_MODULE_LIST_STREAM, dir->stream_type);
4289244496c6f875ef1f7166d65f218d57ae92cabaajimblandy
4299244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  MinidumpModuleList *md_module_list = minidump.GetModuleList();
4309244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  ASSERT_TRUE(md_module_list != NULL);
4319244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  ASSERT_EQ(1U, md_module_list->module_count());
4329244496c6f875ef1f7166d65f218d57ae92cabaajimblandy
4339244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  const MinidumpModule *md_module = md_module_list->GetModuleAtIndex(0);
4349244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  ASSERT_TRUE(md_module != NULL);
4359244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  ASSERT_EQ(0xa90206ca83eb2852ULL, md_module->base_address());
4369244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  ASSERT_EQ(0xada542bd, md_module->size());
4379244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  ASSERT_EQ("single module", md_module->code_file());
4389244496c6f875ef1f7166d65f218d57ae92cabaajimblandy
4399244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  const MDRawModule *md_raw_module = md_module->module();
4409244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  ASSERT_TRUE(md_raw_module != NULL);
4419244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  ASSERT_EQ(0xb1054d2aU, md_raw_module->time_date_stamp);
4429244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  ASSERT_EQ(0x34571371U, md_raw_module->checksum);
4439244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  ASSERT_TRUE(memcmp(&md_raw_module->version_info, &fixed_file_info,
4449244496c6f875ef1f7166d65f218d57ae92cabaajimblandy                     sizeof(fixed_file_info)) == 0);
4459244496c6f875ef1f7166d65f218d57ae92cabaajimblandy}
4469244496c6f875ef1f7166d65f218d57ae92cabaajimblandy
4479244496c6f875ef1f7166d65f218d57ae92cabaajimblandyTEST(Dump, OneSystemInfo) {
4489244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  Dump dump(0, kLittleEndian);
4499244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  String csd_version(dump, "Petulant Pierogi");
4509244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  SystemInfo system_info(dump, SystemInfo::windows_x86, csd_version);
4519244496c6f875ef1f7166d65f218d57ae92cabaajimblandy
4529244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  dump.Add(&system_info);
4539244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  dump.Add(&csd_version);
4549244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  dump.Finish();
4559244496c6f875ef1f7166d65f218d57ae92cabaajimblandy
4569244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  string contents;
4579244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  ASSERT_TRUE(dump.GetContents(&contents));
4589244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  istringstream minidump_stream(contents);
4599244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  Minidump minidump(minidump_stream);
4609244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  ASSERT_TRUE(minidump.Read());
4619244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  ASSERT_EQ(1U, minidump.GetDirectoryEntryCount());
4629244496c6f875ef1f7166d65f218d57ae92cabaajimblandy
4639244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  const MDRawDirectory *dir = minidump.GetDirectoryEntryAtIndex(0);
4649244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  ASSERT_TRUE(dir != NULL);
4656162aed3c3fcfc53373c963ac375d39a5dfa5a25ted.mielczarek@gmail.com  EXPECT_EQ((uint32_t) MD_SYSTEM_INFO_STREAM, dir->stream_type);
4669244496c6f875ef1f7166d65f218d57ae92cabaajimblandy
4679244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  MinidumpSystemInfo *md_system_info = minidump.GetSystemInfo();
4689244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  ASSERT_TRUE(md_system_info != NULL);
4699244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  ASSERT_EQ("windows", md_system_info->GetOS());
4709244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  ASSERT_EQ("x86", md_system_info->GetCPU());
4719244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  ASSERT_EQ("Petulant Pierogi", *md_system_info->GetCSDVersion());
4729244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  ASSERT_EQ("GenuineIntel", *md_system_info->GetCPUVendor());
4739244496c6f875ef1f7166d65f218d57ae92cabaajimblandy}
4749244496c6f875ef1f7166d65f218d57ae92cabaajimblandy
4759244496c6f875ef1f7166d65f218d57ae92cabaajimblandyTEST(Dump, BigDump) {
4769244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  Dump dump(0, kLittleEndian);
4779244496c6f875ef1f7166d65f218d57ae92cabaajimblandy
4789244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  // A SystemInfo stream.
4799244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  String csd_version(dump, "Munificent Macaque");
4809244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  SystemInfo system_info(dump, SystemInfo::windows_x86, csd_version);
4819244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  dump.Add(&csd_version);
4829244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  dump.Add(&system_info);
4839244496c6f875ef1f7166d65f218d57ae92cabaajimblandy
4849244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  // Five threads!
4859244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  Memory stack0(dump, 0x70b9ebfc);
4869244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  stack0.Append("stack for thread zero");
4879244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  MDRawContextX86 raw_context0;
4889244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  raw_context0.context_flags = MD_CONTEXT_X86_INTEGER;
4899244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  raw_context0.eip = 0xaf0709e4;
4909244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  Context context0(dump, raw_context0);
4919244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  Thread thread0(dump, 0xbbef4432, stack0, context0,
4929244496c6f875ef1f7166d65f218d57ae92cabaajimblandy                 0xd0377e7b, 0xdb8eb0cf, 0xd73bc314, 0x09d357bac7f9a163ULL);
4939244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  dump.Add(&stack0);
4949244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  dump.Add(&context0);
4959244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  dump.Add(&thread0);
4969244496c6f875ef1f7166d65f218d57ae92cabaajimblandy
4979244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  Memory stack1(dump, 0xf988cc45);
4989244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  stack1.Append("stack for thread one");
4999244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  MDRawContextX86 raw_context1;
5009244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  raw_context1.context_flags = MD_CONTEXT_X86_INTEGER;
5019244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  raw_context1.eip = 0xe4f56f81;
5029244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  Context context1(dump, raw_context1);
5039244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  Thread thread1(dump, 0x657c3f58, stack1, context1,
5049244496c6f875ef1f7166d65f218d57ae92cabaajimblandy                 0xa68fa182, 0x6f3cf8dd, 0xe3a78ccf, 0x78cc84775e4534bbULL);
5059244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  dump.Add(&stack1);
5069244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  dump.Add(&context1);
5079244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  dump.Add(&thread1);
5089244496c6f875ef1f7166d65f218d57ae92cabaajimblandy
5099244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  Memory stack2(dump, 0xc8a92e7c);
5109244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  stack2.Append("stack for thread two");
5119244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  MDRawContextX86 raw_context2;
5129244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  raw_context2.context_flags = MD_CONTEXT_X86_INTEGER;
5139244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  raw_context2.eip = 0xb336a438;
5149244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  Context context2(dump, raw_context2);
5159244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  Thread thread2(dump, 0xdf4b8a71, stack2, context2,
5169244496c6f875ef1f7166d65f218d57ae92cabaajimblandy                 0x674c26b6, 0x445d7120, 0x7e700c56, 0xd89bf778e7793e17ULL);
5179244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  dump.Add(&stack2);
5189244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  dump.Add(&context2);
5199244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  dump.Add(&thread2);
5209244496c6f875ef1f7166d65f218d57ae92cabaajimblandy
5219244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  Memory stack3(dump, 0x36d08e08);
5229244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  stack3.Append("stack for thread three");
5239244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  MDRawContextX86 raw_context3;
5249244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  raw_context3.context_flags = MD_CONTEXT_X86_INTEGER;
5259244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  raw_context3.eip = 0xdf99a60c;
5269244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  Context context3(dump, raw_context3);
5279244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  Thread thread3(dump, 0x86e6c341, stack3, context3,
5289244496c6f875ef1f7166d65f218d57ae92cabaajimblandy                 0x32dc5c55, 0x17a2aba8, 0xe0cc75e7, 0xa46393994dae83aeULL);
5299244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  dump.Add(&stack3);
5309244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  dump.Add(&context3);
5319244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  dump.Add(&thread3);
5329244496c6f875ef1f7166d65f218d57ae92cabaajimblandy
5339244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  Memory stack4(dump, 0x1e0ab4fa);
5349244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  stack4.Append("stack for thread four");
5359244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  MDRawContextX86 raw_context4;
5369244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  raw_context4.context_flags = MD_CONTEXT_X86_INTEGER;
5379244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  raw_context4.eip = 0xaa646267;
5389244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  Context context4(dump, raw_context4);
5399244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  Thread thread4(dump, 0x261a28d4, stack4, context4,
5409244496c6f875ef1f7166d65f218d57ae92cabaajimblandy                 0x6ebd389e, 0xa0cd4759, 0x30168846, 0x164f650a0cf39d35ULL);
5419244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  dump.Add(&stack4);
5429244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  dump.Add(&context4);
5439244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  dump.Add(&thread4);
5449244496c6f875ef1f7166d65f218d57ae92cabaajimblandy
5459244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  // Three modules!
5469244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  String module1_name(dump, "module one");
5479244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  Module module1(dump, 0xeb77da57b5d4cbdaULL, 0x83cd5a37, module1_name);
5489244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  dump.Add(&module1_name);
5499244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  dump.Add(&module1);
5509244496c6f875ef1f7166d65f218d57ae92cabaajimblandy
5519244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  String module2_name(dump, "module two");
5529244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  Module module2(dump, 0x8675884adfe5ac90ULL, 0xb11e4ea3, module2_name);
5539244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  dump.Add(&module2_name);
5549244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  dump.Add(&module2);
5559244496c6f875ef1f7166d65f218d57ae92cabaajimblandy
5569244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  String module3_name(dump, "module three");
5579244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  Module module3(dump, 0x95fc1544da321b6cULL, 0x7c2bf081, module3_name);
5589244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  dump.Add(&module3_name);
5599244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  dump.Add(&module3);
5609244496c6f875ef1f7166d65f218d57ae92cabaajimblandy
5619244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  // Add one more memory region, on top of the five stacks.
5629244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  Memory memory5(dump, 0x61979e828040e564ULL);
5639244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  memory5.Append("contents of memory 5");
5649244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  dump.Add(&memory5);
5659244496c6f875ef1f7166d65f218d57ae92cabaajimblandy
5669244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  dump.Finish();
5679244496c6f875ef1f7166d65f218d57ae92cabaajimblandy
5689244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  string contents;
5699244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  ASSERT_TRUE(dump.GetContents(&contents));
5709244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  istringstream minidump_stream(contents);
5719244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  Minidump minidump(minidump_stream);
5729244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  ASSERT_TRUE(minidump.Read());
5739244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  ASSERT_EQ(4U, minidump.GetDirectoryEntryCount());
5749244496c6f875ef1f7166d65f218d57ae92cabaajimblandy
5759244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  // Check the threads.
5769244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  MinidumpThreadList *thread_list = minidump.GetThreadList();
5779244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  ASSERT_TRUE(thread_list != NULL);
5789244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  ASSERT_EQ(5U, thread_list->thread_count());
5796162aed3c3fcfc53373c963ac375d39a5dfa5a25ted.mielczarek@gmail.com  uint32_t thread_id;
5809244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  ASSERT_TRUE(thread_list->GetThreadAtIndex(0)->GetThreadID(&thread_id));
5819244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  ASSERT_EQ(0xbbef4432U, thread_id);
5829244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  ASSERT_EQ(0x70b9ebfcU,
5839244496c6f875ef1f7166d65f218d57ae92cabaajimblandy            thread_list->GetThreadAtIndex(0)->GetMemory()->GetBase());
5849244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  ASSERT_EQ(0xaf0709e4U,
5859244496c6f875ef1f7166d65f218d57ae92cabaajimblandy            thread_list->GetThreadAtIndex(0)->GetContext()->GetContextX86()
5869244496c6f875ef1f7166d65f218d57ae92cabaajimblandy            ->eip);
5879244496c6f875ef1f7166d65f218d57ae92cabaajimblandy
5889244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  ASSERT_TRUE(thread_list->GetThreadAtIndex(1)->GetThreadID(&thread_id));
5899244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  ASSERT_EQ(0x657c3f58U, thread_id);
5909244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  ASSERT_EQ(0xf988cc45U,
5919244496c6f875ef1f7166d65f218d57ae92cabaajimblandy            thread_list->GetThreadAtIndex(1)->GetMemory()->GetBase());
5929244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  ASSERT_EQ(0xe4f56f81U,
5939244496c6f875ef1f7166d65f218d57ae92cabaajimblandy            thread_list->GetThreadAtIndex(1)->GetContext()->GetContextX86()
5949244496c6f875ef1f7166d65f218d57ae92cabaajimblandy            ->eip);
5959244496c6f875ef1f7166d65f218d57ae92cabaajimblandy
5969244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  ASSERT_TRUE(thread_list->GetThreadAtIndex(2)->GetThreadID(&thread_id));
5979244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  ASSERT_EQ(0xdf4b8a71U, thread_id);
5989244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  ASSERT_EQ(0xc8a92e7cU,
5999244496c6f875ef1f7166d65f218d57ae92cabaajimblandy            thread_list->GetThreadAtIndex(2)->GetMemory()->GetBase());
6009244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  ASSERT_EQ(0xb336a438U,
6019244496c6f875ef1f7166d65f218d57ae92cabaajimblandy            thread_list->GetThreadAtIndex(2)->GetContext()->GetContextX86()
6029244496c6f875ef1f7166d65f218d57ae92cabaajimblandy            ->eip);
6039244496c6f875ef1f7166d65f218d57ae92cabaajimblandy
6049244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  ASSERT_TRUE(thread_list->GetThreadAtIndex(3)->GetThreadID(&thread_id));
6059244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  ASSERT_EQ(0x86e6c341U, thread_id);
6069244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  ASSERT_EQ(0x36d08e08U,
6079244496c6f875ef1f7166d65f218d57ae92cabaajimblandy            thread_list->GetThreadAtIndex(3)->GetMemory()->GetBase());
6089244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  ASSERT_EQ(0xdf99a60cU,
6099244496c6f875ef1f7166d65f218d57ae92cabaajimblandy            thread_list->GetThreadAtIndex(3)->GetContext()->GetContextX86()
6109244496c6f875ef1f7166d65f218d57ae92cabaajimblandy            ->eip);
6119244496c6f875ef1f7166d65f218d57ae92cabaajimblandy
6129244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  ASSERT_TRUE(thread_list->GetThreadAtIndex(4)->GetThreadID(&thread_id));
6139244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  ASSERT_EQ(0x261a28d4U, thread_id);
6149244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  ASSERT_EQ(0x1e0ab4faU,
6159244496c6f875ef1f7166d65f218d57ae92cabaajimblandy            thread_list->GetThreadAtIndex(4)->GetMemory()->GetBase());
6169244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  ASSERT_EQ(0xaa646267U,
6179244496c6f875ef1f7166d65f218d57ae92cabaajimblandy            thread_list->GetThreadAtIndex(4)->GetContext()->GetContextX86()
6189244496c6f875ef1f7166d65f218d57ae92cabaajimblandy            ->eip);
6199244496c6f875ef1f7166d65f218d57ae92cabaajimblandy
6209244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  // Check the modules.
6219244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  MinidumpModuleList *md_module_list = minidump.GetModuleList();
6229244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  ASSERT_TRUE(md_module_list != NULL);
6239244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  ASSERT_EQ(3U, md_module_list->module_count());
6249244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  EXPECT_EQ(0xeb77da57b5d4cbdaULL,
6259244496c6f875ef1f7166d65f218d57ae92cabaajimblandy            md_module_list->GetModuleAtIndex(0)->base_address());
6269244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  EXPECT_EQ(0x8675884adfe5ac90ULL,
6279244496c6f875ef1f7166d65f218d57ae92cabaajimblandy            md_module_list->GetModuleAtIndex(1)->base_address());
6289244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  EXPECT_EQ(0x95fc1544da321b6cULL,
6299244496c6f875ef1f7166d65f218d57ae92cabaajimblandy            md_module_list->GetModuleAtIndex(2)->base_address());
6300cbd50c975c1680a6cd0f1ce2760e157e2bfd46fted.mielczarek}
6319244496c6f875ef1f7166d65f218d57ae92cabaajimblandy
6327b8e2b7e090b2d1223d0944d1e7da1d4c571bb5dted.mielczarekTEST(Dump, OneMemoryInfo) {
6337b8e2b7e090b2d1223d0944d1e7da1d4c571bb5dted.mielczarek  Dump dump(0, kBigEndian);
6347b8e2b7e090b2d1223d0944d1e7da1d4c571bb5dted.mielczarek  Stream stream(dump, MD_MEMORY_INFO_LIST_STREAM);
6357b8e2b7e090b2d1223d0944d1e7da1d4c571bb5dted.mielczarek
6367b8e2b7e090b2d1223d0944d1e7da1d4c571bb5dted.mielczarek  // Add the MDRawMemoryInfoList header.
6376162aed3c3fcfc53373c963ac375d39a5dfa5a25ted.mielczarek@gmail.com  const uint64_t kNumberOfEntries = 1;
6387b8e2b7e090b2d1223d0944d1e7da1d4c571bb5dted.mielczarek  stream.D32(sizeof(MDRawMemoryInfoList))  // size_of_header
6397b8e2b7e090b2d1223d0944d1e7da1d4c571bb5dted.mielczarek        .D32(sizeof(MDRawMemoryInfo))      // size_of_entry
6407b8e2b7e090b2d1223d0944d1e7da1d4c571bb5dted.mielczarek        .D64(kNumberOfEntries);            // number_of_entries
6417b8e2b7e090b2d1223d0944d1e7da1d4c571bb5dted.mielczarek
6427b8e2b7e090b2d1223d0944d1e7da1d4c571bb5dted.mielczarek
6437b8e2b7e090b2d1223d0944d1e7da1d4c571bb5dted.mielczarek  // Now add a MDRawMemoryInfo entry.
6446162aed3c3fcfc53373c963ac375d39a5dfa5a25ted.mielczarek@gmail.com  const uint64_t kBaseAddress = 0x1000;
6456162aed3c3fcfc53373c963ac375d39a5dfa5a25ted.mielczarek@gmail.com  const uint64_t kRegionSize = 0x2000;
6467b8e2b7e090b2d1223d0944d1e7da1d4c571bb5dted.mielczarek  stream.D64(kBaseAddress)                         // base_address
6477b8e2b7e090b2d1223d0944d1e7da1d4c571bb5dted.mielczarek        .D64(kBaseAddress)                         // allocation_base
6487b8e2b7e090b2d1223d0944d1e7da1d4c571bb5dted.mielczarek        .D32(MD_MEMORY_PROTECT_EXECUTE_READWRITE)  // allocation_protection
6497b8e2b7e090b2d1223d0944d1e7da1d4c571bb5dted.mielczarek        .D32(0)                                    // __alignment1
6507b8e2b7e090b2d1223d0944d1e7da1d4c571bb5dted.mielczarek        .D64(kRegionSize)                          // region_size
6517b8e2b7e090b2d1223d0944d1e7da1d4c571bb5dted.mielczarek        .D32(MD_MEMORY_STATE_COMMIT)               // state
6527b8e2b7e090b2d1223d0944d1e7da1d4c571bb5dted.mielczarek        .D32(MD_MEMORY_PROTECT_EXECUTE_READWRITE)  // protection
6537b8e2b7e090b2d1223d0944d1e7da1d4c571bb5dted.mielczarek        .D32(MD_MEMORY_TYPE_PRIVATE)               // type
6547b8e2b7e090b2d1223d0944d1e7da1d4c571bb5dted.mielczarek        .D32(0);                                   // __alignment2
6557b8e2b7e090b2d1223d0944d1e7da1d4c571bb5dted.mielczarek
6567b8e2b7e090b2d1223d0944d1e7da1d4c571bb5dted.mielczarek  dump.Add(&stream);
6577b8e2b7e090b2d1223d0944d1e7da1d4c571bb5dted.mielczarek  dump.Finish();
6587b8e2b7e090b2d1223d0944d1e7da1d4c571bb5dted.mielczarek
6597b8e2b7e090b2d1223d0944d1e7da1d4c571bb5dted.mielczarek  string contents;
6607b8e2b7e090b2d1223d0944d1e7da1d4c571bb5dted.mielczarek  ASSERT_TRUE(dump.GetContents(&contents));
6617b8e2b7e090b2d1223d0944d1e7da1d4c571bb5dted.mielczarek  istringstream minidump_stream(contents);
6627b8e2b7e090b2d1223d0944d1e7da1d4c571bb5dted.mielczarek  Minidump minidump(minidump_stream);
6637b8e2b7e090b2d1223d0944d1e7da1d4c571bb5dted.mielczarek  ASSERT_TRUE(minidump.Read());
6647b8e2b7e090b2d1223d0944d1e7da1d4c571bb5dted.mielczarek  ASSERT_EQ(1U, minidump.GetDirectoryEntryCount());
6657b8e2b7e090b2d1223d0944d1e7da1d4c571bb5dted.mielczarek
6667b8e2b7e090b2d1223d0944d1e7da1d4c571bb5dted.mielczarek  const MDRawDirectory *dir = minidump.GetDirectoryEntryAtIndex(0);
6677b8e2b7e090b2d1223d0944d1e7da1d4c571bb5dted.mielczarek  ASSERT_TRUE(dir != NULL);
6686162aed3c3fcfc53373c963ac375d39a5dfa5a25ted.mielczarek@gmail.com  EXPECT_EQ((uint32_t) MD_MEMORY_INFO_LIST_STREAM, dir->stream_type);
6697b8e2b7e090b2d1223d0944d1e7da1d4c571bb5dted.mielczarek
6707b8e2b7e090b2d1223d0944d1e7da1d4c571bb5dted.mielczarek  MinidumpMemoryInfoList *info_list = minidump.GetMemoryInfoList();
6717b8e2b7e090b2d1223d0944d1e7da1d4c571bb5dted.mielczarek  ASSERT_TRUE(info_list != NULL);
6727b8e2b7e090b2d1223d0944d1e7da1d4c571bb5dted.mielczarek  ASSERT_EQ(1U, info_list->info_count());
6737b8e2b7e090b2d1223d0944d1e7da1d4c571bb5dted.mielczarek
6747b8e2b7e090b2d1223d0944d1e7da1d4c571bb5dted.mielczarek  const MinidumpMemoryInfo *info1 = info_list->GetMemoryInfoAtIndex(0);
6757b8e2b7e090b2d1223d0944d1e7da1d4c571bb5dted.mielczarek  ASSERT_EQ(kBaseAddress, info1->GetBase());
6767b8e2b7e090b2d1223d0944d1e7da1d4c571bb5dted.mielczarek  ASSERT_EQ(kRegionSize, info1->GetSize());
6777b8e2b7e090b2d1223d0944d1e7da1d4c571bb5dted.mielczarek  ASSERT_TRUE(info1->IsExecutable());
6787b8e2b7e090b2d1223d0944d1e7da1d4c571bb5dted.mielczarek  ASSERT_TRUE(info1->IsWritable());
6797b8e2b7e090b2d1223d0944d1e7da1d4c571bb5dted.mielczarek
6807b8e2b7e090b2d1223d0944d1e7da1d4c571bb5dted.mielczarek  // Should get back the same memory region here.
6817b8e2b7e090b2d1223d0944d1e7da1d4c571bb5dted.mielczarek  const MinidumpMemoryInfo *info2 =
6827b8e2b7e090b2d1223d0944d1e7da1d4c571bb5dted.mielczarek      info_list->GetMemoryInfoForAddress(kBaseAddress + kRegionSize / 2);
6837b8e2b7e090b2d1223d0944d1e7da1d4c571bb5dted.mielczarek  ASSERT_EQ(kBaseAddress, info2->GetBase());
6847b8e2b7e090b2d1223d0944d1e7da1d4c571bb5dted.mielczarek  ASSERT_EQ(kRegionSize, info2->GetSize());
6857b8e2b7e090b2d1223d0944d1e7da1d4c571bb5dted.mielczarek}
6867b8e2b7e090b2d1223d0944d1e7da1d4c571bb5dted.mielczarek
6871a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarekTEST(Dump, OneExceptionX86) {
6881a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  Dump dump(0, kLittleEndian);
6891a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek
6901a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  MDRawContextX86 raw_context;
6911a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  raw_context.context_flags = MD_CONTEXT_X86_INTEGER | MD_CONTEXT_X86_CONTROL;
6921a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  raw_context.edi = 0x3ecba80d;
6931a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  raw_context.esi = 0x382583b9;
6941a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  raw_context.ebx = 0x7fccc03f;
6951a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  raw_context.edx = 0xf62f8ec2;
6961a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  raw_context.ecx = 0x46a6a6a8;
6971a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  raw_context.eax = 0x6a5025e2;
6981a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  raw_context.ebp = 0xd9fabb4a;
6991a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  raw_context.eip = 0x6913f540;
7001a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  raw_context.cs = 0xbffe6eda;
7011a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  raw_context.eflags = 0xb2ce1e2d;
7021a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  raw_context.esp = 0x659caaa4;
7031a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  raw_context.ss = 0x2e951ef7;
7041a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  Context context(dump, raw_context);
7051a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek
7061a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  Exception exception(dump, context,
7071a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek                      0x1234abcd, // thread id
7081a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek                      0xdcba4321, // exception code
7091a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek                      0xf0e0d0c0, // exception flags
7101a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek                      0x0919a9b9c9d9e9f9ULL); // exception address
7111a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek
7121a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  dump.Add(&context);
7131a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  dump.Add(&exception);
7141a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  dump.Finish();
7151a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek
7161a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  string contents;
7171a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  ASSERT_TRUE(dump.GetContents(&contents));
7181a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek
7191a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  istringstream minidump_stream(contents);
7201a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  Minidump minidump(minidump_stream);
7211a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  ASSERT_TRUE(minidump.Read());
7221a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  ASSERT_EQ(1U, minidump.GetDirectoryEntryCount());
7231a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek
7241a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  MinidumpException *md_exception = minidump.GetException();
7251a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  ASSERT_TRUE(md_exception != NULL);
7261a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek
7276162aed3c3fcfc53373c963ac375d39a5dfa5a25ted.mielczarek@gmail.com  uint32_t thread_id;
7281a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  ASSERT_TRUE(md_exception->GetThreadID(&thread_id));
7292971a050754f48aaa807db47a29e0d0beddbdcf7ivan.penkov@gmail.com  ASSERT_EQ(0x1234abcdU, thread_id);
7301a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek
7311a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  const MDRawExceptionStream* raw_exception = md_exception->exception();
7321a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  ASSERT_TRUE(raw_exception != NULL);
7331a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  EXPECT_EQ(0xdcba4321, raw_exception->exception_record.exception_code);
7341a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  EXPECT_EQ(0xf0e0d0c0, raw_exception->exception_record.exception_flags);
7351a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  EXPECT_EQ(0x0919a9b9c9d9e9f9ULL,
7361a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek            raw_exception->exception_record.exception_address);
7371a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek
7381a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  MinidumpContext *md_context = md_exception->GetContext();
7391a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  ASSERT_TRUE(md_context != NULL);
7406162aed3c3fcfc53373c963ac375d39a5dfa5a25ted.mielczarek@gmail.com  ASSERT_EQ((uint32_t) MD_CONTEXT_X86, md_context->GetContextCPU());
7411a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  const MDRawContextX86 *md_raw_context = md_context->GetContextX86();
7421a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  ASSERT_TRUE(md_raw_context != NULL);
7436162aed3c3fcfc53373c963ac375d39a5dfa5a25ted.mielczarek@gmail.com  ASSERT_EQ((uint32_t) (MD_CONTEXT_X86_INTEGER | MD_CONTEXT_X86_CONTROL),
7441a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek            (md_raw_context->context_flags
7451a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek             & (MD_CONTEXT_X86_INTEGER | MD_CONTEXT_X86_CONTROL)));
7461a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  EXPECT_EQ(0x3ecba80dU, raw_context.edi);
7471a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  EXPECT_EQ(0x382583b9U, raw_context.esi);
7481a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  EXPECT_EQ(0x7fccc03fU, raw_context.ebx);
7491a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  EXPECT_EQ(0xf62f8ec2U, raw_context.edx);
7501a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  EXPECT_EQ(0x46a6a6a8U, raw_context.ecx);
7511a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  EXPECT_EQ(0x6a5025e2U, raw_context.eax);
7521a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  EXPECT_EQ(0xd9fabb4aU, raw_context.ebp);
7531a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  EXPECT_EQ(0x6913f540U, raw_context.eip);
7541a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  EXPECT_EQ(0xbffe6edaU, raw_context.cs);
7551a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  EXPECT_EQ(0xb2ce1e2dU, raw_context.eflags);
7561a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  EXPECT_EQ(0x659caaa4U, raw_context.esp);
7571a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  EXPECT_EQ(0x2e951ef7U, raw_context.ss);
7581a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek}
7591a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek
7601a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarekTEST(Dump, OneExceptionX86XState) {
7611a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  Dump dump(0, kLittleEndian);
7621a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek
7631a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  MDRawContextX86 raw_context;
7641a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  raw_context.context_flags = MD_CONTEXT_X86_INTEGER |
7651a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek    MD_CONTEXT_X86_CONTROL | MD_CONTEXT_X86_XSTATE;
7661a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  raw_context.edi = 0x3ecba80d;
7671a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  raw_context.esi = 0x382583b9;
7681a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  raw_context.ebx = 0x7fccc03f;
7691a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  raw_context.edx = 0xf62f8ec2;
7701a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  raw_context.ecx = 0x46a6a6a8;
7711a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  raw_context.eax = 0x6a5025e2;
7721a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  raw_context.ebp = 0xd9fabb4a;
7731a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  raw_context.eip = 0x6913f540;
7741a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  raw_context.cs = 0xbffe6eda;
7751a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  raw_context.eflags = 0xb2ce1e2d;
7761a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  raw_context.esp = 0x659caaa4;
7771a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  raw_context.ss = 0x2e951ef7;
7781a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  Context context(dump, raw_context);
7791a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek
7801a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  Exception exception(dump, context,
7811a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek                      0x1234abcd, // thread id
7821a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek                      0xdcba4321, // exception code
7831a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek                      0xf0e0d0c0, // exception flags
7841a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek                      0x0919a9b9c9d9e9f9ULL); // exception address
7851a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek
7861a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  dump.Add(&context);
7871a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  dump.Add(&exception);
7881a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  dump.Finish();
7891a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek
7901a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  string contents;
7911a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  ASSERT_TRUE(dump.GetContents(&contents));
7921a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek
7931a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  istringstream minidump_stream(contents);
7941a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  Minidump minidump(minidump_stream);
7951a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  ASSERT_TRUE(minidump.Read());
7961a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  ASSERT_EQ(1U, minidump.GetDirectoryEntryCount());
7971a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek
7981a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  MinidumpException *md_exception = minidump.GetException();
7991a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  ASSERT_TRUE(md_exception != NULL);
8001a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek
8016162aed3c3fcfc53373c963ac375d39a5dfa5a25ted.mielczarek@gmail.com  uint32_t thread_id;
8021a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  ASSERT_TRUE(md_exception->GetThreadID(&thread_id));
8032971a050754f48aaa807db47a29e0d0beddbdcf7ivan.penkov@gmail.com  ASSERT_EQ(0x1234abcdU, thread_id);
8041a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek
8051a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  const MDRawExceptionStream* raw_exception = md_exception->exception();
8061a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  ASSERT_TRUE(raw_exception != NULL);
8071a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  EXPECT_EQ(0xdcba4321, raw_exception->exception_record.exception_code);
8081a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  EXPECT_EQ(0xf0e0d0c0, raw_exception->exception_record.exception_flags);
8091a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  EXPECT_EQ(0x0919a9b9c9d9e9f9ULL,
8101a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek            raw_exception->exception_record.exception_address);
8111a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek
8121a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  MinidumpContext *md_context = md_exception->GetContext();
8131a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  ASSERT_TRUE(md_context != NULL);
8146162aed3c3fcfc53373c963ac375d39a5dfa5a25ted.mielczarek@gmail.com  ASSERT_EQ((uint32_t) MD_CONTEXT_X86, md_context->GetContextCPU());
8151a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  const MDRawContextX86 *md_raw_context = md_context->GetContextX86();
8161a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  ASSERT_TRUE(md_raw_context != NULL);
8176162aed3c3fcfc53373c963ac375d39a5dfa5a25ted.mielczarek@gmail.com  ASSERT_EQ((uint32_t) (MD_CONTEXT_X86_INTEGER | MD_CONTEXT_X86_CONTROL),
8181a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek            (md_raw_context->context_flags
8191a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek             & (MD_CONTEXT_X86_INTEGER | MD_CONTEXT_X86_CONTROL)));
8201a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  EXPECT_EQ(0x3ecba80dU, raw_context.edi);
8211a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  EXPECT_EQ(0x382583b9U, raw_context.esi);
8221a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  EXPECT_EQ(0x7fccc03fU, raw_context.ebx);
8231a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  EXPECT_EQ(0xf62f8ec2U, raw_context.edx);
8241a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  EXPECT_EQ(0x46a6a6a8U, raw_context.ecx);
8251a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  EXPECT_EQ(0x6a5025e2U, raw_context.eax);
8261a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  EXPECT_EQ(0xd9fabb4aU, raw_context.ebp);
8271a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  EXPECT_EQ(0x6913f540U, raw_context.eip);
8281a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  EXPECT_EQ(0xbffe6edaU, raw_context.cs);
8291a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  EXPECT_EQ(0xb2ce1e2dU, raw_context.eflags);
8301a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  EXPECT_EQ(0x659caaa4U, raw_context.esp);
8311a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  EXPECT_EQ(0x2e951ef7U, raw_context.ss);
8321a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek}
8331a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek
834233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com// Testing that the CPU type can be loaded from a system info stream when
835233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com// the CPU flags are missing from the context_flags of an exception record
836233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.comTEST(Dump, OneExceptionX86NoCPUFlags) {
837233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com  Dump dump(0, kLittleEndian);
838233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com
839233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com  MDRawContextX86 raw_context;
840233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com  // Intentionally not setting CPU type in the context_flags
841233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com  raw_context.context_flags = 0;
842233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com  raw_context.edi = 0x3ecba80d;
843233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com  raw_context.esi = 0x382583b9;
844233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com  raw_context.ebx = 0x7fccc03f;
845233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com  raw_context.edx = 0xf62f8ec2;
846233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com  raw_context.ecx = 0x46a6a6a8;
847233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com  raw_context.eax = 0x6a5025e2;
848233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com  raw_context.ebp = 0xd9fabb4a;
849233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com  raw_context.eip = 0x6913f540;
850233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com  raw_context.cs = 0xbffe6eda;
851233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com  raw_context.eflags = 0xb2ce1e2d;
852233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com  raw_context.esp = 0x659caaa4;
853233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com  raw_context.ss = 0x2e951ef7;
854233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com  Context context(dump, raw_context);
855233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com
856233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com  Exception exception(dump, context,
857233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com                      0x1234abcd, // thread id
858233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com                      0xdcba4321, // exception code
859233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com                      0xf0e0d0c0, // exception flags
860233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com                      0x0919a9b9c9d9e9f9ULL); // exception address
861233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com
862233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com  dump.Add(&context);
863233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com  dump.Add(&exception);
864233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com
865233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com  // Add system info.  This is needed as an alternative source for CPU type
866233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com  // information.  Note, that the CPU flags were intentionally skipped from
867233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com  // the context_flags and this alternative source is required.
868233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com  String csd_version(dump, "Service Pack 2");
869233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com  SystemInfo system_info(dump, SystemInfo::windows_x86, csd_version);
870233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com  dump.Add(&system_info);
871233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com  dump.Add(&csd_version);
872233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com
873233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com  dump.Finish();
874233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com
875233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com  string contents;
876233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com  ASSERT_TRUE(dump.GetContents(&contents));
877233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com
878233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com  istringstream minidump_stream(contents);
879233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com  Minidump minidump(minidump_stream);
880233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com  ASSERT_TRUE(minidump.Read());
881233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com  ASSERT_EQ(2U, minidump.GetDirectoryEntryCount());
882233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com
883233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com  MinidumpException *md_exception = minidump.GetException();
884233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com  ASSERT_TRUE(md_exception != NULL);
885233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com
8866162aed3c3fcfc53373c963ac375d39a5dfa5a25ted.mielczarek@gmail.com  uint32_t thread_id;
887233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com  ASSERT_TRUE(md_exception->GetThreadID(&thread_id));
888233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com  ASSERT_EQ(0x1234abcdU, thread_id);
889233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com
890233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com  const MDRawExceptionStream* raw_exception = md_exception->exception();
891233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com  ASSERT_TRUE(raw_exception != NULL);
892233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com  EXPECT_EQ(0xdcba4321, raw_exception->exception_record.exception_code);
893233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com  EXPECT_EQ(0xf0e0d0c0, raw_exception->exception_record.exception_flags);
894233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com  EXPECT_EQ(0x0919a9b9c9d9e9f9ULL,
895233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com            raw_exception->exception_record.exception_address);
896233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com
897233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com  MinidumpContext *md_context = md_exception->GetContext();
898233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com  ASSERT_TRUE(md_context != NULL);
899233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com
9006162aed3c3fcfc53373c963ac375d39a5dfa5a25ted.mielczarek@gmail.com  ASSERT_EQ((uint32_t) MD_CONTEXT_X86, md_context->GetContextCPU());
901233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com  const MDRawContextX86 *md_raw_context = md_context->GetContextX86();
902233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com  ASSERT_TRUE(md_raw_context != NULL);
903233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com
904233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com  // Even though the CPU flags were missing from the context_flags, the
905233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com  // GetContext call above is expected to load the missing CPU flags from the
906233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com  // system info stream and set the CPU type bits in context_flags.
9076162aed3c3fcfc53373c963ac375d39a5dfa5a25ted.mielczarek@gmail.com  ASSERT_EQ((uint32_t) (MD_CONTEXT_X86), md_raw_context->context_flags);
908233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com
909233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com  EXPECT_EQ(0x3ecba80dU, raw_context.edi);
910233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com  EXPECT_EQ(0x382583b9U, raw_context.esi);
911233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com  EXPECT_EQ(0x7fccc03fU, raw_context.ebx);
912233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com  EXPECT_EQ(0xf62f8ec2U, raw_context.edx);
913233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com  EXPECT_EQ(0x46a6a6a8U, raw_context.ecx);
914233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com  EXPECT_EQ(0x6a5025e2U, raw_context.eax);
915233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com  EXPECT_EQ(0xd9fabb4aU, raw_context.ebp);
916233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com  EXPECT_EQ(0x6913f540U, raw_context.eip);
917233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com  EXPECT_EQ(0xbffe6edaU, raw_context.cs);
918233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com  EXPECT_EQ(0xb2ce1e2dU, raw_context.eflags);
919233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com  EXPECT_EQ(0x659caaa4U, raw_context.esp);
920233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com  EXPECT_EQ(0x2e951ef7U, raw_context.ss);
921233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com}
922233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com
923233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com// This test covers a scenario where a dump contains an exception but the
924233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com// context record of the exception is missing the CPU type information in its
925233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com// context_flags.  The dump has no system info stream so it is imposible to
926233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com// deduce the CPU type, hence the context record is unusable.
927233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.comTEST(Dump, OneExceptionX86NoCPUFlagsNoSystemInfo) {
928233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com  Dump dump(0, kLittleEndian);
929233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com
930233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com  MDRawContextX86 raw_context;
931233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com  // Intentionally not setting CPU type in the context_flags
932233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com  raw_context.context_flags = 0;
933233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com  raw_context.edi = 0x3ecba80d;
934233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com  raw_context.esi = 0x382583b9;
935233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com  raw_context.ebx = 0x7fccc03f;
936233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com  raw_context.edx = 0xf62f8ec2;
937233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com  raw_context.ecx = 0x46a6a6a8;
938233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com  raw_context.eax = 0x6a5025e2;
939233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com  raw_context.ebp = 0xd9fabb4a;
940233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com  raw_context.eip = 0x6913f540;
941233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com  raw_context.cs = 0xbffe6eda;
942233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com  raw_context.eflags = 0xb2ce1e2d;
943233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com  raw_context.esp = 0x659caaa4;
944233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com  raw_context.ss = 0x2e951ef7;
945233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com  Context context(dump, raw_context);
946233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com
947233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com  Exception exception(dump, context,
948233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com                      0x1234abcd, // thread id
949233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com                      0xdcba4321, // exception code
950233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com                      0xf0e0d0c0, // exception flags
951233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com                      0x0919a9b9c9d9e9f9ULL); // exception address
952233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com
953233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com  dump.Add(&context);
954233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com  dump.Add(&exception);
955233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com  dump.Finish();
956233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com
957233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com  string contents;
958233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com  ASSERT_TRUE(dump.GetContents(&contents));
959233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com
960233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com  istringstream minidump_stream(contents);
961233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com  Minidump minidump(minidump_stream);
962233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com  ASSERT_TRUE(minidump.Read());
963233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com  ASSERT_EQ(1U, minidump.GetDirectoryEntryCount());
964233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com
965233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com  MinidumpException *md_exception = minidump.GetException();
966233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com  ASSERT_TRUE(md_exception != NULL);
967233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com
9686162aed3c3fcfc53373c963ac375d39a5dfa5a25ted.mielczarek@gmail.com  uint32_t thread_id;
969233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com  ASSERT_TRUE(md_exception->GetThreadID(&thread_id));
970233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com  ASSERT_EQ(0x1234abcdU, thread_id);
971233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com
972233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com  const MDRawExceptionStream* raw_exception = md_exception->exception();
973233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com  ASSERT_TRUE(raw_exception != NULL);
974233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com  EXPECT_EQ(0xdcba4321, raw_exception->exception_record.exception_code);
975233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com  EXPECT_EQ(0xf0e0d0c0, raw_exception->exception_record.exception_flags);
976233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com  EXPECT_EQ(0x0919a9b9c9d9e9f9ULL,
977233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com            raw_exception->exception_record.exception_address);
978233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com
979233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com  // The context record of the exception is unusable because the context_flags
980233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com  // don't have CPU type information and at the same time the minidump lacks
981233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com  // system info stream so it is impossible to deduce the CPU type.
982233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com  MinidumpContext *md_context = md_exception->GetContext();
983233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com  ASSERT_EQ(NULL, md_context);
984233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com}
985233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com
9861a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarekTEST(Dump, OneExceptionARM) {
9871a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  Dump dump(0, kLittleEndian);
9881a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek
9891a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  MDRawContextARM raw_context;
9901a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  raw_context.context_flags = MD_CONTEXT_ARM_INTEGER;
9911a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  raw_context.iregs[0] = 0x3ecba80d;
9921a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  raw_context.iregs[1] = 0x382583b9;
9931a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  raw_context.iregs[2] = 0x7fccc03f;
9941a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  raw_context.iregs[3] = 0xf62f8ec2;
9951a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  raw_context.iregs[4] = 0x46a6a6a8;
9961a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  raw_context.iregs[5] = 0x6a5025e2;
9971a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  raw_context.iregs[6] = 0xd9fabb4a;
9981a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  raw_context.iregs[7] = 0x6913f540;
9991a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  raw_context.iregs[8] = 0xbffe6eda;
10001a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  raw_context.iregs[9] = 0xb2ce1e2d;
10011a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  raw_context.iregs[10] = 0x659caaa4;
10021a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  raw_context.iregs[11] = 0xf0e0d0c0;
10031a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  raw_context.iregs[12] = 0xa9b8c7d6;
10041a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  raw_context.iregs[13] = 0x12345678;
10051a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  raw_context.iregs[14] = 0xabcd1234;
10061a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  raw_context.iregs[15] = 0x10203040;
10071a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  raw_context.cpsr = 0x2e951ef7;
10081a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  Context context(dump, raw_context);
10091a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek
10101a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  Exception exception(dump, context,
10111a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek                      0x1234abcd, // thread id
10121a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek                      0xdcba4321, // exception code
10131a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek                      0xf0e0d0c0, // exception flags
10141a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek                      0x0919a9b9c9d9e9f9ULL); // exception address
10151a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek
10161a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  dump.Add(&context);
10171a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  dump.Add(&exception);
10181a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  dump.Finish();
10191a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek
10201a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  string contents;
10211a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  ASSERT_TRUE(dump.GetContents(&contents));
10221a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek
10231a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  istringstream minidump_stream(contents);
10241a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  Minidump minidump(minidump_stream);
10251a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  ASSERT_TRUE(minidump.Read());
10261a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  ASSERT_EQ(1U, minidump.GetDirectoryEntryCount());
10271a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek
10281a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  MinidumpException *md_exception = minidump.GetException();
10291a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  ASSERT_TRUE(md_exception != NULL);
10301a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek
10316162aed3c3fcfc53373c963ac375d39a5dfa5a25ted.mielczarek@gmail.com  uint32_t thread_id;
10321a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  ASSERT_TRUE(md_exception->GetThreadID(&thread_id));
10332971a050754f48aaa807db47a29e0d0beddbdcf7ivan.penkov@gmail.com  ASSERT_EQ(0x1234abcdU, thread_id);
10341a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek
10351a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  const MDRawExceptionStream* raw_exception = md_exception->exception();
10361a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  ASSERT_TRUE(raw_exception != NULL);
10371a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  EXPECT_EQ(0xdcba4321, raw_exception->exception_record.exception_code);
10381a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  EXPECT_EQ(0xf0e0d0c0, raw_exception->exception_record.exception_flags);
10391a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  EXPECT_EQ(0x0919a9b9c9d9e9f9ULL,
10401a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek            raw_exception->exception_record.exception_address);
10411a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek
10421a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  MinidumpContext *md_context = md_exception->GetContext();
10431a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  ASSERT_TRUE(md_context != NULL);
10446162aed3c3fcfc53373c963ac375d39a5dfa5a25ted.mielczarek@gmail.com  ASSERT_EQ((uint32_t) MD_CONTEXT_ARM, md_context->GetContextCPU());
10451a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  const MDRawContextARM *md_raw_context = md_context->GetContextARM();
10461a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  ASSERT_TRUE(md_raw_context != NULL);
10476162aed3c3fcfc53373c963ac375d39a5dfa5a25ted.mielczarek@gmail.com  ASSERT_EQ((uint32_t) MD_CONTEXT_ARM_INTEGER,
10481a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek            (md_raw_context->context_flags
10491a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek             & MD_CONTEXT_ARM_INTEGER));
10501a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  EXPECT_EQ(0x3ecba80dU, raw_context.iregs[0]);
10511a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  EXPECT_EQ(0x382583b9U, raw_context.iregs[1]);
10521a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  EXPECT_EQ(0x7fccc03fU, raw_context.iregs[2]);
10531a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  EXPECT_EQ(0xf62f8ec2U, raw_context.iregs[3]);
10541a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  EXPECT_EQ(0x46a6a6a8U, raw_context.iregs[4]);
10551a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  EXPECT_EQ(0x6a5025e2U, raw_context.iregs[5]);
10561a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  EXPECT_EQ(0xd9fabb4aU, raw_context.iregs[6]);
10571a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  EXPECT_EQ(0x6913f540U, raw_context.iregs[7]);
10581a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  EXPECT_EQ(0xbffe6edaU, raw_context.iregs[8]);
10591a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  EXPECT_EQ(0xb2ce1e2dU, raw_context.iregs[9]);
10601a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  EXPECT_EQ(0x659caaa4U, raw_context.iregs[10]);
10611a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  EXPECT_EQ(0xf0e0d0c0U, raw_context.iregs[11]);
10621a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  EXPECT_EQ(0xa9b8c7d6U, raw_context.iregs[12]);
10631a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  EXPECT_EQ(0x12345678U, raw_context.iregs[13]);
10641a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  EXPECT_EQ(0xabcd1234U, raw_context.iregs[14]);
10651a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  EXPECT_EQ(0x10203040U, raw_context.iregs[15]);
10661a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  EXPECT_EQ(0x2e951ef7U, raw_context.cpsr);
10671a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek}
10681a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek
10691a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarekTEST(Dump, OneExceptionARMOldFlags) {
10701a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  Dump dump(0, kLittleEndian);
10711a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek
10721a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  MDRawContextARM raw_context;
10731a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  // MD_CONTEXT_ARM_INTEGER, but with _OLD
10741a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  raw_context.context_flags = MD_CONTEXT_ARM_OLD | 0x00000002;
10751a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  raw_context.iregs[0] = 0x3ecba80d;
10761a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  raw_context.iregs[1] = 0x382583b9;
10771a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  raw_context.iregs[2] = 0x7fccc03f;
10781a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  raw_context.iregs[3] = 0xf62f8ec2;
10791a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  raw_context.iregs[4] = 0x46a6a6a8;
10801a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  raw_context.iregs[5] = 0x6a5025e2;
10811a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  raw_context.iregs[6] = 0xd9fabb4a;
10821a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  raw_context.iregs[7] = 0x6913f540;
10831a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  raw_context.iregs[8] = 0xbffe6eda;
10841a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  raw_context.iregs[9] = 0xb2ce1e2d;
10851a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  raw_context.iregs[10] = 0x659caaa4;
10861a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  raw_context.iregs[11] = 0xf0e0d0c0;
10871a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  raw_context.iregs[12] = 0xa9b8c7d6;
10881a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  raw_context.iregs[13] = 0x12345678;
10891a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  raw_context.iregs[14] = 0xabcd1234;
10901a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  raw_context.iregs[15] = 0x10203040;
10911a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  raw_context.cpsr = 0x2e951ef7;
10921a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  Context context(dump, raw_context);
10931a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek
10941a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  Exception exception(dump, context,
10951a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek                      0x1234abcd, // thread id
10961a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek                      0xdcba4321, // exception code
10971a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek                      0xf0e0d0c0, // exception flags
10981a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek                      0x0919a9b9c9d9e9f9ULL); // exception address
10991a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek
11001a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  dump.Add(&context);
11011a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  dump.Add(&exception);
11021a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  dump.Finish();
11031a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek
11041a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  string contents;
11051a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  ASSERT_TRUE(dump.GetContents(&contents));
11061a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek
11071a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  istringstream minidump_stream(contents);
11081a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  Minidump minidump(minidump_stream);
11091a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  ASSERT_TRUE(minidump.Read());
11101a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  ASSERT_EQ(1U, minidump.GetDirectoryEntryCount());
11111a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek
11121a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  MinidumpException *md_exception = minidump.GetException();
11131a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  ASSERT_TRUE(md_exception != NULL);
11141a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek
11156162aed3c3fcfc53373c963ac375d39a5dfa5a25ted.mielczarek@gmail.com  uint32_t thread_id;
11161a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  ASSERT_TRUE(md_exception->GetThreadID(&thread_id));
11172971a050754f48aaa807db47a29e0d0beddbdcf7ivan.penkov@gmail.com  ASSERT_EQ(0x1234abcdU, thread_id);
11181a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek
11191a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  const MDRawExceptionStream* raw_exception = md_exception->exception();
11201a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  ASSERT_TRUE(raw_exception != NULL);
11211a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  EXPECT_EQ(0xdcba4321, raw_exception->exception_record.exception_code);
11221a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  EXPECT_EQ(0xf0e0d0c0, raw_exception->exception_record.exception_flags);
11231a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  EXPECT_EQ(0x0919a9b9c9d9e9f9ULL,
11241a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek            raw_exception->exception_record.exception_address);
11251a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek
11261a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  MinidumpContext *md_context = md_exception->GetContext();
11271a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  ASSERT_TRUE(md_context != NULL);
11286162aed3c3fcfc53373c963ac375d39a5dfa5a25ted.mielczarek@gmail.com  ASSERT_EQ((uint32_t) MD_CONTEXT_ARM, md_context->GetContextCPU());
11291a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  const MDRawContextARM *md_raw_context = md_context->GetContextARM();
11301a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  ASSERT_TRUE(md_raw_context != NULL);
11316162aed3c3fcfc53373c963ac375d39a5dfa5a25ted.mielczarek@gmail.com  ASSERT_EQ((uint32_t) MD_CONTEXT_ARM_INTEGER,
11321a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek            (md_raw_context->context_flags
11331a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek             & MD_CONTEXT_ARM_INTEGER));
11341a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  EXPECT_EQ(0x3ecba80dU, raw_context.iregs[0]);
11351a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  EXPECT_EQ(0x382583b9U, raw_context.iregs[1]);
11361a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  EXPECT_EQ(0x7fccc03fU, raw_context.iregs[2]);
11371a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  EXPECT_EQ(0xf62f8ec2U, raw_context.iregs[3]);
11381a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  EXPECT_EQ(0x46a6a6a8U, raw_context.iregs[4]);
11391a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  EXPECT_EQ(0x6a5025e2U, raw_context.iregs[5]);
11401a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  EXPECT_EQ(0xd9fabb4aU, raw_context.iregs[6]);
11411a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  EXPECT_EQ(0x6913f540U, raw_context.iregs[7]);
11421a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  EXPECT_EQ(0xbffe6edaU, raw_context.iregs[8]);
11431a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  EXPECT_EQ(0xb2ce1e2dU, raw_context.iregs[9]);
11441a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  EXPECT_EQ(0x659caaa4U, raw_context.iregs[10]);
11451a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  EXPECT_EQ(0xf0e0d0c0U, raw_context.iregs[11]);
11461a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  EXPECT_EQ(0xa9b8c7d6U, raw_context.iregs[12]);
11471a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  EXPECT_EQ(0x12345678U, raw_context.iregs[13]);
11481a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  EXPECT_EQ(0xabcd1234U, raw_context.iregs[14]);
11491a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  EXPECT_EQ(0x10203040U, raw_context.iregs[15]);
11501a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  EXPECT_EQ(0x2e951ef7U, raw_context.cpsr);
11511a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek}
11521a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek
11535f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.comTEST(Dump, OneExceptionMIPS) {
11545f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com  Dump dump(0, kLittleEndian);
11555f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com
11565f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com  MDRawContextMIPS raw_context;
11575f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com  raw_context.context_flags = MD_CONTEXT_MIPS_INTEGER;
11585f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com  raw_context.iregs[0] = 0x3ecba80d;
11595f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com  raw_context.iregs[1] = 0x382583b9;
11605f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com  raw_context.iregs[2] = 0x7fccc03f;
11615f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com  raw_context.iregs[3] = 0xf62f8ec2;
11625f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com  raw_context.iregs[4] = 0x46a6a6a8;
11635f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com  raw_context.iregs[5] = 0x6a5025e2;
11645f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com  raw_context.iregs[6] = 0xd9fabb4a;
11655f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com  raw_context.iregs[7] = 0x6913f540;
11665f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com  raw_context.iregs[8] = 0xbffe6eda;
11675f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com  raw_context.iregs[9] = 0xb2ce1e2d;
11685f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com  raw_context.iregs[10] = 0x659caaa4;
11695f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com  raw_context.iregs[11] = 0xf0e0d0c0;
11705f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com  raw_context.iregs[12] = 0xa9b8c7d6;
11715f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com  raw_context.iregs[13] = 0x12345678;
11725f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com  raw_context.iregs[14] = 0xabcd1234;
11735f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com  raw_context.iregs[15] = 0x10203040;
11745f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com  raw_context.iregs[16] = 0xa80d3ecb;
11755f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com  raw_context.iregs[17] = 0x83b93825;
11765f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com  raw_context.iregs[18] = 0xc03f7fcc;
11775f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com  raw_context.iregs[19] = 0x8ec2f62f;
11785f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com  raw_context.iregs[20] = 0xa6a846a6;
11795f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com  raw_context.iregs[21] = 0x25e26a50;
11805f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com  raw_context.iregs[22] = 0xbb4ad9fa;
11815f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com  raw_context.iregs[23] = 0xf5406913;
11825f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com  raw_context.iregs[24] = 0x6edabffe;
11835f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com  raw_context.iregs[25] = 0x1e2db2ce;
11845f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com  raw_context.iregs[26] = 0xaaa4659c;
11855f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com  raw_context.iregs[27] = 0xd0c0f0e0;
11865f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com  raw_context.iregs[28] = 0xc7d6a9b8;
11875f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com  raw_context.iregs[29] = 0x56781234;
11885f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com  raw_context.iregs[30] = 0x1234abcd;
11895f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com  raw_context.iregs[31] = 0x30401020;
11905f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com
11915f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com  Context context(dump, raw_context);
11925f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com
11935f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com  Exception exception(dump, context,
11945f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com                      0x1234abcd,  // Thread id.
11955f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com                      0xdcba4321,  // Exception code.
11965f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com                      0xf0e0d0c0,  // Exception flags.
11975f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com                      0x0919a9b9); // Exception address.
11985f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com
11995f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com  dump.Add(&context);
12005f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com  dump.Add(&exception);
12015f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com  dump.Finish();
12025f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com
12035f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com  string contents;
12045f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com  ASSERT_TRUE(dump.GetContents(&contents));
12055f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com
12065f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com  istringstream minidump_stream(contents);
12075f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com  Minidump minidump(minidump_stream);
12085f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com  ASSERT_TRUE(minidump.Read());
12095f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com  ASSERT_EQ(1U, minidump.GetDirectoryEntryCount());
12105f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com
12115f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com  MinidumpException *md_exception = minidump.GetException();
12125f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com  ASSERT_TRUE(md_exception != NULL);
12135f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com
12145f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com  uint32_t thread_id;
12155f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com  ASSERT_TRUE(md_exception->GetThreadID(&thread_id));
12165f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com  ASSERT_EQ(0x1234abcdU, thread_id);
12175f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com
12185f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com  const MDRawExceptionStream* raw_exception = md_exception->exception();
12195f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com  ASSERT_TRUE(raw_exception != NULL);
12205f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com  EXPECT_EQ(0xdcba4321, raw_exception->exception_record.exception_code);
12215f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com  EXPECT_EQ(0xf0e0d0c0, raw_exception->exception_record.exception_flags);
12225f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com  EXPECT_EQ(0x0919a9b9U,
12235f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com            raw_exception->exception_record.exception_address);
12245f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com
12255f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com  MinidumpContext* md_context = md_exception->GetContext();
12265f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com  ASSERT_TRUE(md_context != NULL);
12275f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com  ASSERT_EQ((uint32_t) MD_CONTEXT_MIPS, md_context->GetContextCPU());
12285f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com  const MDRawContextMIPS* md_raw_context = md_context->GetContextMIPS();
12295f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com  ASSERT_TRUE(md_raw_context != NULL);
12305f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com  ASSERT_EQ((uint32_t) MD_CONTEXT_MIPS_INTEGER,
12315f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com            (md_raw_context->context_flags & MD_CONTEXT_MIPS_INTEGER));
12325f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com  EXPECT_EQ(0x3ecba80dU, raw_context.iregs[0]);
12335f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com  EXPECT_EQ(0x382583b9U, raw_context.iregs[1]);
12345f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com  EXPECT_EQ(0x7fccc03fU, raw_context.iregs[2]);
12355f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com  EXPECT_EQ(0xf62f8ec2U, raw_context.iregs[3]);
12365f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com  EXPECT_EQ(0x46a6a6a8U, raw_context.iregs[4]);
12375f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com  EXPECT_EQ(0x6a5025e2U, raw_context.iregs[5]);
12385f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com  EXPECT_EQ(0xd9fabb4aU, raw_context.iregs[6]);
12395f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com  EXPECT_EQ(0x6913f540U, raw_context.iregs[7]);
12405f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com  EXPECT_EQ(0xbffe6edaU, raw_context.iregs[8]);
12415f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com  EXPECT_EQ(0xb2ce1e2dU, raw_context.iregs[9]);
12425f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com  EXPECT_EQ(0x659caaa4U, raw_context.iregs[10]);
12435f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com  EXPECT_EQ(0xf0e0d0c0U, raw_context.iregs[11]);
12445f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com  EXPECT_EQ(0xa9b8c7d6U, raw_context.iregs[12]);
12455f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com  EXPECT_EQ(0x12345678U, raw_context.iregs[13]);
12465f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com  EXPECT_EQ(0xabcd1234U, raw_context.iregs[14]);
12475f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com  EXPECT_EQ(0x10203040U, raw_context.iregs[15]);
12485f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com  EXPECT_EQ(0xa80d3ecbU, raw_context.iregs[16]);
12495f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com  EXPECT_EQ(0x83b93825U, raw_context.iregs[17]);
12505f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com  EXPECT_EQ(0xc03f7fccU, raw_context.iregs[18]);
12515f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com  EXPECT_EQ(0x8ec2f62fU, raw_context.iregs[19]);
12525f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com  EXPECT_EQ(0xa6a846a6U, raw_context.iregs[20]);
12535f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com  EXPECT_EQ(0x25e26a50U, raw_context.iregs[21]);
12545f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com  EXPECT_EQ(0xbb4ad9faU, raw_context.iregs[22]);
12555f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com  EXPECT_EQ(0xf5406913U, raw_context.iregs[23]);
12565f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com  EXPECT_EQ(0x6edabffeU, raw_context.iregs[24]);
12575f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com  EXPECT_EQ(0x1e2db2ceU, raw_context.iregs[25]);
12585f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com  EXPECT_EQ(0xaaa4659cU, raw_context.iregs[26]);
12595f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com  EXPECT_EQ(0xd0c0f0e0U, raw_context.iregs[27]);
12605f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com  EXPECT_EQ(0xc7d6a9b8U, raw_context.iregs[28]);
12615f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com  EXPECT_EQ(0x56781234U, raw_context.iregs[29]);
12625f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com  EXPECT_EQ(0x1234abcdU, raw_context.iregs[30]);
12635f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com  EXPECT_EQ(0x30401020U, raw_context.iregs[31]);
12645f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com}
12655f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com
12669244496c6f875ef1f7166d65f218d57ae92cabaajimblandy}  // namespace
1267