diff options
Diffstat (limited to 'tests/auto/corelib/serialization/qcborstreamreader')
-rw-r--r-- | tests/auto/corelib/serialization/qcborstreamreader/CMakeLists.txt | 14 | ||||
-rw-r--r-- | tests/auto/corelib/serialization/qcborstreamreader/tst_qcborstreamreader.cpp | 125 |
2 files changed, 107 insertions, 32 deletions
diff --git a/tests/auto/corelib/serialization/qcborstreamreader/CMakeLists.txt b/tests/auto/corelib/serialization/qcborstreamreader/CMakeLists.txt index 7f979697cf..af6aaf3eab 100644 --- a/tests/auto/corelib/serialization/qcborstreamreader/CMakeLists.txt +++ b/tests/auto/corelib/serialization/qcborstreamreader/CMakeLists.txt @@ -1,18 +1,26 @@ # Copyright (C) 2022 The Qt Company Ltd. # SPDX-License-Identifier: BSD-3-Clause -# Generated from qcborstreamreader.pro. - ##################################################################### ## tst_qcborstreamreader Test: ##################################################################### +if(NOT QT_BUILD_STANDALONE_TESTS AND NOT QT_BUILDING_QT) + cmake_minimum_required(VERSION 3.16) + project(tst_qcborstreamreader LANGUAGES CXX) + find_package(Qt6BuildInternals REQUIRED COMPONENTS STANDALONE_TEST) +endif() + qt_internal_add_test(tst_qcborstreamreader SOURCES tst_qcborstreamreader.cpp INCLUDE_DIRECTORIES ../../../../../src/3rdparty/tinycbor/src - ../../../../../src/3rdparty/tinycbor/tests/parser + ../../../../../src/3rdparty/tinycbor/tests + NO_BATCH # QTBUG-121815 + DEFINES + QTEST_THROW_ON_FAIL + QTEST_THROW_ON_SKIP LIBRARIES Qt::CorePrivate ) diff --git a/tests/auto/corelib/serialization/qcborstreamreader/tst_qcborstreamreader.cpp b/tests/auto/corelib/serialization/qcborstreamreader/tst_qcborstreamreader.cpp index afd02dc6b7..05e3c7bc23 100644 --- a/tests/auto/corelib/serialization/qcborstreamreader/tst_qcborstreamreader.cpp +++ b/tests/auto/corelib/serialization/qcborstreamreader/tst_qcborstreamreader.cpp @@ -1,11 +1,13 @@ // Copyright (C) 2020 Intel Corporation. -// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only #include <QtCore/qcborstream.h> #include <QTest> #include <QBuffer> -#include <QtCore/private/qbytearray_p.h> +#ifndef QTEST_THROW_ON_FAIL +# error This test requires QTEST_THROW_ON_FAIL being active. +#endif class tst_QCborStreamReader : public QObject { @@ -88,7 +90,7 @@ template<> char *toString<QCborStreamReader::Type>(const QCborStreamReader::Type QT_END_NAMESPACE // Get the data from TinyCBOR (see src/3rdparty/tinycbor/tests/parser/data.cpp) -#include "data.cpp" +#include "parser/data.cpp" void tst_QCborStreamReader::initTestCase_data() { @@ -629,8 +631,6 @@ void tst_QCborStreamReader::strings_data() void tst_QCborStreamReader::strings() { fixed(); - if (QTest::currentTestFailed()) - return; // Extra string checks: // We'll compare the reads using readString() and readByteArray() @@ -657,6 +657,7 @@ void tst_QCborStreamReader::strings() QCOMPARE(reader.currentStringChunkSize(), qsizetype(reader.length())); int chunks = 0; + QByteArray fullString; forever { QCborStreamReader::StringResult<QByteArray> controlData; if (reader.isString()) { @@ -667,6 +668,7 @@ void tst_QCborStreamReader::strings() controlData = controlReader.readByteArray(); } QVERIFY(controlData.status != QCborStreamReader::Error); + fullString += controlData.data; for (int i = 0; i < 10; ++i) { // this call must work several times with the same result @@ -689,6 +691,43 @@ void tst_QCborStreamReader::strings() if (!isChunked) QCOMPARE(chunks, 1); + + // Now re-do and compare with toString() and toByteArray(), against + // the control data we calculated above + reader.reset(); + QVERIFY(reader.isString() || reader.isByteArray()); + if (reader.isByteArray()) { + QByteArray prefix("some prefix"); + QByteArray ba = prefix; + QVERIFY(reader.readAndAppendToByteArray(ba)); + QCOMPARE(ba, prefix + fullString); + } else { + QString prefix("some prefix"); + QString str = prefix; + QVERIFY(reader.readAndAppendToString(str)); + QCOMPARE(str, prefix + QString::fromUtf8(fullString)); + } + + // Re-do again using the UTF-8 interface. + reader.reset(); + QVERIFY(reader.isString() || reader.isByteArray()); + if (reader.isString()) { + QByteArray prefix("some prefix"); + QByteArray utf8 = prefix; + QVERIFY(reader.readAndAppendToUtf8String(utf8)); + QCOMPARE(utf8, prefix + fullString); + + reader.reset(); + fullString = prefix; + forever { + auto r = reader.readUtf8String(); + QCOMPARE_NE(r.status, QCborStreamReader::Error); + fullString += r.data; + if (r.status == QCborStreamReader::EndOfString) + break; + } + QCOMPARE(fullString, utf8); + } } void tst_QCborStreamReader::tags_data() @@ -777,9 +816,6 @@ void tst_QCborStreamReader::arrays() removeIndicators(expected); checkContainer(1, '\x81' + data, '[' + expected + ']'); - if (QTest::currentTestFailed()) - return; - checkContainer(2, '\x82' + data + data, '[' + expected + ", " + expected + ']'); } @@ -791,19 +827,11 @@ void tst_QCborStreamReader::maps() // int keys checkContainer(1, "\xa1\1" + data, "{1: " + expected + '}'); - if (QTest::currentTestFailed()) - return; - checkContainer(2, "\xa2\1" + data + '\x20' + data, "{1: " + expected + ", -1: " + expected + '}'); - if (QTest::currentTestFailed()) - return; // string keys checkContainer(1, "\xa1\x65Hello" + data, "{\"Hello\": " + expected + '}'); - if (QTest::currentTestFailed()) - return; - checkContainer(2, "\xa2\x65World" + data + "\x65Hello" + data, "{\"World\": " + expected + ", \"Hello\": " + expected + '}'); } @@ -815,9 +843,6 @@ void tst_QCborStreamReader::undefLengthArrays() removeIndicators(expected); checkContainer(-1, '\x9f' + data + '\xff', '[' + expected + ']'); - if (QTest::currentTestFailed()) - return; - checkContainer(-2, '\x9f' + data + data + '\xff', '[' + expected + ", " + expected + ']'); } @@ -829,19 +854,11 @@ void tst_QCborStreamReader::undefLengthMaps() // int keys checkContainer(-1, "\xbf\1" + data + '\xff', "{1: " + expected + '}'); - if (QTest::currentTestFailed()) - return; - checkContainer(-2, "\xbf\1" + data + '\x20' + data + '\xff', "{1: " + expected + ", -1: " + expected + '}'); - if (QTest::currentTestFailed()) - return; // string keys checkContainer(-1, "\xbf\x65Hello" + data + '\xff', "{\"Hello\": " + expected + '}'); - if (QTest::currentTestFailed()) - return; - checkContainer(-2, "\xbf\x65World" + data + "\x65Hello" + data + '\xff', "{\"World\": " + expected + ", \"Hello\": " + expected + '}'); } @@ -881,7 +898,7 @@ void tst_QCborStreamReader::validation_data() // Add QCborStreamReader-specific limitations due to use of QByteArray and // QString, which are allocated by QArrayData::allocate(). const qsizetype MaxInvalid = std::numeric_limits<QByteArray::size_type>::max(); - const qsizetype MinInvalid = MaxByteArraySize + 1; + const qsizetype MinInvalid = QByteArray::max_size() + 1; addValidationColumns(); addValidationData(MinInvalid); @@ -908,11 +925,57 @@ void tst_QCborStreamReader::validation() reader.reset(); QVERIFY(!reader.next()); QCOMPARE(reader.lastError(), error); + + // check toString() and toByteArray() too + if (reader.isString() || reader.isByteArray()) { + reader.reset(); + if (reader.isString()) { + QString prefix = "some prefix"; + QString str = prefix; + QVERIFY(!reader.readAndAppendToString(str)); + QVERIFY(str.startsWith(prefix)); // but may have decoded some + } else if (reader.isByteArray()) { + QByteArray prefix = "some prefix"; + QByteArray ba = prefix; + QVERIFY(!reader.readAndAppendToByteArray(ba)); + QVERIFY(ba.startsWith(prefix)); // but may have decoded some + } + QCOMPARE(reader.lastError(), error); + + reader.reset(); + if (reader.isString()) + QVERIFY(reader.readAllString().isNull()); + else + QVERIFY(reader.readAllByteArray().isNull()); + } + + reader.reset(); + + // and the UTF-8 API + if (reader.isString()) { + QByteArray prefix = "some prefix"; + QByteArray ba = prefix; + QVERIFY(!reader.readAndAppendToUtf8String(ba)); + QVERIFY(ba.startsWith(prefix)); // but may have decoded some + QCOMPARE(reader.lastError(), error); + + reader.reset(); + QVERIFY(reader.readAllUtf8String().isNull()); + + reader.reset(); + auto r = reader.readUtf8String(); + for ( ; r.status == QCborStreamReader::Ok; r = reader.readUtf8String()) { + // while the data is valid... + QVERIFY(!r.data.isNull()); + } + QCOMPARE_NE(r.status, QCborStreamReader::EndOfString); + QCOMPARE(reader.lastError(), error); + } } void tst_QCborStreamReader::hugeDeviceValidation_data() { - addValidationHugeDevice(MaxByteArraySize + 1, MaxStringSize + 1); + addValidationHugeDevice(QByteArray::max_size() + 1, QString::max_size() + 1); } void tst_QCborStreamReader::hugeDeviceValidation() @@ -927,6 +990,10 @@ void tst_QCborStreamReader::hugeDeviceValidation() QSKIP("This test tries to allocate a huge memory buffer," " which Address Sanitizer flags as a problem"); #endif +#if defined(Q_OS_WASM) + QSKIP("This test tries to allocate a huge memory buffer," + " causes problem on WebAssembly platform which has limited resources."); +#endif // Q_OS_WASM QFETCH(QSharedPointer<QIODevice>, device); QFETCH(CborError, expectedError); |