blob: d172ccf93011b3e9e7cce4b765f8ffac5fdaf8c7 [file] [log] [blame]
Pavel Labath69de7a92019-03-22 14:47:26 +00001//===- MinidumpYAMLTest.cpp - Tests for Minidump<->YAML code --------------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8
9#include "llvm/ObjectYAML/MinidumpYAML.h"
10#include "llvm/Object/Minidump.h"
11#include "llvm/ObjectYAML/ObjectYAML.h"
12#include "llvm/Testing/Support/Error.h"
13#include "gtest/gtest.h"
14
15using namespace llvm;
16using namespace llvm::minidump;
17
18static Expected<std::unique_ptr<object::MinidumpFile>>
19toBinary(SmallVectorImpl<char> &Storage, StringRef Yaml) {
20 Storage.clear();
21 raw_svector_ostream OS(Storage);
22 if (Error E = MinidumpYAML::writeAsBinary(Yaml, OS))
23 return std::move(E);
24
25 return object::MinidumpFile::create(MemoryBufferRef(OS.str(), "Binary"));
26}
27
28TEST(MinidumpYAML, Basic) {
29 SmallString<0> Storage;
30 auto ExpectedFile = toBinary(Storage, R"(
31--- !minidump
32Streams:
33 - Type: SystemInfo
34 Processor Arch: ARM64
35 Platform ID: Linux
36 CSD Version RVA: 0x01020304
37 CPU:
38 CPUID: 0x05060708
39 - Type: LinuxMaps
40 Text: |
41 400d9000-400db000 r-xp 00000000 b3:04 227 /system/bin/app_process
42 400db000-400dc000 r--p 00001000 b3:04 227 /system/bin/app_process
43
44 - Type: LinuxAuxv
45 Content: DEADBEEFBAADF00D)");
46 ASSERT_THAT_EXPECTED(ExpectedFile, Succeeded());
47 object::MinidumpFile &File = **ExpectedFile;
48
49 ASSERT_EQ(3u, File.streams().size());
50
51 EXPECT_EQ(StreamType::SystemInfo, File.streams()[0].Type);
52 auto ExpectedSysInfo = File.getSystemInfo();
53 ASSERT_THAT_EXPECTED(ExpectedSysInfo, Succeeded());
54 const SystemInfo &SysInfo = *ExpectedSysInfo;
55 EXPECT_EQ(ProcessorArchitecture::ARM64, SysInfo.ProcessorArch);
56 EXPECT_EQ(OSPlatform::Linux, SysInfo.PlatformId);
57 EXPECT_EQ(0x01020304u, SysInfo.CSDVersionRVA);
58 EXPECT_EQ(0x05060708u, SysInfo.CPU.Arm.CPUID);
59
60 EXPECT_EQ(StreamType::LinuxMaps, File.streams()[1].Type);
61 EXPECT_EQ("400d9000-400db000 r-xp 00000000 b3:04 227 "
62 "/system/bin/app_process\n"
63 "400db000-400dc000 r--p 00001000 b3:04 227 "
64 "/system/bin/app_process\n",
65 toStringRef(*File.getRawStream(StreamType::LinuxMaps)));
66
67 EXPECT_EQ(StreamType::LinuxAuxv, File.streams()[2].Type);
68 EXPECT_EQ((ArrayRef<uint8_t>{0xDE, 0xAD, 0xBE, 0xEF, 0xBA, 0xAD, 0xF0, 0x0D}),
69 File.getRawStream(StreamType::LinuxAuxv));
70}
71
72TEST(MinidumpYAML, RawContent) {
73 SmallString<0> Storage;
74 auto ExpectedFile = toBinary(Storage, R"(
75--- !minidump
76Streams:
77 - Type: LinuxAuxv
78 Size: 9
79 Content: DEADBEEFBAADF00D)");
80 ASSERT_THAT_EXPECTED(ExpectedFile, Succeeded());
81 object::MinidumpFile &File = **ExpectedFile;
82
83 EXPECT_EQ(
84 (ArrayRef<uint8_t>{0xDE, 0xAD, 0xBE, 0xEF, 0xBA, 0xAD, 0xF0, 0x0D, 0x00}),
85 File.getRawStream(StreamType::LinuxAuxv));
86}
87
88TEST(MinidumpYAML, X86SystemInfo) {
89 SmallString<0> Storage;
90 auto ExpectedFile = toBinary(Storage, R"(
91--- !minidump
92Streams:
93 - Type: SystemInfo
94 Processor Arch: X86
95 Platform ID: Linux
96 CPU:
97 Vendor ID: LLVMLLVMLLVM
98 Version Info: 0x01020304
99 Feature Info: 0x05060708
100 AMD Extended Features: 0x09000102)");
101 ASSERT_THAT_EXPECTED(ExpectedFile, Succeeded());
102 object::MinidumpFile &File = **ExpectedFile;
103
104 ASSERT_EQ(1u, File.streams().size());
105
106 auto ExpectedSysInfo = File.getSystemInfo();
107 ASSERT_THAT_EXPECTED(ExpectedSysInfo, Succeeded());
108 const SystemInfo &SysInfo = *ExpectedSysInfo;
109 EXPECT_EQ(ProcessorArchitecture::X86, SysInfo.ProcessorArch);
110 EXPECT_EQ(OSPlatform::Linux, SysInfo.PlatformId);
111 EXPECT_EQ("LLVMLLVMLLVM", StringRef(SysInfo.CPU.X86.VendorID,
112 sizeof(SysInfo.CPU.X86.VendorID)));
113 EXPECT_EQ(0x01020304u, SysInfo.CPU.X86.VersionInfo);
114 EXPECT_EQ(0x05060708u, SysInfo.CPU.X86.FeatureInfo);
115 EXPECT_EQ(0x09000102u, SysInfo.CPU.X86.AMDExtendedFeatures);
116}
117
118TEST(MinidumpYAML, OtherSystemInfo) {
119 SmallString<0> Storage;
120 auto ExpectedFile = toBinary(Storage, R"(
121--- !minidump
122Streams:
123 - Type: SystemInfo
124 Processor Arch: PPC
125 Platform ID: Linux
126 CPU:
127 Features: 000102030405060708090a0b0c0d0e0f)");
128 ASSERT_THAT_EXPECTED(ExpectedFile, Succeeded());
129 object::MinidumpFile &File = **ExpectedFile;
130
131 ASSERT_EQ(1u, File.streams().size());
132
133 auto ExpectedSysInfo = File.getSystemInfo();
134 ASSERT_THAT_EXPECTED(ExpectedSysInfo, Succeeded());
135 const SystemInfo &SysInfo = *ExpectedSysInfo;
136 EXPECT_EQ(ProcessorArchitecture::PPC, SysInfo.ProcessorArch);
137 EXPECT_EQ(OSPlatform::Linux, SysInfo.PlatformId);
138 EXPECT_EQ(
139 (ArrayRef<uint8_t>{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}),
140 makeArrayRef(SysInfo.CPU.Other.ProcessorFeatures));
141}