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