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_crashpad_module_writer.h" |
| 16 |
| 17 #include <dbghelp.h> |
| 18 |
| 19 #include "gtest/gtest.h" |
| 20 #include "minidump/minidump_extensions.h" |
| 21 #include "minidump/minidump_simple_string_dictionary_writer.h" |
| 22 #include "minidump/test/minidump_file_writer_test_util.h" |
| 23 #include "minidump/test/minidump_string_writer_test_util.h" |
| 24 #include "minidump/test/minidump_writable_test_util.h" |
| 25 #include "util/file/string_file_writer.h" |
| 26 |
| 27 namespace crashpad { |
| 28 namespace test { |
| 29 namespace { |
| 30 |
| 31 const MinidumpCrashpadModuleList* MinidumpCrashpadModuleListAtStart( |
| 32 const std::string& file_contents, |
| 33 size_t count) { |
| 34 MINIDUMP_LOCATION_DESCRIPTOR location_descriptor; |
| 35 location_descriptor.DataSize = sizeof(MinidumpCrashpadModuleList) + |
| 36 count * sizeof(MINIDUMP_LOCATION_DESCRIPTOR); |
| 37 location_descriptor.Rva = 0; |
| 38 return MinidumpWritableAtLocationDescriptor<MinidumpCrashpadModuleList>( |
| 39 file_contents, location_descriptor); |
| 40 } |
| 41 |
| 42 TEST(MinidumpCrashpadModuleWriter, EmptyList) { |
| 43 StringFileWriter file_writer; |
| 44 |
| 45 MinidumpCrashpadModuleListWriter crashpad_module_list_writer; |
| 46 |
| 47 EXPECT_TRUE(crashpad_module_list_writer.WriteEverything(&file_writer)); |
| 48 ASSERT_EQ(sizeof(MinidumpCrashpadModuleList), file_writer.string().size()); |
| 49 |
| 50 const MinidumpCrashpadModuleList* crashpad_module_list = |
| 51 MinidumpCrashpadModuleListAtStart(file_writer.string(), 0); |
| 52 ASSERT_TRUE(crashpad_module_list); |
| 53 |
| 54 EXPECT_EQ(0u, crashpad_module_list->count); |
| 55 } |
| 56 |
| 57 TEST(MinidumpCrashpadModuleWriter, EmptyModule) { |
| 58 StringFileWriter file_writer; |
| 59 |
| 60 MinidumpCrashpadModuleListWriter crashpad_module_list_writer; |
| 61 MinidumpCrashpadModuleWriter crashpad_module_writer; |
| 62 crashpad_module_list_writer.AddCrashpadModule(&crashpad_module_writer); |
| 63 |
| 64 EXPECT_TRUE(crashpad_module_list_writer.WriteEverything(&file_writer)); |
| 65 ASSERT_EQ(sizeof(MinidumpCrashpadModuleList) + |
| 66 sizeof(MINIDUMP_LOCATION_DESCRIPTOR) + |
| 67 sizeof(MinidumpCrashpadModule), |
| 68 file_writer.string().size()); |
| 69 |
| 70 const MinidumpCrashpadModuleList* crashpad_module_list = |
| 71 MinidumpCrashpadModuleListAtStart(file_writer.string(), 1); |
| 72 ASSERT_TRUE(crashpad_module_list); |
| 73 |
| 74 ASSERT_EQ(1u, crashpad_module_list->count); |
| 75 |
| 76 const MinidumpCrashpadModule* crashpad_module = |
| 77 MinidumpWritableAtLocationDescriptor<MinidumpCrashpadModule>( |
| 78 file_writer.string(), crashpad_module_list->crashpad_modules[0]); |
| 79 ASSERT_TRUE(crashpad_module); |
| 80 |
| 81 EXPECT_EQ(MinidumpCrashpadModule::kVersion, crashpad_module->version); |
| 82 EXPECT_EQ(0u, crashpad_module->minidump_module_list_index); |
| 83 EXPECT_EQ(0u, crashpad_module->simple_annotations.DataSize); |
| 84 EXPECT_EQ(0u, crashpad_module->simple_annotations.Rva); |
| 85 } |
| 86 |
| 87 TEST(MinidumpCrashpadModuleWriter, FullModule) { |
| 88 const uint32_t kMinidumpModuleListIndex = 1; |
| 89 const char kKey[] = "key"; |
| 90 const char kValue[] = "value"; |
| 91 |
| 92 StringFileWriter file_writer; |
| 93 |
| 94 MinidumpCrashpadModuleListWriter crashpad_module_list_writer; |
| 95 |
| 96 MinidumpCrashpadModuleWriter crashpad_module_writer; |
| 97 crashpad_module_writer.SetMinidumpModuleListIndex(kMinidumpModuleListIndex); |
| 98 MinidumpSimpleStringDictionaryWriter simple_string_dictionary_writer; |
| 99 MinidumpSimpleStringDictionaryEntryWriter |
| 100 simple_string_dictionary_entry_writer; |
| 101 simple_string_dictionary_entry_writer.SetKeyValue(kKey, kValue); |
| 102 simple_string_dictionary_writer.AddEntry( |
| 103 &simple_string_dictionary_entry_writer); |
| 104 crashpad_module_writer.SetSimpleAnnotations(&simple_string_dictionary_writer); |
| 105 crashpad_module_list_writer.AddCrashpadModule(&crashpad_module_writer); |
| 106 |
| 107 EXPECT_TRUE(crashpad_module_list_writer.WriteEverything(&file_writer)); |
| 108 ASSERT_EQ(sizeof(MinidumpCrashpadModuleList) + |
| 109 sizeof(MINIDUMP_LOCATION_DESCRIPTOR) + |
| 110 sizeof(MinidumpCrashpadModule) + |
| 111 sizeof(MinidumpSimpleStringDictionary) + |
| 112 sizeof(MinidumpSimpleStringDictionaryEntry) + |
| 113 sizeof(MinidumpUTF8String) + arraysize(kKey) + |
| 114 sizeof(MinidumpUTF8String) + arraysize(kValue), |
| 115 file_writer.string().size()); |
| 116 |
| 117 const MinidumpCrashpadModuleList* crashpad_module_list = |
| 118 MinidumpCrashpadModuleListAtStart(file_writer.string(), 1); |
| 119 ASSERT_TRUE(crashpad_module_list); |
| 120 |
| 121 ASSERT_EQ(1u, crashpad_module_list->count); |
| 122 |
| 123 const MinidumpCrashpadModule* crashpad_module = |
| 124 MinidumpWritableAtLocationDescriptor<MinidumpCrashpadModule>( |
| 125 file_writer.string(), crashpad_module_list->crashpad_modules[0]); |
| 126 ASSERT_TRUE(crashpad_module); |
| 127 |
| 128 EXPECT_EQ(MinidumpCrashpadModule::kVersion, crashpad_module->version); |
| 129 EXPECT_EQ(kMinidumpModuleListIndex, |
| 130 crashpad_module->minidump_module_list_index); |
| 131 EXPECT_NE(0u, crashpad_module->simple_annotations.DataSize); |
| 132 EXPECT_NE(0u, crashpad_module->simple_annotations.Rva); |
| 133 |
| 134 const MinidumpSimpleStringDictionary* simple_annotations = |
| 135 MinidumpWritableAtLocationDescriptor<MinidumpSimpleStringDictionary>( |
| 136 file_writer.string(), crashpad_module->simple_annotations); |
| 137 ASSERT_TRUE(simple_annotations); |
| 138 |
| 139 ASSERT_EQ(1u, simple_annotations->count); |
| 140 EXPECT_EQ(kKey, |
| 141 MinidumpUTF8StringAtRVAAsString( |
| 142 file_writer.string(), simple_annotations->entries[0].key)); |
| 143 EXPECT_EQ(kValue, |
| 144 MinidumpUTF8StringAtRVAAsString( |
| 145 file_writer.string(), simple_annotations->entries[0].value)); |
| 146 } |
| 147 |
| 148 TEST(MinidumpCrashpadModuleWriter, ThreeModules) { |
| 149 const uint32_t kMinidumpModuleListIndex0 = 0; |
| 150 const char kKey0[] = "key"; |
| 151 const char kValue0[] = "value"; |
| 152 const uint32_t kMinidumpModuleListIndex1 = 2; |
| 153 const uint32_t kMinidumpModuleListIndex2 = 5; |
| 154 const char kKey2A[] = "K"; |
| 155 const char kValue2A[] = "VVV"; |
| 156 const char kKey2B[] = "river"; |
| 157 const char kValue2B[] = "hudson"; |
| 158 |
| 159 StringFileWriter file_writer; |
| 160 |
| 161 MinidumpCrashpadModuleListWriter crashpad_module_list_writer; |
| 162 |
| 163 MinidumpCrashpadModuleWriter crashpad_module_writer_0; |
| 164 crashpad_module_writer_0.SetMinidumpModuleListIndex( |
| 165 kMinidumpModuleListIndex0); |
| 166 MinidumpSimpleStringDictionaryWriter simple_string_dictionary_writer_0; |
| 167 MinidumpSimpleStringDictionaryEntryWriter |
| 168 simple_string_dictionary_entry_writer_0; |
| 169 simple_string_dictionary_entry_writer_0.SetKeyValue(kKey0, kValue0); |
| 170 simple_string_dictionary_writer_0.AddEntry( |
| 171 &simple_string_dictionary_entry_writer_0); |
| 172 crashpad_module_writer_0.SetSimpleAnnotations( |
| 173 &simple_string_dictionary_writer_0); |
| 174 crashpad_module_list_writer.AddCrashpadModule(&crashpad_module_writer_0); |
| 175 |
| 176 MinidumpCrashpadModuleWriter crashpad_module_writer_1; |
| 177 crashpad_module_writer_1.SetMinidumpModuleListIndex( |
| 178 kMinidumpModuleListIndex1); |
| 179 crashpad_module_list_writer.AddCrashpadModule(&crashpad_module_writer_1); |
| 180 |
| 181 MinidumpCrashpadModuleWriter crashpad_module_writer_2; |
| 182 crashpad_module_writer_2.SetMinidumpModuleListIndex( |
| 183 kMinidumpModuleListIndex2); |
| 184 MinidumpSimpleStringDictionaryWriter simple_string_dictionary_writer_2; |
| 185 MinidumpSimpleStringDictionaryEntryWriter |
| 186 simple_string_dictionary_entry_writer_2a; |
| 187 simple_string_dictionary_entry_writer_2a.SetKeyValue(kKey2A, kValue2A); |
| 188 simple_string_dictionary_writer_2.AddEntry( |
| 189 &simple_string_dictionary_entry_writer_2a); |
| 190 MinidumpSimpleStringDictionaryEntryWriter |
| 191 simple_string_dictionary_entry_writer_2b; |
| 192 simple_string_dictionary_entry_writer_2b.SetKeyValue(kKey2B, kValue2B); |
| 193 simple_string_dictionary_writer_2.AddEntry( |
| 194 &simple_string_dictionary_entry_writer_2b); |
| 195 crashpad_module_writer_2.SetSimpleAnnotations( |
| 196 &simple_string_dictionary_writer_2); |
| 197 crashpad_module_list_writer.AddCrashpadModule(&crashpad_module_writer_2); |
| 198 |
| 199 EXPECT_TRUE(crashpad_module_list_writer.WriteEverything(&file_writer)); |
| 200 |
| 201 const MinidumpCrashpadModuleList* crashpad_module_list = |
| 202 MinidumpCrashpadModuleListAtStart(file_writer.string(), 3); |
| 203 ASSERT_TRUE(crashpad_module_list); |
| 204 |
| 205 ASSERT_EQ(3u, crashpad_module_list->count); |
| 206 |
| 207 const MinidumpCrashpadModule* crashpad_module_0 = |
| 208 MinidumpWritableAtLocationDescriptor<MinidumpCrashpadModule>( |
| 209 file_writer.string(), crashpad_module_list->crashpad_modules[0]); |
| 210 ASSERT_TRUE(crashpad_module_0); |
| 211 |
| 212 EXPECT_EQ(MinidumpCrashpadModule::kVersion, crashpad_module_0->version); |
| 213 EXPECT_EQ(kMinidumpModuleListIndex0, |
| 214 crashpad_module_0->minidump_module_list_index); |
| 215 |
| 216 const MinidumpSimpleStringDictionary* simple_annotations_0 = |
| 217 MinidumpWritableAtLocationDescriptor<MinidumpSimpleStringDictionary>( |
| 218 file_writer.string(), crashpad_module_0->simple_annotations); |
| 219 ASSERT_TRUE(simple_annotations_0); |
| 220 |
| 221 ASSERT_EQ(1u, simple_annotations_0->count); |
| 222 EXPECT_EQ(kKey0, |
| 223 MinidumpUTF8StringAtRVAAsString( |
| 224 file_writer.string(), simple_annotations_0->entries[0].key)); |
| 225 EXPECT_EQ(kValue0, |
| 226 MinidumpUTF8StringAtRVAAsString( |
| 227 file_writer.string(), simple_annotations_0->entries[0].value)); |
| 228 |
| 229 const MinidumpCrashpadModule* crashpad_module_1 = |
| 230 MinidumpWritableAtLocationDescriptor<MinidumpCrashpadModule>( |
| 231 file_writer.string(), crashpad_module_list->crashpad_modules[1]); |
| 232 ASSERT_TRUE(crashpad_module_1); |
| 233 |
| 234 EXPECT_EQ(MinidumpCrashpadModule::kVersion, crashpad_module_1->version); |
| 235 EXPECT_EQ(kMinidumpModuleListIndex1, |
| 236 crashpad_module_1->minidump_module_list_index); |
| 237 |
| 238 const MinidumpSimpleStringDictionary* simple_annotations_1 = |
| 239 MinidumpWritableAtLocationDescriptor<MinidumpSimpleStringDictionary>( |
| 240 file_writer.string(), crashpad_module_1->simple_annotations); |
| 241 EXPECT_FALSE(simple_annotations_1); |
| 242 |
| 243 const MinidumpCrashpadModule* crashpad_module_2 = |
| 244 MinidumpWritableAtLocationDescriptor<MinidumpCrashpadModule>( |
| 245 file_writer.string(), crashpad_module_list->crashpad_modules[2]); |
| 246 ASSERT_TRUE(crashpad_module_2); |
| 247 |
| 248 EXPECT_EQ(MinidumpCrashpadModule::kVersion, crashpad_module_2->version); |
| 249 EXPECT_EQ(kMinidumpModuleListIndex2, |
| 250 crashpad_module_2->minidump_module_list_index); |
| 251 |
| 252 const MinidumpSimpleStringDictionary* simple_annotations_2 = |
| 253 MinidumpWritableAtLocationDescriptor<MinidumpSimpleStringDictionary>( |
| 254 file_writer.string(), crashpad_module_2->simple_annotations); |
| 255 ASSERT_TRUE(simple_annotations_2); |
| 256 |
| 257 ASSERT_EQ(2u, simple_annotations_2->count); |
| 258 EXPECT_EQ(kKey2A, |
| 259 MinidumpUTF8StringAtRVAAsString( |
| 260 file_writer.string(), simple_annotations_2->entries[0].key)); |
| 261 EXPECT_EQ(kValue2A, |
| 262 MinidumpUTF8StringAtRVAAsString( |
| 263 file_writer.string(), simple_annotations_2->entries[0].value)); |
| 264 EXPECT_EQ(kKey2B, |
| 265 MinidumpUTF8StringAtRVAAsString( |
| 266 file_writer.string(), simple_annotations_2->entries[1].key)); |
| 267 EXPECT_EQ(kValue2B, |
| 268 MinidumpUTF8StringAtRVAAsString( |
| 269 file_writer.string(), simple_annotations_2->entries[1].value)); |
| 270 } |
| 271 |
| 272 } // namespace |
| 273 } // namespace test |
| 274 } // namespace crashpad |
OLD | NEW |