summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--tests/arthur/baselineserver/src/baselineserver.cpp92
-rw-r--r--tests/arthur/baselineserver/src/baselineserver.h6
-rw-r--r--tests/arthur/baselineserver/src/htmlpage.cpp71
-rw-r--r--tests/arthur/baselineserver/src/htmlpage.h3
-rw-r--r--tests/auto/lancelot/tst_lancelot.cpp20
5 files changed, 156 insertions, 36 deletions
diff --git a/tests/arthur/baselineserver/src/baselineserver.cpp b/tests/arthur/baselineserver/src/baselineserver.cpp
index 41e48eb..072e216 100644
--- a/tests/arthur/baselineserver/src/baselineserver.cpp
+++ b/tests/arthur/baselineserver/src/baselineserver.cpp
@@ -143,11 +143,6 @@ void BaselineHandler::provideBaselineChecksums(const QByteArray &itemListBlock)
<< itemList.at(0).engineAsString() << "pixel format" << itemList.at(0).formatAsString();
for (ImageItemList::iterator i = itemList.begin(); i != itemList.end(); ++i) {
- if (i->scriptName.startsWith(QLS("porter_duff"))) {
- // Example of blacklisting on server.
- i->status = ImageItem::IgnoreItem;
- continue;
- }
i->imageChecksums.clear();
QString prefix = pathForItem(*i, true);
QFile file(prefix + QLS("metadata"));
@@ -161,11 +156,29 @@ void BaselineHandler::provideBaselineChecksums(const QByteArray &itemListBlock)
i->status = ImageItem::BaselineNotFound;
}
+ // Find and mark blacklisted items
+ if (itemList.count() > 0) {
+ QString prefix = pathForItem(itemList.at(0), true).section(QLC('/'), 0, -2);
+ QFile file(prefix + QLS("/.blacklist"));
+ if (file.open(QIODevice::ReadOnly)) {
+ QTextStream in(&file);
+ do {
+ QString scriptName = in.readLine();
+ if (!scriptName.isNull()) {
+ for (ImageItemList::iterator i = itemList.begin(); i != itemList.end(); ++i) {
+ if (i->scriptName == scriptName)
+ i->status = ImageItem::IgnoreItem;
+ }
+ }
+ } while (!in.atEnd());
+ }
+ }
+
QByteArray block;
QDataStream ods(&block, QIODevice::WriteOnly);
ods << itemList;
proto.sendBlock(BaselineProtocol::Ack, block);
- report.start(BaselineServer::storagePath(), runId, plat);
+ report.start(BaselineServer::storagePath(), runId, plat, itemList);
}
@@ -216,6 +229,14 @@ void BaselineHandler::receiveDisconnect()
}
+QString BaselineHandler::itemSubPath(const QString &engine, const QString &format, bool isBaseline)
+{
+ if (isBaseline)
+ return QString(QLS("baselines_%1_%2/")).arg(engine, format);
+ else
+ return QString(QLS("mismatches_%1_%2/")).arg(engine, format);
+}
+
QString BaselineHandler::pathForItem(const ImageItem &item, bool isBaseline, bool absolute)
{
if (pathForRun.isNull()) {
@@ -233,9 +254,9 @@ QString BaselineHandler::pathForItem(const ImageItem &item, bool isBaseline, boo
QString storePath = pathForRun;
if (isBaseline)
- storePath += QString(QLS("baselines_%1_%2/")).arg(item.engineAsString(), item.formatAsString());
+ storePath += itemSubPath(item.engineAsString(), item.formatAsString(), isBaseline);
else
- storePath += QString(QLS("mismatches_%1_%2/")).arg(item.engineAsString(), item.formatAsString()) + runId + QLC('/');
+ storePath += itemSubPath(item.engineAsString(), item.formatAsString(), isBaseline) + runId + QLC('/');
QString itemName = item.scriptName;
if (itemName.contains(QLC('.')))
@@ -253,11 +274,8 @@ QString BaselineHandler::updateAllBaselines(const QString &host, const QString &
const QString &engine, const QString &format)
{
QString basePath(BaselineServer::storagePath());
- QString srcDir(basePath + host + QLC('/')
- + QString(QLS("mismatches_%1_%2/")).arg(engine, format)
- + id);
- QString dstDir(basePath + host + QLC('/')
- + QString(QLS("baselines_%1_%2/")).arg(engine, format));
+ QString srcDir(basePath + host + QLC('/') + itemSubPath(engine, format, false) + id);
+ QString dstDir(basePath + host + QLC('/') + itemSubPath(engine, format));
QDir dir(srcDir);
QStringList nameFilter;
@@ -307,6 +325,54 @@ QString BaselineHandler::updateSingleBaseline(const QString &oldBaseline, const
return res;
}
+QString BaselineHandler::blacklistTest(const QString &scriptName, const QString &host, const QString &engine,
+ const QString &format)
+{
+ QString configFile(BaselineServer::storagePath() + host + QLC('/')
+ + itemSubPath(engine, format) + QLS(".blacklist"));
+ QFile file(configFile);
+ if (file.open(QIODevice::Append)) {
+ QTextStream out(&file);
+ out << scriptName << endl;
+ return QLS("Blacklisted ") + scriptName;
+ } else {
+ return QLS("Unable to update blacklisted tests.");
+ }
+}
+
+QString BaselineHandler::whitelistTest(const QString &scriptName, const QString &host, const QString &engine,
+ const QString &format)
+{
+ QString configFile(BaselineServer::storagePath() + host + QLC('/')
+ + itemSubPath(engine, format) + QLS(".blacklist"));
+ QFile file(configFile);
+ QStringList tests;
+ if (file.open(QIODevice::ReadOnly)) {
+ QTextStream in(&file);
+ do {
+ tests << in.readLine();
+ } while (!in.atEnd());
+ if (tests.count() != 0) {
+ QMutableStringListIterator it(tests);
+ while (it.hasNext()) {
+ it.next();
+ if (it.value() == scriptName)
+ it.remove();
+ }
+ }
+ file.close();
+ if (file.open(QIODevice::WriteOnly | QIODevice::Truncate)) {
+ QTextStream out(&file);
+ for (int i=0; i<tests.count(); ++i)
+ out << tests.at(i);
+ return QLS("Whitelisted ") + scriptName;
+ } else {
+ QLS("Unable to whitelist ") + scriptName + QLS(". Unable to truncate blacklist file.");
+ }
+ }
+ return QLS("Unable to whitelist ") + scriptName + QLS(". Unable to open blacklist file.");
+}
+
void BaselineHandler::testPathMapping()
{
qDebug() << "Storage prefix:" << BaselineServer::storagePath();
diff --git a/tests/arthur/baselineserver/src/baselineserver.h b/tests/arthur/baselineserver/src/baselineserver.h
index b77bc09..ba71ce5 100644
--- a/tests/arthur/baselineserver/src/baselineserver.h
+++ b/tests/arthur/baselineserver/src/baselineserver.h
@@ -63,6 +63,10 @@ public:
static QString updateAllBaselines(const QString &host, const QString &id,
const QString &engine, const QString &format);
static QString updateSingleBaseline(const QString &oldBaseline, const QString &newBaseline);
+ static QString blacklistTest(const QString &scriptName, const QString &host,
+ const QString &engine, const QString &format);
+ static QString whitelistTest(const QString &scriptName, const QString &host,
+ const QString &engine, const QString &format);
private slots:
void receiveRequest();
@@ -76,6 +80,8 @@ private:
QString computeMismatchScore(const QImage& baseline, const QImage& rendered);
QString engineForItem(const ImageItem &item);
+ static QString itemSubPath(const QString &engine, const QString &format, bool isBaseline = true);
+
BaselineProtocol proto;
PlatformInfo plat;
bool connectionEstablished;
diff --git a/tests/arthur/baselineserver/src/htmlpage.cpp b/tests/arthur/baselineserver/src/htmlpage.cpp
index 4f53c67..7759c8e 100644
--- a/tests/arthur/baselineserver/src/htmlpage.cpp
+++ b/tests/arthur/baselineserver/src/htmlpage.cpp
@@ -20,13 +20,14 @@ QString HTMLPage::filePath()
return path;
}
-void HTMLPage::start(const QString &storagepath, const QString &runId, const PlatformInfo pinfo)
+void HTMLPage::start(const QString &storagepath, const QString &runId, const PlatformInfo pinfo, const ImageItemList &itemList)
{
end();
id = runId;
plat = pinfo;
root = storagepath;
+ imageItems = itemList;
QString dir = root + QLS("reports/");
QDir cwd;
if (!cwd.exists(dir))
@@ -52,20 +53,18 @@ void HTMLPage::writeHeader(const ImageItem &item)
out << "<h3>Build key: " << plat.buildKey << "</h3>\n";
out << "<h3>Engine: " << item.engineAsString() << "</h3>\n";
out << "<h3>Format: " << item.formatAsString() << "</h3>\n\n";
- out << "<h3><a href=\"/cgi-bin/server.cgi?update=all&id="<< id << "&host=" << plat.hostname
+ out << "<h3><a href=\"/cgi-bin/server.cgi?cmd=updateAllBaselines&id="<< id << "&host=" << plat.hostname
<< "&engine=" << item.engineAsString() << "&format=" << item.formatAsString()
<< "&url=" << pageUrl
- << "\">Update all baselines</a></h3>\n\n";
+ << "\">Update all baselines</a><br>";
out << "<table border=\"2\">\n"
"<tr>\n"
"<td><b>Script</b></td>\n"
"<td><b>Baseline</b></td>\n"
"<td><b>Rendered</b></td>\n"
"<td><b>Comparison</b></td>\n"
- "<td><b>Fuzzy Comparison</b></td>\n"
- "<td><b>Score</b></td>\n"
- "<td><b>Update</b></td>\n"
- "</b></tr>\n\n";
+ "<td><b>Info/Action</b></td>\n"
+ "</b></tr><br>";
}
@@ -82,23 +81,53 @@ void HTMLPage::addItem(const QString &baseline, const QString &rendered, const I
headerWritten = true;
}
QString compared = generateCompared(baseline, rendered);
- QString fuzzy = generateCompared(baseline, rendered, true);
QString pageUrl = BaselineServer::baseUrl() + path;
out << "<tr>\n";
out << "<td>" << item.scriptName << "</td>\n";
- QStringList images = QStringList() << baseline << rendered << compared << fuzzy;
+ QStringList images = QStringList() << baseline << rendered << compared;
foreach(const QString& img, images)
out << "<td><a href=\"/" << img << "\"><img src=\"/" << img << "\" width=240 height=240></a></td>\n";
- out << "<td></td><td><a href=\"/cgi-bin/server.cgi?update=single&oldBaseline=" << baseline
- << "&newBaseline=" << rendered << "&url=" << pageUrl << "\">Update baseline</a></td>\n";
+ out << "<td><a href=\"/cgi-bin/server.cgi?cmd=updateSingleBaseline&oldBaseline=" << baseline
+ << "&newBaseline=" << rendered << "&url=" << pageUrl << "\">Update baseline</a><br>"
+ "<a href=\"/cgi-bin/server.cgi?cmd=blacklist&scriptName=" << item.scriptName
+ << "&host=" << plat.hostname << "&engine=" << item.engineAsString()
+ << "&format=" << item.formatAsString()
+ << "&url=" << pageUrl << "\">Blacklist test</a></td>\n";
out << "<tr>\n\n";
+
+ QMutableVectorIterator<ImageItem> it(imageItems);
+ while (it.hasNext()) {
+ it.next();
+ if (it.value().scriptName == item.scriptName) {
+ it.remove();
+ break;
+ }
+ }
}
void HTMLPage::end()
{
if (file.isOpen()) {
+ // Add the names of the scripts that passed the test, or were blacklisted
+ QString pageUrl = BaselineServer::baseUrl() + path;
+ for (int i=0; i<imageItems.count(); ++i) {
+ out << "<tr><td>" << imageItems.at(i).scriptName << "</td><td>N/A</td><td>N/A</td><td>N/A</td><td>";
+ if (imageItems.at(i).status == ImageItem::IgnoreItem) {
+ out << "<span style=\"background-color:yellow\">Blacklisted</span><br>"
+ "<a href=\"/cgi-bin/server.cgi?cmd=whitelist&scriptName="
+ << imageItems.at(i).scriptName << "&host=" << plat.hostname
+ << "&engine=" << imageItems.at(i).engineAsString()
+ << "&format=" << imageItems.at(i).formatAsString()
+ << "&url=" << pageUrl
+ << "\">Whitelist test</a>";
+ } else {
+ out << "<span style=\"color:green\">Test passed</span>";
+ }
+ out << "</td><tr>";
+ }
+
writeFooter();
out.flush();
file.close();
@@ -132,14 +161,30 @@ void HTMLPage::handleCGIQuery(const QString &query)
// << "Contents of QUERY_STRING:<br>"
// << "Full string = " << query << "<br>";
- if (cgiUrl.queryItemValue(QLS("update")) == QLS("single")) {
+ QString command(cgiUrl.queryItemValue("cmd"));
+
+ if (command == QLS("updateSingleBaseline")) {
s << BaselineHandler::updateSingleBaseline(cgiUrl.queryItemValue(QLS("oldBaseline")),
cgiUrl.queryItemValue(QLS("newBaseline")));
- } else {
+ } else if (command == QLS("updateAllBaselines")) {
s << BaselineHandler::updateAllBaselines(cgiUrl.queryItemValue(QLS("host")),
cgiUrl.queryItemValue(QLS("id")),
cgiUrl.queryItemValue(QLS("engine")),
cgiUrl.queryItemValue(QLS("format")));
+ } else if (command == QLS("blacklist")) {
+ // blacklist a test
+ s << BaselineHandler::blacklistTest(cgiUrl.queryItemValue(QLS("scriptName")),
+ cgiUrl.queryItemValue(QLS("host")),
+ cgiUrl.queryItemValue(QLS("engine")),
+ cgiUrl.queryItemValue(QLS("format")));
+ } else if (command == QLS("whitelist")) {
+ // whitelist a test
+ s << BaselineHandler::whitelistTest(cgiUrl.queryItemValue(QLS("scriptName")),
+ cgiUrl.queryItemValue(QLS("host")),
+ cgiUrl.queryItemValue(QLS("engine")),
+ cgiUrl.queryItemValue(QLS("format")));
+ } else {
+ s << "Unknown query:<br>" << query << "<br>";
}
s << "<p><a href=\"" << cgiUrl.queryItemValue(QLS("url")) << "\">Back to report</a>";
s << "</HTML>";
diff --git a/tests/arthur/baselineserver/src/htmlpage.h b/tests/arthur/baselineserver/src/htmlpage.h
index 29b4ff5..a937052 100644
--- a/tests/arthur/baselineserver/src/htmlpage.h
+++ b/tests/arthur/baselineserver/src/htmlpage.h
@@ -11,7 +11,7 @@ public:
HTMLPage();
~HTMLPage();
- void start(const QString &storagePath, const QString &runId, const PlatformInfo pinfo);
+ void start(const QString &storagePath, const QString &runId, const PlatformInfo pinfo, const ImageItemList &itemList);
void addItem(const QString &baseline, const QString &rendered, const ImageItem &item);
void end();
QString filePath();
@@ -29,6 +29,7 @@ private:
QTextStream out;
QString id;
PlatformInfo plat;
+ ImageItemList imageItems;
bool headerWritten;
};
diff --git a/tests/auto/lancelot/tst_lancelot.cpp b/tests/auto/lancelot/tst_lancelot.cpp
index d7a675d..21044d4 100644
--- a/tests/auto/lancelot/tst_lancelot.cpp
+++ b/tests/auto/lancelot/tst_lancelot.cpp
@@ -189,10 +189,11 @@ void tst_Lancelot::testOpenGL_data()
void tst_Lancelot::testOpenGL()
{
bool ok = false;
- QGLWidget glWidget;
+ QGLWidget glWidget;
if (glWidget.isValid() && glWidget.format().directRendering()
&& ((QGLFormat::openGLVersionFlags() & QGLFormat::OpenGL_Version_2_0)
- || (QGLFormat::openGLVersionFlags() & QGLFormat::OpenGL_ES_Version_2_0)))
+ || (QGLFormat::openGLVersionFlags() & QGLFormat::OpenGL_ES_Version_2_0))
+ && QGLFramebufferObject::hasOpenGLFramebufferObjects())
{
glWidget.makeCurrent();
if (!QByteArray((const char *)glGetString(GL_VERSION)).contains("Mesa"))
@@ -272,13 +273,13 @@ ImageItem tst_Lancelot::render(const ImageItem &item)
} else if (item.engine == ImageItem::OpenGL) {
QGLWidget glWidget;
if (glWidget.isValid()) {
- glWidget.resize(800, 800);
- glWidget.show();
-#ifdef Q_WS_X11
- qt_x11_wait_for_window_manager(&glWidget);
-#endif
- paint(&glWidget, script, QFileInfo(filePath).absoluteFilePath()); // eh yuck (filePath stuff)
- res.image = glWidget.grabFrameBuffer().convertToFormat(item.renderFormat);
+ glWidget.makeCurrent();
+ QGLFramebufferObjectFormat fboFormat;
+ fboFormat.setSamples(16);
+ fboFormat.setAttachment(QGLFramebufferObject::CombinedDepthStencil);
+ QGLFramebufferObject fbo(800, 800, fboFormat);
+ paint(&fbo, script, QFileInfo(filePath).absoluteFilePath()); // eh yuck (filePath stuff)
+ res.image = fbo.toImage().convertToFormat(item.renderFormat);
res.imageChecksums.append(ImageItem::computeChecksum(res.image));
}
}
@@ -290,6 +291,7 @@ void tst_Lancelot::paint(QPaintDevice *device, const QStringList &script, const
{
QPainter p(device);
PaintCommands pcmd(script, 800, 800);
+ pcmd.setType(ImageType);
pcmd.setPainter(&p);
pcmd.setFilePath(filePath);
pcmd.runCommands();