xref: /aosp_15_r20/external/google-breakpad/src/common/stabs_reader_unittest.cc (revision 9712c20fc9bbfbac4935993a2ca0b3958c5adad2)
1*9712c20fSFrederick Mayle // Copyright 2010 Google LLC
2*9712c20fSFrederick Mayle //
3*9712c20fSFrederick Mayle // Redistribution and use in source and binary forms, with or without
4*9712c20fSFrederick Mayle // modification, are permitted provided that the following conditions are
5*9712c20fSFrederick Mayle // met:
6*9712c20fSFrederick Mayle //
7*9712c20fSFrederick Mayle //     * Redistributions of source code must retain the above copyright
8*9712c20fSFrederick Mayle // notice, this list of conditions and the following disclaimer.
9*9712c20fSFrederick Mayle //     * Redistributions in binary form must reproduce the above
10*9712c20fSFrederick Mayle // copyright notice, this list of conditions and the following disclaimer
11*9712c20fSFrederick Mayle // in the documentation and/or other materials provided with the
12*9712c20fSFrederick Mayle // distribution.
13*9712c20fSFrederick Mayle //     * Neither the name of Google LLC nor the names of its
14*9712c20fSFrederick Mayle // contributors may be used to endorse or promote products derived from
15*9712c20fSFrederick Mayle // this software without specific prior written permission.
16*9712c20fSFrederick Mayle //
17*9712c20fSFrederick Mayle // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
18*9712c20fSFrederick Mayle // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
19*9712c20fSFrederick Mayle // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
20*9712c20fSFrederick Mayle // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
21*9712c20fSFrederick Mayle // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
22*9712c20fSFrederick Mayle // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
23*9712c20fSFrederick Mayle // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24*9712c20fSFrederick Mayle // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25*9712c20fSFrederick Mayle // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26*9712c20fSFrederick Mayle // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
27*9712c20fSFrederick Mayle // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28*9712c20fSFrederick Mayle 
29*9712c20fSFrederick Mayle // Original author: Jim Blandy <[email protected]> <[email protected]>
30*9712c20fSFrederick Mayle 
31*9712c20fSFrederick Mayle // stabs_reader_unittest.cc: Unit tests for google_breakpad::StabsReader.
32*9712c20fSFrederick Mayle 
33*9712c20fSFrederick Mayle #ifdef HAVE_CONFIG_H
34*9712c20fSFrederick Mayle #include <config.h>  // Must come first
35*9712c20fSFrederick Mayle #endif
36*9712c20fSFrederick Mayle 
37*9712c20fSFrederick Mayle #include <assert.h>
38*9712c20fSFrederick Mayle #include <errno.h>
39*9712c20fSFrederick Mayle #include <stab.h>
40*9712c20fSFrederick Mayle #include <stdarg.h>
41*9712c20fSFrederick Mayle #include <stdlib.h>
42*9712c20fSFrederick Mayle #include <string.h>
43*9712c20fSFrederick Mayle 
44*9712c20fSFrederick Mayle #include <fstream>
45*9712c20fSFrederick Mayle #include <iomanip>
46*9712c20fSFrederick Mayle #include <iostream>
47*9712c20fSFrederick Mayle #include <map>
48*9712c20fSFrederick Mayle #include <sstream>
49*9712c20fSFrederick Mayle #include <string>
50*9712c20fSFrederick Mayle 
51*9712c20fSFrederick Mayle #include "breakpad_googletest_includes.h"
52*9712c20fSFrederick Mayle #include "common/stabs_reader.h"
53*9712c20fSFrederick Mayle #include "common/test_assembler.h"
54*9712c20fSFrederick Mayle #include "common/using_std_string.h"
55*9712c20fSFrederick Mayle 
56*9712c20fSFrederick Mayle using ::testing::Eq;
57*9712c20fSFrederick Mayle using ::testing::InSequence;
58*9712c20fSFrederick Mayle using ::testing::Return;
59*9712c20fSFrederick Mayle using ::testing::StrEq;
60*9712c20fSFrederick Mayle using ::testing::Test;
61*9712c20fSFrederick Mayle using ::testing::_;
62*9712c20fSFrederick Mayle using google_breakpad::StabsHandler;
63*9712c20fSFrederick Mayle using google_breakpad::StabsReader;
64*9712c20fSFrederick Mayle using google_breakpad::test_assembler::Label;
65*9712c20fSFrederick Mayle using google_breakpad::test_assembler::Section;
66*9712c20fSFrederick Mayle using google_breakpad::test_assembler::kBigEndian;
67*9712c20fSFrederick Mayle using google_breakpad::test_assembler::kLittleEndian;
68*9712c20fSFrederick Mayle using std::map;
69*9712c20fSFrederick Mayle 
70*9712c20fSFrederick Mayle namespace {
71*9712c20fSFrederick Mayle 
72*9712c20fSFrederick Mayle // A StringAssembler is a class for generating .stabstr sections to present
73*9712c20fSFrederick Mayle // as input to the STABS parser.
74*9712c20fSFrederick Mayle class StringAssembler: public Section {
75*9712c20fSFrederick Mayle  public:
StringAssembler()76*9712c20fSFrederick Mayle   StringAssembler() : in_cu_(false) { StartCU(); }
77*9712c20fSFrederick Mayle 
78*9712c20fSFrederick Mayle   // Add the string S to this StringAssembler, and return the string's
79*9712c20fSFrederick Mayle   // offset within this compilation unit's strings. If S has been added
80*9712c20fSFrederick Mayle   // already, this returns the offset of its first instance.
Add(const string & s)81*9712c20fSFrederick Mayle   size_t Add(const string& s) {
82*9712c20fSFrederick Mayle     map<string, size_t>::iterator it = added_.find(s);
83*9712c20fSFrederick Mayle     if (it != added_.end())
84*9712c20fSFrederick Mayle       return it->second;
85*9712c20fSFrederick Mayle     size_t offset = Size() - cu_start_;
86*9712c20fSFrederick Mayle     AppendCString(s);
87*9712c20fSFrederick Mayle     added_[s] = offset;
88*9712c20fSFrederick Mayle     return offset;
89*9712c20fSFrederick Mayle   }
90*9712c20fSFrederick Mayle 
91*9712c20fSFrederick Mayle   // Start a fresh compilation unit string collection.
StartCU()92*9712c20fSFrederick Mayle   void StartCU() {
93*9712c20fSFrederick Mayle     // Ignore duplicate calls to StartCU. Our test data don't always call
94*9712c20fSFrederick Mayle     // StartCU at all, meaning that our constructor has to take care of it,
95*9712c20fSFrederick Mayle     // meaning that tests that *do* call StartCU call it twice at the
96*9712c20fSFrederick Mayle     // beginning.  This is not worth smoothing out.
97*9712c20fSFrederick Mayle     if (in_cu_) return;
98*9712c20fSFrederick Mayle 
99*9712c20fSFrederick Mayle     added_.clear();
100*9712c20fSFrederick Mayle     cu_start_ = Size();
101*9712c20fSFrederick Mayle 
102*9712c20fSFrederick Mayle     // Each compilation unit's strings start with an empty string.
103*9712c20fSFrederick Mayle     AppendCString("");
104*9712c20fSFrederick Mayle     added_[""] = 0;
105*9712c20fSFrederick Mayle 
106*9712c20fSFrederick Mayle     in_cu_ = true;
107*9712c20fSFrederick Mayle   }
108*9712c20fSFrederick Mayle 
109*9712c20fSFrederick Mayle   // Finish off the current CU's strings.
EndCU()110*9712c20fSFrederick Mayle   size_t EndCU() {
111*9712c20fSFrederick Mayle     assert(in_cu_);
112*9712c20fSFrederick Mayle     in_cu_ = false;
113*9712c20fSFrederick Mayle     return Size() - cu_start_;
114*9712c20fSFrederick Mayle   }
115*9712c20fSFrederick Mayle 
116*9712c20fSFrederick Mayle  private:
117*9712c20fSFrederick Mayle   // The offset of the start of this compilation unit's strings.
118*9712c20fSFrederick Mayle   size_t cu_start_;
119*9712c20fSFrederick Mayle 
120*9712c20fSFrederick Mayle   // True if we're in a CU.
121*9712c20fSFrederick Mayle   bool in_cu_;
122*9712c20fSFrederick Mayle 
123*9712c20fSFrederick Mayle   // A map from the strings that have been added to this section to
124*9712c20fSFrederick Mayle   // their starting indices within their compilation unit.
125*9712c20fSFrederick Mayle   map<string, size_t> added_;
126*9712c20fSFrederick Mayle };
127*9712c20fSFrederick Mayle 
128*9712c20fSFrederick Mayle // A StabsAssembler is a class for generating .stab sections to present as
129*9712c20fSFrederick Mayle // test input for the STABS parser.
130*9712c20fSFrederick Mayle class StabsAssembler: public Section {
131*9712c20fSFrederick Mayle  public:
132*9712c20fSFrederick Mayle   // Create a StabsAssembler that uses StringAssembler for its strings.
StabsAssembler(StringAssembler * string_assembler)133*9712c20fSFrederick Mayle   StabsAssembler(StringAssembler* string_assembler)
134*9712c20fSFrederick Mayle       : Section(string_assembler->endianness()),
135*9712c20fSFrederick Mayle         string_assembler_(string_assembler),
136*9712c20fSFrederick Mayle         value_size_(0),
137*9712c20fSFrederick Mayle         entry_count_(0),
138*9712c20fSFrederick Mayle         cu_header_(NULL) { }
~StabsAssembler()139*9712c20fSFrederick Mayle   ~StabsAssembler() { assert(!cu_header_); }
140*9712c20fSFrederick Mayle 
141*9712c20fSFrederick Mayle   // Accessor and setter for value_size_.
value_size() const142*9712c20fSFrederick Mayle   size_t value_size() const { return value_size_; }
set_value_size(size_t value_size)143*9712c20fSFrederick Mayle   StabsAssembler& set_value_size(size_t value_size) {
144*9712c20fSFrederick Mayle     value_size_ = value_size;
145*9712c20fSFrederick Mayle     return *this;
146*9712c20fSFrederick Mayle   }
147*9712c20fSFrederick Mayle 
148*9712c20fSFrederick Mayle   // Append a STAB entry to the end of this section with the given
149*9712c20fSFrederick Mayle   // characteristics. NAME is the offset of this entry's name string within
150*9712c20fSFrederick Mayle   // its compilation unit's portion of the .stabstr section; this can be a
151*9712c20fSFrederick Mayle   // value generated by a StringAssembler. Return a reference to this
152*9712c20fSFrederick Mayle   // StabsAssembler.
Stab(uint8_t type,uint8_t other,Label descriptor,Label value,Label name)153*9712c20fSFrederick Mayle   StabsAssembler& Stab(uint8_t type, uint8_t other, Label descriptor,
154*9712c20fSFrederick Mayle                        Label value, Label name) {
155*9712c20fSFrederick Mayle     D32(name);
156*9712c20fSFrederick Mayle     D8(type);
157*9712c20fSFrederick Mayle     D8(other);
158*9712c20fSFrederick Mayle     D16(descriptor);
159*9712c20fSFrederick Mayle     Append(endianness(), value_size_, value);
160*9712c20fSFrederick Mayle     entry_count_++;
161*9712c20fSFrederick Mayle     return *this;
162*9712c20fSFrederick Mayle   }
163*9712c20fSFrederick Mayle 
164*9712c20fSFrederick Mayle   // As above, but automatically add NAME to our StringAssembler.
Stab(uint8_t type,uint8_t other,Label descriptor,Label value,const string & name)165*9712c20fSFrederick Mayle   StabsAssembler& Stab(uint8_t type, uint8_t other, Label descriptor,
166*9712c20fSFrederick Mayle                        Label value, const string& name) {
167*9712c20fSFrederick Mayle     return Stab(type, other, descriptor, value, string_assembler_->Add(name));
168*9712c20fSFrederick Mayle   }
169*9712c20fSFrederick Mayle 
170*9712c20fSFrederick Mayle   // Start a compilation unit named NAME, with an N_UNDF symbol to start
171*9712c20fSFrederick Mayle   // it, and its own portion of the string section. Return a reference to
172*9712c20fSFrederick Mayle   // this StabsAssembler.
StartCU(const string & name)173*9712c20fSFrederick Mayle   StabsAssembler& StartCU(const string& name) {
174*9712c20fSFrederick Mayle     assert(!cu_header_);
175*9712c20fSFrederick Mayle     cu_header_ = new CUHeader;
176*9712c20fSFrederick Mayle     string_assembler_->StartCU();
177*9712c20fSFrederick Mayle     entry_count_ = 0;
178*9712c20fSFrederick Mayle     return Stab(N_UNDF, 0,
179*9712c20fSFrederick Mayle                 cu_header_->final_entry_count,
180*9712c20fSFrederick Mayle                 cu_header_->final_string_size,
181*9712c20fSFrederick Mayle                 string_assembler_->Add(name));
182*9712c20fSFrederick Mayle   }
183*9712c20fSFrederick Mayle 
184*9712c20fSFrederick Mayle   // Close off the current compilation unit. Return a reference to this
185*9712c20fSFrederick Mayle   // StabsAssembler.
EndCU()186*9712c20fSFrederick Mayle   StabsAssembler& EndCU() {
187*9712c20fSFrederick Mayle     assert(cu_header_);
188*9712c20fSFrederick Mayle     cu_header_->final_entry_count = entry_count_;
189*9712c20fSFrederick Mayle     cu_header_->final_string_size = string_assembler_->EndCU();
190*9712c20fSFrederick Mayle     delete cu_header_;
191*9712c20fSFrederick Mayle     cu_header_ = NULL;
192*9712c20fSFrederick Mayle     return *this;
193*9712c20fSFrederick Mayle   }
194*9712c20fSFrederick Mayle 
195*9712c20fSFrederick Mayle  private:
196*9712c20fSFrederick Mayle   // Data used in a compilation unit header STAB that we won't know until
197*9712c20fSFrederick Mayle   // we've finished the compilation unit.
198*9712c20fSFrederick Mayle   struct CUHeader {
199*9712c20fSFrederick Mayle     // The final number of entries this compilation unit will hold.
200*9712c20fSFrederick Mayle     Label final_entry_count;
201*9712c20fSFrederick Mayle 
202*9712c20fSFrederick Mayle     // The final size of this compilation unit's strings.
203*9712c20fSFrederick Mayle     Label final_string_size;
204*9712c20fSFrederick Mayle   };
205*9712c20fSFrederick Mayle 
206*9712c20fSFrederick Mayle   // The strings for our STABS entries.
207*9712c20fSFrederick Mayle   StringAssembler* string_assembler_;
208*9712c20fSFrederick Mayle 
209*9712c20fSFrederick Mayle   // The size of the 'value' field of stabs entries in this section.
210*9712c20fSFrederick Mayle   size_t value_size_;
211*9712c20fSFrederick Mayle 
212*9712c20fSFrederick Mayle   // The number of entries in this compilation unit so far.
213*9712c20fSFrederick Mayle   size_t entry_count_;
214*9712c20fSFrederick Mayle 
215*9712c20fSFrederick Mayle   // Header labels for this compilation unit, if we've started one but not
216*9712c20fSFrederick Mayle   // finished it.
217*9712c20fSFrederick Mayle   CUHeader* cu_header_;
218*9712c20fSFrederick Mayle };
219*9712c20fSFrederick Mayle 
220*9712c20fSFrederick Mayle class MockStabsReaderHandler: public StabsHandler {
221*9712c20fSFrederick Mayle  public:
222*9712c20fSFrederick Mayle   MOCK_METHOD3(StartCompilationUnit,
223*9712c20fSFrederick Mayle                bool(const char*, uint64_t, const char*));
224*9712c20fSFrederick Mayle   MOCK_METHOD1(EndCompilationUnit, bool(uint64_t));
225*9712c20fSFrederick Mayle   MOCK_METHOD2(StartFunction, bool(const string&, uint64_t));
226*9712c20fSFrederick Mayle   MOCK_METHOD1(EndFunction, bool(uint64_t));
227*9712c20fSFrederick Mayle   MOCK_METHOD3(Line, bool(uint64_t, const char*, int));
228*9712c20fSFrederick Mayle   MOCK_METHOD2(Extern, bool(const string&, uint64_t));
Warning(const char * format,...)229*9712c20fSFrederick Mayle   void Warning(const char* format, ...) { MockWarning(format); }
230*9712c20fSFrederick Mayle   MOCK_METHOD1(MockWarning, void(const char*));
231*9712c20fSFrederick Mayle };
232*9712c20fSFrederick Mayle 
233*9712c20fSFrederick Mayle struct StabsFixture {
StabsFixture__anon9175f6ab0111::StabsFixture234*9712c20fSFrederick Mayle   StabsFixture() : stabs(&strings), unitized(true) { }
235*9712c20fSFrederick Mayle 
236*9712c20fSFrederick Mayle   // Create a StabsReader to parse the mock stabs data in stabs and
237*9712c20fSFrederick Mayle   // strings, and pass the parsed information to mock_handler. Use the
238*9712c20fSFrederick Mayle   // endianness and value size of stabs to parse the data. If all goes
239*9712c20fSFrederick Mayle   // well, return the result of calling the reader's Process member
240*9712c20fSFrederick Mayle   // function. Otherwise, return false.
ApplyHandlerToMockStabsData__anon9175f6ab0111::StabsFixture241*9712c20fSFrederick Mayle   bool ApplyHandlerToMockStabsData() {
242*9712c20fSFrederick Mayle     string stabs_contents, stabstr_contents;
243*9712c20fSFrederick Mayle     if (!stabs.GetContents(&stabs_contents) ||
244*9712c20fSFrederick Mayle         !strings.GetContents(&stabstr_contents))
245*9712c20fSFrederick Mayle       return false;
246*9712c20fSFrederick Mayle 
247*9712c20fSFrederick Mayle     // Run the parser on the test input, passing whatever we find to HANDLER.
248*9712c20fSFrederick Mayle     StabsReader reader(
249*9712c20fSFrederick Mayle         reinterpret_cast<const uint8_t*>(stabs_contents.data()),
250*9712c20fSFrederick Mayle         stabs_contents.size(),
251*9712c20fSFrederick Mayle         reinterpret_cast<const uint8_t*>(stabstr_contents.data()),
252*9712c20fSFrederick Mayle         stabstr_contents.size(),
253*9712c20fSFrederick Mayle         stabs.endianness() == kBigEndian, stabs.value_size(), unitized,
254*9712c20fSFrederick Mayle         &mock_handler);
255*9712c20fSFrederick Mayle     return reader.Process();
256*9712c20fSFrederick Mayle   }
257*9712c20fSFrederick Mayle 
258*9712c20fSFrederick Mayle   StringAssembler strings;
259*9712c20fSFrederick Mayle   StabsAssembler stabs;
260*9712c20fSFrederick Mayle   bool unitized;
261*9712c20fSFrederick Mayle   MockStabsReaderHandler mock_handler;
262*9712c20fSFrederick Mayle };
263*9712c20fSFrederick Mayle 
264*9712c20fSFrederick Mayle class Stabs: public StabsFixture, public Test { };
265*9712c20fSFrederick Mayle 
TEST_F(Stabs,MockStabsInput)266*9712c20fSFrederick Mayle TEST_F(Stabs, MockStabsInput) {
267*9712c20fSFrederick Mayle   stabs.set_endianness(kLittleEndian);
268*9712c20fSFrederick Mayle   stabs.set_value_size(4);
269*9712c20fSFrederick Mayle   stabs
270*9712c20fSFrederick Mayle       .Stab(N_SO,      149, 40232, 0x18a2a72bU, "builddir/")
271*9712c20fSFrederick Mayle       .Stab(N_FUN,      83, 50010, 0x91a5353fU,
272*9712c20fSFrederick Mayle             "not the SO with source file name we expected ")
273*9712c20fSFrederick Mayle       .Stab(N_SO,      165, 24791, 0xfe69d23cU, "")
274*9712c20fSFrederick Mayle       .Stab(N_SO,      184, 34178, 0xca4d883aU, "builddir1/")
275*9712c20fSFrederick Mayle       .Stab(N_SO,       83, 40859, 0xd2fe5df3U, "file1.c")
276*9712c20fSFrederick Mayle       .Stab(N_LSYM,    147, 39565, 0x60d4bb8aU, "not the FUN we're looking for")
277*9712c20fSFrederick Mayle       .Stab(N_FUN,     120, 50271, 0xa049f4b1U, "fun1")
278*9712c20fSFrederick Mayle       .Stab(N_BINCL,   150, 15694, 0xef65c659U,
279*9712c20fSFrederick Mayle             "something to ignore in a FUN body")
280*9712c20fSFrederick Mayle       .Stab(N_SLINE,   147,  4967, 0xd904b3f, "")
281*9712c20fSFrederick Mayle       .Stab(N_SOL,     177, 56135, 0xbd97b1dcU, "header.h")
282*9712c20fSFrederick Mayle       .Stab(N_SLINE,   130, 24610, 0x90f145b, "")
283*9712c20fSFrederick Mayle       .Stab(N_FUN,      45, 32441, 0xbf27cf93U,
284*9712c20fSFrederick Mayle             "fun2:some stabs type info here:to trim from the name")
285*9712c20fSFrederick Mayle       .Stab(N_SLINE,   138, 39002, 0x8148b87, "")
286*9712c20fSFrederick Mayle       .Stab(N_SOL,      60, 49318, 0x1d06e025U, "file1.c")
287*9712c20fSFrederick Mayle       .Stab(N_SLINE,    29, 52163, 0x6eebbb7, "")
288*9712c20fSFrederick Mayle       .Stab(N_SO,      167,  4647, 0xd04b7448U, "")
289*9712c20fSFrederick Mayle       .Stab(N_LSYM,     58, 37837, 0xe6b14d37U, "")
290*9712c20fSFrederick Mayle       .Stab(N_SO,      152,  7810, 0x11759f10U, "file3.c")
291*9712c20fSFrederick Mayle       .Stab(N_SO,      218, 12447, 0x11cfe4b5U, "");
292*9712c20fSFrederick Mayle 
293*9712c20fSFrederick Mayle   {
294*9712c20fSFrederick Mayle     InSequence s;
295*9712c20fSFrederick Mayle 
296*9712c20fSFrederick Mayle     EXPECT_CALL(mock_handler,
297*9712c20fSFrederick Mayle                 StartCompilationUnit(StrEq("file1.c"), 0xd2fe5df3U,
298*9712c20fSFrederick Mayle                                      StrEq("builddir1/")))
299*9712c20fSFrederick Mayle         .WillOnce(Return(true));
300*9712c20fSFrederick Mayle     EXPECT_CALL(mock_handler, StartFunction(StrEq("fun1"), 0xa049f4b1U))
301*9712c20fSFrederick Mayle         .WillOnce(Return(true));
302*9712c20fSFrederick Mayle     EXPECT_CALL(mock_handler,
303*9712c20fSFrederick Mayle                 Line(0xa049f4b1U + 0xd904b3f, StrEq("file1.c"), 4967))
304*9712c20fSFrederick Mayle         .WillOnce(Return(true));
305*9712c20fSFrederick Mayle     EXPECT_CALL(mock_handler,
306*9712c20fSFrederick Mayle                 Line(0xa049f4b1U + 0x90f145b, StrEq("header.h"), 24610))
307*9712c20fSFrederick Mayle         .WillOnce(Return(true));
308*9712c20fSFrederick Mayle     EXPECT_CALL(mock_handler, EndFunction(0xbf27cf93U))
309*9712c20fSFrederick Mayle         .WillOnce(Return(true));
310*9712c20fSFrederick Mayle     EXPECT_CALL(mock_handler, StartFunction(StrEq("fun2"), 0xbf27cf93U))
311*9712c20fSFrederick Mayle         .WillOnce(Return(true));
312*9712c20fSFrederick Mayle     EXPECT_CALL(mock_handler,
313*9712c20fSFrederick Mayle                 Line(0xbf27cf93U + 0x8148b87, StrEq("header.h"), 39002))
314*9712c20fSFrederick Mayle         .WillOnce(Return(true));
315*9712c20fSFrederick Mayle     EXPECT_CALL(mock_handler,
316*9712c20fSFrederick Mayle                 Line(0xbf27cf93U + 0x6eebbb7, StrEq("file1.c"), 52163))
317*9712c20fSFrederick Mayle         .WillOnce(Return(true));
318*9712c20fSFrederick Mayle     EXPECT_CALL(mock_handler, EndFunction(0xd04b7448U))
319*9712c20fSFrederick Mayle         .WillOnce(Return(true));
320*9712c20fSFrederick Mayle     EXPECT_CALL(mock_handler, EndCompilationUnit(0xd04b7448U))
321*9712c20fSFrederick Mayle         .WillOnce(Return(true));
322*9712c20fSFrederick Mayle     EXPECT_CALL(mock_handler, StartCompilationUnit(StrEq("file3.c"),
323*9712c20fSFrederick Mayle                                                    0x11759f10U, NULL))
324*9712c20fSFrederick Mayle         .WillOnce(Return(true));
325*9712c20fSFrederick Mayle     EXPECT_CALL(mock_handler, EndCompilationUnit(0x11cfe4b5U))
326*9712c20fSFrederick Mayle         .WillOnce(Return(true));
327*9712c20fSFrederick Mayle   }
328*9712c20fSFrederick Mayle 
329*9712c20fSFrederick Mayle   ASSERT_TRUE(ApplyHandlerToMockStabsData());
330*9712c20fSFrederick Mayle }
331*9712c20fSFrederick Mayle 
TEST_F(Stabs,AbruptCU)332*9712c20fSFrederick Mayle TEST_F(Stabs, AbruptCU) {
333*9712c20fSFrederick Mayle   stabs.set_endianness(kBigEndian);
334*9712c20fSFrederick Mayle   stabs.set_value_size(4);
335*9712c20fSFrederick Mayle   stabs.Stab(N_SO, 177, 23446, 0xbf10d5e4, "file2-1.c");
336*9712c20fSFrederick Mayle 
337*9712c20fSFrederick Mayle   {
338*9712c20fSFrederick Mayle     InSequence s;
339*9712c20fSFrederick Mayle 
340*9712c20fSFrederick Mayle     EXPECT_CALL(mock_handler,
341*9712c20fSFrederick Mayle                 StartCompilationUnit(StrEq("file2-1.c"), 0xbf10d5e4, NULL))
342*9712c20fSFrederick Mayle         .WillOnce(Return(true));
343*9712c20fSFrederick Mayle     EXPECT_CALL(mock_handler, EndCompilationUnit(0))
344*9712c20fSFrederick Mayle         .WillOnce(Return(true));
345*9712c20fSFrederick Mayle   }
346*9712c20fSFrederick Mayle 
347*9712c20fSFrederick Mayle   ASSERT_TRUE(ApplyHandlerToMockStabsData());
348*9712c20fSFrederick Mayle }
349*9712c20fSFrederick Mayle 
TEST_F(Stabs,AbruptFunction)350*9712c20fSFrederick Mayle TEST_F(Stabs, AbruptFunction) {
351*9712c20fSFrederick Mayle   stabs.set_endianness(kLittleEndian);
352*9712c20fSFrederick Mayle   stabs.set_value_size(8);
353*9712c20fSFrederick Mayle   stabs
354*9712c20fSFrederick Mayle       .Stab(N_SO,      218,   26631,   0xb83ddf10U, "file3-1.c")
355*9712c20fSFrederick Mayle       .Stab(N_FUN,     113,   24765,   0xbbd4a145U, "fun3_1");
356*9712c20fSFrederick Mayle 
357*9712c20fSFrederick Mayle   {
358*9712c20fSFrederick Mayle     InSequence s;
359*9712c20fSFrederick Mayle 
360*9712c20fSFrederick Mayle     EXPECT_CALL(mock_handler,
361*9712c20fSFrederick Mayle                 StartCompilationUnit(StrEq("file3-1.c"), 0xb83ddf10U, NULL))
362*9712c20fSFrederick Mayle         .WillOnce(Return(true));
363*9712c20fSFrederick Mayle     EXPECT_CALL(mock_handler, StartFunction(StrEq("fun3_1"), 0xbbd4a145U))
364*9712c20fSFrederick Mayle         .WillOnce(Return(true));
365*9712c20fSFrederick Mayle     EXPECT_CALL(mock_handler, EndFunction(0))
366*9712c20fSFrederick Mayle         .WillOnce(Return(true));
367*9712c20fSFrederick Mayle     EXPECT_CALL(mock_handler, EndCompilationUnit(0))
368*9712c20fSFrederick Mayle         .WillOnce(Return(true));
369*9712c20fSFrederick Mayle   }
370*9712c20fSFrederick Mayle 
371*9712c20fSFrederick Mayle   ASSERT_TRUE(ApplyHandlerToMockStabsData());
372*9712c20fSFrederick Mayle }
373*9712c20fSFrederick Mayle 
TEST_F(Stabs,NoCU)374*9712c20fSFrederick Mayle TEST_F(Stabs, NoCU) {
375*9712c20fSFrederick Mayle   stabs.set_endianness(kBigEndian);
376*9712c20fSFrederick Mayle   stabs.set_value_size(8);
377*9712c20fSFrederick Mayle   stabs.Stab(N_SO, 161, 25673, 0x8f676e7bU, "build-directory/");
378*9712c20fSFrederick Mayle 
379*9712c20fSFrederick Mayle   EXPECT_CALL(mock_handler, StartCompilationUnit(_, _, _))
380*9712c20fSFrederick Mayle       .Times(0);
381*9712c20fSFrederick Mayle   EXPECT_CALL(mock_handler, StartFunction(_, _))
382*9712c20fSFrederick Mayle       .Times(0);
383*9712c20fSFrederick Mayle 
384*9712c20fSFrederick Mayle   ASSERT_TRUE(ApplyHandlerToMockStabsData());
385*9712c20fSFrederick Mayle }
386*9712c20fSFrederick Mayle 
TEST_F(Stabs,NoCUEnd)387*9712c20fSFrederick Mayle TEST_F(Stabs, NoCUEnd) {
388*9712c20fSFrederick Mayle   stabs.set_endianness(kBigEndian);
389*9712c20fSFrederick Mayle   stabs.set_value_size(8);
390*9712c20fSFrederick Mayle   stabs
391*9712c20fSFrederick Mayle       .Stab(N_SO,      116,   58280,   0x2f7493c9U, "file5-1.c")
392*9712c20fSFrederick Mayle       .Stab(N_SO,      224,   23057,   0xf9f1d50fU, "file5-2.c");
393*9712c20fSFrederick Mayle 
394*9712c20fSFrederick Mayle   {
395*9712c20fSFrederick Mayle     InSequence s;
396*9712c20fSFrederick Mayle 
397*9712c20fSFrederick Mayle     EXPECT_CALL(mock_handler,
398*9712c20fSFrederick Mayle                 StartCompilationUnit(StrEq("file5-1.c"), 0x2f7493c9U, NULL))
399*9712c20fSFrederick Mayle         .WillOnce(Return(true));
400*9712c20fSFrederick Mayle     EXPECT_CALL(mock_handler, EndCompilationUnit(0))
401*9712c20fSFrederick Mayle         .WillOnce(Return(true));
402*9712c20fSFrederick Mayle     EXPECT_CALL(mock_handler,
403*9712c20fSFrederick Mayle                 StartCompilationUnit(StrEq("file5-2.c"), 0xf9f1d50fU, NULL))
404*9712c20fSFrederick Mayle         .WillOnce(Return(true));
405*9712c20fSFrederick Mayle     EXPECT_CALL(mock_handler, EndCompilationUnit(0))
406*9712c20fSFrederick Mayle         .WillOnce(Return(true));
407*9712c20fSFrederick Mayle   }
408*9712c20fSFrederick Mayle 
409*9712c20fSFrederick Mayle   ASSERT_TRUE(ApplyHandlerToMockStabsData());
410*9712c20fSFrederick Mayle }
411*9712c20fSFrederick Mayle 
412*9712c20fSFrederick Mayle // On systems that store STABS in sections, string offsets are relative to
413*9712c20fSFrederick Mayle // the beginning of that compilation unit's strings, marked with N_UNDF
414*9712c20fSFrederick Mayle // symbols; see the comments for StabsReader::StabsReader.
TEST_F(Stabs,Unitized)415*9712c20fSFrederick Mayle TEST_F(Stabs, Unitized) {
416*9712c20fSFrederick Mayle   stabs.set_endianness(kBigEndian);
417*9712c20fSFrederick Mayle   stabs.set_value_size(4);
418*9712c20fSFrederick Mayle   stabs
419*9712c20fSFrederick Mayle       .StartCU("antimony")
420*9712c20fSFrederick Mayle       .Stab(N_SO,   49, 26043, 0x7e259f1aU, "antimony")
421*9712c20fSFrederick Mayle       .Stab(N_FUN, 101, 63253, 0x7fbcccaeU, "arsenic")
422*9712c20fSFrederick Mayle       .Stab(N_SO,  124, 37175, 0x80b0014cU, "")
423*9712c20fSFrederick Mayle       .EndCU()
424*9712c20fSFrederick Mayle       .StartCU("aluminum")
425*9712c20fSFrederick Mayle       .Stab(N_SO,   72, 23084, 0x86756839U, "aluminum")
426*9712c20fSFrederick Mayle       .Stab(N_FUN,  59,  3305, 0xa8e120b0U, "selenium")
427*9712c20fSFrederick Mayle       .Stab(N_SO,  178, 56949, 0xbffff983U, "")
428*9712c20fSFrederick Mayle       .EndCU();
429*9712c20fSFrederick Mayle 
430*9712c20fSFrederick Mayle   {
431*9712c20fSFrederick Mayle     InSequence s;
432*9712c20fSFrederick Mayle     EXPECT_CALL(mock_handler,
433*9712c20fSFrederick Mayle                 StartCompilationUnit(StrEq("antimony"), 0x7e259f1aU, NULL))
434*9712c20fSFrederick Mayle         .WillOnce(Return(true));
435*9712c20fSFrederick Mayle     EXPECT_CALL(mock_handler, StartFunction(Eq("arsenic"), 0x7fbcccaeU))
436*9712c20fSFrederick Mayle         .WillOnce(Return(true));
437*9712c20fSFrederick Mayle     EXPECT_CALL(mock_handler, EndFunction(0x80b0014cU))
438*9712c20fSFrederick Mayle         .WillOnce(Return(true));
439*9712c20fSFrederick Mayle     EXPECT_CALL(mock_handler, EndCompilationUnit(0x80b0014cU))
440*9712c20fSFrederick Mayle         .WillOnce(Return(true));
441*9712c20fSFrederick Mayle     EXPECT_CALL(mock_handler,
442*9712c20fSFrederick Mayle                 StartCompilationUnit(StrEq("aluminum"), 0x86756839U, NULL))
443*9712c20fSFrederick Mayle         .WillOnce(Return(true));
444*9712c20fSFrederick Mayle     EXPECT_CALL(mock_handler, StartFunction(Eq("selenium"), 0xa8e120b0U))
445*9712c20fSFrederick Mayle         .WillOnce(Return(true));
446*9712c20fSFrederick Mayle     EXPECT_CALL(mock_handler, EndFunction(0xbffff983U))
447*9712c20fSFrederick Mayle         .WillOnce(Return(true));
448*9712c20fSFrederick Mayle     EXPECT_CALL(mock_handler, EndCompilationUnit(0xbffff983U))
449*9712c20fSFrederick Mayle         .WillOnce(Return(true));
450*9712c20fSFrederick Mayle   }
451*9712c20fSFrederick Mayle 
452*9712c20fSFrederick Mayle   ASSERT_TRUE(ApplyHandlerToMockStabsData());
453*9712c20fSFrederick Mayle }
454*9712c20fSFrederick Mayle 
455*9712c20fSFrederick Mayle // On systems that store STABS entries in the real symbol table, the N_UNDF
456*9712c20fSFrederick Mayle // entries have no special meaning, and shouldn't mess up the string
457*9712c20fSFrederick Mayle // indices.
TEST_F(Stabs,NonUnitized)458*9712c20fSFrederick Mayle TEST_F(Stabs, NonUnitized) {
459*9712c20fSFrederick Mayle   stabs.set_endianness(kLittleEndian);
460*9712c20fSFrederick Mayle   stabs.set_value_size(4);
461*9712c20fSFrederick Mayle   unitized = false;
462*9712c20fSFrederick Mayle   stabs
463*9712c20fSFrederick Mayle       .Stab(N_UNDF,    21, 11551, 0x9bad2b2e, "")
464*9712c20fSFrederick Mayle       .Stab(N_UNDF,    21, 11551, 0x9bad2b2e, "")
465*9712c20fSFrederick Mayle       .Stab(N_SO,      71, 45139, 0x11a97352, "Tanzania")
466*9712c20fSFrederick Mayle       .Stab(N_SO,     221, 41976, 0x21a97352, "");
467*9712c20fSFrederick Mayle 
468*9712c20fSFrederick Mayle   {
469*9712c20fSFrederick Mayle     InSequence s;
470*9712c20fSFrederick Mayle     EXPECT_CALL(mock_handler,
471*9712c20fSFrederick Mayle                 StartCompilationUnit(StrEq("Tanzania"),
472*9712c20fSFrederick Mayle                                      0x11a97352, NULL))
473*9712c20fSFrederick Mayle         .WillOnce(Return(true));
474*9712c20fSFrederick Mayle     EXPECT_CALL(mock_handler, EndCompilationUnit(0x21a97352))
475*9712c20fSFrederick Mayle         .WillOnce(Return(true));
476*9712c20fSFrederick Mayle   }
477*9712c20fSFrederick Mayle 
478*9712c20fSFrederick Mayle   ASSERT_TRUE(ApplyHandlerToMockStabsData());
479*9712c20fSFrederick Mayle }
480*9712c20fSFrederick Mayle 
TEST_F(Stabs,FunctionEnd)481*9712c20fSFrederick Mayle TEST_F(Stabs, FunctionEnd) {
482*9712c20fSFrederick Mayle   stabs.set_endianness(kLittleEndian);
483*9712c20fSFrederick Mayle   stabs.set_value_size(8);
484*9712c20fSFrederick Mayle   stabs
485*9712c20fSFrederick Mayle       .Stab(N_SO,    102, 62362, 0x52a830d644cd6942ULL, "compilation unit")
486*9712c20fSFrederick Mayle       // This function is terminated by the start of the next function.
487*9712c20fSFrederick Mayle       .Stab(N_FUN,   216, 38405, 0xbb5ab70ecdd23bfeULL, "function 1")
488*9712c20fSFrederick Mayle       // This function is terminated by an explicit end-of-function stab,
489*9712c20fSFrederick Mayle       // whose value is a size in bytes.
490*9712c20fSFrederick Mayle       .Stab(N_FUN,   240, 10973, 0xc954de9b8fb3e5e2ULL, "function 2")
491*9712c20fSFrederick Mayle       .Stab(N_FUN,    14, 36749, 0xc1ab,     "")
492*9712c20fSFrederick Mayle       // This function is terminated by the end of the compilation unit.
493*9712c20fSFrederick Mayle       .Stab(N_FUN,   143, 64514, 0xdff98c9a35386e1fULL, "function 3")
494*9712c20fSFrederick Mayle       .Stab(N_SO,    164, 60142, 0xfdacb856e78bbf57ULL, "");
495*9712c20fSFrederick Mayle 
496*9712c20fSFrederick Mayle   {
497*9712c20fSFrederick Mayle     InSequence s;
498*9712c20fSFrederick Mayle     EXPECT_CALL(mock_handler,
499*9712c20fSFrederick Mayle                 StartCompilationUnit(StrEq("compilation unit"),
500*9712c20fSFrederick Mayle                                      0x52a830d644cd6942ULL, NULL))
501*9712c20fSFrederick Mayle         .WillOnce(Return(true));
502*9712c20fSFrederick Mayle     EXPECT_CALL(mock_handler,
503*9712c20fSFrederick Mayle                 StartFunction(Eq("function 1"), 0xbb5ab70ecdd23bfeULL))
504*9712c20fSFrederick Mayle         .WillOnce(Return(true));
505*9712c20fSFrederick Mayle     EXPECT_CALL(mock_handler, EndFunction(0xc954de9b8fb3e5e2ULL))
506*9712c20fSFrederick Mayle         .WillOnce(Return(true));
507*9712c20fSFrederick Mayle     EXPECT_CALL(mock_handler,
508*9712c20fSFrederick Mayle                 StartFunction(Eq("function 2"), 0xc954de9b8fb3e5e2ULL))
509*9712c20fSFrederick Mayle         .WillOnce(Return(true));
510*9712c20fSFrederick Mayle     EXPECT_CALL(mock_handler, EndFunction(0xc954de9b8fb3e5e2ULL + 0xc1ab))
511*9712c20fSFrederick Mayle         .WillOnce(Return(true));
512*9712c20fSFrederick Mayle     EXPECT_CALL(mock_handler,
513*9712c20fSFrederick Mayle                 StartFunction(Eq("function 3"), 0xdff98c9a35386e1fULL))
514*9712c20fSFrederick Mayle         .WillOnce(Return(true));
515*9712c20fSFrederick Mayle     EXPECT_CALL(mock_handler, EndFunction(0xfdacb856e78bbf57ULL))
516*9712c20fSFrederick Mayle         .WillOnce(Return(true));
517*9712c20fSFrederick Mayle     EXPECT_CALL(mock_handler, EndCompilationUnit(0xfdacb856e78bbf57ULL))
518*9712c20fSFrederick Mayle         .WillOnce(Return(true));
519*9712c20fSFrederick Mayle   }
520*9712c20fSFrederick Mayle 
521*9712c20fSFrederick Mayle   ASSERT_TRUE(ApplyHandlerToMockStabsData());
522*9712c20fSFrederick Mayle }
523*9712c20fSFrederick Mayle 
524*9712c20fSFrederick Mayle // On Mac OS X, SLINE records can appear before the FUN stab to which they
525*9712c20fSFrederick Mayle // belong, and their values are absolute addresses, not offsets.
TEST_F(Stabs,LeadingLine)526*9712c20fSFrederick Mayle TEST_F(Stabs, LeadingLine) {
527*9712c20fSFrederick Mayle   stabs.set_endianness(kBigEndian);
528*9712c20fSFrederick Mayle   stabs.set_value_size(4);
529*9712c20fSFrederick Mayle   stabs
530*9712c20fSFrederick Mayle       .Stab(N_SO,    179, 27357, 0x8adabc15, "build directory/")
531*9712c20fSFrederick Mayle       .Stab(N_SO,     52, 53058, 0x4c7e3bf4, "compilation unit")
532*9712c20fSFrederick Mayle       .Stab(N_SOL,   165, 12086, 0x6a797ca3, "source file name")
533*9712c20fSFrederick Mayle       .Stab(N_SLINE, 229, 20015, 0x4cb3d7e0, "")
534*9712c20fSFrederick Mayle       .Stab(N_SLINE,  89, 43802, 0x4cba8b88, "")
535*9712c20fSFrederick Mayle       .Stab(N_FUN,   251, 51639, 0xce1b98fa, "rutabaga")
536*9712c20fSFrederick Mayle       .Stab(N_FUN,   218, 16113, 0x5798,     "")
537*9712c20fSFrederick Mayle       .Stab(N_SO,     52, 53058, 0xd4af4415, "");
538*9712c20fSFrederick Mayle 
539*9712c20fSFrederick Mayle   {
540*9712c20fSFrederick Mayle     InSequence s;
541*9712c20fSFrederick Mayle     EXPECT_CALL(mock_handler,
542*9712c20fSFrederick Mayle                 StartCompilationUnit(StrEq("compilation unit"),
543*9712c20fSFrederick Mayle                                      0x4c7e3bf4, StrEq("build directory/")))
544*9712c20fSFrederick Mayle         .WillOnce(Return(true));
545*9712c20fSFrederick Mayle     EXPECT_CALL(mock_handler,
546*9712c20fSFrederick Mayle                 StartFunction(Eq("rutabaga"), 0xce1b98fa))
547*9712c20fSFrederick Mayle         .WillOnce(Return(true));
548*9712c20fSFrederick Mayle     EXPECT_CALL(mock_handler,
549*9712c20fSFrederick Mayle                 Line(0x4cb3d7e0, StrEq("source file name"), 20015))
550*9712c20fSFrederick Mayle         .WillOnce(Return(true));
551*9712c20fSFrederick Mayle     EXPECT_CALL(mock_handler,
552*9712c20fSFrederick Mayle                 Line(0x4cba8b88, StrEq("source file name"), 43802))
553*9712c20fSFrederick Mayle         .WillOnce(Return(true));
554*9712c20fSFrederick Mayle     EXPECT_CALL(mock_handler, EndFunction(0xce1b98fa + 0x5798))
555*9712c20fSFrederick Mayle         .WillOnce(Return(true));
556*9712c20fSFrederick Mayle     EXPECT_CALL(mock_handler, EndCompilationUnit(0xd4af4415))
557*9712c20fSFrederick Mayle         .WillOnce(Return(true));
558*9712c20fSFrederick Mayle   }
559*9712c20fSFrederick Mayle 
560*9712c20fSFrederick Mayle   ASSERT_TRUE(ApplyHandlerToMockStabsData());
561*9712c20fSFrederick Mayle }
562*9712c20fSFrederick Mayle 
563*9712c20fSFrederick Mayle 
564*9712c20fSFrederick Mayle #if defined(HAVE_MACH_O_NLIST_H)
565*9712c20fSFrederick Mayle // These tests have no meaning on non-Mach-O-based systems, as
566*9712c20fSFrederick Mayle // only Mach-O uses N_SECT to represent public symbols.
TEST_F(Stabs,OnePublicSymbol)567*9712c20fSFrederick Mayle TEST_F(Stabs, OnePublicSymbol) {
568*9712c20fSFrederick Mayle   stabs.set_endianness(kLittleEndian);
569*9712c20fSFrederick Mayle   stabs.set_value_size(4);
570*9712c20fSFrederick Mayle 
571*9712c20fSFrederick Mayle   const uint32_t kExpectedAddress = 0x9000;
572*9712c20fSFrederick Mayle   const string kExpectedFunctionName("public_function");
573*9712c20fSFrederick Mayle   stabs
574*9712c20fSFrederick Mayle     .Stab(N_SECT, 1, 0, kExpectedAddress, kExpectedFunctionName);
575*9712c20fSFrederick Mayle 
576*9712c20fSFrederick Mayle   {
577*9712c20fSFrederick Mayle     InSequence s;
578*9712c20fSFrederick Mayle     EXPECT_CALL(mock_handler,
579*9712c20fSFrederick Mayle                 Extern(StrEq(kExpectedFunctionName),
580*9712c20fSFrederick Mayle                        kExpectedAddress))
581*9712c20fSFrederick Mayle         .WillOnce(Return(true));
582*9712c20fSFrederick Mayle   }
583*9712c20fSFrederick Mayle   ASSERT_TRUE(ApplyHandlerToMockStabsData());
584*9712c20fSFrederick Mayle }
585*9712c20fSFrederick Mayle 
TEST_F(Stabs,TwoPublicSymbols)586*9712c20fSFrederick Mayle TEST_F(Stabs, TwoPublicSymbols) {
587*9712c20fSFrederick Mayle   stabs.set_endianness(kLittleEndian);
588*9712c20fSFrederick Mayle   stabs.set_value_size(4);
589*9712c20fSFrederick Mayle 
590*9712c20fSFrederick Mayle   const uint32_t kExpectedAddress1 = 0xB0B0B0B0;
591*9712c20fSFrederick Mayle   const string kExpectedFunctionName1("public_function");
592*9712c20fSFrederick Mayle   const uint32_t kExpectedAddress2 = 0xF0F0F0F0;
593*9712c20fSFrederick Mayle   const string kExpectedFunctionName2("something else");
594*9712c20fSFrederick Mayle   stabs
595*9712c20fSFrederick Mayle     .Stab(N_SECT, 1, 0, kExpectedAddress1, kExpectedFunctionName1)
596*9712c20fSFrederick Mayle     .Stab(N_SECT, 1, 0, kExpectedAddress2, kExpectedFunctionName2);
597*9712c20fSFrederick Mayle 
598*9712c20fSFrederick Mayle   {
599*9712c20fSFrederick Mayle     InSequence s;
600*9712c20fSFrederick Mayle     EXPECT_CALL(mock_handler,
601*9712c20fSFrederick Mayle                 Extern(StrEq(kExpectedFunctionName1),
602*9712c20fSFrederick Mayle                        kExpectedAddress1))
603*9712c20fSFrederick Mayle         .WillOnce(Return(true));
604*9712c20fSFrederick Mayle     EXPECT_CALL(mock_handler,
605*9712c20fSFrederick Mayle                 Extern(StrEq(kExpectedFunctionName2),
606*9712c20fSFrederick Mayle                        kExpectedAddress2))
607*9712c20fSFrederick Mayle         .WillOnce(Return(true));
608*9712c20fSFrederick Mayle   }
609*9712c20fSFrederick Mayle   ASSERT_TRUE(ApplyHandlerToMockStabsData());
610*9712c20fSFrederick Mayle }
611*9712c20fSFrederick Mayle 
612*9712c20fSFrederick Mayle #endif
613*9712c20fSFrederick Mayle 
614*9712c20fSFrederick Mayle } // anonymous namespace
615