1378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com// Copyright (c) 2010 Google Inc. 2378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com// All rights reserved. 3378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com// 4378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com// Redistribution and use in source and binary forms, with or without 5378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com// modification, are permitted provided that the following conditions are 6378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com// met: 7378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com// 8378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com// * Redistributions of source code must retain the above copyright 9378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com// notice, this list of conditions and the following disclaimer. 10378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com// * Redistributions in binary form must reproduce the above 11378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com// copyright notice, this list of conditions and the following disclaimer 12378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com// in the documentation and/or other materials provided with the 13378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com// distribution. 14378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com// * Neither the name of Google Inc. nor the names of its 15378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com// contributors may be used to endorse or promote products derived from 16378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com// this software without specific prior written permission. 17378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com// 18378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 19378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 20378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 21378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 22378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 23378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 24378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 25378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 26378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 27378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 28378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 29378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com 30378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com// static_map_unittest.cc: Unit tests for StaticMap. 31378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com// 32378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com// Author: Siyang Xie (lambxsy@google.com) 33378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com 34378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com#include <climits> 35378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com#include <map> 36378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com 37378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com#include "breakpad_googletest_includes.h" 38378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com#include "processor/static_map-inl.h" 39378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com 40378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com 41378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.comtypedef int ValueType; 42378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.comtypedef int KeyType; 43378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.comtypedef google_breakpad::StaticMap< KeyType, ValueType > TestMap; 44378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.comtypedef std::map< KeyType, ValueType > StdMap; 45378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com 46378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.comtemplate<typename Key, typename Value> 47378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.comclass SimpleMapSerializer { 48378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com public: 49378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com static char* Serialize(const std::map<Key, Value> &stdmap, 50378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com unsigned int* size = NULL) { 51378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com unsigned int size_per_node = 526162aed3c3fcfc53373c963ac375d39a5dfa5a25ted.mielczarek@gmail.com sizeof(uint32_t) + sizeof(Key) + sizeof(Value); 53378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com unsigned int memsize = sizeof(int32_t) + size_per_node * stdmap.size(); 54378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com if (size) *size = memsize; 55378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com 56378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com // Allocate memory for serialized data: 57378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com char* mem = reinterpret_cast<char*>(operator new(memsize)); 58378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com char* address = mem; 59378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com 60378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com // Writer the number of nodes: 616162aed3c3fcfc53373c963ac375d39a5dfa5a25ted.mielczarek@gmail.com new (address) uint32_t(static_cast<uint32_t>(stdmap.size())); 626162aed3c3fcfc53373c963ac375d39a5dfa5a25ted.mielczarek@gmail.com address += sizeof(uint32_t); 63378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com 64378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com // Nodes' offset: 656162aed3c3fcfc53373c963ac375d39a5dfa5a25ted.mielczarek@gmail.com uint32_t* offsets = reinterpret_cast<uint32_t*>(address); 666162aed3c3fcfc53373c963ac375d39a5dfa5a25ted.mielczarek@gmail.com address += sizeof(uint32_t) * stdmap.size(); 67378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com 68378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com // Keys: 69378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com Key* keys = reinterpret_cast<Key*>(address); 70378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com address += sizeof(Key) * stdmap.size(); 71378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com 72378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com // Traversing map: 73378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com typename std::map<Key, Value>::const_iterator iter = stdmap.begin(); 74378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com for (int index = 0; iter != stdmap.end(); ++iter, ++index) { 75378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com offsets[index] = static_cast<unsigned int>(address - mem); 76378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com keys[index] = iter->first; 77378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com new (address) Value(iter->second); 78378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com address += sizeof(Value); 79378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com } 80378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com return mem; 81378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com } 82378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com}; 83378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com 84378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com 85378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.comclass TestInvalidMap : public ::testing::Test { 86378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com protected: 87378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com void SetUp() { 88378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com memset(data, 0, kMemorySize); 89378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com } 90378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com 91378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com // 40 Bytes memory can hold a StaticMap with up to 3 nodes. 92378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com static const int kMemorySize = 40; 93378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com char data[kMemorySize]; 94378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com TestMap test_map; 95378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com}; 96378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com 97378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.comTEST_F(TestInvalidMap, TestNegativeNumberNodes) { 986162aed3c3fcfc53373c963ac375d39a5dfa5a25ted.mielczarek@gmail.com memset(data, 0xff, sizeof(uint32_t)); // Set the number of nodes = -1 99378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com test_map = TestMap(data); 100378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com ASSERT_FALSE(test_map.ValidateInMemoryStructure()); 101378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com} 102378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com 103378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.comTEST_F(TestInvalidMap, TestWrongOffsets) { 1046162aed3c3fcfc53373c963ac375d39a5dfa5a25ted.mielczarek@gmail.com uint32_t* header = reinterpret_cast<uint32_t*>(data); 1056162aed3c3fcfc53373c963ac375d39a5dfa5a25ted.mielczarek@gmail.com const uint32_t kNumNodes = 2; 1066162aed3c3fcfc53373c963ac375d39a5dfa5a25ted.mielczarek@gmail.com const uint32_t kHeaderOffset = 1076162aed3c3fcfc53373c963ac375d39a5dfa5a25ted.mielczarek@gmail.com sizeof(uint32_t) + kNumNodes * (sizeof(uint32_t) + sizeof(KeyType)); 108378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com 109378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com header[0] = kNumNodes; 110378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com header[1] = kHeaderOffset + 3; // Wrong offset for first node 111378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com test_map = TestMap(data); 112378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com ASSERT_FALSE(test_map.ValidateInMemoryStructure()); 113378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com 114378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com header[1] = kHeaderOffset; // Correct offset for first node 115378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com header[2] = kHeaderOffset - 1; // Wrong offset for second node 116378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com test_map = TestMap(data); 117378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com ASSERT_FALSE(test_map.ValidateInMemoryStructure()); 118378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com} 119378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com 120378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.comTEST_F(TestInvalidMap, TestUnSortedKeys) { 1216162aed3c3fcfc53373c963ac375d39a5dfa5a25ted.mielczarek@gmail.com uint32_t* header = reinterpret_cast<uint32_t*>(data); 1226162aed3c3fcfc53373c963ac375d39a5dfa5a25ted.mielczarek@gmail.com const uint32_t kNumNodes = 2; 1236162aed3c3fcfc53373c963ac375d39a5dfa5a25ted.mielczarek@gmail.com const uint32_t kHeaderOffset = 1246162aed3c3fcfc53373c963ac375d39a5dfa5a25ted.mielczarek@gmail.com sizeof(uint32_t) + kNumNodes * (sizeof(uint32_t) + sizeof(KeyType)); 125378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com header[0] = kNumNodes; 126378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com header[1] = kHeaderOffset; 127378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com header[2] = kHeaderOffset + sizeof(ValueType); 128378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com 129378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com KeyType* keys = reinterpret_cast<KeyType*>( 1306162aed3c3fcfc53373c963ac375d39a5dfa5a25ted.mielczarek@gmail.com data + (kNumNodes + 1) * sizeof(uint32_t)); 131378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com // Set keys in non-increasing order. 132378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com keys[0] = 10; 133378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com keys[1] = 7; 134378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com test_map = TestMap(data); 135378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com ASSERT_FALSE(test_map.ValidateInMemoryStructure()); 136378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com} 137378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com 138378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com 139378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.comclass TestValidMap : public ::testing::Test { 140378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com protected: 141378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com void SetUp() { 142378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com int testcase = 0; 143378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com 144378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com // Empty map. 145378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com map_data[testcase] = 146378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com serializer.Serialize(std_map[testcase], &size[testcase]); 147378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com test_map[testcase] = TestMap(map_data[testcase]); 148378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com ++testcase; 149378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com 150378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com // Single element. 151378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com std_map[testcase].insert(std::make_pair(2, 8)); 152378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com map_data[testcase] = 153378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com serializer.Serialize(std_map[testcase], &size[testcase]); 154378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com test_map[testcase] = TestMap(map_data[testcase]); 155378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com ++testcase; 156378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com 157378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com // 100 elements. 158378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com for (int i = 0; i < 100; ++i) 159378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com std_map[testcase].insert(std::make_pair(i, 2 * i)); 160378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com map_data[testcase] = 161378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com serializer.Serialize(std_map[testcase], &size[testcase]); 162378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com test_map[testcase] = TestMap(map_data[testcase]); 163378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com ++testcase; 164378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com 165378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com // 1000 random elements. 166378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com for (int i = 0; i < 1000; ++i) 167378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com std_map[testcase].insert(std::make_pair(rand(), rand())); 168378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com map_data[testcase] = 169378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com serializer.Serialize(std_map[testcase], &size[testcase]); 170378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com test_map[testcase] = TestMap(map_data[testcase]); 171378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com 172378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com // Set correct size of memory allocation for each test case. 173378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com unsigned int size_per_node = 1746162aed3c3fcfc53373c963ac375d39a5dfa5a25ted.mielczarek@gmail.com sizeof(uint32_t) + sizeof(KeyType) + sizeof(ValueType); 175378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com for (testcase = 0; testcase < kNumberTestCases; ++testcase) { 176378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com correct_size[testcase] = 1776162aed3c3fcfc53373c963ac375d39a5dfa5a25ted.mielczarek@gmail.com sizeof(uint32_t) + std_map[testcase].size() * size_per_node; 178378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com } 179378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com } 180378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com 181378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com void TearDown() { 182378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com for (int i = 0;i < kNumberTestCases; ++i) 183378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com delete map_data[i]; 184378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com } 185378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com 186378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com 187378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com void IteratorTester(int test_case) { 188378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com // scan through: 189378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com iter_test = test_map[test_case].begin(); 190378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com iter_std = std_map[test_case].begin(); 191378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com 192378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com for (; iter_test != test_map[test_case].end() && 193378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com iter_std != std_map[test_case].end(); 194378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com ++iter_test, ++iter_std) { 195378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com ASSERT_EQ(iter_test.GetKey(), iter_std->first); 196378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com ASSERT_EQ(*(iter_test.GetValuePtr()), iter_std->second); 197378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com } 198378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com ASSERT_TRUE(iter_test == test_map[test_case].end() 199378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com && iter_std == std_map[test_case].end()); 200378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com 201378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com // Boundary testcase. 202378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com if (!std_map[test_case].empty()) { 203378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com // rear boundary case: 204378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com iter_test = test_map[test_case].end(); 205378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com iter_std = std_map[test_case].end(); 206378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com --iter_std; 207378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com --iter_test; 208378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com ASSERT_EQ(iter_test.GetKey(), iter_std->first); 209378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com ASSERT_EQ(*(iter_test.GetValuePtr()), iter_std->second); 210378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com 211378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com ++iter_test; 212378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com ++iter_std; 213378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com ASSERT_TRUE(iter_test == test_map[test_case].end()); 214378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com 215378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com --iter_test; 216378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com --iter_std; 217378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com ASSERT_TRUE(iter_test != test_map[test_case].end()); 218378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com ASSERT_TRUE(iter_test == test_map[test_case].last()); 219378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com ASSERT_EQ(iter_test.GetKey(), iter_std->first); 220378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com ASSERT_EQ(*(iter_test.GetValuePtr()), iter_std->second); 221378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com 222378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com // front boundary case: 223378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com iter_test = test_map[test_case].begin(); 224378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com --iter_test; 225378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com ASSERT_TRUE(iter_test == test_map[test_case].begin()); 226378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com } 227378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com } 228378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com 229378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com void CompareLookupResult(int test_case) { 230378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com bool found1 = (iter_test != test_map[test_case].end()); 231378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com bool found2 = (iter_std != std_map[test_case].end()); 232378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com ASSERT_EQ(found1, found2); 233378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com 234378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com if (found1 && found2) { 235378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com ASSERT_EQ(iter_test.GetKey(), iter_std->first); 236378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com ASSERT_EQ(*(iter_test.GetValuePtr()), iter_std->second); 237378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com } 238378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com } 239378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com 240378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com void FindTester(int test_case, const KeyType &key) { 241378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com iter_test = test_map[test_case].find(key); 242378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com iter_std = std_map[test_case].find(key); 243378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com CompareLookupResult(test_case); 244378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com } 245378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com 246378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com void LowerBoundTester(int test_case, const KeyType &key) { 247378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com iter_test = test_map[test_case].lower_bound(key); 248378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com iter_std = std_map[test_case].lower_bound(key); 249378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com CompareLookupResult(test_case); 250378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com } 251378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com 252378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com void UpperBoundTester(int test_case, const KeyType &key) { 253378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com iter_test = test_map[test_case].upper_bound(key); 254378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com iter_std = std_map[test_case].upper_bound(key); 255378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com CompareLookupResult(test_case); 256378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com } 257378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com 258378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com void LookupTester(int test_case) { 259378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com StdMap::const_iterator iter; 260378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com // Test find(): 261378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com for (iter = std_map[test_case].begin(); 262378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com iter != std_map[test_case].end(); 263378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com ++iter) { 264378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com FindTester(test_case, iter->first); 265378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com FindTester(test_case, iter->first + 1); 266378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com FindTester(test_case, iter->first - 1); 267378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com } 268378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com FindTester(test_case, INT_MIN); 269378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com FindTester(test_case, INT_MAX); 270378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com // random test: 271378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com for (int i = 0; i < rand()%5000 + 5000; ++i) 272378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com FindTester(test_case, rand()); 273378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com 274378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com // Test lower_bound(): 275378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com for (iter = std_map[test_case].begin(); 276378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com iter != std_map[test_case].end(); 277378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com ++iter) { 278378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com LowerBoundTester(test_case, iter->first); 279378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com LowerBoundTester(test_case, iter->first + 1); 280378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com LowerBoundTester(test_case, iter->first - 1); 281378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com } 282378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com LowerBoundTester(test_case, INT_MIN); 283378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com LowerBoundTester(test_case, INT_MAX); 284378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com // random test: 285378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com for (int i = 0; i < rand()%5000 + 5000; ++i) 286378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com LowerBoundTester(test_case, rand()); 287378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com 288378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com // Test upper_bound(): 289378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com for (iter = std_map[test_case].begin(); 290378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com iter != std_map[test_case].end(); 291378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com ++iter) { 292378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com UpperBoundTester(test_case, iter->first); 293378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com UpperBoundTester(test_case, iter->first + 1); 294378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com UpperBoundTester(test_case, iter->first - 1); 295378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com } 296378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com UpperBoundTester(test_case, INT_MIN); 297378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com UpperBoundTester(test_case, INT_MAX); 298378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com // random test: 299378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com for (int i = 0; i < rand()%5000 + 5000; ++i) 300378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com UpperBoundTester(test_case, rand()); 301378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com } 302378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com 303378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com static const int kNumberTestCases = 4; 304378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com StdMap std_map[kNumberTestCases]; 305378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com TestMap test_map[kNumberTestCases]; 306378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com TestMap::const_iterator iter_test; 307378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com StdMap::const_iterator iter_std; 308378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com char* map_data[kNumberTestCases]; 309378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com unsigned int size[kNumberTestCases]; 310378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com unsigned int correct_size[kNumberTestCases]; 311378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com SimpleMapSerializer<KeyType, ValueType> serializer; 312378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com}; 313378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com 314378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.comTEST_F(TestValidMap, TestEmptyMap) { 315378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com int test_case = 0; 316378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com // Assert memory size allocated during serialization is correct. 31741f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com ASSERT_EQ(correct_size[test_case], size[test_case]); 318378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com 319378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com // Sanity check of serialized data: 320378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com ASSERT_TRUE(test_map[test_case].ValidateInMemoryStructure()); 321378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com ASSERT_EQ(std_map[test_case].empty(), test_map[test_case].empty()); 322378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com ASSERT_EQ(std_map[test_case].size(), test_map[test_case].size()); 323378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com 324378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com // Test Iterator. 325378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com IteratorTester(test_case); 326378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com 327378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com // Test lookup operations. 328378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com LookupTester(test_case); 329378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com} 330378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com 331378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.comTEST_F(TestValidMap, TestSingleElement) { 332378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com int test_case = 1; 333378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com // Assert memory size allocated during serialization is correct. 334378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com ASSERT_EQ(correct_size[test_case], size[test_case]); 335378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com 336378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com // Sanity check of serialized data: 337378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com ASSERT_TRUE(test_map[test_case].ValidateInMemoryStructure()); 338378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com ASSERT_EQ(std_map[test_case].empty(), test_map[test_case].empty()); 339378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com ASSERT_EQ(std_map[test_case].size(), test_map[test_case].size()); 340378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com 341378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com // Test Iterator. 342378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com IteratorTester(test_case); 343378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com 344378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com // Test lookup operations. 345378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com LookupTester(test_case); 346378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com} 347378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com 348378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.comTEST_F(TestValidMap, Test100Elements) { 349378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com int test_case = 2; 350378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com // Assert memory size allocated during serialization is correct. 351378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com ASSERT_EQ(correct_size[test_case], size[test_case]); 352378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com 353378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com // Sanity check of serialized data: 354378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com ASSERT_TRUE(test_map[test_case].ValidateInMemoryStructure()); 355378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com ASSERT_EQ(std_map[test_case].empty(), test_map[test_case].empty()); 356378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com ASSERT_EQ(std_map[test_case].size(), test_map[test_case].size()); 357378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com 358378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com // Test Iterator. 359378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com IteratorTester(test_case); 360378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com 361378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com // Test lookup operations. 362378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com LookupTester(test_case); 363378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com} 364378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com 365378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.comTEST_F(TestValidMap, Test1000RandomElements) { 366378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com int test_case = 3; 367378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com // Assert memory size allocated during serialization is correct. 36841f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com ASSERT_EQ(correct_size[test_case], size[test_case]); 369378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com 370378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com // Sanity check of serialized data: 371378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com ASSERT_TRUE(test_map[test_case].ValidateInMemoryStructure()); 372378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com ASSERT_EQ(std_map[test_case].empty(), test_map[test_case].empty()); 373378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com ASSERT_EQ(std_map[test_case].size(), test_map[test_case].size()); 374378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com 375378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com // Test Iterator. 376378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com IteratorTester(test_case); 377378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com 378378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com // Test lookup operations. 379378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com LookupTester(test_case); 380378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com} 381378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com 382378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.comint main(int argc, char *argv[]) { 383378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com ::testing::InitGoogleTest(&argc, argv); 384378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com 385378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com return RUN_ALL_TESTS(); 386378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com} 387