1 // Copyright 2018 The Crashpad Authors. All rights reserved.
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 //
7 // http://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14
15 #include "snapshot/memory_snapshot.h"
16
17 #include "base/macros.h"
18 #include "gtest/gtest.h"
19 #include "snapshot/test/test_memory_snapshot.h"
20
21 namespace crashpad {
22 namespace test {
23 namespace {
24
TEST(DetermineMergedRange,NonOverlapping)25 TEST(DetermineMergedRange, NonOverlapping) {
26 TestMemorySnapshot a;
27 TestMemorySnapshot b;
28 a.SetAddress(0);
29 a.SetSize(100);
30 b.SetAddress(200);
31 b.SetSize(50);
32 CheckedRange<uint64_t, size_t> range(0, 0);
33 EXPECT_FALSE(DetermineMergedRange(&a, &b, &range));
34 EXPECT_FALSE(DetermineMergedRange(&b, &a, &range));
35
36 a.SetSize(199);
37 EXPECT_FALSE(DetermineMergedRange(&a, &b, &range));
38 }
39
TEST(DetermineMergedRange,Empty)40 TEST(DetermineMergedRange, Empty) {
41 TestMemorySnapshot a;
42 TestMemorySnapshot b;
43 a.SetAddress(100);
44 a.SetSize(0);
45 b.SetAddress(200);
46 b.SetSize(20);
47
48 CheckedRange<uint64_t, size_t> range(0, 0);
49 // Empty are invalid.
50 EXPECT_FALSE(DetermineMergedRange(&a, &b, &range));
51 EXPECT_FALSE(DetermineMergedRange(&b, &a, &range));
52 EXPECT_FALSE(DetermineMergedRange(&a, &a, &range));
53 }
54
TEST(DetermineMergedRange,Abutting)55 TEST(DetermineMergedRange, Abutting) {
56 TestMemorySnapshot a;
57 TestMemorySnapshot b;
58
59 a.SetAddress(0);
60 a.SetSize(10);
61 b.SetAddress(10);
62 b.SetSize(20);
63
64 CheckedRange<uint64_t, size_t> range(0, 0);
65 EXPECT_TRUE(DetermineMergedRange(&a, &b, &range));
66 EXPECT_EQ(0u, range.base());
67 EXPECT_EQ(30u, range.size());
68
69 EXPECT_TRUE(DetermineMergedRange(&b, &a, &range));
70 EXPECT_EQ(0u, range.base());
71 EXPECT_EQ(30u, range.size());
72 }
73
TEST(DetermineMergedRange,TypicalOverlapping)74 TEST(DetermineMergedRange, TypicalOverlapping) {
75 TestMemorySnapshot a;
76 TestMemorySnapshot b;
77
78 a.SetAddress(10);
79 a.SetSize(100);
80 b.SetAddress(50);
81 b.SetSize(100);
82
83 CheckedRange<uint64_t, size_t> range(0, 0);
84 EXPECT_TRUE(DetermineMergedRange(&a, &b, &range));
85 EXPECT_EQ(10u, range.base());
86 EXPECT_EQ(140u, range.size());
87
88 EXPECT_TRUE(DetermineMergedRange(&b, &a, &range));
89 EXPECT_EQ(10u, range.base());
90 EXPECT_EQ(140u, range.size());
91 }
92
TEST(DetermineMergedRange,OneFullyInsideAnother)93 TEST(DetermineMergedRange, OneFullyInsideAnother) {
94 TestMemorySnapshot a;
95 TestMemorySnapshot b;
96
97 a.SetAddress(20);
98 a.SetSize(100);
99 b.SetAddress(5);
100 b.SetSize(200);
101
102 CheckedRange<uint64_t, size_t> range(0, 0);
103 EXPECT_TRUE(DetermineMergedRange(&a, &b, &range));
104 EXPECT_EQ(5u, range.base());
105 EXPECT_EQ(200u, range.size());
106
107 EXPECT_TRUE(DetermineMergedRange(&b, &a, &range));
108 EXPECT_EQ(5u, range.base());
109 EXPECT_EQ(200u, range.size());
110 }
111
TEST(DetermineMergedRange,SameStart)112 TEST(DetermineMergedRange, SameStart) {
113 TestMemorySnapshot a;
114 TestMemorySnapshot b;
115
116 a.SetAddress(5);
117 a.SetSize(100);
118 b.SetAddress(5);
119 b.SetSize(50);
120
121 CheckedRange<uint64_t, size_t> range(0, 0);
122 EXPECT_TRUE(DetermineMergedRange(&a, &b, &range));
123 EXPECT_EQ(5u, range.base());
124 EXPECT_EQ(100u, range.size());
125
126 EXPECT_TRUE(DetermineMergedRange(&b, &a, &range));
127 EXPECT_EQ(5u, range.base());
128 EXPECT_EQ(100u, range.size());
129 }
130
TEST(DetermineMergedRange,SameEnd)131 TEST(DetermineMergedRange, SameEnd) {
132 TestMemorySnapshot a;
133 TestMemorySnapshot b;
134
135 a.SetAddress(5);
136 a.SetSize(100);
137 b.SetAddress(70);
138 b.SetSize(35);
139
140 CheckedRange<uint64_t, size_t> range(0, 0);
141 EXPECT_TRUE(DetermineMergedRange(&a, &b, &range));
142 EXPECT_EQ(5u, range.base());
143 EXPECT_EQ(100u, range.size());
144
145 EXPECT_TRUE(DetermineMergedRange(&b, &a, &range));
146 EXPECT_EQ(5u, range.base());
147 EXPECT_EQ(100u, range.size());
148 }
149
150 } // namespace
151 } // namespace test
152 } // namespace crashpad
153