1fd4e5da5Sopenharmony_ci// Copyright (c) 2015-2016 The Khronos Group Inc. 2fd4e5da5Sopenharmony_ci// 3fd4e5da5Sopenharmony_ci// Licensed under the Apache License, Version 2.0 (the "License"); 4fd4e5da5Sopenharmony_ci// you may not use this file except in compliance with the License. 5fd4e5da5Sopenharmony_ci// You may obtain a copy of the License at 6fd4e5da5Sopenharmony_ci// 7fd4e5da5Sopenharmony_ci// http://www.apache.org/licenses/LICENSE-2.0 8fd4e5da5Sopenharmony_ci// 9fd4e5da5Sopenharmony_ci// Unless required by applicable law or agreed to in writing, software 10fd4e5da5Sopenharmony_ci// distributed under the License is distributed on an "AS IS" BASIS, 11fd4e5da5Sopenharmony_ci// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12fd4e5da5Sopenharmony_ci// See the License for the specific language governing permissions and 13fd4e5da5Sopenharmony_ci// limitations under the License. 14fd4e5da5Sopenharmony_ci 15fd4e5da5Sopenharmony_ci#include "source/spirv_constant.h" 16fd4e5da5Sopenharmony_ci#include "test/unit_spirv.h" 17fd4e5da5Sopenharmony_ci 18fd4e5da5Sopenharmony_cinamespace spvtools { 19fd4e5da5Sopenharmony_cinamespace { 20fd4e5da5Sopenharmony_ci 21fd4e5da5Sopenharmony_ciclass BinaryHeaderGet : public ::testing::Test { 22fd4e5da5Sopenharmony_ci public: 23fd4e5da5Sopenharmony_ci BinaryHeaderGet() { memset(code, 0, sizeof(code)); } 24fd4e5da5Sopenharmony_ci 25fd4e5da5Sopenharmony_ci virtual void SetUp() { 26fd4e5da5Sopenharmony_ci code[0] = static_cast<uint32_t>(spv::MagicNumber); 27fd4e5da5Sopenharmony_ci code[1] = static_cast<uint32_t>(spv::Version); 28fd4e5da5Sopenharmony_ci code[2] = SPV_GENERATOR_CODEPLAY; 29fd4e5da5Sopenharmony_ci code[3] = 1; // NOTE: Bound 30fd4e5da5Sopenharmony_ci code[4] = 0; // NOTE: Schema; reserved 31fd4e5da5Sopenharmony_ci code[5] = 0; // NOTE: Instructions 32fd4e5da5Sopenharmony_ci 33fd4e5da5Sopenharmony_ci binary.code = code; 34fd4e5da5Sopenharmony_ci binary.wordCount = 6; 35fd4e5da5Sopenharmony_ci } 36fd4e5da5Sopenharmony_ci spv_const_binary_t get_const_binary() { 37fd4e5da5Sopenharmony_ci return spv_const_binary_t{binary.code, binary.wordCount}; 38fd4e5da5Sopenharmony_ci } 39fd4e5da5Sopenharmony_ci virtual void TearDown() {} 40fd4e5da5Sopenharmony_ci 41fd4e5da5Sopenharmony_ci uint32_t code[6]; 42fd4e5da5Sopenharmony_ci spv_binary_t binary; 43fd4e5da5Sopenharmony_ci}; 44fd4e5da5Sopenharmony_ci 45fd4e5da5Sopenharmony_ciTEST_F(BinaryHeaderGet, Default) { 46fd4e5da5Sopenharmony_ci spv_endianness_t endian; 47fd4e5da5Sopenharmony_ci spv_const_binary_t const_bin = get_const_binary(); 48fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_SUCCESS, spvBinaryEndianness(&const_bin, &endian)); 49fd4e5da5Sopenharmony_ci 50fd4e5da5Sopenharmony_ci spv_header_t header; 51fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_SUCCESS, spvBinaryHeaderGet(&const_bin, endian, &header)); 52fd4e5da5Sopenharmony_ci 53fd4e5da5Sopenharmony_ci ASSERT_EQ(static_cast<uint32_t>(spv::MagicNumber), header.magic); 54fd4e5da5Sopenharmony_ci // Expect SPIRV-Headers updated to SPIR-V 1.6. 55fd4e5da5Sopenharmony_ci ASSERT_EQ(0x00010600u, header.version); 56fd4e5da5Sopenharmony_ci ASSERT_EQ(static_cast<uint32_t>(SPV_GENERATOR_CODEPLAY), header.generator); 57fd4e5da5Sopenharmony_ci ASSERT_EQ(1u, header.bound); 58fd4e5da5Sopenharmony_ci ASSERT_EQ(0u, header.schema); 59fd4e5da5Sopenharmony_ci ASSERT_EQ(&code[5], header.instructions); 60fd4e5da5Sopenharmony_ci} 61fd4e5da5Sopenharmony_ci 62fd4e5da5Sopenharmony_ciTEST_F(BinaryHeaderGet, InvalidCode) { 63fd4e5da5Sopenharmony_ci spv_const_binary_t my_binary = {nullptr, 0}; 64fd4e5da5Sopenharmony_ci spv_header_t header; 65fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_BINARY, 66fd4e5da5Sopenharmony_ci spvBinaryHeaderGet(&my_binary, SPV_ENDIANNESS_LITTLE, &header)); 67fd4e5da5Sopenharmony_ci} 68fd4e5da5Sopenharmony_ci 69fd4e5da5Sopenharmony_ciTEST_F(BinaryHeaderGet, InvalidPointerHeader) { 70fd4e5da5Sopenharmony_ci spv_const_binary_t const_bin = get_const_binary(); 71fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_POINTER, 72fd4e5da5Sopenharmony_ci spvBinaryHeaderGet(&const_bin, SPV_ENDIANNESS_LITTLE, nullptr)); 73fd4e5da5Sopenharmony_ci} 74fd4e5da5Sopenharmony_ci 75fd4e5da5Sopenharmony_ciTEST_F(BinaryHeaderGet, TruncatedHeader) { 76fd4e5da5Sopenharmony_ci for (uint8_t i = 1; i < SPV_INDEX_INSTRUCTION; i++) { 77fd4e5da5Sopenharmony_ci binary.wordCount = i; 78fd4e5da5Sopenharmony_ci spv_const_binary_t const_bin = get_const_binary(); 79fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_BINARY, 80fd4e5da5Sopenharmony_ci spvBinaryHeaderGet(&const_bin, SPV_ENDIANNESS_LITTLE, nullptr)); 81fd4e5da5Sopenharmony_ci } 82fd4e5da5Sopenharmony_ci} 83fd4e5da5Sopenharmony_ci 84fd4e5da5Sopenharmony_ciTEST_F(BinaryHeaderGet, VersionNonZeroHighByte) { 85fd4e5da5Sopenharmony_ci spv_header_t header; 86fd4e5da5Sopenharmony_ci code[1] = 0xFF010300; 87fd4e5da5Sopenharmony_ci spv_const_binary_t const_bin = get_const_binary(); 88fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_BINARY, 89fd4e5da5Sopenharmony_ci spvBinaryHeaderGet(&const_bin, SPV_ENDIANNESS_LITTLE, &header)); 90fd4e5da5Sopenharmony_ci} 91fd4e5da5Sopenharmony_ci 92fd4e5da5Sopenharmony_ciTEST_F(BinaryHeaderGet, VersionNonZeroLowByte) { 93fd4e5da5Sopenharmony_ci spv_header_t header; 94fd4e5da5Sopenharmony_ci code[1] = 0x000103F0; 95fd4e5da5Sopenharmony_ci spv_const_binary_t const_bin = get_const_binary(); 96fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_BINARY, 97fd4e5da5Sopenharmony_ci spvBinaryHeaderGet(&const_bin, SPV_ENDIANNESS_LITTLE, &header)); 98fd4e5da5Sopenharmony_ci} 99fd4e5da5Sopenharmony_ci 100fd4e5da5Sopenharmony_ciTEST_F(BinaryHeaderGet, VersionTooLow) { 101fd4e5da5Sopenharmony_ci spv_header_t header; 102fd4e5da5Sopenharmony_ci code[1] = 0x00000300; 103fd4e5da5Sopenharmony_ci spv_const_binary_t const_bin = get_const_binary(); 104fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_BINARY, 105fd4e5da5Sopenharmony_ci spvBinaryHeaderGet(&const_bin, SPV_ENDIANNESS_LITTLE, &header)); 106fd4e5da5Sopenharmony_ci} 107fd4e5da5Sopenharmony_ci 108fd4e5da5Sopenharmony_ciTEST_F(BinaryHeaderGet, VersionTooHigh) { 109fd4e5da5Sopenharmony_ci spv_header_t header; 110fd4e5da5Sopenharmony_ci code[1] = 0x000F0300; 111fd4e5da5Sopenharmony_ci spv_const_binary_t const_bin = get_const_binary(); 112fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_BINARY, 113fd4e5da5Sopenharmony_ci spvBinaryHeaderGet(&const_bin, SPV_ENDIANNESS_LITTLE, &header)); 114fd4e5da5Sopenharmony_ci} 115fd4e5da5Sopenharmony_ci 116fd4e5da5Sopenharmony_ci} // namespace 117fd4e5da5Sopenharmony_ci} // namespace spvtools 118