brintos

brintos / llvm-project-archived public Read only

0
0
Text · 5.6 KiB · de127a1 Raw
145 lines · cpp
1//===- unittest/DebugInfo/CodeView/GUIDFormatTest.cpp - GUID formatting ---===//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-exception6//7//===----------------------------------------------------------------------===//8 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"16 17using namespace llvm;18using namespace llvm::codeview;19 20// Variant 1 UUIDs, nowadays the most common variant, are encoded in a21// big-endian format.22// For example, 00112233-4455-6677-8899-aabbccddeeff is encoded as the bytes23// 00 11 22 33 44 55 66 77 88 99 aa bb cc dd ee ff24//25// Variant 2 UUIDs, historically used in Microsoft's COM/OLE libraries, use a26// mixed-endian format, whereby the first three components of the UUID are27// little-endian, and the last two are big-endian.28// For example, 00112233-4455-6677-8899-aabbccddeeff is encoded as the bytes29// 33 22 11 00 55 44 77 66 88 99 aa bb cc dd ee ff.30//31// Note: Only Variant 2 UUIDs are tested.32namespace {33 34using GuidPair = std::pair<StringRef, GUID>;35using GuidData = SmallVector<GuidPair>;36 37void checkData(GuidData &Data) {38  for (auto Item : Data) {39    std::string GuidText(formatv("{0}", Item.second).str());40    StringRef Scalar(GuidText);41 42    // GUID strings are 38 characters long.43    EXPECT_EQ(Scalar.size(), size_t(38));44 45    // GUID must be enclosed in {}46    EXPECT_EQ(Scalar.front(), '{');47    EXPECT_EQ(Scalar.back(), '}');48 49    Scalar = Scalar.substr(1, Scalar.size() - 2);50    SmallVector<StringRef, 6> Component;51    Scalar.split(Component, '-', 5);52 53    // GUID must have 5 components.54    EXPECT_EQ(Component.size(), size_t(5));55 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], '-');61 62    // GUID only contains hex digits.63    struct {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;69    } G = {};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));75 76    // Check the values are the same.77    EXPECT_EQ(Scalar, Item.first);78  }79}80 81TEST(GUIDFormatTest, ValidateFormat) {82  // Shifting 2 (0x00)83  GuidData Data = {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}},88 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}},93 94      // Shift 2 (0x00) across all components95      {"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}},140  };141 142  checkData(Data);143}144} // namespace145