153a3c9b4ab57f04b46bc3abf42e36bdfa821f7f3Christopher Ferris/* 253a3c9b4ab57f04b46bc3abf42e36bdfa821f7f3Christopher Ferris * Copyright (C) 2016 The Android Open Source Project 353a3c9b4ab57f04b46bc3abf42e36bdfa821f7f3Christopher Ferris * 453a3c9b4ab57f04b46bc3abf42e36bdfa821f7f3Christopher Ferris * Licensed under the Apache License, Version 2.0 (the "License"); 553a3c9b4ab57f04b46bc3abf42e36bdfa821f7f3Christopher Ferris * you may not use this file except in compliance with the License. 653a3c9b4ab57f04b46bc3abf42e36bdfa821f7f3Christopher Ferris * You may obtain a copy of the License at 753a3c9b4ab57f04b46bc3abf42e36bdfa821f7f3Christopher Ferris * 853a3c9b4ab57f04b46bc3abf42e36bdfa821f7f3Christopher Ferris * http://www.apache.org/licenses/LICENSE-2.0 953a3c9b4ab57f04b46bc3abf42e36bdfa821f7f3Christopher Ferris * 1053a3c9b4ab57f04b46bc3abf42e36bdfa821f7f3Christopher Ferris * Unless required by applicable law or agreed to in writing, software 1153a3c9b4ab57f04b46bc3abf42e36bdfa821f7f3Christopher Ferris * distributed under the License is distributed on an "AS IS" BASIS, 1253a3c9b4ab57f04b46bc3abf42e36bdfa821f7f3Christopher Ferris * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1353a3c9b4ab57f04b46bc3abf42e36bdfa821f7f3Christopher Ferris * See the License for the specific language governing permissions and 1453a3c9b4ab57f04b46bc3abf42e36bdfa821f7f3Christopher Ferris * limitations under the License. 1553a3c9b4ab57f04b46bc3abf42e36bdfa821f7f3Christopher Ferris */ 1653a3c9b4ab57f04b46bc3abf42e36bdfa821f7f3Christopher Ferris 1753a3c9b4ab57f04b46bc3abf42e36bdfa821f7f3Christopher Ferris#include <stdint.h> 1853a3c9b4ab57f04b46bc3abf42e36bdfa821f7f3Christopher Ferris 1953a3c9b4ab57f04b46bc3abf42e36bdfa821f7f3Christopher Ferris#include <gmock/gmock.h> 2053a3c9b4ab57f04b46bc3abf42e36bdfa821f7f3Christopher Ferris#include <gtest/gtest.h> 2153a3c9b4ab57f04b46bc3abf42e36bdfa821f7f3Christopher Ferris 22d226a5140989f509a0ed3e2723f05d5fc93ce8dfChristopher Ferris#include <unwindstack/DwarfSection.h> 2353a3c9b4ab57f04b46bc3abf42e36bdfa821f7f3Christopher Ferris 2453a3c9b4ab57f04b46bc3abf42e36bdfa821f7f3Christopher Ferris#include "MemoryFake.h" 2553a3c9b4ab57f04b46bc3abf42e36bdfa821f7f3Christopher Ferris 26d226a5140989f509a0ed3e2723f05d5fc93ce8dfChristopher Ferrisnamespace unwindstack { 27d226a5140989f509a0ed3e2723f05d5fc93ce8dfChristopher Ferris 2853a3c9b4ab57f04b46bc3abf42e36bdfa821f7f3Christopher Ferrisclass MockDwarfSection : public DwarfSection { 2953a3c9b4ab57f04b46bc3abf42e36bdfa821f7f3Christopher Ferris public: 3053a3c9b4ab57f04b46bc3abf42e36bdfa821f7f3Christopher Ferris MockDwarfSection(Memory* memory) : DwarfSection(memory) {} 3153a3c9b4ab57f04b46bc3abf42e36bdfa821f7f3Christopher Ferris virtual ~MockDwarfSection() = default; 3253a3c9b4ab57f04b46bc3abf42e36bdfa821f7f3Christopher Ferris 3353a3c9b4ab57f04b46bc3abf42e36bdfa821f7f3Christopher Ferris MOCK_METHOD4(Log, bool(uint8_t, uint64_t, uint64_t, const DwarfFde*)); 3453a3c9b4ab57f04b46bc3abf42e36bdfa821f7f3Christopher Ferris 35b9de87f7edefd7a2473134b267716c5fd750e89fChristopher Ferris MOCK_METHOD5(Eval, bool(const DwarfCie*, Memory*, const dwarf_loc_regs_t&, Regs*, bool*)); 3653a3c9b4ab57f04b46bc3abf42e36bdfa821f7f3Christopher Ferris 3753a3c9b4ab57f04b46bc3abf42e36bdfa821f7f3Christopher Ferris MOCK_METHOD3(GetCfaLocationInfo, bool(uint64_t, const DwarfFde*, dwarf_loc_regs_t*)); 3853a3c9b4ab57f04b46bc3abf42e36bdfa821f7f3Christopher Ferris 3953a3c9b4ab57f04b46bc3abf42e36bdfa821f7f3Christopher Ferris MOCK_METHOD2(Init, bool(uint64_t, uint64_t)); 4053a3c9b4ab57f04b46bc3abf42e36bdfa821f7f3Christopher Ferris 4153a3c9b4ab57f04b46bc3abf42e36bdfa821f7f3Christopher Ferris MOCK_METHOD2(GetFdeOffsetFromPc, bool(uint64_t, uint64_t*)); 4253a3c9b4ab57f04b46bc3abf42e36bdfa821f7f3Christopher Ferris 4353a3c9b4ab57f04b46bc3abf42e36bdfa821f7f3Christopher Ferris MOCK_METHOD1(GetFdeFromOffset, const DwarfFde*(uint64_t)); 4453a3c9b4ab57f04b46bc3abf42e36bdfa821f7f3Christopher Ferris 4553a3c9b4ab57f04b46bc3abf42e36bdfa821f7f3Christopher Ferris MOCK_METHOD1(GetFdeFromIndex, const DwarfFde*(size_t)); 4653a3c9b4ab57f04b46bc3abf42e36bdfa821f7f3Christopher Ferris 4753a3c9b4ab57f04b46bc3abf42e36bdfa821f7f3Christopher Ferris MOCK_METHOD1(IsCie32, bool(uint32_t)); 4853a3c9b4ab57f04b46bc3abf42e36bdfa821f7f3Christopher Ferris 4953a3c9b4ab57f04b46bc3abf42e36bdfa821f7f3Christopher Ferris MOCK_METHOD1(IsCie64, bool(uint64_t)); 5053a3c9b4ab57f04b46bc3abf42e36bdfa821f7f3Christopher Ferris 5153a3c9b4ab57f04b46bc3abf42e36bdfa821f7f3Christopher Ferris MOCK_METHOD1(GetCieOffsetFromFde32, uint64_t(uint32_t)); 5253a3c9b4ab57f04b46bc3abf42e36bdfa821f7f3Christopher Ferris 5353a3c9b4ab57f04b46bc3abf42e36bdfa821f7f3Christopher Ferris MOCK_METHOD1(GetCieOffsetFromFde64, uint64_t(uint64_t)); 5453a3c9b4ab57f04b46bc3abf42e36bdfa821f7f3Christopher Ferris 5553a3c9b4ab57f04b46bc3abf42e36bdfa821f7f3Christopher Ferris MOCK_METHOD1(AdjustPcFromFde, uint64_t(uint64_t)); 5653a3c9b4ab57f04b46bc3abf42e36bdfa821f7f3Christopher Ferris}; 5753a3c9b4ab57f04b46bc3abf42e36bdfa821f7f3Christopher Ferris 5853a3c9b4ab57f04b46bc3abf42e36bdfa821f7f3Christopher Ferrisclass DwarfSectionTest : public ::testing::Test { 5953a3c9b4ab57f04b46bc3abf42e36bdfa821f7f3Christopher Ferris protected: 6053a3c9b4ab57f04b46bc3abf42e36bdfa821f7f3Christopher Ferris MemoryFake memory_; 6153a3c9b4ab57f04b46bc3abf42e36bdfa821f7f3Christopher Ferris}; 6253a3c9b4ab57f04b46bc3abf42e36bdfa821f7f3Christopher Ferris 6353a3c9b4ab57f04b46bc3abf42e36bdfa821f7f3Christopher FerrisTEST_F(DwarfSectionTest, GetFdeOffsetFromPc_fail_from_pc) { 6453a3c9b4ab57f04b46bc3abf42e36bdfa821f7f3Christopher Ferris MockDwarfSection mock_section(&memory_); 6553a3c9b4ab57f04b46bc3abf42e36bdfa821f7f3Christopher Ferris 6653a3c9b4ab57f04b46bc3abf42e36bdfa821f7f3Christopher Ferris EXPECT_CALL(mock_section, GetFdeOffsetFromPc(0x1000, ::testing::_)) 6753a3c9b4ab57f04b46bc3abf42e36bdfa821f7f3Christopher Ferris .WillOnce(::testing::Return(false)); 6853a3c9b4ab57f04b46bc3abf42e36bdfa821f7f3Christopher Ferris 6953a3c9b4ab57f04b46bc3abf42e36bdfa821f7f3Christopher Ferris // Verify nullptr when GetFdeOffsetFromPc fails. 7053a3c9b4ab57f04b46bc3abf42e36bdfa821f7f3Christopher Ferris ASSERT_TRUE(mock_section.GetFdeFromPc(0x1000) == nullptr); 7153a3c9b4ab57f04b46bc3abf42e36bdfa821f7f3Christopher Ferris} 7253a3c9b4ab57f04b46bc3abf42e36bdfa821f7f3Christopher Ferris 7353a3c9b4ab57f04b46bc3abf42e36bdfa821f7f3Christopher FerrisTEST_F(DwarfSectionTest, GetFdeOffsetFromPc_fail_fde_pc_end) { 7453a3c9b4ab57f04b46bc3abf42e36bdfa821f7f3Christopher Ferris MockDwarfSection mock_section(&memory_); 7553a3c9b4ab57f04b46bc3abf42e36bdfa821f7f3Christopher Ferris 7653a3c9b4ab57f04b46bc3abf42e36bdfa821f7f3Christopher Ferris DwarfFde fde{}; 7753a3c9b4ab57f04b46bc3abf42e36bdfa821f7f3Christopher Ferris fde.pc_end = 0x500; 7853a3c9b4ab57f04b46bc3abf42e36bdfa821f7f3Christopher Ferris 7953a3c9b4ab57f04b46bc3abf42e36bdfa821f7f3Christopher Ferris EXPECT_CALL(mock_section, GetFdeOffsetFromPc(0x1000, ::testing::_)) 8053a3c9b4ab57f04b46bc3abf42e36bdfa821f7f3Christopher Ferris .WillOnce(::testing::Return(true)); 8153a3c9b4ab57f04b46bc3abf42e36bdfa821f7f3Christopher Ferris EXPECT_CALL(mock_section, GetFdeFromOffset(::testing::_)).WillOnce(::testing::Return(&fde)); 8253a3c9b4ab57f04b46bc3abf42e36bdfa821f7f3Christopher Ferris 8353a3c9b4ab57f04b46bc3abf42e36bdfa821f7f3Christopher Ferris // Verify nullptr when GetFdeOffsetFromPc fails. 8453a3c9b4ab57f04b46bc3abf42e36bdfa821f7f3Christopher Ferris ASSERT_TRUE(mock_section.GetFdeFromPc(0x1000) == nullptr); 8553a3c9b4ab57f04b46bc3abf42e36bdfa821f7f3Christopher Ferris} 8653a3c9b4ab57f04b46bc3abf42e36bdfa821f7f3Christopher Ferris 8753a3c9b4ab57f04b46bc3abf42e36bdfa821f7f3Christopher FerrisTEST_F(DwarfSectionTest, GetFdeOffsetFromPc_pass) { 8853a3c9b4ab57f04b46bc3abf42e36bdfa821f7f3Christopher Ferris MockDwarfSection mock_section(&memory_); 8953a3c9b4ab57f04b46bc3abf42e36bdfa821f7f3Christopher Ferris 9053a3c9b4ab57f04b46bc3abf42e36bdfa821f7f3Christopher Ferris DwarfFde fde{}; 9153a3c9b4ab57f04b46bc3abf42e36bdfa821f7f3Christopher Ferris fde.pc_end = 0x2000; 9253a3c9b4ab57f04b46bc3abf42e36bdfa821f7f3Christopher Ferris 9353a3c9b4ab57f04b46bc3abf42e36bdfa821f7f3Christopher Ferris EXPECT_CALL(mock_section, GetFdeOffsetFromPc(0x1000, ::testing::_)) 9453a3c9b4ab57f04b46bc3abf42e36bdfa821f7f3Christopher Ferris .WillOnce(::testing::Return(true)); 9553a3c9b4ab57f04b46bc3abf42e36bdfa821f7f3Christopher Ferris EXPECT_CALL(mock_section, GetFdeFromOffset(::testing::_)).WillOnce(::testing::Return(&fde)); 9653a3c9b4ab57f04b46bc3abf42e36bdfa821f7f3Christopher Ferris 9753a3c9b4ab57f04b46bc3abf42e36bdfa821f7f3Christopher Ferris // Verify nullptr when GetFdeOffsetFromPc fails. 9853a3c9b4ab57f04b46bc3abf42e36bdfa821f7f3Christopher Ferris ASSERT_EQ(&fde, mock_section.GetFdeFromPc(0x1000)); 9953a3c9b4ab57f04b46bc3abf42e36bdfa821f7f3Christopher Ferris} 10053a3c9b4ab57f04b46bc3abf42e36bdfa821f7f3Christopher Ferris 10153a3c9b4ab57f04b46bc3abf42e36bdfa821f7f3Christopher FerrisTEST_F(DwarfSectionTest, Step_fail_fde) { 10253a3c9b4ab57f04b46bc3abf42e36bdfa821f7f3Christopher Ferris MockDwarfSection mock_section(&memory_); 10353a3c9b4ab57f04b46bc3abf42e36bdfa821f7f3Christopher Ferris 10453a3c9b4ab57f04b46bc3abf42e36bdfa821f7f3Christopher Ferris EXPECT_CALL(mock_section, GetFdeOffsetFromPc(0x1000, ::testing::_)) 10553a3c9b4ab57f04b46bc3abf42e36bdfa821f7f3Christopher Ferris .WillOnce(::testing::Return(false)); 10653a3c9b4ab57f04b46bc3abf42e36bdfa821f7f3Christopher Ferris 107b9de87f7edefd7a2473134b267716c5fd750e89fChristopher Ferris bool finished; 108b9de87f7edefd7a2473134b267716c5fd750e89fChristopher Ferris ASSERT_FALSE(mock_section.Step(0x1000, nullptr, nullptr, &finished)); 10953a3c9b4ab57f04b46bc3abf42e36bdfa821f7f3Christopher Ferris} 11053a3c9b4ab57f04b46bc3abf42e36bdfa821f7f3Christopher Ferris 11153a3c9b4ab57f04b46bc3abf42e36bdfa821f7f3Christopher FerrisTEST_F(DwarfSectionTest, Step_fail_cie_null) { 11253a3c9b4ab57f04b46bc3abf42e36bdfa821f7f3Christopher Ferris MockDwarfSection mock_section(&memory_); 11353a3c9b4ab57f04b46bc3abf42e36bdfa821f7f3Christopher Ferris 11453a3c9b4ab57f04b46bc3abf42e36bdfa821f7f3Christopher Ferris DwarfFde fde{}; 11553a3c9b4ab57f04b46bc3abf42e36bdfa821f7f3Christopher Ferris fde.pc_end = 0x2000; 11653a3c9b4ab57f04b46bc3abf42e36bdfa821f7f3Christopher Ferris fde.cie = nullptr; 11753a3c9b4ab57f04b46bc3abf42e36bdfa821f7f3Christopher Ferris 11853a3c9b4ab57f04b46bc3abf42e36bdfa821f7f3Christopher Ferris EXPECT_CALL(mock_section, GetFdeOffsetFromPc(0x1000, ::testing::_)) 11953a3c9b4ab57f04b46bc3abf42e36bdfa821f7f3Christopher Ferris .WillOnce(::testing::Return(true)); 12053a3c9b4ab57f04b46bc3abf42e36bdfa821f7f3Christopher Ferris EXPECT_CALL(mock_section, GetFdeFromOffset(::testing::_)).WillOnce(::testing::Return(&fde)); 12153a3c9b4ab57f04b46bc3abf42e36bdfa821f7f3Christopher Ferris 122b9de87f7edefd7a2473134b267716c5fd750e89fChristopher Ferris bool finished; 123b9de87f7edefd7a2473134b267716c5fd750e89fChristopher Ferris ASSERT_FALSE(mock_section.Step(0x1000, nullptr, nullptr, &finished)); 12453a3c9b4ab57f04b46bc3abf42e36bdfa821f7f3Christopher Ferris} 12553a3c9b4ab57f04b46bc3abf42e36bdfa821f7f3Christopher Ferris 12653a3c9b4ab57f04b46bc3abf42e36bdfa821f7f3Christopher FerrisTEST_F(DwarfSectionTest, Step_fail_cfa_location) { 12753a3c9b4ab57f04b46bc3abf42e36bdfa821f7f3Christopher Ferris MockDwarfSection mock_section(&memory_); 12853a3c9b4ab57f04b46bc3abf42e36bdfa821f7f3Christopher Ferris 12953a3c9b4ab57f04b46bc3abf42e36bdfa821f7f3Christopher Ferris DwarfCie cie{}; 13053a3c9b4ab57f04b46bc3abf42e36bdfa821f7f3Christopher Ferris DwarfFde fde{}; 13153a3c9b4ab57f04b46bc3abf42e36bdfa821f7f3Christopher Ferris fde.pc_end = 0x2000; 13253a3c9b4ab57f04b46bc3abf42e36bdfa821f7f3Christopher Ferris fde.cie = &cie; 13353a3c9b4ab57f04b46bc3abf42e36bdfa821f7f3Christopher Ferris 13453a3c9b4ab57f04b46bc3abf42e36bdfa821f7f3Christopher Ferris EXPECT_CALL(mock_section, GetFdeOffsetFromPc(0x1000, ::testing::_)) 13553a3c9b4ab57f04b46bc3abf42e36bdfa821f7f3Christopher Ferris .WillOnce(::testing::Return(true)); 13653a3c9b4ab57f04b46bc3abf42e36bdfa821f7f3Christopher Ferris EXPECT_CALL(mock_section, GetFdeFromOffset(::testing::_)).WillOnce(::testing::Return(&fde)); 13753a3c9b4ab57f04b46bc3abf42e36bdfa821f7f3Christopher Ferris 13853a3c9b4ab57f04b46bc3abf42e36bdfa821f7f3Christopher Ferris EXPECT_CALL(mock_section, GetCfaLocationInfo(0x1000, &fde, ::testing::_)) 13953a3c9b4ab57f04b46bc3abf42e36bdfa821f7f3Christopher Ferris .WillOnce(::testing::Return(false)); 14053a3c9b4ab57f04b46bc3abf42e36bdfa821f7f3Christopher Ferris 141b9de87f7edefd7a2473134b267716c5fd750e89fChristopher Ferris bool finished; 142b9de87f7edefd7a2473134b267716c5fd750e89fChristopher Ferris ASSERT_FALSE(mock_section.Step(0x1000, nullptr, nullptr, &finished)); 14353a3c9b4ab57f04b46bc3abf42e36bdfa821f7f3Christopher Ferris} 14453a3c9b4ab57f04b46bc3abf42e36bdfa821f7f3Christopher Ferris 14553a3c9b4ab57f04b46bc3abf42e36bdfa821f7f3Christopher FerrisTEST_F(DwarfSectionTest, Step_pass) { 14653a3c9b4ab57f04b46bc3abf42e36bdfa821f7f3Christopher Ferris MockDwarfSection mock_section(&memory_); 14753a3c9b4ab57f04b46bc3abf42e36bdfa821f7f3Christopher Ferris 14853a3c9b4ab57f04b46bc3abf42e36bdfa821f7f3Christopher Ferris DwarfCie cie{}; 14953a3c9b4ab57f04b46bc3abf42e36bdfa821f7f3Christopher Ferris DwarfFde fde{}; 15053a3c9b4ab57f04b46bc3abf42e36bdfa821f7f3Christopher Ferris fde.pc_end = 0x2000; 15153a3c9b4ab57f04b46bc3abf42e36bdfa821f7f3Christopher Ferris fde.cie = &cie; 15253a3c9b4ab57f04b46bc3abf42e36bdfa821f7f3Christopher Ferris 15353a3c9b4ab57f04b46bc3abf42e36bdfa821f7f3Christopher Ferris EXPECT_CALL(mock_section, GetFdeOffsetFromPc(0x1000, ::testing::_)) 15453a3c9b4ab57f04b46bc3abf42e36bdfa821f7f3Christopher Ferris .WillOnce(::testing::Return(true)); 15553a3c9b4ab57f04b46bc3abf42e36bdfa821f7f3Christopher Ferris EXPECT_CALL(mock_section, GetFdeFromOffset(::testing::_)).WillOnce(::testing::Return(&fde)); 15653a3c9b4ab57f04b46bc3abf42e36bdfa821f7f3Christopher Ferris 15753a3c9b4ab57f04b46bc3abf42e36bdfa821f7f3Christopher Ferris EXPECT_CALL(mock_section, GetCfaLocationInfo(0x1000, &fde, ::testing::_)) 15853a3c9b4ab57f04b46bc3abf42e36bdfa821f7f3Christopher Ferris .WillOnce(::testing::Return(true)); 15953a3c9b4ab57f04b46bc3abf42e36bdfa821f7f3Christopher Ferris 16053a3c9b4ab57f04b46bc3abf42e36bdfa821f7f3Christopher Ferris MemoryFake process; 161b9de87f7edefd7a2473134b267716c5fd750e89fChristopher Ferris EXPECT_CALL(mock_section, Eval(&cie, &process, ::testing::_, nullptr, ::testing::_)) 16253a3c9b4ab57f04b46bc3abf42e36bdfa821f7f3Christopher Ferris .WillOnce(::testing::Return(true)); 16353a3c9b4ab57f04b46bc3abf42e36bdfa821f7f3Christopher Ferris 164b9de87f7edefd7a2473134b267716c5fd750e89fChristopher Ferris bool finished; 165b9de87f7edefd7a2473134b267716c5fd750e89fChristopher Ferris ASSERT_TRUE(mock_section.Step(0x1000, nullptr, &process, &finished)); 16653a3c9b4ab57f04b46bc3abf42e36bdfa821f7f3Christopher Ferris} 167d226a5140989f509a0ed3e2723f05d5fc93ce8dfChristopher Ferris 16812d902961b2f119dfccd71523041949ff1668c6eDavid Srbeckystatic bool MockGetCfaLocationInfo(::testing::Unused, const DwarfFde* fde, 16912d902961b2f119dfccd71523041949ff1668c6eDavid Srbecky dwarf_loc_regs_t* loc_regs) { 17012d902961b2f119dfccd71523041949ff1668c6eDavid Srbecky loc_regs->pc_start = fde->pc_start; 17112d902961b2f119dfccd71523041949ff1668c6eDavid Srbecky loc_regs->pc_end = fde->pc_end; 17212d902961b2f119dfccd71523041949ff1668c6eDavid Srbecky return true; 17312d902961b2f119dfccd71523041949ff1668c6eDavid Srbecky} 17412d902961b2f119dfccd71523041949ff1668c6eDavid Srbecky 17512d902961b2f119dfccd71523041949ff1668c6eDavid SrbeckyTEST_F(DwarfSectionTest, Step_cache) { 17612d902961b2f119dfccd71523041949ff1668c6eDavid Srbecky MockDwarfSection mock_section(&memory_); 17712d902961b2f119dfccd71523041949ff1668c6eDavid Srbecky 17812d902961b2f119dfccd71523041949ff1668c6eDavid Srbecky DwarfCie cie{}; 17912d902961b2f119dfccd71523041949ff1668c6eDavid Srbecky DwarfFde fde{}; 18012d902961b2f119dfccd71523041949ff1668c6eDavid Srbecky fde.pc_start = 0x500; 18112d902961b2f119dfccd71523041949ff1668c6eDavid Srbecky fde.pc_end = 0x2000; 18212d902961b2f119dfccd71523041949ff1668c6eDavid Srbecky fde.cie = &cie; 18312d902961b2f119dfccd71523041949ff1668c6eDavid Srbecky 18412d902961b2f119dfccd71523041949ff1668c6eDavid Srbecky EXPECT_CALL(mock_section, GetFdeOffsetFromPc(0x1000, ::testing::_)) 18512d902961b2f119dfccd71523041949ff1668c6eDavid Srbecky .WillOnce(::testing::Return(true)); 18612d902961b2f119dfccd71523041949ff1668c6eDavid Srbecky EXPECT_CALL(mock_section, GetFdeFromOffset(::testing::_)).WillOnce(::testing::Return(&fde)); 18712d902961b2f119dfccd71523041949ff1668c6eDavid Srbecky 18812d902961b2f119dfccd71523041949ff1668c6eDavid Srbecky EXPECT_CALL(mock_section, GetCfaLocationInfo(0x1000, &fde, ::testing::_)) 18912d902961b2f119dfccd71523041949ff1668c6eDavid Srbecky .WillOnce(::testing::Invoke(MockGetCfaLocationInfo)); 19012d902961b2f119dfccd71523041949ff1668c6eDavid Srbecky 19112d902961b2f119dfccd71523041949ff1668c6eDavid Srbecky MemoryFake process; 19212d902961b2f119dfccd71523041949ff1668c6eDavid Srbecky EXPECT_CALL(mock_section, Eval(&cie, &process, ::testing::_, nullptr, ::testing::_)) 19312d902961b2f119dfccd71523041949ff1668c6eDavid Srbecky .WillRepeatedly(::testing::Return(true)); 19412d902961b2f119dfccd71523041949ff1668c6eDavid Srbecky 19512d902961b2f119dfccd71523041949ff1668c6eDavid Srbecky bool finished; 19612d902961b2f119dfccd71523041949ff1668c6eDavid Srbecky ASSERT_TRUE(mock_section.Step(0x1000, nullptr, &process, &finished)); 19712d902961b2f119dfccd71523041949ff1668c6eDavid Srbecky ASSERT_TRUE(mock_section.Step(0x1000, nullptr, &process, &finished)); 19812d902961b2f119dfccd71523041949ff1668c6eDavid Srbecky ASSERT_TRUE(mock_section.Step(0x1500, nullptr, &process, &finished)); 19912d902961b2f119dfccd71523041949ff1668c6eDavid Srbecky} 20012d902961b2f119dfccd71523041949ff1668c6eDavid Srbecky 20112d902961b2f119dfccd71523041949ff1668c6eDavid SrbeckyTEST_F(DwarfSectionTest, Step_cache_not_in_pc) { 20212d902961b2f119dfccd71523041949ff1668c6eDavid Srbecky MockDwarfSection mock_section(&memory_); 20312d902961b2f119dfccd71523041949ff1668c6eDavid Srbecky 20412d902961b2f119dfccd71523041949ff1668c6eDavid Srbecky DwarfCie cie{}; 20512d902961b2f119dfccd71523041949ff1668c6eDavid Srbecky DwarfFde fde0{}; 20612d902961b2f119dfccd71523041949ff1668c6eDavid Srbecky fde0.pc_start = 0x1000; 20712d902961b2f119dfccd71523041949ff1668c6eDavid Srbecky fde0.pc_end = 0x2000; 20812d902961b2f119dfccd71523041949ff1668c6eDavid Srbecky fde0.cie = &cie; 20912d902961b2f119dfccd71523041949ff1668c6eDavid Srbecky EXPECT_CALL(mock_section, GetFdeOffsetFromPc(0x1000, ::testing::_)) 21012d902961b2f119dfccd71523041949ff1668c6eDavid Srbecky .WillOnce(::testing::Return(true)); 21112d902961b2f119dfccd71523041949ff1668c6eDavid Srbecky EXPECT_CALL(mock_section, GetFdeFromOffset(::testing::_)).WillOnce(::testing::Return(&fde0)); 21212d902961b2f119dfccd71523041949ff1668c6eDavid Srbecky EXPECT_CALL(mock_section, GetCfaLocationInfo(0x1000, &fde0, ::testing::_)) 21312d902961b2f119dfccd71523041949ff1668c6eDavid Srbecky .WillOnce(::testing::Invoke(MockGetCfaLocationInfo)); 21412d902961b2f119dfccd71523041949ff1668c6eDavid Srbecky 21512d902961b2f119dfccd71523041949ff1668c6eDavid Srbecky MemoryFake process; 21612d902961b2f119dfccd71523041949ff1668c6eDavid Srbecky EXPECT_CALL(mock_section, Eval(&cie, &process, ::testing::_, nullptr, ::testing::_)) 21712d902961b2f119dfccd71523041949ff1668c6eDavid Srbecky .WillRepeatedly(::testing::Return(true)); 21812d902961b2f119dfccd71523041949ff1668c6eDavid Srbecky 21912d902961b2f119dfccd71523041949ff1668c6eDavid Srbecky bool finished; 22012d902961b2f119dfccd71523041949ff1668c6eDavid Srbecky ASSERT_TRUE(mock_section.Step(0x1000, nullptr, &process, &finished)); 22112d902961b2f119dfccd71523041949ff1668c6eDavid Srbecky 22212d902961b2f119dfccd71523041949ff1668c6eDavid Srbecky DwarfFde fde1{}; 22312d902961b2f119dfccd71523041949ff1668c6eDavid Srbecky fde1.pc_start = 0x500; 22412d902961b2f119dfccd71523041949ff1668c6eDavid Srbecky fde1.pc_end = 0x800; 22512d902961b2f119dfccd71523041949ff1668c6eDavid Srbecky fde1.cie = &cie; 22612d902961b2f119dfccd71523041949ff1668c6eDavid Srbecky EXPECT_CALL(mock_section, GetFdeOffsetFromPc(0x600, ::testing::_)) 22712d902961b2f119dfccd71523041949ff1668c6eDavid Srbecky .WillOnce(::testing::Return(true)); 22812d902961b2f119dfccd71523041949ff1668c6eDavid Srbecky EXPECT_CALL(mock_section, GetFdeFromOffset(::testing::_)).WillOnce(::testing::Return(&fde1)); 22912d902961b2f119dfccd71523041949ff1668c6eDavid Srbecky EXPECT_CALL(mock_section, GetCfaLocationInfo(0x600, &fde1, ::testing::_)) 23012d902961b2f119dfccd71523041949ff1668c6eDavid Srbecky .WillOnce(::testing::Invoke(MockGetCfaLocationInfo)); 23112d902961b2f119dfccd71523041949ff1668c6eDavid Srbecky 23212d902961b2f119dfccd71523041949ff1668c6eDavid Srbecky ASSERT_TRUE(mock_section.Step(0x600, nullptr, &process, &finished)); 23312d902961b2f119dfccd71523041949ff1668c6eDavid Srbecky ASSERT_TRUE(mock_section.Step(0x700, nullptr, &process, &finished)); 23412d902961b2f119dfccd71523041949ff1668c6eDavid Srbecky} 23512d902961b2f119dfccd71523041949ff1668c6eDavid Srbecky 236d226a5140989f509a0ed3e2723f05d5fc93ce8dfChristopher Ferris} // namespace unwindstack 237