#ifndef _TCUAPP_HPP
#define _TCUAPP_HPP
/*-------------------------------------------------------------------------
 * drawElements Quality Program Tester Core
 * ----------------------------------------
 *
 * Copyright 2014 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *
 *//*!
 * \file
 * \brief Tester application.
 *
 * Platform port (see tcuPlatform.hpp) must create App and issue calls to
 * App::iterate() until it signals that test execution is completed.
 *//*--------------------------------------------------------------------*/

#include "tcuDefs.hpp"
#include "qpWatchDog.h"
#include "qpCrashHandler.h"
#include "deMutex.hpp"

namespace tcu
{

class Archive;
class Platform;
class TestContext;
class TestSessionExecutor;
class CommandLine;
class TestLog;
class TestPackageRoot;
class TestRunStatus;

enum
{
	WATCHDOG_TOTAL_TIME_LIMIT_SECS		= 300,
	WATCHDOG_INTERVAL_TIME_LIMIT_SECS	= 30
};

/*--------------------------------------------------------------------*//*!
 * \brief Test application
 *
 * Test application encapsulates full test execution logic. Platform port
 * must create App object and repeately call iterate() until it returns
 * false.
 *
 * On systems where main loop is not in control of application (such as
 * Android or iOS) iterate() should be called in application update/draw
 * callback.
 *
 * App is responsible of setting up crash handler (qpCrashHandler) and
 * watchdog (qpWatchDog).
 *
 * See tcuMain.cpp for an example on how to implement application stub.
 *//*--------------------------------------------------------------------*/
class App
{
public:
							App					(Platform& platform, Archive& archive, TestLog& log, const CommandLine& cmdLine);
	virtual					~App				(void);

	bool					iterate				(void);
	const TestRunStatus&	getResult			(void) const;

protected:
	void					cleanup				(void);

	void					onWatchdogTimeout	(qpTimeoutReason reason);
	void					onCrash				(void);

	static void				onWatchdogTimeout	(qpWatchDog* watchDog, void* userPtr, qpTimeoutReason reason);
	static void				onCrash				(qpCrashHandler* crashHandler, void* userPtr);

	Platform&				m_platform;
	qpWatchDog*				m_watchDog;
	qpCrashHandler*			m_crashHandler;
	de::Mutex				m_crashLock;
	bool					m_crashed;

	TestContext*			m_testCtx;
	TestPackageRoot*		m_testRoot;
	TestSessionExecutor*	m_testExecutor;
};

} // tcu

#endif // _TCUAPP_HPP
