Commit 1d52447f authored by hjk's avatar hjk
Browse files

debugger: work on test frame work for new dumpers

parent 25d75c7f
......@@ -43,6 +43,13 @@
using namespace Debugger;
using namespace Debugger::Internal;
/////////////////////////////////////////////////////////////////////////
//
// Helper stuff
//
/////////////////////////////////////////////////////////////////////////
typedef QList<QByteArray> QByteArrayList;
#if 0
......@@ -127,6 +134,7 @@ signals:
void writeToGdb(const QByteArray &ba);
private slots:
void dumpQList_int();
void dumpQString();
void dumpQStringList();
......@@ -146,7 +154,6 @@ public slots:
void dumpQImage();
void dumpQImageData();
void dumpQLinkedList();
void dumpQList_int();
void dumpQList_char();
void dumpQList_QString();
void dumpQList_QString3();
......@@ -1151,51 +1158,6 @@ void tst_Gdb::dumpQLinkedList()
}
#endif
void tst_Gdb::dumpQList_int()
{
QList<int> ilist;
testDumper("value='<0 items>',valuedisabled='true',numchild='0',"
"internal='1',children=[]",
&ilist, NS"QList", true, "int");
ilist.append(1);
ilist.append(2);
testDumper("value='<2 items>',valuedisabled='true',numchild='2',"
"internal='1',childtype='int',childnumchild='0',children=["
"{addr='" + str(&ilist.at(0)) + "',value='1'},"
"{addr='" + str(&ilist.at(1)) + "',value='2'}]",
&ilist, NS"QList", true, "int");
}
void tst_Gdb::dumpQList_char()
{
QList<char> clist;
testDumper("value='<0 items>',valuedisabled='true',numchild='0',"
"internal='1',children=[]",
&clist, NS"QList", true, "char");
clist.append('a');
clist.append('b');
testDumper("value='<2 items>',valuedisabled='true',numchild='2',"
"internal='1',childtype='char',childnumchild='0',children=["
"{addr='" + str(&clist.at(0)) + "',value=''a', ascii=97'},"
"{addr='" + str(&clist.at(1)) + "',value=''b', ascii=98'}]",
&clist, NS"QList", true, "char");
}
void tst_Gdb::dumpQList_QString()
{
QList<QString> slist;
testDumper("value='<0 items>',valuedisabled='true',numchild='0',"
"internal='1',children=[]",
&slist, NS"QList", true, NS"QString");
slist.append("a");
slist.append("b");
testDumper("value='<2 items>',valuedisabled='true',numchild='2',"
"internal='1',childtype='"NS"QString',childnumchild='0',children=["
"{addr='" + str(&slist.at(0)) + "',value='YQA=',valueencoded='2'},"
"{addr='" + str(&slist.at(1)) + "',value='YgA=',valueencoded='2'}]",
&slist, NS"QList", true, NS"QString");
}
void tst_Gdb::dumpQList_Int3()
{
QList<Int3> i3list;
......@@ -2130,13 +2092,12 @@ void tst_Gdb::dumpQWeakPointer()
}
#endif // #if 0
#define VERIFY_OFFSETOF(member) \
do { \
QObjectPrivate *qob = 0; \
ObjectPrivate *ob = 0; \
QVERIFY(size_t(&qob->member) == size_t(&ob->member)); \
} while (0)
/////////////////////////////////////////////////////////////////////////
//
// Gdb Thread
//
/////////////////////////////////////////////////////////////////////////
Thread::Thread(tst_Gdb *test)
{
......@@ -2161,20 +2122,24 @@ Thread::Thread(tst_Gdb *test)
start();
}
void Thread::handleGdbError(QProcess::ProcessError)
void Thread::handleGdbError(QProcess::ProcessError error)
{
qDebug() << "GDB ERROR: ";
qDebug() << "GDB ERROR: " << error;
//this->exit();
}
void Thread::handleGdbFinished(int, QProcess::ExitStatus)
void Thread::handleGdbFinished(int code, QProcess::ExitStatus st)
{
qDebug() << "GDB FINISHED: ";
qDebug() << "GDB FINISHED: " << code << st;
//m_waitCondition.wakeAll();
//this->exit();
throw 42;
}
void Thread::readStandardOutput()
{
QByteArray ba = m_proc->readAllStandardOutput();
//DEBUGX("THREAD GDB OUT: " << ba);
DEBUG("THREAD GDB OUT: " << ba);
// =library-loaded...
if (ba.startsWith("="))
return;
......@@ -2206,9 +2171,9 @@ void Thread::readStandardOutput()
if (ba.startsWith("~\"XXX: ")) {
QByteArray ba1 = ba.mid(7, ba.size() - 11);
qWarning() << "MESSAGE: " << ba.mid(7, ba.size() - 11);
qWarning() << "MESSAGE: " << ba.mid(7, ba.size() - 12);
}
if (!ba.startsWith("~\"locals="))
if (!ba.contains("locals={iname="))
return;
//m_output += ba;
ba = ba.mid(2, ba.size() - 4);
......@@ -2240,11 +2205,18 @@ void Thread::run()
exec();
}
/////////////////////////////////////////////////////////////////////////
//
// Test Class Framework Implementation
//
/////////////////////////////////////////////////////////////////////////
tst_Gdb::tst_Gdb()
: m_thread(this)
{
// FIXME: Wait until gdb proc is running.
QTest::qWait(300);
QTest::qWait(600);
QFile file("tst_gdb.cpp");
Q_ASSERT(file.open(QIODevice::ReadOnly));
......@@ -2275,7 +2247,7 @@ void tst_Gdb::run(const QByteArray &label,
const QByteArray &expected0, const QByteArray &expanded)
{
//qDebug() << "\nABOUT TO RUN TEST: " << function << m_thread.m_proc;
writeToGdb("bb " + expanded);
writeToGdb("bb 1 " + expanded);
m_mutex.lock();
m_waitCondition.wait(&m_mutex);
QByteArray ba = m_thread.m_output;
......@@ -2286,7 +2258,7 @@ void tst_Gdb::run(const QByteArray &label,
//qDebug() << "OUTPUT: " << ba << "\n\n";
//qDebug() << "OUTPUT: " << locals.toString() << "\n\n";
QByteArray actual____ = received;
QByteArray actual____ = received.trimmed();
QByteArray expected = "locals={iname='local',name='Locals',value=' ',type=' ',"
"children=[" + expected0 + "]}";
int line = m_thread.m_line;
......@@ -2323,6 +2295,7 @@ void tst_Gdb::run(const QByteArray &label,
ok = false;
qWarning() << "!= size: " << l1.size() << l2.size();
}
qWarning() << "RECEIVED: " << received;
}
QCOMPARE(ok, true);
qWarning() << "LINE: " << line << "ACT/EXP" << m_function + '@' + label;
......@@ -2350,27 +2323,102 @@ void tst_Gdb::cleanupTestCase()
//m_thread.m_proc->waitForFinished();
}
/////////////////////////////////////////////////////////////////////////
//
// Dumper Tests
//
/////////////////////////////////////////////////////////////////////////
void dumpQList_int()
{
/* A */ QList<int> ilist;
/* B */ ilist.append(1);
/* C */ ilist.append(2);
/* D */ (void) 0;
}
void tst_Gdb::dumpQList_int()
{
prepare("dumpQList_int");
run("A","{iname='local.ilist',addr='-',name='ilist',"
"type='"NS"QList<int>',value='<not in scope>',numchild='0'}");
next();
run("B","{iname='local.ilist',addr='-',name='ilist',"
"type='"NS"QList<int>',value='<0 items>',numchild='0'}");
next();
run("C","{iname='local.ilist',addr='-',name='ilist',"
"type='"NS"QList<int>',value='<1 items>',numchild='1'}");
//run("C","{iname='local.ilist',addr='-',name='ilist',"
// "type='"NS"QList<int>',value='<1 items>',numchild='1',"
// "childtype='int',childnumchild='0',children=["
// "{value='1'}]}", "local.ilist");
/*
next();
run("D","{iname='local.ilist',addr='-',name='ilist',"
"type='"NS"QList<int>',value='<2 items>',numchild='2',"
"childtype='int',childnumchild='0'}");
run("D","{iname='local.ilist',addr='-',name='ilist',"
"type='"NS"QList<int>',value='<2 items>',numchild='2',"
"childtype='int',childnumchild='0',children=["
"{addr='-',value='1'},{addr='-',value='2'}]}", "local.ilist");
*/
}
/*
void tst_Gdb::dumpQList_char()
{
QList<char> clist;
testDumper("value='<0 items>',valuedisabled='true',numchild='0',"
"internal='1',children=[]",
&clist, NS"QList", true, "char");
clist.append('a');
clist.append('b');
testDumper("value='<2 items>',valuedisabled='true',numchild='2',"
"internal='1',childtype='char',childnumchild='0',children=["
"{addr='" + str(&clist.at(0)) + "',value=''a', ascii=97'},"
"{addr='" + str(&clist.at(1)) + "',value=''b', ascii=98'}]",
&clist, NS"QList", true, "char");
}
void tst_Gdb::dumpQList_QString()
{
QList<QString> slist;
testDumper("value='<0 items>',valuedisabled='true',numchild='0',"
"internal='1',children=[]",
&slist, NS"QList", true, NS"QString");
slist.append("a");
slist.append("b");
testDumper("value='<2 items>',valuedisabled='true',numchild='2',"
"internal='1',childtype='"NS"QString',childnumchild='0',children=["
"{addr='" + str(&slist.at(0)) + "',value='YQA=',valueencoded='2'},"
"{addr='" + str(&slist.at(1)) + "',value='YgA=',valueencoded='2'}]",
&slist, NS"QList", true, NS"QString");
}
*/
void dumpQStringTest()
{
/* A */ QString s;
/* B */ s = "hallo";
/* C */ s += "x";
/* D */ }
/* D */ (void) 0;
}
void tst_Gdb::dumpQString()
{
prepare("dumpQStringTest");
run("A", "{iname='local.s',addr='-',name='s',type='"NS"QString',"
"value='<not in scope>',numchild='0'}");
run("A","{iname='local.s',addr='-',name='s',type='"NS"QString',"
"value='<not in scope>',numchild='0'}");
next();
run("B", "{iname='local.s',addr='-',name='s',type='"NS"QString',"
"valueencoded='7',value='',numchild='0'}");
run("B","{iname='local.s',addr='-',name='s',type='"NS"QString',"
"valueencoded='7',value='',numchild='0'}");
next();
run("C", "{iname='local.s',addr='-',name='s',type='"NS"QString',"
"valueencoded='7',value='680061006c006c006f00',numchild='0'}");
run("C","{iname='local.s',addr='-',name='s',type='"NS"QString',"
"valueencoded='7',value='680061006c006c006f00',numchild='0'}");
next();
run("D", "{iname='local.s',addr='-',name='s',type='"NS"QString',"
"valueencoded='7',value='680061006c006c006f007800',numchild='0'}");
run("D","{iname='local.s',addr='-',name='s',type='"NS"QString',"
"valueencoded='7',value='680061006c006c006f007800',numchild='0'}");
}
void dumpQStringListTest()
......@@ -2378,30 +2426,45 @@ void dumpQStringListTest()
/* A */ QStringList s;
/* B */ s.append("hello");
/* C */ s.append("world");
/* D */ (void) 0;
}
void tst_Gdb::dumpQStringList()
{
prepare("dumpQStringListTest");
run("A", "{iname='local.s',addr='-',name='s',type='"NS"QStringList',"
"value='<not in scope>',numchild='0'}");
run("A","{iname='local.s',addr='-',name='s',type='"NS"QStringList',"
"value='<not in scope>',numchild='0'}");
next();
run("B","{iname='local.s',addr='-',name='s',type='"NS"QStringList',"
"value='<0 items>',numchild='0'}");
run("B","{iname='local.s',addr='-',name='s',type='"NS"QStringList',"
"value='<0 items>',numchild='0',children=[]}", "local.s");
next();
//run("B", "{iname='local.s',addr='-',name='s',type='"NS"QStringList',"
// "value='<0 items>',numchild='0'}");
run("B", "{iname='local.s',addr='-',name='s',type='"NS"QStringList',"
"value='<0 items>',numchild='0'}", "local.s");
run("C","{iname='local.s',addr='-',name='s',type='"NS"QStringList',"
"value='<1 items>',numchild='1'}");
run("C","{iname='local.s',addr='-',name='s',type='"NS"QStringList',"
"value='<1 items>',numchild='1',childtype='"NS"QString',"
"childnumchild='0',children=[{valueencoded='7',"
"value='680065006c006c006f00'}]}",
"local.s");
return;
next();
run("C", "{iname='local.s',addr='-',name='s',type='"NS"QStringList',"
"value='<1 items>',numchild='1'}");
run("D","{iname='local.s',addr='-',name='s',type='"NS"QStringList',"
"value='<2 items>',numchild='2'}");
run("D","{iname='local.s',addr='-',name='s',type='"NS"QStringList',"
"value='<2 items>',numchild='2',childtype='"NS"QString',"
"childnumchild='0',children=["
"{valueencoded='7',value='680065006c006c006f00'},"
"{valueencoded='7',value='77006f0072006c006400'}]}",
"local.s");
}
int runit(int &argc, char *argv[])
{
// Plain call. Start the testing.
QCoreApplication app(argc, argv);
tst_Gdb test;
return QTest::qExec(&test, argc, argv);
}
/////////////////////////////////////////////////////////////////////////
//
// Main
//
/////////////////////////////////////////////////////////////////////////
int main(int argc, char *argv[])
{
......@@ -2411,7 +2474,14 @@ int main(int argc, char *argv[])
return 0;
}
return runit(argc, argv);
try {
// Plain call. Start the testing.
QCoreApplication app(argc, argv);
tst_Gdb *test = new tst_Gdb;
return QTest::qExec(test, argc, argv);
} catch (...) {
qDebug() << "TEST ABORTED ";
}
}
#include "tst_gdb.moc"
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment