1/*-------------------------------------------------------------------------
2 * drawElements Quality Program Tester Core
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 Context shared between test cases.
22 *//*--------------------------------------------------------------------*/
23
24#include "tcuTestContext.hpp"
25
26#include "tcuTestLog.hpp"
27
28namespace tcu
29{
30
31TestContext::TestContext (
32	Platform&			platform,
33	Archive&			rootArchive,
34	TestLog&			log,
35	const CommandLine&	cmdLine,
36	qpWatchDog*			watchDog)
37	: m_platform		(platform)
38	, m_rootArchive		(rootArchive)
39	, m_log				(log)
40	, m_cmdLine			(cmdLine)
41	, m_watchDog		(watchDog)
42	, m_curArchive		(DE_NULL)
43	, m_testResult		(QP_TEST_RESULT_LAST)
44	, m_terminateAfter	(false)
45{
46	setCurrentArchive(m_rootArchive);
47}
48
49void TestContext::touchWatchdog (void)
50{
51	if (m_watchDog)
52		qpWatchDog_touch(m_watchDog);
53}
54
55void TestContext::setTestResult (qpTestResult testResult, const char* description)
56{
57	m_testResult		= testResult;
58	m_testResultDesc	= description;
59}
60
61static int testResultSeverity (qpTestResult testResult)
62{
63	switch (testResult)
64	{
65		case QP_TEST_RESULT_LAST:					return -1;
66		case QP_TEST_RESULT_PASS:					return 0;
67		case QP_TEST_RESULT_PENDING:				return 10;
68		case QP_TEST_RESULT_NOT_SUPPORTED:			return 20;
69		case QP_TEST_RESULT_QUALITY_WARNING:		return 30;
70		case QP_TEST_RESULT_COMPATIBILITY_WARNING:	return 40;
71		case QP_TEST_RESULT_TIMEOUT:				return 50;
72		case QP_TEST_RESULT_FAIL:					return 100;
73		case QP_TEST_RESULT_RESOURCE_ERROR:			return 110;
74		case QP_TEST_RESULT_INTERNAL_ERROR:			return 120;
75		case QP_TEST_RESULT_CRASH:					return 150;
76		default:									DE_ASSERT(!"Impossible case");
77	}
78	return 0;
79}
80
81ResultCollector::ResultCollector (void)
82	: m_log		(DE_NULL)
83	, m_prefix	("")
84	, m_result	(QP_TEST_RESULT_LAST)
85	, m_message ("Pass")
86{
87}
88
89ResultCollector::ResultCollector (TestLog& log, const std::string& prefix)
90	: m_log		(&log)
91	, m_prefix	(prefix)
92	, m_result	(QP_TEST_RESULT_LAST)
93	, m_message ("Pass")
94{
95}
96
97void ResultCollector::addResult (qpTestResult result, const std::string& msg)
98{
99	if (m_log != DE_NULL)
100		(*m_log) << TestLog::Message << m_prefix << msg << TestLog::EndMessage;
101
102	if (testResultSeverity(result) > testResultSeverity(m_result))
103	{
104		m_result = result;
105		m_message = msg;
106	}
107}
108
109bool ResultCollector::checkResult (bool condition, qpTestResult result, const std::string& msg)
110{
111	if (!condition)
112		addResult(result, msg);
113	return condition;
114}
115
116void ResultCollector::fail (const std::string& msg)
117{
118	addResult(QP_TEST_RESULT_FAIL, msg);
119}
120
121bool ResultCollector::check (bool condition, const std::string& msg)
122{
123	return checkResult(condition, QP_TEST_RESULT_FAIL, msg);
124}
125
126void ResultCollector::setTestContextResult (TestContext& testCtx)
127{
128	if (m_result == QP_TEST_RESULT_LAST)
129		testCtx.setTestResult(QP_TEST_RESULT_PASS, m_message.c_str());
130	else
131		testCtx.setTestResult(m_result, m_message.c_str());
132}
133
134} // tcu
135