23
23
#include <QSharedPointer>
25
25
#define DATA_DIR "backtraceparsertest_data"
26
#define TEST_PREFIX "test_"
27
#define MAP_FILE "usefulness_map"
29
void BacktraceGenerator::sendData(const QString & filename)
32
file.open(QIODevice::ReadOnly | QIODevice::Text);
33
QTextStream stream(&file);
36
while (!stream.atEnd()) {
37
emit newLine(stream.readLine() + '\n');
39
emit newLine(QString());
26
#define SETTINGS_FILE "data.ini"
42
28
BacktraceParserTest::BacktraceParserTest(QObject *parent)
43
: QObject(parent), m_generator(new BacktraceGenerator(this))
47
void BacktraceParserTest::readMap(QHash<QByteArray, BacktraceParser::Usefulness> & map)
49
QMetaEnum metaUsefulness = BacktraceParser::staticMetaObject.enumerator(
50
BacktraceParser::staticMetaObject.indexOfEnumerator("Usefulness"));
52
QFile mapFile(DATA_DIR "/" MAP_FILE);
53
if ( !mapFile.open(QIODevice::ReadOnly | QIODevice::Text) ) {
54
qFatal("Could not open \"" DATA_DIR "/" MAP_FILE "\".");
57
while ( !mapFile.atEnd() ) {
58
QByteArray line = mapFile.readLine();
59
if ( line.isEmpty() ) continue;
60
QList<QByteArray> tokens = line.split(':');
61
Q_ASSERT(tokens.size() == 2);
62
map.insert( tokens[0].trimmed(), (BacktraceParser::Usefulness) metaUsefulness.keyToValue(tokens[1].trimmed().constData()) );
66
void BacktraceParserTest::btParserTest_data()
30
m_settings(DATA_DIR "/" SETTINGS_FILE, QSettings::IniFormat),
31
m_generator(new FakeBacktraceGenerator(this))
35
void BacktraceParserTest::fetchData(const QString & group)
68
37
QTest::addColumn<QString>("filename");
69
QTest::addColumn<BacktraceParser::Usefulness>("result");
71
if ( !QFileInfo(DATA_DIR).isDir() ) {
72
qFatal("Could not find the \"" DATA_DIR "\" directory in the current directory.");
75
QHash<QByteArray, BacktraceParser::Usefulness> map;
78
QDirIterator it(DATA_DIR, QStringList() << TEST_PREFIX"*", QDir::Files|QDir::Readable);
79
while (it.hasNext()) {
81
QTest::newRow(it.fileName().toLocal8Bit().constData())
83
<< map.value(it.fileName().toLocal8Bit(), BacktraceParser::InvalidUsefulness);
87
void BacktraceParserTest::btParserTest()
38
QTest::addColumn<QString>("result");
39
QTest::addColumn<QString>("debugger");
41
m_settings.beginGroup(group);
42
QStringList keys = m_settings.allKeys();
43
m_settings.endGroup();
45
foreach(const QString & key, keys) {
46
QTest::newRow(key.toLocal8Bit())
48
<< m_settings.value(group + "/" + key).toString()
49
<< m_settings.value("debugger/" + key).toString();
53
void BacktraceParserTest::btParserUsefulnessTest_data()
55
fetchData("usefulness");
58
void BacktraceParserTest::btParserUsefulnessTest()
89
60
QFETCH(QString, filename);
90
QFETCH(BacktraceParser::Usefulness, result);
91
QVERIFY2(result != BacktraceParser::InvalidUsefulness, "Invalid usefulness. There is an error in the " MAP_FILE " file");
93
QMetaEnum metaUsefulness = BacktraceParser::staticMetaObject.enumerator(
94
BacktraceParser::staticMetaObject.indexOfEnumerator("Usefulness"));
96
QSharedPointer<BacktraceParser> parser(BacktraceParser::newParser("gdb"));
61
QFETCH(QString, result);
62
QFETCH(QString, debugger);
65
QSharedPointer<BacktraceParser> parser(BacktraceParser::newParser(debugger));
97
66
parser->connectToGenerator(m_generator);
98
67
m_generator->sendData(filename);
100
QTextStream(stdout) << "\n(" << QFileInfo(filename).fileName() << "): Received: "
101
<< metaUsefulness.valueToKey(parser->backtraceUsefulness())
102
<< " Expected: " << metaUsefulness.valueToKey(result) << endl;
104
QTextStream(stdout) << "First valid functions: " << parser->firstValidFunctions().join(" ") << endl;
105
QTextStream(stdout) << "Simplified backtrace:\n" << parser->simplifiedBacktrace() << endl;
106
QStringList l = (QStringList)parser->librariesWithMissingDebugSymbols().toList();
107
QTextStream(stdout) << "Missing dbgsym libs: " << l.join(" ") << endl;
69
//convert usefulness to string
70
QMetaEnum metaUsefulness = BacktraceParser::staticMetaObject.enumerator(
71
BacktraceParser::staticMetaObject.indexOfEnumerator("Usefulness"));
72
QString btUsefulness = metaUsefulness.valueToKey(parser->backtraceUsefulness());
109
75
QEXPECT_FAIL("test_e", "Working on it", Continue);
110
QCOMPARE(parser->backtraceUsefulness(), result);
76
QCOMPARE(btUsefulness, result);
79
void BacktraceParserTest::btParserFunctionsTest_data()
81
fetchData("firstValidFunctions");
84
void BacktraceParserTest::btParserFunctionsTest()
86
QFETCH(QString, filename);
87
QFETCH(QString, result);
88
QFETCH(QString, debugger);
91
QSharedPointer<BacktraceParser> parser(BacktraceParser::newParser(debugger));
92
parser->connectToGenerator(m_generator);
93
m_generator->sendData(filename);
96
QString functions = parser->firstValidFunctions().join("|");
97
QCOMPARE(functions, result);
113
100
void BacktraceParserTest::btParserBenchmark_data()
115
btParserTest_data(); //use the same data for the benchmark
102
QTest::addColumn<QString>("filename");
103
QTest::addColumn<QString>("debugger");
105
m_settings.beginGroup("debugger");
106
QStringList keys = m_settings.allKeys();
107
foreach(const QString & key, keys) {
108
QTest::newRow(key.toLocal8Bit())
110
<< m_settings.value(key).toString();
112
m_settings.endGroup();
118
115
void BacktraceParserTest::btParserBenchmark()
120
117
QFETCH(QString, filename);
121
QFETCH(BacktraceParser::Usefulness, result);
122
QVERIFY2(result != BacktraceParser::InvalidUsefulness, "Invalid usefulness. There is an error in the " MAP_FILE " file");
118
QFETCH(QString, debugger);
124
QSharedPointer<BacktraceParser> parser(BacktraceParser::newParser("gdb"));
120
QSharedPointer<BacktraceParser> parser(BacktraceParser::newParser(debugger));
125
121
parser->connectToGenerator(m_generator);