Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(410)

Side by Side Diff: third_party/crashpad/crashpad/util/numeric/checked_address_range_test.cc

Issue 1505213004: Copy Crashpad into the Chrome tree instead of importing it via DEPS (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Address review comments, update README.chromium Created 5 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright 2014 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 "util/numeric/checked_address_range.h"
16
17 #include <limits>
18
19 #include "base/basictypes.h"
20 #include "base/format_macros.h"
21 #include "base/strings/stringprintf.h"
22 #include "build/build_config.h"
23 #include "gtest/gtest.h"
24
25 namespace crashpad {
26 namespace test {
27 namespace {
28
29 using CheckedAddressRange =
30 internal::CheckedAddressRangeGeneric<uint64_t, uint64_t>;
31
32 enum Validity {
33 kInvalid = false,
34 kValid,
35 kValid64Invalid32,
36 };
37
38 bool ExpectationForValidity32(Validity validity) {
39 return validity == kValid;
40 }
41
42 bool ExpectationForValidity64(Validity validity) {
43 return validity == kValid || validity == kValid64Invalid32;
44 }
45
46 TEST(CheckedAddressRange, IsValid) {
47 const struct TestData {
48 uint64_t base;
49 uint64_t size;
50 Validity validity;
51 } kTestData[] = {
52 {0, 0, kValid},
53 {0, 1, kValid},
54 {0, 2, kValid},
55 {0, 0x7fffffff, kValid},
56 {0, 0x80000000, kValid},
57 {0, 0xfffffffe, kValid},
58 {0, 0xffffffff, kValid},
59 {0, 0xffffffffffffffff, kValid64Invalid32},
60 {1, 0, kValid},
61 {1, 1, kValid},
62 {1, 2, kValid},
63 {1, 0x7fffffff, kValid},
64 {1, 0x80000000, kValid},
65 {1, 0xfffffffe, kValid},
66 {1, 0xffffffff, kValid64Invalid32},
67 {1, 0xfffffffffffffffe, kValid64Invalid32},
68 {1, 0xffffffffffffffff, kInvalid},
69 {0x7fffffff, 0, kValid},
70 {0x7fffffff, 1, kValid},
71 {0x7fffffff, 2, kValid},
72 {0x7fffffff, 0x7fffffff, kValid},
73 {0x7fffffff, 0x80000000, kValid},
74 {0x7fffffff, 0xfffffffe, kValid64Invalid32},
75 {0x7fffffff, 0xffffffff, kValid64Invalid32},
76 {0x80000000, 0, kValid},
77 {0x80000000, 1, kValid},
78 {0x80000000, 2, kValid},
79 {0x80000000, 0x7fffffff, kValid},
80 {0x80000000, 0x80000000, kValid64Invalid32},
81 {0x80000000, 0xfffffffe, kValid64Invalid32},
82 {0x80000000, 0xffffffff, kValid64Invalid32},
83 {0xfffffffe, 0, kValid},
84 {0xfffffffe, 1, kValid},
85 {0xfffffffe, 2, kValid64Invalid32},
86 {0xfffffffe, 0x7fffffff, kValid64Invalid32},
87 {0xfffffffe, 0x80000000, kValid64Invalid32},
88 {0xfffffffe, 0xfffffffe, kValid64Invalid32},
89 {0xfffffffe, 0xffffffff, kValid64Invalid32},
90 {0xffffffff, 0, kValid},
91 {0xffffffff, 1, kValid64Invalid32},
92 {0xffffffff, 2, kValid64Invalid32},
93 {0xffffffff, 0x7fffffff, kValid64Invalid32},
94 {0xffffffff, 0x80000000, kValid64Invalid32},
95 {0xffffffff, 0xfffffffe, kValid64Invalid32},
96 {0xffffffff, 0xffffffff, kValid64Invalid32},
97 {0x7fffffffffffffff, 0, kValid64Invalid32},
98 {0x7fffffffffffffff, 1, kValid64Invalid32},
99 {0x7fffffffffffffff, 2, kValid64Invalid32},
100 {0x7fffffffffffffff, 0x7fffffffffffffff, kValid64Invalid32},
101 {0x7fffffffffffffff, 0x8000000000000000, kValid64Invalid32},
102 {0x7fffffffffffffff, 0x8000000000000001, kInvalid},
103 {0x7fffffffffffffff, 0xfffffffffffffffe, kInvalid},
104 {0x7fffffffffffffff, 0xffffffffffffffff, kInvalid},
105 {0x8000000000000000, 0, kValid64Invalid32},
106 {0x8000000000000000, 1, kValid64Invalid32},
107 {0x8000000000000000, 2, kValid64Invalid32},
108 {0x8000000000000000, 0x7fffffffffffffff, kValid64Invalid32},
109 {0x8000000000000000, 0x8000000000000000, kInvalid},
110 {0x8000000000000000, 0x8000000000000001, kInvalid},
111 {0x8000000000000000, 0xfffffffffffffffe, kInvalid},
112 {0x8000000000000000, 0xffffffffffffffff, kInvalid},
113 {0xfffffffffffffffe, 0, kValid64Invalid32},
114 {0xfffffffffffffffe, 1, kValid64Invalid32},
115 {0xfffffffffffffffe, 2, kInvalid},
116 {0xffffffffffffffff, 0, kValid64Invalid32},
117 {0xffffffffffffffff, 1, kInvalid},
118 };
119
120 for (size_t index = 0; index < arraysize(kTestData); ++index) {
121 const TestData& testcase = kTestData[index];
122 SCOPED_TRACE(base::StringPrintf("index %" PRIuS
123 ", base 0x%llx, size 0x%llx",
124 index,
125 testcase.base,
126 testcase.size));
127
128 CheckedAddressRange range_32(false, testcase.base, testcase.size);
129 EXPECT_EQ(ExpectationForValidity32(testcase.validity), range_32.IsValid());
130
131 CheckedAddressRange range_64(true, testcase.base, testcase.size);
132 EXPECT_EQ(ExpectationForValidity64(testcase.validity), range_64.IsValid());
133 }
134 }
135
136 TEST(CheckedAddressRange, ContainsValue) {
137 const struct TestData {
138 uint64_t value;
139 bool expectation;
140 } kTestData[] = {
141 {0, false},
142 {1, false},
143 {0x1fff, false},
144 {0x2000, true},
145 {0x2001, true},
146 {0x2ffe, true},
147 {0x2fff, true},
148 {0x3000, false},
149 {0x3001, false},
150 {0x7fffffff, false},
151 {0x80000000, false},
152 {0x80000001, false},
153 {0x80001fff, false},
154 {0x80002000, false},
155 {0x80002001, false},
156 {0x80002ffe, false},
157 {0x80002fff, false},
158 {0x80003000, false},
159 {0x80003001, false},
160 {0xffffcfff, false},
161 {0xffffdfff, false},
162 {0xffffefff, false},
163 {0xffffffff, false},
164 {0x100000000, false},
165 {0xffffffffffffffff, false},
166 };
167
168 CheckedAddressRange parent_range_32(false, 0x2000, 0x1000);
169 ASSERT_TRUE(parent_range_32.IsValid());
170
171 for (size_t index = 0; index < arraysize(kTestData); ++index) {
172 const TestData& testcase = kTestData[index];
173 SCOPED_TRACE(base::StringPrintf(
174 "index %" PRIuS ", value 0x%llx", index, testcase.value));
175
176 EXPECT_EQ(testcase.expectation,
177 parent_range_32.ContainsValue(testcase.value));
178 }
179
180 CheckedAddressRange parent_range_64(true, 0x100000000, 0x1000);
181 ASSERT_TRUE(parent_range_64.IsValid());
182 EXPECT_FALSE(parent_range_64.ContainsValue(0xffffffff));
183 EXPECT_TRUE(parent_range_64.ContainsValue(0x100000000));
184 EXPECT_TRUE(parent_range_64.ContainsValue(0x100000001));
185 EXPECT_TRUE(parent_range_64.ContainsValue(0x100000fff));
186 EXPECT_FALSE(parent_range_64.ContainsValue(0x100001000));
187 }
188
189 TEST(CheckedAddressRange, ContainsRange) {
190 const struct TestData {
191 uint64_t base;
192 uint64_t size;
193 bool expectation;
194 } kTestData[] = {
195 {0, 0, false},
196 {0, 1, false},
197 {0x2000, 0x1000, true},
198 {0, 0x2000, false},
199 {0x3000, 0x1000, false},
200 {0x1800, 0x1000, false},
201 {0x2800, 0x1000, false},
202 {0x2000, 0x800, true},
203 {0x2800, 0x800, true},
204 {0x2400, 0x800, true},
205 {0x2800, 0, true},
206 {0x2000, 0xffffdfff, false},
207 {0x2800, 0xffffd7ff, false},
208 {0x3000, 0xffffcfff, false},
209 {0xfffffffe, 1, false},
210 {0xffffffff, 0, false},
211 {0x1fff, 0, false},
212 {0x2000, 0, true},
213 {0x2001, 0, true},
214 {0x2fff, 0, true},
215 {0x3000, 0, true},
216 {0x3001, 0, false},
217 {0x1fff, 1, false},
218 {0x2000, 1, true},
219 {0x2001, 1, true},
220 {0x2fff, 1, true},
221 {0x3000, 1, false},
222 {0x3001, 1, false},
223 };
224
225 CheckedAddressRange parent_range_32(false, 0x2000, 0x1000);
226 ASSERT_TRUE(parent_range_32.IsValid());
227
228 for (size_t index = 0; index < arraysize(kTestData); ++index) {
229 const TestData& testcase = kTestData[index];
230 SCOPED_TRACE(base::StringPrintf("index %" PRIuS
231 ", base 0x%llx, size 0x%llx",
232 index,
233 testcase.base,
234 testcase.size));
235
236 CheckedAddressRange child_range_32(false, testcase.base, testcase.size);
237 ASSERT_TRUE(child_range_32.IsValid());
238 EXPECT_EQ(testcase.expectation,
239 parent_range_32.ContainsRange(child_range_32));
240 }
241
242 CheckedAddressRange parent_range_64(true, 0x100000000, 0x1000);
243 ASSERT_TRUE(parent_range_64.IsValid());
244
245 CheckedAddressRange child_range_64(true, 0xffffffff, 2);
246 EXPECT_FALSE(parent_range_64.ContainsRange(child_range_64));
247
248 child_range_64.SetRange(true, 0x100000000, 2);
249 EXPECT_TRUE(parent_range_64.ContainsRange(child_range_64));
250
251 child_range_64.SetRange(true, 0x100000ffe, 2);
252 EXPECT_TRUE(parent_range_64.ContainsRange(child_range_64));
253
254 child_range_64.SetRange(true, 0x100000fff, 2);
255 EXPECT_FALSE(parent_range_64.ContainsRange(child_range_64));
256 }
257
258 } // namespace
259 } // namespace test
260 } // namespace crashpad
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698