diff options
Diffstat (limited to 'tests/auto/corelib/io/qsavefile/tst_qsavefile.cpp')
-rw-r--r-- | tests/auto/corelib/io/qsavefile/tst_qsavefile.cpp | 82 |
1 files changed, 43 insertions, 39 deletions
diff --git a/tests/auto/corelib/io/qsavefile/tst_qsavefile.cpp b/tests/auto/corelib/io/qsavefile/tst_qsavefile.cpp index 3d09ea291d..c027f8a3c1 100644 --- a/tests/auto/corelib/io/qsavefile/tst_qsavefile.cpp +++ b/tests/auto/corelib/io/qsavefile/tst_qsavefile.cpp @@ -1,41 +1,17 @@ -/**************************************************************************** -** -** Copyright (C) 2012 David Faure <faure@kde.org> -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the QtCore module 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) 2012 David Faure <faure@kde.org> +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only #include <QTest> #include <QSaveFile> #include <qcoreapplication.h> #include <qstring.h> +#include <qsystemdetection.h> #include <qtemporaryfile.h> #include <qfile.h> #include <qdir.h> #include <qset.h> -#if defined(Q_OS_UNIX) && !defined(Q_OS_VXWORKS) +#if defined(Q_OS_UNIX) #include <unistd.h> // for geteuid #endif @@ -114,23 +90,40 @@ void tst_QSaveFile::transactionalWrite() QCOMPARE(file.fileName(), targetFile); QVERIFY(!QFile::exists(targetFile)); - QCOMPARE(file.write("Hello"), Q_INT64_C(5)); + const char *data = "Hello"; + QCOMPARE(file.write(data), qint64(strlen(data))); QCOMPARE(file.error(), QFile::NoError); QVERIFY(!QFile::exists(targetFile)); + QVERIFY(file.fileTime(QFile::FileModificationTime).isValid()); QVERIFY(file.commit()); QVERIFY(QFile::exists(targetFile)); QCOMPARE(file.fileName(), targetFile); +#if defined(Q_OS_WIN) + // Without this delay, file.fileTime() and file.size() tests fail to + // pass on Windows in the CI. It passes locally in a VM, so it looks like + // it depends on how often different filesystems on different OSes, update + // their metadata. + // Interestingly, this delay is enough to fix similar tests in the rest + // of tst_QSaveFile's functions. + QTRY_VERIFY(file.fileTime(QFile::FileModificationTime).isValid()); +#else + QVERIFY(file.fileTime(QFile::FileModificationTime).isValid()); +#endif + + QCOMPARE(file.size(), qint64(strlen(data))); QFile reader(targetFile); QVERIFY(reader.open(QIODevice::ReadOnly)); - QCOMPARE(QString::fromLatin1(reader.readAll()), QString::fromLatin1("Hello")); + QCOMPARE(QString::fromLatin1(reader.readAll()), QString::fromLatin1(data)); + QCOMPARE(file.fileTime(QFile::FileModificationTime), + reader.fileTime(QFile::FileModificationTime)); // check that permissions are the same as for QFile const QString otherFile = dir.path() + QString::fromLatin1("/otherfile"); QFile::remove(otherFile); QFile other(otherFile); - other.open(QIODevice::WriteOnly); + QVERIFY(other.open(QIODevice::WriteOnly)); other.close(); QCOMPARE(QFile::permissions(targetFile), QFile::permissions(otherFile)); } @@ -145,16 +138,17 @@ void tst_QSaveFile::retryTransactionalWrite() // root can open the read-only file for writing... if (geteuid() == 0) QSKIP("This test does not work as the root user"); -#endif +#endif //Q_OS_UNIX QTemporaryDir dir; QVERIFY2(dir.isValid(), qPrintable(dir.errorString())); + const char *data = "Hello"; QString targetFile = dir.path() + QLatin1String("/outfile"); const QString readOnlyName = targetFile + QLatin1String(".ro"); { QFile readOnlyFile(readOnlyName); QVERIFY2(readOnlyFile.open(QIODevice::WriteOnly), msgCannotOpen(readOnlyFile).constData()); - readOnlyFile.write("Hello"); + readOnlyFile.write(data); readOnlyFile.close(); auto permissions = readOnlyFile.permissions(); permissions &= ~(QFileDevice::WriteOwner | QFileDevice::WriteGroup | QFileDevice::WriteUser); @@ -167,13 +161,15 @@ void tst_QSaveFile::retryTransactionalWrite() file.setFileName(targetFile); QVERIFY2(file.open(QIODevice::WriteOnly), msgCannotOpen(file).constData()); QVERIFY(file.isOpen()); - QCOMPARE(file.write("Hello"), Q_INT64_C(5)); + QCOMPARE(file.write(data), qint64(strlen(data))); QCOMPARE(file.error(), QFile::NoError); QVERIFY(file.commit()); + QCOMPARE(file.size(), qint64(strlen(data))); } void tst_QSaveFile::saveTwice() { + const char *hello = "Hello"; // Check that we can reuse a QSaveFile object // (and test the case of an existing target file) QTemporaryDir dir; @@ -181,16 +177,19 @@ void tst_QSaveFile::saveTwice() const QString targetFile = dir.path() + QString::fromLatin1("/outfile"); QSaveFile file(targetFile); QVERIFY2(file.open(QIODevice::WriteOnly), msgCannotOpen(file).constData()); - QCOMPARE(file.write("Hello"), Q_INT64_C(5)); + QCOMPARE(file.write(hello), qint64(strlen(hello))); QVERIFY2(file.commit(), qPrintable(file.errorString())); + QCOMPARE(file.size(), qint64(strlen(hello))); + const char *world = "World"; QVERIFY2(file.open(QIODevice::WriteOnly), msgCannotOpen(file).constData()); - QCOMPARE(file.write("World"), Q_INT64_C(5)); + QCOMPARE(file.write(world), qint64(strlen(world))); QVERIFY2(file.commit(), qPrintable(file.errorString())); + QCOMPARE(file.size(), qint64(strlen(world))); QFile reader(targetFile); QVERIFY2(reader.open(QIODevice::ReadOnly), msgCannotOpen(reader).constData()); - QCOMPARE(QString::fromLatin1(reader.readAll()), QString::fromLatin1("World")); + QCOMPARE(QString::fromLatin1(reader.readAll()), QString::fromLatin1(world)); } void tst_QSaveFile::textStreamManualFlush() @@ -201,16 +200,18 @@ void tst_QSaveFile::textStreamManualFlush() QSaveFile file(targetFile); QVERIFY2(file.open(QIODevice::WriteOnly), msgCannotOpen(file).constData()); + const char *data = "Manual flush"; QTextStream ts(&file); - ts << "Manual flush"; + ts << data; ts.flush(); QCOMPARE(file.error(), QFile::NoError); QVERIFY(!QFile::exists(targetFile)); QVERIFY(file.commit()); + QCOMPARE(file.size(), qint64(strlen(data))); QFile reader(targetFile); QVERIFY(reader.open(QIODevice::ReadOnly)); - QCOMPARE(QString::fromLatin1(reader.readAll().constData()), QString::fromLatin1("Manual flush")); + QCOMPARE(QString::fromLatin1(reader.readAll().constData()), QString::fromLatin1(data)); QFile::remove(targetFile); } @@ -457,6 +458,7 @@ void tst_QSaveFile::symlink() QVERIFY(saveFile.open(QIODevice::WriteOnly)); QCOMPARE(saveFile.write(someData), someData.size()); saveFile.commit(); + QCOMPARE(saveFile.size(), someData.size()); QFile file(targetFile); QVERIFY2(file.open(QIODevice::ReadOnly), msgCannotOpen(file).constData()); @@ -486,6 +488,7 @@ void tst_QSaveFile::symlink() QVERIFY(saveFile.open(QIODevice::WriteOnly)); QCOMPARE(saveFile.write(someData), someData.size()); saveFile.commit(); + QCOMPARE(saveFile.size(), someData.size()); // the explicit file becomes a file instead of a link QVERIFY(!QFileInfo(cyclicLink + QLatin1Char('1')).isSymLink()); @@ -565,6 +568,7 @@ void tst_QSaveFile::alternateDataStream() QVERIFY2(file.open(QIODevice::WriteOnly), qPrintable(file.errorString())); file.write(newContent); QVERIFY2(file.commit(), qPrintable(file.errorString())); + QCOMPARE(file.size(), qint64(strlen(newContent))); // check the contents QFile targetFile(adsName); |