qt5base-lts/tests/baselineserver/shared/qbaselinetest.cpp
Jason McDonald 629d6eda5c Update contact information in license headers.
Replace Nokia contact email address with Qt Project website.

Change-Id: I431bbbf76d7c27d8b502f87947675c116994c415
Reviewed-by: Rohan McGovern <rohan.mcgovern@nokia.com>
2012-01-23 04:04:33 +01:00

194 lines
6.2 KiB
C++

/****************************************************************************
**
** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
** All rights reserved.
** 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);
}
}