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