qtestblacklist.cpp

Absolute File Name:/home/qt/qt5_coco/qt5/qtbase/src/testlib/qtestblacklist.cpp
Source codeSwitch to Preprocessed file
LineSourceCount
1/****************************************************************************-
2**-
3** Copyright (C) 2016 The Qt Company Ltd.-
4** Contact: https://www.qt.io/licensing/-
5**-
6** This file is part of the QtTest module of the Qt Toolkit.-
7**-
8** $QT_BEGIN_LICENSE:LGPL$-
9** Commercial License Usage-
10** Licensees holding valid commercial Qt licenses may use this file in-
11** accordance with the commercial license agreement provided with the-
12** Software or, alternatively, in accordance with the terms contained in-
13** a written agreement between you and The Qt Company. For licensing terms-
14** and conditions see https://www.qt.io/terms-conditions. For further-
15** information use the contact form at https://www.qt.io/contact-us.-
16**-
17** GNU Lesser General Public License Usage-
18** Alternatively, this file may be used under the terms of the GNU Lesser-
19** General Public License version 3 as published by the Free Software-
20** Foundation and appearing in the file LICENSE.LGPL3 included in the-
21** packaging of this file. Please review the following information to-
22** ensure the GNU Lesser General Public License version 3 requirements-
23** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.-
24**-
25** GNU General Public License Usage-
26** Alternatively, this file may be used under the terms of the GNU-
27** General Public License version 2.0 or (at your option) the GNU General-
28** Public license version 3 or any later version approved by the KDE Free-
29** Qt Foundation. The licenses are as published by the Free Software-
30** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3-
31** included in the packaging of this file. Please review the following-
32** information to ensure the GNU General Public License requirements will-
33** be met: https://www.gnu.org/licenses/gpl-2.0.html and-
34** https://www.gnu.org/licenses/gpl-3.0.html.-
35**-
36** $QT_END_LICENSE$-
37**-
38****************************************************************************/-
39#include "qtestblacklist_p.h"-
40#include "qtestresult_p.h"-
41-
42#include <QtTest/qtestcase.h>-
43#include <QtCore/qbytearray.h>-
44#include <QtCore/qfile.h>-
45#include <QtCore/qset.h>-
46#include <QtCore/qcoreapplication.h>-
47#include <QtCore/qvariant.h>-
48#include <QtCore/QSysInfo>-
49-
50#include <set>-
51-
52QT_BEGIN_NAMESPACE-
53-
54/*-
55 The BLACKLIST file format is a grouped listing of keywords.-
56-
57 Blank lines and lines starting with # are simply ignored. An initial #-line-
58 referring to this documentation is kind to readers. Comments can also be used-
59 to indicate the reasons for ignoring particular cases.-
60-
61 A key names a platform, O/S, distribution, tool-chain or architecture; a !-
62 prefix reverses what it checks. A version, joined to a key (at present, only-
63 for distributions and for msvc) with a hyphen, limits the key to the specific-
64 version. A keyword line matches if every key on it applies to the present-
65 run. Successive lines are alternate conditions for ignoring a test.-
66-
67 Ungrouped lines at the beginning of a file apply to the whole testcase.-
68 A group starts with a [square-bracketed] identification of a test function,-
69 optionally with (after a colon, the name of) a specific data set, to ignore.-
70 Subsequent lines give conditions for ignoring this test.-
71-
72 # See qtbase/src/testlib/qtestblacklist.cpp for format-
73 osx-
74-
75 # QTBUG-12345-
76 [testFunction]-
77 linux-
78 windows 64bit-
79-
80 # Needs basic C++11 support-
81 [testfunction2:testData]-
82 msvc-2010-
83-
84 Keys are lower-case. Distribution name and version are supported if-
85 QSysInfo's productType() and productVersion() return them.-
86 The other known keys are listed below:-
87*/-
88-
89static QSet<QByteArray> keywords()-
90{-
91 // this list can be extended with new keywords as required-
92 QSet<QByteArray> set = QSet<QByteArray>()-
93 << "*"-
94#ifdef Q_OS_LINUX-
95 << "linux"-
96#endif-
97#ifdef Q_OS_OSX-
98 << "osx"-
99#endif-
100#ifdef Q_OS_WIN-
101 << "windows"-
102#endif-
103#ifdef Q_OS_IOS-
104 << "ios"-
105#endif-
106#ifdef Q_OS_ANDROID-
107 << "android"-
108#endif-
109#ifdef Q_OS_QNX-
110 << "qnx"-
111#endif-
112#ifdef Q_OS_WINRT-
113 << "winrt"-
114#endif-
115#ifdef Q_OS_WINCE-
116 << "wince"-
117#endif-
118-
119#if QT_POINTER_SIZE == 8-
120 << "64bit"-
121#else-
122 << "32bit"-
123#endif-
124-
125#ifdef Q_CC_GNU-
126 << "gcc"-
127#endif-
128#ifdef Q_CC_CLANG-
129 << "clang"-
130#endif-
131#ifdef Q_CC_MSVC-
132 << "msvc"-
133 #ifdef _MSC_VER-
134 #if _MSC_VER == 1900-
135 << "msvc-2015"-
136 #elif _MSC_VER == 1800-
137 << "msvc-2013"-
138 #elif _MSC_VER == 1700-
139 << "msvc-2012"-
140 #elif _MSC_VER == 1600-
141 << "msvc-2010"-
142 #endif-
143 #endif-
144#endif-
145-
146#ifdef Q_PROCESSOR_X86-
147 << "x86"-
148#endif-
149#ifdef Q_PROCESSOR_ARM-
150 << "arm"-
151#endif-
152-
153#ifdef Q_AUTOTEST_EXPORT-
154 << "developer-build"-
155#endif-
156 ;-
157-
158 QCoreApplication *app = QCoreApplication::instance();-
159 if (app) {
appDescription
TRUEevaluated 2 times by 1 test
Evaluated by:
  • tst_selftests - unknown status
FALSEnever evaluated
0-2
160 const QVariant platformName = app->property("platformName");-
161 if (platformName.isValid())
platformName.isValid()Description
TRUEnever evaluated
FALSEevaluated 2 times by 1 test
Evaluated by:
  • tst_selftests - unknown status
0-2
162 set << platformName.toByteArray();
never executed: set << platformName.toByteArray();
0
163 }
executed 2 times by 1 test: end of block
Executed by:
  • tst_selftests - unknown status
2
164-
165 return set;
executed 2 times by 1 test: return set;
Executed by:
  • tst_selftests - unknown status
2
166}-
167-
168static QSet<QByteArray> activeConditions()-
169{-
170 QSet<QByteArray> result = keywords();-
171-
172 QByteArray distributionName = QSysInfo::productType().toLower().toUtf8();-
173 QByteArray distributionRelease = QSysInfo::productVersion().toLower().toUtf8();-
174 if (!distributionName.isEmpty()) {
!distributionName.isEmpty()Description
TRUEevaluated 2 times by 1 test
Evaluated by:
  • tst_selftests - unknown status
FALSEnever evaluated
0-2
175 if (result.find(distributionName) == result.end())
result.find(di...= result.end()Description
TRUEevaluated 2 times by 1 test
Evaluated by:
  • tst_selftests - unknown status
FALSEnever evaluated
0-2
176 result.insert(distributionName);
executed 2 times by 1 test: result.insert(distributionName);
Executed by:
  • tst_selftests - unknown status
2
177 if (!distributionRelease.isEmpty()) {
!distributionRelease.isEmpty()Description
TRUEevaluated 2 times by 1 test
Evaluated by:
  • tst_selftests - unknown status
FALSEnever evaluated
0-2
178 QByteArray versioned = distributionName + "-" + distributionRelease;-
179 if (result.find(versioned) == result.end())
result.find(ve...= result.end()Description
TRUEevaluated 2 times by 1 test
Evaluated by:
  • tst_selftests - unknown status
FALSEnever evaluated
0-2
180 result.insert(versioned);
executed 2 times by 1 test: result.insert(versioned);
Executed by:
  • tst_selftests - unknown status
2
181 }}if (qEnvironmentVariableIsSet("QTEST_ENVIRONMENT")) {
executed 2 times by 1 test: end of block
Executed by:
  • tst_selftests - unknown status
2
foreach (const QByteArray &k, qgetenv("QTEST_ENVIRONMENT").split(' '))
executed 2 times by 1 test: end of block
Executed by:
  • tst_selftests - unknown status
result.insert(k);
executed 2 times by 1 test: end of block
Executed by:
  • tst_selftests - unknown status
182 }
executed 2 times by 1 test: end of block
Executed by:
  • tst_selftests - unknown status
2
183-
184 return result;
executed 2 times by 1 test: return result;
Executed by:
  • tst_selftests - unknown status
2
185}-
186-
187static bool checkCondition(const QByteArray &condition)-
188{-
189 static const QSet<QByteArray> matchedConditions = activeConditions();-
190 QList<QByteArray> conds = condition.split(' ');-
191-
192 for (int i = 0; i < conds.size(); ++i) {-
193 QByteArray c = conds.at(i);-
194 bool result = c.startsWith('!');-
195 if (result)-
196 c = c.mid(1);-
197-
198 result ^= matchedConditions.contains(c);-
199 if (!result)-
200 return false;-
201 }-
202 return true;-
203}-
204-
205static bool ignoreAll = false;-
206static std::set<QByteArray> *ignoredTests = 0;-
207static std::set<QByteArray> *gpuFeatures = 0;-
208-
209Q_TESTLIB_EXPORT std::set<QByteArray> *(*qgpu_features_ptr)(const QString &) = 0;-
210-
211static bool isGPUTestBlacklisted(const char *slot, const char *data = 0)-
212{-
213 const QByteArray disableKey = QByteArrayLiteral("disable_") + QByteArray(slot);-
214 if (gpuFeatures->find(disableKey) != gpuFeatures->end()) {-
215 QByteArray msg = QByteArrayLiteral("Skipped due to GPU blacklist: ") + disableKey;-
216 if (data)-
217 msg += ':' + QByteArray(data);-
218 QTest::qSkip(msg.constData(), __FILE__, __LINE__);-
219 return true;-
220 }-
221 return false;-
222}-
223-
224namespace QTestPrivate {-
225-
226void parseBlackList()-
227{-
228 QString filename = QTest::qFindTestData(QStringLiteral("BLACKLIST"));-
229 if (filename.isEmpty())-
230 return;-
231 QFile ignored(filename);-
232 if (!ignored.open(QIODevice::ReadOnly))-
233 return;-
234-
235 QByteArray function;-
236-
237 while (!ignored.atEnd()) {-
238 QByteArray line = ignored.readLine().simplified();-
239 if (line.isEmpty() || line.startsWith('#'))-
240 continue;-
241 if (line.startsWith('[')) {-
242 function = line.mid(1, line.length() - 2);-
243 continue;-
244 }-
245 bool condition = checkCondition(line);-
246 if (condition) {-
247 if (!function.size()) {-
248 ignoreAll = true;-
249 } else {-
250 if (!ignoredTests)-
251 ignoredTests = new std::set<QByteArray>;-
252 ignoredTests->insert(function);-
253 }-
254 }-
255 }-
256}-
257-
258void parseGpuBlackList()-
259{-
260 if (!qgpu_features_ptr)-
261 return;-
262 QString filename = QTest::qFindTestData(QStringLiteral("GPU_BLACKLIST"));-
263 if (filename.isEmpty())-
264 return;-
265 if (!gpuFeatures)-
266 gpuFeatures = qgpu_features_ptr(filename);-
267}-
268-
269void checkBlackLists(const char *slot, const char *data)-
270{-
271 bool ignore = ignoreAll;-
272-
273 if (!ignore && ignoredTests) {-
274 QByteArray s = slot;-
275 ignore = (ignoredTests->find(s) != ignoredTests->end());-
276 if (!ignore && data) {-
277 s += ':';-
278 s += data;-
279 ignore = (ignoredTests->find(s) != ignoredTests->end());-
280 }-
281 }-
282-
283 QTestResult::setBlacklistCurrentTest(ignore);-
284-
285 // Tests blacklisted in GPU_BLACKLIST are to be skipped. Just ignoring the result is-
286 // not sufficient since these are expected to crash or behave in undefined ways.-
287 if (!ignore && gpuFeatures) {-
288 QByteArray s_gpu = slot;-
289 ignore = isGPUTestBlacklisted(s_gpu, data);-
290 if (!ignore && data) {-
291 s_gpu += ':';-
292 s_gpu += data;-
293 isGPUTestBlacklisted(s_gpu);-
294 }-
295 }-
296}-
297-
298}-
299-
300-
301QT_END_NAMESPACE-
Source codeSwitch to Preprocessed file

Generated by Squish Coco Non-Commercial 4.3.0-BETA-master-30-08-2018-4cb69e9