Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(214)

Unified Diff: minidump/minidump_system_info_writer_test.cc

Issue 435243002: Add MinidumpSystemInfoWriter and its test (Closed) Base URL: https://chromium.googlesource.com/crashpad/crashpad@master
Patch Set: Fix release-mode death test Created 6 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « minidump/minidump_system_info_writer.cc ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: minidump/minidump_system_info_writer_test.cc
diff --git a/minidump/minidump_system_info_writer_test.cc b/minidump/minidump_system_info_writer_test.cc
new file mode 100644
index 0000000000000000000000000000000000000000..27963a20e35d213760c151dcf91756d4c8e91344
--- /dev/null
+++ b/minidump/minidump_system_info_writer_test.cc
@@ -0,0 +1,286 @@
+// Copyright 2014 The Crashpad Authors. All rights reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "minidump/minidump_system_info_writer.h"
+
+#include <dbghelp.h>
+#include <string.h>
+
+#include <string>
+
+#include "gtest/gtest.h"
+#include "minidump/minidump_file_writer.h"
+#include "util/file/string_file_writer.h"
+
+namespace {
+
+using namespace crashpad;
+
+void GetSystemInfoStream(const std::string& file_contents,
+ size_t csd_version_length,
+ const MINIDUMP_SYSTEM_INFO** system_info,
+ const MINIDUMP_STRING** csd_version) {
+ // The expected number of bytes for the CSD version’s MINIDUMP_STRING::Buffer.
+ const size_t kCSDVersionBytes =
+ csd_version_length * sizeof(MINIDUMP_STRING::Buffer[0]);
+ const size_t kCSDVersionBytesWithNUL =
+ kCSDVersionBytes + sizeof(MINIDUMP_STRING::Buffer[0]);
+
+ const size_t kDirectoryOffset = sizeof(MINIDUMP_HEADER);
+ const size_t kSystemInfoStreamOffset =
+ kDirectoryOffset + sizeof(MINIDUMP_DIRECTORY);
+ const size_t kCSDVersionOffset =
+ kSystemInfoStreamOffset + sizeof(MINIDUMP_SYSTEM_INFO);
+ const size_t kFileSize =
+ kCSDVersionOffset + sizeof(MINIDUMP_STRING) + kCSDVersionBytesWithNUL;
+
+ ASSERT_EQ(kFileSize, file_contents.size());
+
+ const MINIDUMP_HEADER* header =
+ reinterpret_cast<const MINIDUMP_HEADER*>(&file_contents[0]);
+
+ EXPECT_EQ(static_cast<uint32_t>(MINIDUMP_SIGNATURE), header->Signature);
+ EXPECT_EQ(static_cast<uint32_t>(MINIDUMP_VERSION), header->Version);
+ ASSERT_EQ(1u, header->NumberOfStreams);
+ ASSERT_EQ(kDirectoryOffset, header->StreamDirectoryRva);
+ EXPECT_EQ(0u, header->CheckSum);
+ EXPECT_EQ(0u, header->TimeDateStamp);
+ EXPECT_EQ(MiniDumpNormal, header->Flags);
+
+ const MINIDUMP_DIRECTORY* directory =
+ reinterpret_cast<const MINIDUMP_DIRECTORY*>(
+ &file_contents[kDirectoryOffset]);
+
+ ASSERT_EQ(kMinidumpStreamTypeSystemInfo, directory->StreamType);
+ ASSERT_EQ(sizeof(MINIDUMP_SYSTEM_INFO), directory->Location.DataSize);
+ ASSERT_EQ(kSystemInfoStreamOffset, directory->Location.Rva);
+
+ *system_info = reinterpret_cast<const MINIDUMP_SYSTEM_INFO*>(
+ &file_contents[kSystemInfoStreamOffset]);
+
+ ASSERT_EQ(kCSDVersionOffset, (*system_info)->CSDVersionRva);
+
+ *csd_version = reinterpret_cast<const MINIDUMP_STRING*>(
+ &file_contents[kCSDVersionOffset]);
+
+ ASSERT_EQ(kCSDVersionBytes, (*csd_version)->Length);
+}
+
+TEST(MinidumpSystemInfoWriter, Empty) {
+ MinidumpFileWriter minidump_file_writer;
+ MinidumpSystemInfoWriter system_info_writer;
+
+ system_info_writer.SetCSDVersion(std::string());
+
+ minidump_file_writer.AddStream(&system_info_writer);
+
+ StringFileWriter file_writer;
+ ASSERT_TRUE(minidump_file_writer.WriteEverything(&file_writer));
+
+ const MINIDUMP_SYSTEM_INFO* system_info;
+ const MINIDUMP_STRING* csd_version;
+
+ GetSystemInfoStream(file_writer.string(), 0, &system_info, &csd_version);
+
+ EXPECT_EQ(kMinidumpCPUArchitectureUnknown,
+ system_info->ProcessorArchitecture);
+ EXPECT_EQ(0u, system_info->ProcessorLevel);
+ EXPECT_EQ(0u, system_info->ProcessorRevision);
+ EXPECT_EQ(0u, system_info->NumberOfProcessors);
+ EXPECT_EQ(0u, system_info->ProductType);
+ EXPECT_EQ(0u, system_info->MajorVersion);
+ EXPECT_EQ(0u, system_info->MinorVersion);
+ EXPECT_EQ(0u, system_info->BuildNumber);
+ EXPECT_EQ(0u, system_info->PlatformId);
+ EXPECT_EQ(0u, system_info->SuiteMask);
+ EXPECT_EQ(0u, system_info->Cpu.X86CpuInfo.VendorId[0]);
+ EXPECT_EQ(0u, system_info->Cpu.X86CpuInfo.VendorId[1]);
+ EXPECT_EQ(0u, system_info->Cpu.X86CpuInfo.VendorId[2]);
+ EXPECT_EQ(0u, system_info->Cpu.X86CpuInfo.VersionInformation);
+ EXPECT_EQ(0u, system_info->Cpu.X86CpuInfo.FeatureInformation);
+ EXPECT_EQ(0u, system_info->Cpu.X86CpuInfo.AMDExtendedCpuFeatures);
+ EXPECT_EQ(0u, system_info->Cpu.OtherCpuInfo.ProcessorFeatures[0]);
+ EXPECT_EQ(0u, system_info->Cpu.OtherCpuInfo.ProcessorFeatures[1]);
+
+ EXPECT_EQ('\0', csd_version->Buffer[0]);
+}
+
+TEST(MinidumpSystemInfoWriter, X86_Win) {
+ MinidumpFileWriter minidump_file_writer;
+ MinidumpSystemInfoWriter system_info_writer;
+
+ const MinidumpCPUArchitecture kCPUArchitecture = kMinidumpCPUArchitectureX86;
+ const uint16_t kCPULevel = 0x0010;
+ const uint16_t kCPURevision = 0x0602;
+ const uint8_t kCPUCount = 1;
+ const MinidumpOS kOS = kMinidumpOSWin32NT;
+ const MinidumpOSType kOSType = kMinidumpOSTypeWorkstation;
+ const uint32_t kOSVersionMajor = 6;
+ const uint32_t kOSVersionMinor = 1;
+ const uint32_t kOSVersionBuild = 7601;
+ const char kCSDVersion[] = "Service Pack 1";
+ const uint16_t kSuiteMask = VER_SUITE_SINGLEUSERTS;
+ const char kCPUVendor[] = "AuthenticAMD";
+ const uint32_t kCPUVersion = 0x00100f62;
+ const uint32_t kCPUFeatures = 0x078bfbff;
+ const uint32_t kAMDFeatures = 0xefd3fbff;
+
+ uint32_t cpu_vendor_registers[3];
+ ASSERT_EQ(sizeof(cpu_vendor_registers), strlen(kCPUVendor));
+ memcpy(cpu_vendor_registers, kCPUVendor, sizeof(cpu_vendor_registers));
+
+ system_info_writer.SetCPUArchitecture(kCPUArchitecture);
+ system_info_writer.SetCPULevelAndRevision(kCPULevel, kCPURevision);
+ system_info_writer.SetCPUCount(kCPUCount);
+ system_info_writer.SetOS(kOS);
+ system_info_writer.SetOSType(kMinidumpOSTypeWorkstation);
+ system_info_writer.SetOSVersion(
+ kOSVersionMajor, kOSVersionMinor, kOSVersionBuild);
+ system_info_writer.SetCSDVersion(kCSDVersion);
+ system_info_writer.SetSuiteMask(kSuiteMask);
+ system_info_writer.SetCPUX86VendorString(kCPUVendor);
+ system_info_writer.SetCPUX86VersionAndFeatures(kCPUVersion, kCPUFeatures);
+ system_info_writer.SetCPUX86AMDExtendedFeatures(kAMDFeatures);
+
+ minidump_file_writer.AddStream(&system_info_writer);
+
+ StringFileWriter file_writer;
+ ASSERT_TRUE(minidump_file_writer.WriteEverything(&file_writer));
+
+ const MINIDUMP_SYSTEM_INFO* system_info;
+ const MINIDUMP_STRING* csd_version;
+
+ GetSystemInfoStream(
+ file_writer.string(), strlen(kCSDVersion), &system_info, &csd_version);
+
+ EXPECT_EQ(kCPUArchitecture, system_info->ProcessorArchitecture);
+ EXPECT_EQ(kCPULevel, system_info->ProcessorLevel);
+ EXPECT_EQ(kCPURevision, system_info->ProcessorRevision);
+ EXPECT_EQ(kCPUCount, system_info->NumberOfProcessors);
+ EXPECT_EQ(kOSType, system_info->ProductType);
+ EXPECT_EQ(kOSVersionMajor, system_info->MajorVersion);
+ EXPECT_EQ(kOSVersionMinor, system_info->MinorVersion);
+ EXPECT_EQ(kOSVersionBuild, system_info->BuildNumber);
+ EXPECT_EQ(kOS, system_info->PlatformId);
+ EXPECT_EQ(kSuiteMask, system_info->SuiteMask);
+ EXPECT_EQ(cpu_vendor_registers[0], system_info->Cpu.X86CpuInfo.VendorId[0]);
+ EXPECT_EQ(cpu_vendor_registers[1], system_info->Cpu.X86CpuInfo.VendorId[1]);
+ EXPECT_EQ(cpu_vendor_registers[2], system_info->Cpu.X86CpuInfo.VendorId[2]);
+ EXPECT_EQ(kCPUVersion, system_info->Cpu.X86CpuInfo.VersionInformation);
+ EXPECT_EQ(kCPUFeatures, system_info->Cpu.X86CpuInfo.FeatureInformation);
+ EXPECT_EQ(kAMDFeatures, system_info->Cpu.X86CpuInfo.AMDExtendedCpuFeatures);
+
+ for (size_t index = 0; index < strlen(kCSDVersion); ++index) {
+ EXPECT_EQ(kCSDVersion[index], csd_version->Buffer[index]) << index;
+ }
+}
+
+TEST(MinidumpSystemInfoWriter, X86_64_Mac) {
+ MinidumpFileWriter minidump_file_writer;
+ MinidumpSystemInfoWriter system_info_writer;
+
+ const MinidumpCPUArchitecture kCPUArchitecture =
+ kMinidumpCPUArchitectureAMD64;
+ const uint16_t kCPULevel = 0x0006;
+ const uint16_t kCPURevision = 0x3a09;
+ const uint8_t kCPUCount = 8;
+ const MinidumpOS kOS = kMinidumpOSMacOSX;
+ const MinidumpOSType kOSType = kMinidumpOSTypeWorkstation;
+ const uint32_t kOSVersionMajor = 10;
+ const uint32_t kOSVersionMinor = 9;
+ const uint32_t kOSVersionBuild = 4;
+ const char kCSDVersion[] = "13E28";
+ const uint64_t kCPUFeatures[2] = {0x10427f4c, 0x00000000};
+
+ system_info_writer.SetCPUArchitecture(kCPUArchitecture);
+ system_info_writer.SetCPULevelAndRevision(kCPULevel, kCPURevision);
+ system_info_writer.SetCPUCount(kCPUCount);
+ system_info_writer.SetOS(kOS);
+ system_info_writer.SetOSType(kMinidumpOSTypeWorkstation);
+ system_info_writer.SetOSVersion(
+ kOSVersionMajor, kOSVersionMinor, kOSVersionBuild);
+ system_info_writer.SetCSDVersion(kCSDVersion);
+ system_info_writer.SetCPUOtherFeatures(kCPUFeatures[0], kCPUFeatures[1]);
+
+ minidump_file_writer.AddStream(&system_info_writer);
+
+ StringFileWriter file_writer;
+ ASSERT_TRUE(minidump_file_writer.WriteEverything(&file_writer));
+
+ const MINIDUMP_SYSTEM_INFO* system_info;
+ const MINIDUMP_STRING* csd_version;
+
+ GetSystemInfoStream(
+ file_writer.string(), strlen(kCSDVersion), &system_info, &csd_version);
+
+ EXPECT_EQ(kCPUArchitecture, system_info->ProcessorArchitecture);
+ EXPECT_EQ(kCPULevel, system_info->ProcessorLevel);
+ EXPECT_EQ(kCPURevision, system_info->ProcessorRevision);
+ EXPECT_EQ(kCPUCount, system_info->NumberOfProcessors);
+ EXPECT_EQ(kOSType, system_info->ProductType);
+ EXPECT_EQ(kOSVersionMajor, system_info->MajorVersion);
+ EXPECT_EQ(kOSVersionMinor, system_info->MinorVersion);
+ EXPECT_EQ(kOSVersionBuild, system_info->BuildNumber);
+ EXPECT_EQ(kOS, system_info->PlatformId);
+ EXPECT_EQ(0u, system_info->SuiteMask);
+ EXPECT_EQ(kCPUFeatures[0],
+ system_info->Cpu.OtherCpuInfo.ProcessorFeatures[0]);
+ EXPECT_EQ(kCPUFeatures[1],
+ system_info->Cpu.OtherCpuInfo.ProcessorFeatures[1]);
+}
+
+TEST(MinidumpSystemInfoWriter, X86_CPUVendorFromRegisters) {
+ // MinidumpSystemInfoWriter.X86_Win already tested SetCPUX86VendorString().
+ // This test exercises SetCPUX86Vendor() to set the vendor from register
+ // values.
+ MinidumpFileWriter minidump_file_writer;
+ MinidumpSystemInfoWriter system_info_writer;
+
+ const MinidumpCPUArchitecture kCPUArchitecture = kMinidumpCPUArchitectureX86;
+ const uint32_t kCPUVendor[] = {'uneG', 'Ieni', 'letn'};
+
+ system_info_writer.SetCPUArchitecture(kCPUArchitecture);
+ system_info_writer.SetCPUX86Vendor(
+ kCPUVendor[0], kCPUVendor[1], kCPUVendor[2]);
+ system_info_writer.SetCSDVersion(std::string());
+
+ minidump_file_writer.AddStream(&system_info_writer);
+
+ StringFileWriter file_writer;
+ ASSERT_TRUE(minidump_file_writer.WriteEverything(&file_writer));
+
+ const MINIDUMP_SYSTEM_INFO* system_info;
+ const MINIDUMP_STRING* csd_version;
+
+ GetSystemInfoStream(file_writer.string(), 0, &system_info, &csd_version);
+
+ EXPECT_EQ(kCPUArchitecture, system_info->ProcessorArchitecture);
+ EXPECT_EQ(0u, system_info->ProcessorLevel);
+ EXPECT_EQ(kCPUVendor[0], system_info->Cpu.X86CpuInfo.VendorId[0]);
+ EXPECT_EQ(kCPUVendor[1], system_info->Cpu.X86CpuInfo.VendorId[1]);
+ EXPECT_EQ(kCPUVendor[2], system_info->Cpu.X86CpuInfo.VendorId[2]);
+ EXPECT_EQ(0u, system_info->Cpu.X86CpuInfo.VersionInformation);
+}
+
+TEST(MinidumpSystemInfoWriterDeathTest, NoCSDVersion) {
+ MinidumpFileWriter minidump_file_writer;
+ MinidumpSystemInfoWriter system_info_writer;
+ minidump_file_writer.AddStream(&system_info_writer);
+
+ StringFileWriter file_writer;
+ ASSERT_DEATH(minidump_file_writer.WriteEverything(&file_writer),
+ "csd_version_");
+}
+
+} // namespace
« no previous file with comments | « minidump/minidump_system_info_writer.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698