180814287SRaphael Isemann //===-- BreakpadRecordsTest.cpp -------------------------------------------===//
22cf5486cSPavel Labath //
32cf5486cSPavel Labath //
42946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
52946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
62946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
72cf5486cSPavel Labath //
82cf5486cSPavel Labath //===----------------------------------------------------------------------===//
92cf5486cSPavel Labath 
102cf5486cSPavel Labath #include "Plugins/ObjectFile/Breakpad/BreakpadRecords.h"
112cf5486cSPavel Labath #include "gtest/gtest.h"
122cf5486cSPavel Labath 
132cf5486cSPavel Labath using namespace lldb_private;
142cf5486cSPavel Labath using namespace lldb_private::breakpad;
152cf5486cSPavel Labath 
TEST(Record,classify)162cf5486cSPavel Labath TEST(Record, classify) {
172cf5486cSPavel Labath   EXPECT_EQ(Record::Module, Record::classify("MODULE"));
182cf5486cSPavel Labath   EXPECT_EQ(Record::Info, Record::classify("INFO"));
192cf5486cSPavel Labath   EXPECT_EQ(Record::File, Record::classify("FILE"));
202cf5486cSPavel Labath   EXPECT_EQ(Record::Func, Record::classify("FUNC"));
21*cc9ced0eSZequan Wu   EXPECT_EQ(Record::Inline, Record::classify("INLINE"));
22*cc9ced0eSZequan Wu   EXPECT_EQ(Record::InlineOrigin, Record::classify("INLINE_ORIGIN"));
232cf5486cSPavel Labath   EXPECT_EQ(Record::Public, Record::classify("PUBLIC"));
24dfaafbcfSPavel Labath   EXPECT_EQ(Record::StackCFI, Record::classify("STACK CFI"));
250a9f47d7SPavel Labath   EXPECT_EQ(Record::StackWin, Record::classify("STACK WIN"));
26dfaafbcfSPavel Labath 
27dfaafbcfSPavel Labath   // Any obviously incorrect lines will be classified as such.
28dfaafbcfSPavel Labath   EXPECT_EQ(llvm::None, Record::classify("STACK"));
29dfaafbcfSPavel Labath   EXPECT_EQ(llvm::None, Record::classify("STACK CODE_ID"));
30dfaafbcfSPavel Labath   EXPECT_EQ(llvm::None, Record::classify("CODE_ID"));
312cf5486cSPavel Labath 
322cf5486cSPavel Labath   // Any line which does not start with a known keyword will be classified as a
332cf5486cSPavel Labath   // line record, as those are the only ones that start without a keyword.
342cf5486cSPavel Labath   EXPECT_EQ(Record::Line, Record::classify("deadbeef"));
352cf5486cSPavel Labath   EXPECT_EQ(Record::Line, Record::classify("12"));
362cf5486cSPavel Labath }
372cf5486cSPavel Labath 
TEST(ModuleRecord,parse)382cf5486cSPavel Labath TEST(ModuleRecord, parse) {
392cf5486cSPavel Labath   EXPECT_EQ(ModuleRecord(llvm::Triple::Linux, llvm::Triple::x86_64,
402cf5486cSPavel Labath                          UUID::fromData("@ABCDEFGHIJKLMNO", 16)),
412cf5486cSPavel Labath             ModuleRecord::parse(
42025b9d0fSPavel Labath                 "MODULE Linux x86_64 404142434445464748494a4b4c4d4e4f0 a.out"));
432cf5486cSPavel Labath 
442cf5486cSPavel Labath   EXPECT_EQ(llvm::None, ModuleRecord::parse("MODULE"));
452cf5486cSPavel Labath   EXPECT_EQ(llvm::None, ModuleRecord::parse("MODULE Linux"));
462cf5486cSPavel Labath   EXPECT_EQ(llvm::None, ModuleRecord::parse("MODULE Linux x86_64"));
472cf5486cSPavel Labath   EXPECT_EQ(llvm::None,
482cf5486cSPavel Labath             ModuleRecord::parse("MODULE Linux x86_64 deadbeefbaadf00d"));
492cf5486cSPavel Labath }
502cf5486cSPavel Labath 
TEST(InfoRecord,parse)512cf5486cSPavel Labath TEST(InfoRecord, parse) {
522cf5486cSPavel Labath   EXPECT_EQ(InfoRecord(UUID::fromData("@ABCDEFGHIJKLMNO", 16)),
532cf5486cSPavel Labath             InfoRecord::parse("INFO CODE_ID 404142434445464748494a4b4c4d4e4f"));
542cf5486cSPavel Labath   EXPECT_EQ(InfoRecord(UUID()), InfoRecord::parse("INFO CODE_ID 47 a.exe"));
552cf5486cSPavel Labath 
562cf5486cSPavel Labath   EXPECT_EQ(llvm::None, InfoRecord::parse("INFO"));
572cf5486cSPavel Labath   EXPECT_EQ(llvm::None, InfoRecord::parse("INFO CODE_ID"));
582cf5486cSPavel Labath }
592cf5486cSPavel Labath 
TEST(FileRecord,parse)60b1f28579SPavel Labath TEST(FileRecord, parse) {
61b1f28579SPavel Labath   EXPECT_EQ(FileRecord(47, "foo"), FileRecord::parse("FILE 47 foo"));
62b1f28579SPavel Labath   EXPECT_EQ(llvm::None, FileRecord::parse("FILE 47"));
63b1f28579SPavel Labath   EXPECT_EQ(llvm::None, FileRecord::parse("FILE"));
64b1f28579SPavel Labath   EXPECT_EQ(llvm::None, FileRecord::parse(""));
65b1f28579SPavel Labath }
66b1f28579SPavel Labath 
TEST(FuncRecord,parse)6706bb3735SPavel Labath TEST(FuncRecord, parse) {
6806bb3735SPavel Labath   EXPECT_EQ(FuncRecord(true, 0x47, 0x7, 0x8, "foo"),
6906bb3735SPavel Labath             FuncRecord::parse("FUNC m 47 7 8 foo"));
7006bb3735SPavel Labath   EXPECT_EQ(FuncRecord(false, 0x47, 0x7, 0x8, "foo"),
7106bb3735SPavel Labath             FuncRecord::parse("FUNC 47 7 8 foo"));
7206bb3735SPavel Labath 
7306bb3735SPavel Labath   EXPECT_EQ(llvm::None, FuncRecord::parse("PUBLIC 47 7 8 foo"));
7406bb3735SPavel Labath   EXPECT_EQ(llvm::None, FuncRecord::parse("FUNC 47 7 8"));
7506bb3735SPavel Labath   EXPECT_EQ(llvm::None, FuncRecord::parse("FUNC 47 7"));
7606bb3735SPavel Labath   EXPECT_EQ(llvm::None, FuncRecord::parse("FUNC 47"));
7706bb3735SPavel Labath   EXPECT_EQ(llvm::None, FuncRecord::parse("FUNC m"));
7806bb3735SPavel Labath   EXPECT_EQ(llvm::None, FuncRecord::parse("FUNC"));
7906bb3735SPavel Labath }
8006bb3735SPavel Labath 
TEST(InlineOriginRecord,parse)81*cc9ced0eSZequan Wu TEST(InlineOriginRecord, parse) {
82*cc9ced0eSZequan Wu   EXPECT_EQ(InlineOriginRecord(47, "foo"),
83*cc9ced0eSZequan Wu             InlineOriginRecord::parse("INLINE_ORIGIN 47 foo"));
84*cc9ced0eSZequan Wu   EXPECT_EQ(llvm::None, InlineOriginRecord::parse("INLINE_ORIGIN 47"));
85*cc9ced0eSZequan Wu   EXPECT_EQ(llvm::None, InlineOriginRecord::parse("INLINE_ORIGIN"));
86*cc9ced0eSZequan Wu   EXPECT_EQ(llvm::None, InlineOriginRecord::parse(""));
87*cc9ced0eSZequan Wu }
88*cc9ced0eSZequan Wu 
TEST(InlineRecord,parse)89*cc9ced0eSZequan Wu TEST(InlineRecord, parse) {
90*cc9ced0eSZequan Wu   InlineRecord record1 = InlineRecord(0, 1, 2, 3);
91*cc9ced0eSZequan Wu   record1.Ranges.emplace_back(4, 5);
92*cc9ced0eSZequan Wu   EXPECT_EQ(record1, InlineRecord::parse("INLINE 0 1 2 3 4 5"));
93*cc9ced0eSZequan Wu   record1.Ranges.emplace_back(6, 7);
94*cc9ced0eSZequan Wu   EXPECT_EQ(record1, InlineRecord::parse("INLINE 0 1 2 3 4 5 6 7"));
95*cc9ced0eSZequan Wu   EXPECT_EQ(llvm::None, InlineRecord::parse("INLINE 0 1 2 3"));
96*cc9ced0eSZequan Wu   EXPECT_EQ(llvm::None, InlineRecord::parse("INLINE 0 1 2 3 4 5 6"));
97*cc9ced0eSZequan Wu   EXPECT_EQ(llvm::None, InlineRecord::parse("INLNIE 0"));
98*cc9ced0eSZequan Wu   EXPECT_EQ(llvm::None, InlineRecord::parse(""));
99*cc9ced0eSZequan Wu   EXPECT_EQ(llvm::None, InlineRecord::parse("FUNC"));
100*cc9ced0eSZequan Wu }
101*cc9ced0eSZequan Wu 
TEST(LineRecord,parse)102b1f28579SPavel Labath TEST(LineRecord, parse) {
103b1f28579SPavel Labath   EXPECT_EQ(LineRecord(0x47, 0x74, 47, 74), LineRecord::parse("47 74 47 74"));
104b1f28579SPavel Labath   EXPECT_EQ(llvm::None, LineRecord::parse("47 74 47"));
105b1f28579SPavel Labath   EXPECT_EQ(llvm::None, LineRecord::parse("47 74"));
106b1f28579SPavel Labath   EXPECT_EQ(llvm::None, LineRecord::parse("47"));
107b1f28579SPavel Labath   EXPECT_EQ(llvm::None, LineRecord::parse(""));
108b1f28579SPavel Labath   EXPECT_EQ(llvm::None, LineRecord::parse("FUNC"));
109b1f28579SPavel Labath }
110b1f28579SPavel Labath 
TEST(PublicRecord,parse)1112cf5486cSPavel Labath TEST(PublicRecord, parse) {
1122cf5486cSPavel Labath   EXPECT_EQ(PublicRecord(true, 0x47, 0x8, "foo"),
1132cf5486cSPavel Labath             PublicRecord::parse("PUBLIC m 47 8 foo"));
1142cf5486cSPavel Labath   EXPECT_EQ(PublicRecord(false, 0x47, 0x8, "foo"),
1152cf5486cSPavel Labath             PublicRecord::parse("PUBLIC 47 8 foo"));
1162cf5486cSPavel Labath 
11706bb3735SPavel Labath   EXPECT_EQ(llvm::None, PublicRecord::parse("FUNC 47 8 foo"));
1182cf5486cSPavel Labath   EXPECT_EQ(llvm::None, PublicRecord::parse("PUBLIC 47 8"));
1192cf5486cSPavel Labath   EXPECT_EQ(llvm::None, PublicRecord::parse("PUBLIC 47"));
1202cf5486cSPavel Labath   EXPECT_EQ(llvm::None, PublicRecord::parse("PUBLIC m"));
1212cf5486cSPavel Labath   EXPECT_EQ(llvm::None, PublicRecord::parse("PUBLIC"));
1222cf5486cSPavel Labath }
1239837f548SPavel Labath 
TEST(StackCFIRecord,parse)1249837f548SPavel Labath TEST(StackCFIRecord, parse) {
1259837f548SPavel Labath   EXPECT_EQ(StackCFIRecord(0x47, 0x8, ".cfa: $esp 4 + $eip: .cfa 4 - ^"),
1269837f548SPavel Labath             StackCFIRecord::parse(
1279837f548SPavel Labath                 "STACK CFI INIT 47 8 .cfa: $esp 4 + $eip: .cfa 4 - ^"));
1289837f548SPavel Labath 
1299837f548SPavel Labath   EXPECT_EQ(StackCFIRecord(0x47, 0x8, ".cfa: $esp 4 +"),
1309837f548SPavel Labath             StackCFIRecord::parse("STACK CFI INIT 47 8 .cfa: $esp 4 +  "));
1319837f548SPavel Labath 
1329837f548SPavel Labath   EXPECT_EQ(StackCFIRecord(0x47, llvm::None, ".cfa: $esp 4 +"),
1339837f548SPavel Labath             StackCFIRecord::parse("STACK CFI 47 .cfa: $esp 4 +"));
1349837f548SPavel Labath 
1359837f548SPavel Labath   // The validity of the register value expressions is not checked
1369837f548SPavel Labath   EXPECT_EQ(StackCFIRecord(0x47, 0x8, ".cfa: ^ ^ ^"),
1379837f548SPavel Labath             StackCFIRecord::parse("STACK CFI INIT 47 8 .cfa: ^ ^ ^"));
1389837f548SPavel Labath 
1399837f548SPavel Labath   EXPECT_EQ(llvm::None, StackCFIRecord::parse("STACK CFI INIT 47"));
1409837f548SPavel Labath   EXPECT_EQ(llvm::None, StackCFIRecord::parse("STACK CFI INIT"));
1419837f548SPavel Labath   EXPECT_EQ(llvm::None, StackCFIRecord::parse("STACK CFI"));
1429837f548SPavel Labath   EXPECT_EQ(llvm::None, StackCFIRecord::parse("STACK"));
1439837f548SPavel Labath   EXPECT_EQ(llvm::None, StackCFIRecord::parse("FILE 47 foo"));
1449837f548SPavel Labath   EXPECT_EQ(llvm::None, StackCFIRecord::parse("42 47"));
1459837f548SPavel Labath }
1460a9f47d7SPavel Labath 
TEST(StackWinRecord,parse)1470a9f47d7SPavel Labath TEST(StackWinRecord, parse) {
1480a9f47d7SPavel Labath   EXPECT_EQ(
1490a9f47d7SPavel Labath       StackWinRecord(0x47, 0x8, 3, 4, 5, llvm::StringRef("$eip $esp ^ =")),
1500a9f47d7SPavel Labath       StackWinRecord::parse("STACK WIN 4 47 8 1 2 3 4 5 6 1 $eip $esp ^ ="));
1510a9f47d7SPavel Labath 
1520a9f47d7SPavel Labath   EXPECT_EQ(llvm::None, StackWinRecord::parse(
1530a9f47d7SPavel Labath                             "STACK WIN 0 47 8 1 0 0 0 0 0 1 $eip $esp ^ ="));
1540a9f47d7SPavel Labath   EXPECT_EQ(llvm::None,
1550a9f47d7SPavel Labath             StackWinRecord::parse("STACK WIN 4 47 8 1 0 0 0 0 0 0 1"));
1560a9f47d7SPavel Labath   EXPECT_EQ(llvm::None, StackWinRecord::parse(
1570a9f47d7SPavel Labath                             "STACK WIN 3 47 8 1 0 0 0 0 0 1 $eip $esp ^ ="));
1580a9f47d7SPavel Labath   EXPECT_EQ(llvm::None,
1590a9f47d7SPavel Labath             StackWinRecord::parse("STACK WIN 3 47 8 1 0 0 0 0 0 0 1"));
1600a9f47d7SPavel Labath   EXPECT_EQ(llvm::None, StackWinRecord::parse(
1610a9f47d7SPavel Labath                             "STACK WIN 4 47 8 1 0 0 0 0 1 $eip $esp ^ ="));
1620a9f47d7SPavel Labath   EXPECT_EQ(llvm::None, StackWinRecord::parse("STACK WIN 4 47 8 1 0 0 0 0 0"));
1630a9f47d7SPavel Labath   EXPECT_EQ(llvm::None, StackWinRecord::parse("STACK WIN 4 47 8 1 0 0 0 0"));
1640a9f47d7SPavel Labath   EXPECT_EQ(llvm::None, StackWinRecord::parse("STACK WIN 4 47 8 1 0 0 0"));
1650a9f47d7SPavel Labath   EXPECT_EQ(llvm::None, StackWinRecord::parse("STACK WIN 4 47 8 1 0 0"));
1660a9f47d7SPavel Labath   EXPECT_EQ(llvm::None, StackWinRecord::parse("STACK WIN 4 47 8 1 0"));
1670a9f47d7SPavel Labath   EXPECT_EQ(llvm::None, StackWinRecord::parse("STACK WIN 4 47 8 1"));
1680a9f47d7SPavel Labath   EXPECT_EQ(llvm::None, StackWinRecord::parse("STACK WIN 4 47 8"));
1690a9f47d7SPavel Labath   EXPECT_EQ(llvm::None, StackWinRecord::parse("STACK WIN 4 47"));
1700a9f47d7SPavel Labath   EXPECT_EQ(llvm::None, StackWinRecord::parse("STACK WIN 4"));
1710a9f47d7SPavel Labath   EXPECT_EQ(llvm::None, StackWinRecord::parse("STACK WIN"));
1720a9f47d7SPavel Labath   EXPECT_EQ(llvm::None, StackWinRecord::parse("STACK"));
1730a9f47d7SPavel Labath   EXPECT_EQ(llvm::None, StackWinRecord::parse(""));
1740a9f47d7SPavel Labath   EXPECT_EQ(llvm::None, StackCFIRecord::parse("FILE 47 foo"));
1750a9f47d7SPavel Labath   EXPECT_EQ(llvm::None, StackCFIRecord::parse("42 47"));
1760a9f47d7SPavel Labath }
177