| 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_system_info_writer.h" | 
|  | 16 | 
|  | 17 #include <dbghelp.h> | 
|  | 18 #include <string.h> | 
|  | 19 | 
|  | 20 #include <string> | 
|  | 21 | 
|  | 22 #include "gtest/gtest.h" | 
|  | 23 #include "minidump/minidump_file_writer.h" | 
|  | 24 #include "util/file/string_file_writer.h" | 
|  | 25 | 
|  | 26 namespace { | 
|  | 27 | 
|  | 28 using namespace crashpad; | 
|  | 29 | 
|  | 30 void GetSystemInfoStream(const std::string& file_contents, | 
|  | 31                          size_t csd_version_length, | 
|  | 32                          const MINIDUMP_SYSTEM_INFO** system_info, | 
|  | 33                          const MINIDUMP_STRING** csd_version) { | 
|  | 34   // The expected number of bytes for the CSD version’s MINIDUMP_STRING::Buffer. | 
|  | 35   const size_t kCSDVersionBytes = | 
|  | 36       csd_version_length * sizeof(MINIDUMP_STRING::Buffer[0]); | 
|  | 37   const size_t kCSDVersionBytesWithNUL = | 
|  | 38       kCSDVersionBytes + sizeof(MINIDUMP_STRING::Buffer[0]); | 
|  | 39 | 
|  | 40   const size_t kDirectoryOffset = sizeof(MINIDUMP_HEADER); | 
|  | 41   const size_t kSystemInfoStreamOffset = | 
|  | 42       kDirectoryOffset + sizeof(MINIDUMP_DIRECTORY); | 
|  | 43   const size_t kCSDVersionOffset = | 
|  | 44       kSystemInfoStreamOffset + sizeof(MINIDUMP_SYSTEM_INFO); | 
|  | 45   const size_t kFileSize = | 
|  | 46       kCSDVersionOffset + sizeof(MINIDUMP_STRING) + kCSDVersionBytesWithNUL; | 
|  | 47 | 
|  | 48   ASSERT_EQ(kFileSize, file_contents.size()); | 
|  | 49 | 
|  | 50   const MINIDUMP_HEADER* header = | 
|  | 51       reinterpret_cast<const MINIDUMP_HEADER*>(&file_contents[0]); | 
|  | 52 | 
|  | 53   EXPECT_EQ(static_cast<uint32_t>(MINIDUMP_SIGNATURE), header->Signature); | 
|  | 54   EXPECT_EQ(static_cast<uint32_t>(MINIDUMP_VERSION), header->Version); | 
|  | 55   ASSERT_EQ(1u, header->NumberOfStreams); | 
|  | 56   ASSERT_EQ(kDirectoryOffset, header->StreamDirectoryRva); | 
|  | 57   EXPECT_EQ(0u, header->CheckSum); | 
|  | 58   EXPECT_EQ(0u, header->TimeDateStamp); | 
|  | 59   EXPECT_EQ(MiniDumpNormal, header->Flags); | 
|  | 60 | 
|  | 61   const MINIDUMP_DIRECTORY* directory = | 
|  | 62       reinterpret_cast<const MINIDUMP_DIRECTORY*>( | 
|  | 63           &file_contents[kDirectoryOffset]); | 
|  | 64 | 
|  | 65   ASSERT_EQ(kMinidumpStreamTypeSystemInfo, directory->StreamType); | 
|  | 66   ASSERT_EQ(sizeof(MINIDUMP_SYSTEM_INFO), directory->Location.DataSize); | 
|  | 67   ASSERT_EQ(kSystemInfoStreamOffset, directory->Location.Rva); | 
|  | 68 | 
|  | 69   *system_info = reinterpret_cast<const MINIDUMP_SYSTEM_INFO*>( | 
|  | 70       &file_contents[kSystemInfoStreamOffset]); | 
|  | 71 | 
|  | 72   ASSERT_EQ(kCSDVersionOffset, (*system_info)->CSDVersionRva); | 
|  | 73 | 
|  | 74   *csd_version = reinterpret_cast<const MINIDUMP_STRING*>( | 
|  | 75       &file_contents[kCSDVersionOffset]); | 
|  | 76 | 
|  | 77   ASSERT_EQ(kCSDVersionBytes, (*csd_version)->Length); | 
|  | 78 } | 
|  | 79 | 
|  | 80 TEST(MinidumpSystemInfoWriter, Empty) { | 
|  | 81   MinidumpFileWriter minidump_file_writer; | 
|  | 82   MinidumpSystemInfoWriter system_info_writer; | 
|  | 83 | 
|  | 84   system_info_writer.SetCSDVersion(std::string()); | 
|  | 85 | 
|  | 86   minidump_file_writer.AddStream(&system_info_writer); | 
|  | 87 | 
|  | 88   StringFileWriter file_writer; | 
|  | 89   ASSERT_TRUE(minidump_file_writer.WriteEverything(&file_writer)); | 
|  | 90 | 
|  | 91   const MINIDUMP_SYSTEM_INFO* system_info; | 
|  | 92   const MINIDUMP_STRING* csd_version; | 
|  | 93 | 
|  | 94   GetSystemInfoStream(file_writer.string(), 0, &system_info, &csd_version); | 
|  | 95 | 
|  | 96   EXPECT_EQ(kMinidumpCPUArchitectureUnknown, | 
|  | 97             system_info->ProcessorArchitecture); | 
|  | 98   EXPECT_EQ(0u, system_info->ProcessorLevel); | 
|  | 99   EXPECT_EQ(0u, system_info->ProcessorRevision); | 
|  | 100   EXPECT_EQ(0u, system_info->NumberOfProcessors); | 
|  | 101   EXPECT_EQ(0u, system_info->ProductType); | 
|  | 102   EXPECT_EQ(0u, system_info->MajorVersion); | 
|  | 103   EXPECT_EQ(0u, system_info->MinorVersion); | 
|  | 104   EXPECT_EQ(0u, system_info->BuildNumber); | 
|  | 105   EXPECT_EQ(0u, system_info->PlatformId); | 
|  | 106   EXPECT_EQ(0u, system_info->SuiteMask); | 
|  | 107   EXPECT_EQ(0u, system_info->Cpu.X86CpuInfo.VendorId[0]); | 
|  | 108   EXPECT_EQ(0u, system_info->Cpu.X86CpuInfo.VendorId[1]); | 
|  | 109   EXPECT_EQ(0u, system_info->Cpu.X86CpuInfo.VendorId[2]); | 
|  | 110   EXPECT_EQ(0u, system_info->Cpu.X86CpuInfo.VersionInformation); | 
|  | 111   EXPECT_EQ(0u, system_info->Cpu.X86CpuInfo.FeatureInformation); | 
|  | 112   EXPECT_EQ(0u, system_info->Cpu.X86CpuInfo.AMDExtendedCpuFeatures); | 
|  | 113   EXPECT_EQ(0u, system_info->Cpu.OtherCpuInfo.ProcessorFeatures[0]); | 
|  | 114   EXPECT_EQ(0u, system_info->Cpu.OtherCpuInfo.ProcessorFeatures[1]); | 
|  | 115 | 
|  | 116   EXPECT_EQ('\0', csd_version->Buffer[0]); | 
|  | 117 } | 
|  | 118 | 
|  | 119 TEST(MinidumpSystemInfoWriter, X86_Win) { | 
|  | 120   MinidumpFileWriter minidump_file_writer; | 
|  | 121   MinidumpSystemInfoWriter system_info_writer; | 
|  | 122 | 
|  | 123   const MinidumpCPUArchitecture kCPUArchitecture = kMinidumpCPUArchitectureX86; | 
|  | 124   const uint16_t kCPULevel = 0x0010; | 
|  | 125   const uint16_t kCPURevision = 0x0602; | 
|  | 126   const uint8_t kCPUCount = 1; | 
|  | 127   const MinidumpOS kOS = kMinidumpOSWin32NT; | 
|  | 128   const MinidumpOSType kOSType = kMinidumpOSTypeWorkstation; | 
|  | 129   const uint32_t kOSVersionMajor = 6; | 
|  | 130   const uint32_t kOSVersionMinor = 1; | 
|  | 131   const uint32_t kOSVersionBuild = 7601; | 
|  | 132   const char kCSDVersion[] = "Service Pack 1"; | 
|  | 133   const uint16_t kSuiteMask = VER_SUITE_SINGLEUSERTS; | 
|  | 134   const char kCPUVendor[] = "AuthenticAMD"; | 
|  | 135   const uint32_t kCPUVersion = 0x00100f62; | 
|  | 136   const uint32_t kCPUFeatures = 0x078bfbff; | 
|  | 137   const uint32_t kAMDFeatures = 0xefd3fbff; | 
|  | 138 | 
|  | 139   uint32_t cpu_vendor_registers[3]; | 
|  | 140   ASSERT_EQ(sizeof(cpu_vendor_registers), strlen(kCPUVendor)); | 
|  | 141   memcpy(cpu_vendor_registers, kCPUVendor, sizeof(cpu_vendor_registers)); | 
|  | 142 | 
|  | 143   system_info_writer.SetCPUArchitecture(kCPUArchitecture); | 
|  | 144   system_info_writer.SetCPULevelAndRevision(kCPULevel, kCPURevision); | 
|  | 145   system_info_writer.SetCPUCount(kCPUCount); | 
|  | 146   system_info_writer.SetOS(kOS); | 
|  | 147   system_info_writer.SetOSType(kMinidumpOSTypeWorkstation); | 
|  | 148   system_info_writer.SetOSVersion( | 
|  | 149       kOSVersionMajor, kOSVersionMinor, kOSVersionBuild); | 
|  | 150   system_info_writer.SetCSDVersion(kCSDVersion); | 
|  | 151   system_info_writer.SetSuiteMask(kSuiteMask); | 
|  | 152   system_info_writer.SetCPUX86VendorString(kCPUVendor); | 
|  | 153   system_info_writer.SetCPUX86VersionAndFeatures(kCPUVersion, kCPUFeatures); | 
|  | 154   system_info_writer.SetCPUX86AMDExtendedFeatures(kAMDFeatures); | 
|  | 155 | 
|  | 156   minidump_file_writer.AddStream(&system_info_writer); | 
|  | 157 | 
|  | 158   StringFileWriter file_writer; | 
|  | 159   ASSERT_TRUE(minidump_file_writer.WriteEverything(&file_writer)); | 
|  | 160 | 
|  | 161   const MINIDUMP_SYSTEM_INFO* system_info; | 
|  | 162   const MINIDUMP_STRING* csd_version; | 
|  | 163 | 
|  | 164   GetSystemInfoStream( | 
|  | 165       file_writer.string(), strlen(kCSDVersion), &system_info, &csd_version); | 
|  | 166 | 
|  | 167   EXPECT_EQ(kCPUArchitecture, system_info->ProcessorArchitecture); | 
|  | 168   EXPECT_EQ(kCPULevel, system_info->ProcessorLevel); | 
|  | 169   EXPECT_EQ(kCPURevision, system_info->ProcessorRevision); | 
|  | 170   EXPECT_EQ(kCPUCount, system_info->NumberOfProcessors); | 
|  | 171   EXPECT_EQ(kOSType, system_info->ProductType); | 
|  | 172   EXPECT_EQ(kOSVersionMajor, system_info->MajorVersion); | 
|  | 173   EXPECT_EQ(kOSVersionMinor, system_info->MinorVersion); | 
|  | 174   EXPECT_EQ(kOSVersionBuild, system_info->BuildNumber); | 
|  | 175   EXPECT_EQ(kOS, system_info->PlatformId); | 
|  | 176   EXPECT_EQ(kSuiteMask, system_info->SuiteMask); | 
|  | 177   EXPECT_EQ(cpu_vendor_registers[0], system_info->Cpu.X86CpuInfo.VendorId[0]); | 
|  | 178   EXPECT_EQ(cpu_vendor_registers[1], system_info->Cpu.X86CpuInfo.VendorId[1]); | 
|  | 179   EXPECT_EQ(cpu_vendor_registers[2], system_info->Cpu.X86CpuInfo.VendorId[2]); | 
|  | 180   EXPECT_EQ(kCPUVersion, system_info->Cpu.X86CpuInfo.VersionInformation); | 
|  | 181   EXPECT_EQ(kCPUFeatures, system_info->Cpu.X86CpuInfo.FeatureInformation); | 
|  | 182   EXPECT_EQ(kAMDFeatures, system_info->Cpu.X86CpuInfo.AMDExtendedCpuFeatures); | 
|  | 183 | 
|  | 184   for (size_t index = 0; index < strlen(kCSDVersion); ++index) { | 
|  | 185     EXPECT_EQ(kCSDVersion[index], csd_version->Buffer[index]) << index; | 
|  | 186   } | 
|  | 187 } | 
|  | 188 | 
|  | 189 TEST(MinidumpSystemInfoWriter, X86_64_Mac) { | 
|  | 190   MinidumpFileWriter minidump_file_writer; | 
|  | 191   MinidumpSystemInfoWriter system_info_writer; | 
|  | 192 | 
|  | 193   const MinidumpCPUArchitecture kCPUArchitecture = | 
|  | 194       kMinidumpCPUArchitectureAMD64; | 
|  | 195   const uint16_t kCPULevel = 0x0006; | 
|  | 196   const uint16_t kCPURevision = 0x3a09; | 
|  | 197   const uint8_t kCPUCount = 8; | 
|  | 198   const MinidumpOS kOS = kMinidumpOSMacOSX; | 
|  | 199   const MinidumpOSType kOSType = kMinidumpOSTypeWorkstation; | 
|  | 200   const uint32_t kOSVersionMajor = 10; | 
|  | 201   const uint32_t kOSVersionMinor = 9; | 
|  | 202   const uint32_t kOSVersionBuild = 4; | 
|  | 203   const char kCSDVersion[] = "13E28"; | 
|  | 204   const uint64_t kCPUFeatures[2] = {0x10427f4c, 0x00000000}; | 
|  | 205 | 
|  | 206   system_info_writer.SetCPUArchitecture(kCPUArchitecture); | 
|  | 207   system_info_writer.SetCPULevelAndRevision(kCPULevel, kCPURevision); | 
|  | 208   system_info_writer.SetCPUCount(kCPUCount); | 
|  | 209   system_info_writer.SetOS(kOS); | 
|  | 210   system_info_writer.SetOSType(kMinidumpOSTypeWorkstation); | 
|  | 211   system_info_writer.SetOSVersion( | 
|  | 212       kOSVersionMajor, kOSVersionMinor, kOSVersionBuild); | 
|  | 213   system_info_writer.SetCSDVersion(kCSDVersion); | 
|  | 214   system_info_writer.SetCPUOtherFeatures(kCPUFeatures[0], kCPUFeatures[1]); | 
|  | 215 | 
|  | 216   minidump_file_writer.AddStream(&system_info_writer); | 
|  | 217 | 
|  | 218   StringFileWriter file_writer; | 
|  | 219   ASSERT_TRUE(minidump_file_writer.WriteEverything(&file_writer)); | 
|  | 220 | 
|  | 221   const MINIDUMP_SYSTEM_INFO* system_info; | 
|  | 222   const MINIDUMP_STRING* csd_version; | 
|  | 223 | 
|  | 224   GetSystemInfoStream( | 
|  | 225       file_writer.string(), strlen(kCSDVersion), &system_info, &csd_version); | 
|  | 226 | 
|  | 227   EXPECT_EQ(kCPUArchitecture, system_info->ProcessorArchitecture); | 
|  | 228   EXPECT_EQ(kCPULevel, system_info->ProcessorLevel); | 
|  | 229   EXPECT_EQ(kCPURevision, system_info->ProcessorRevision); | 
|  | 230   EXPECT_EQ(kCPUCount, system_info->NumberOfProcessors); | 
|  | 231   EXPECT_EQ(kOSType, system_info->ProductType); | 
|  | 232   EXPECT_EQ(kOSVersionMajor, system_info->MajorVersion); | 
|  | 233   EXPECT_EQ(kOSVersionMinor, system_info->MinorVersion); | 
|  | 234   EXPECT_EQ(kOSVersionBuild, system_info->BuildNumber); | 
|  | 235   EXPECT_EQ(kOS, system_info->PlatformId); | 
|  | 236   EXPECT_EQ(0u, system_info->SuiteMask); | 
|  | 237   EXPECT_EQ(kCPUFeatures[0], | 
|  | 238             system_info->Cpu.OtherCpuInfo.ProcessorFeatures[0]); | 
|  | 239   EXPECT_EQ(kCPUFeatures[1], | 
|  | 240             system_info->Cpu.OtherCpuInfo.ProcessorFeatures[1]); | 
|  | 241 } | 
|  | 242 | 
|  | 243 TEST(MinidumpSystemInfoWriter, X86_CPUVendorFromRegisters) { | 
|  | 244   // MinidumpSystemInfoWriter.X86_Win already tested SetCPUX86VendorString(). | 
|  | 245   // This test exercises SetCPUX86Vendor() to set the vendor from register | 
|  | 246   // values. | 
|  | 247   MinidumpFileWriter minidump_file_writer; | 
|  | 248   MinidumpSystemInfoWriter system_info_writer; | 
|  | 249 | 
|  | 250   const MinidumpCPUArchitecture kCPUArchitecture = kMinidumpCPUArchitectureX86; | 
|  | 251   const uint32_t kCPUVendor[] = {'uneG', 'Ieni', 'letn'}; | 
|  | 252 | 
|  | 253   system_info_writer.SetCPUArchitecture(kCPUArchitecture); | 
|  | 254   system_info_writer.SetCPUX86Vendor( | 
|  | 255       kCPUVendor[0], kCPUVendor[1], kCPUVendor[2]); | 
|  | 256   system_info_writer.SetCSDVersion(std::string()); | 
|  | 257 | 
|  | 258   minidump_file_writer.AddStream(&system_info_writer); | 
|  | 259 | 
|  | 260   StringFileWriter file_writer; | 
|  | 261   ASSERT_TRUE(minidump_file_writer.WriteEverything(&file_writer)); | 
|  | 262 | 
|  | 263   const MINIDUMP_SYSTEM_INFO* system_info; | 
|  | 264   const MINIDUMP_STRING* csd_version; | 
|  | 265 | 
|  | 266   GetSystemInfoStream(file_writer.string(), 0, &system_info, &csd_version); | 
|  | 267 | 
|  | 268   EXPECT_EQ(kCPUArchitecture, system_info->ProcessorArchitecture); | 
|  | 269   EXPECT_EQ(0u, system_info->ProcessorLevel); | 
|  | 270   EXPECT_EQ(kCPUVendor[0], system_info->Cpu.X86CpuInfo.VendorId[0]); | 
|  | 271   EXPECT_EQ(kCPUVendor[1], system_info->Cpu.X86CpuInfo.VendorId[1]); | 
|  | 272   EXPECT_EQ(kCPUVendor[2], system_info->Cpu.X86CpuInfo.VendorId[2]); | 
|  | 273   EXPECT_EQ(0u, system_info->Cpu.X86CpuInfo.VersionInformation); | 
|  | 274 } | 
|  | 275 | 
|  | 276 TEST(MinidumpSystemInfoWriterDeathTest, NoCSDVersion) { | 
|  | 277   MinidumpFileWriter minidump_file_writer; | 
|  | 278   MinidumpSystemInfoWriter system_info_writer; | 
|  | 279   minidump_file_writer.AddStream(&system_info_writer); | 
|  | 280 | 
|  | 281   StringFileWriter file_writer; | 
|  | 282   ASSERT_DEATH(minidump_file_writer.WriteEverything(&file_writer), | 
|  | 283                "csd_version_"); | 
|  | 284 } | 
|  | 285 | 
|  | 286 }  // namespace | 
| OLD | NEW | 
|---|