/* This file is part of the KDE project SPDX-FileCopyrightText: 2006 David Faure SPDX-License-Identifier: LGPL-2.0-or-later */ // This file can only be included once in a given binary #include "../src/utils_p.h" #include #include #include #include #include #include #include #ifdef Q_OS_UNIX #include #else #include #endif #include #include "kioglobal_p.h" // to be used in QTemporaryDir constructor, will ensure absolute path temporary directory QString tmpDirTemplate() { return QDir::tempPath() + QStringLiteral("/kiotests_XXXXXX"); } QString homeTmpDir() { const QString dir(QStandardPaths::writableLocation(QStandardPaths::AppDataLocation) + QStringLiteral("/kiotests/")); if (!QFile::exists(dir)) { const bool ok = QDir().mkpath(dir); if (!ok) { qFatal("Couldn't create %s", qPrintable(dir)); } } return dir; } static QDateTime s_referenceTimeStamp; static void setTimeStamp(const QString &path, const QDateTime &mtime) { #ifdef Q_OS_UNIX // Put timestamp in the past so that we can check that the listing is correct struct utimbuf utbuf; utbuf.actime = mtime.toSecsSinceEpoch(); utbuf.modtime = utbuf.actime; utime(QFile::encodeName(path), &utbuf); // qDebug( "Time changed for %s", qPrintable( path ) ); #elif defined(Q_OS_WIN) struct _utimbuf utbuf; utbuf.actime = mtime.toSecsSinceEpoch(); utbuf.modtime = utbuf.actime; _wutime(reinterpret_cast(path.utf16()), &utbuf); #endif } static void createTestFile(const QString &path, bool plainText = false, const QByteArray &customData = {}) { QDir().mkpath(QFileInfo(path).absolutePath()); QFile f(path); if (!f.open(QIODevice::WriteOnly)) { qFatal("Couldn't create %s: %s", qPrintable(path), qPrintable(f.errorString())); } QByteArray data(plainText ? "Hello world" : "Hello\0world", 11); QCOMPARE(data.size(), 11); f.write(customData.isEmpty() ? data : customData); f.close(); setTimeStamp(path, s_referenceTimeStamp); } static void createTestSymlink(const QString &path, const QByteArray &target = "/IDontExist") { QFile::remove(path); bool ok = KIOPrivate::createSymlink(QString::fromLatin1(target), path); // broken symlink if (!ok) { qFatal("couldn't create symlink: %s", strerror(errno)); } QT_STATBUF buf; QVERIFY(QT_LSTAT(QFile::encodeName(path), &buf) == 0); QVERIFY(Utils::isLinkMask(buf.st_mode)); // qDebug( "symlink %s created", qPrintable( path ) ); QVERIFY(QFileInfo(path).isSymLink()); } void createTestPipe(const QString &path) { #ifndef Q_OS_WIN int ok = mkfifo(QFile::encodeName(path), S_IWUSR | S_IRUSR | S_IRGRP | S_IROTH); if (ok != 0) { qFatal("couldn't create named pipe: %s", strerror(errno)); } QT_STATBUF buf; QVERIFY(QT_LSTAT(QFile::encodeName(path), &buf) == 0); QVERIFY(S_ISFIFO(buf.st_mode)); #else // to not change the filecount everywhere in the tests createTestFile(path); #endif QVERIFY(QFileInfo::exists(path)); } enum CreateTestDirectoryOptions { DefaultOptions = 0, NoSymlink = 1, Empty = 2 }; static inline void createTestDirectory(const QString &path, CreateTestDirectoryOptions opt = DefaultOptions) { QDir dir; bool ok = dir.mkdir(path); if (!ok && !dir.exists()) { qFatal("Couldn't create %s", qPrintable(path)); } if ((opt & Empty) == 0) { createTestFile(path + QStringLiteral("/testfile")); if ((opt & NoSymlink) == 0) { #ifndef Q_OS_WIN createTestSymlink(path + QStringLiteral("/testlink")); QVERIFY(QFileInfo(path + QStringLiteral("/testlink")).isSymLink()); #else // to not change the filecount everywhere in the tests createTestFile(path + QStringLiteral("/testlink")); #endif } } setTimeStamp(path, s_referenceTimeStamp); }