5635823e17
As in the past, to avoid rewriting various autotests that contain line-number information, an extra blank line has been inserted at the end of the license text to ensure that this commit does not change the total number of lines in the license header. Change-Id: I311e001373776812699d6efc045b5f742890c689 Reviewed-by: Rohan McGovern <rohan.mcgovern@nokia.com>
194 lines
6.2 KiB
C++
194 lines
6.2 KiB
C++
/****************************************************************************
|
|
**
|
|
** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
|
|
** Contact: http://www.qt-project.org/
|
|
**
|
|
** This file is part of the test suite of the Qt Toolkit.
|
|
**
|
|
** $QT_BEGIN_LICENSE:LGPL$
|
|
** GNU Lesser General Public License Usage
|
|
** This file may be used under the terms of the GNU Lesser General Public
|
|
** License version 2.1 as published by the Free Software Foundation and
|
|
** appearing in the file LICENSE.LGPL included in the packaging of this
|
|
** file. Please review the following information to ensure the GNU Lesser
|
|
** General Public License version 2.1 requirements will be met:
|
|
** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
|
|
**
|
|
** In addition, as a special exception, Nokia gives you certain additional
|
|
** rights. These rights are described in the Nokia Qt LGPL Exception
|
|
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
|
|
**
|
|
** GNU General Public License Usage
|
|
** Alternatively, this file may be used under the terms of the GNU General
|
|
** Public License version 3.0 as published by the Free Software Foundation
|
|
** and appearing in the file LICENSE.GPL included in the packaging of this
|
|
** file. Please review the following information to ensure the GNU General
|
|
** Public License version 3.0 requirements will be met:
|
|
** http://www.gnu.org/copyleft/gpl.html.
|
|
**
|
|
** Other Usage
|
|
** Alternatively, this file may be used in accordance with the terms and
|
|
** conditions contained in a signed written agreement between you and Nokia.
|
|
**
|
|
**
|
|
**
|
|
**
|
|
**
|
|
**
|
|
** $QT_END_LICENSE$
|
|
**
|
|
****************************************************************************/
|
|
|
|
#include "qbaselinetest.h"
|
|
#include "baselineprotocol.h"
|
|
|
|
namespace QBaselineTest {
|
|
|
|
BaselineProtocol proto;
|
|
bool connected = false;
|
|
bool triedConnecting = false;
|
|
|
|
QByteArray curFunction;
|
|
ImageItemList itemList;
|
|
bool gotBaselines;
|
|
|
|
|
|
bool connect(QByteArray *msg, bool *error)
|
|
{
|
|
if (!triedConnecting) {
|
|
triedConnecting = true;
|
|
if (!proto.connect(QTest::testObject()->metaObject()->className())) {
|
|
*msg += "Failed to connect to baseline server: " + proto.errorMessage().toLatin1();
|
|
*error = true;
|
|
return false;
|
|
}
|
|
connected = true;
|
|
}
|
|
if (!connected) {
|
|
*msg = "Not connected to baseline server.";
|
|
*error = true;
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
|
|
bool compareItem(const ImageItem &baseline, const QImage &img, QByteArray *msg, bool *error)
|
|
{
|
|
ImageItem item = baseline;
|
|
item.image = img;
|
|
item.imageChecksums.clear();
|
|
item.imageChecksums.prepend(ImageItem::computeChecksum(img));
|
|
QByteArray srvMsg;
|
|
switch (baseline.status) {
|
|
case ImageItem::Ok:
|
|
break;
|
|
case ImageItem::IgnoreItem :
|
|
qDebug() << msg->constData() << "Ignored, blacklisted on server.";
|
|
return true;
|
|
break;
|
|
case ImageItem::BaselineNotFound:
|
|
if (proto.submitNewBaseline(item, &srvMsg))
|
|
qDebug() << msg->constData() << "Baseline not found on server. New baseline uploaded.";
|
|
else
|
|
qDebug() << msg->constData() << "Baseline not found on server. Uploading of new baseline failed:" << srvMsg;
|
|
return true;
|
|
break;
|
|
default:
|
|
qWarning() << "Unexpected reply from baseline server.";
|
|
return true;
|
|
break;
|
|
}
|
|
*error = false;
|
|
// The actual comparison of the given image with the baseline:
|
|
if (baseline.imageChecksums.contains(item.imageChecksums.at(0)))
|
|
return true;
|
|
proto.submitMismatch(item, &srvMsg);
|
|
*msg += "Mismatch. See report:\n " + srvMsg;
|
|
return false;
|
|
}
|
|
|
|
bool checkImage(const QImage &img, const char *name, quint16 checksum, QByteArray *msg, bool *error)
|
|
{
|
|
if (!connected && !connect(msg, error))
|
|
return true;
|
|
|
|
QByteArray itemName;
|
|
bool hasName = qstrlen(name);
|
|
const char *tag = QTest::currentDataTag();
|
|
if (qstrlen(tag)) {
|
|
itemName = tag;
|
|
if (hasName)
|
|
itemName.append('_').append(name);
|
|
} else {
|
|
itemName = hasName ? name : "default_name";
|
|
}
|
|
|
|
*msg = "Baseline check of image '" + itemName + "': ";
|
|
|
|
|
|
ImageItem item;
|
|
item.itemName = QString::fromLatin1(itemName);
|
|
item.itemChecksum = checksum;
|
|
item.testFunction = QString::fromLatin1(QTest::currentTestFunction());
|
|
ImageItemList list;
|
|
list.append(item);
|
|
if (!proto.requestBaselineChecksums(QLatin1String(QTest::currentTestFunction()), &list) || list.isEmpty()) {
|
|
*msg = "Communication with baseline server failed: " + proto.errorMessage().toLatin1();
|
|
*error = true;
|
|
return true;
|
|
}
|
|
|
|
return compareItem(list.at(0), img, msg, error);
|
|
}
|
|
|
|
|
|
QTestData &newRow(const char *dataTag, quint16 checksum)
|
|
{
|
|
if (QTest::currentTestFunction() != curFunction) {
|
|
curFunction = QTest::currentTestFunction();
|
|
itemList.clear();
|
|
gotBaselines = false;
|
|
}
|
|
ImageItem item;
|
|
item.itemName = QString::fromLatin1(dataTag);
|
|
item.itemChecksum = checksum;
|
|
item.testFunction = QString::fromLatin1(QTest::currentTestFunction());
|
|
itemList.append(item);
|
|
|
|
return QTest::newRow(dataTag);
|
|
}
|
|
|
|
|
|
bool testImage(const QImage& img, QByteArray *msg, bool *error)
|
|
{
|
|
if (!connected && !connect(msg, error))
|
|
return true;
|
|
|
|
if (QTest::currentTestFunction() != curFunction || itemList.isEmpty()) {
|
|
qWarning() << "Usage error: QBASELINE_TEST used without corresponding QBaselineTest::newRow()";
|
|
return true;
|
|
}
|
|
|
|
if (!gotBaselines) {
|
|
if (!proto.requestBaselineChecksums(QString::fromLatin1(QTest::currentTestFunction()), &itemList) || itemList.isEmpty()) {
|
|
*msg = "Communication with baseline server failed: " + proto.errorMessage().toLatin1();
|
|
*error = true;
|
|
return true;
|
|
}
|
|
gotBaselines = true;
|
|
}
|
|
|
|
QString curTag = QString::fromLatin1(QTest::currentDataTag());
|
|
ImageItemList::const_iterator it = itemList.constBegin();
|
|
while (it != itemList.constEnd() && it->itemName != curTag)
|
|
++it;
|
|
if (it == itemList.constEnd()) {
|
|
qWarning() << "Usage error: QBASELINE_TEST used without corresponding QBaselineTest::newRow() for row" << curTag;
|
|
return true;
|
|
}
|
|
return compareItem(*it, img, msg, error);
|
|
}
|
|
|
|
}
|