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