forked from qt-creator/qt-creator
Valgrind test: Hide Recorder and Dumper in cpp file
Inline Recorder's and Dumper's slots. Clean some namespace specifiers. Change-Id: I1111e8fb3c912dc1f253ebb2ed7f8e9c3fff67e0 Reviewed-by: hjk <hjk@qt.io> Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
This commit is contained in:
@@ -3,23 +3,21 @@
|
|||||||
|
|
||||||
#include "valgrindmemcheckparsertest.h"
|
#include "valgrindmemcheckparsertest.h"
|
||||||
|
|
||||||
|
#include "valgrindrunner.h"
|
||||||
|
#include "xmlprotocol/error.h"
|
||||||
#include "xmlprotocol/frame.h"
|
#include "xmlprotocol/frame.h"
|
||||||
#include "xmlprotocol/parser.h"
|
#include "xmlprotocol/parser.h"
|
||||||
#include "xmlprotocol/stack.h"
|
#include "xmlprotocol/stack.h"
|
||||||
|
#include "xmlprotocol/status.h"
|
||||||
#include "xmlprotocol/suppression.h"
|
#include "xmlprotocol/suppression.h"
|
||||||
|
|
||||||
#include <projectexplorer/projectexplorer.h>
|
|
||||||
#include <projectexplorer/runconfiguration.h>
|
|
||||||
#include <projectexplorer/runcontrol.h>
|
#include <projectexplorer/runcontrol.h>
|
||||||
|
|
||||||
#include <QFile>
|
|
||||||
#include <QFileInfo>
|
#include <QFileInfo>
|
||||||
#include <QProcess>
|
#include <QProcess>
|
||||||
#include <QString>
|
|
||||||
#include <QTest>
|
|
||||||
#include <QTcpServer>
|
#include <QTcpServer>
|
||||||
#include <QTcpSocket>
|
#include <QTcpSocket>
|
||||||
#include <QSignalSpy>
|
#include <QTest>
|
||||||
|
|
||||||
using namespace Utils;
|
using namespace Utils;
|
||||||
using namespace Valgrind::XmlProtocol;
|
using namespace Valgrind::XmlProtocol;
|
||||||
@@ -43,16 +41,9 @@ inline bool qCompare(const QString &t1, char const *t2,
|
|||||||
} // namespace QTest
|
} // namespace QTest
|
||||||
QT_END_NAMESPACE
|
QT_END_NAMESPACE
|
||||||
|
|
||||||
namespace Valgrind {
|
namespace Valgrind::Test {
|
||||||
namespace Test {
|
|
||||||
|
|
||||||
static void dumpFrame(const Frame &f)
|
static void dumpError(const Error &e)
|
||||||
{
|
|
||||||
qDebug() << f.instructionPointer() << f.directory() << f.fileName() << f.functionName()
|
|
||||||
<< f.line() << f.object();
|
|
||||||
}
|
|
||||||
|
|
||||||
void dumpError(const Error &e)
|
|
||||||
{
|
{
|
||||||
qDebug() << e.kind() << e.leakedBlocks() << e.leakedBytes() << e.what() << e.tid() << e.unique();
|
qDebug() << e.kind() << e.leakedBlocks() << e.leakedBytes() << e.what() << e.tid() << e.unique();
|
||||||
qDebug() << "stacks:" << e.stacks().size();
|
qDebug() << "stacks:" << e.stacks().size();
|
||||||
@@ -60,15 +51,61 @@ void dumpError(const Error &e)
|
|||||||
qDebug() << s.auxWhat() << s.directory() << s.file() << s.line() << s.helgrindThreadId();
|
qDebug() << s.auxWhat() << s.directory() << s.file() << s.line() << s.helgrindThreadId();
|
||||||
qDebug() << "frames:";
|
qDebug() << "frames:";
|
||||||
for (const Frame &f : s.frames()) {
|
for (const Frame &f : s.frames()) {
|
||||||
dumpFrame(f);
|
qDebug() << f.instructionPointer() << f.directory() << f.fileName() << f.functionName()
|
||||||
|
<< f.line() << f.object();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class Recorder : public QObject
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
explicit Recorder(Parser *parser)
|
||||||
|
{
|
||||||
|
connect(parser, &Parser::error, this, [this](const Error &err) { errors.append(err); });
|
||||||
|
connect(parser, &Parser::errorCount, this, [this](qint64 unique, qint64 count) {
|
||||||
|
errorcounts.push_back({unique, count});
|
||||||
|
});
|
||||||
|
connect(parser, &Parser::suppressionCount, this, [this](const QString &name, qint64 count) {
|
||||||
|
suppcounts.push_back({name, count});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
QList<Error> errors;
|
||||||
|
QList<QPair<qint64, qint64>> errorcounts;
|
||||||
|
QList<QPair<QString, qint64>> suppcounts;
|
||||||
|
};
|
||||||
|
|
||||||
|
class RunnerDumper : public QObject
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
explicit RunnerDumper(ValgrindRunner *runner)
|
||||||
|
{
|
||||||
|
connect(runner, &ValgrindRunner::error, this, [](const Error &err) {
|
||||||
|
qDebug() << "error received";
|
||||||
|
dumpError(err);
|
||||||
|
});
|
||||||
|
connect(runner, &ValgrindRunner::internalError, this, [](const QString &err) {
|
||||||
|
qDebug() << "internal error received:" << err;
|
||||||
|
});
|
||||||
|
connect(runner, &ValgrindRunner::status, this, [](const Status &status) {
|
||||||
|
qDebug() << "status received:" << status.state() << status.time();
|
||||||
|
});
|
||||||
|
connect(runner, &ValgrindRunner::logMessageReceived, this, [](const QByteArray &log) {
|
||||||
|
qDebug() << "log message received:" << log;
|
||||||
|
});
|
||||||
|
connect(runner, &ValgrindRunner::processErrorReceived, this, [this](const QString &) {
|
||||||
|
m_errorReceived = true;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
bool m_errorReceived = false;
|
||||||
|
};
|
||||||
|
|
||||||
static QString fakeValgrindExecutable()
|
static QString fakeValgrindExecutable()
|
||||||
{
|
{
|
||||||
QString valgrindFakePath(VALGRIND_FAKE_PATH);
|
const QString valgrindFakePath(VALGRIND_FAKE_PATH);
|
||||||
if (Utils::HostOsInfo::isWindowsHost()) {
|
if (HostOsInfo::isWindowsHost()) {
|
||||||
QFileInfo fi(QString(valgrindFakePath + "/debug"), "valgrind-fake.exe");
|
QFileInfo fi(QString(valgrindFakePath + "/debug"), "valgrind-fake.exe");
|
||||||
if (fi.exists())
|
if (fi.exists())
|
||||||
return fi.canonicalFilePath();
|
return fi.canonicalFilePath();
|
||||||
@@ -465,7 +502,7 @@ void ValgrindMemcheckParserTest::testParserStop()
|
|||||||
|
|
||||||
void ValgrindMemcheckParserTest::testRealValgrind()
|
void ValgrindMemcheckParserTest::testRealValgrind()
|
||||||
{
|
{
|
||||||
const Utils::Environment &sysEnv = Utils::Environment::systemEnvironment();
|
const Environment &sysEnv = Environment::systemEnvironment();
|
||||||
auto fileName = sysEnv.searchInPath("valgrind");
|
auto fileName = sysEnv.searchInPath("valgrind");
|
||||||
if (fileName.isEmpty())
|
if (fileName.isEmpty())
|
||||||
QSKIP("This test needs valgrind in PATH");
|
QSKIP("This test needs valgrind in PATH");
|
||||||
@@ -510,7 +547,7 @@ void ValgrindMemcheckParserTest::testValgrindStartError()
|
|||||||
ProjectExplorer::Runnable debuggeeExecutable;
|
ProjectExplorer::Runnable debuggeeExecutable;
|
||||||
debuggeeExecutable.command.setExecutable(FilePath::fromString(debuggee));
|
debuggeeExecutable.command.setExecutable(FilePath::fromString(debuggee));
|
||||||
debuggeeExecutable.command.setArguments(debuggeeArgs);
|
debuggeeExecutable.command.setArguments(debuggeeArgs);
|
||||||
debuggeeExecutable.environment = Utils::Environment::systemEnvironment();
|
debuggeeExecutable.environment = Environment::systemEnvironment();
|
||||||
|
|
||||||
ValgrindRunner runner;
|
ValgrindRunner runner;
|
||||||
runner.setValgrindCommand({FilePath::fromString(valgrindExe), valgrindArgs});
|
runner.setValgrindCommand({FilePath::fromString(valgrindExe), valgrindArgs});
|
||||||
@@ -522,5 +559,4 @@ void ValgrindMemcheckParserTest::testValgrindStartError()
|
|||||||
// just finish without deadlock and we are fine
|
// just finish without deadlock and we are fine
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace Test
|
} // namespace Valgrind::Test
|
||||||
} // namespace Valgrind
|
|
||||||
|
|||||||
@@ -4,103 +4,15 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <QObject>
|
#include <QObject>
|
||||||
#include <QPair>
|
|
||||||
#include <QStringList>
|
#include <QStringList>
|
||||||
#include <QVector>
|
|
||||||
#include <QDebug>
|
|
||||||
|
|
||||||
#include "xmlprotocol/error.h"
|
|
||||||
#include "xmlprotocol/status.h"
|
|
||||||
#include "xmlprotocol/parser.h"
|
|
||||||
#include "valgrindrunner.h"
|
|
||||||
|
|
||||||
QT_BEGIN_NAMESPACE
|
QT_BEGIN_NAMESPACE
|
||||||
|
class QProcess;
|
||||||
class QTcpServer;
|
class QTcpServer;
|
||||||
class QTcpSocket;
|
class QTcpSocket;
|
||||||
class QProcess;
|
|
||||||
QT_END_NAMESPACE
|
QT_END_NAMESPACE
|
||||||
|
|
||||||
namespace Valgrind {
|
namespace Valgrind::Test {
|
||||||
namespace Test {
|
|
||||||
|
|
||||||
void dumpError(const Valgrind::XmlProtocol::Error &e);
|
|
||||||
|
|
||||||
class Recorder : public QObject
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
explicit Recorder(XmlProtocol::Parser *parser)
|
|
||||||
{
|
|
||||||
connect(parser, &XmlProtocol::Parser::error,
|
|
||||||
this, &Recorder::error);
|
|
||||||
connect(parser, &XmlProtocol::Parser::errorCount,
|
|
||||||
this, &Recorder::errorCount);
|
|
||||||
connect(parser, &XmlProtocol::Parser::suppressionCount,
|
|
||||||
this, &Recorder::suppressionCount);
|
|
||||||
}
|
|
||||||
|
|
||||||
QList<Valgrind::XmlProtocol::Error> errors;
|
|
||||||
QVector<QPair<qint64,qint64> > errorcounts;
|
|
||||||
QVector<QPair<QString,qint64> > suppcounts;
|
|
||||||
|
|
||||||
public:
|
|
||||||
void error(const Valgrind::XmlProtocol::Error &err)
|
|
||||||
{
|
|
||||||
errors.append(err);
|
|
||||||
}
|
|
||||||
|
|
||||||
void errorCount(qint64 unique, qint64 count)
|
|
||||||
{
|
|
||||||
errorcounts.push_back({unique, count});
|
|
||||||
}
|
|
||||||
|
|
||||||
void suppressionCount(const QString &name, qint64 count)
|
|
||||||
{
|
|
||||||
suppcounts.push_back({name, count});
|
|
||||||
}
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
class RunnerDumper : public QObject
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
explicit RunnerDumper(ValgrindRunner *runner)
|
|
||||||
{
|
|
||||||
connect(runner, &ValgrindRunner::error, this, &RunnerDumper::error);
|
|
||||||
connect(runner, &ValgrindRunner::internalError, this, &RunnerDumper::internalError);
|
|
||||||
connect(runner, &ValgrindRunner::status, this, &RunnerDumper::status);
|
|
||||||
connect(runner, &ValgrindRunner::logMessageReceived,
|
|
||||||
this, &RunnerDumper::logMessageReceived);
|
|
||||||
connect(runner, &ValgrindRunner::processErrorReceived,
|
|
||||||
this, &RunnerDumper::processErrorReceived);
|
|
||||||
}
|
|
||||||
|
|
||||||
void error(const Valgrind::XmlProtocol::Error &e)
|
|
||||||
{
|
|
||||||
qDebug() << "error received";
|
|
||||||
dumpError(e);
|
|
||||||
}
|
|
||||||
void internalError(const QString& error)
|
|
||||||
{
|
|
||||||
qDebug() << "internal error received:" << error;
|
|
||||||
}
|
|
||||||
void status(const Valgrind::XmlProtocol::Status &status)
|
|
||||||
{
|
|
||||||
qDebug() << "status received:" << status.state() << status.time();
|
|
||||||
}
|
|
||||||
void logMessageReceived(const QByteArray &log)
|
|
||||||
{
|
|
||||||
qDebug() << "log message received:" << log;
|
|
||||||
}
|
|
||||||
void processErrorReceived(const QString &s)
|
|
||||||
{
|
|
||||||
Q_UNUSED(s)
|
|
||||||
// qDebug() << "error received:" << s; // this can be a lot of text
|
|
||||||
m_errorReceived = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
public:
|
|
||||||
bool m_errorReceived = false;
|
|
||||||
};
|
|
||||||
|
|
||||||
class ValgrindMemcheckParserTest : public QObject
|
class ValgrindMemcheckParserTest : public QObject
|
||||||
{
|
{
|
||||||
@@ -125,12 +37,11 @@ private slots:
|
|||||||
void testValgrindStartError();
|
void testValgrindStartError();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void initTest(const QString &testfile, const QStringList &otherArgs = QStringList());
|
void initTest(const QString &testfile, const QStringList &otherArgs = {});
|
||||||
|
|
||||||
QTcpServer *m_server = nullptr;
|
QTcpServer *m_server = nullptr;
|
||||||
QProcess *m_process = nullptr;
|
QProcess *m_process = nullptr;
|
||||||
QTcpSocket *m_socket = nullptr;
|
QTcpSocket *m_socket = nullptr;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace Test
|
} // namespace Valgrind::Test
|
||||||
} // namespace Valgrind
|
|
||||||
|
|||||||
Reference in New Issue
Block a user