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 Generic main().
22 *//*--------------------------------------------------------------------*/
23
24 #include "tcuDefs.hpp"
25 #include "tcuCommandLine.hpp"
26 #include "tcuPlatform.hpp"
27 #include "tcuApp.hpp"
28 #include "tcuResource.hpp"
29 #include "tcuTestLog.hpp"
30 #include "tcuTestSessionExecutor.hpp"
31 #include "deUniquePtr.hpp"
32 #include "qpDebugOut.h"
33
34 #include <cstdio>
35
36 // Implement this in your platform port.
37 tcu::Platform *createPlatform(void);
38
39 namespace
40 {
41
disableRawWrites(int,const char *)42 bool disableRawWrites(int, const char *)
43 {
44 return false;
45 }
disableFmtWrites(int,const char *,va_list)46 bool disableFmtWrites(int, const char *, va_list)
47 {
48 return false;
49 }
disableStdout()50 void disableStdout()
51 {
52 qpRedirectOut(disableRawWrites, disableFmtWrites);
53 }
54
55 } // anonymous namespace
56
main(int argc,char ** argv)57 int main(int argc, char **argv)
58 {
59 int exitStatus = EXIT_SUCCESS;
60
61 #if (DE_OS != DE_OS_WIN32)
62 // Set stdout to line-buffered mode (will be fully buffered by default if stdout is pipe).
63 setvbuf(stdout, DE_NULL, _IOLBF, 4 * 1024);
64 #endif
65
66 try
67 {
68 tcu::CommandLine cmdLine(argc, argv);
69
70 if (cmdLine.quietMode())
71 disableStdout();
72
73 tcu::DirArchive archive(cmdLine.getArchiveDir());
74 tcu::TestLog log(cmdLine.getLogFileName(), cmdLine.getLogFlags());
75 de::UniquePtr<tcu::Platform> platform(createPlatform());
76 de::UniquePtr<tcu::App> app(new tcu::App(*platform, archive, log, cmdLine));
77
78 // Main loop.
79 for (;;)
80 {
81 if (!app->iterate())
82 {
83 if (cmdLine.getRunMode() == tcu::RUNMODE_EXECUTE &&
84 (!app->getResult().isComplete || app->getResult().numFailed))
85 {
86 exitStatus = EXIT_FAILURE;
87 }
88
89 break;
90 }
91 }
92 }
93 catch (const std::exception &e)
94 {
95 tcu::die("%s", e.what());
96 }
97
98 return exitStatus;
99 }
100