diff options
Diffstat (limited to 'tests/auto/corelib/io/qtemporarydir')
-rw-r--r-- | tests/auto/corelib/io/qtemporarydir/BLACKLIST | 2 | ||||
-rw-r--r-- | tests/auto/corelib/io/qtemporarydir/CMakeLists.txt | 19 | ||||
-rw-r--r-- | tests/auto/corelib/io/qtemporarydir/tst_qtemporarydir.cpp | 152 |
3 files changed, 119 insertions, 54 deletions
diff --git a/tests/auto/corelib/io/qtemporarydir/BLACKLIST b/tests/auto/corelib/io/qtemporarydir/BLACKLIST new file mode 100644 index 0000000000..da7dac909f --- /dev/null +++ b/tests/auto/corelib/io/qtemporarydir/BLACKLIST @@ -0,0 +1,2 @@ +[QTBUG43352_failedSetPermissions] +macos-14 arm ci diff --git a/tests/auto/corelib/io/qtemporarydir/CMakeLists.txt b/tests/auto/corelib/io/qtemporarydir/CMakeLists.txt index 58eb49dff8..0ddde7d0b3 100644 --- a/tests/auto/corelib/io/qtemporarydir/CMakeLists.txt +++ b/tests/auto/corelib/io/qtemporarydir/CMakeLists.txt @@ -1,15 +1,24 @@ -# Generated from qtemporarydir.pro. +# Copyright (C) 2022 The Qt Company Ltd. +# SPDX-License-Identifier: BSD-3-Clause ##################################################################### ## tst_qtemporarydir Test: ##################################################################### +if(NOT QT_BUILD_STANDALONE_TESTS AND NOT QT_BUILDING_QT) + cmake_minimum_required(VERSION 3.16) + project(tst_qtemporarydir LANGUAGES CXX) + find_package(Qt6BuildInternals REQUIRED COMPONENTS STANDALONE_TEST) +endif() + qt_internal_add_test(tst_qtemporarydir SOURCES - ../../../../shared/emulationdetector.h tst_qtemporarydir.cpp - INCLUDE_DIRECTORIES - ../../../../shared - PUBLIC_LIBRARIES + LIBRARIES Qt::TestPrivate ) + +qt_internal_extend_target(tst_qtemporarydir CONDITION WIN32 + LIBRARIES + shlwapi +) diff --git a/tests/auto/corelib/io/qtemporarydir/tst_qtemporarydir.cpp b/tests/auto/corelib/io/qtemporarydir/tst_qtemporarydir.cpp index 4f4bedd933..737317a8fb 100644 --- a/tests/auto/corelib/io/qtemporarydir/tst_qtemporarydir.cpp +++ b/tests/auto/corelib/io/qtemporarydir/tst_qtemporarydir.cpp @@ -1,31 +1,5 @@ -/**************************************************************************** -** -** Copyright (C) 2016 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> #include <QStandardPaths> @@ -37,13 +11,21 @@ #include <qset.h> #include <QtTest/private/qtesthelpers_p.h> #ifdef Q_OS_WIN -# include <windows.h> +# include <shlwapi.h> +# include <qt_windows.h> #endif #ifdef Q_OS_UNIX // for geteuid() # include <sys/types.h> # include <unistd.h> #endif -#include "emulationdetector.h" + +#ifdef Q_OS_INTEGRITY +#include "qplatformdefs.h" +#endif + +#include <optional> + +using namespace Qt::StringLiterals; class tst_QTemporaryDir : public QObject { @@ -55,6 +37,7 @@ public slots: private slots: void construction(); + void moveSemantics(); void fileTemplate(); void fileTemplate_data(); void getSetCheck(); @@ -70,7 +53,7 @@ private slots: void QTBUG_4796_data(); void QTBUG_4796(); - void QTBUG43352_failedSetPermissions(); + void nestedTempDirs(); private: QString m_previousCurrent; @@ -101,6 +84,58 @@ void tst_QTemporaryDir::construction() QCOMPARE(dir.errorString(), QString()); } +void tst_QTemporaryDir::moveSemantics() +{ + { + auto original = std::optional<QTemporaryDir>(std::in_place); + QVERIFY(original->isValid()); + + original->setAutoRemove(true); + + auto OriginalDirectoryInfo = QFileInfo(original->path()); + OriginalDirectoryInfo.setCaching(false); + QVERIFY(OriginalDirectoryInfo.exists()); + + QTemporaryDir movedInto = std::move(*original); + + original.reset(); + + QVERIFY(OriginalDirectoryInfo.exists()); + QVERIFY(movedInto.path() == OriginalDirectoryInfo.filePath()); + } + + { + auto movedInto = QTemporaryDir(); + QVERIFY(movedInto.isValid()); + + movedInto.setAutoRemove(true); + + auto movedIntoInitialDirectoryInfo = QFileInfo(movedInto.path()); + movedIntoInitialDirectoryInfo.setCaching(false); + QVERIFY(movedIntoInitialDirectoryInfo.exists()); + + auto OriginalDirectoryInfo = QFileInfo(); + OriginalDirectoryInfo.setCaching(false); + + { + auto original = QTemporaryDir(); + QVERIFY(original.isValid()); + + original.setAutoRemove(true); + + OriginalDirectoryInfo.setFile(original.path()); + QVERIFY(OriginalDirectoryInfo.exists()); + + movedInto = std::move(original); + } + + QVERIFY(!movedIntoInitialDirectoryInfo.exists()); + QVERIFY(OriginalDirectoryInfo.exists()); + + QVERIFY(movedInto.path() == OriginalDirectoryInfo.filePath()); + } +} + // Testing get/set functions void tst_QTemporaryDir::getSetCheck() { @@ -158,6 +193,28 @@ void tst_QTemporaryDir::fileTemplate_data() prefix = "qt_" + hanTestText(); QTest::newRow("Chinese") << (prefix + "XXXXXX" + umlautTestText()) << prefix << umlautTestText(); } + +#ifdef Q_OS_WIN + auto tmp = QDir::toNativeSeparators(QDir::tempPath()); + if (PathGetDriveNumber((const wchar_t *) tmp.utf16()) < 0) + return; // skip if we have no drive letter + + tmp.data()[1] = u'$'; + const auto tmpPath = tmp + uR"(\UNC.XXXXXX.tmpDir)"_s; + + QTest::newRow("UNC-backslash") + << uR"(\\localhost\)"_s + tmpPath << "UNC." + << ".tmpDir"; + QTest::newRow("UNC-prefix") + << uR"(\\?\UNC\localhost\)"_s + tmpPath << "UNC." + << ".tmpDir"; + QTest::newRow("UNC-slash") + << u"//localhost/"_s + QDir::fromNativeSeparators(tmpPath) << "UNC." + << ".tmpDir"; + QTest::newRow("UNC-prefix-slash") + << uR"(//?/UNC/localhost/)"_s + QDir::fromNativeSeparators(tmpPath) << "UNC." + << ".tmpDir"; +#endif } void tst_QTemporaryDir::fileTemplate() @@ -171,9 +228,9 @@ void tst_QTemporaryDir::fileTemplate() QVERIFY(tempDir.isValid()); QString dirName = QDir(tempDir.path()).dirName(); - if (prefix.length()) { - QCOMPARE(dirName.left(prefix.length()), prefix); - QCOMPARE(dirName.right(suffix.length()), suffix); + if (prefix.size()) { + QCOMPARE(dirName.left(prefix.size()), prefix); + QCOMPARE(dirName.right(suffix.size()), suffix); } } @@ -290,7 +347,7 @@ void tst_QTemporaryDir::nonWritableCurrentDir() { #ifdef Q_OS_UNIX -# if defined(Q_OS_ANDROID) && !defined(Q_OS_ANDROID_EMBEDDED) +# ifdef Q_OS_ANDROID const char nonWritableDir[] = "/data"; # else const char nonWritableDir[] = "/home"; @@ -311,12 +368,6 @@ void tst_QTemporaryDir::nonWritableCurrentDir() const QFileInfo nonWritableDirFi = QFileInfo(QLatin1String(nonWritableDir)); QVERIFY(nonWritableDirFi.isDir()); - if (EmulationDetector::isRunningArmOnX86()) { - if (nonWritableDirFi.ownerId() == ::geteuid()) { - QSKIP("Sysroot directories are owned by the current user"); - } - } - QVERIFY(!nonWritableDirFi.isWritable()); ChdirOnReturn cor(QDir::currentPath()); @@ -338,7 +389,8 @@ void tst_QTemporaryDir::openOnRootDrives() #endif // If it's possible to create a file in the root directory, it // must be possible to create a temp dir there too. - foreach (const QFileInfo &driveInfo, QDir::drives()) { + const auto drives = QDir::drives(); + for (const QFileInfo &driveInfo : drives) { QFile testFile(driveInfo.filePath() + "XXXXXX"); if (testFile.open(QIODevice::ReadWrite)) { testFile.remove(); @@ -427,7 +479,7 @@ void tst_QTemporaryDir::QTBUG_4796() // unicode support { ~CleanOnReturn() { - foreach (const QString &tempName, tempNames) + for (const QString &tempName : std::as_const(tempNames)) QVERIFY(QDir(tempName).removeRecursively()); } @@ -497,22 +549,24 @@ void tst_QTemporaryDir::QTBUG_4796() // unicode support #ifdef Q_OS_WIN QTest::qWait(20); #endif - foreach (const QString &tempName, cleaner.tempNames) + for (const QString &tempName : std::as_const(cleaner.tempNames)) QVERIFY2(!QDir(tempName).exists(), qPrintable(tempName)); cleaner.reset(); } -void tst_QTemporaryDir::QTBUG43352_failedSetPermissions() +void tst_QTemporaryDir::nestedTempDirs() { - QString path = QStandardPaths::writableLocation(QStandardPaths::DownloadLocation) + QStringLiteral("/"); - int count = QDir(path).entryList().size(); + QTemporaryDir parentDir; + const QString &parentPath = parentDir.path(); { - QTemporaryDir dir(path); + QTemporaryDir tempdir(parentPath); } - QCOMPARE(QDir(path).entryList().size(), count); + QDir dir(parentPath); + dir.setFilter(QDir::NoDotAndDotDot); + QCOMPARE(dir.count(), 0); } QTEST_MAIN(tst_QTemporaryDir) |