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