New keywords implemented.
[qa-tools:qtuitest-mbt-adapter.git] / src / keywordrunner.cpp
1 /*
2  * This file is part of qtuitest-mbt-adapter
3  *
4  * Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
5  *
6  * Contact: Riku Halonen <riku.halonen@nokia.com>
7  *
8  * This program is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU Lesser General Public License
10  * version 2.1 as published by the Free Software Foundation.
11  *
12  * This library is distributed in the hope that it will be useful, but
13  * WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15  * Lesser General Public License for more details.
16  *
17  * You should have received a copy of the GNU Lesser General Public
18  * License along with this library; if not, write to the Free Software
19  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
20  * 02110-1301 USA
21  *
22  */
23
24 // System includes.
25
26 // User includes.
27 #include "keywordrunner.h"
28 #include "keyword.h"
29 #include "adapterinterface.h"
30
31 KeywordRunner::KeywordRunner(int argc, char* argv[], QObject *parent) :
32     QObject(parent),
33     m_kwController(0),
34     m_interface(0),
35     m_delay(0)
36 {
37     m_adapterOpts.interface = AdapterContext::None;
38     m_adapterOpts.MbtServerPort = 0;
39     m_adapterOpts.serverPort = 0;
40
41     for (int i = 1; i < argc; ++i) m_commandLineArgs << argv[i];
42 }
43
44 KeywordRunner::~KeywordRunner()
45 {
46     if (m_kwController) delete m_kwController;
47     if (m_interface) delete m_interface;
48 }
49
50 void KeywordRunner::printUsage()
51 {
52     qDebug(
53         " Usage:\n"
54         "    qtuitest-mbt-adapter [options]\n"
55         "\n"
56         "  Examples:\n"
57         "    qtuitest-mbt-adapter -i\n"
58         "    qtuitest-mbt-adapter -a localhost -p 9090\n"
59         "\n"
60         "  Adapter start mode options:\n"
61         "\n"
62         "    -i                   : Starts interactive mode.\n"
63         "    -f <file>            : Execute keywords from a file defined in <file>.\n"
64         "    -a <address>         : MBT server address to connect. <address> may be a IPV4 address or a host name.\n"
65         "    -p <port>            : MBT server port to connect.\n"
66         "    -s <port>            : Starts server mode. <port> defines port to be listened.\n"
67         "    -d <secs>            : Delay between keywords (seconds)\n"
68         "    -h, -help, --help    : Prints this help.\n"
69         "\n"
70         "  AUT connection options:\n"
71         "\n"
72         "    -authost <host>      : Specify the IP address or host name of the machine on which the AUT is running.\n"
73         "                           By default, the adapter will connect to 127.0.0.1.\n\n"
74         "    -autport <port>      : Specify the port on which the AUT is listening for a connection. Defaults to 5656.\n"
75         "    -sshport <port>      : Specify the port to use when ssh'ing to authost. Defaults to 22.\n"
76         "    -username <username> : Specify the user name when ssh'ing to authost.\n"
77         "    -pwd <password>      : Specify the password when ssh'ing to authost.\n"
78         );
79     exit(1);
80 }
81
82 void KeywordRunner::processCommandLine()
83 {
84     if (m_commandLineArgs.count() < 1) {
85         printUsage();
86     }
87
88     QMutableStringListIterator iter(m_commandLineArgs);
89
90     // Parse command line parameters.
91     while (iter.hasNext()) {
92         QString arg = iter.next();
93
94         if (!arg.compare("-i", Qt::CaseInsensitive)) {
95             iter.remove();
96             m_adapterOpts.interface = AdapterContext::CommandLine;
97         }
98         else if (!arg.compare("-f", Qt::CaseInsensitive)) {
99             iter.remove();
100             m_adapterOpts.interface = AdapterContext::File;
101             if (!iter.hasNext()) qFatal("Expected a value after %s.\n", qPrintable(arg));
102             m_adapterOpts.filePath = iter.next();
103             iter.remove();
104         }
105         else if (!arg.compare("-a", Qt::CaseInsensitive)) {
106             iter.remove();
107             m_adapterOpts.interface = AdapterContext::MbtClient;
108             if (!iter.hasNext()) qFatal("Expected a value after %s.\n", qPrintable(arg));
109             m_adapterOpts.MbtServerAddr = iter.next();
110             iter.remove();
111         }
112         else if (!arg.compare("-p", Qt::CaseInsensitive)) {
113             iter.remove();
114             m_adapterOpts.interface = AdapterContext::MbtClient;
115             if (!iter.hasNext()) qFatal("Expected a value after %s.\n", qPrintable(arg));
116             bool ok;
117             m_adapterOpts.MbtServerPort = iter.next().toUShort(&ok);
118             if (!ok) qFatal("%s is not a valid port specifier.\n", qPrintable(iter.value()));
119             iter.remove();
120         }
121         else if (!arg.compare("-s", Qt::CaseInsensitive)) {
122             iter.remove();
123             m_adapterOpts.interface = AdapterContext::Server;
124             if (!iter.hasNext()) qFatal("Expected a value after %s.\n", qPrintable(arg));
125             bool ok;
126             m_adapterOpts.serverPort = iter.next().toUShort(&ok);
127             if (!ok) qFatal("%s is not a valid port specifier.\n", qPrintable(iter.value()));
128             iter.remove();
129         }
130         else if (!arg.compare("-d", Qt::CaseInsensitive)) {
131             iter.remove();
132             if (!iter.hasNext()) qFatal("Expected a value after %s.\n", qPrintable(arg));
133             bool ok;
134             int secs = iter.next().toUShort(&ok);
135             m_delay = secs * 1000;
136             if (!ok) qFatal("%s is not a valid delay specifier.\n", qPrintable(iter.value()));
137             iter.remove();
138         }
139         else if (!arg.compare("-help", Qt::CaseInsensitive) ||
140                   !arg.compare("--help", Qt::CaseInsensitive) ||
141                   !arg.compare("-h", Qt::CaseInsensitive)) {
142             printUsage();
143         }
144     };
145
146     // Sanity check.
147     if (m_adapterOpts.interface == AdapterContext::None) {
148         qWarning("Invalid arguments.\n");
149         printUsage();
150     }
151 }
152
153 void KeywordRunner::exec()
154 {
155     // Process command line arguments.
156     processCommandLine();
157
158     int retVal = 0;
159     int nbrOfKeywords = 0;
160     int nbrOfPassedKeywords = 0;
161
162     m_kwController = new KeywordController();
163     m_kwController->setDelay(m_delay);
164     m_kwController->processCommandLine(m_commandLineArgs);
165
166     m_interface = new AdapterInterface(m_adapterOpts);
167
168     QString strKeyword;
169     // Loop until empty string is received.
170     while ((strKeyword = m_interface->getKeyword()) != "") {
171
172         // Create new keyword.
173         Keyword* kw = m_kwController->createKeyword(strKeyword);
174
175         if (!kw) {
176             qCritical("Failed to create keyword.");
177             m_interface->close();
178             retVal = 1;
179             break;
180         }
181         // Increment number of valid keywords.
182         nbrOfKeywords++;
183         // Execute keyword with QtUiTest.
184         if (!m_kwController->executeKeyword(*kw)) {
185             m_interface->putResult(false);
186             m_interface->close();
187             retVal = 1;
188             break;
189         }
190         // Increment passed count.
191         if (kw->result().pass) nbrOfPassedKeywords++;
192         // Put result.
193         m_interface->putResult(kw->result().pass);
194
195         // If failed and keyword cannot fail -> quit.
196         if (!kw->result().pass && !kw->canFail()) {
197             m_interface->close();
198             retVal = 1;
199             break;
200         }
201
202         if (m_delay && m_adapterOpts.interface != AdapterContext::CommandLine)
203             QTest::qSleep(m_delay);
204         // Next keyword please...
205     };
206     // Kill started application(s).
207     m_kwController->killApplication();
208     qDebug("FINISHED!: Executed: %d. Passed: %d. Failed: %d.", nbrOfKeywords,
209            nbrOfPassedKeywords, (nbrOfKeywords - nbrOfPassedKeywords));
210
211     // Exit main loop.
212     nbrOfKeywords == 0 || nbrOfKeywords != nbrOfPassedKeywords ?
213             exit(1) : exit(0);
214 }