diff options
Diffstat (limited to 'tests/auto/corelib/io/qdiriterator')
-rw-r--r-- | tests/auto/corelib/io/qdiriterator/CMakeLists.txt | 11 | ||||
-rw-r--r-- | tests/auto/corelib/io/qdiriterator/qdiriterator.qrc | 6 | ||||
-rw-r--r-- | tests/auto/corelib/io/qdiriterator/tst_qdiriterator.cpp | 175 |
3 files changed, 98 insertions, 94 deletions
diff --git a/tests/auto/corelib/io/qdiriterator/CMakeLists.txt b/tests/auto/corelib/io/qdiriterator/CMakeLists.txt index feb742396d..41784546aa 100644 --- a/tests/auto/corelib/io/qdiriterator/CMakeLists.txt +++ b/tests/auto/corelib/io/qdiriterator/CMakeLists.txt @@ -1,16 +1,23 @@ -# Generated from qdiriterator.pro. +# Copyright (C) 2022 The Qt Company Ltd. +# SPDX-License-Identifier: BSD-3-Clause ##################################################################### ## tst_qdiriterator Test: ##################################################################### +if(NOT QT_BUILD_STANDALONE_TESTS AND NOT QT_BUILDING_QT) + cmake_minimum_required(VERSION 3.16) + project(tst_qdiriterator LANGUAGES CXX) + find_package(Qt6BuildInternals REQUIRED COMPONENTS STANDALONE_TEST) +endif() + # Collect test data list(APPEND test_data "entrylist") qt_internal_add_test(tst_qdiriterator SOURCES tst_qdiriterator.cpp - PUBLIC_LIBRARIES + LIBRARIES Qt::CorePrivate TESTDATA ${test_data} ) diff --git a/tests/auto/corelib/io/qdiriterator/qdiriterator.qrc b/tests/auto/corelib/io/qdiriterator/qdiriterator.qrc deleted file mode 100644 index af9998bdb4..0000000000 --- a/tests/auto/corelib/io/qdiriterator/qdiriterator.qrc +++ /dev/null @@ -1,6 +0,0 @@ -<!DOCTYPE RCC><RCC version="1.0"> -<qresource prefix="/testdata/"> - <file>entrylist/file</file> - <file>entrylist/directory/dummy</file> -</qresource> -</RCC> diff --git a/tests/auto/corelib/io/qdiriterator/tst_qdiriterator.cpp b/tests/auto/corelib/io/qdiriterator/tst_qdiriterator.cpp index 9761fbcfb3..a0a8917c27 100644 --- a/tests/auto/corelib/io/qdiriterator/tst_qdiriterator.cpp +++ b/tests/auto/corelib/io/qdiriterator/tst_qdiriterator.cpp @@ -1,31 +1,5 @@ -/**************************************************************************** -** -** Copyright (C) 2021 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the test suite of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:GPL-EXCEPT$ -** 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 https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - +// Copyright (C) 2021 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only #include <QTest> @@ -34,6 +8,8 @@ #include <qdiriterator.h> #include <qfileinfo.h> #include <qstringlist.h> +#include <QSet> +#include <QString> #include <QtCore/private/qfsfileengine_p.h> @@ -41,14 +17,14 @@ #define Q_NO_SYMLINKS #endif -#if defined(Q_OS_WIN) -# include "../../../network-settings.h" -#endif +#include "../../../../shared/filesystem.h" #ifdef Q_OS_ANDROID #include <QStandardPaths> #endif +using namespace Qt::StringLiterals; + Q_DECLARE_METATYPE(QDirIterator::IteratorFlags) Q_DECLARE_METATYPE(QDir::Filters) @@ -70,16 +46,10 @@ private: // convenience functions return false; } - enum Cleanup { DoDelete, DontDelete }; - bool createFile(const QString &fileName, Cleanup cleanup = DoDelete) + bool createFile(const QString &fileName) { QFile file(fileName); - if (file.open(QIODevice::WriteOnly)) { - if (cleanup == DoDelete) - createdFiles << fileName; - return true; - } - return false; + return file.open(QIODevice::WriteOnly); } bool createLink(const QString &destination, const QString &linkName) @@ -93,7 +63,6 @@ private: // convenience functions private slots: void initTestCase(); - void cleanupTestCase(); void iterateRelativeDirectory_data(); void iterateRelativeDirectory(); void iterateResource_data(); @@ -101,6 +70,8 @@ private slots: void stopLinkLoop(); #ifdef QT_BUILD_INTERNAL void engineWithNoIterator(); + void testQFsFileEngineIterator_data() { iterateRelativeDirectory_data(); } + void testQFsFileEngineIterator(); #endif void absoluteFilePathsFromRelativeIteratorPath(); void recurseWithFilters() const; @@ -114,16 +85,16 @@ private slots: #ifndef Q_OS_WIN void hiddenDirs_hiddenFiles(); #endif -#ifdef BUILTIN_TESTDATA + private: QSharedPointer<QTemporaryDir> m_dataDir; -#endif }; void tst_QDirIterator::initTestCase() { + QString testdata_dir; #ifdef Q_OS_ANDROID - QString testdata_dir = QStandardPaths::writableLocation(QStandardPaths::CacheLocation); + testdata_dir = QStandardPaths::writableLocation(QStandardPaths::CacheLocation); QString resourceSourcePath = QStringLiteral(":/testdata"); QDirIterator it(resourceSourcePath, QDirIterator::Subdirectories); while (it.hasNext()) { @@ -146,29 +117,22 @@ void tst_QDirIterator::initTestCase() #elif defined(BUILTIN_TESTDATA) m_dataDir = QEXTRACTTESTDATA("/testdata"); QVERIFY2(!m_dataDir.isNull(), qPrintable("Could not extract test data")); - QString testdata_dir = m_dataDir->path(); + testdata_dir = m_dataDir->path(); #else - - // chdir into testdata directory, then find testdata by relative paths. - QString testdata_dir = QFileInfo(QFINDTESTDATA("entrylist")).absolutePath(); + m_dataDir.reset(new QTemporaryDir); + testdata_dir = m_dataDir->path(); #endif + QVERIFY(!testdata_dir.isEmpty()); + // Must call QDir::setCurrent() here because all the tests that use relative + // paths depend on that. QVERIFY2(QDir::setCurrent(testdata_dir), qPrintable("Could not chdir to " + testdata_dir)); - QFile::remove("entrylist/entrylist1.lnk"); - QFile::remove("entrylist/entrylist2.lnk"); - QFile::remove("entrylist/entrylist3.lnk"); - QFile::remove("entrylist/entrylist4.lnk"); - QFile::remove("entrylist/directory/entrylist1.lnk"); - QFile::remove("entrylist/directory/entrylist2.lnk"); - QFile::remove("entrylist/directory/entrylist3.lnk"); - QFile::remove("entrylist/directory/entrylist4.lnk"); - createDirectory("entrylist"); createDirectory("entrylist/directory"); - createFile("entrylist/file", DontDelete); + createFile("entrylist/file"); createFile("entrylist/writable"); - createFile("entrylist/directory/dummy", DontDelete); + createFile("entrylist/directory/dummy"); createDirectory("recursiveDirs"); createDirectory("recursiveDirs/dir1"); @@ -216,15 +180,6 @@ void tst_QDirIterator::initTestCase() #endif } -void tst_QDirIterator::cleanupTestCase() -{ - Q_FOREACH(QString fileName, createdFiles) - QFile::remove(fileName); - - Q_FOREACH(QString dirName, createdDirectories) - currentDir.rmdir(dirName); -} - void tst_QDirIterator::iterateRelativeDirectory_data() { QTest::addColumn<QString>("dirName"); // relative from current path or abs @@ -349,7 +304,7 @@ void tst_QDirIterator::iterateRelativeDirectory() QFETCH(QDirIterator::IteratorFlags, flags); QFETCH(QDir::Filters, filters); QFETCH(QStringList, nameFilters); - QFETCH(QStringList, entries); + QFETCH(const QStringList, entries); QDirIterator it(dirName, nameFilters, filters, flags); QStringList list; @@ -377,13 +332,13 @@ void tst_QDirIterator::iterateRelativeDirectory() list.sort(); QStringList sortedEntries; - foreach(QString item, entries) + for (const QString &item : entries) sortedEntries.append(QFileInfo(item).canonicalFilePath()); sortedEntries.sort(); if (sortedEntries != list) { - qDebug() << "EXPECTED:" << sortedEntries; qDebug() << "ACTUAL: " << list; + qDebug() << "EXPECTED:" << sortedEntries; } QCOMPARE(list, sortedEntries); @@ -400,13 +355,14 @@ void tst_QDirIterator::iterateResource_data() QTest::newRow("invalid") << QString::fromLatin1(":/testdata/burpaburpa") << QDirIterator::IteratorFlags{} << QDir::Filters(QDir::NoFilter) << QStringList(QLatin1String("*")) << QStringList(); - QTest::newRow(":/testdata") << QString::fromLatin1(":/testdata/") << QDirIterator::IteratorFlags{} + QTest::newRow("qrc:/testdata") << u":/testdata/"_s << QDirIterator::IteratorFlags{} << QDir::Filters(QDir::NoFilter) << QStringList(QLatin1String("*")) << QString::fromLatin1(":/testdata/entrylist").split(QLatin1String(",")); - QTest::newRow(":/testdata/entrylist") << QString::fromLatin1(":/testdata/entrylist") << QDirIterator::IteratorFlags{} + QTest::newRow("qrc:/testdata/entrylist") << u":/testdata/entrylist"_s << QDirIterator::IteratorFlags{} << QDir::Filters(QDir::NoFilter) << QStringList(QLatin1String("*")) << QString::fromLatin1(":/testdata/entrylist/directory,:/testdata/entrylist/file").split(QLatin1String(",")); - QTest::newRow(":/testdata recursive") << QString::fromLatin1(":/testdata") << QDirIterator::IteratorFlags(QDirIterator::Subdirectories) + QTest::newRow("qrc:/testdata recursive") << u":/testdata"_s + << QDirIterator::IteratorFlags(QDirIterator::Subdirectories) << QDir::Filters(QDir::NoFilter) << QStringList(QLatin1String("*")) << QString::fromLatin1(":/testdata/entrylist,:/testdata/entrylist/directory,:/testdata/entrylist/directory/dummy,:/testdata/entrylist/file").split(QLatin1String(",")); } @@ -432,8 +388,8 @@ void tst_QDirIterator::iterateResource() sortedEntries.sort(); if (sortedEntries != list) { - qDebug() << "EXPECTED:" << sortedEntries; qDebug() << "ACTUAL:" << list; + qDebug() << "EXPECTED:" << sortedEntries; } QCOMPARE(list, sortedEntries); @@ -480,16 +436,20 @@ public: : QFSFileEngine(fileName) { } - QAbstractFileEngineIterator *beginEntryList(QDir::Filters, const QStringList &) override - { return 0; } + IteratorUniquePtr + beginEntryList(const QString &, QDir::Filters, const QStringList &) override + { return nullptr; } }; class EngineWithNoIteratorHandler : public QAbstractFileEngineHandler { + Q_DISABLE_COPY_MOVE(EngineWithNoIteratorHandler) public: - QAbstractFileEngine *create(const QString &fileName) const override + EngineWithNoIteratorHandler() = default; + + std::unique_ptr<QAbstractFileEngine> create(const QString &fileName) const override { - return new EngineWithNoIterator(fileName); + return std::make_unique<EngineWithNoIterator>(fileName); } }; #endif @@ -502,6 +462,41 @@ void tst_QDirIterator::engineWithNoIterator() QDir("entrylist").entryList(); QVERIFY(true); // test that the above line doesn't crash } + +class CustomEngineHandler : public QAbstractFileEngineHandler +{ + Q_DISABLE_COPY_MOVE(CustomEngineHandler) +public: + CustomEngineHandler() = default; + + std::unique_ptr<QAbstractFileEngine> create(const QString &fileName) const override + { + // We want to test QFSFileEngine specifically, so force QDirIterator to use it + // over the default QFileSystemEngine + return std::make_unique<QFSFileEngine>(fileName); + } +}; + +void tst_QDirIterator::testQFsFileEngineIterator() +{ + QFETCH(QString, dirName); + QFETCH(QStringList, nameFilters); + QFETCH(QDir::Filters, filters); + QFETCH(QDirIterator::IteratorFlags, flags); + + if (dirName == u"empty") + return; // This row isn't useful in this test + + CustomEngineHandler handler; + bool isEmpty = true; + QDirIterator iter(dirName, nameFilters, filters, flags); + while (iter.hasNext()) { + const QFileInfo &fi = iter.nextFileInfo(); + if (fi.filePath().contains(u"entrylist")) + isEmpty = false; // At least one entry in `entrylist` dir + } + QVERIFY(!isEmpty); +} #endif void tst_QDirIterator::absoluteFilePathsFromRelativeIteratorPath() @@ -544,8 +539,15 @@ void tst_QDirIterator::longPath() while (dir.exists(dirName) || dir.mkdir(dirName)) { ++n; dirName.append('x'); + if (n >= 20480) + { + break; + } + } + if (n >= 20480) + { + qWarning("No maximum length on directory names"); } - QDirIterator it(dir.absolutePath(), QDir::NoDotAndDotDot|QDir::Dirs, QDirIterator::Subdirectories); int m = 0; while (it.hasNext()) { @@ -554,13 +556,14 @@ void tst_QDirIterator::longPath() } QCOMPARE(n, m); - dirName.chop(1); - while (dirName.length() > 0 && dir.exists(dirName) && dir.rmdir(dirName)) { + while (dirName.size() > 0 && dir.exists(dirName) && dir.rmdir(dirName)) { + --n; dirName.chop(1); } - dir.cdUp(); - dir.rmdir("longpaths"); + QCOMPARE(n, 0); + QVERIFY(dir.cdUp()); + QVERIFY(dir.rmdir("longpaths")); } void tst_QDirIterator::dirorder() @@ -586,11 +589,11 @@ void tst_QDirIterator::uncPaths_data() { QTest::addColumn<QString>("dirName"); QTest::newRow("uncserver") - <<QString("//" + QtNetworkSettings::winServerName()); + <<QString("//" + QTest::uncServerName()); QTest::newRow("uncserver/testshare") - <<QString("//" + QtNetworkSettings::winServerName() + "/testshare"); + <<QString("//" + QTest::uncServerName() + "/testshare"); QTest::newRow("uncserver/testshare/tmp") - <<QString("//" + QtNetworkSettings::winServerName() + "/testshare/tmp"); + <<QString("//" + QTest::uncServerName() + "/testshare/tmp"); } void tst_QDirIterator::uncPaths() { |