| OLD | NEW |
| 1 // Copyright (c) 2010 Google Inc. | 1 // Copyright (c) 2010 Google Inc. |
| 2 // All rights reserved. | 2 // All rights reserved. |
| 3 // | 3 // |
| 4 // Redistribution and use in source and binary forms, with or without | 4 // Redistribution and use in source and binary forms, with or without |
| 5 // modification, are permitted provided that the following conditions are | 5 // modification, are permitted provided that the following conditions are |
| 6 // met: | 6 // met: |
| 7 // | 7 // |
| 8 // * Redistributions of source code must retain the above copyright | 8 // * Redistributions of source code must retain the above copyright |
| 9 // notice, this list of conditions and the following disclaimer. | 9 // notice, this list of conditions and the following disclaimer. |
| 10 // * Redistributions in binary form must reproduce the above | 10 // * Redistributions in binary form must reproduce the above |
| (...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 97 // The number of tests in the set | 97 // The number of tests in the set |
| 98 unsigned int range_test_count; | 98 unsigned int range_test_count; |
| 99 }; | 99 }; |
| 100 | 100 |
| 101 | 101 |
| 102 // StoreTest uses the data in a RangeTest and calls StoreRange on the | 102 // StoreTest uses the data in a RangeTest and calls StoreRange on the |
| 103 // test RangeMap. It returns true if the expected result occurred, and | 103 // test RangeMap. It returns true if the expected result occurred, and |
| 104 // false if something else happened. | 104 // false if something else happened. |
| 105 static bool StoreTest(TestMap *range_map, const RangeTest *range_test) { | 105 static bool StoreTest(TestMap *range_map, const RangeTest *range_test) { |
| 106 linked_ptr<CountedObject> object(new CountedObject(range_test->id)); | 106 linked_ptr<CountedObject> object(new CountedObject(range_test->id)); |
| 107 bool stored = range_map->StoreRange(range_test->address, | 107 bool stored = range_map->StoreRange(range_test->address, 0 /* delta */, |
| 108 range_test->size, | 108 range_test->size, object); |
| 109 object); | |
| 110 | 109 |
| 111 if (stored != range_test->expect_storable) { | 110 if (stored != range_test->expect_storable) { |
| 112 fprintf(stderr, "FAILED: " | 111 fprintf(stderr, "FAILED: " |
| 113 "StoreRange id %d, expected %s, observed %s\n", | 112 "StoreRange id %d, expected %s, observed %s\n", |
| 114 range_test->id, | 113 range_test->id, |
| 115 range_test->expect_storable ? "storable" : "not storable", | 114 range_test->expect_storable ? "storable" : "not storable", |
| 116 stored ? "stored" : "not stored"); | 115 stored ? "stored" : "not stored"); |
| 117 return false; | 116 return false; |
| 118 } | 117 } |
| 119 | 118 |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 159 expected_result = true; // test should always succeed. | 158 expected_result = true; // test should always succeed. |
| 160 else if (offset == -1) // When checking one below the target, | 159 else if (offset == -1) // When checking one below the target, |
| 161 expected_result = side; // should fail low and succeed high. | 160 expected_result = side; // should fail low and succeed high. |
| 162 else // When checking one above the target, | 161 else // When checking one above the target, |
| 163 expected_result = !side; // should succeed low and fail high. | 162 expected_result = !side; // should succeed low and fail high. |
| 164 } | 163 } |
| 165 | 164 |
| 166 linked_ptr<CountedObject> object; | 165 linked_ptr<CountedObject> object; |
| 167 AddressType retrieved_base = AddressType(); | 166 AddressType retrieved_base = AddressType(); |
| 168 AddressType retrieved_size = AddressType(); | 167 AddressType retrieved_size = AddressType(); |
| 168 AddressType retrieved_delta = AddressType(); |
| 169 bool retrieved = range_map->RetrieveRange(address, &object, | 169 bool retrieved = range_map->RetrieveRange(address, &object, |
| 170 &retrieved_base, | 170 &retrieved_base, |
| 171 &retrieved_delta, |
| 171 &retrieved_size); | 172 &retrieved_size); |
| 172 | 173 |
| 173 bool observed_result = retrieved && object->id() == range_test->id; | 174 bool observed_result = retrieved && object->id() == range_test->id; |
| 174 | 175 |
| 175 if (observed_result != expected_result) { | 176 if (observed_result != expected_result) { |
| 176 fprintf(stderr, "FAILED: " | 177 fprintf(stderr, "FAILED: " |
| 177 "RetrieveRange id %d, side %d, offset %d, " | 178 "RetrieveRange id %d, side %d, offset %d, " |
| 178 "expected %s, observed %s\n", | 179 "expected %s, observed %s\n", |
| 179 range_test->id, | 180 range_test->id, |
| 180 side, | 181 side, |
| (...skipping 21 matching lines...) Expand all Loading... |
| 202 | 203 |
| 203 // Now, check RetrieveNearestRange. The nearest range is always | 204 // Now, check RetrieveNearestRange. The nearest range is always |
| 204 // expected to be different from the test range when checking one | 205 // expected to be different from the test range when checking one |
| 205 // less than the low side. | 206 // less than the low side. |
| 206 bool expected_nearest = range_test->expect_storable; | 207 bool expected_nearest = range_test->expect_storable; |
| 207 if (!side && offset < 0) | 208 if (!side && offset < 0) |
| 208 expected_nearest = false; | 209 expected_nearest = false; |
| 209 | 210 |
| 210 linked_ptr<CountedObject> nearest_object; | 211 linked_ptr<CountedObject> nearest_object; |
| 211 AddressType nearest_base = AddressType(); | 212 AddressType nearest_base = AddressType(); |
| 213 AddressType nearest_delta = AddressType(); |
| 212 AddressType nearest_size = AddressType(); | 214 AddressType nearest_size = AddressType(); |
| 213 bool retrieved_nearest = range_map->RetrieveNearestRange(address, | 215 bool retrieved_nearest = range_map->RetrieveNearestRange(address, |
| 214 &nearest_object, | 216 &nearest_object, |
| 215 &nearest_base, | 217 &nearest_base, |
| 218 &nearest_delta, |
| 216 &nearest_size); | 219 &nearest_size); |
| 217 | 220 |
| 218 // When checking one greater than the high side, RetrieveNearestRange | 221 // When checking one greater than the high side, RetrieveNearestRange |
| 219 // should usually return the test range. When a different range begins | 222 // should usually return the test range. When a different range begins |
| 220 // at that address, though, then RetrieveNearestRange should return the | 223 // at that address, though, then RetrieveNearestRange should return the |
| 221 // range at the address instead of the test range. | 224 // range at the address instead of the test range. |
| 222 if (side && offset > 0 && nearest_base == address) { | 225 if (side && offset > 0 && nearest_base == address) { |
| 223 expected_nearest = false; | 226 expected_nearest = false; |
| 224 } | 227 } |
| 225 | 228 |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 267 // call, and that ranges are returned with increasing base addresses. Returns | 270 // call, and that ranges are returned with increasing base addresses. Returns |
| 268 // false if the test fails. | 271 // false if the test fails. |
| 269 static bool RetrieveIndexTest(TestMap *range_map, int set) { | 272 static bool RetrieveIndexTest(TestMap *range_map, int set) { |
| 270 linked_ptr<CountedObject> object; | 273 linked_ptr<CountedObject> object; |
| 271 CountedObject *last_object = NULL; | 274 CountedObject *last_object = NULL; |
| 272 AddressType last_base = 0; | 275 AddressType last_base = 0; |
| 273 | 276 |
| 274 int object_count = range_map->GetCount(); | 277 int object_count = range_map->GetCount(); |
| 275 for (int object_index = 0; object_index < object_count; ++object_index) { | 278 for (int object_index = 0; object_index < object_count; ++object_index) { |
| 276 AddressType base; | 279 AddressType base; |
| 277 if (!range_map->RetrieveRangeAtIndex(object_index, &object, &base, NULL)) { | 280 if (!range_map->RetrieveRangeAtIndex(object_index, &object, &base, |
| 281 NULL, NULL)) { |
| 278 fprintf(stderr, "FAILED: RetrieveRangeAtIndex set %d index %d, " | 282 fprintf(stderr, "FAILED: RetrieveRangeAtIndex set %d index %d, " |
| 279 "expected success, observed failure\n", | 283 "expected success, observed failure\n", |
| 280 set, object_index); | 284 set, object_index); |
| 281 return false; | 285 return false; |
| 282 } | 286 } |
| 283 | 287 |
| 284 if (!object.get()) { | 288 if (!object.get()) { |
| 285 fprintf(stderr, "FAILED: RetrieveRangeAtIndex set %d index %d, " | 289 fprintf(stderr, "FAILED: RetrieveRangeAtIndex set %d index %d, " |
| 286 "expected object, observed NULL\n", | 290 "expected object, observed NULL\n", |
| 287 set, object_index); | 291 set, object_index); |
| (...skipping 19 matching lines...) Expand all Loading... |
| 307 return false; | 311 return false; |
| 308 } | 312 } |
| 309 } | 313 } |
| 310 | 314 |
| 311 last_object = object.get(); | 315 last_object = object.get(); |
| 312 last_base = base; | 316 last_base = base; |
| 313 } | 317 } |
| 314 | 318 |
| 315 // Make sure that RetrieveRangeAtIndex doesn't allow lookups at indices that | 319 // Make sure that RetrieveRangeAtIndex doesn't allow lookups at indices that |
| 316 // are too high. | 320 // are too high. |
| 317 if (range_map->RetrieveRangeAtIndex(object_count, &object, NULL, NULL)) { | 321 if (range_map->RetrieveRangeAtIndex(object_count, &object, NULL, NULL, |
| 322 NULL)) { |
| 318 fprintf(stderr, "FAILED: RetrieveRangeAtIndex set %d index %d (too large), " | 323 fprintf(stderr, "FAILED: RetrieveRangeAtIndex set %d index %d (too large), " |
| 319 "expected failure, observed success\n", | 324 "expected failure, observed success\n", |
| 320 set, object_count); | 325 set, object_count); |
| 321 return false; | 326 return false; |
| 322 } | 327 } |
| 323 | 328 |
| 324 return true; | 329 return true; |
| 325 } | 330 } |
| 326 | 331 |
| 327 // Additional RetriveAtIndex test to expose the bug in RetrieveRangeAtIndex(). | 332 // Additional RetriveAtIndex test to expose the bug in RetrieveRangeAtIndex(). |
| 328 // Bug info: RetrieveRangeAtIndex() previously retrieves the high address of | 333 // Bug info: RetrieveRangeAtIndex() previously retrieves the high address of |
| 329 // entry, however, it is supposed to retrieve the base address of entry as | 334 // entry, however, it is supposed to retrieve the base address of entry as |
| 330 // stated in the comment in range_map.h. | 335 // stated in the comment in range_map.h. |
| 331 static bool RetriveAtIndexTest2() { | 336 static bool RetriveAtIndexTest2() { |
| 332 scoped_ptr<TestMap> range_map(new TestMap()); | 337 scoped_ptr<TestMap> range_map(new TestMap()); |
| 333 | 338 |
| 334 // Store ranges with base address = 2 * object_id: | 339 // Store ranges with base address = 2 * object_id: |
| 335 const int range_size = 2; | 340 const int range_size = 2; |
| 336 for (int object_id = 0; object_id < 100; ++object_id) { | 341 for (int object_id = 0; object_id < 100; ++object_id) { |
| 337 linked_ptr<CountedObject> object(new CountedObject(object_id)); | 342 linked_ptr<CountedObject> object(new CountedObject(object_id)); |
| 338 int base_address = 2 * object_id; | 343 int base_address = 2 * object_id; |
| 339 range_map->StoreRange(base_address, range_size, object); | 344 range_map->StoreRange(base_address, 0 /* delta */, range_size, object); |
| 340 } | 345 } |
| 341 | 346 |
| 342 linked_ptr<CountedObject> object; | 347 linked_ptr<CountedObject> object; |
| 343 int object_count = range_map->GetCount(); | 348 int object_count = range_map->GetCount(); |
| 344 for (int object_index = 0; object_index < object_count; ++object_index) { | 349 for (int object_index = 0; object_index < object_count; ++object_index) { |
| 345 AddressType base; | 350 AddressType base; |
| 346 if (!range_map->RetrieveRangeAtIndex(object_index, &object, &base, NULL)) { | 351 if (!range_map->RetrieveRangeAtIndex(object_index, &object, &base, NULL, |
| 352 NULL)) { |
| 347 fprintf(stderr, "FAILED: RetrieveAtIndexTest2 index %d, " | 353 fprintf(stderr, "FAILED: RetrieveAtIndexTest2 index %d, " |
| 348 "expected success, observed failure\n", object_index); | 354 "expected success, observed failure\n", object_index); |
| 349 return false; | 355 return false; |
| 350 } | 356 } |
| 351 | 357 |
| 352 int expected_base = 2 * object->id(); | 358 int expected_base = 2 * object->id(); |
| 353 if (base != expected_base) { | 359 if (base != expected_base) { |
| 354 fprintf(stderr, "FAILED: RetriveAtIndexTest2 index %d, " | 360 fprintf(stderr, "FAILED: RetriveAtIndexTest2 index %d, " |
| 355 "expected base %d, observed base %d", | 361 "expected base %d, observed base %d", |
| 356 object_index, expected_base, base); | 362 object_index, expected_base, base); |
| (...skipping 186 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 543 | 549 |
| 544 | 550 |
| 545 } // namespace | 551 } // namespace |
| 546 | 552 |
| 547 | 553 |
| 548 int main(int argc, char **argv) { | 554 int main(int argc, char **argv) { |
| 549 BPLOG_INIT(&argc, &argv); | 555 BPLOG_INIT(&argc, &argv); |
| 550 | 556 |
| 551 return RunTests() ? 0 : 1; | 557 return RunTests() ? 0 : 1; |
| 552 } | 558 } |
| 559 |
| OLD | NEW |