1 //===- unittest/DebugInfo/CodeView/GUIDFormatTest.cpp - GUID formatting ---===//
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
7 //===----------------------------------------------------------------------===//
9 #include "llvm/ADT/SmallVector.h"
10 #include "llvm/ADT/StringExtras.h"
11 #include "llvm/ADT/StringRef.h"
12 #include "llvm/DebugInfo/CodeView/Formatters.h"
13 #include "llvm/DebugInfo/CodeView/GUID.h"
14 #include "llvm/Support/FormatVariadic.h"
15 #include "gtest/gtest.h"
18 using namespace llvm::codeview
;
20 // Variant 1 UUIDs, nowadays the most common variant, are encoded in a
22 // For example, 00112233-4455-6677-8899-aabbccddeeff is encoded as the bytes
23 // 00 11 22 33 44 55 66 77 88 99 aa bb cc dd ee ff
25 // Variant 2 UUIDs, historically used in Microsoft's COM/OLE libraries, use a
26 // mixed-endian format, whereby the first three components of the UUID are
27 // little-endian, and the last two are big-endian.
28 // For example, 00112233-4455-6677-8899-aabbccddeeff is encoded as the bytes
29 // 33 22 11 00 55 44 77 66 88 99 aa bb cc dd ee ff.
31 // Note: Only Variant 2 UUIDs are tested.
34 using GuidPair
= std::pair
<StringRef
, GUID
>;
35 using GuidData
= SmallVector
<GuidPair
>;
37 void checkData(GuidData
&Data
) {
38 for (auto Item
: Data
) {
39 std::string
GuidText(formatv("{0}", Item
.second
).str());
40 StringRef
Scalar(GuidText
);
42 // GUID strings are 38 characters long.
43 EXPECT_EQ(Scalar
.size(), size_t(38));
45 // GUID must be enclosed in {}
46 EXPECT_EQ(Scalar
.front(), '{');
47 EXPECT_EQ(Scalar
.back(), '}');
49 Scalar
= Scalar
.substr(1, Scalar
.size() - 2);
50 SmallVector
<StringRef
, 6> Component
;
51 Scalar
.split(Component
, '-', 5);
53 // GUID must have 5 components.
54 EXPECT_EQ(Component
.size(), size_t(5));
56 // GUID components are properly delineated with dashes.
57 EXPECT_EQ(Scalar
[8], '-');
58 EXPECT_EQ(Scalar
[13], '-');
59 EXPECT_EQ(Scalar
[18], '-');
60 EXPECT_EQ(Scalar
[23], '-');
62 // GUID only contains hex digits.
64 support::ulittle32_t Data0
;
65 support::ulittle16_t Data1
;
66 support::ulittle16_t Data2
;
67 support::ubig16_t Data3
;
68 support::ubig64_t Data4
;
70 EXPECT_TRUE(to_integer(Component
[0], G
.Data0
, 16));
71 EXPECT_TRUE(to_integer(Component
[1], G
.Data1
, 16));
72 EXPECT_TRUE(to_integer(Component
[2], G
.Data2
, 16));
73 EXPECT_TRUE(to_integer(Component
[3], G
.Data3
, 16));
74 EXPECT_TRUE(to_integer(Component
[4], G
.Data4
, 16));
76 // Check the values are the same.
77 EXPECT_EQ(Scalar
, Item
.first
);
81 TEST(GUIDFormatTest
, ValidateFormat
) {
84 // Non-zero values in all components.
85 {"11223344-5566-7788-99AA-BBCCDDEEFFAA",
86 {0x44, 0x33, 0x22, 0x11, 0x66, 0x55, 0x88, 0x77, 0x99, 0xaa, 0xbb, 0xcc,
87 0xdd, 0xee, 0xff, 0xaa}},
89 // Zero values in all components.
90 {"00000000-0000-0000-0000-000000000000",
91 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
92 0x00, 0x00, 0x00, 0x00}},
94 // Shift 2 (0x00) across all components
95 {"00003344-5566-7788-99AA-BBCCDDEEFFAA",
96 {0x44, 0x33, 0x00, 0x00, 0x66, 0x55, 0x88, 0x77, 0x99, 0xaa, 0xbb, 0xcc,
97 0xdd, 0xee, 0xff, 0xaa}},
98 {"11000044-5566-7788-99AA-BBCCDDEEFFAA",
99 {0x44, 0x00, 0x00, 0x11, 0x66, 0x55, 0x88, 0x77, 0x99, 0xaa, 0xbb, 0xcc,
100 0xdd, 0xee, 0xff, 0xaa}},
101 {"11220000-5566-7788-99AA-BBCCDDEEFFAA",
102 {0x00, 0x00, 0x22, 0x11, 0x66, 0x55, 0x88, 0x77, 0x99, 0xaa, 0xbb, 0xcc,
103 0xdd, 0xee, 0xff, 0xaa}},
104 {"11223300-0066-7788-99AA-BBCCDDEEFFAA",
105 {0x00, 0x33, 0x22, 0x11, 0x66, 0x00, 0x88, 0x77, 0x99, 0xaa, 0xbb, 0xcc,
106 0xdd, 0xee, 0xff, 0xaa}},
107 {"11223344-0000-7788-99AA-BBCCDDEEFFAA",
108 {0x44, 0x33, 0x22, 0x11, 0x00, 0x00, 0x88, 0x77, 0x99, 0xaa, 0xbb, 0xcc,
109 0xdd, 0xee, 0xff, 0xaa}},
110 {"11223344-5500-0088-99AA-BBCCDDEEFFAA",
111 {0x44, 0x33, 0x22, 0x11, 0x00, 0x55, 0x88, 0x00, 0x99, 0xaa, 0xbb, 0xcc,
112 0xdd, 0xee, 0xff, 0xaa}},
113 {"11223344-5566-0000-99AA-BBCCDDEEFFAA",
114 {0x44, 0x33, 0x22, 0x11, 0x66, 0x55, 0x00, 0x00, 0x99, 0xaa, 0xbb, 0xcc,
115 0xdd, 0xee, 0xff, 0xaa}},
116 {"11223344-5566-7700-00AA-BBCCDDEEFFAA",
117 {0x44, 0x33, 0x22, 0x11, 0x66, 0x55, 0x00, 0x77, 0x00, 0xaa, 0xbb, 0xcc,
118 0xdd, 0xee, 0xff, 0xaa}},
119 {"11223344-5566-7788-0000-BBCCDDEEFFAA",
120 {0x44, 0x33, 0x22, 0x11, 0x66, 0x55, 0x88, 0x77, 0x00, 0x00, 0xbb, 0xcc,
121 0xdd, 0xee, 0xff, 0xaa}},
122 {"11223344-5566-7788-9900-00CCDDEEFFAA",
123 {0x44, 0x33, 0x22, 0x11, 0x66, 0x55, 0x88, 0x77, 0x99, 0x00, 0x00, 0xcc,
124 0xdd, 0xee, 0xff, 0xaa}},
125 {"11223344-5566-7788-99AA-0000DDEEFFAA",
126 {0x44, 0x33, 0x22, 0x11, 0x66, 0x55, 0x88, 0x77, 0x99, 0xaa, 0x00, 0x00,
127 0xdd, 0xee, 0xff, 0xaa}},
128 {"11223344-5566-7788-99AA-BB0000EEFFAA",
129 {0x44, 0x33, 0x22, 0x11, 0x66, 0x55, 0x88, 0x77, 0x99, 0xaa, 0xbb, 0x00,
130 0x00, 0xee, 0xff, 0xaa}},
131 {"11223344-5566-7788-99AA-BBCC0000FFAA",
132 {0x44, 0x33, 0x22, 0x11, 0x66, 0x55, 0x88, 0x77, 0x99, 0xaa, 0xbb, 0xcc,
133 0x00, 0x00, 0xff, 0xaa}},
134 {"11223344-5566-7788-99AA-BBCCDD0000AA",
135 {0x44, 0x33, 0x22, 0x11, 0x66, 0x55, 0x88, 0x77, 0x99, 0xaa, 0xbb, 0xcc,
136 0xdd, 0x00, 0x00, 0xaa}},
137 {"11223344-5566-7788-99AA-BBCCDDEE0000",
138 {0x44, 0x33, 0x22, 0x11, 0x66, 0x55, 0x88, 0x77, 0x99, 0xaa, 0xbb, 0xcc,
139 0xdd, 0xee, 0x00, 0x00}},