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