1*eb293b8fSAndroid Build Coastguard Worker /*
2*eb293b8fSAndroid Build Coastguard Worker * Copyright (C) 2018 The Android Open Source Project
3*eb293b8fSAndroid Build Coastguard Worker *
4*eb293b8fSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
5*eb293b8fSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
6*eb293b8fSAndroid Build Coastguard Worker * You may obtain a copy of the License at
7*eb293b8fSAndroid Build Coastguard Worker *
8*eb293b8fSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
9*eb293b8fSAndroid Build Coastguard Worker *
10*eb293b8fSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
11*eb293b8fSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
12*eb293b8fSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*eb293b8fSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
14*eb293b8fSAndroid Build Coastguard Worker * limitations under the License.
15*eb293b8fSAndroid Build Coastguard Worker */
16*eb293b8fSAndroid Build Coastguard Worker
17*eb293b8fSAndroid Build Coastguard Worker #include <stdint.h>
18*eb293b8fSAndroid Build Coastguard Worker
19*eb293b8fSAndroid Build Coastguard Worker #include <vector>
20*eb293b8fSAndroid Build Coastguard Worker
21*eb293b8fSAndroid Build Coastguard Worker #include <gtest/gtest.h>
22*eb293b8fSAndroid Build Coastguard Worker
23*eb293b8fSAndroid Build Coastguard Worker #include "MemoryRange.h"
24*eb293b8fSAndroid Build Coastguard Worker #include "utils/MemoryFake.h"
25*eb293b8fSAndroid Build Coastguard Worker
26*eb293b8fSAndroid Build Coastguard Worker namespace unwindstack {
27*eb293b8fSAndroid Build Coastguard Worker
28*eb293b8fSAndroid Build Coastguard Worker class MemoryRangesTest : public ::testing::Test {
29*eb293b8fSAndroid Build Coastguard Worker protected:
SetUp()30*eb293b8fSAndroid Build Coastguard Worker void SetUp() override {
31*eb293b8fSAndroid Build Coastguard Worker MemoryFake* memory = new MemoryFake;
32*eb293b8fSAndroid Build Coastguard Worker process_memory_.reset(memory);
33*eb293b8fSAndroid Build Coastguard Worker memory->SetMemoryBlock(1000, 5000, 0x15);
34*eb293b8fSAndroid Build Coastguard Worker memory->SetMemoryBlock(6000, 12000, 0x26);
35*eb293b8fSAndroid Build Coastguard Worker memory->SetMemoryBlock(14000, 20000, 0x37);
36*eb293b8fSAndroid Build Coastguard Worker memory->SetMemoryBlock(20000, 22000, 0x48);
37*eb293b8fSAndroid Build Coastguard Worker
38*eb293b8fSAndroid Build Coastguard Worker ranges_.reset(new MemoryRanges);
39*eb293b8fSAndroid Build Coastguard Worker ranges_->Insert(new MemoryRange(process_memory_, 15000, 100, 4000));
40*eb293b8fSAndroid Build Coastguard Worker ranges_->Insert(new MemoryRange(process_memory_, 10000, 2000, 2000));
41*eb293b8fSAndroid Build Coastguard Worker ranges_->Insert(new MemoryRange(process_memory_, 3000, 1000, 0));
42*eb293b8fSAndroid Build Coastguard Worker ranges_->Insert(new MemoryRange(process_memory_, 19000, 1000, 6000));
43*eb293b8fSAndroid Build Coastguard Worker ranges_->Insert(new MemoryRange(process_memory_, 20000, 1000, 7000));
44*eb293b8fSAndroid Build Coastguard Worker }
45*eb293b8fSAndroid Build Coastguard Worker
46*eb293b8fSAndroid Build Coastguard Worker std::shared_ptr<Memory> process_memory_;
47*eb293b8fSAndroid Build Coastguard Worker std::unique_ptr<MemoryRanges> ranges_;
48*eb293b8fSAndroid Build Coastguard Worker };
49*eb293b8fSAndroid Build Coastguard Worker
TEST_F(MemoryRangesTest,read)50*eb293b8fSAndroid Build Coastguard Worker TEST_F(MemoryRangesTest, read) {
51*eb293b8fSAndroid Build Coastguard Worker std::vector<uint8_t> dst(2000);
52*eb293b8fSAndroid Build Coastguard Worker size_t bytes = ranges_->Read(0, dst.data(), dst.size());
53*eb293b8fSAndroid Build Coastguard Worker ASSERT_EQ(1000UL, bytes);
54*eb293b8fSAndroid Build Coastguard Worker for (size_t i = 0; i < bytes; i++) {
55*eb293b8fSAndroid Build Coastguard Worker ASSERT_EQ(0x15U, dst[i]) << "Failed at byte " << i;
56*eb293b8fSAndroid Build Coastguard Worker }
57*eb293b8fSAndroid Build Coastguard Worker
58*eb293b8fSAndroid Build Coastguard Worker bytes = ranges_->Read(2000, dst.data(), dst.size());
59*eb293b8fSAndroid Build Coastguard Worker ASSERT_EQ(2000UL, bytes);
60*eb293b8fSAndroid Build Coastguard Worker for (size_t i = 0; i < bytes; i++) {
61*eb293b8fSAndroid Build Coastguard Worker ASSERT_EQ(0x26U, dst[i]) << "Failed at byte " << i;
62*eb293b8fSAndroid Build Coastguard Worker }
63*eb293b8fSAndroid Build Coastguard Worker
64*eb293b8fSAndroid Build Coastguard Worker bytes = ranges_->Read(4000, dst.data(), dst.size());
65*eb293b8fSAndroid Build Coastguard Worker ASSERT_EQ(100UL, bytes);
66*eb293b8fSAndroid Build Coastguard Worker for (size_t i = 0; i < bytes; i++) {
67*eb293b8fSAndroid Build Coastguard Worker ASSERT_EQ(0x37U, dst[i]) << "Failed at byte " << i;
68*eb293b8fSAndroid Build Coastguard Worker }
69*eb293b8fSAndroid Build Coastguard Worker }
70*eb293b8fSAndroid Build Coastguard Worker
TEST_F(MemoryRangesTest,read_fail)71*eb293b8fSAndroid Build Coastguard Worker TEST_F(MemoryRangesTest, read_fail) {
72*eb293b8fSAndroid Build Coastguard Worker std::vector<uint8_t> dst(4096);
73*eb293b8fSAndroid Build Coastguard Worker ASSERT_EQ(0UL, ranges_->Read(1000, dst.data(), dst.size()));
74*eb293b8fSAndroid Build Coastguard Worker ASSERT_EQ(0UL, ranges_->Read(5000, dst.data(), dst.size()));
75*eb293b8fSAndroid Build Coastguard Worker ASSERT_EQ(0UL, ranges_->Read(8000, dst.data(), dst.size()));
76*eb293b8fSAndroid Build Coastguard Worker }
77*eb293b8fSAndroid Build Coastguard Worker
TEST_F(MemoryRangesTest,read_across_ranges)78*eb293b8fSAndroid Build Coastguard Worker TEST_F(MemoryRangesTest, read_across_ranges) {
79*eb293b8fSAndroid Build Coastguard Worker // The MemoryRanges object does not support reading across a range,
80*eb293b8fSAndroid Build Coastguard Worker // so this will only read in the first range.
81*eb293b8fSAndroid Build Coastguard Worker std::vector<uint8_t> dst(4096);
82*eb293b8fSAndroid Build Coastguard Worker size_t bytes = ranges_->Read(6000, dst.data(), dst.size());
83*eb293b8fSAndroid Build Coastguard Worker ASSERT_EQ(1000UL, bytes);
84*eb293b8fSAndroid Build Coastguard Worker for (size_t i = 0; i < bytes; i++) {
85*eb293b8fSAndroid Build Coastguard Worker ASSERT_EQ(0x37U, dst[i]) << "Failed at byte " << i;
86*eb293b8fSAndroid Build Coastguard Worker }
87*eb293b8fSAndroid Build Coastguard Worker }
88*eb293b8fSAndroid Build Coastguard Worker
TEST_F(MemoryRangesTest,duplicate_last_addr)89*eb293b8fSAndroid Build Coastguard Worker TEST_F(MemoryRangesTest, duplicate_last_addr) {
90*eb293b8fSAndroid Build Coastguard Worker MemoryRanges ranges;
91*eb293b8fSAndroid Build Coastguard Worker ASSERT_TRUE(ranges.Insert(new MemoryRange(nullptr, 0x1000, 0x2000, 0x1000)));
92*eb293b8fSAndroid Build Coastguard Worker ASSERT_FALSE(ranges.Insert(new MemoryRange(nullptr, 0x2000, 0x1000, 0x2000)));
93*eb293b8fSAndroid Build Coastguard Worker }
94*eb293b8fSAndroid Build Coastguard Worker
95*eb293b8fSAndroid Build Coastguard Worker } // namespace unwindstack
96