tst_qsavefile: Check temporary dir and output open errors.

Change-Id: Id28306ad414050a37b7779525f36edc3e15281b5
Reviewed-by: David Faure <david.faure@kdab.com>
bb10
Friedemann Kleint 2013-09-30 11:39:49 +02:00 committed by The Qt Project
parent e5ae6d896b
commit 99b3e68f20
1 changed files with 27 additions and 12 deletions

View File

@ -73,13 +73,21 @@ private slots:
void transactionalWriteErrorRenaming();
};
static inline QByteArray msgCannotOpen(const QFileDevice &f)
{
QString result = QStringLiteral("Cannot open ") + QDir::toNativeSeparators(f.fileName())
+ QStringLiteral(": ") + f.errorString();
return result.toLocal8Bit();
}
void tst_QSaveFile::transactionalWrite()
{
QTemporaryDir dir;
QVERIFY(dir.isValid());
const QString targetFile = dir.path() + QString::fromLatin1("/outfile");
QFile::remove(targetFile);
QSaveFile file(targetFile);
QVERIFY(file.open(QIODevice::WriteOnly));
QVERIFY2(file.open(QIODevice::WriteOnly), msgCannotOpen(file).constData());
QVERIFY(file.isOpen());
QCOMPARE(file.fileName(), targetFile);
QVERIFY(!QFile::exists(targetFile));
@ -102,27 +110,29 @@ void tst_QSaveFile::saveTwice()
// Check that we can reuse a QSaveFile object
// (and test the case of an existing target file)
QTemporaryDir dir;
QVERIFY(dir.isValid());
const QString targetFile = dir.path() + QString::fromLatin1("/outfile");
QSaveFile file(targetFile);
QVERIFY(file.open(QIODevice::WriteOnly));
QVERIFY2(file.open(QIODevice::WriteOnly), msgCannotOpen(file).constData());
QCOMPARE(file.write("Hello"), Q_INT64_C(5));
QVERIFY2(file.commit(), qPrintable(file.errorString()));
QVERIFY(file.open(QIODevice::WriteOnly));
QVERIFY2(file.open(QIODevice::WriteOnly), msgCannotOpen(file).constData());
QCOMPARE(file.write("World"), Q_INT64_C(5));
QVERIFY2(file.commit(), qPrintable(file.errorString()));
QFile reader(targetFile);
QVERIFY(reader.open(QIODevice::ReadOnly));
QVERIFY2(reader.open(QIODevice::ReadOnly), msgCannotOpen(reader).constData());
QCOMPARE(QString::fromLatin1(reader.readAll()), QString::fromLatin1("World"));
}
void tst_QSaveFile::textStreamManualFlush()
{
QTemporaryDir dir;
QVERIFY(dir.isValid());
const QString targetFile = dir.path() + QString::fromLatin1("/outfile");
QSaveFile file(targetFile);
QVERIFY(file.open(QIODevice::WriteOnly));
QVERIFY2(file.open(QIODevice::WriteOnly), msgCannotOpen(file).constData());
QTextStream ts(&file);
ts << "Manual flush";
@ -140,9 +150,10 @@ void tst_QSaveFile::textStreamManualFlush()
void tst_QSaveFile::textStreamAutoFlush()
{
QTemporaryDir dir;
QVERIFY(dir.isValid());
const QString targetFile = dir.path() + QString::fromLatin1("/outfile");
QSaveFile file(targetFile);
QVERIFY(file.open(QIODevice::WriteOnly));
QVERIFY2(file.open(QIODevice::WriteOnly), msgCannotOpen(file).constData());
QTextStream ts(&file);
ts << "Auto-flush.";
@ -188,6 +199,7 @@ void tst_QSaveFile::transactionalWriteNoPermissionsOnDir()
QTemporaryDir dir;
QVERIFY(dir.isValid());
QVERIFY(QFile(dir.path()).setPermissions(QFile::ReadOwner | QFile::ExeOwner));
PermissionRestorer permissionRestorer(dir.path());
@ -212,7 +224,7 @@ void tst_QSaveFile::transactionalWriteNoPermissionsOnDir()
file.setDirectWriteFallback(directWriteFallback);
QCOMPARE(file.directWriteFallback(), directWriteFallback);
if (directWriteFallback) {
QVERIFY(file.open(QIODevice::WriteOnly));
QVERIFY2(file.open(QIODevice::WriteOnly), msgCannotOpen(file).constData());
QCOMPARE((int)file.error(), (int)QFile::NoError);
QCOMPARE(file.write("World"), Q_INT64_C(5));
QVERIFY(file.commit());
@ -222,7 +234,7 @@ void tst_QSaveFile::transactionalWriteNoPermissionsOnDir()
QCOMPARE(QString::fromLatin1(reader.readAll()), QString::fromLatin1("World"));
reader.close();
QVERIFY(file.open(QIODevice::WriteOnly));
QVERIFY2(file.open(QIODevice::WriteOnly), msgCannotOpen(file).constData());
QCOMPARE((int)file.error(), (int)QFile::NoError);
QCOMPARE(file.write("W"), Q_INT64_C(1));
file.cancelWriting(); // no effect, as per the documentation
@ -241,9 +253,10 @@ void tst_QSaveFile::transactionalWriteNoPermissionsOnFile()
{
// Setup an existing but readonly file
QTemporaryDir dir;
QVERIFY(dir.isValid());
const QString targetFile = dir.path() + QString::fromLatin1("/outfile");
QFile file(targetFile);
QVERIFY(file.open(QIODevice::WriteOnly));
QVERIFY2(file.open(QIODevice::WriteOnly), msgCannotOpen(file).constData());
QCOMPARE(file.write("Hello"), Q_INT64_C(5));
file.close();
file.setPermissions(QFile::ReadOwner);
@ -260,10 +273,11 @@ void tst_QSaveFile::transactionalWriteNoPermissionsOnFile()
void tst_QSaveFile::transactionalWriteCanceled()
{
QTemporaryDir dir;
QVERIFY(dir.isValid());
const QString targetFile = dir.path() + QString::fromLatin1("/outfile");
QFile::remove(targetFile);
QSaveFile file(targetFile);
QVERIFY(file.open(QIODevice::WriteOnly));
QVERIFY2(file.open(QIODevice::WriteOnly), msgCannotOpen(file).constData());
QTextStream ts(&file);
ts << "This writing operation will soon be canceled.\n";
@ -283,9 +297,10 @@ void tst_QSaveFile::transactionalWriteCanceled()
void tst_QSaveFile::transactionalWriteErrorRenaming()
{
QTemporaryDir dir;
QVERIFY(dir.isValid());
const QString targetFile = dir.path() + QString::fromLatin1("/outfile");
QSaveFile file(targetFile);
QVERIFY(file.open(QIODevice::WriteOnly));
QVERIFY2(file.open(QIODevice::WriteOnly), msgCannotOpen(file).constData());
QCOMPARE(file.write("Hello"), qint64(5));
QVERIFY(!QFile::exists(targetFile));
@ -320,7 +335,7 @@ void tst_QSaveFile::transactionalWriteErrorRenaming()
#else
// Windows: Make rename() fail for lack of permissions on an existing target file
QFile existingTargetFile(targetFile);
QVERIFY(existingTargetFile.open(QIODevice::WriteOnly));
QVERIFY2(existingTargetFile.open(QIODevice::WriteOnly), msgCannotOpen(existingTargetFile).constData());
QCOMPARE(file.write("Target"), qint64(6));
existingTargetFile.close();
QVERIFY(existingTargetFile.setPermissions(QFile::ReadOwner));