summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorCaroline Chao <caroline.chao@theqtcompany.com>2015-04-28 13:40:26 +0200
committerCaroline Chao <caroline.chao@theqtcompany.com>2015-05-05 07:06:52 +0000
commit96527f74e253817ce1c7ac67346d6bfd849802ab (patch)
treebffdd874b93e001ec737df2ca7e12708b5c22edd
parent4c8bbf8dda02a2e1f40d8b13911dbf055fbb5fcc (diff)
TestCase: Also check main source path when looking for test data
This is for example useful when looking for a possible BLACKLIST file while doing a shadow build. Add autotests for blacklist. Change-Id: I41d3939d31d21d10187fefcb82604736d911b6ad Reviewed-by: Friedemann Kleint <Friedemann.Kleint@theqtcompany.com> Reviewed-by: Simon Hausmann <simon.hausmann@theqtcompany.com>
-rw-r--r--src/testlib/qtest.h11
-rw-r--r--src/testlib/qtestcase.cpp21
-rw-r--r--src/testlib/qtestcase.h2
-rw-r--r--tests/auto/testlib/selftests/blacklisted/BLACKLIST12
-rw-r--r--tests/auto/testlib/selftests/blacklisted/blacklisted.pro7
-rw-r--r--tests/auto/testlib/selftests/blacklisted/tst_blacklisted.cpp94
-rw-r--r--tests/auto/testlib/selftests/expected_blacklisted.txt26
-rw-r--r--tests/auto/testlib/selftests/selftests.pri1
-rw-r--r--tests/auto/testlib/selftests/selftests.qrc1
-rw-r--r--tests/auto/testlib/selftests/tst_selftests.cpp8
10 files changed, 182 insertions, 1 deletions
diff --git a/src/testlib/qtest.h b/src/testlib/qtest.h
index 81cc07c410..70e923927b 100644
--- a/src/testlib/qtest.h
+++ b/src/testlib/qtest.h
@@ -274,10 +274,17 @@ inline bool qCompare(quint32 const &t1, quint64 const &t2, const char *actual,
}
QT_END_NAMESPACE
+#ifdef QT_TESTCASE_BUILDDIR
+# define QTEST_SET_MAIN_SOURCE_PATH QTest::setMainSourcePath(__FILE__, QT_TESTCASE_BUILDDIR);
+#else
+# define QTEST_SET_MAIN_SOURCE_PATH QTest::setMainSourcePath(__FILE__);
+#endif
+
#define QTEST_APPLESS_MAIN(TestObject) \
int main(int argc, char *argv[]) \
{ \
TestObject tc; \
+ QTEST_SET_MAIN_SOURCE_PATH \
return QTest::qExec(&tc, argc, argv); \
}
@@ -300,6 +307,7 @@ int main(int argc, char *argv[]) \
app.setAttribute(Qt::AA_Use96Dpi, true); \
QTEST_DISABLE_KEYPAD_NAVIGATION \
TestObject tc; \
+ QTEST_SET_MAIN_SOURCE_PATH \
return QTest::qExec(&tc, argc, argv); \
}
@@ -313,6 +321,7 @@ int main(int argc, char *argv[]) \
QGuiApplication app(argc, argv); \
app.setAttribute(Qt::AA_Use96Dpi, true); \
TestObject tc; \
+ QTEST_SET_MAIN_SOURCE_PATH \
return QTest::qExec(&tc, argc, argv); \
}
@@ -324,6 +333,7 @@ int main(int argc, char *argv[]) \
QCoreApplication app(argc, argv); \
app.setAttribute(Qt::AA_Use96Dpi, true); \
TestObject tc; \
+ QTEST_SET_MAIN_SOURCE_PATH \
return QTest::qExec(&tc, argc, argv); \
}
@@ -335,6 +345,7 @@ int main(int argc, char *argv[]) \
QCoreApplication app(argc, argv); \
app.setAttribute(Qt::AA_Use96Dpi, true); \
TestObject tc; \
+ QTEST_SET_MAIN_SOURCE_PATH \
return QTest::qExec(&tc, argc, argv); \
}
diff --git a/src/testlib/qtestcase.cpp b/src/testlib/qtestcase.cpp
index e2f98c2f04..b76e5544ba 100644
--- a/src/testlib/qtestcase.cpp
+++ b/src/testlib/qtestcase.cpp
@@ -1332,6 +1332,7 @@ static bool installCoverageTool(const char * appname, const char * testname)
namespace QTest
{
static QObject *currentTestObject = 0;
+ static QString mainSourcePath;
class TestFunction {
public:
@@ -2932,6 +2933,13 @@ QString QTest::qFindTestData(const QString& base, const char *file, int line, co
found = candidate;
}
+ // 6. Try main source directory
+ if (found.isEmpty()) {
+ QString candidate = QTest::mainSourcePath % QLatin1Char('/') % base;
+ if (QFileInfo(candidate).exists())
+ found = candidate;
+ }
+
if (found.isEmpty()) {
QTest::qWarn(qPrintable(
QString::fromLatin1("testdata %1 could not be located!").arg(base)),
@@ -3119,6 +3127,19 @@ QObject *QTest::testObject()
}
/*! \internal
+ */
+void QTest::setMainSourcePath(const char *file, const char *builddir)
+{
+ QString mainSourceFile = QFile::decodeName(file);
+ QFileInfo fi;
+ if (builddir)
+ fi.setFile(QDir(QFile::decodeName(builddir)), mainSourceFile);
+ else
+ fi.setFile(mainSourceFile);
+ QTest::mainSourcePath = fi.absolutePath();
+}
+
+/*! \internal
This function is called by various specializations of QTest::qCompare
to decide whether to report a failure and to produce verbose test output.
diff --git a/src/testlib/qtestcase.h b/src/testlib/qtestcase.h
index 45290de6de..2c6a94faa1 100644
--- a/src/testlib/qtestcase.h
+++ b/src/testlib/qtestcase.h
@@ -236,6 +236,8 @@ namespace QTest
Q_TESTLIB_EXPORT int qExec(QObject *testObject, int argc = 0, char **argv = 0);
Q_TESTLIB_EXPORT int qExec(QObject *testObject, const QStringList &arguments);
+ Q_TESTLIB_EXPORT void setMainSourcePath(const char *file, const char *builddir = 0);
+
Q_TESTLIB_EXPORT bool qVerify(bool statement, const char *statementStr, const char *description,
const char *file, int line);
Q_TESTLIB_EXPORT void qFail(const char *statementStr, const char *file, int line);
diff --git a/tests/auto/testlib/selftests/blacklisted/BLACKLIST b/tests/auto/testlib/selftests/blacklisted/BLACKLIST
new file mode 100644
index 0000000000..36b7699cbd
--- /dev/null
+++ b/tests/auto/testlib/selftests/blacklisted/BLACKLIST
@@ -0,0 +1,12 @@
+[pass]
+*
+[skip]
+*
+[fail]
+*
+[xpass]
+*
+[xfail]
+*
+[messages]
+*
diff --git a/tests/auto/testlib/selftests/blacklisted/blacklisted.pro b/tests/auto/testlib/selftests/blacklisted/blacklisted.pro
new file mode 100644
index 0000000000..5bd22910b1
--- /dev/null
+++ b/tests/auto/testlib/selftests/blacklisted/blacklisted.pro
@@ -0,0 +1,7 @@
+SOURCES += tst_blacklisted.cpp
+QT = core testlib-private
+
+mac: CONFIG -= app_bundle
+CONFIG -= debug_and_release_target
+
+TARGET = blacklisted
diff --git a/tests/auto/testlib/selftests/blacklisted/tst_blacklisted.cpp b/tests/auto/testlib/selftests/blacklisted/tst_blacklisted.cpp
new file mode 100644
index 0000000000..f1df285a51
--- /dev/null
+++ b/tests/auto/testlib/selftests/blacklisted/tst_blacklisted.cpp
@@ -0,0 +1,94 @@
+/****************************************************************************
+**
+** Copyright (C) 2015 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL21$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 or version 3 as published by the Free
+** Software Foundation and appearing in the file LICENSE.LGPLv21 and
+** LICENSE.LGPLv3 included in the packaging of this file. Please review the
+** following information to ensure the GNU Lesser General Public License
+** requirements will be met: https://www.gnu.org/licenses/lgpl.html and
+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** As a special exception, The Qt Company gives you certain additional
+** rights. These rights are described in The Qt Company LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <QtCore/QCoreApplication>
+#include <QtTest/QtTest>
+#include <private/qtestlog_p.h>
+
+class tst_Blacklisted : public QObject
+{
+ Q_OBJECT
+
+private slots:
+ void pass();
+ void skip();
+ void fail();
+ void xfail();
+ void xpass();
+
+ // This test function must be last, as it calls qFatal().
+ void messages();
+};
+
+// All the tests below have been blacklisted in blacklisted/BLACKLIST
+
+void tst_Blacklisted::pass()
+{
+ QVERIFY(true);
+}
+
+void tst_Blacklisted::skip()
+{
+ QSKIP("This test should SKIP");
+}
+
+void tst_Blacklisted::fail()
+{
+ QVERIFY2(false, "This test should BFAIL");
+}
+
+void tst_Blacklisted::xfail()
+{
+ QEXPECT_FAIL("", "This test should XFAIL then BFAIL", Abort);
+ QVERIFY(false);
+}
+
+void tst_Blacklisted::xpass()
+{
+ QEXPECT_FAIL("", "This test should XPASS", Abort);
+ QVERIFY2(true, "This test should XPASS, blacklist ignored for XPASS");
+}
+
+void tst_Blacklisted::messages()
+{
+ qWarning("This is a warning that should not appear in silent test output");
+ QWARN("This is an internal testlib warning that should not appear in silent test output");
+ qDebug("This is a debug message that should not appear in silent test output");
+ qCritical("This is a critical message that should not appear in silent test output");
+ qInfo("This is an info message that should not appear in silent test output");
+ QTestLog::info("This is an internal testlib info message that should not appear in silent test output", __FILE__, __LINE__);
+ qFatal("This is a fatal error message that should still appear in silent test output");
+}
+
+QTEST_MAIN(tst_Blacklisted)
+#include "tst_blacklisted.moc"
diff --git a/tests/auto/testlib/selftests/expected_blacklisted.txt b/tests/auto/testlib/selftests/expected_blacklisted.txt
new file mode 100644
index 0000000000..3afd93b0cc
--- /dev/null
+++ b/tests/auto/testlib/selftests/expected_blacklisted.txt
@@ -0,0 +1,26 @@
+********* Start testing of tst_Blacklisted *********
+Config: Using QtTest library @INSERT_QT_VERSION_HERE@, Qt @INSERT_QT_VERSION_HERE@
+PASS : tst_Blacklisted::initTestCase()
+BPASS : tst_Blacklisted::pass()
+SKIP : tst_Blacklisted::skip() This test should SKIP
+ Loc: [tst_blacklisted.cpp(62)]
+BFAIL : tst_Blacklisted::fail() 'false' returned FALSE. (This test should BFAIL)
+ Loc: [tst_blacklisted.cpp(67)]
+XFAIL : tst_Blacklisted::xfail() This test should XFAIL then BFAIL
+ Loc: [tst_blacklisted.cpp(73)]
+BPASS : tst_Blacklisted::xfail()
+XPASS : tst_Blacklisted::xpass() 'true' returned TRUE unexpectedly. (This test should XPASS, blacklist ignored for XPASS)
+ Loc: [tst_blacklisted.cpp(79)]
+QWARN : tst_Blacklisted::messages() This is a warning that should not appear in silent test output
+WARNING: tst_Blacklisted::messages() This is an internal testlib warning that should not appear in silent test output
+ Loc: [tst_blacklisted.cpp(85)]
+QDEBUG : tst_Blacklisted::messages() This is a debug message that should not appear in silent test output
+QSYSTEM: tst_Blacklisted::messages() This is a critical message that should not appear in silent test output
+QINFO : tst_Blacklisted::messages() This is an info message that should not appear in silent test output
+INFO : tst_Blacklisted::messages() This is an internal testlib info message that should not appear in silent test output
+ Loc: [tst_blacklisted.cpp(89)]
+QFATAL : tst_Blacklisted::messages() This is a fatal error message that should still appear in silent test output
+BFAIL : tst_Blacklisted::messages() Received a fatal error.
+ Loc: [Unknown file(0)]
+Totals: 1 passed, 1 failed, 1 skipped, 4 blacklisted
+********* Finished testing of tst_Blacklisted *********
diff --git a/tests/auto/testlib/selftests/selftests.pri b/tests/auto/testlib/selftests/selftests.pri
index 7b706735a9..7404a1c49b 100644
--- a/tests/auto/testlib/selftests/selftests.pri
+++ b/tests/auto/testlib/selftests/selftests.pri
@@ -8,6 +8,7 @@ SUBPROGRAMS = \
benchliboptions \
benchlibtickcounter \
benchlibwalltime \
+ blacklisted \
cmptest \
commandlinedata \
counting \
diff --git a/tests/auto/testlib/selftests/selftests.qrc b/tests/auto/testlib/selftests/selftests.qrc
index ba567f1fb4..715e255e76 100644
--- a/tests/auto/testlib/selftests/selftests.qrc
+++ b/tests/auto/testlib/selftests/selftests.qrc
@@ -151,5 +151,6 @@
<file>expected_xunit.txt</file>
<file>expected_xunit.xml</file>
<file>expected_xunit.xunitxml</file>
+ <file>expected_blacklisted.txt</file>
</qresource>
</RCC>
diff --git a/tests/auto/testlib/selftests/tst_selftests.cpp b/tests/auto/testlib/selftests/tst_selftests.cpp
index 488b65c657..6536f103ac 100644
--- a/tests/auto/testlib/selftests/tst_selftests.cpp
+++ b/tests/auto/testlib/selftests/tst_selftests.cpp
@@ -352,6 +352,7 @@ void tst_Selftests::runSubTest_data()
<< "benchlibcounting"
<< "benchlibeventcounter"
<< "benchliboptions"
+ << "blacklisted"
<< "cmptest"
<< "commandlinedata"
<< "counting"
@@ -470,6 +471,9 @@ void tst_Selftests::runSubTest_data()
if (subtest == "benchliboptions") {
continue;
}
+ if (subtest == "blacklisted") {
+ continue;
+ }
if (subtest == "printdatatags") {
continue;
}
@@ -503,7 +507,8 @@ void tst_Selftests::runSubTest_data()
const bool crashes = subtest == QLatin1String("assert") || subtest == QLatin1String("exceptionthrow")
|| subtest == QLatin1String("fetchbogus") || subtest == QLatin1String("crashedterminate")
- || subtest == QLatin1String("crashes") || subtest == QLatin1String("silent");
+ || subtest == QLatin1String("crashes") || subtest == QLatin1String("silent")
+ || subtest == QLatin1String("blacklisted");
QTest::newRow(qPrintable(QString("%1 %2").arg(subtest).arg(loggerSet.name)))
<< subtest
<< loggers
@@ -610,6 +615,7 @@ void tst_Selftests::doRunSubTest(QString const& subdir, QStringList const& logge
&& subdir != QLatin1String("fetchbogus")
&& subdir != QLatin1String("xunit")
#ifdef Q_CC_MINGW
+ && subdir != QLatin1String("blacklisted") // calls qFatal()
&& subdir != QLatin1String("silent") // calls qFatal()
#endif
&& subdir != QLatin1String("benchlibcallgrind"))