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