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