1 /*-------------------------------------------------------------------------
2 * drawElements Internal Test Module
3 * ---------------------------------
4 *
5 * Copyright 2014 The Android Open Source Project
6 *
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
10 *
11 * http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
18 *
19 *//*!
20 * \file
21 * \brief Build information tests.
22 *//*--------------------------------------------------------------------*/
23
24 #include "ditBuildInfoTests.hpp"
25 #include "tcuTestLog.hpp"
26 #include "deStringUtil.hpp"
27
28 using tcu::TestLog;
29
30 namespace dit
31 {
32
getOsName(int os)33 static const char* getOsName (int os)
34 {
35 switch (os)
36 {
37 case DE_OS_VANILLA: return "DE_OS_VANILLA";
38 case DE_OS_WIN32: return "DE_OS_WIN32";
39 case DE_OS_UNIX: return "DE_OS_UNIX";
40 case DE_OS_WINCE: return "DE_OS_WINCE";
41 case DE_OS_OSX: return "DE_OS_OSX";
42 case DE_OS_ANDROID: return "DE_OS_ANDROID";
43 case DE_OS_SYMBIAN: return "DE_OS_SYMBIAN";
44 case DE_OS_IOS: return "DE_OS_IOS";
45 default:
46 return DE_NULL;
47 }
48 }
49
getCompilerName(int compiler)50 static const char* getCompilerName (int compiler)
51 {
52 switch (compiler)
53 {
54 case DE_COMPILER_VANILLA: return "DE_COMPILER_VANILLA";
55 case DE_COMPILER_MSC: return "DE_COMPILER_MSC";
56 case DE_COMPILER_GCC: return "DE_COMPILER_GCC";
57 case DE_COMPILER_CLANG: return "DE_COMPILER_CLANG";
58 default:
59 return DE_NULL;
60 }
61 }
62
getCpuName(int cpu)63 static const char* getCpuName (int cpu)
64 {
65 switch (cpu)
66 {
67 case DE_CPU_VANILLA: return "DE_CPU_VANILLA";
68 case DE_CPU_ARM: return "DE_CPU_ARM";
69 case DE_CPU_X86: return "DE_CPU_X86";
70 case DE_CPU_X86_64: return "DE_CPU_X86_64";
71 case DE_CPU_ARM_64: return "DE_CPU_ARM_64";
72 case DE_CPU_MIPS: return "DE_CPU_MIPS";
73 case DE_CPU_MIPS_64: return "DE_CPU_MIPS_64";
74 case DE_CPU_RISCV_32: return "DE_CPU_RISCV_32";
75 case DE_CPU_RISCV_64: return "DE_CPU_RISCV_64";
76 default:
77 return DE_NULL;
78 }
79 }
80
getEndiannessName(int endianness)81 static const char* getEndiannessName (int endianness)
82 {
83 switch (endianness)
84 {
85 case DE_BIG_ENDIAN: return "DE_BIG_ENDIAN";
86 case DE_LITTLE_ENDIAN: return "DE_LITTLE_ENDIAN";
87 default:
88 return DE_NULL;
89 }
90 }
91
92 class BuildInfoStringCase : public tcu::TestCase
93 {
94 public:
BuildInfoStringCase(tcu::TestContext & testCtx,const char * name,const char * valueName,const char * value)95 BuildInfoStringCase (tcu::TestContext& testCtx, const char* name, const char* valueName, const char* value)
96 : tcu::TestCase (testCtx, name, valueName)
97 , m_valueName (valueName)
98 , m_value (value)
99 {
100 }
101
iterate(void)102 IterateResult iterate (void)
103 {
104 m_testCtx.getLog() << TestLog::Message << m_valueName << " = " << m_value << TestLog::EndMessage;
105 m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass");
106 return STOP;
107 }
108
109 private:
110 std::string m_valueName;
111 std::string m_value;
112 };
113
114 class BuildEnumCase : public tcu::TestCase
115 {
116 public:
117 typedef const char* (*GetStringFunc) (int value);
118
BuildEnumCase(tcu::TestContext & testCtx,const char * name,const char * varName,int value,GetStringFunc getString)119 BuildEnumCase (tcu::TestContext& testCtx, const char* name, const char* varName, int value, GetStringFunc getString)
120 : tcu::TestCase (testCtx, name, varName)
121 , m_varName (varName)
122 , m_value (value)
123 , m_getString (getString)
124 {
125 }
126
iterate(void)127 IterateResult iterate (void)
128 {
129 const char* valueName = m_getString(m_value);
130 const bool isOk = valueName != DE_NULL;
131 std::string logValue = valueName ? std::string(valueName) : de::toString(m_value);
132
133 m_testCtx.getLog() << TestLog::Message << m_varName << " = " << logValue << TestLog::EndMessage;
134
135 m_testCtx.setTestResult(isOk ? QP_TEST_RESULT_PASS : QP_TEST_RESULT_FAIL,
136 isOk ? "Pass" : "No enum name found");
137 return STOP;
138 }
139
140 private:
141 std::string m_varName;
142 int m_value;
143 GetStringFunc m_getString;
144 };
145
146 class EndiannessConsistencyCase : public tcu::TestCase
147 {
148 public:
EndiannessConsistencyCase(tcu::TestContext & context,const char * name,const char * description)149 EndiannessConsistencyCase (tcu::TestContext& context, const char* name, const char* description)
150 : tcu::TestCase(context, name, description)
151 {
152 }
153
iterate(void)154 IterateResult iterate (void)
155 {
156 const deUint16 multiByte = (deUint16)0x0102;
157
158 #if DE_ENDIANNESS == DE_BIG_ENDIAN
159 const bool isOk = *((const deUint8*)&multiByte) == (deUint8)0x01;
160 #elif DE_ENDIANNESS == DE_LITTLE_ENDIAN
161 const bool isOk = *((const deUint8*)&multiByte) == (deUint8)0x02;
162 #endif
163
164 m_testCtx.getLog()
165 << TestLog::Message
166 << "Verifying DE_ENDIANNESS matches actual behavior"
167 << TestLog::EndMessage;
168
169 m_testCtx.setTestResult(isOk ? QP_TEST_RESULT_PASS : QP_TEST_RESULT_FAIL,
170 isOk ? "Pass" : "Configured endianness inconsistent");
171 return STOP;
172 }
173 };
174
BuildInfoTests(tcu::TestContext & testCtx)175 BuildInfoTests::BuildInfoTests (tcu::TestContext& testCtx)
176 : tcu::TestCaseGroup(testCtx, "build_info", "Build Info Tests")
177 {
178 }
179
~BuildInfoTests(void)180 BuildInfoTests::~BuildInfoTests (void)
181 {
182 }
183
init(void)184 void BuildInfoTests::init (void)
185 {
186 #if defined(DE_DEBUG)
187 const bool isDebug = true;
188 #else
189 const bool isDebug = false;
190 #endif
191
192 addChild(new BuildInfoStringCase (m_testCtx, "de_debug", "DE_DEBUG", isDebug ? "1" : "not defined"));
193 addChild(new BuildEnumCase (m_testCtx, "de_os", "DE_OS", DE_OS, getOsName));
194 addChild(new BuildEnumCase (m_testCtx, "de_cpu", "DE_CPU", DE_CPU, getCpuName));
195 addChild(new BuildEnumCase (m_testCtx, "de_compiler", "DE_COMPILER", DE_COMPILER, getCompilerName));
196 addChild(new BuildInfoStringCase (m_testCtx, "de_ptr_size", "DE_PTR_SIZE", de::toString(DE_PTR_SIZE).c_str()));
197 addChild(new BuildEnumCase (m_testCtx, "de_endianness", "DE_ENDIANNESS", DE_ENDIANNESS, getEndiannessName));
198 addChild(new EndiannessConsistencyCase (m_testCtx, "de_endianness_consistent", "DE_ENDIANNESS"));
199 }
200
201 } // dit
202