diff options
Diffstat (limited to 'llvm/unittests/ObjectYAML/MinidumpYAMLTest.cpp')
-rw-r--r-- | llvm/unittests/ObjectYAML/MinidumpYAMLTest.cpp | 197 |
1 files changed, 197 insertions, 0 deletions
diff --git a/llvm/unittests/ObjectYAML/MinidumpYAMLTest.cpp b/llvm/unittests/ObjectYAML/MinidumpYAMLTest.cpp index 576d8a09dfd..a3c9e7ef18e 100644 --- a/llvm/unittests/ObjectYAML/MinidumpYAMLTest.cpp +++ b/llvm/unittests/ObjectYAML/MinidumpYAMLTest.cpp @@ -139,3 +139,200 @@ Streams: (ArrayRef<uint8_t>{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}), makeArrayRef(SysInfo.CPU.Other.ProcessorFeatures)); } + +// Test that we can parse a normal-looking ExceptionStream. +TEST(MinidumpYAML, ExceptionStream) { + SmallString<0> Storage; + auto ExpectedFile = toBinary(Storage, R"( +--- !minidump +Streams: + - Type: Exception + Thread ID: 0x7 + Exception Record: + Exception Code: 0x23 + Exception Flags: 0x5 + Exception Record: 0x0102030405060708 + Exception Address: 0x0a0b0c0d0e0f1011 + Number of Parameters: 2 + Parameter 0: 0x22 + Parameter 1: 0x24 + Thread Context: 3DeadBeefDefacedABadCafe)"); + ASSERT_THAT_EXPECTED(ExpectedFile, Succeeded()); + object::MinidumpFile &File = **ExpectedFile; + + ASSERT_EQ(1u, File.streams().size()); + + Expected<const minidump::ExceptionStream &> ExpectedStream = + File.getExceptionStream(); + + ASSERT_THAT_EXPECTED(ExpectedStream, Succeeded()); + + const minidump::ExceptionStream &Stream = *ExpectedStream; + EXPECT_EQ(0x7u, Stream.ThreadId); + const minidump::Exception &Exception = Stream.ExceptionRecord; + EXPECT_EQ(0x23u, Exception.ExceptionCode); + EXPECT_EQ(0x5u, Exception.ExceptionFlags); + EXPECT_EQ(0x0102030405060708u, Exception.ExceptionRecord); + EXPECT_EQ(0x0a0b0c0d0e0f1011u, Exception.ExceptionAddress); + EXPECT_EQ(2u, Exception.NumberParameters); + EXPECT_EQ(0x22u, Exception.ExceptionInformation[0]); + EXPECT_EQ(0x24u, Exception.ExceptionInformation[1]); + + Expected<ArrayRef<uint8_t>> ExpectedContext = + File.getRawData(Stream.ThreadContext); + ASSERT_THAT_EXPECTED(ExpectedContext, Succeeded()); + EXPECT_EQ((ArrayRef<uint8_t>{0x3d, 0xea, 0xdb, 0xee, 0xfd, 0xef, 0xac, 0xed, + 0xab, 0xad, 0xca, 0xfe}), + *ExpectedContext); +} + +// Test that we can parse an exception stream with no ExceptionInformation. +TEST(MinidumpYAML, ExceptionStream_NoParameters) { + SmallString<0> Storage; + auto ExpectedFile = toBinary(Storage, R"( +--- !minidump +Streams: + - Type: Exception + Thread ID: 0x7 + Exception Record: + Exception Code: 0x23 + Exception Flags: 0x5 + Exception Record: 0x0102030405060708 + Exception Address: 0x0a0b0c0d0e0f1011 + Thread Context: 3DeadBeefDefacedABadCafe)"); + ASSERT_THAT_EXPECTED(ExpectedFile, Succeeded()); + object::MinidumpFile &File = **ExpectedFile; + + ASSERT_EQ(1u, File.streams().size()); + + Expected<const minidump::ExceptionStream &> ExpectedStream = + File.getExceptionStream(); + + ASSERT_THAT_EXPECTED(ExpectedStream, Succeeded()); + + const minidump::ExceptionStream &Stream = *ExpectedStream; + EXPECT_EQ(0x7u, Stream.ThreadId); + const minidump::Exception &Exception = Stream.ExceptionRecord; + EXPECT_EQ(0x23u, Exception.ExceptionCode); + EXPECT_EQ(0x5u, Exception.ExceptionFlags); + EXPECT_EQ(0x0102030405060708u, Exception.ExceptionRecord); + EXPECT_EQ(0x0a0b0c0d0e0f1011u, Exception.ExceptionAddress); + EXPECT_EQ(0u, Exception.NumberParameters); + + Expected<ArrayRef<uint8_t>> ExpectedContext = + File.getRawData(Stream.ThreadContext); + ASSERT_THAT_EXPECTED(ExpectedContext, Succeeded()); + EXPECT_EQ((ArrayRef<uint8_t>{0x3d, 0xea, 0xdb, 0xee, 0xfd, 0xef, 0xac, 0xed, + 0xab, 0xad, 0xca, 0xfe}), + *ExpectedContext); +} + +// Test that we can parse an ExceptionStream where the stated number of +// parameters is greater than the actual size of the ExceptionInformation +// array. +TEST(MinidumpYAML, ExceptionStream_TooManyParameters) { + SmallString<0> Storage; + auto ExpectedFile = toBinary(Storage, R"( +--- !minidump +Streams: + - Type: Exception + Thread ID: 0x8 + Exception Record: + Exception Code: 0 + Number of Parameters: 16 + Parameter 0: 0x0 + Parameter 1: 0xff + Parameter 2: 0xee + Parameter 3: 0xdd + Parameter 4: 0xcc + Parameter 5: 0xbb + Parameter 6: 0xaa + Parameter 7: 0x99 + Parameter 8: 0x88 + Parameter 9: 0x77 + Parameter 10: 0x66 + Parameter 11: 0x55 + Parameter 12: 0x44 + Parameter 13: 0x33 + Parameter 14: 0x22 + Thread Context: 3DeadBeefDefacedABadCafe)"); + ASSERT_THAT_EXPECTED(ExpectedFile, Succeeded()); + object::MinidumpFile &File = **ExpectedFile; + + ASSERT_EQ(1u, File.streams().size()); + + Expected<const minidump::ExceptionStream &> ExpectedStream = + File.getExceptionStream(); + + ASSERT_THAT_EXPECTED(ExpectedStream, Succeeded()); + + const minidump::ExceptionStream &Stream = *ExpectedStream; + EXPECT_EQ(0x8u, Stream.ThreadId); + const minidump::Exception &Exception = Stream.ExceptionRecord; + EXPECT_EQ(0x0u, Exception.ExceptionCode); + EXPECT_EQ(0x0u, Exception.ExceptionFlags); + EXPECT_EQ(0x00u, Exception.ExceptionRecord); + EXPECT_EQ(0x0u, Exception.ExceptionAddress); + EXPECT_EQ(16u, Exception.NumberParameters); + EXPECT_EQ(0x0u, Exception.ExceptionInformation[0]); + for (int Index = 1; Index < 15; ++Index) { + EXPECT_EQ(0x110u - Index * 0x11, Exception.ExceptionInformation[Index]); + } + + Expected<ArrayRef<uint8_t>> ExpectedContext = + File.getRawData(Stream.ThreadContext); + ASSERT_THAT_EXPECTED(ExpectedContext, Succeeded()); + EXPECT_EQ((ArrayRef<uint8_t>{0x3d, 0xea, 0xdb, 0xee, 0xfd, 0xef, 0xac, 0xed, + 0xab, 0xad, 0xca, 0xfe}), + *ExpectedContext); +} + +// Test that we can parse an ExceptionStream where the number of +// ExceptionInformation parameters provided is greater than the +// specified Number of Parameters. +TEST(MinidumpYAML, ExceptionStream_ExtraParameter) { + SmallString<0> Storage; + auto ExpectedFile = toBinary(Storage, R"( +--- !minidump +Streams: + - Type: Exception + Thread ID: 0x7 + Exception Record: + Exception Code: 0x23 + Exception Flags: 0x5 + Exception Record: 0x0102030405060708 + Exception Address: 0x0a0b0c0d0e0f1011 + Number of Parameters: 2 + Parameter 0: 0x99 + Parameter 1: 0x23 + Parameter 2: 0x42 + Thread Context: 3DeadBeefDefacedABadCafe)"); + ASSERT_THAT_EXPECTED(ExpectedFile, Succeeded()); + object::MinidumpFile &File = **ExpectedFile; + + ASSERT_EQ(1u, File.streams().size()); + + Expected<const minidump::ExceptionStream &> ExpectedStream = + File.getExceptionStream(); + + ASSERT_THAT_EXPECTED(ExpectedStream, Succeeded()); + + const minidump::ExceptionStream &Stream = *ExpectedStream; + EXPECT_EQ(0x7u, Stream.ThreadId); + const minidump::Exception &Exception = Stream.ExceptionRecord; + EXPECT_EQ(0x23u, Exception.ExceptionCode); + EXPECT_EQ(0x5u, Exception.ExceptionFlags); + EXPECT_EQ(0x0102030405060708u, Exception.ExceptionRecord); + EXPECT_EQ(0x0a0b0c0d0e0f1011u, Exception.ExceptionAddress); + EXPECT_EQ(2u, Exception.NumberParameters); + EXPECT_EQ(0x99u, Exception.ExceptionInformation[0]); + EXPECT_EQ(0x23u, Exception.ExceptionInformation[1]); + EXPECT_EQ(0x42u, Exception.ExceptionInformation[2]); + + Expected<ArrayRef<uint8_t>> ExpectedContext = + File.getRawData(Stream.ThreadContext); + ASSERT_THAT_EXPECTED(ExpectedContext, Succeeded()); + EXPECT_EQ((ArrayRef<uint8_t>{0x3d, 0xea, 0xdb, 0xee, 0xfd, 0xef, 0xac, 0xed, + 0xab, 0xad, 0xca, 0xfe}), + *ExpectedContext); +} |