108730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com// Copyright (c) 2010 Google Inc.
208730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com// All rights reserved.
308730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com//
408730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com// Redistribution and use in source and binary forms, with or without
508730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com// modification, are permitted provided that the following conditions are
608730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com// met:
708730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com//
808730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com//     * Redistributions of source code must retain the above copyright
908730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com// notice, this list of conditions and the following disclaimer.
1008730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com//     * Redistributions in binary form must reproduce the above
1108730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com// copyright notice, this list of conditions and the following disclaimer
1208730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com// in the documentation and/or other materials provided with the
1308730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com// distribution.
1408730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com//     * Neither the name of Google Inc. nor the names of its
1508730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com// contributors may be used to endorse or promote products derived from
1608730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com// this software without specific prior written permission.
1708730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com//
1808730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
1908730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
2008730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
2108730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
2208730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
2308730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
2408730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2508730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2608730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2708730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
2808730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2908730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com
3008730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com// static_range_map_unittest.cc: Unit tests for StaticRangeMap.
3108730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com//
3208730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com// Author: Siyang Xie (lambxsy@google.com)
3308730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com
3408730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com#include "breakpad_googletest_includes.h"
352cc15ba4327831f917ff55b87e6d5fc3c7750085ted.mielczarek@gmail.com#include "common/scoped_ptr.h"
3608730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com#include "processor/range_map-inl.h"
3708730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com#include "processor/static_range_map-inl.h"
3808730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com#include "processor/simple_serializer-inl.h"
3908730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com#include "processor/map_serializers-inl.h"
4008730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com#include "processor/logging.h"
412cc15ba4327831f917ff55b87e6d5fc3c7750085ted.mielczarek@gmail.com
4208730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com
434adb6f4f7b6e87801eac85aac721846a2293f2dfSiyangXie@gmail.comnamespace {
4408730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com// Types used for testing.
4508730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.comtypedef int AddressType;
4608730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.comtypedef int EntryType;
474adb6f4f7b6e87801eac85aac721846a2293f2dfSiyangXie@gmail.comtypedef google_breakpad::StaticRangeMap< AddressType, EntryType > TestMap;
484adb6f4f7b6e87801eac85aac721846a2293f2dfSiyangXie@gmail.comtypedef google_breakpad::RangeMap< AddressType, EntryType > RMap;
4908730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com
5008730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com// RangeTest contains data to use for store and retrieve tests.  See
5108730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com// RunTests for descriptions of the tests.
5208730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.comstruct RangeTest {
5308730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com  // Base address to use for test
5408730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com  AddressType address;
5508730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com
5608730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com  // Size of range to use for test
5708730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com  AddressType size;
5808730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com
5908730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com  // Unique ID of range - unstorable ranges must have unique IDs too
6008730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com  EntryType id;
6108730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com
6208730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com  // Whether this range is expected to be stored successfully or not
6308730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com  bool expect_storable;
6408730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com};
6508730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com
6608730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com// A RangeTestSet encompasses multiple RangeTests, which are run in
6708730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com// sequence on the same RangeMap.
6808730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.comstruct RangeTestSet {
6908730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com  // An array of RangeTests
7008730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com  const RangeTest* range_tests;
7108730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com
7208730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com  // The number of tests in the set
7308730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com  unsigned int range_test_count;
7408730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com};
7508730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com
764adb6f4f7b6e87801eac85aac721846a2293f2dfSiyangXie@gmail.com// These tests will be run sequentially.  The first set of tests exercises
774adb6f4f7b6e87801eac85aac721846a2293f2dfSiyangXie@gmail.com// most functions of RangeTest, and verifies all of the bounds-checking.
784adb6f4f7b6e87801eac85aac721846a2293f2dfSiyangXie@gmail.comconst RangeTest range_tests_0[] = {
794adb6f4f7b6e87801eac85aac721846a2293f2dfSiyangXie@gmail.com  { INT_MIN,     16,      1,  true },   // lowest possible range
804adb6f4f7b6e87801eac85aac721846a2293f2dfSiyangXie@gmail.com  { -2,          5,       2,  true },   // a range through zero
814adb6f4f7b6e87801eac85aac721846a2293f2dfSiyangXie@gmail.com  { INT_MAX - 9, 11,      3,  false },  // tests anti-overflow
824adb6f4f7b6e87801eac85aac721846a2293f2dfSiyangXie@gmail.com  { INT_MAX - 9, 10,      4,  true },   // highest possible range
834adb6f4f7b6e87801eac85aac721846a2293f2dfSiyangXie@gmail.com  { 5,           0,       5,  false },  // tests anti-zero-size
844adb6f4f7b6e87801eac85aac721846a2293f2dfSiyangXie@gmail.com  { 5,           1,       6,  true },   // smallest possible range
854adb6f4f7b6e87801eac85aac721846a2293f2dfSiyangXie@gmail.com  { -20,         15,      7,  true },   // entirely negative
864adb6f4f7b6e87801eac85aac721846a2293f2dfSiyangXie@gmail.com
874adb6f4f7b6e87801eac85aac721846a2293f2dfSiyangXie@gmail.com  { 10,          10,      10, true },   // causes the following tests to fail
884adb6f4f7b6e87801eac85aac721846a2293f2dfSiyangXie@gmail.com  { 9,           10,      11, false },  // one-less base, one-less high
894adb6f4f7b6e87801eac85aac721846a2293f2dfSiyangXie@gmail.com  { 9,           11,      12, false },  // one-less base, identical high
904adb6f4f7b6e87801eac85aac721846a2293f2dfSiyangXie@gmail.com  { 9,           12,      13, false },  // completely contains existing
914adb6f4f7b6e87801eac85aac721846a2293f2dfSiyangXie@gmail.com  { 10,          9,       14, false },  // identical base, one-less high
924adb6f4f7b6e87801eac85aac721846a2293f2dfSiyangXie@gmail.com  { 10,          10,      15, false },  // exactly identical to existing range
934adb6f4f7b6e87801eac85aac721846a2293f2dfSiyangXie@gmail.com  { 10,          11,      16, false },  // identical base, one-greater high
944adb6f4f7b6e87801eac85aac721846a2293f2dfSiyangXie@gmail.com  { 11,          8,       17, false },  // contained completely within
954adb6f4f7b6e87801eac85aac721846a2293f2dfSiyangXie@gmail.com  { 11,          9,       18, false },  // one-greater base, identical high
964adb6f4f7b6e87801eac85aac721846a2293f2dfSiyangXie@gmail.com  { 11,          10,      19, false },  // one-greater base, one-greater high
974adb6f4f7b6e87801eac85aac721846a2293f2dfSiyangXie@gmail.com  { 9,           2,       20, false },  // overlaps bottom by one
984adb6f4f7b6e87801eac85aac721846a2293f2dfSiyangXie@gmail.com  { 10,          1,       21, false },  // overlaps bottom by one, contained
994adb6f4f7b6e87801eac85aac721846a2293f2dfSiyangXie@gmail.com  { 19,          1,       22, false },  // overlaps top by one, contained
1004adb6f4f7b6e87801eac85aac721846a2293f2dfSiyangXie@gmail.com  { 19,          2,       23, false },  // overlaps top by one
1014adb6f4f7b6e87801eac85aac721846a2293f2dfSiyangXie@gmail.com
1024adb6f4f7b6e87801eac85aac721846a2293f2dfSiyangXie@gmail.com  { 9,           1,       24, true },   // directly below without overlap
1034adb6f4f7b6e87801eac85aac721846a2293f2dfSiyangXie@gmail.com  { 20,          1,       25, true },   // directly above without overlap
1044adb6f4f7b6e87801eac85aac721846a2293f2dfSiyangXie@gmail.com
1054adb6f4f7b6e87801eac85aac721846a2293f2dfSiyangXie@gmail.com  { 6,           3,       26, true },   // exactly between two ranges, gapless
1064adb6f4f7b6e87801eac85aac721846a2293f2dfSiyangXie@gmail.com  { 7,           3,       27, false },  // tries to span two ranges
1074adb6f4f7b6e87801eac85aac721846a2293f2dfSiyangXie@gmail.com  { 7,           5,       28, false },  // tries to span three ranges
1084adb6f4f7b6e87801eac85aac721846a2293f2dfSiyangXie@gmail.com  { 4,           20,      29, false },  // tries to contain several ranges
1094adb6f4f7b6e87801eac85aac721846a2293f2dfSiyangXie@gmail.com
1104adb6f4f7b6e87801eac85aac721846a2293f2dfSiyangXie@gmail.com  { 30,          50,      30, true },
1114adb6f4f7b6e87801eac85aac721846a2293f2dfSiyangXie@gmail.com  { 90,          25,      31, true },
1124adb6f4f7b6e87801eac85aac721846a2293f2dfSiyangXie@gmail.com  { 35,          65,      32, false },  // tries to span two noncontiguous
1134adb6f4f7b6e87801eac85aac721846a2293f2dfSiyangXie@gmail.com  { 120,         10000,   33, true },   // > 8-bit
1144adb6f4f7b6e87801eac85aac721846a2293f2dfSiyangXie@gmail.com  { 20000,       20000,   34, true },   // > 8-bit
1154adb6f4f7b6e87801eac85aac721846a2293f2dfSiyangXie@gmail.com  { 0x10001,     0x10001, 35, true },   // > 16-bit
1164adb6f4f7b6e87801eac85aac721846a2293f2dfSiyangXie@gmail.com
1174adb6f4f7b6e87801eac85aac721846a2293f2dfSiyangXie@gmail.com  { 27,          -1,      36, false }   // tests high < base
1184adb6f4f7b6e87801eac85aac721846a2293f2dfSiyangXie@gmail.com};
1194adb6f4f7b6e87801eac85aac721846a2293f2dfSiyangXie@gmail.com
1204adb6f4f7b6e87801eac85aac721846a2293f2dfSiyangXie@gmail.com// Attempt to fill the entire space.  The entire space must be filled with
1214adb6f4f7b6e87801eac85aac721846a2293f2dfSiyangXie@gmail.com// three stores because AddressType is signed for these tests, so RangeMap
1224adb6f4f7b6e87801eac85aac721846a2293f2dfSiyangXie@gmail.com// treats the size as signed and rejects sizes that appear to be negative.
1234adb6f4f7b6e87801eac85aac721846a2293f2dfSiyangXie@gmail.com// Even if these tests were run as unsigned, two stores would be needed
1244adb6f4f7b6e87801eac85aac721846a2293f2dfSiyangXie@gmail.com// to fill the space because the entire size of the space could only be
1254adb6f4f7b6e87801eac85aac721846a2293f2dfSiyangXie@gmail.com// described by using one more bit than would be present in AddressType.
1264adb6f4f7b6e87801eac85aac721846a2293f2dfSiyangXie@gmail.comconst RangeTest range_tests_1[] = {
1274adb6f4f7b6e87801eac85aac721846a2293f2dfSiyangXie@gmail.com  { INT_MIN, INT_MAX, 50, true },   // From INT_MIN to -2, inclusive
1284adb6f4f7b6e87801eac85aac721846a2293f2dfSiyangXie@gmail.com  { -1,      2,       51, true },   // From -1 to 0, inclusive
1294adb6f4f7b6e87801eac85aac721846a2293f2dfSiyangXie@gmail.com  { 1,       INT_MAX, 52, true },   // From 1 to INT_MAX, inclusive
1304adb6f4f7b6e87801eac85aac721846a2293f2dfSiyangXie@gmail.com  { INT_MIN, INT_MAX, 53, false },  // Can't fill the space twice
1314adb6f4f7b6e87801eac85aac721846a2293f2dfSiyangXie@gmail.com  { -1,      2,       54, false },
1324adb6f4f7b6e87801eac85aac721846a2293f2dfSiyangXie@gmail.com  { 1,       INT_MAX, 55, false },
1334adb6f4f7b6e87801eac85aac721846a2293f2dfSiyangXie@gmail.com  { -3,      6,       56, false },  // -3 to 2, inclusive - spans 3 ranges
1344adb6f4f7b6e87801eac85aac721846a2293f2dfSiyangXie@gmail.com};
1354adb6f4f7b6e87801eac85aac721846a2293f2dfSiyangXie@gmail.com
1364adb6f4f7b6e87801eac85aac721846a2293f2dfSiyangXie@gmail.com// A light round of testing to verify that RetrieveRange does the right
1374adb6f4f7b6e87801eac85aac721846a2293f2dfSiyangXie@gmail.com// the right thing at the extremities of the range when nothing is stored
1384adb6f4f7b6e87801eac85aac721846a2293f2dfSiyangXie@gmail.com// there.  Checks are forced without storing anything at the extremities
1394adb6f4f7b6e87801eac85aac721846a2293f2dfSiyangXie@gmail.com// by setting size = 0.
1404adb6f4f7b6e87801eac85aac721846a2293f2dfSiyangXie@gmail.comconst RangeTest range_tests_2[] = {
1414adb6f4f7b6e87801eac85aac721846a2293f2dfSiyangXie@gmail.com  { INT_MIN, 0, 100, false },  // makes RetrieveRange check low end
1424adb6f4f7b6e87801eac85aac721846a2293f2dfSiyangXie@gmail.com  { -1,      3, 101, true },
1434adb6f4f7b6e87801eac85aac721846a2293f2dfSiyangXie@gmail.com  { INT_MAX, 0, 102, false },  // makes RetrieveRange check high end
1444adb6f4f7b6e87801eac85aac721846a2293f2dfSiyangXie@gmail.com};
1454adb6f4f7b6e87801eac85aac721846a2293f2dfSiyangXie@gmail.com
1464adb6f4f7b6e87801eac85aac721846a2293f2dfSiyangXie@gmail.com// Similar to the previous test set, but with a couple of ranges closer
1474adb6f4f7b6e87801eac85aac721846a2293f2dfSiyangXie@gmail.com// to the extremities.
1484adb6f4f7b6e87801eac85aac721846a2293f2dfSiyangXie@gmail.comconst RangeTest range_tests_3[] = {
1494adb6f4f7b6e87801eac85aac721846a2293f2dfSiyangXie@gmail.com  { INT_MIN + 1, 1, 110, true },
1504adb6f4f7b6e87801eac85aac721846a2293f2dfSiyangXie@gmail.com  { INT_MAX - 1, 1, 111, true },
1514adb6f4f7b6e87801eac85aac721846a2293f2dfSiyangXie@gmail.com  { INT_MIN,     0, 112, false },  // makes RetrieveRange check low end
1524adb6f4f7b6e87801eac85aac721846a2293f2dfSiyangXie@gmail.com  { INT_MAX,     0, 113, false }   // makes RetrieveRange check high end
1534adb6f4f7b6e87801eac85aac721846a2293f2dfSiyangXie@gmail.com};
1544adb6f4f7b6e87801eac85aac721846a2293f2dfSiyangXie@gmail.com
1554adb6f4f7b6e87801eac85aac721846a2293f2dfSiyangXie@gmail.com// The range map is cleared between sets of tests listed here.
1564adb6f4f7b6e87801eac85aac721846a2293f2dfSiyangXie@gmail.comconst RangeTestSet range_test_sets[] = {
1574adb6f4f7b6e87801eac85aac721846a2293f2dfSiyangXie@gmail.com  { range_tests_0, sizeof(range_tests_0) / sizeof(RangeTest) },
1584adb6f4f7b6e87801eac85aac721846a2293f2dfSiyangXie@gmail.com  { range_tests_1, sizeof(range_tests_1) / sizeof(RangeTest) },
1594adb6f4f7b6e87801eac85aac721846a2293f2dfSiyangXie@gmail.com  { range_tests_2, sizeof(range_tests_2) / sizeof(RangeTest) },
1604adb6f4f7b6e87801eac85aac721846a2293f2dfSiyangXie@gmail.com  { range_tests_3, sizeof(range_tests_3) / sizeof(RangeTest) },
1614adb6f4f7b6e87801eac85aac721846a2293f2dfSiyangXie@gmail.com  { range_tests_0, sizeof(range_tests_0) / sizeof(RangeTest) }   // Run again
1624adb6f4f7b6e87801eac85aac721846a2293f2dfSiyangXie@gmail.com};
1634adb6f4f7b6e87801eac85aac721846a2293f2dfSiyangXie@gmail.com
1644adb6f4f7b6e87801eac85aac721846a2293f2dfSiyangXie@gmail.com}  // namespace
16508730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com
1664adb6f4f7b6e87801eac85aac721846a2293f2dfSiyangXie@gmail.comnamespace google_breakpad {
16708730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.comclass TestStaticRangeMap : public ::testing::Test {
16808730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com protected:
16908730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com  void SetUp() {
17008730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com    kTestCasesCount_ = sizeof(range_test_sets) / sizeof(RangeTestSet);
17108730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com  }
17208730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com
17308730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com  // StoreTest uses the data in a RangeTest and calls StoreRange on the
17408730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com  // test RangeMap.  It returns true if the expected result occurred, and
17508730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com  // false if something else happened.
17608730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com  void StoreTest(RMap* range_map, const RangeTest* range_test);
17708730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com
17808730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com  // RetrieveTest uses the data in RangeTest and calls RetrieveRange on the
17908730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com  // test RangeMap.  If it retrieves the expected value (which can be no
18008730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com  // map entry at the specified range,) it returns true, otherwise, it returns
18108730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com  // false.  RetrieveTest will check the values around the base address and
18208730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com  // the high address of a range to guard against off-by-one errors.
18308730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com  void RetrieveTest(TestMap* range_map, const RangeTest* range_test);
18408730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com
18508730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com  // Test RetrieveRangeAtIndex, which is supposed to return objects in order
18608730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com  // according to their addresses.  This test is performed by looping through
18708730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com  // the map, calling RetrieveRangeAtIndex for all possible indices in sequence,
18808730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com  // and verifying that each call returns a different object than the previous
18908730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com  // call, and that ranges are returned with increasing base addresses.  Returns
19008730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com  // false if the test fails.
19108730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com  void RetrieveIndexTest(const TestMap* range_map, int set);
19208730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com
19308730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com  void RunTestCase(int test_case);
19408730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com
19508730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com  unsigned int kTestCasesCount_;
1964adb6f4f7b6e87801eac85aac721846a2293f2dfSiyangXie@gmail.com  RangeMapSerializer<AddressType, EntryType> serializer_;
19708730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com};
19808730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com
19908730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.comvoid TestStaticRangeMap::StoreTest(RMap* range_map,
20008730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com                                   const RangeTest* range_test) {
20108730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com  bool stored = range_map->StoreRange(range_test->address,
20208730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com                                      range_test->size,
20308730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com                                      range_test->id);
20408730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com  EXPECT_EQ(stored, range_test->expect_storable)
20508730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com      << "StoreRange id " << range_test->id << "FAILED";
20608730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com}
20708730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com
20808730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.comvoid TestStaticRangeMap::RetrieveTest(TestMap* range_map,
20908730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com                                      const RangeTest* range_test) {
21008730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com  for (unsigned int side = 0; side <= 1; ++side) {
21108730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com    // When side == 0, check the low side (base address) of each range.
21208730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com    // When side == 1, check the high side (base + size) of each range.
21308730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com
21408730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com    // Check one-less and one-greater than the target address in addition
21508730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com    // to the target address itself.
21608730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com
21708730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com    // If the size of the range is only 1, don't check one greater than
21808730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com    // the base or one less than the high - for a successfully stored
21908730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com    // range, these tests would erroneously fail because the range is too
22008730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com    // small.
22108730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com    AddressType low_offset = -1;
22208730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com    AddressType high_offset = 1;
22308730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com    if (range_test->size == 1) {
22408730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com      if (!side)          // When checking the low side,
22508730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com        high_offset = 0;  // don't check one over the target.
22608730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com      else                // When checking the high side,
22708730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com        low_offset = 0;   // don't check one under the target.
22808730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com    }
22908730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com
23008730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com    for (AddressType offset = low_offset; offset <= high_offset; ++offset) {
23108730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com      AddressType address =
23208730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com          offset +
23308730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com          (!side ? range_test->address :
23408730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com                   range_test->address + range_test->size - 1);
23508730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com
23608730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com      bool expected_result = false;  // This is correct for tests not stored.
23708730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com      if (range_test->expect_storable) {
23808730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com        if (offset == 0)             // When checking the target address,
23908730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com          expected_result = true;    // test should always succeed.
24008730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com        else if (offset == -1)       // When checking one below the target,
24108730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com          expected_result = side;    // should fail low and succeed high.
24208730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com        else                         // When checking one above the target,
24308730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com          expected_result = !side;   // should succeed low and fail high.
24408730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com      }
24508730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com
24608730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com      const EntryType* id;
24708730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com      AddressType retrieved_base;
24808730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com      AddressType retrieved_size;
24908730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com      bool retrieved = range_map->RetrieveRange(address, id,
25008730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com                                                &retrieved_base,
25108730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com                                                &retrieved_size);
25208730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com
25308730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com      bool observed_result = retrieved && *id == range_test->id;
25408730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com      EXPECT_EQ(observed_result, expected_result)
25508730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com          << "RetrieveRange id " << range_test->id
25608730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com          << ", side " << side << ", offset " << offset << " FAILED.";
25708730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com
25808730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com      // If a range was successfully retrieved, check that the returned
25908730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com      // bounds match the range as stored.
26008730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com      if (observed_result == true) {
26108730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com        EXPECT_EQ(retrieved_base, range_test->address)
26208730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com            << "RetrieveRange id " << range_test->id
26308730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com            << ", side " << side << ", offset " << offset << " FAILED.";
26408730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com        EXPECT_EQ(retrieved_size, range_test->size)
26508730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com            << "RetrieveRange id " << range_test->id
26608730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com            << ", side " << side << ", offset " << offset << " FAILED.";
26708730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com      }
26808730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com
26908730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com      // Now, check RetrieveNearestRange.  The nearest range is always
27008730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com      // expected to be different from the test range when checking one
27108730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com      // less than the low side.
27208730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com      bool expected_nearest = range_test->expect_storable;
27308730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com      if (!side && offset < 0)
27408730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com        expected_nearest = false;
27508730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com
27608730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com      AddressType nearest_base;
27708730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com      AddressType nearest_size;
27808730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com      bool retrieved_nearest = range_map->RetrieveNearestRange(address,
27908730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com                                                               id,
28008730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com                                                               &nearest_base,
28108730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com                                                               &nearest_size);
28208730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com
28308730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com      // When checking one greater than the high side, RetrieveNearestRange
28408730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com      // should usually return the test range.  When a different range begins
28508730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com      // at that address, though, then RetrieveNearestRange should return the
28608730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com      // range at the address instead of the test range.
28708730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com      if (side && offset > 0 && nearest_base == address) {
28808730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com        expected_nearest = false;
28908730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com      }
29008730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com
29108730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com      bool observed_nearest = retrieved_nearest &&
29208730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com                              *id == range_test->id;
29308730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com
29408730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com      EXPECT_EQ(observed_nearest, expected_nearest)
29508730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com          << "RetrieveRange id " << range_test->id
29608730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com          << ", side " << side << ", offset " << offset << " FAILED.";
29708730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com
29808730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com      // If a range was successfully retrieved, check that the returned
29908730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com      // bounds match the range as stored.
30008730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com      if (expected_nearest ==true) {
30108730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com        EXPECT_EQ(nearest_base, range_test->address)
30208730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com            << "RetrieveRange id " << range_test->id
30308730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com            << ", side " << side << ", offset " << offset << " FAILED.";
30408730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com        EXPECT_EQ(nearest_size, range_test->size)
30508730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com            << "RetrieveRange id " << range_test->id
30608730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com            << ", side " << side << ", offset " << offset << " FAILED.";
30708730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com      }
30808730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com    }
30908730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com  }
31008730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com}
31108730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com
31208730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.comvoid TestStaticRangeMap::RetrieveIndexTest(const TestMap* range_map, int set) {
31308730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com  AddressType last_base = 0;
31408730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com  const EntryType* last_entry = 0;
31508730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com  const EntryType* entry;
31608730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com  int object_count = range_map->GetCount();
31708730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com  for (int object_index = 0; object_index < object_count; ++object_index) {
31808730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com    AddressType base;
31908730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com    ASSERT_TRUE(range_map->RetrieveRangeAtIndex(object_index,
32008730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com                                                entry,
32108730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com                                                &base,
32208730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com                                                NULL))
32308730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com        << "FAILED: RetrieveRangeAtIndex set " << set
32408730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com        << " index " << object_index;
32508730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com
32608730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com    ASSERT_TRUE(entry) << "FAILED: RetrieveRangeAtIndex set " << set
32708730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com                           << " index " << object_index;
32808730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com
32908730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com    // It's impossible to do these comparisons unless there's a previous
33008730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com    // object to compare against.
33108730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com    if (last_entry) {
33208730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com      // The object must be different from the last_entry one.
33308730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com      EXPECT_NE(*entry, *last_entry) << "FAILED: RetrieveRangeAtIndex set "
33408730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com                                     << set << " index " << object_index;
33508730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com      // Each object must have a base greater than the previous object's base.
33608730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com      EXPECT_GT(base, last_base) << "FAILED: RetrieveRangeAtIndex set " << set
33708730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com                                 << " index " << object_index;
33808730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com    }
33908730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com    last_entry = entry;
34008730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com    last_base = base;
34108730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com  }
34208730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com
34308730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com  // Make sure that RetrieveRangeAtIndex doesn't allow lookups at indices that
34408730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com  // are too high.
34508730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com  ASSERT_FALSE(range_map->RetrieveRangeAtIndex(
34608730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com      object_count, entry, NULL, NULL)) << "FAILED: RetrieveRangeAtIndex set "
34708730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com                                        << set << " index " << object_count
34808730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com                                        << " (too large)";
34908730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com}
35008730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com
35108730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com// RunTests runs a series of test sets.
35208730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.comvoid TestStaticRangeMap::RunTestCase(int test_case) {
35308730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com  // Maintain the range map in a pointer so that deletion can be meaningfully
35408730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com  // tested.
3554adb6f4f7b6e87801eac85aac721846a2293f2dfSiyangXie@gmail.com  scoped_ptr<RMap> rmap(new RMap());
35608730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com
35708730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com  const RangeTest* range_tests = range_test_sets[test_case].range_tests;
35808730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com  unsigned int range_test_count = range_test_sets[test_case].range_test_count;
35908730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com
36008730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com  // Run the StoreRange test, which validates StoreRange and initializes
36108730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com  // the RangeMap with data for the RetrieveRange test.
36208730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com  int stored_count = 0;  // The number of ranges successfully stored
36308730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com  for (unsigned int range_test_index = 0;
36408730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com       range_test_index < range_test_count;
36508730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com       ++range_test_index) {
36608730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com    const RangeTest* range_test = &range_tests[range_test_index];
3674adb6f4f7b6e87801eac85aac721846a2293f2dfSiyangXie@gmail.com    StoreTest(rmap.get(), range_test);
36808730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com
36908730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com    if (range_test->expect_storable)
37008730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com      ++stored_count;
37108730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com  }
37208730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com
3734adb6f4f7b6e87801eac85aac721846a2293f2dfSiyangXie@gmail.com  scoped_array<char> memaddr(serializer_.Serialize(*rmap, NULL));
3744adb6f4f7b6e87801eac85aac721846a2293f2dfSiyangXie@gmail.com  scoped_ptr<TestMap> static_range_map(new TestMap(memaddr.get()));
37508730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com
37608730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com  // The RangeMap's own count of objects should also match.
37708730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com  EXPECT_EQ(static_range_map->GetCount(), stored_count);
37808730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com
37908730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com  // Run the RetrieveRange test
38008730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com  for (unsigned int range_test_index = 0;
38108730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com       range_test_index < range_test_count;
38208730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com       ++range_test_index) {
38308730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com    const RangeTest* range_test = &range_tests[range_test_index];
3844adb6f4f7b6e87801eac85aac721846a2293f2dfSiyangXie@gmail.com    RetrieveTest(static_range_map.get(), range_test);
38508730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com  }
38608730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com
3874adb6f4f7b6e87801eac85aac721846a2293f2dfSiyangXie@gmail.com  RetrieveIndexTest(static_range_map.get(), test_case);
38808730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com}
38908730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com
39008730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.comTEST_F(TestStaticRangeMap, TestCase0) {
39108730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com  int test_case = 0;
39208730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com  RunTestCase(test_case);
39308730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com}
39408730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com
39508730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.comTEST_F(TestStaticRangeMap, TestCase1) {
39608730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com  int test_case = 1;
39708730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com  RunTestCase(test_case);
39808730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com}
39908730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com
40008730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.comTEST_F(TestStaticRangeMap, TestCase2) {
40108730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com  int test_case = 2;
40208730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com  RunTestCase(test_case);
40308730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com}
40408730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com
40508730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.comTEST_F(TestStaticRangeMap, TestCase3) {
40608730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com  int test_case = 3;
40708730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com  RunTestCase(test_case);
40808730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com}
40908730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com
41008730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.comTEST_F(TestStaticRangeMap, RunTestCase0Again) {
41108730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com  int test_case = 0;
41208730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com  RunTestCase(test_case);
41308730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com}
41408730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com
4154adb6f4f7b6e87801eac85aac721846a2293f2dfSiyangXie@gmail.com}  // namespace google_breakpad
4164adb6f4f7b6e87801eac85aac721846a2293f2dfSiyangXie@gmail.com
41708730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.comint main(int argc, char *argv[]) {
41808730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com  ::testing::InitGoogleTest(&argc, argv);
41908730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com
42008730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com  return RUN_ALL_TESTS();
42108730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com}
422