//===- DXContainerTest.cpp - Tests for DXContainerFile --------------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// #include "llvm/ADT/StringRef.h" #include "llvm/ADT/Twine.h" #include "llvm/ObjectYAML/ObjectYAML.h" #include "llvm/ObjectYAML/yaml2obj.h" #include "llvm/Support/MemoryBufferRef.h" #include "llvm/Support/YAMLTraits.h" #include "llvm/Support/raw_ostream.h" #include "llvm/Testing/Support/Error.h" #include "gtest/gtest.h" using namespace llvm; using namespace llvm::object; static bool convert(SmallVectorImpl &Output, const char *YAML) { raw_svector_ostream OS(Output); yaml::Input YIn(YAML); return convertYAML(YIn, OS, [](const Twine &Err) { errs() << Err; }); } TEST(DXCFile, ParseEmptyParts) { SmallString<128> Storage; // First read a fully explicit yaml with all sizes and offsets provided ASSERT_TRUE(convert(Storage, R"(--- !dxcontainer Header: Hash: [ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 ] Version: Major: 1 Minor: 0 FileSize: 116 PartCount: 7 PartOffsets: [ 60, 68, 76, 84, 92, 100, 108 ] Parts: - Name: FKE0 Size: 0 - Name: FKE1 Size: 0 - Name: FKE2 Size: 0 - Name: FKE3 Size: 0 - Name: FKE4 Size: 0 - Name: FKE5 Size: 0 - Name: FKE6 Size: 0 ... )")); // Result char Buffer[] = { 0x44, 0x58, 0x42, 0x43, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x74, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, 0x4C, 0x00, 0x00, 0x00, 0x54, 0x00, 0x00, 0x00, 0x5C, 0x00, 0x00, 0x00, 0x64, 0x00, 0x00, 0x00, 0x6C, 0x00, 0x00, 0x00, 0x46, 0x4B, 0x45, 0x30, 0x00, 0x00, 0x00, 0x00, 0x46, 0x4B, 0x45, 0x31, 0x00, 0x00, 0x00, 0x00, 0x46, 0x4B, 0x45, 0x32, 0x00, 0x00, 0x00, 0x00, 0x46, 0x4B, 0x45, 0x33, 0x00, 0x00, 0x00, 0x00, 0x46, 0x4B, 0x45, 0x34, 0x00, 0x00, 0x00, 0x00, 0x46, 0x4B, 0x45, 0x35, 0x00, 0x00, 0x00, 0x00, 0x46, 0x4B, 0x45, 0x36, 0x00, 0x00, 0x00, 0x00, }; EXPECT_EQ(Storage.size(), 116u); EXPECT_TRUE(memcmp(Buffer, Storage.data(), 116) == 0); Storage.clear(); // Next, read the same file without the part offsets or file size. Both cases // should result in the same final output. ASSERT_TRUE(convert(Storage, R"(--- !dxcontainer Header: Hash: [ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 ] Version: Major: 1 Minor: 0 PartCount: 7 Parts: - Name: FKE0 Size: 0 - Name: FKE1 Size: 0 - Name: FKE2 Size: 0 - Name: FKE3 Size: 0 - Name: FKE4 Size: 0 - Name: FKE5 Size: 0 - Name: FKE6 Size: 0 ... )")); EXPECT_EQ(Storage.size(), 116u); EXPECT_TRUE(memcmp(Buffer, Storage.data(), 116) == 0); } TEST(RootSignature, ParseRootFlags) { SmallString<128> Storage; // First read a fully explicit yaml with all sizes and offsets provided ASSERT_TRUE(convert(Storage, R"(--- !dxcontainer Header: Hash: [ 0x32, 0x9A, 0x53, 0xD8, 0xEC, 0xBE, 0x35, 0x6F, 0x5, 0x39, 0xE1, 0xFE, 0x31, 0x20, 0xF0, 0xC1 ] Version: Major: 1 Minor: 0 FileSize: 68 PartCount: 1 PartOffsets: [ 36 ] Parts: - Name: RTS0 Size: 24 RootSignature: Version: 2 NumRootParameters: 0 RootParametersOffset: 24 NumStaticSamplers: 0 StaticSamplersOffset: 0 Parameters: [] AllowInputAssemblerInputLayout: true )")); uint8_t Buffer[] = { 0x44, 0x58, 0x42, 0x43, 0x32, 0x9A, 0x53, 0xD8, 0xEC, 0xBE, 0x35, 0x6F, 0x05, 0x39, 0xE1, 0xFE, 0x31, 0x20, 0xF0, 0xC1, 0x01, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x52, 0x54, 0x53, 0x30, 0x18, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, }; EXPECT_EQ(Storage.size(), 68u); EXPECT_TRUE(memcmp(Buffer, Storage.data(), 68u) == 0); } TEST(RootSignature, HeaderData) { SmallString<128> Storage; // First read a fully explicit yaml with all sizes and offsets provided ASSERT_TRUE(convert(Storage, R"(--- !dxcontainer Header: Hash: [ 0x32, 0x9A, 0x53, 0xD8, 0xEC, 0xBE, 0x35, 0x6F, 0x5, 0x39, 0xE1, 0xFE, 0x31, 0x20, 0xF0, 0xC1 ] Version: Major: 1 Minor: 0 FileSize: 133 PartCount: 1 PartOffsets: [ 36 ] Parts: - Name: RTS0 Size: 89 RootSignature: Version: 2 NumRootParameters: 1 RootParametersOffset: 255 NumStaticSamplers: 0 StaticSamplersOffset: 0 Parameters: - ParameterType: 1 ShaderVisibility: 2 Constants: Num32BitValues: 16 ShaderRegister: 15 RegisterSpace: 14 AllowInputAssemblerInputLayout: true DenyGeometryShaderRootAccess: true )")); uint8_t Buffer[] = { 0x44, 0x58, 0x42, 0x43, 0x32, 0x9a, 0x53, 0xd8, 0xec, 0xbe, 0x35, 0x6f, 0x05, 0x39, 0xe1, 0xfe, 0x31, 0x20, 0xf0, 0xc1, 0x01, 0x00, 0x00, 0x00, 0x85, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x52, 0x54, 0x53, 0x30, 0x59, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; EXPECT_EQ(Storage.size(), 133u); EXPECT_TRUE(memcmp(Buffer, Storage.data(), 133u) == 0); } TEST(RootSignature, ParseRootConstants) { SmallString<128> Storage; // First read a fully explicit yaml with all sizes and offsets provided ASSERT_TRUE(convert(Storage, R"(--- !dxcontainer Header: Hash: [ 0x32, 0x9A, 0x53, 0xD8, 0xEC, 0xBE, 0x35, 0x6F, 0x5, 0x39, 0xE1, 0xFE, 0x31, 0x20, 0xF0, 0xC1 ] Version: Major: 1 Minor: 0 FileSize: 133 PartCount: 1 PartOffsets: [ 36 ] Parts: - Name: RTS0 Size: 89 RootSignature: Version: 2 NumRootParameters: 1 RootParametersOffset: 36 NumStaticSamplers: 0 StaticSamplersOffset: 0 Parameters: - ParameterType: 1 ShaderVisibility: 2 Constants: Num32BitValues: 16 ShaderRegister: 15 RegisterSpace: 14 AllowInputAssemblerInputLayout: true DenyGeometryShaderRootAccess: true )")); uint8_t Buffer[] = { 0x44, 0x58, 0x42, 0x43, 0x32, 0x9a, 0x53, 0xd8, 0xec, 0xbe, 0x35, 0x6f, 0x05, 0x39, 0xe1, 0xfe, 0x31, 0x20, 0xf0, 0xc1, 0x01, 0x00, 0x00, 0x00, 0x85, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x52, 0x54, 0x53, 0x30, 0x59, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; EXPECT_EQ(Storage.size(), 133u); EXPECT_TRUE(memcmp(Buffer, Storage.data(), 133u) == 0); } TEST(RootSignature, ParseRootDescriptorsV10) { SmallString<128> Storage; // First read a fully explicit yaml with all sizes and offsets provided ASSERT_TRUE(convert(Storage, R"(--- !dxcontainer Header: Hash: [ 0x32, 0x9A, 0x53, 0xD8, 0xEC, 0xBE, 0x35, 0x6F, 0x5, 0x39, 0xE1, 0xFE, 0x31, 0x20, 0xF0, 0xC1 ] Version: Major: 1 Minor: 0 FileSize: 133 PartCount: 1 PartOffsets: [ 36 ] Parts: - Name: RTS0 Size: 89 RootSignature: Version: 1 NumRootParameters: 1 RootParametersOffset: 24 NumStaticSamplers: 0 StaticSamplersOffset: 60 Parameters: - ParameterType: 2 # SRV ShaderVisibility: 3 # Domain Descriptor: ShaderRegister: 31 RegisterSpace: 32 AllowInputAssemblerInputLayout: true DenyGeometryShaderRootAccess: true )")); uint8_t Buffer[] = { 0x44, 0x58, 0x42, 0x43, 0x32, 0x9a, 0x53, 0xd8, 0xec, 0xbe, 0x35, 0x6f, 0x05, 0x39, 0xe1, 0xfe, 0x31, 0x20, 0xf0, 0xc1, 0x01, 0x00, 0x00, 0x00, 0x85, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x52, 0x54, 0x53, 0x30, 0x59, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; EXPECT_EQ(Storage.size(), 133u); EXPECT_TRUE(memcmp(Buffer, Storage.data(), 133u) == 0); } TEST(RootSignature, ParseRootDescriptorsV11) { SmallString<128> Storage; // First read a fully explicit yaml with all sizes and offsets provided ASSERT_TRUE(convert(Storage, R"(--- !dxcontainer Header: Hash: [ 0x32, 0x9A, 0x53, 0xD8, 0xEC, 0xBE, 0x35, 0x6F, 0x5, 0x39, 0xE1, 0xFE, 0x31, 0x20, 0xF0, 0xC1 ] Version: Major: 1 Minor: 0 FileSize: 133 PartCount: 1 PartOffsets: [ 36 ] Parts: - Name: RTS0 Size: 89 RootSignature: Version: 2 NumRootParameters: 1 RootParametersOffset: 24 NumStaticSamplers: 0 StaticSamplersOffset: 60 Parameters: - ParameterType: 2 # SRV ShaderVisibility: 3 # Domain Descriptor: ShaderRegister: 31 RegisterSpace: 32 DATA_STATIC_WHILE_SET_AT_EXECUTE: true AllowInputAssemblerInputLayout: true DenyGeometryShaderRootAccess: true )")); uint8_t Buffer[] = { 0x44, 0x58, 0x42, 0x43, 0x32, 0x9a, 0x53, 0xd8, 0xec, 0xbe, 0x35, 0x6f, 0x05, 0x39, 0xe1, 0xfe, 0x31, 0x20, 0xf0, 0xc1, 0x01, 0x00, 0x00, 0x00, 0x85, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x52, 0x54, 0x53, 0x30, 0x59, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; EXPECT_EQ(Storage.size(), 133u); EXPECT_TRUE(memcmp(Buffer, Storage.data(), 133u) == 0); } TEST(RootSignature, ParseDescriptorTableV10) { SmallString<128> Storage; // First read a fully explicit yaml with all sizes and offsets provided ASSERT_TRUE(convert(Storage, R"(--- !dxcontainer Header: Hash: [ 0x32, 0x9A, 0x53, 0xD8, 0xEC, 0xBE, 0x35, 0x6F, 0x5, 0x39, 0xE1, 0xFE, 0x31, 0x20, 0xF0, 0xC1 ] Version: Major: 1 Minor: 0 FileSize: 133 PartCount: 1 PartOffsets: [ 36 ] Parts: - Name: RTS0 Size: 89 RootSignature: Version: 1 NumRootParameters: 1 RootParametersOffset: 24 NumStaticSamplers: 0 StaticSamplersOffset: 60 Parameters: - ParameterType: 0 # SRV ShaderVisibility: 3 # Domain Table: NumRanges: 1 Ranges: - RangeType: 0 NumDescriptors: 41 BaseShaderRegister: 42 RegisterSpace: 43 OffsetInDescriptorsFromTableStart: 44 AllowInputAssemblerInputLayout: true DenyGeometryShaderRootAccess: true )")); uint8_t Buffer[] = { 0x44, 0x58, 0x42, 0x43, 0x32, 0x9a, 0x53, 0xd8, 0xec, 0xbe, 0x35, 0x6f, 0x05, 0x39, 0xe1, 0xfe, 0x31, 0x20, 0xf0, 0xc1, 0x01, 0x00, 0x00, 0x00, 0x85, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x52, 0x54, 0x53, 0x30, 0x59, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x2c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x29, 0x00, 0x00, 0x00, 0x2a, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x00, 0x00, 0x2c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; EXPECT_EQ(Storage.size(), 133u); EXPECT_TRUE(memcmp(Buffer, Storage.data(), 133u) == 0); } TEST(RootSignature, ParseDescriptorTableV11) { SmallString<128> Storage; // First read a fully explicit yaml with all sizes and offsets provided ASSERT_TRUE(convert(Storage, R"(--- !dxcontainer Header: Hash: [ 0x32, 0x9A, 0x53, 0xD8, 0xEC, 0xBE, 0x35, 0x6F, 0x5, 0x39, 0xE1, 0xFE, 0x31, 0x20, 0xF0, 0xC1 ] Version: Major: 1 Minor: 0 FileSize: 133 PartCount: 1 PartOffsets: [ 36 ] Parts: - Name: RTS0 Size: 89 RootSignature: Version: 2 NumRootParameters: 1 RootParametersOffset: 24 NumStaticSamplers: 0 StaticSamplersOffset: 60 Parameters: - ParameterType: 0 # Descriptor Table ShaderVisibility: 3 # Domain Table: NumRanges: 1 Ranges: - RangeType: 0 NumDescriptors: -1 BaseShaderRegister: 42 RegisterSpace: 43 OffsetInDescriptorsFromTableStart: 41 DESCRIPTORS_STATIC_KEEPING_BUFFER_BOUNDS_CHECKS: true AllowInputAssemblerInputLayout: true DenyGeometryShaderRootAccess: true )")); uint8_t Buffer[] = { 0x44, 0x58, 0x42, 0x43, 0x32, 0x9a, 0x53, 0xd8, 0xec, 0xbe, 0x35, 0x6f, 0x05, 0x39, 0xe1, 0xfe, 0x31, 0x20, 0xf0, 0xc1, 0x01, 0x00, 0x00, 0x00, 0x85, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x52, 0x54, 0x53, 0x30, 0x59, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x2c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x2a, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; EXPECT_EQ(Storage.size(), 133u); EXPECT_TRUE(memcmp(Buffer, Storage.data(), 133u) == 0); } TEST(RootSignature, ParseStaticSamplers) { SmallString<128> Storage; // First read a fully explicit yaml with all sizes and offsets provided ASSERT_TRUE(convert(Storage, R"(--- !dxcontainer Header: Hash: [ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 ] Version: Major: 1 Minor: 0 PartCount: 1 PartOffsets: [ 60 ] Parts: - Name: RTS0 Size: 76 RootSignature: Version: 2 NumRootParameters: 0 RootParametersOffset: 0 NumStaticSamplers: 1 StaticSamplersOffset: 24 Parameters: [] Samplers: - Filter: 10 AddressU: 1 AddressV: 2 AddressW: 5 MipLODBias: 1.23 MaxAnisotropy: 20 ComparisonFunc: 4 BorderColor: 0 MinLOD: 4.56 MaxLOD: 8.90 ShaderRegister: 31 RegisterSpace: 32 ShaderVisibility: 7 AllowInputAssemblerInputLayout: true DenyGeometryShaderRootAccess: true )")); uint8_t Buffer[] = { 0x44, 0x58, 0x42, 0x43, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x90, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0x54, 0x53, 0x30, 0x4c, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0xa4, 0x70, 0x9d, 0x3f, 0x14, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x85, 0xeb, 0x91, 0x40, 0x66, 0x66, 0x0e, 0x41, 0x1f, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00}; EXPECT_EQ(Storage.size(), 144u); EXPECT_TRUE(memcmp(Buffer, Storage.data(), 144u) == 0); }