Chromium Code Reviews| OLD | NEW |
|---|---|
| (Empty) | |
| 1 // Copyright 2014 The Crashpad Authors. All rights reserved. | |
| 2 // | |
| 3 // Licensed under the Apache License, Version 2.0 (the "License"); | |
| 4 // you may not use this file except in compliance with the License. | |
| 5 // You may obtain a copy of the License at | |
| 6 // | |
| 7 // http://www.apache.org/licenses/LICENSE-2.0 | |
| 8 // | |
| 9 // Unless required by applicable law or agreed to in writing, software | |
| 10 // distributed under the License is distributed on an "AS IS" BASIS, | |
| 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| 12 // See the License for the specific language governing permissions and | |
| 13 // limitations under the License. | |
| 14 | |
| 15 #include "minidump/minidump_thread_id_map.h" | |
| 16 | |
| 17 #include <vector> | |
| 18 | |
| 19 #include "base/basictypes.h" | |
| 20 #include "gtest/gtest.h" | |
| 21 #include "snapshot/test/test_thread_snapshot.h" | |
| 22 | |
| 23 namespace crashpad { | |
| 24 namespace test { | |
| 25 namespace { | |
| 26 | |
| 27 bool MapHasKeyValue( | |
| 28 const MinidumpThreadIDMap* map, uint64_t key, uint32_t expected_value) { | |
| 29 auto iterator = map->find(key); | |
| 30 if (iterator == map->end()) { | |
| 31 EXPECT_NE(map->end(), iterator); | |
| 32 return false; | |
| 33 } | |
| 34 if (iterator->second != expected_value) { | |
| 35 EXPECT_EQ(expected_value, iterator->second); | |
| 36 return false; | |
| 37 } | |
| 38 return true; | |
| 39 } | |
| 40 | |
| 41 TEST(MinidumpThreadIDMap, MinidumpThreadIDMap) { | |
| 42 std::vector<const ThreadSnapshot*> thread_snapshots; | |
| 43 | |
| 44 MinidumpThreadIDMap thread_id_map; | |
| 45 | |
| 46 // No threads to map. | |
| 47 BuildMinidumpThreadIDMap(thread_snapshots, &thread_id_map); | |
| 48 | |
| 49 EXPECT_TRUE(thread_id_map.empty()); | |
| 50 | |
| 51 TestThreadSnapshot test_thread_snapshots[5] = {}; | |
| 52 | |
| 53 for (size_t index = 0; index < arraysize(test_thread_snapshots); ++index) { | |
| 54 thread_snapshots.push_back(&test_thread_snapshots[index]); | |
| 55 } | |
| 56 | |
|
Robert Sesek
2014/11/04 15:34:58
Everything above this line could go in SetUp()
| |
| 57 // A simple mapping. | |
|
Robert Sesek
2014/11/04 15:34:58
…and then each of these could be a TEST().
| |
| 58 test_thread_snapshots[0].SetThreadID(1); | |
| 59 test_thread_snapshots[1].SetThreadID(3); | |
| 60 test_thread_snapshots[2].SetThreadID(5); | |
| 61 test_thread_snapshots[3].SetThreadID(7); | |
| 62 test_thread_snapshots[4].SetThreadID(9); | |
| 63 | |
| 64 thread_id_map.clear(); | |
| 65 BuildMinidumpThreadIDMap(thread_snapshots, &thread_id_map); | |
| 66 | |
| 67 EXPECT_EQ(5u, thread_id_map.size()); | |
| 68 EXPECT_PRED3(MapHasKeyValue, &thread_id_map, 1, 1); | |
| 69 EXPECT_PRED3(MapHasKeyValue, &thread_id_map, 3, 3); | |
| 70 EXPECT_PRED3(MapHasKeyValue, &thread_id_map, 5, 5); | |
| 71 EXPECT_PRED3(MapHasKeyValue, &thread_id_map, 7, 7); | |
| 72 EXPECT_PRED3(MapHasKeyValue, &thread_id_map, 9, 9); | |
| 73 | |
| 74 // A mapping with some truncation. | |
| 75 test_thread_snapshots[0].SetThreadID(0x0000000000000000); | |
| 76 test_thread_snapshots[1].SetThreadID(0x9999999900000001); | |
| 77 test_thread_snapshots[2].SetThreadID(0x9999999980000001); | |
| 78 test_thread_snapshots[3].SetThreadID(0x99999999fffffffe); | |
| 79 test_thread_snapshots[4].SetThreadID(0x99999999ffffffff); | |
| 80 | |
| 81 thread_id_map.clear(); | |
| 82 BuildMinidumpThreadIDMap(thread_snapshots, &thread_id_map); | |
| 83 | |
| 84 EXPECT_EQ(5u, thread_id_map.size()); | |
| 85 EXPECT_PRED3(MapHasKeyValue, &thread_id_map, 0x0000000000000000, 0x00000000); | |
| 86 EXPECT_PRED3(MapHasKeyValue, &thread_id_map, 0x9999999900000001, 0x00000001); | |
| 87 EXPECT_PRED3(MapHasKeyValue, &thread_id_map, 0x9999999980000001, 0x80000001); | |
| 88 EXPECT_PRED3(MapHasKeyValue, &thread_id_map, 0x99999999fffffffe, 0xfffffffe); | |
| 89 EXPECT_PRED3(MapHasKeyValue, &thread_id_map, 0x99999999ffffffff, 0xffffffff); | |
| 90 | |
| 91 // A mapping where thread IDs are duplicated. | |
| 92 test_thread_snapshots[0].SetThreadID(2); | |
| 93 test_thread_snapshots[1].SetThreadID(4); | |
| 94 test_thread_snapshots[2].SetThreadID(4); | |
| 95 test_thread_snapshots[3].SetThreadID(6); | |
| 96 test_thread_snapshots[4].SetThreadID(8); | |
| 97 | |
| 98 thread_id_map.clear(); | |
| 99 BuildMinidumpThreadIDMap(thread_snapshots, &thread_id_map); | |
| 100 | |
| 101 EXPECT_EQ(4u, thread_id_map.size()); | |
| 102 EXPECT_PRED3(MapHasKeyValue, &thread_id_map, 2, 2); | |
| 103 EXPECT_PRED3(MapHasKeyValue, &thread_id_map, 4, 4); | |
| 104 EXPECT_PRED3(MapHasKeyValue, &thread_id_map, 6, 6); | |
| 105 EXPECT_PRED3(MapHasKeyValue, &thread_id_map, 8, 8); | |
| 106 | |
| 107 // A mapping with a collision. | |
| 108 test_thread_snapshots[0].SetThreadID(0x0000000000000010); | |
| 109 test_thread_snapshots[1].SetThreadID(0x0000000000000020); | |
| 110 test_thread_snapshots[2].SetThreadID(0x0000000000000030); | |
| 111 test_thread_snapshots[3].SetThreadID(0x0000000000000040); | |
| 112 test_thread_snapshots[4].SetThreadID(0x0000000100000010); | |
| 113 | |
| 114 thread_id_map.clear(); | |
| 115 BuildMinidumpThreadIDMap(thread_snapshots, &thread_id_map); | |
| 116 | |
| 117 EXPECT_EQ(5u, thread_id_map.size()); | |
| 118 EXPECT_PRED3(MapHasKeyValue, &thread_id_map, 0x0000000000000010, 0); | |
| 119 EXPECT_PRED3(MapHasKeyValue, &thread_id_map, 0x0000000000000020, 1); | |
| 120 EXPECT_PRED3(MapHasKeyValue, &thread_id_map, 0x0000000000000030, 2); | |
| 121 EXPECT_PRED3(MapHasKeyValue, &thread_id_map, 0x0000000000000040, 3); | |
| 122 EXPECT_PRED3(MapHasKeyValue, &thread_id_map, 0x0000000100000010, 4); | |
| 123 | |
| 124 // A mapping with a collision and a duplicate thread ID. | |
| 125 test_thread_snapshots[0].SetThreadID(0x0000000100000010); | |
| 126 test_thread_snapshots[1].SetThreadID(0x0000000000000010); | |
| 127 test_thread_snapshots[2].SetThreadID(0x0000000000000020); | |
| 128 test_thread_snapshots[3].SetThreadID(0x0000000000000030); | |
| 129 test_thread_snapshots[4].SetThreadID(0x0000000000000020); | |
| 130 | |
| 131 thread_id_map.clear(); | |
| 132 BuildMinidumpThreadIDMap(thread_snapshots, &thread_id_map); | |
| 133 | |
| 134 EXPECT_EQ(4u, thread_id_map.size()); | |
| 135 EXPECT_PRED3(MapHasKeyValue, &thread_id_map, 0x0000000100000010, 0); | |
| 136 EXPECT_PRED3(MapHasKeyValue, &thread_id_map, 0x0000000000000010, 1); | |
| 137 EXPECT_PRED3(MapHasKeyValue, &thread_id_map, 0x0000000000000020, 2); | |
| 138 EXPECT_PRED3(MapHasKeyValue, &thread_id_map, 0x0000000000000030, 3); | |
| 139 | |
| 140 // A mapping with nothing but duplicates. | |
| 141 test_thread_snapshots[0].SetThreadID(6); | |
| 142 test_thread_snapshots[1].SetThreadID(6); | |
| 143 test_thread_snapshots[2].SetThreadID(6); | |
| 144 test_thread_snapshots[3].SetThreadID(6); | |
| 145 test_thread_snapshots[4].SetThreadID(6); | |
| 146 | |
| 147 thread_id_map.clear(); | |
| 148 BuildMinidumpThreadIDMap(thread_snapshots, &thread_id_map); | |
| 149 | |
| 150 EXPECT_EQ(1u, thread_id_map.size()); | |
| 151 EXPECT_PRED3(MapHasKeyValue, &thread_id_map, 6, 6); | |
| 152 } | |
| 153 | |
| 154 } // namespace | |
| 155 } // namespace test | |
| 156 } // namespace crashpad | |
| OLD | NEW |