1/*------------------------------------------------------------------------- 2 * drawElements Quality Program EGL 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 EGL Implementation Information Tests 22 *//*--------------------------------------------------------------------*/ 23 24#include "teglInfoTests.hpp" 25#include "teglConfigList.hpp" 26#include "tcuTestLog.hpp" 27 28#include <vector> 29#include <string> 30#include <sstream> 31 32#include <EGL/egl.h> 33 34using std::vector; 35using std::string; 36 37using tcu::TestLog; 38 39namespace deqp 40{ 41namespace egl 42{ 43 44static std::vector<std::string> split(const std::string& str, const std::string& delim = " ") 45{ 46 std::vector<std::string> out; 47 if (str.length() == 0) return out; 48 49 size_t start = 0; 50 size_t end = string::npos; 51 52 while ((end = str.find(delim, start)) != string::npos) 53 { 54 out.push_back(str.substr(start, end-start)); 55 start = end + delim.length(); 56 } 57 58 if (start < end) 59 out.push_back(str.substr(start, end-start)); 60 61 return out; 62} 63 64static int toInt(std::string str) 65{ 66 std::istringstream strStream(str); 67 68 int out; 69 strStream >> out; 70 return out; 71} 72 73class QueryStringCase : public TestCase 74{ 75public: 76 QueryStringCase (EglTestContext& eglTestCtx, const char* name, const char* description, EGLint query) 77 : TestCase (eglTestCtx, name, description) 78 , m_query (query) 79 { 80 } 81 82 void validateString (const std::string& result) 83 { 84 tcu::TestLog& log = m_testCtx.getLog(); 85 std::vector<std::string> tokens = split(result); 86 87 if (m_query == EGL_VERSION) 88 { 89 const tcu::egl::Display& display = m_eglTestCtx.getDisplay(); 90 const int dispMajor = display.getEGLMajorVersion(); 91 const int dispMinor = display.getEGLMinorVersion(); 92 93 const std::vector<std::string> versionTokens = split(tokens[0], "."); 94 95 if (versionTokens.size() < 2) 96 { 97 log << TestLog::Message << " Fail, first part of the string must be in the format <major_version.minor_version>" << TestLog::EndMessage; 98 m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Invalid version string"); 99 } 100 else 101 { 102 const int stringMajor = toInt(versionTokens[0]); 103 const int stringMinor = toInt(versionTokens[1]); 104 105 if (stringMajor != dispMajor || stringMinor != dispMinor) 106 { 107 log << TestLog::Message << " Fail, version numer (" << stringMajor << "." << stringMinor 108 << ") does not match the one reported by eglInitialize (" << dispMajor << "." << dispMinor << ")" << TestLog::EndMessage; 109 m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Version number mismatch"); 110 } 111 } 112 } 113 } 114 115 IterateResult iterate (void) 116 { 117 const char* result = eglQueryString(m_eglTestCtx.getDisplay().getEGLDisplay(), m_query); 118 TCU_CHECK_EGL_MSG("eglQueryString() failed"); 119 120 m_testCtx.getLog() << tcu::TestLog::Message << result << tcu::TestLog::EndMessage; 121 m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass"); 122 123 validateString(result); 124 125 return STOP; 126 } 127 128private: 129 EGLint m_query; 130}; 131 132class QueryExtensionsCase : public TestCase 133{ 134public: 135 QueryExtensionsCase (EglTestContext& eglTestCtx) 136 : TestCase (eglTestCtx, "extensions", "Supported Extensions") 137 { 138 } 139 140 IterateResult iterate (void) 141 { 142 vector<string> extensions; 143 m_eglTestCtx.getDisplay().getExtensions(extensions); 144 145 for (vector<string>::const_iterator i = extensions.begin(); i != extensions.end(); i++) 146 m_testCtx.getLog() << tcu::TestLog::Message << *i << tcu::TestLog::EndMessage; 147 148 m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass"); 149 150 return STOP; 151 } 152}; 153 154InfoTests::InfoTests (EglTestContext& eglTestCtx) 155 : TestCaseGroup(eglTestCtx, "info", "Platform Information") 156{ 157} 158 159InfoTests::~InfoTests (void) 160{ 161} 162 163void InfoTests::init (void) 164{ 165 addChild(new QueryStringCase(m_eglTestCtx, "version", "EGL Version", EGL_VERSION)); 166 addChild(new QueryStringCase(m_eglTestCtx, "vendor", "EGL Vendor", EGL_VENDOR)); 167 addChild(new QueryStringCase(m_eglTestCtx, "client_apis", "Supported client APIs", EGL_CLIENT_APIS)); 168 addChild(new QueryExtensionsCase(m_eglTestCtx)); 169 addChild(new ConfigList(m_eglTestCtx)); 170} 171 172} // egl 173} // deqp 174