Test your websites with this simple GUI based scripted webtester. Generate simple testscripts directly from surfng on the webpage, enhance them with your commands, with variables, loops, checks, … and finally run automated web tests.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

266 lines
7.1 KiB

/*! @file
@id $Id$
*/
// 1 2 3 4 5 6 7 8
// 45678901234567890123456789012345678901234567890123456789012345678901234567890
#ifndef EXCEPTIONS_HXX
#define EXCEPTIONS_HXX
#include <stdexcept>
#include <queue>
#include <QDir>
class Exception: public std::exception {
public:
Exception(QString w): _what(w) {}
~Exception() throw() {}
const char* what() const throw() {
return _what.toStdString().c_str();
}
void line(int linenr) {
if (linenr>0) _what=QString::number(linenr)+" "+_what;
}
void file(QString filename) {
if (filename.size()) _what=filename+":"+_what;
}
protected:
QString _what;
};
class ParseError: public Exception {
public:
ParseError(QString w): Exception("parse error: "+w) {}
};
class UnknownCommand: public ParseError {
public:
UnknownCommand(QString line): ParseError("unknown command: \""+line+"\"") {}
};
class BadArgument: public ParseError {
public:
BadArgument(QString arg): ParseError("bad argument: "+arg) {}
};
class MissingArguments: public ParseError {
public:
MissingArguments(QString args, QString req):
ParseError("missing arguments, requires "+req+", got: "+args) {}
};
class TestFailed: public Exception {
public:
TestFailed(QString why): Exception("Test Failed: "+why) {}
};
class PossibleRetryLoad: public TestFailed {
public:
PossibleRetryLoad(QString txt): TestFailed(txt) {}
};
class WrongSignal: public PossibleRetryLoad {
public:
WrongSignal(QString signal, QStringList args,
std::pair<QString, QStringList> received):
PossibleRetryLoad
("expected: \""+signal+" "+args.join(' ')+"\"; "
"received: \""+received.first+" "+received.second.join(' ')+"\"") {
}
};
class UnhandledSignals: public TestFailed {
public:
typedef std::pair<QString, QStringList> Signal;
UnhandledSignals(std::queue<Signal> sigs):
TestFailed("unhandled signals:") {
while (!sigs.empty()) {
Signal res(sigs.front());
_what += "\n"+res.first+" "+res.second.join(' ');
sigs.pop();
}
}
};
class TimeOut: public PossibleRetryLoad {
public:
TimeOut(): PossibleRetryLoad("command timeout") {}
};
class ElementNotFound: public TestFailed {
public:
ElementNotFound(QString selector):
TestFailed("element not found: "+selector) {}
};
class DirectoryCannotBeCreated: public TestFailed {
public:
DirectoryCannotBeCreated(QString name):
TestFailed("cannot create directory: "+name) {}
};
class CannotWriteScreenshot: public TestFailed {
public:
CannotWriteScreenshot(QString name):
TestFailed("cannot write screenshot: "+name) {}
};
class CannotWriteSouceHTML: public TestFailed {
public:
CannotWriteSouceHTML(QString name):
TestFailed("cannot write html source code: "+name) {}
};
class FileNotFound: public TestFailed {
public:
FileNotFound(QString arg): TestFailed("file not found: "+arg) {}
};
class NotACertificate: public TestFailed {
public:
NotACertificate(QString arg):
TestFailed("file is not a certificate: "+arg) {
}
};
class KeyNotReadable: public TestFailed {
public:
KeyNotReadable(QString arg):
TestFailed("key file is not readable (password?): "+arg) {
}
};
class NotUnattended: public TestFailed {
public:
NotUnattended(): TestFailed("web page is not in unattended test mode") {}
};
class LastFileNotUploaded: public TestFailed {
public:
LastFileNotUploaded(QString arg):
TestFailed("last specified upload file has not been uploaded: "+arg) {
}
};
class EmptyUploadFile: public TestFailed {
public:
EmptyUploadFile(): TestFailed("specified upload file is empty string") {}
};
class NoUploadFile: public TestFailed {
public:
NoUploadFile(): TestFailed("no upload file specified") {}
};
class SetFileUploadFailed: public TestFailed {
public:
SetFileUploadFailed(QString selector, QString filename):
TestFailed("set file upload failed for selector "+selector
+" and file "+filename) {
}
};
class AssertionFailed: public TestFailed {
public:
AssertionFailed(QString text):
TestFailed("assertion failed: "+text) {
}
};
class DownloadFailed: public TestFailed {
public:
DownloadFailed(QString file):
TestFailed("download failed of file \""+file+"\"") {
}
};
class WriteFileFailed: public TestFailed {
public:
WriteFileFailed(QString file):
TestFailed("write failed of file \""+QDir(file).absolutePath()+"\"") {
}
};
class ScriptFailed: public TestFailed {
public:
ScriptFailed(QString dsc, QString cmd, QStringList args, QString script):
TestFailed(dsc+"; command: "+cmd
+(args.size()?" "+args.join(' '):QString())
+(script.size()?"\n"+script:QString())) {
}
};
class CannotStartScript: public ScriptFailed {
public:
CannotStartScript(QString command, QStringList args, QString script):
ScriptFailed("command not found", command, args, script) {
}
};
class CannotLoadScript: public ScriptFailed {
public:
CannotLoadScript(QString command, QStringList args, QString script):
ScriptFailed("cannot load script data", command, args, script) {
}
};
class ScriptNotFinished: public ScriptFailed {
public:
ScriptNotFinished(QString command, QStringList args, QString script):
ScriptFailed("command hangs, timeout", command, args, script) {
}
};
class ScriptExecutionFailed: public ScriptFailed {
public:
ScriptExecutionFailed(QString command, QStringList args, QString script,
int code, QString stdout, QString stderr):
ScriptFailed("failed with exit code "+QString::number(code)
+(stdout.size()?"; stdout=\""+stdout+"\"":"")
+(stderr.size()?"; stderr=\""+stderr+"\"":""),
command, args, script) {
}
};
class WrongNumberOfArguments: public TestFailed {
public:
WrongNumberOfArguments(QStringList vars, QStringList args):
TestFailed(QString("function has %1 arguments, but %2 were given")
.arg(vars.size()).arg(args.size())) {
}
};
class FunctionCallFailed: public TestFailed {
public:
FunctionCallFailed(QString name, QStringList vars, QStringList args,
const std::exception& x):
TestFailed("function call failed: "+name) {
for (QStringList::iterator var(vars.begin()), arg(args.begin());
var<vars.end() && arg<args.end(); ++var, ++arg)
_what += " "+*var+"="+*arg;
_what += QString("; reason: ")+x.what();
}
};
class FunctionNotFound: public TestFailed {
public:
FunctionNotFound(QString name): TestFailed("function not found: "+name) {
}
};
class VariableNotFound: public TestFailed {
public:
VariableNotFound(QString name):
TestFailed("variable not found: "+name) {
}
};
class CheckFailed: public TestFailed {
public:
CheckFailed(QString value1, char cmp, QString value2):
TestFailed(QString("check failed: %1 %2 %3")
.arg(value1).arg(cmp).arg(value1)) {
}
};
#endif