summaryrefslogtreecommitdiffstats
path: root/llvm/unittests/ObjectYAML/MinidumpYAMLTest.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/unittests/ObjectYAML/MinidumpYAMLTest.cpp')
-rw-r--r--llvm/unittests/ObjectYAML/MinidumpYAMLTest.cpp141
1 files changed, 141 insertions, 0 deletions
diff --git a/llvm/unittests/ObjectYAML/MinidumpYAMLTest.cpp b/llvm/unittests/ObjectYAML/MinidumpYAMLTest.cpp
new file mode 100644
index 00000000000..d172ccf9301
--- /dev/null
+++ b/llvm/unittests/ObjectYAML/MinidumpYAMLTest.cpp
@@ -0,0 +1,141 @@
+//===- MinidumpYAMLTest.cpp - Tests for Minidump<->YAML code --------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include "llvm/ObjectYAML/MinidumpYAML.h"
+#include "llvm/Object/Minidump.h"
+#include "llvm/ObjectYAML/ObjectYAML.h"
+#include "llvm/Testing/Support/Error.h"
+#include "gtest/gtest.h"
+
+using namespace llvm;
+using namespace llvm::minidump;
+
+static Expected<std::unique_ptr<object::MinidumpFile>>
+toBinary(SmallVectorImpl<char> &Storage, StringRef Yaml) {
+ Storage.clear();
+ raw_svector_ostream OS(Storage);
+ if (Error E = MinidumpYAML::writeAsBinary(Yaml, OS))
+ return std::move(E);
+
+ return object::MinidumpFile::create(MemoryBufferRef(OS.str(), "Binary"));
+}
+
+TEST(MinidumpYAML, Basic) {
+ SmallString<0> Storage;
+ auto ExpectedFile = toBinary(Storage, R"(
+--- !minidump
+Streams:
+ - Type: SystemInfo
+ Processor Arch: ARM64
+ Platform ID: Linux
+ CSD Version RVA: 0x01020304
+ CPU:
+ CPUID: 0x05060708
+ - Type: LinuxMaps
+ Text: |
+ 400d9000-400db000 r-xp 00000000 b3:04 227 /system/bin/app_process
+ 400db000-400dc000 r--p 00001000 b3:04 227 /system/bin/app_process
+
+ - Type: LinuxAuxv
+ Content: DEADBEEFBAADF00D)");
+ ASSERT_THAT_EXPECTED(ExpectedFile, Succeeded());
+ object::MinidumpFile &File = **ExpectedFile;
+
+ ASSERT_EQ(3u, File.streams().size());
+
+ EXPECT_EQ(StreamType::SystemInfo, File.streams()[0].Type);
+ auto ExpectedSysInfo = File.getSystemInfo();
+ ASSERT_THAT_EXPECTED(ExpectedSysInfo, Succeeded());
+ const SystemInfo &SysInfo = *ExpectedSysInfo;
+ EXPECT_EQ(ProcessorArchitecture::ARM64, SysInfo.ProcessorArch);
+ EXPECT_EQ(OSPlatform::Linux, SysInfo.PlatformId);
+ EXPECT_EQ(0x01020304u, SysInfo.CSDVersionRVA);
+ EXPECT_EQ(0x05060708u, SysInfo.CPU.Arm.CPUID);
+
+ EXPECT_EQ(StreamType::LinuxMaps, File.streams()[1].Type);
+ EXPECT_EQ("400d9000-400db000 r-xp 00000000 b3:04 227 "
+ "/system/bin/app_process\n"
+ "400db000-400dc000 r--p 00001000 b3:04 227 "
+ "/system/bin/app_process\n",
+ toStringRef(*File.getRawStream(StreamType::LinuxMaps)));
+
+ EXPECT_EQ(StreamType::LinuxAuxv, File.streams()[2].Type);
+ EXPECT_EQ((ArrayRef<uint8_t>{0xDE, 0xAD, 0xBE, 0xEF, 0xBA, 0xAD, 0xF0, 0x0D}),
+ File.getRawStream(StreamType::LinuxAuxv));
+}
+
+TEST(MinidumpYAML, RawContent) {
+ SmallString<0> Storage;
+ auto ExpectedFile = toBinary(Storage, R"(
+--- !minidump
+Streams:
+ - Type: LinuxAuxv
+ Size: 9
+ Content: DEADBEEFBAADF00D)");
+ ASSERT_THAT_EXPECTED(ExpectedFile, Succeeded());
+ object::MinidumpFile &File = **ExpectedFile;
+
+ EXPECT_EQ(
+ (ArrayRef<uint8_t>{0xDE, 0xAD, 0xBE, 0xEF, 0xBA, 0xAD, 0xF0, 0x0D, 0x00}),
+ File.getRawStream(StreamType::LinuxAuxv));
+}
+
+TEST(MinidumpYAML, X86SystemInfo) {
+ SmallString<0> Storage;
+ auto ExpectedFile = toBinary(Storage, R"(
+--- !minidump
+Streams:
+ - Type: SystemInfo
+ Processor Arch: X86
+ Platform ID: Linux
+ CPU:
+ Vendor ID: LLVMLLVMLLVM
+ Version Info: 0x01020304
+ Feature Info: 0x05060708
+ AMD Extended Features: 0x09000102)");
+ ASSERT_THAT_EXPECTED(ExpectedFile, Succeeded());
+ object::MinidumpFile &File = **ExpectedFile;
+
+ ASSERT_EQ(1u, File.streams().size());
+
+ auto ExpectedSysInfo = File.getSystemInfo();
+ ASSERT_THAT_EXPECTED(ExpectedSysInfo, Succeeded());
+ const SystemInfo &SysInfo = *ExpectedSysInfo;
+ EXPECT_EQ(ProcessorArchitecture::X86, SysInfo.ProcessorArch);
+ EXPECT_EQ(OSPlatform::Linux, SysInfo.PlatformId);
+ EXPECT_EQ("LLVMLLVMLLVM", StringRef(SysInfo.CPU.X86.VendorID,
+ sizeof(SysInfo.CPU.X86.VendorID)));
+ EXPECT_EQ(0x01020304u, SysInfo.CPU.X86.VersionInfo);
+ EXPECT_EQ(0x05060708u, SysInfo.CPU.X86.FeatureInfo);
+ EXPECT_EQ(0x09000102u, SysInfo.CPU.X86.AMDExtendedFeatures);
+}
+
+TEST(MinidumpYAML, OtherSystemInfo) {
+ SmallString<0> Storage;
+ auto ExpectedFile = toBinary(Storage, R"(
+--- !minidump
+Streams:
+ - Type: SystemInfo
+ Processor Arch: PPC
+ Platform ID: Linux
+ CPU:
+ Features: 000102030405060708090a0b0c0d0e0f)");
+ ASSERT_THAT_EXPECTED(ExpectedFile, Succeeded());
+ object::MinidumpFile &File = **ExpectedFile;
+
+ ASSERT_EQ(1u, File.streams().size());
+
+ auto ExpectedSysInfo = File.getSystemInfo();
+ ASSERT_THAT_EXPECTED(ExpectedSysInfo, Succeeded());
+ const SystemInfo &SysInfo = *ExpectedSysInfo;
+ EXPECT_EQ(ProcessorArchitecture::PPC, SysInfo.ProcessorArch);
+ EXPECT_EQ(OSPlatform::Linux, SysInfo.PlatformId);
+ EXPECT_EQ(
+ (ArrayRef<uint8_t>{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}),
+ makeArrayRef(SysInfo.CPU.Other.ProcessorFeatures));
+}
OpenPOWER on IntegriCloud