minidump_processor_unittest.cc revision e5dc60822e5938fea2ae892ccddb906641ba174e
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>
35e5dc60822e5938fea2ae892ccddb906641ba174emmentovai#include "google_breakpad/processor/basic_source_line_resolver.h"
36e5dc60822e5938fea2ae892ccddb906641ba174emmentovai#include "google_breakpad/processor/call_stack.h"
37e5dc60822e5938fea2ae892ccddb906641ba174emmentovai#include "google_breakpad/processor/code_module.h"
38e5dc60822e5938fea2ae892ccddb906641ba174emmentovai#include "google_breakpad/processor/code_modules.h"
39e5dc60822e5938fea2ae892ccddb906641ba174emmentovai#include "google_breakpad/processor/minidump_processor.h"
40e5dc60822e5938fea2ae892ccddb906641ba174emmentovai#include "google_breakpad/processor/process_state.h"
41e5dc60822e5938fea2ae892ccddb906641ba174emmentovai#include "google_breakpad/processor/stack_frame.h"
42e5dc60822e5938fea2ae892ccddb906641ba174emmentovai#include "google_breakpad/processor/symbol_supplier.h"
432466d8e993a800a17e00deda2f3a27e0505140e1mmentovai#include "processor/scoped_ptr.h"
44cce3492afc263be86236600d41dca40be7224ee7bryner
458647dde8cc03ef16b565dccc75574ee5f0d9cf72mmentovainamespace {
468647dde8cc03ef16b565dccc75574ee5f0d9cf72mmentovai
47cce3492afc263be86236600d41dca40be7224ee7brynerusing std::string;
48e5dc60822e5938fea2ae892ccddb906641ba174emmentovaiusing google_breakpad::BasicSourceLineResolver;
49e5dc60822e5938fea2ae892ccddb906641ba174emmentovaiusing google_breakpad::CallStack;
50e5dc60822e5938fea2ae892ccddb906641ba174emmentovaiusing google_breakpad::CodeModule;
51e5dc60822e5938fea2ae892ccddb906641ba174emmentovaiusing google_breakpad::MinidumpProcessor;
52e5dc60822e5938fea2ae892ccddb906641ba174emmentovaiusing google_breakpad::ProcessState;
53e5dc60822e5938fea2ae892ccddb906641ba174emmentovaiusing google_breakpad::scoped_ptr;
54e5dc60822e5938fea2ae892ccddb906641ba174emmentovaiusing google_breakpad::SymbolSupplier;
55e5dc60822e5938fea2ae892ccddb906641ba174emmentovaiusing google_breakpad::SystemInfo;
5697d392dc4b60f0099cd7ad8c8a5f06581a532392mmentovai
5797d392dc4b60f0099cd7ad8c8a5f06581a532392mmentovaistatic const char *kSystemInfoOS = "Windows NT";
5897d392dc4b60f0099cd7ad8c8a5f06581a532392mmentovaistatic const char *kSystemInfoOSShort = "windows";
5997d392dc4b60f0099cd7ad8c8a5f06581a532392mmentovaistatic const char *kSystemInfoOSVersion = "5.1.2600 Service Pack 2";
6097d392dc4b60f0099cd7ad8c8a5f06581a532392mmentovaistatic const char *kSystemInfoCPU = "x86";
6197d392dc4b60f0099cd7ad8c8a5f06581a532392mmentovaistatic const char *kSystemInfoCPUInfo =
6297d392dc4b60f0099cd7ad8c8a5f06581a532392mmentovai    "GenuineIntel family 6 model 13 stepping 8";
63cce3492afc263be86236600d41dca40be7224ee7bryner
64cce3492afc263be86236600d41dca40be7224ee7bryner#define ASSERT_TRUE(cond) \
65cce3492afc263be86236600d41dca40be7224ee7bryner  if (!(cond)) {                                                        \
66cce3492afc263be86236600d41dca40be7224ee7bryner    fprintf(stderr, "FAILED: %s at %s:%d\n", #cond, __FILE__, __LINE__); \
67cce3492afc263be86236600d41dca40be7224ee7bryner    return false; \
68cce3492afc263be86236600d41dca40be7224ee7bryner  }
69cce3492afc263be86236600d41dca40be7224ee7bryner
70db3342a10ec30902aa9018b80e1d9a40bd01c487mmentovai#define ASSERT_FALSE(cond) ASSERT_TRUE(!(cond))
71db3342a10ec30902aa9018b80e1d9a40bd01c487mmentovai
72cce3492afc263be86236600d41dca40be7224ee7bryner#define ASSERT_EQ(e1, e2) ASSERT_TRUE((e1) == (e2))
73cce3492afc263be86236600d41dca40be7224ee7bryner
7497d392dc4b60f0099cd7ad8c8a5f06581a532392mmentovai// Use ASSERT_*_ABORT in functions that can't return a boolean.
7597d392dc4b60f0099cd7ad8c8a5f06581a532392mmentovai#define ASSERT_TRUE_ABORT(cond) \
7697d392dc4b60f0099cd7ad8c8a5f06581a532392mmentovai  if (!(cond)) {                                                        \
7797d392dc4b60f0099cd7ad8c8a5f06581a532392mmentovai    fprintf(stderr, "FAILED: %s at %s:%d\n", #cond, __FILE__, __LINE__); \
7897d392dc4b60f0099cd7ad8c8a5f06581a532392mmentovai    abort(); \
7997d392dc4b60f0099cd7ad8c8a5f06581a532392mmentovai  }
8097d392dc4b60f0099cd7ad8c8a5f06581a532392mmentovai
8197d392dc4b60f0099cd7ad8c8a5f06581a532392mmentovai#define ASSERT_EQ_ABORT(e1, e2) ASSERT_TRUE_ABORT((e1) == (e2))
8297d392dc4b60f0099cd7ad8c8a5f06581a532392mmentovai
83cce3492afc263be86236600d41dca40be7224ee7brynerclass TestSymbolSupplier : public SymbolSupplier {
84cce3492afc263be86236600d41dca40be7224ee7bryner public:
85f33b8d2d07a057fdd667c2e0db629ba7cbc37cc3bryner  TestSymbolSupplier() : interrupt_(false) {}
86f33b8d2d07a057fdd667c2e0db629ba7cbc37cc3bryner
87f33b8d2d07a057fdd667c2e0db629ba7cbc37cc3bryner  virtual SymbolResult GetSymbolFile(const CodeModule *module,
8897d392dc4b60f0099cd7ad8c8a5f06581a532392mmentovai                                     const SystemInfo *system_info,
89f33b8d2d07a057fdd667c2e0db629ba7cbc37cc3bryner                                     string *symbol_file);
90f33b8d2d07a057fdd667c2e0db629ba7cbc37cc3bryner
91f33b8d2d07a057fdd667c2e0db629ba7cbc37cc3bryner  // When set to true, causes the SymbolSupplier to return INTERRUPT
92f33b8d2d07a057fdd667c2e0db629ba7cbc37cc3bryner  void set_interrupt(bool interrupt) { interrupt_ = interrupt; }
93f33b8d2d07a057fdd667c2e0db629ba7cbc37cc3bryner
94f33b8d2d07a057fdd667c2e0db629ba7cbc37cc3bryner private:
95f33b8d2d07a057fdd667c2e0db629ba7cbc37cc3bryner  bool interrupt_;
96cce3492afc263be86236600d41dca40be7224ee7bryner};
97cce3492afc263be86236600d41dca40be7224ee7bryner
98f33b8d2d07a057fdd667c2e0db629ba7cbc37cc3brynerSymbolSupplier::SymbolResult TestSymbolSupplier::GetSymbolFile(
9997d392dc4b60f0099cd7ad8c8a5f06581a532392mmentovai    const CodeModule *module,
10097d392dc4b60f0099cd7ad8c8a5f06581a532392mmentovai    const SystemInfo *system_info,
10197d392dc4b60f0099cd7ad8c8a5f06581a532392mmentovai    string *symbol_file) {
10297d392dc4b60f0099cd7ad8c8a5f06581a532392mmentovai  ASSERT_TRUE_ABORT(module);
10397d392dc4b60f0099cd7ad8c8a5f06581a532392mmentovai  ASSERT_TRUE_ABORT(system_info);
10497d392dc4b60f0099cd7ad8c8a5f06581a532392mmentovai  ASSERT_EQ_ABORT(system_info->cpu, kSystemInfoCPU);
10597d392dc4b60f0099cd7ad8c8a5f06581a532392mmentovai  ASSERT_EQ_ABORT(system_info->cpu_info, kSystemInfoCPUInfo);
10697d392dc4b60f0099cd7ad8c8a5f06581a532392mmentovai  ASSERT_EQ_ABORT(system_info->os, kSystemInfoOS);
10797d392dc4b60f0099cd7ad8c8a5f06581a532392mmentovai  ASSERT_EQ_ABORT(system_info->os_short, kSystemInfoOSShort);
10897d392dc4b60f0099cd7ad8c8a5f06581a532392mmentovai  ASSERT_EQ_ABORT(system_info->os_version, kSystemInfoOSVersion);
10997d392dc4b60f0099cd7ad8c8a5f06581a532392mmentovai
110f33b8d2d07a057fdd667c2e0db629ba7cbc37cc3bryner  if (interrupt_) {
111f33b8d2d07a057fdd667c2e0db629ba7cbc37cc3bryner    return INTERRUPT;
112f33b8d2d07a057fdd667c2e0db629ba7cbc37cc3bryner  }
113f33b8d2d07a057fdd667c2e0db629ba7cbc37cc3bryner
114e5dc60822e5938fea2ae892ccddb906641ba174emmentovai  if (module && module->code_file() == "c:\\test_app.exe") {
115f33b8d2d07a057fdd667c2e0db629ba7cbc37cc3bryner      *symbol_file = string(getenv("srcdir") ? getenv("srcdir") : ".") +
116f33b8d2d07a057fdd667c2e0db629ba7cbc37cc3bryner                     "/src/processor/testdata/symbols/test_app.pdb/" +
117f33b8d2d07a057fdd667c2e0db629ba7cbc37cc3bryner                     module->debug_identifier() +
118f33b8d2d07a057fdd667c2e0db629ba7cbc37cc3bryner                     "/test_app.sym";
119f33b8d2d07a057fdd667c2e0db629ba7cbc37cc3bryner    return FOUND;
120cce3492afc263be86236600d41dca40be7224ee7bryner  }
121cce3492afc263be86236600d41dca40be7224ee7bryner
122f33b8d2d07a057fdd667c2e0db629ba7cbc37cc3bryner  return NOT_FOUND;
123cce3492afc263be86236600d41dca40be7224ee7bryner}
124cce3492afc263be86236600d41dca40be7224ee7bryner
125cce3492afc263be86236600d41dca40be7224ee7brynerstatic bool RunTests() {
126cce3492afc263be86236600d41dca40be7224ee7bryner  TestSymbolSupplier supplier;
127fd38d48e6d5e56cb66b0fa0f7e25f840a83dac5cbryner  BasicSourceLineResolver resolver;
128fd38d48e6d5e56cb66b0fa0f7e25f840a83dac5cbryner  MinidumpProcessor processor(&supplier, &resolver);
129cce3492afc263be86236600d41dca40be7224ee7bryner
130cce3492afc263be86236600d41dca40be7224ee7bryner  string minidump_file = string(getenv("srcdir") ? getenv("srcdir") : ".") +
131cce3492afc263be86236600d41dca40be7224ee7bryner                         "/src/processor/testdata/minidump2.dmp";
132cce3492afc263be86236600d41dca40be7224ee7bryner
133f33b8d2d07a057fdd667c2e0db629ba7cbc37cc3bryner  ProcessState state;
134f33b8d2d07a057fdd667c2e0db629ba7cbc37cc3bryner  ASSERT_EQ(processor.Process(minidump_file, &state),
135f33b8d2d07a057fdd667c2e0db629ba7cbc37cc3bryner            MinidumpProcessor::PROCESS_OK);
13697d392dc4b60f0099cd7ad8c8a5f06581a532392mmentovai  ASSERT_EQ(state.system_info()->os, kSystemInfoOS);
13797d392dc4b60f0099cd7ad8c8a5f06581a532392mmentovai  ASSERT_EQ(state.system_info()->os_short, kSystemInfoOSShort);
13897d392dc4b60f0099cd7ad8c8a5f06581a532392mmentovai  ASSERT_EQ(state.system_info()->os_version, kSystemInfoOSVersion);
13997d392dc4b60f0099cd7ad8c8a5f06581a532392mmentovai  ASSERT_EQ(state.system_info()->cpu, kSystemInfoCPU);
14097d392dc4b60f0099cd7ad8c8a5f06581a532392mmentovai  ASSERT_EQ(state.system_info()->cpu_info, kSystemInfoCPUInfo);
141f33b8d2d07a057fdd667c2e0db629ba7cbc37cc3bryner  ASSERT_TRUE(state.crashed());
142f33b8d2d07a057fdd667c2e0db629ba7cbc37cc3bryner  ASSERT_EQ(state.crash_reason(), "EXCEPTION_ACCESS_VIOLATION");
143f33b8d2d07a057fdd667c2e0db629ba7cbc37cc3bryner  ASSERT_EQ(state.crash_address(), 0x45);
144f33b8d2d07a057fdd667c2e0db629ba7cbc37cc3bryner  ASSERT_EQ(state.threads()->size(), 1);
145f33b8d2d07a057fdd667c2e0db629ba7cbc37cc3bryner  ASSERT_EQ(state.requesting_thread(), 0);
146f33b8d2d07a057fdd667c2e0db629ba7cbc37cc3bryner
147f33b8d2d07a057fdd667c2e0db629ba7cbc37cc3bryner  CallStack *stack = state.threads()->at(0);
148e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai  ASSERT_TRUE(stack);
149d119a921ea611dc38cfcb7411759ddf2c688603fmmentovai  ASSERT_EQ(stack->frames()->size(), 4);
150cce3492afc263be86236600d41dca40be7224ee7bryner
151db3342a10ec30902aa9018b80e1d9a40bd01c487mmentovai  ASSERT_TRUE(stack->frames()->at(0)->module);
152db3342a10ec30902aa9018b80e1d9a40bd01c487mmentovai  ASSERT_EQ(stack->frames()->at(0)->module->base_address(), 0x400000);
153e5dc60822e5938fea2ae892ccddb906641ba174emmentovai  ASSERT_EQ(stack->frames()->at(0)->module->code_file(), "c:\\test_app.exe");
15497d392dc4b60f0099cd7ad8c8a5f06581a532392mmentovai  ASSERT_EQ(stack->frames()->at(0)->function_name,
15597d392dc4b60f0099cd7ad8c8a5f06581a532392mmentovai            "`anonymous namespace'::CrashFunction");
156d119a921ea611dc38cfcb7411759ddf2c688603fmmentovai  ASSERT_EQ(stack->frames()->at(0)->source_file_name, "c:\\test_app.cc");
157e5dc60822e5938fea2ae892ccddb906641ba174emmentovai  ASSERT_EQ(stack->frames()->at(0)->source_line, 58);
158cce3492afc263be86236600d41dca40be7224ee7bryner
159db3342a10ec30902aa9018b80e1d9a40bd01c487mmentovai  ASSERT_TRUE(stack->frames()->at(1)->module);
160db3342a10ec30902aa9018b80e1d9a40bd01c487mmentovai  ASSERT_EQ(stack->frames()->at(1)->module->base_address(), 0x400000);
161e5dc60822e5938fea2ae892ccddb906641ba174emmentovai  ASSERT_EQ(stack->frames()->at(1)->module->code_file(), "c:\\test_app.exe");
162d119a921ea611dc38cfcb7411759ddf2c688603fmmentovai  ASSERT_EQ(stack->frames()->at(1)->function_name, "main");
163d119a921ea611dc38cfcb7411759ddf2c688603fmmentovai  ASSERT_EQ(stack->frames()->at(1)->source_file_name, "c:\\test_app.cc");
164e5dc60822e5938fea2ae892ccddb906641ba174emmentovai  ASSERT_EQ(stack->frames()->at(1)->source_line, 65);
165cce3492afc263be86236600d41dca40be7224ee7bryner
166cce3492afc263be86236600d41dca40be7224ee7bryner  // This comes from the CRT
167db3342a10ec30902aa9018b80e1d9a40bd01c487mmentovai  ASSERT_TRUE(stack->frames()->at(2)->module);
168db3342a10ec30902aa9018b80e1d9a40bd01c487mmentovai  ASSERT_EQ(stack->frames()->at(2)->module->base_address(), 0x400000);
169e5dc60822e5938fea2ae892ccddb906641ba174emmentovai  ASSERT_EQ(stack->frames()->at(2)->module->code_file(), "c:\\test_app.exe");
170d119a921ea611dc38cfcb7411759ddf2c688603fmmentovai  ASSERT_EQ(stack->frames()->at(2)->function_name, "__tmainCRTStartup");
171d119a921ea611dc38cfcb7411759ddf2c688603fmmentovai  ASSERT_EQ(stack->frames()->at(2)->source_file_name,
172e5dc60822e5938fea2ae892ccddb906641ba174emmentovai            "f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crt0.c");
173e5dc60822e5938fea2ae892ccddb906641ba174emmentovai  ASSERT_EQ(stack->frames()->at(2)->source_line, 327);
174cce3492afc263be86236600d41dca40be7224ee7bryner
175cce3492afc263be86236600d41dca40be7224ee7bryner  // No debug info available for kernel32.dll
176db3342a10ec30902aa9018b80e1d9a40bd01c487mmentovai  ASSERT_TRUE(stack->frames()->at(3)->module);
177db3342a10ec30902aa9018b80e1d9a40bd01c487mmentovai  ASSERT_EQ(stack->frames()->at(3)->module->base_address(), 0x7c800000);
178db3342a10ec30902aa9018b80e1d9a40bd01c487mmentovai  ASSERT_EQ(stack->frames()->at(3)->module->code_file(),
179cce3492afc263be86236600d41dca40be7224ee7bryner            "C:\\WINDOWS\\system32\\kernel32.dll");
180d119a921ea611dc38cfcb7411759ddf2c688603fmmentovai  ASSERT_TRUE(stack->frames()->at(3)->function_name.empty());
181d119a921ea611dc38cfcb7411759ddf2c688603fmmentovai  ASSERT_TRUE(stack->frames()->at(3)->source_file_name.empty());
182d119a921ea611dc38cfcb7411759ddf2c688603fmmentovai  ASSERT_EQ(stack->frames()->at(3)->source_line, 0);
183cce3492afc263be86236600d41dca40be7224ee7bryner
184f33b8d2d07a057fdd667c2e0db629ba7cbc37cc3bryner  ASSERT_EQ(state.modules()->module_count(), 13);
185f33b8d2d07a057fdd667c2e0db629ba7cbc37cc3bryner  ASSERT_TRUE(state.modules()->GetMainModule());
186e5dc60822e5938fea2ae892ccddb906641ba174emmentovai  ASSERT_EQ(state.modules()->GetMainModule()->code_file(), "c:\\test_app.exe");
187f33b8d2d07a057fdd667c2e0db629ba7cbc37cc3bryner  ASSERT_FALSE(state.modules()->GetModuleForAddress(0));
188f33b8d2d07a057fdd667c2e0db629ba7cbc37cc3bryner  ASSERT_EQ(state.modules()->GetMainModule(),
189f33b8d2d07a057fdd667c2e0db629ba7cbc37cc3bryner            state.modules()->GetModuleForAddress(0x400000));
190f33b8d2d07a057fdd667c2e0db629ba7cbc37cc3bryner  ASSERT_EQ(state.modules()->GetModuleForAddress(0x7c801234)->debug_file(),
191db3342a10ec30902aa9018b80e1d9a40bd01c487mmentovai            "kernel32.pdb");
192f33b8d2d07a057fdd667c2e0db629ba7cbc37cc3bryner  ASSERT_EQ(state.modules()->GetModuleForAddress(0x77d43210)->version(),
193db3342a10ec30902aa9018b80e1d9a40bd01c487mmentovai            "5.1.2600.2622");
194db3342a10ec30902aa9018b80e1d9a40bd01c487mmentovai
195f33b8d2d07a057fdd667c2e0db629ba7cbc37cc3bryner  // Test that the symbol supplier can interrupt processing
196f33b8d2d07a057fdd667c2e0db629ba7cbc37cc3bryner  state.Clear();
197f33b8d2d07a057fdd667c2e0db629ba7cbc37cc3bryner  supplier.set_interrupt(true);
198f33b8d2d07a057fdd667c2e0db629ba7cbc37cc3bryner  ASSERT_EQ(processor.Process(minidump_file, &state),
199f33b8d2d07a057fdd667c2e0db629ba7cbc37cc3bryner            MinidumpProcessor::PROCESS_INTERRUPTED);
200f33b8d2d07a057fdd667c2e0db629ba7cbc37cc3bryner
201cce3492afc263be86236600d41dca40be7224ee7bryner  return true;
202cce3492afc263be86236600d41dca40be7224ee7bryner}
203cce3492afc263be86236600d41dca40be7224ee7bryner
2048647dde8cc03ef16b565dccc75574ee5f0d9cf72mmentovai}  // namespace
2058647dde8cc03ef16b565dccc75574ee5f0d9cf72mmentovai
206cce3492afc263be86236600d41dca40be7224ee7brynerint main(int argc, char *argv[]) {
207cce3492afc263be86236600d41dca40be7224ee7bryner  if (!RunTests()) {
208cce3492afc263be86236600d41dca40be7224ee7bryner    return 1;
209cce3492afc263be86236600d41dca40be7224ee7bryner  }
210cce3492afc263be86236600d41dca40be7224ee7bryner
211cce3492afc263be86236600d41dca40be7224ee7bryner  return 0;
212cce3492afc263be86236600d41dca40be7224ee7bryner}
213