| 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 test suite of the Qt Toolkit. | 
| 7 | ** | 
| 8 | ** $QT_BEGIN_LICENSE:GPL-EXCEPT$ | 
| 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 General Public License Usage | 
| 18 | ** Alternatively, this file may be used under the terms of the GNU | 
| 19 | ** General Public License version 3 as published by the Free Software | 
| 20 | ** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT | 
| 21 | ** included in the packaging of this file. Please review the following | 
| 22 | ** information to ensure the GNU General Public License requirements will | 
| 23 | ** be met: https://www.gnu.org/licenses/gpl-3.0.html. | 
| 24 | ** | 
| 25 | ** $QT_END_LICENSE$ | 
| 26 | ** | 
| 27 | ****************************************************************************/ | 
| 28 |  | 
| 29 |  | 
| 30 | #include <QtTest/QtTest> | 
| 31 |  | 
| 32 | #include <qcoreapplication.h> | 
| 33 | #include <quuid.h> | 
| 34 |  | 
| 35 | class tst_QUuid : public QObject | 
| 36 | { | 
| 37 |     Q_OBJECT | 
| 38 |  | 
| 39 | private slots: | 
| 40 |     void initTestCase(); | 
| 41 |  | 
| 42 |     void fromChar(); | 
| 43 |     void toString(); | 
| 44 |     void fromString_data(); | 
| 45 |     void fromString(); | 
| 46 |     void toByteArray(); | 
| 47 |     void fromByteArray(); | 
| 48 |     void toRfc4122(); | 
| 49 |     void fromRfc4122(); | 
| 50 |     void createUuidV3OrV5(); | 
| 51 |     void check_QDataStream(); | 
| 52 |     void isNull(); | 
| 53 |     void equal(); | 
| 54 |     void notEqual(); | 
| 55 |     void cpp11(); | 
| 56 |  | 
| 57 |     // Only in Qt > 3.2.x | 
| 58 |     void generate(); | 
| 59 |     void less(); | 
| 60 |     void more(); | 
| 61 |     void variants(); | 
| 62 |     void versions(); | 
| 63 |  | 
| 64 |     void threadUniqueness(); | 
| 65 |     void processUniqueness(); | 
| 66 |  | 
| 67 |     void hash(); | 
| 68 |  | 
| 69 |     void qvariant(); | 
| 70 |     void qvariant_conversion(); | 
| 71 |  | 
| 72 |     void darwinTypes(); | 
| 73 |  | 
| 74 | public: | 
| 75 |     // Variables | 
| 76 |     QUuid uuidNS; | 
| 77 |     QUuid uuidA; | 
| 78 |     QUuid uuidB; | 
| 79 |     QUuid uuidC; | 
| 80 |     QUuid uuidD; | 
| 81 | }; | 
| 82 |  | 
| 83 | void tst_QUuid::initTestCase() | 
| 84 | { | 
| 85 |     //It's NameSpace_DNS in RFC4122 | 
| 86 |     //"{6ba7b810-9dad-11d1-80b4-00c04fd430c8}"; | 
| 87 |     uuidNS = QUuid(0x6ba7b810, 0x9dad, 0x11d1, 0x80, 0xb4, 0x00, 0xc0, 0x4f, 0xd4, 0x30, 0xc8); | 
| 88 |  | 
| 89 |     //"{fc69b59e-cc34-4436-a43c-ee95d128b8c5}"; | 
| 90 |     uuidA = QUuid(0xfc69b59e, 0xcc34, 0x4436, 0xa4, 0x3c, 0xee, 0x95, 0xd1, 0x28, 0xb8, 0xc5); | 
| 91 |  | 
| 92 |     //"{1ab6e93a-b1cb-4a87-ba47-ec7e99039a7b}"; | 
| 93 |     uuidB = QUuid(0x1ab6e93a, 0xb1cb, 0x4a87, 0xba, 0x47, 0xec, 0x7e, 0x99, 0x03, 0x9a, 0x7b); | 
| 94 |  | 
| 95 | #if QT_CONFIG(process) | 
| 96 |     // chdir to the directory containing our testdata, then refer to it with relative paths | 
| 97 | #ifdef Q_OS_ANDROID | 
| 98 |     QString testdata_dir = QCoreApplication::applicationDirPath(); | 
| 99 | #else // !Q_OS_ANDROID | 
| 100 |     QString testdata_dir = QFileInfo(QFINDTESTDATA("testProcessUniqueness" )).absolutePath(); | 
| 101 | #endif | 
| 102 |     QVERIFY2(QDir::setCurrent(testdata_dir), qPrintable("Could not chdir to "  + testdata_dir)); | 
| 103 | #endif | 
| 104 |  | 
| 105 |     //"{3d813cbb-47fb-32ba-91df-831e1593ac29}"; http://www.rfc-editor.org/errata_search.php?rfc=4122&eid=1352 | 
| 106 |     uuidC = QUuid(0x3d813cbb, 0x47fb, 0x32ba, 0x91, 0xdf, 0x83, 0x1e, 0x15, 0x93, 0xac, 0x29); | 
| 107 |  | 
| 108 |     //"{21f7f8de-8051-5b89-8680-0195ef798b6a}"; | 
| 109 |     uuidD = QUuid(0x21f7f8de, 0x8051, 0x5b89, 0x86, 0x80, 0x01, 0x95, 0xef, 0x79, 0x8b, 0x6a); | 
| 110 | } | 
| 111 |  | 
| 112 | void tst_QUuid::fromChar() | 
| 113 | { | 
| 114 |     QCOMPARE(uuidA, QUuid("{fc69b59e-cc34-4436-a43c-ee95d128b8c5}" )); | 
| 115 |     QCOMPARE(uuidA, QUuid("fc69b59e-cc34-4436-a43c-ee95d128b8c5}" )); | 
| 116 |     QCOMPARE(uuidA, QUuid("{fc69b59e-cc34-4436-a43c-ee95d128b8c5" )); | 
| 117 |     QCOMPARE(uuidA, QUuid("fc69b59e-cc34-4436-a43c-ee95d128b8c5" )); | 
| 118 |     QCOMPARE(QUuid(), QUuid("{fc69b59e-cc34-4436-a43c-ee95d128b8c" )); | 
| 119 |     QCOMPARE(QUuid(), QUuid("{fc69b59e-cc34" )); | 
| 120 |     QCOMPARE(QUuid(), QUuid("fc69b59e-cc34-" )); | 
| 121 |     QCOMPARE(QUuid(), QUuid("fc69b59e-cc34" )); | 
| 122 |     QCOMPARE(QUuid(), QUuid("cc34" )); | 
| 123 |     QCOMPARE(QUuid(), QUuid(NULL)); | 
| 124 |  | 
| 125 |     QCOMPARE(uuidB, QUuid(QString("{1ab6e93a-b1cb-4a87-ba47-ec7e99039a7b}" ))); | 
| 126 | } | 
| 127 |  | 
| 128 | void tst_QUuid::toString() | 
| 129 | { | 
| 130 |     QCOMPARE(uuidA.toString(), QString("{fc69b59e-cc34-4436-a43c-ee95d128b8c5}" )); | 
| 131 |     QCOMPARE(uuidA.toString(QUuid::WithoutBraces), | 
| 132 |              QString("fc69b59e-cc34-4436-a43c-ee95d128b8c5" )); | 
| 133 |     QCOMPARE(uuidA.toString(QUuid::Id128), | 
| 134 |              QString("fc69b59ecc344436a43cee95d128b8c5" )); | 
| 135 |  | 
| 136 |     QCOMPARE(uuidB.toString(), QString("{1ab6e93a-b1cb-4a87-ba47-ec7e99039a7b}" )); | 
| 137 |     QCOMPARE(uuidB.toString(QUuid::WithoutBraces), | 
| 138 |              QString("1ab6e93a-b1cb-4a87-ba47-ec7e99039a7b" )); | 
| 139 |     QCOMPARE(uuidB.toString(QUuid::Id128), | 
| 140 |              QString("1ab6e93ab1cb4a87ba47ec7e99039a7b" )); | 
| 141 | } | 
| 142 |  | 
| 143 | void tst_QUuid::fromString_data() | 
| 144 | { | 
| 145 |     QTest::addColumn<QUuid>(name: "expected" ); | 
| 146 |     QTest::addColumn<QString>(name: "input" ); | 
| 147 |  | 
| 148 |     QUuid invalid = {}; | 
| 149 |  | 
| 150 | #define ROW(which, string) \ | 
| 151 |     QTest::addRow("%-38s -> %s", string, #which) << which << string | 
| 152 |     ROW(uuidA,   "{fc69b59e-cc34-4436-a43c-ee95d128b8c5}" ); | 
| 153 |     ROW(uuidA,    "fc69b59e-cc34-4436-a43c-ee95d128b8c5}" ); | 
| 154 |     ROW(uuidA,   "{fc69b59e-cc34-4436-a43c-ee95d128b8c5"  ); | 
| 155 |     ROW(uuidA,    "fc69b59e-cc34-4436-a43c-ee95d128b8c5"  ); | 
| 156 |  | 
| 157 |     ROW(uuidA,   "{fc69b59e-cc34-4436-a43c-ee95d128b8c56" ); // too long (not an error!) | 
| 158 |     ROW(invalid, "{fc69b59e-cc34-4436-a43c-ee95d128b8c"   ); // premature end (within length limits) | 
| 159 |     ROW(invalid, " fc69b59e-cc34-4436-a43c-ee95d128b8c5}" ); // leading space | 
| 160 |     ROW(uuidA,   "{fc69b59e-cc34-4436-a43c-ee95d128b8c5 " ); // trailing space (not an error!) | 
| 161 |     ROW(invalid, "{gc69b59e-cc34-4436-a43c-ee95d128b8c5}" ); // non-hex digit in 1st group | 
| 162 |     ROW(invalid, "{fc69b59e-cp34-4436-a43c-ee95d128b8c5}" ); // non-hex digit in 2nd group | 
| 163 |     ROW(invalid, "{fc69b59e-cc34-44r6-a43c-ee95d128b8c5}" ); // non-hex digit in 3rd group | 
| 164 |     ROW(invalid, "{fc69b59e-cc34-4436-a4yc-ee95d128b8c5}" ); // non-hex digit in 4th group | 
| 165 |     ROW(invalid, "{fc69b59e-cc34-4436-a43c-ee95d128j8c5}" ); // non-hex digit in last group | 
| 166 |     ROW(invalid, "(fc69b59e-cc34-4436-a43c-ee95d128b8c5}" ); // wrong initial character | 
| 167 |     ROW(invalid, "{fc69b59e+cc34-4436-a43c-ee95d128b8c5}" ); // wrong 1st separator | 
| 168 |     ROW(invalid, "{fc69b59e-cc34*4436-a43c-ee95d128b8c5}" ); // wrong 2nd separator | 
| 169 |     ROW(invalid, "{fc69b59e-cc34-44366a43c-ee95d128b8c5}" ); // wrong 3rd separator | 
| 170 |     ROW(invalid, "{fc69b59e-cc34-4436-a43c\303\244ee95d128b8c5}" ); // wrong 4th separator (ä) | 
| 171 |     ROW(uuidA,   "{fc69b59e-cc34-4436-a43c-ee95d128b8c5)" ); // wrong final character (not an error!) | 
| 172 |  | 
| 173 |     ROW(uuidB,   "{1ab6e93a-b1cb-4a87-ba47-ec7e99039a7b}" ); | 
| 174 | #undef ROW | 
| 175 | } | 
| 176 |  | 
| 177 | void tst_QUuid::fromString() | 
| 178 | { | 
| 179 |     QFETCH(const QUuid, expected); | 
| 180 |     QFETCH(const QString, input); | 
| 181 |  | 
| 182 |     const auto inputL1 = input.toLatin1(); | 
| 183 |     const auto inputU8 = input.toUtf8(); | 
| 184 |  | 
| 185 |     QCOMPARE(expected, QUuid(input)); | 
| 186 |     QCOMPARE(expected, QUuid(inputU8)); | 
| 187 |     QCOMPARE(expected, QUuid(inputL1)); | 
| 188 |  | 
| 189 |     QCOMPARE(expected, QUuid::fromString(input)); | 
| 190 |  | 
| 191 |     // for QLatin1String, construct one whose data() is not NUL-terminated: | 
| 192 |     const auto longerInputL1 = inputL1 + '5'; // the '5' makes the premature end check incorrectly succeed | 
| 193 |     const auto inputL1S = QLatin1String(longerInputL1.data(), inputL1.size()); | 
| 194 |     QCOMPARE(expected, QUuid::fromString(inputL1S)); | 
| 195 | } | 
| 196 |  | 
| 197 | void tst_QUuid::toByteArray() | 
| 198 | { | 
| 199 |     QCOMPARE(uuidA.toByteArray(), QByteArray("{fc69b59e-cc34-4436-a43c-ee95d128b8c5}" )); | 
| 200 |     QCOMPARE(uuidA.toByteArray(QUuid::WithoutBraces), | 
| 201 |              QByteArray("fc69b59e-cc34-4436-a43c-ee95d128b8c5" )); | 
| 202 |     QCOMPARE(uuidA.toByteArray(QUuid::Id128), | 
| 203 |              QByteArray("fc69b59ecc344436a43cee95d128b8c5" )); | 
| 204 |  | 
| 205 |     QCOMPARE(uuidB.toByteArray(), QByteArray("{1ab6e93a-b1cb-4a87-ba47-ec7e99039a7b}" )); | 
| 206 |     QCOMPARE(uuidB.toByteArray(QUuid::WithoutBraces), | 
| 207 |              QByteArray("1ab6e93a-b1cb-4a87-ba47-ec7e99039a7b" )); | 
| 208 |     QCOMPARE(uuidB.toByteArray(QUuid::Id128), | 
| 209 |              QByteArray("1ab6e93ab1cb4a87ba47ec7e99039a7b" )); | 
| 210 | } | 
| 211 |  | 
| 212 | void tst_QUuid::fromByteArray() | 
| 213 | { | 
| 214 |     QCOMPARE(uuidA, QUuid(QByteArray("{fc69b59e-cc34-4436-a43c-ee95d128b8c5}" ))); | 
| 215 |     QCOMPARE(uuidA, QUuid(QByteArray("fc69b59e-cc34-4436-a43c-ee95d128b8c5}" ))); | 
| 216 |     QCOMPARE(uuidA, QUuid(QByteArray("{fc69b59e-cc34-4436-a43c-ee95d128b8c5" ))); | 
| 217 |     QCOMPARE(uuidA, QUuid(QByteArray("fc69b59e-cc34-4436-a43c-ee95d128b8c5" ))); | 
| 218 |     QCOMPARE(QUuid(), QUuid(QByteArray("{fc69b59e-cc34-4436-a43c-ee95d128b8c" ))); | 
| 219 |  | 
| 220 |     QCOMPARE(uuidB, QUuid(QByteArray("{1ab6e93a-b1cb-4a87-ba47-ec7e99039a7b}" ))); | 
| 221 | } | 
| 222 |  | 
| 223 | void tst_QUuid::toRfc4122() | 
| 224 | { | 
| 225 |     QCOMPARE(uuidA.toRfc4122(), QByteArray::fromHex("fc69b59ecc344436a43cee95d128b8c5" )); | 
| 226 |  | 
| 227 |     QCOMPARE(uuidB.toRfc4122(), QByteArray::fromHex("1ab6e93ab1cb4a87ba47ec7e99039a7b" )); | 
| 228 | } | 
| 229 |  | 
| 230 | void tst_QUuid::fromRfc4122() | 
| 231 | { | 
| 232 |     QCOMPARE(uuidA, QUuid::fromRfc4122(QByteArray::fromHex("fc69b59ecc344436a43cee95d128b8c5" ))); | 
| 233 |  | 
| 234 |     QCOMPARE(uuidB, QUuid::fromRfc4122(QByteArray::fromHex("1ab6e93ab1cb4a87ba47ec7e99039a7b" ))); | 
| 235 | } | 
| 236 |  | 
| 237 | void tst_QUuid::createUuidV3OrV5() | 
| 238 | { | 
| 239 |     //"www.widgets.com" is also from RFC4122 | 
| 240 |     QCOMPARE(uuidC, QUuid::createUuidV3(uuidNS, QByteArray("www.widgets.com" ))); | 
| 241 |     QCOMPARE(uuidC, QUuid::createUuidV3(uuidNS, QString("www.widgets.com" ))); | 
| 242 |  | 
| 243 |     QCOMPARE(uuidD, QUuid::createUuidV5(uuidNS, QByteArray("www.widgets.com" ))); | 
| 244 |     QCOMPARE(uuidD, QUuid::createUuidV5(uuidNS, QString("www.widgets.com" ))); | 
| 245 | } | 
| 246 |  | 
| 247 | void tst_QUuid::check_QDataStream() | 
| 248 | { | 
| 249 |     QUuid tmp; | 
| 250 |     QByteArray ar; | 
| 251 |     { | 
| 252 |         QDataStream out(&ar,QIODevice::WriteOnly); | 
| 253 |         out.setByteOrder(QDataStream::BigEndian); | 
| 254 |         out << uuidA; | 
| 255 |     } | 
| 256 |     { | 
| 257 |         QDataStream in(&ar,QIODevice::ReadOnly); | 
| 258 |         in.setByteOrder(QDataStream::BigEndian); | 
| 259 |         in >> tmp; | 
| 260 |         QCOMPARE(uuidA, tmp); | 
| 261 |     } | 
| 262 |     { | 
| 263 |         QDataStream out(&ar,QIODevice::WriteOnly); | 
| 264 |         out.setByteOrder(QDataStream::LittleEndian); | 
| 265 |         out << uuidA; | 
| 266 |     } | 
| 267 |     { | 
| 268 |         QDataStream in(&ar,QIODevice::ReadOnly); | 
| 269 |         in.setByteOrder(QDataStream::LittleEndian); | 
| 270 |         in >> tmp; | 
| 271 |         QCOMPARE(uuidA, tmp); | 
| 272 |     } | 
| 273 | } | 
| 274 |  | 
| 275 | void tst_QUuid::isNull() | 
| 276 | { | 
| 277 |     QVERIFY( !uuidA.isNull() ); | 
| 278 |  | 
| 279 |     QUuid should_be_null_uuid; | 
| 280 |     QVERIFY( should_be_null_uuid.isNull() ); | 
| 281 | } | 
| 282 |  | 
| 283 |  | 
| 284 | void tst_QUuid::equal() | 
| 285 | { | 
| 286 |     QVERIFY( !(uuidA == uuidB) ); | 
| 287 |  | 
| 288 |     QUuid copy(uuidA); | 
| 289 |     QCOMPARE(uuidA, copy); | 
| 290 |  | 
| 291 |     QUuid assigned; | 
| 292 |     assigned = uuidA; | 
| 293 |     QCOMPARE(uuidA, assigned); | 
| 294 | } | 
| 295 |  | 
| 296 |  | 
| 297 | void tst_QUuid::notEqual() | 
| 298 | { | 
| 299 |     QVERIFY( uuidA != uuidB ); | 
| 300 | } | 
| 301 |  | 
| 302 | void tst_QUuid::cpp11() { | 
| 303 | #ifdef Q_COMPILER_UNIFORM_INIT | 
| 304 |     // "{fc69b59e-cc34-4436-a43c-ee95d128b8c5}" cf, initTestCase | 
| 305 |     Q_DECL_CONSTEXPR QUuid u1{0xfc69b59e, 0xcc34, 0x4436, 0xa4, 0x3c, 0xee, 0x95, 0xd1, 0x28, 0xb8, 0xc5}; | 
| 306 |     Q_DECL_CONSTEXPR QUuid u2 = {0xfc69b59e, 0xcc34, 0x4436, 0xa4, 0x3c, 0xee, 0x95, 0xd1, 0x28, 0xb8, 0xc5}; | 
| 307 |     Q_UNUSED(u1); | 
| 308 |     Q_UNUSED(u2); | 
| 309 | #else | 
| 310 |     QSKIP("This compiler is not in C++11 mode or it doesn't support uniform initialization" ); | 
| 311 | #endif | 
| 312 | } | 
| 313 |  | 
| 314 | void tst_QUuid::generate() | 
| 315 | { | 
| 316 |     QUuid shouldnt_be_null_uuidA = QUuid::createUuid(); | 
| 317 |     QUuid shouldnt_be_null_uuidB = QUuid::createUuid(); | 
| 318 |     QVERIFY( !shouldnt_be_null_uuidA.isNull() ); | 
| 319 |     QVERIFY( !shouldnt_be_null_uuidB.isNull() ); | 
| 320 |     QVERIFY( shouldnt_be_null_uuidA != shouldnt_be_null_uuidB ); | 
| 321 | } | 
| 322 |  | 
| 323 |  | 
| 324 | void tst_QUuid::less() | 
| 325 | { | 
| 326 |     QVERIFY(  uuidB <  uuidA); | 
| 327 |     QVERIFY(  uuidB <= uuidA); | 
| 328 |     QVERIFY(!(uuidA <  uuidB) ); | 
| 329 |     QVERIFY(!(uuidA <= uuidB)); | 
| 330 |  | 
| 331 |     QUuid null_uuid; | 
| 332 |     QVERIFY(null_uuid < uuidA); // Null uuid is always less than a valid one | 
| 333 |     QVERIFY(null_uuid <= uuidA); | 
| 334 |  | 
| 335 |     QVERIFY(null_uuid <= null_uuid); | 
| 336 |     QVERIFY(uuidA <= uuidA); | 
| 337 | } | 
| 338 |  | 
| 339 |  | 
| 340 | void tst_QUuid::more() | 
| 341 | { | 
| 342 |     QVERIFY(  uuidA >  uuidB); | 
| 343 |     QVERIFY(  uuidA >= uuidB); | 
| 344 |     QVERIFY(!(uuidB >  uuidA)); | 
| 345 |     QVERIFY(!(uuidB >= uuidA)); | 
| 346 |  | 
| 347 |     QUuid null_uuid; | 
| 348 |     QVERIFY(!(null_uuid >  uuidA)); // Null uuid is always less than a valid one | 
| 349 |     QVERIFY(!(null_uuid >= uuidA)); | 
| 350 |  | 
| 351 |     QVERIFY(null_uuid >= null_uuid); | 
| 352 |     QVERIFY(uuidA >= uuidA); | 
| 353 | } | 
| 354 |  | 
| 355 |  | 
| 356 | void tst_QUuid::variants() | 
| 357 | { | 
| 358 |     QVERIFY( uuidA.variant() == QUuid::DCE ); | 
| 359 |     QVERIFY( uuidB.variant() == QUuid::DCE ); | 
| 360 |  | 
| 361 |     QUuid NCS = "{3a2f883c-4000-000d-0000-00fb40000000}" ; | 
| 362 |     QVERIFY( NCS.variant() == QUuid::NCS ); | 
| 363 | } | 
| 364 |  | 
| 365 |  | 
| 366 | void tst_QUuid::versions() | 
| 367 | { | 
| 368 |     QVERIFY( uuidA.version() == QUuid::Random ); | 
| 369 |     QVERIFY( uuidB.version() == QUuid::Random ); | 
| 370 |  | 
| 371 |     QUuid DCE_time= "{406c45a0-3b7e-11d0-80a3-0000c08810a7}" ; | 
| 372 |     QVERIFY( DCE_time.version() == QUuid::Time ); | 
| 373 |  | 
| 374 |     QUuid NCS = "{3a2f883c-4000-000d-0000-00fb40000000}" ; | 
| 375 |     QVERIFY( NCS.version() == QUuid::VerUnknown ); | 
| 376 | } | 
| 377 |  | 
| 378 | class UuidThread : public QThread | 
| 379 | { | 
| 380 | public: | 
| 381 |     QUuid uuid; | 
| 382 |  | 
| 383 |     void run() | 
| 384 |     { | 
| 385 |         uuid = QUuid::createUuid(); | 
| 386 |     } | 
| 387 | }; | 
| 388 |  | 
| 389 | void tst_QUuid::threadUniqueness() | 
| 390 | { | 
| 391 |     QVector<UuidThread *> threads(qMax(a: 2, b: QThread::idealThreadCount())); | 
| 392 |     for (int i = 0; i < threads.count(); ++i) | 
| 393 |         threads[i] = new UuidThread; | 
| 394 |     for (int i = 0; i < threads.count(); ++i) | 
| 395 |         threads[i]->start(); | 
| 396 |     for (int i = 0; i < threads.count(); ++i) | 
| 397 |         QVERIFY(threads[i]->wait(1000)); | 
| 398 |     for (int i = 1; i < threads.count(); ++i) | 
| 399 |         QVERIFY(threads[0]->uuid != threads[i]->uuid); | 
| 400 |     qDeleteAll(c: threads); | 
| 401 | } | 
| 402 |  | 
| 403 | void tst_QUuid::processUniqueness() | 
| 404 | { | 
| 405 | #if !QT_CONFIG(process) | 
| 406 |     QSKIP("No qprocess support" , SkipAll); | 
| 407 | #else | 
| 408 | #ifdef Q_OS_ANDROID | 
| 409 |     QSKIP("This test crashes on Android" ); | 
| 410 | #endif | 
| 411 |     QProcess process; | 
| 412 |     QString processOneOutput; | 
| 413 |     QString processTwoOutput; | 
| 414 |  | 
| 415 |     // Start it once | 
| 416 | #ifdef Q_OS_MAC | 
| 417 |     process.start("testProcessUniqueness/testProcessUniqueness.app" ); | 
| 418 | #elif defined(Q_OS_ANDROID) | 
| 419 |     process.start("libtestProcessUniqueness.so" ); | 
| 420 | #else | 
| 421 |     process.start(command: "testProcessUniqueness/testProcessUniqueness" ); | 
| 422 | #endif | 
| 423 |     QVERIFY(process.waitForFinished()); | 
| 424 |     processOneOutput = process.readAllStandardOutput(); | 
| 425 |  | 
| 426 |     // Start it twice | 
| 427 | #ifdef Q_OS_MAC | 
| 428 |     process.start("testProcessUniqueness/testProcessUniqueness.app" ); | 
| 429 | #elif defined(Q_OS_ANDROID) | 
| 430 |     process.start("libtestProcessUniqueness.so" ); | 
| 431 | #else | 
| 432 |     process.start(command: "testProcessUniqueness/testProcessUniqueness" ); | 
| 433 | #endif | 
| 434 |     QVERIFY(process.waitForFinished()); | 
| 435 |     processTwoOutput = process.readAllStandardOutput(); | 
| 436 |  | 
| 437 |     // They should be *different*! | 
| 438 |     QVERIFY(processOneOutput != processTwoOutput); | 
| 439 | #endif | 
| 440 | } | 
| 441 |  | 
| 442 | void tst_QUuid::hash() | 
| 443 | { | 
| 444 |     uint h = qHash(uuid: uuidA); | 
| 445 |     QCOMPARE(qHash(uuidA), h); | 
| 446 |     QCOMPARE(qHash(QUuid(uuidA.toString())), h); | 
| 447 | } | 
| 448 |  | 
| 449 | void tst_QUuid::qvariant() | 
| 450 | { | 
| 451 |     QUuid uuid = QUuid::createUuid(); | 
| 452 |     QVariant v = QVariant::fromValue(value: uuid); | 
| 453 |     QVERIFY(!v.isNull()); | 
| 454 |     QCOMPARE(v.type(), QVariant::Uuid); | 
| 455 |  | 
| 456 |     QUuid uuid2 = v.value<QUuid>(); | 
| 457 |     QVERIFY(!uuid2.isNull()); | 
| 458 |     QCOMPARE(uuid, uuid2); | 
| 459 | } | 
| 460 |  | 
| 461 | void tst_QUuid::qvariant_conversion() | 
| 462 | { | 
| 463 |     QUuid uuid = QUuid::createUuid(); | 
| 464 |     QVariant v = QVariant::fromValue(value: uuid); | 
| 465 |  | 
| 466 |     // QUuid -> QString | 
| 467 |     QVERIFY(v.canConvert<QString>()); | 
| 468 |     QCOMPARE(v.toString(), uuid.toString()); | 
| 469 |     QCOMPARE(v.value<QString>(), uuid.toString()); | 
| 470 |  | 
| 471 |     // QUuid -> QByteArray | 
| 472 |     QVERIFY(v.canConvert<QByteArray>()); | 
| 473 |     QCOMPARE(v.toByteArray(), uuid.toByteArray()); | 
| 474 |     QCOMPARE(v.value<QByteArray>(), uuid.toByteArray()); | 
| 475 |  | 
| 476 |     QVERIFY(!v.canConvert<int>()); | 
| 477 |     QVERIFY(!v.canConvert<QStringList>()); | 
| 478 |  | 
| 479 |     // try reverse conversion QString -> QUuid | 
| 480 |     QVariant sv = QVariant::fromValue(value: uuid.toString()); | 
| 481 |     QCOMPARE(sv.type(), QVariant::String); | 
| 482 |     QVERIFY(sv.canConvert<QUuid>()); | 
| 483 |     QCOMPARE(sv.value<QUuid>(), uuid); | 
| 484 |  | 
| 485 |     // QString -> QUuid | 
| 486 |     { | 
| 487 |         QVariant sv = QVariant::fromValue(value: uuid.toByteArray()); | 
| 488 |         QCOMPARE(sv.type(), QVariant::ByteArray); | 
| 489 |         QVERIFY(sv.canConvert<QUuid>()); | 
| 490 |         QCOMPARE(sv.value<QUuid>(), uuid); | 
| 491 |     } | 
| 492 | } | 
| 493 |  | 
| 494 | void tst_QUuid::darwinTypes() | 
| 495 | { | 
| 496 | #ifndef Q_OS_DARWIN | 
| 497 |     QSKIP("This is a Darwin-only test" ); | 
| 498 | #else | 
| 499 |     extern void tst_QUuid_darwinTypes(); // in tst_quuid_darwin.mm | 
| 500 |     tst_QUuid_darwinTypes(); | 
| 501 | #endif | 
| 502 | } | 
| 503 |  | 
| 504 | QTEST_MAIN(tst_QUuid) | 
| 505 | #include "tst_quuid.moc" | 
| 506 |  |