| Index: experimental/visual_studio_plugin/third_party/breakpad/common/dwarf/dwarf2diehandler_unittest.cc
|
| diff --git a/experimental/visual_studio_plugin/third_party/breakpad/common/dwarf/dwarf2diehandler_unittest.cc b/experimental/visual_studio_plugin/third_party/breakpad/common/dwarf/dwarf2diehandler_unittest.cc
|
| deleted file mode 100644
|
| index 67ccb95f88d92c11f9bd55acbc7ab26b04492e3c..0000000000000000000000000000000000000000
|
| --- a/experimental/visual_studio_plugin/third_party/breakpad/common/dwarf/dwarf2diehandler_unittest.cc
|
| +++ /dev/null
|
| @@ -1,560 +0,0 @@
|
| -// -*- mode: c++ -*-
|
| -
|
| -// Copyright (c) 2010 Google Inc. All Rights Reserved.
|
| -//
|
| -// Redistribution and use in source and binary forms, with or without
|
| -// modification, are permitted provided that the following conditions are
|
| -// met:
|
| -//
|
| -// * Redistributions of source code must retain the above copyright
|
| -// notice, this list of conditions and the following disclaimer.
|
| -// * Redistributions in binary form must reproduce the above
|
| -// copyright notice, this list of conditions and the following disclaimer
|
| -// in the documentation and/or other materials provided with the
|
| -// distribution.
|
| -// * Neither the name of Google Inc. nor the names of its
|
| -// contributors may be used to endorse or promote products derived from
|
| -// this software without specific prior written permission.
|
| -//
|
| -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
| -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
| -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
| -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
| -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
| -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
| -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
| -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
| -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
| -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
| -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
| -
|
| -// Original author: Jim Blandy <jimb@mozilla.com> <jimb@red-bean.com>
|
| -
|
| -// dwarf2diehander_unittest.cc: Unit tests for google_breakpad::DIEDispatcher.
|
| -
|
| -#include "breakpad_googletest_includes.h"
|
| -
|
| -#include "common/dwarf/dwarf2diehandler.h"
|
| -
|
| -using ::testing::_;
|
| -using ::testing::ContainerEq;
|
| -using ::testing::ElementsAreArray;
|
| -using ::testing::Eq;
|
| -using ::testing::InSequence;
|
| -using ::testing::Return;
|
| -using ::testing::Sequence;
|
| -using ::testing::StrEq;
|
| -
|
| -using dwarf2reader::AttributeList;
|
| -using dwarf2reader::DIEDispatcher;
|
| -using dwarf2reader::DIEHandler;
|
| -using dwarf2reader::DwarfAttribute;
|
| -using dwarf2reader::DwarfForm;
|
| -using dwarf2reader::DwarfTag;
|
| -using dwarf2reader::RootDIEHandler;
|
| -
|
| -class MockDIEHandler: public DIEHandler {
|
| - public:
|
| - MOCK_METHOD3(ProcessAttributeUnsigned,
|
| - void(DwarfAttribute, DwarfForm, uint64));
|
| - MOCK_METHOD3(ProcessAttributeSigned,
|
| - void(DwarfAttribute, DwarfForm, int64));
|
| - MOCK_METHOD3(ProcessAttributeReference,
|
| - void(DwarfAttribute, DwarfForm, uint64));
|
| - MOCK_METHOD4(ProcessAttributeBuffer,
|
| - void(DwarfAttribute, DwarfForm, const char *, uint64));
|
| - MOCK_METHOD3(ProcessAttributeString,
|
| - void(DwarfAttribute, DwarfForm, const string &));
|
| - MOCK_METHOD0(EndAttributes, bool());
|
| - MOCK_METHOD3(FindChildHandler, DIEHandler *(uint64, DwarfTag,
|
| - const AttributeList &));
|
| - MOCK_METHOD0(Finish, void());
|
| -};
|
| -
|
| -class MockRootDIEHandler: public RootDIEHandler {
|
| - public:
|
| - MOCK_METHOD3(ProcessAttributeUnsigned,
|
| - void(DwarfAttribute, DwarfForm, uint64));
|
| - MOCK_METHOD3(ProcessAttributeSigned,
|
| - void(DwarfAttribute, DwarfForm, int64));
|
| - MOCK_METHOD3(ProcessAttributeReference,
|
| - void(DwarfAttribute, DwarfForm, uint64));
|
| - MOCK_METHOD4(ProcessAttributeBuffer,
|
| - void(DwarfAttribute, DwarfForm, const char *, uint64));
|
| - MOCK_METHOD3(ProcessAttributeString,
|
| - void(DwarfAttribute, DwarfForm, const string &));
|
| - MOCK_METHOD0(EndAttributes, bool());
|
| - MOCK_METHOD3(FindChildHandler, DIEHandler *(uint64, DwarfTag,
|
| - const AttributeList &));
|
| - MOCK_METHOD0(Finish, void());
|
| - MOCK_METHOD5(StartCompilationUnit, bool(uint64, uint8, uint8, uint64, uint8));
|
| - MOCK_METHOD3(StartRootDIE, bool(uint64, DwarfTag, const AttributeList &));
|
| -};
|
| -
|
| -// If the handler elects to skip the compilation unit, the dispatcher
|
| -// should tell the reader so.
|
| -TEST(Dwarf2DIEHandler, SkipCompilationUnit) {
|
| - Sequence s;
|
| - MockRootDIEHandler mock_root_handler;
|
| - DIEDispatcher die_dispatcher(&mock_root_handler);
|
| -
|
| - EXPECT_CALL(mock_root_handler,
|
| - StartCompilationUnit(0x8d42aed77cfccf3eLL,
|
| - 0x89, 0xdc,
|
| - 0x2ecb4dc778a80f21LL,
|
| - 0x66))
|
| - .InSequence(s)
|
| - .WillOnce(Return(false));
|
| -
|
| - EXPECT_FALSE(die_dispatcher.StartCompilationUnit(0x8d42aed77cfccf3eLL,
|
| - 0x89, 0xdc,
|
| - 0x2ecb4dc778a80f21LL,
|
| - 0x66));
|
| -}
|
| -
|
| -// If the handler elects to skip the root DIE, the dispatcher should
|
| -// tell the reader so.
|
| -TEST(Dwarf2DIEHandler, SkipRootDIE) {
|
| - Sequence s;
|
| - MockRootDIEHandler mock_root_handler;
|
| - DIEDispatcher die_dispatcher(&mock_root_handler);
|
| -
|
| - AttributeList mock_attribute_list;
|
| - mock_attribute_list.push_back(make_pair(dwarf2reader::DW_AT_name,
|
| - dwarf2reader::DW_FORM_string));
|
| -
|
| - EXPECT_CALL(mock_root_handler,
|
| - StartCompilationUnit(0xde8994029fc8b999LL, 0xf4, 0x02,
|
| - 0xb00febffa76e2b2bLL, 0x5c))
|
| - .InSequence(s)
|
| - .WillOnce(Return(true));
|
| - EXPECT_CALL(mock_root_handler,
|
| - StartRootDIE(0x7d08242b4b510cf2LL, (DwarfTag) 0xb4f98da6,
|
| - ContainerEq(mock_attribute_list)))
|
| - .InSequence(s)
|
| - .WillOnce(Return(false));
|
| -
|
| - EXPECT_TRUE(die_dispatcher.StartCompilationUnit(0xde8994029fc8b999LL,
|
| - 0xf4, 0x02,
|
| - 0xb00febffa76e2b2bLL, 0x5c));
|
| - EXPECT_FALSE(die_dispatcher.StartDIE(0x7d08242b4b510cf2LL,
|
| - (DwarfTag) 0xb4f98da6,
|
| - mock_attribute_list));
|
| - die_dispatcher.EndDIE(0x7d08242b4b510cf2LL);
|
| -}
|
| -
|
| -// If the handler elects to skip the root DIE's children, the
|
| -// dispatcher should tell the reader so --- and avoid deleting the
|
| -// root handler.
|
| -TEST(Dwarf2DIEHandler, SkipRootDIEChildren) {
|
| - MockRootDIEHandler mock_root_handler;
|
| - DIEDispatcher die_dispatcher(&mock_root_handler);
|
| -
|
| - AttributeList mock_attribute_list;
|
| -
|
| - {
|
| - InSequence s;
|
| -
|
| - EXPECT_CALL(mock_root_handler,
|
| - StartCompilationUnit(0x15d6897480cc65a7LL, 0x26, 0xa0,
|
| - 0x09f8bf0767f91675LL, 0xdb))
|
| - .WillOnce(Return(true));
|
| - EXPECT_CALL(mock_root_handler,
|
| - StartRootDIE(0x7d08242b4b510cf2LL, (DwarfTag) 0xb4f98da6,
|
| - ContainerEq(mock_attribute_list)))
|
| - .WillOnce(Return(true));
|
| - // Please don't tell me about my children.
|
| - EXPECT_CALL(mock_root_handler, EndAttributes())
|
| - .WillOnce(Return(false));
|
| - EXPECT_CALL(mock_root_handler, Finish())
|
| - .WillOnce(Return());
|
| - }
|
| -
|
| - EXPECT_TRUE(die_dispatcher.StartCompilationUnit(0x15d6897480cc65a7LL,
|
| - 0x26, 0xa0,
|
| - 0x09f8bf0767f91675LL, 0xdb));
|
| - EXPECT_TRUE(die_dispatcher.StartDIE(0x7d08242b4b510cf2LL,
|
| - (DwarfTag) 0xb4f98da6,
|
| - mock_attribute_list));
|
| - EXPECT_FALSE(die_dispatcher.StartDIE(0x435150ceedccda18LL,
|
| - (DwarfTag) 0xc3a17bba,
|
| - mock_attribute_list));
|
| - die_dispatcher.EndDIE(0x435150ceedccda18LL);
|
| - die_dispatcher.EndDIE(0x7d08242b4b510cf2LL);
|
| -}
|
| -
|
| -// The dispatcher should pass attribute values through to the die
|
| -// handler accurately.
|
| -TEST(Dwarf2DIEHandler, PassAttributeValues) {
|
| - MockRootDIEHandler mock_root_handler;
|
| - DIEDispatcher die_dispatcher(&mock_root_handler);
|
| -
|
| - AttributeList mock_attribute_list;
|
| - mock_attribute_list.push_back(make_pair(dwarf2reader::DW_AT_name,
|
| - dwarf2reader::DW_FORM_string));
|
| - const char buffer[10] = { 0x24, 0x24, 0x35, 0x9a, 0xca,
|
| - 0xcf, 0xa8, 0x84, 0xa7, 0x18 };
|
| - string str = "\xc8\x26\x2e\x0d\xa4\x9c\x37\xd6\xfb\x1d";
|
| -
|
| - // Set expectations.
|
| - {
|
| - InSequence s;
|
| -
|
| - // We'll like the compilation unit header.
|
| - EXPECT_CALL(mock_root_handler,
|
| - StartCompilationUnit(0x8d42aed77cfccf3eLL, 0x89, 0xdc,
|
| - 0x2ecb4dc778a80f21LL, 0x66))
|
| - .WillOnce(Return(true));
|
| -
|
| - // We'll like the root DIE.
|
| - EXPECT_CALL(mock_root_handler,
|
| - StartRootDIE(0xe2222da01e29f2a9LL, (DwarfTag) 0x9829445c,
|
| - ContainerEq(mock_attribute_list)))
|
| - .WillOnce(Return(true));
|
| -
|
| - // Expect some attribute values.
|
| - EXPECT_CALL(mock_root_handler,
|
| - ProcessAttributeUnsigned((DwarfAttribute) 0x1cc0bfed,
|
| - (DwarfForm) 0x424f1468,
|
| - 0xa592571997facda1ULL))
|
| - .WillOnce(Return());
|
| - EXPECT_CALL(mock_root_handler,
|
| - ProcessAttributeSigned((DwarfAttribute) 0x43694dc9,
|
| - (DwarfForm) 0xf6f78901L,
|
| - 0x92602a4e3bf1f446LL))
|
| - .WillOnce(Return());
|
| - EXPECT_CALL(mock_root_handler,
|
| - ProcessAttributeReference((DwarfAttribute) 0x4033e8cL,
|
| - (DwarfForm) 0xf66fbe0bL,
|
| - 0x50fddef44734fdecULL))
|
| - .WillOnce(Return());
|
| - EXPECT_CALL(mock_root_handler,
|
| - ProcessAttributeBuffer((DwarfAttribute) 0x25d7e0af,
|
| - (DwarfForm) 0xe99a539a,
|
| - buffer, sizeof(buffer)))
|
| - .WillOnce(Return());
|
| - EXPECT_CALL(mock_root_handler,
|
| - ProcessAttributeString((DwarfAttribute) 0x310ed065,
|
| - (DwarfForm) 0x15762fec,
|
| - StrEq(str)))
|
| - .WillOnce(Return());
|
| - EXPECT_CALL(mock_root_handler, EndAttributes())
|
| - .WillOnce(Return(true));
|
| - EXPECT_CALL(mock_root_handler, FindChildHandler(_, _, _))
|
| - .Times(0);
|
| - EXPECT_CALL(mock_root_handler, Finish())
|
| - .WillOnce(Return());
|
| - }
|
| -
|
| - // Drive the dispatcher.
|
| -
|
| - // Report the CU header.
|
| - EXPECT_TRUE(die_dispatcher.StartCompilationUnit(0x8d42aed77cfccf3eLL,
|
| - 0x89, 0xdc,
|
| - 0x2ecb4dc778a80f21LL,
|
| - 0x66));
|
| - // Report the root DIE.
|
| - EXPECT_TRUE(die_dispatcher.StartDIE(0xe2222da01e29f2a9LL,
|
| - (DwarfTag) 0x9829445c,
|
| - mock_attribute_list));
|
| -
|
| - // Report some attribute values.
|
| - die_dispatcher.ProcessAttributeUnsigned(0xe2222da01e29f2a9LL,
|
| - (DwarfAttribute) 0x1cc0bfed,
|
| - (DwarfForm) 0x424f1468,
|
| - 0xa592571997facda1ULL);
|
| - die_dispatcher.ProcessAttributeSigned(0xe2222da01e29f2a9LL,
|
| - (DwarfAttribute) 0x43694dc9,
|
| - (DwarfForm) 0xf6f78901,
|
| - 0x92602a4e3bf1f446LL);
|
| - die_dispatcher.ProcessAttributeReference(0xe2222da01e29f2a9LL,
|
| - (DwarfAttribute) 0x4033e8c,
|
| - (DwarfForm) 0xf66fbe0b,
|
| - 0x50fddef44734fdecULL);
|
| - die_dispatcher.ProcessAttributeBuffer(0xe2222da01e29f2a9LL,
|
| - (DwarfAttribute) 0x25d7e0af,
|
| - (DwarfForm) 0xe99a539a,
|
| - buffer, sizeof(buffer));
|
| - die_dispatcher.ProcessAttributeString(0xe2222da01e29f2a9LL,
|
| - (DwarfAttribute) 0x310ed065,
|
| - (DwarfForm) 0x15762fec,
|
| - str);
|
| -
|
| - // Finish the root DIE (and thus the CU).
|
| - die_dispatcher.EndDIE(0xe2222da01e29f2a9LL);
|
| -}
|
| -
|
| -TEST(Dwarf2DIEHandler, FindAndSkipChildren) {
|
| - MockRootDIEHandler mock_root_handler;
|
| - MockDIEHandler *mock_child1_handler = new(MockDIEHandler);
|
| - MockDIEHandler *mock_child3_handler = new(MockDIEHandler);
|
| - DIEDispatcher die_dispatcher(&mock_root_handler);
|
| -
|
| - AttributeList root_attribute_list;
|
| - root_attribute_list.push_back(make_pair((DwarfAttribute) 0xb01185df,
|
| - (DwarfForm) 0xbc97cee8));
|
| - AttributeList child1_attribute_list;
|
| - child1_attribute_list.push_back(make_pair((DwarfAttribute) 0x41014e43,
|
| - (DwarfForm) 0x63155f4c));
|
| - AttributeList grandchild1_attribute_list;
|
| - grandchild1_attribute_list.push_back(make_pair((DwarfAttribute) 0xf72f823c,
|
| - (DwarfForm) 0x0ff6a201));
|
| - AttributeList greatgrandchild1_attribute_list;
|
| - greatgrandchild1_attribute_list
|
| - .push_back(make_pair((DwarfAttribute) 0xbe66e5f0, (DwarfForm) 0xb4b24ff7));
|
| - AttributeList child2_attribute_list;
|
| - child1_attribute_list.push_back(make_pair((DwarfAttribute) 0xf22df14c,
|
| - (DwarfForm) 0x20676e7d));
|
| - AttributeList child3_attribute_list;
|
| - child3_attribute_list.push_back(make_pair((DwarfAttribute) 0xe8bf1201,
|
| - (DwarfForm) 0x53a5b7a8));
|
| -
|
| - {
|
| - InSequence s;
|
| -
|
| - // We'll like the compilation unit header.
|
| - EXPECT_CALL(mock_root_handler,
|
| - StartCompilationUnit(0x9ec1e6d05e434a0eLL, 0xeb, 0x21,
|
| - 0x47dd3c764275a216LL, 0xa5))
|
| - .WillOnce(Return(true));
|
| -
|
| - // Root DIE.
|
| - {
|
| - EXPECT_CALL(mock_root_handler,
|
| - StartRootDIE(0x15f0e06bdfe3c372LL, (DwarfTag) 0xf5d60c59,
|
| - ContainerEq(root_attribute_list)))
|
| - .WillOnce(Return(true));
|
| - EXPECT_CALL(mock_root_handler,
|
| - ProcessAttributeSigned((DwarfAttribute) 0xf779a642,
|
| - (DwarfForm) 0x2cb63027,
|
| - 0x18e744661769d08fLL))
|
| - .WillOnce(Return());
|
| - EXPECT_CALL(mock_root_handler, EndAttributes())
|
| - .WillOnce(Return(true));
|
| -
|
| - // First child DIE.
|
| - EXPECT_CALL(mock_root_handler,
|
| - FindChildHandler(0x149f644f8116fe8cLL,
|
| - (DwarfTag) 0xac2cbd8c,
|
| - ContainerEq(child1_attribute_list)))
|
| - .WillOnce(Return(mock_child1_handler));
|
| - {
|
| - EXPECT_CALL(*mock_child1_handler,
|
| - ProcessAttributeSigned((DwarfAttribute) 0xa6fd6f65,
|
| - (DwarfForm) 0xe4f64c41,
|
| - 0x1b04e5444a55fe67LL))
|
| - .WillOnce(Return());
|
| - EXPECT_CALL(*mock_child1_handler, EndAttributes())
|
| - .WillOnce(Return(false));
|
| - // Skip first grandchild DIE and first great-grandchild DIE.
|
| - EXPECT_CALL(*mock_child1_handler, Finish())
|
| - .WillOnce(Return());
|
| - }
|
| -
|
| - // Second child DIE. Root handler will decline to return a handler
|
| - // for this child.
|
| - EXPECT_CALL(mock_root_handler,
|
| - FindChildHandler(0x97412be24875de9dLL,
|
| - (DwarfTag) 0x505a068b,
|
| - ContainerEq(child2_attribute_list)))
|
| - .WillOnce(Return((DIEHandler *) NULL));
|
| -
|
| - // Third child DIE.
|
| - EXPECT_CALL(mock_root_handler,
|
| - FindChildHandler(0x753c964c8ab538aeLL,
|
| - (DwarfTag) 0x8c22970e,
|
| - ContainerEq(child3_attribute_list)))
|
| - .WillOnce(Return(mock_child3_handler));
|
| - {
|
| - EXPECT_CALL(*mock_child3_handler,
|
| - ProcessAttributeSigned((DwarfAttribute) 0x4e2b7cfb,
|
| - (DwarfForm) 0x610b7ae1,
|
| - 0x3ea5c609d7d7560fLL))
|
| - .WillOnce(Return());
|
| - EXPECT_CALL(*mock_child3_handler, EndAttributes())
|
| - .WillOnce(Return(true));
|
| - EXPECT_CALL(*mock_child3_handler, Finish())
|
| - .WillOnce(Return());
|
| - }
|
| -
|
| - EXPECT_CALL(mock_root_handler, Finish())
|
| - .WillOnce(Return());
|
| - }
|
| - }
|
| -
|
| -
|
| - // Drive the dispatcher.
|
| -
|
| - // Report the CU header.
|
| - EXPECT_TRUE(die_dispatcher
|
| - .StartCompilationUnit(0x9ec1e6d05e434a0eLL, 0xeb, 0x21,
|
| - 0x47dd3c764275a216LL, 0xa5));
|
| - // Report the root DIE.
|
| - {
|
| - EXPECT_TRUE(die_dispatcher.StartDIE(0x15f0e06bdfe3c372LL,
|
| - (DwarfTag) 0xf5d60c59,
|
| - root_attribute_list));
|
| - die_dispatcher.ProcessAttributeSigned(0x15f0e06bdfe3c372LL,
|
| - (DwarfAttribute) 0xf779a642,
|
| - (DwarfForm) 0x2cb63027,
|
| - 0x18e744661769d08fLL);
|
| -
|
| - // First child DIE.
|
| - {
|
| - EXPECT_TRUE(die_dispatcher.StartDIE(0x149f644f8116fe8cLL,
|
| - (DwarfTag) 0xac2cbd8c,
|
| - child1_attribute_list));
|
| - die_dispatcher.ProcessAttributeSigned(0x149f644f8116fe8cLL,
|
| - (DwarfAttribute) 0xa6fd6f65,
|
| - (DwarfForm) 0xe4f64c41,
|
| - 0x1b04e5444a55fe67LL);
|
| -
|
| - // First grandchild DIE. Will be skipped.
|
| - {
|
| - EXPECT_FALSE(die_dispatcher.StartDIE(0xd68de1ee0bd29419LL,
|
| - (DwarfTag) 0x22f05a15,
|
| - grandchild1_attribute_list));
|
| - // First great-grandchild DIE. Will be skipped without being
|
| - // mentioned to any handler.
|
| - {
|
| - EXPECT_FALSE(die_dispatcher
|
| - .StartDIE(0xb3076285d25cac25LL,
|
| - (DwarfTag) 0xcff4061b,
|
| - greatgrandchild1_attribute_list));
|
| - die_dispatcher.EndDIE(0xb3076285d25cac25LL);
|
| - }
|
| - die_dispatcher.EndDIE(0xd68de1ee0bd29419LL);
|
| - }
|
| - die_dispatcher.EndDIE(0x149f644f8116fe8cLL);
|
| - }
|
| -
|
| - // Second child DIE. Root handler will decline to find a handler for it.
|
| - {
|
| - EXPECT_FALSE(die_dispatcher.StartDIE(0x97412be24875de9dLL,
|
| - (DwarfTag) 0x505a068b,
|
| - child2_attribute_list));
|
| - die_dispatcher.EndDIE(0x97412be24875de9dLL);
|
| - }
|
| -
|
| - // Third child DIE.
|
| - {
|
| - EXPECT_TRUE(die_dispatcher.StartDIE(0x753c964c8ab538aeLL,
|
| - (DwarfTag) 0x8c22970e,
|
| - child3_attribute_list));
|
| - die_dispatcher.ProcessAttributeSigned(0x753c964c8ab538aeLL,
|
| - (DwarfAttribute) 0x4e2b7cfb,
|
| - (DwarfForm) 0x610b7ae1,
|
| - 0x3ea5c609d7d7560fLL);
|
| - die_dispatcher.EndDIE(0x753c964c8ab538aeLL);
|
| - }
|
| -
|
| - // Finish the root DIE (and thus the CU).
|
| - die_dispatcher.EndDIE(0x15f0e06bdfe3c372LL);
|
| - }
|
| -}
|
| -
|
| -// The DIEDispatcher destructor is supposed to delete all handlers on
|
| -// the stack, except for the root.
|
| -TEST(Dwarf2DIEHandler, FreeHandlersOnStack) {
|
| - MockRootDIEHandler mock_root_handler;
|
| - MockDIEHandler *mock_child_handler = new(MockDIEHandler);
|
| - MockDIEHandler *mock_grandchild_handler = new(MockDIEHandler);
|
| - AttributeList empty_attribute_list;
|
| -
|
| - {
|
| - InSequence s;
|
| -
|
| - // We'll like the compilation unit header.
|
| - EXPECT_CALL(mock_root_handler,
|
| - StartCompilationUnit(0x87b41ba8381cd71cLL, 0xff, 0x89,
|
| - 0x76d392ff393ddda2LL, 0xbf))
|
| - .WillOnce(Return(true));
|
| -
|
| - // Root DIE.
|
| - {
|
| - EXPECT_CALL(mock_root_handler,
|
| - StartRootDIE(0xbf13b761691ddc91LL, (DwarfTag) 0x98980361,
|
| - ContainerEq(empty_attribute_list)))
|
| - .WillOnce(Return(true));
|
| - EXPECT_CALL(mock_root_handler, EndAttributes())
|
| - .WillOnce(Return(true));
|
| -
|
| - // Child DIE.
|
| - EXPECT_CALL(mock_root_handler,
|
| - FindChildHandler(0x058f09240c5fc8c9LL,
|
| - (DwarfTag) 0x898bf0d0,
|
| - ContainerEq(empty_attribute_list)))
|
| - .WillOnce(Return(mock_child_handler));
|
| - {
|
| - EXPECT_CALL(*mock_child_handler, EndAttributes())
|
| - .WillOnce(Return(true));
|
| -
|
| - // Grandchild DIE.
|
| - EXPECT_CALL(*mock_child_handler,
|
| - FindChildHandler(0x32dc00c9945dc0c8LL,
|
| - (DwarfTag) 0x2802d007,
|
| - ContainerEq(empty_attribute_list)))
|
| - .WillOnce(Return(mock_grandchild_handler));
|
| - {
|
| - EXPECT_CALL(*mock_grandchild_handler,
|
| - ProcessAttributeSigned((DwarfAttribute) 0x4e2b7cfb,
|
| - (DwarfForm) 0x610b7ae1,
|
| - 0x3ea5c609d7d7560fLL))
|
| - .WillOnce(Return());
|
| -
|
| - // At this point, we abandon the traversal, so none of the
|
| - // usual stuff should get called.
|
| - EXPECT_CALL(*mock_grandchild_handler, EndAttributes())
|
| - .Times(0);
|
| - EXPECT_CALL(*mock_grandchild_handler, Finish())
|
| - .Times(0);
|
| - }
|
| -
|
| - EXPECT_CALL(*mock_child_handler, Finish())
|
| - .Times(0);
|
| - }
|
| -
|
| - EXPECT_CALL(mock_root_handler, Finish())
|
| - .Times(0);
|
| - }
|
| - }
|
| -
|
| - // The dispatcher.
|
| - DIEDispatcher die_dispatcher(&mock_root_handler);
|
| -
|
| - // Report the CU header.
|
| - EXPECT_TRUE(die_dispatcher
|
| - .StartCompilationUnit(0x87b41ba8381cd71cLL, 0xff, 0x89,
|
| - 0x76d392ff393ddda2LL, 0xbf));
|
| - // Report the root DIE.
|
| - {
|
| - EXPECT_TRUE(die_dispatcher.StartDIE(0xbf13b761691ddc91LL,
|
| - (DwarfTag) 0x98980361,
|
| - empty_attribute_list));
|
| -
|
| - // Child DIE.
|
| - {
|
| - EXPECT_TRUE(die_dispatcher.StartDIE(0x058f09240c5fc8c9LL,
|
| - (DwarfTag) 0x898bf0d0,
|
| - empty_attribute_list));
|
| -
|
| - // Grandchild DIE.
|
| - {
|
| - EXPECT_TRUE(die_dispatcher.StartDIE(0x32dc00c9945dc0c8LL,
|
| - (DwarfTag) 0x2802d007,
|
| - empty_attribute_list));
|
| - die_dispatcher.ProcessAttributeSigned(0x32dc00c9945dc0c8LL,
|
| - (DwarfAttribute) 0x4e2b7cfb,
|
| - (DwarfForm) 0x610b7ae1,
|
| - 0x3ea5c609d7d7560fLL);
|
| -
|
| - // Stop the traversal abruptly, so that there will still be
|
| - // handlers on the stack when the dispatcher is destructed.
|
| -
|
| - // No EndDIE call...
|
| - }
|
| - // No EndDIE call...
|
| - }
|
| - // No EndDIE call...
|
| - }
|
| -}
|
|
|