1 /*
2  * PROJECT:     ReactOS Automatic Testing Utility
3  * LICENSE:     GPL-2.0+ (https://spdx.org/licenses/GPL-2.0+)
4  * PURPOSE:     Main implementation file
5  * COPYRIGHT:   Copyright 2008-2009 Colin Finck (colin@reactos.org)
6  */
7 
8 #include "precomp.h"
9 #include <cstdio>
10 
11 CConfiguration Configuration;
12 
13 /**
14  * Prints the application usage.
15  */
16 static void
17 IntPrintUsage()
18 {
19     cout << "rosautotest - ReactOS Automatic Testing Utility" << endl
20          << "Usage: rosautotest [options] [module] [test]" << endl
21          << "  options:" << endl
22          << "    /?           - Shows this help." << endl
23          << "    /c <comment> - Specifies the comment to be submitted to the Web Service." << endl
24          << "                   Skips the comment set in the configuration file (if any)." << endl
25          << "                   Only has an effect when /w is also used." << endl
26          << "    /n           - Do not print test output to console" << endl
27          << "    /r           - Maintain information to resume from ReactOS crashes" << endl
28          << "                   Can only be run under ReactOS and relies on sysreg2," << endl
29          << "                   so incompatible with /w" << endl
30          << "    /s           - Shut down the system after finishing the tests." << endl
31          << "    /w           - Submit the results to the webservice." << endl
32          << "                   Requires a \"rosautotest.ini\" with valid login data." << endl
33          << "                   Incompatible with the /r option." << endl
34          << endl
35          << "  module:" << endl
36          << "    The module to be tested (i.e. \"advapi32\")" << endl
37          << "    If this parameter is specified without any test parameter," << endl
38          << "    all tests of the specified module are run." << endl
39          << endl
40          << "  test:" << endl
41          << "    The test to be run. Needs to be a test of the specified module." << endl;
42 }
43 
44 /**
45  * Main entry point
46  */
47 extern "C" int
48 wmain(int argc, wchar_t* argv[])
49 {
50     CWineTest WineTest;
51     int ReturnValue = 1;
52 
53     try
54     {
55         stringstream ss;
56 
57         /* Set up the configuration */
58         Configuration.ParseParameters(argc, argv);
59         Configuration.GetSystemInformation();
60         Configuration.GetConfigurationFromFile();
61 
62         ss << endl
63            << endl
64            << "[ROSAUTOTEST] System uptime " << setprecision(2) << fixed;
65         ss << ((float)GetTickCount()/1000) << " seconds" << endl;
66         StringOut(ss.str());
67 
68         /* Report tests startup */
69         InitLogs();
70         ReportEventW(hLog,
71                       EVENTLOG_INFORMATION_TYPE,
72                       0,
73                       MSG_TESTS_STARTED,
74                       NULL,
75                       0,
76                       0,
77                       NULL,
78                       NULL);
79 
80         /* Run the tests */
81         WineTest.Run();
82 
83         /* For sysreg2 */
84         DbgPrint("SYSREG_CHECKPOINT:THIRDBOOT_COMPLETE\n");
85 
86         ReturnValue = 0;
87     }
88     catch(CInvalidParameterException)
89     {
90         IntPrintUsage();
91     }
92     catch(CSimpleException& e)
93     {
94         stringstream ss;
95 
96         // e.GetMessage() must include ending '\n'.
97         ss << "[ROSAUTOTEST] " << e.GetMessage();
98         StringOut(ss.str());
99     }
100     catch(CFatalException& e)
101     {
102         stringstream ss;
103 
104         // e.GetMessage() must include ending '\n'.
105         ss << "An exception occured in rosautotest." << endl
106            << "Message: " << e.GetMessage()
107            << "File: " << e.GetFile() << endl
108            << "Line: " << e.GetLine() << endl
109            << "Last Win32 Error: " << GetLastError() << endl;
110         StringOut(ss.str());
111     }
112 
113     /* For sysreg2 to notice if rosautotest itself failed */
114     if(ReturnValue == 1)
115         DbgPrint("SYSREG_ROSAUTOTEST_FAILURE\n");
116 
117     /* Report successful end of tests */
118     ReportEventW(hLog,
119                   EVENTLOG_SUCCESS,
120                   0,
121                   MSG_TESTS_SUCCESSFUL,
122                   NULL,
123                   0,
124                   0,
125                   NULL,
126                   NULL);
127     FreeLogs();
128 
129     /* Shut down the system if requested, also in case of an exception above */
130     if(Configuration.DoShutdown() && !ShutdownSystem())
131         ReturnValue = 1;
132 
133     return ReturnValue;
134 }
135