minidump_processor_unittest.cc revision 2ad976ef0ba44f36842b9b7a11848f6b40fd25d5
17daf246e4baf0837e25429668cc23e92b6afe3b3mmentovai// Copyright (c) 2006, Google Inc.
27daf246e4baf0837e25429668cc23e92b6afe3b3mmentovai// All rights reserved.
3cce3492afc263be86236600d41dca40be7224ee7bryner//
47daf246e4baf0837e25429668cc23e92b6afe3b3mmentovai// Redistribution and use in source and binary forms, with or without
57daf246e4baf0837e25429668cc23e92b6afe3b3mmentovai// modification, are permitted provided that the following conditions are
67daf246e4baf0837e25429668cc23e92b6afe3b3mmentovai// met:
7cce3492afc263be86236600d41dca40be7224ee7bryner//
87daf246e4baf0837e25429668cc23e92b6afe3b3mmentovai//     * Redistributions of source code must retain the above copyright
97daf246e4baf0837e25429668cc23e92b6afe3b3mmentovai// notice, this list of conditions and the following disclaimer.
107daf246e4baf0837e25429668cc23e92b6afe3b3mmentovai//     * Redistributions in binary form must reproduce the above
117daf246e4baf0837e25429668cc23e92b6afe3b3mmentovai// copyright notice, this list of conditions and the following disclaimer
127daf246e4baf0837e25429668cc23e92b6afe3b3mmentovai// in the documentation and/or other materials provided with the
137daf246e4baf0837e25429668cc23e92b6afe3b3mmentovai// distribution.
147daf246e4baf0837e25429668cc23e92b6afe3b3mmentovai//     * Neither the name of Google Inc. nor the names of its
157daf246e4baf0837e25429668cc23e92b6afe3b3mmentovai// contributors may be used to endorse or promote products derived from
167daf246e4baf0837e25429668cc23e92b6afe3b3mmentovai// this software without specific prior written permission.
17cce3492afc263be86236600d41dca40be7224ee7bryner//
187daf246e4baf0837e25429668cc23e92b6afe3b3mmentovai// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
197daf246e4baf0837e25429668cc23e92b6afe3b3mmentovai// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
207daf246e4baf0837e25429668cc23e92b6afe3b3mmentovai// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
217daf246e4baf0837e25429668cc23e92b6afe3b3mmentovai// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
227daf246e4baf0837e25429668cc23e92b6afe3b3mmentovai// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
237daf246e4baf0837e25429668cc23e92b6afe3b3mmentovai// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
247daf246e4baf0837e25429668cc23e92b6afe3b3mmentovai// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
257daf246e4baf0837e25429668cc23e92b6afe3b3mmentovai// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
267daf246e4baf0837e25429668cc23e92b6afe3b3mmentovai// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
277daf246e4baf0837e25429668cc23e92b6afe3b3mmentovai// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
287daf246e4baf0837e25429668cc23e92b6afe3b3mmentovai// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29cce3492afc263be86236600d41dca40be7224ee7bryner
30cce3492afc263be86236600d41dca40be7224ee7bryner// Unit test for MinidumpProcessor.  Uses a pre-generated minidump and
31cce3492afc263be86236600d41dca40be7224ee7bryner// corresponding symbol file, and checks the stack frames for correctness.
32cce3492afc263be86236600d41dca40be7224ee7bryner
3397d392dc4b60f0099cd7ad8c8a5f06581a532392mmentovai#include <cstdlib>
34cce3492afc263be86236600d41dca40be7224ee7bryner#include <string>
352ad976ef0ba44f36842b9b7a11848f6b40fd25d5nealsid#include <iostream>
362ad976ef0ba44f36842b9b7a11848f6b40fd25d5nealsid#include <fstream>
37e5dc60822e5938fea2ae892ccddb906641ba174emmentovai#include "google_breakpad/processor/basic_source_line_resolver.h"
38e5dc60822e5938fea2ae892ccddb906641ba174emmentovai#include "google_breakpad/processor/call_stack.h"
39e5dc60822e5938fea2ae892ccddb906641ba174emmentovai#include "google_breakpad/processor/code_module.h"
40e5dc60822e5938fea2ae892ccddb906641ba174emmentovai#include "google_breakpad/processor/code_modules.h"
41e5dc60822e5938fea2ae892ccddb906641ba174emmentovai#include "google_breakpad/processor/minidump_processor.h"
42e5dc60822e5938fea2ae892ccddb906641ba174emmentovai#include "google_breakpad/processor/process_state.h"
43e5dc60822e5938fea2ae892ccddb906641ba174emmentovai#include "google_breakpad/processor/stack_frame.h"
44e5dc60822e5938fea2ae892ccddb906641ba174emmentovai#include "google_breakpad/processor/symbol_supplier.h"
4532b802dba3d49880a0414d066e71cdc20ab09901mmentovai#include "processor/logging.h"
462466d8e993a800a17e00deda2f3a27e0505140e1mmentovai#include "processor/scoped_ptr.h"
47cce3492afc263be86236600d41dca40be7224ee7bryner
488647dde8cc03ef16b565dccc75574ee5f0d9cf72mmentovainamespace {
498647dde8cc03ef16b565dccc75574ee5f0d9cf72mmentovai
50cce3492afc263be86236600d41dca40be7224ee7brynerusing std::string;
51e5dc60822e5938fea2ae892ccddb906641ba174emmentovaiusing google_breakpad::BasicSourceLineResolver;
52e5dc60822e5938fea2ae892ccddb906641ba174emmentovaiusing google_breakpad::CallStack;
53e5dc60822e5938fea2ae892ccddb906641ba174emmentovaiusing google_breakpad::CodeModule;
54e5dc60822e5938fea2ae892ccddb906641ba174emmentovaiusing google_breakpad::MinidumpProcessor;
55e5dc60822e5938fea2ae892ccddb906641ba174emmentovaiusing google_breakpad::ProcessState;
56e5dc60822e5938fea2ae892ccddb906641ba174emmentovaiusing google_breakpad::scoped_ptr;
57e5dc60822e5938fea2ae892ccddb906641ba174emmentovaiusing google_breakpad::SymbolSupplier;
58e5dc60822e5938fea2ae892ccddb906641ba174emmentovaiusing google_breakpad::SystemInfo;
5997d392dc4b60f0099cd7ad8c8a5f06581a532392mmentovai
6097d392dc4b60f0099cd7ad8c8a5f06581a532392mmentovaistatic const char *kSystemInfoOS = "Windows NT";
6197d392dc4b60f0099cd7ad8c8a5f06581a532392mmentovaistatic const char *kSystemInfoOSShort = "windows";
6297d392dc4b60f0099cd7ad8c8a5f06581a532392mmentovaistatic const char *kSystemInfoOSVersion = "5.1.2600 Service Pack 2";
6397d392dc4b60f0099cd7ad8c8a5f06581a532392mmentovaistatic const char *kSystemInfoCPU = "x86";
6497d392dc4b60f0099cd7ad8c8a5f06581a532392mmentovaistatic const char *kSystemInfoCPUInfo =
6597d392dc4b60f0099cd7ad8c8a5f06581a532392mmentovai    "GenuineIntel family 6 model 13 stepping 8";
66cce3492afc263be86236600d41dca40be7224ee7bryner
67cce3492afc263be86236600d41dca40be7224ee7bryner#define ASSERT_TRUE(cond) \
68cce3492afc263be86236600d41dca40be7224ee7bryner  if (!(cond)) {                                                        \
69cce3492afc263be86236600d41dca40be7224ee7bryner    fprintf(stderr, "FAILED: %s at %s:%d\n", #cond, __FILE__, __LINE__); \
70cce3492afc263be86236600d41dca40be7224ee7bryner    return false; \
71cce3492afc263be86236600d41dca40be7224ee7bryner  }
72cce3492afc263be86236600d41dca40be7224ee7bryner
73db3342a10ec30902aa9018b80e1d9a40bd01c487mmentovai#define ASSERT_FALSE(cond) ASSERT_TRUE(!(cond))
74db3342a10ec30902aa9018b80e1d9a40bd01c487mmentovai
75cce3492afc263be86236600d41dca40be7224ee7bryner#define ASSERT_EQ(e1, e2) ASSERT_TRUE((e1) == (e2))
76cce3492afc263be86236600d41dca40be7224ee7bryner
7797d392dc4b60f0099cd7ad8c8a5f06581a532392mmentovai// Use ASSERT_*_ABORT in functions that can't return a boolean.
7897d392dc4b60f0099cd7ad8c8a5f06581a532392mmentovai#define ASSERT_TRUE_ABORT(cond) \
7997d392dc4b60f0099cd7ad8c8a5f06581a532392mmentovai  if (!(cond)) {                                                        \
8097d392dc4b60f0099cd7ad8c8a5f06581a532392mmentovai    fprintf(stderr, "FAILED: %s at %s:%d\n", #cond, __FILE__, __LINE__); \
8197d392dc4b60f0099cd7ad8c8a5f06581a532392mmentovai    abort(); \
8297d392dc4b60f0099cd7ad8c8a5f06581a532392mmentovai  }
8397d392dc4b60f0099cd7ad8c8a5f06581a532392mmentovai
8497d392dc4b60f0099cd7ad8c8a5f06581a532392mmentovai#define ASSERT_EQ_ABORT(e1, e2) ASSERT_TRUE_ABORT((e1) == (e2))
8597d392dc4b60f0099cd7ad8c8a5f06581a532392mmentovai
86cce3492afc263be86236600d41dca40be7224ee7brynerclass TestSymbolSupplier : public SymbolSupplier {
87cce3492afc263be86236600d41dca40be7224ee7bryner public:
88f33b8d2d07a057fdd667c2e0db629ba7cbc37cc3bryner  TestSymbolSupplier() : interrupt_(false) {}
89f33b8d2d07a057fdd667c2e0db629ba7cbc37cc3bryner
90f33b8d2d07a057fdd667c2e0db629ba7cbc37cc3bryner  virtual SymbolResult GetSymbolFile(const CodeModule *module,
9197d392dc4b60f0099cd7ad8c8a5f06581a532392mmentovai                                     const SystemInfo *system_info,
92f33b8d2d07a057fdd667c2e0db629ba7cbc37cc3bryner                                     string *symbol_file);
93f33b8d2d07a057fdd667c2e0db629ba7cbc37cc3bryner
942ad976ef0ba44f36842b9b7a11848f6b40fd25d5nealsid  virtual SymbolResult GetSymbolFile(const CodeModule *module,
952ad976ef0ba44f36842b9b7a11848f6b40fd25d5nealsid                                     const SystemInfo *system_info,
962ad976ef0ba44f36842b9b7a11848f6b40fd25d5nealsid                                     string *symbol_file,
972ad976ef0ba44f36842b9b7a11848f6b40fd25d5nealsid                                     string *symbol_data);
982ad976ef0ba44f36842b9b7a11848f6b40fd25d5nealsid
99f33b8d2d07a057fdd667c2e0db629ba7cbc37cc3bryner  // When set to true, causes the SymbolSupplier to return INTERRUPT
100f33b8d2d07a057fdd667c2e0db629ba7cbc37cc3bryner  void set_interrupt(bool interrupt) { interrupt_ = interrupt; }
101f33b8d2d07a057fdd667c2e0db629ba7cbc37cc3bryner
102f33b8d2d07a057fdd667c2e0db629ba7cbc37cc3bryner private:
103f33b8d2d07a057fdd667c2e0db629ba7cbc37cc3bryner  bool interrupt_;
104cce3492afc263be86236600d41dca40be7224ee7bryner};
105cce3492afc263be86236600d41dca40be7224ee7bryner
106f33b8d2d07a057fdd667c2e0db629ba7cbc37cc3brynerSymbolSupplier::SymbolResult TestSymbolSupplier::GetSymbolFile(
10797d392dc4b60f0099cd7ad8c8a5f06581a532392mmentovai    const CodeModule *module,
10897d392dc4b60f0099cd7ad8c8a5f06581a532392mmentovai    const SystemInfo *system_info,
10997d392dc4b60f0099cd7ad8c8a5f06581a532392mmentovai    string *symbol_file) {
11097d392dc4b60f0099cd7ad8c8a5f06581a532392mmentovai  ASSERT_TRUE_ABORT(module);
11197d392dc4b60f0099cd7ad8c8a5f06581a532392mmentovai  ASSERT_TRUE_ABORT(system_info);
11297d392dc4b60f0099cd7ad8c8a5f06581a532392mmentovai  ASSERT_EQ_ABORT(system_info->cpu, kSystemInfoCPU);
11397d392dc4b60f0099cd7ad8c8a5f06581a532392mmentovai  ASSERT_EQ_ABORT(system_info->cpu_info, kSystemInfoCPUInfo);
11497d392dc4b60f0099cd7ad8c8a5f06581a532392mmentovai  ASSERT_EQ_ABORT(system_info->os, kSystemInfoOS);
11597d392dc4b60f0099cd7ad8c8a5f06581a532392mmentovai  ASSERT_EQ_ABORT(system_info->os_short, kSystemInfoOSShort);
11697d392dc4b60f0099cd7ad8c8a5f06581a532392mmentovai  ASSERT_EQ_ABORT(system_info->os_version, kSystemInfoOSVersion);
11797d392dc4b60f0099cd7ad8c8a5f06581a532392mmentovai
118f33b8d2d07a057fdd667c2e0db629ba7cbc37cc3bryner  if (interrupt_) {
119f33b8d2d07a057fdd667c2e0db629ba7cbc37cc3bryner    return INTERRUPT;
120f33b8d2d07a057fdd667c2e0db629ba7cbc37cc3bryner  }
121f33b8d2d07a057fdd667c2e0db629ba7cbc37cc3bryner
122e5dc60822e5938fea2ae892ccddb906641ba174emmentovai  if (module && module->code_file() == "c:\\test_app.exe") {
123f33b8d2d07a057fdd667c2e0db629ba7cbc37cc3bryner      *symbol_file = string(getenv("srcdir") ? getenv("srcdir") : ".") +
124f33b8d2d07a057fdd667c2e0db629ba7cbc37cc3bryner                     "/src/processor/testdata/symbols/test_app.pdb/" +
125f33b8d2d07a057fdd667c2e0db629ba7cbc37cc3bryner                     module->debug_identifier() +
126f33b8d2d07a057fdd667c2e0db629ba7cbc37cc3bryner                     "/test_app.sym";
127f33b8d2d07a057fdd667c2e0db629ba7cbc37cc3bryner    return FOUND;
128cce3492afc263be86236600d41dca40be7224ee7bryner  }
129cce3492afc263be86236600d41dca40be7224ee7bryner
130f33b8d2d07a057fdd667c2e0db629ba7cbc37cc3bryner  return NOT_FOUND;
131cce3492afc263be86236600d41dca40be7224ee7bryner}
132cce3492afc263be86236600d41dca40be7224ee7bryner
1332ad976ef0ba44f36842b9b7a11848f6b40fd25d5nealsidSymbolSupplier::SymbolResult TestSymbolSupplier::GetSymbolFile(
1342ad976ef0ba44f36842b9b7a11848f6b40fd25d5nealsid    const CodeModule *module,
1352ad976ef0ba44f36842b9b7a11848f6b40fd25d5nealsid    const SystemInfo *system_info,
1362ad976ef0ba44f36842b9b7a11848f6b40fd25d5nealsid    string *symbol_file,
1372ad976ef0ba44f36842b9b7a11848f6b40fd25d5nealsid    string *symbol_data) {
1382ad976ef0ba44f36842b9b7a11848f6b40fd25d5nealsid  SymbolSupplier::SymbolResult s = GetSymbolFile(module, system_info,
1392ad976ef0ba44f36842b9b7a11848f6b40fd25d5nealsid                                                 symbol_file);
1402ad976ef0ba44f36842b9b7a11848f6b40fd25d5nealsid  if (s == FOUND) {
1412ad976ef0ba44f36842b9b7a11848f6b40fd25d5nealsid    std::ifstream in(symbol_file->c_str());
1422ad976ef0ba44f36842b9b7a11848f6b40fd25d5nealsid    std::getline(in, *symbol_data, std::string::traits_type::to_char_type(
1432ad976ef0ba44f36842b9b7a11848f6b40fd25d5nealsid                     std::string::traits_type::eof()));
1442ad976ef0ba44f36842b9b7a11848f6b40fd25d5nealsid    in.close();
1452ad976ef0ba44f36842b9b7a11848f6b40fd25d5nealsid  }
1462ad976ef0ba44f36842b9b7a11848f6b40fd25d5nealsid
1472ad976ef0ba44f36842b9b7a11848f6b40fd25d5nealsid  return s;
1482ad976ef0ba44f36842b9b7a11848f6b40fd25d5nealsid}
1492ad976ef0ba44f36842b9b7a11848f6b40fd25d5nealsid
150cce3492afc263be86236600d41dca40be7224ee7brynerstatic bool RunTests() {
151cce3492afc263be86236600d41dca40be7224ee7bryner  TestSymbolSupplier supplier;
152fd38d48e6d5e56cb66b0fa0f7e25f840a83dac5cbryner  BasicSourceLineResolver resolver;
153fd38d48e6d5e56cb66b0fa0f7e25f840a83dac5cbryner  MinidumpProcessor processor(&supplier, &resolver);
154cce3492afc263be86236600d41dca40be7224ee7bryner
155cce3492afc263be86236600d41dca40be7224ee7bryner  string minidump_file = string(getenv("srcdir") ? getenv("srcdir") : ".") +
156cce3492afc263be86236600d41dca40be7224ee7bryner                         "/src/processor/testdata/minidump2.dmp";
157cce3492afc263be86236600d41dca40be7224ee7bryner
158f33b8d2d07a057fdd667c2e0db629ba7cbc37cc3bryner  ProcessState state;
159f33b8d2d07a057fdd667c2e0db629ba7cbc37cc3bryner  ASSERT_EQ(processor.Process(minidump_file, &state),
160f33b8d2d07a057fdd667c2e0db629ba7cbc37cc3bryner            MinidumpProcessor::PROCESS_OK);
16197d392dc4b60f0099cd7ad8c8a5f06581a532392mmentovai  ASSERT_EQ(state.system_info()->os, kSystemInfoOS);
16297d392dc4b60f0099cd7ad8c8a5f06581a532392mmentovai  ASSERT_EQ(state.system_info()->os_short, kSystemInfoOSShort);
16397d392dc4b60f0099cd7ad8c8a5f06581a532392mmentovai  ASSERT_EQ(state.system_info()->os_version, kSystemInfoOSVersion);
16497d392dc4b60f0099cd7ad8c8a5f06581a532392mmentovai  ASSERT_EQ(state.system_info()->cpu, kSystemInfoCPU);
16597d392dc4b60f0099cd7ad8c8a5f06581a532392mmentovai  ASSERT_EQ(state.system_info()->cpu_info, kSystemInfoCPUInfo);
166f33b8d2d07a057fdd667c2e0db629ba7cbc37cc3bryner  ASSERT_TRUE(state.crashed());
167f33b8d2d07a057fdd667c2e0db629ba7cbc37cc3bryner  ASSERT_EQ(state.crash_reason(), "EXCEPTION_ACCESS_VIOLATION");
168f33b8d2d07a057fdd667c2e0db629ba7cbc37cc3bryner  ASSERT_EQ(state.crash_address(), 0x45);
169f33b8d2d07a057fdd667c2e0db629ba7cbc37cc3bryner  ASSERT_EQ(state.threads()->size(), 1);
170f33b8d2d07a057fdd667c2e0db629ba7cbc37cc3bryner  ASSERT_EQ(state.requesting_thread(), 0);
171f33b8d2d07a057fdd667c2e0db629ba7cbc37cc3bryner
172f33b8d2d07a057fdd667c2e0db629ba7cbc37cc3bryner  CallStack *stack = state.threads()->at(0);
173e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai  ASSERT_TRUE(stack);
174d119a921ea611dc38cfcb7411759ddf2c688603fmmentovai  ASSERT_EQ(stack->frames()->size(), 4);
175cce3492afc263be86236600d41dca40be7224ee7bryner
176db3342a10ec30902aa9018b80e1d9a40bd01c487mmentovai  ASSERT_TRUE(stack->frames()->at(0)->module);
177db3342a10ec30902aa9018b80e1d9a40bd01c487mmentovai  ASSERT_EQ(stack->frames()->at(0)->module->base_address(), 0x400000);
178e5dc60822e5938fea2ae892ccddb906641ba174emmentovai  ASSERT_EQ(stack->frames()->at(0)->module->code_file(), "c:\\test_app.exe");
17997d392dc4b60f0099cd7ad8c8a5f06581a532392mmentovai  ASSERT_EQ(stack->frames()->at(0)->function_name,
18097d392dc4b60f0099cd7ad8c8a5f06581a532392mmentovai            "`anonymous namespace'::CrashFunction");
181d119a921ea611dc38cfcb7411759ddf2c688603fmmentovai  ASSERT_EQ(stack->frames()->at(0)->source_file_name, "c:\\test_app.cc");
182e5dc60822e5938fea2ae892ccddb906641ba174emmentovai  ASSERT_EQ(stack->frames()->at(0)->source_line, 58);
183cce3492afc263be86236600d41dca40be7224ee7bryner
184db3342a10ec30902aa9018b80e1d9a40bd01c487mmentovai  ASSERT_TRUE(stack->frames()->at(1)->module);
185db3342a10ec30902aa9018b80e1d9a40bd01c487mmentovai  ASSERT_EQ(stack->frames()->at(1)->module->base_address(), 0x400000);
186e5dc60822e5938fea2ae892ccddb906641ba174emmentovai  ASSERT_EQ(stack->frames()->at(1)->module->code_file(), "c:\\test_app.exe");
187d119a921ea611dc38cfcb7411759ddf2c688603fmmentovai  ASSERT_EQ(stack->frames()->at(1)->function_name, "main");
188d119a921ea611dc38cfcb7411759ddf2c688603fmmentovai  ASSERT_EQ(stack->frames()->at(1)->source_file_name, "c:\\test_app.cc");
189e5dc60822e5938fea2ae892ccddb906641ba174emmentovai  ASSERT_EQ(stack->frames()->at(1)->source_line, 65);
190cce3492afc263be86236600d41dca40be7224ee7bryner
191cce3492afc263be86236600d41dca40be7224ee7bryner  // This comes from the CRT
192db3342a10ec30902aa9018b80e1d9a40bd01c487mmentovai  ASSERT_TRUE(stack->frames()->at(2)->module);
193db3342a10ec30902aa9018b80e1d9a40bd01c487mmentovai  ASSERT_EQ(stack->frames()->at(2)->module->base_address(), 0x400000);
194e5dc60822e5938fea2ae892ccddb906641ba174emmentovai  ASSERT_EQ(stack->frames()->at(2)->module->code_file(), "c:\\test_app.exe");
195d119a921ea611dc38cfcb7411759ddf2c688603fmmentovai  ASSERT_EQ(stack->frames()->at(2)->function_name, "__tmainCRTStartup");
196d119a921ea611dc38cfcb7411759ddf2c688603fmmentovai  ASSERT_EQ(stack->frames()->at(2)->source_file_name,
197e5dc60822e5938fea2ae892ccddb906641ba174emmentovai            "f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crt0.c");
198e5dc60822e5938fea2ae892ccddb906641ba174emmentovai  ASSERT_EQ(stack->frames()->at(2)->source_line, 327);
199cce3492afc263be86236600d41dca40be7224ee7bryner
200cce3492afc263be86236600d41dca40be7224ee7bryner  // No debug info available for kernel32.dll
201db3342a10ec30902aa9018b80e1d9a40bd01c487mmentovai  ASSERT_TRUE(stack->frames()->at(3)->module);
202db3342a10ec30902aa9018b80e1d9a40bd01c487mmentovai  ASSERT_EQ(stack->frames()->at(3)->module->base_address(), 0x7c800000);
203db3342a10ec30902aa9018b80e1d9a40bd01c487mmentovai  ASSERT_EQ(stack->frames()->at(3)->module->code_file(),
204cce3492afc263be86236600d41dca40be7224ee7bryner            "C:\\WINDOWS\\system32\\kernel32.dll");
205d119a921ea611dc38cfcb7411759ddf2c688603fmmentovai  ASSERT_TRUE(stack->frames()->at(3)->function_name.empty());
206d119a921ea611dc38cfcb7411759ddf2c688603fmmentovai  ASSERT_TRUE(stack->frames()->at(3)->source_file_name.empty());
207d119a921ea611dc38cfcb7411759ddf2c688603fmmentovai  ASSERT_EQ(stack->frames()->at(3)->source_line, 0);
208cce3492afc263be86236600d41dca40be7224ee7bryner
209f33b8d2d07a057fdd667c2e0db629ba7cbc37cc3bryner  ASSERT_EQ(state.modules()->module_count(), 13);
210f33b8d2d07a057fdd667c2e0db629ba7cbc37cc3bryner  ASSERT_TRUE(state.modules()->GetMainModule());
211e5dc60822e5938fea2ae892ccddb906641ba174emmentovai  ASSERT_EQ(state.modules()->GetMainModule()->code_file(), "c:\\test_app.exe");
212f33b8d2d07a057fdd667c2e0db629ba7cbc37cc3bryner  ASSERT_FALSE(state.modules()->GetModuleForAddress(0));
213f33b8d2d07a057fdd667c2e0db629ba7cbc37cc3bryner  ASSERT_EQ(state.modules()->GetMainModule(),
214f33b8d2d07a057fdd667c2e0db629ba7cbc37cc3bryner            state.modules()->GetModuleForAddress(0x400000));
215f33b8d2d07a057fdd667c2e0db629ba7cbc37cc3bryner  ASSERT_EQ(state.modules()->GetModuleForAddress(0x7c801234)->debug_file(),
216db3342a10ec30902aa9018b80e1d9a40bd01c487mmentovai            "kernel32.pdb");
217f33b8d2d07a057fdd667c2e0db629ba7cbc37cc3bryner  ASSERT_EQ(state.modules()->GetModuleForAddress(0x77d43210)->version(),
218db3342a10ec30902aa9018b80e1d9a40bd01c487mmentovai            "5.1.2600.2622");
219db3342a10ec30902aa9018b80e1d9a40bd01c487mmentovai
220f33b8d2d07a057fdd667c2e0db629ba7cbc37cc3bryner  // Test that the symbol supplier can interrupt processing
221f33b8d2d07a057fdd667c2e0db629ba7cbc37cc3bryner  state.Clear();
222f33b8d2d07a057fdd667c2e0db629ba7cbc37cc3bryner  supplier.set_interrupt(true);
223f33b8d2d07a057fdd667c2e0db629ba7cbc37cc3bryner  ASSERT_EQ(processor.Process(minidump_file, &state),
224f33b8d2d07a057fdd667c2e0db629ba7cbc37cc3bryner            MinidumpProcessor::PROCESS_INTERRUPTED);
225f33b8d2d07a057fdd667c2e0db629ba7cbc37cc3bryner
226cce3492afc263be86236600d41dca40be7224ee7bryner  return true;
227cce3492afc263be86236600d41dca40be7224ee7bryner}
228cce3492afc263be86236600d41dca40be7224ee7bryner
2298647dde8cc03ef16b565dccc75574ee5f0d9cf72mmentovai}  // namespace
2308647dde8cc03ef16b565dccc75574ee5f0d9cf72mmentovai
231cce3492afc263be86236600d41dca40be7224ee7brynerint main(int argc, char *argv[]) {
23232b802dba3d49880a0414d066e71cdc20ab09901mmentovai  BPLOG_INIT(&argc, &argv);
23332b802dba3d49880a0414d066e71cdc20ab09901mmentovai
234cce3492afc263be86236600d41dca40be7224ee7bryner  if (!RunTests()) {
235cce3492afc263be86236600d41dca40be7224ee7bryner    return 1;
236cce3492afc263be86236600d41dca40be7224ee7bryner  }
237cce3492afc263be86236600d41dca40be7224ee7bryner
238cce3492afc263be86236600d41dca40be7224ee7bryner  return 0;
239cce3492afc263be86236600d41dca40be7224ee7bryner}
240