1 // Copyright (c) 2015-2016 The Khronos Group Inc. 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at 6 // 7 // http://www.apache.org/licenses/LICENSE-2.0 8 // 9 // Unless required by applicable law or agreed to in writing, software 10 // distributed under the License is distributed on an "AS IS" BASIS, 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 // See the License for the specific language governing permissions and 13 // limitations under the License. 14 15 #include "source/spirv_constant.h" 16 #include "test/unit_spirv.h" 17 18 namespace spvtools { 19 namespace { 20 21 class BinaryHeaderGet : public ::testing::Test { 22 public: 23 BinaryHeaderGet() { memset(code, 0, sizeof(code)); } 24 25 virtual void SetUp() { 26 code[0] = SpvMagicNumber; 27 code[1] = SpvVersion; 28 code[2] = SPV_GENERATOR_CODEPLAY; 29 code[3] = 1; // NOTE: Bound 30 code[4] = 0; // NOTE: Schema; reserved 31 code[5] = 0; // NOTE: Instructions 32 33 binary.code = code; 34 binary.wordCount = 6; 35 } 36 spv_const_binary_t get_const_binary() { 37 return spv_const_binary_t{binary.code, binary.wordCount}; 38 } 39 virtual void TearDown() {} 40 41 uint32_t code[6]; 42 spv_binary_t binary; 43 }; 44 45 TEST_F(BinaryHeaderGet, Default) { 46 spv_endianness_t endian; 47 spv_const_binary_t const_bin = get_const_binary(); 48 ASSERT_EQ(SPV_SUCCESS, spvBinaryEndianness(&const_bin, &endian)); 49 50 spv_header_t header; 51 ASSERT_EQ(SPV_SUCCESS, spvBinaryHeaderGet(&const_bin, endian, &header)); 52 53 ASSERT_EQ(static_cast<uint32_t>(SpvMagicNumber), header.magic); 54 ASSERT_EQ(0x00010300u, header.version); 55 ASSERT_EQ(static_cast<uint32_t>(SPV_GENERATOR_CODEPLAY), header.generator); 56 ASSERT_EQ(1u, header.bound); 57 ASSERT_EQ(0u, header.schema); 58 ASSERT_EQ(&code[5], header.instructions); 59 } 60 61 TEST_F(BinaryHeaderGet, InvalidCode) { 62 spv_const_binary_t my_binary = {nullptr, 0}; 63 spv_header_t header; 64 ASSERT_EQ(SPV_ERROR_INVALID_BINARY, 65 spvBinaryHeaderGet(&my_binary, SPV_ENDIANNESS_LITTLE, &header)); 66 } 67 68 TEST_F(BinaryHeaderGet, InvalidPointerHeader) { 69 spv_const_binary_t const_bin = get_const_binary(); 70 ASSERT_EQ(SPV_ERROR_INVALID_POINTER, 71 spvBinaryHeaderGet(&const_bin, SPV_ENDIANNESS_LITTLE, nullptr)); 72 } 73 74 TEST_F(BinaryHeaderGet, TruncatedHeader) { 75 for (uint8_t i = 1; i < SPV_INDEX_INSTRUCTION; i++) { 76 binary.wordCount = i; 77 spv_const_binary_t const_bin = get_const_binary(); 78 ASSERT_EQ(SPV_ERROR_INVALID_BINARY, 79 spvBinaryHeaderGet(&const_bin, SPV_ENDIANNESS_LITTLE, nullptr)); 80 } 81 } 82 83 } // namespace 84 } // namespace spvtools 85