summaryrefslogtreecommitdiffstats
path: root/tests/auto/qfile/tst_qfile.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'tests/auto/qfile/tst_qfile.cpp')
-rw-r--r--tests/auto/qfile/tst_qfile.cpp3406
1 files changed, 0 insertions, 3406 deletions
diff --git a/tests/auto/qfile/tst_qfile.cpp b/tests/auto/qfile/tst_qfile.cpp
deleted file mode 100644
index aafe79484e..0000000000
--- a/tests/auto/qfile/tst_qfile.cpp
+++ /dev/null
@@ -1,3406 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the test suite of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** GNU Lesser General Public License Usage
-** This file may be used under the terms of the GNU Lesser General Public
-** License version 2.1 as published by the Free Software Foundation and
-** appearing in the file LICENSE.LGPL included in the packaging of this
-** file. Please review the following information to ensure the GNU Lesser
-** General Public License version 2.1 requirements will be met:
-** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain additional
-** rights. These rights are described in the Nokia Qt LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU General
-** Public License version 3.0 as published by the Free Software Foundation
-** and appearing in the file LICENSE.GPL included in the packaging of this
-** file. Please review the following information to ensure the GNU General
-** Public License version 3.0 requirements will be met:
-** http://www.gnu.org/copyleft/gpl.html.
-**
-** Other Usage
-** Alternatively, this file may be used in accordance with the terms and
-** conditions contained in a signed written agreement between you and Nokia.
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-
-#include <QtTest/QtTest>
-#include <qplatformdefs.h>
-
-#include <QAbstractFileEngine>
-#include <QFSFileEngine>
-#include <QCoreApplication>
-#include <QDebug>
-#include <QDir>
-#include <QFile>
-#include <QFileInfo>
-#if !defined(Q_OS_WINCE) && !defined(Q_OS_SYMBIAN)
-#include <QHostInfo>
-#endif
-#include <QProcess>
-#ifndef Q_OS_WIN
-# include <sys/types.h>
-# include <unistd.h>
-#endif
-#ifdef Q_OS_MAC
-# include <sys/mount.h>
-#elif defined(Q_OS_LINUX)
-# include <sys/vfs.h>
-#elif defined(Q_OS_FREEBSD)
-# include <sys/param.h>
-# include <sys/mount.h>
-#elif defined(Q_OS_IRIX)
-# include <sys/statfs.h>
-#elif defined(Q_OS_WINCE)
-# include <qplatformdefs.h>
-# include <private/qfsfileengine_p.h>
-#elif defined(Q_OS_SYMBIAN)
-# include <f32file.h>
-#endif
-
-#include <stdio.h>
-#include <errno.h>
-#include "../network-settings.h"
-
-#if defined(Q_OS_SYMBIAN)
-# define SRCDIR ""
-#endif
-
-#ifndef STDIN_FILENO
-#define STDIN_FILENO 0
-#endif
-
-#ifndef STDOUT_FILENO
-#define STDOUT_FILENO 1
-#endif
-
-#ifndef STDERR_FILENO
-#define STDERR_FILENO 2
-#endif
-
-#ifndef QT_OPEN_BINARY
-#define QT_OPEN_BINARY 0
-#endif
-
-Q_DECLARE_METATYPE(QFile::FileError)
-
-//TESTED_CLASS=
-//TESTED_FILES=
-
-class tst_QFile : public QObject
-{
- Q_OBJECT
-
-public:
- tst_QFile();
- virtual ~tst_QFile();
-
-
-public slots:
- void init();
- void cleanup();
-private slots:
- void initTestCase();
- void cleanupTestCase();
- void exists();
- void open_data();
- void open();
- void openUnbuffered();
- void size_data();
- void size();
- void sizeNoExist();
- void seek();
- void setSize();
- void setSizeSeek();
- void atEnd();
- void readLine();
- void readLine2();
- void readLineNullInLine();
- void readAll_data();
- void readAll();
- void readAllBuffer();
- void readAllStdin();
- void readLineStdin();
- void readLineStdin_lineByLine();
- void text();
- void missingEndOfLine();
- void readBlock();
- void getch();
- void ungetChar();
- void createFile();
- void append();
- void permissions_data();
- void permissions();
- void setPermissions();
- void copy();
- void copyAfterFail();
- void copyRemovesTemporaryFile() const;
- void copyShouldntOverwrite();
- void copyFallback();
- void link();
- void linkToDir();
- void absolutePathLinkToRelativePath();
- void readBrokenLink();
- void readTextFile_data();
- void readTextFile();
- void readTextFile2();
- void writeTextFile_data();
- void writeTextFile();
- /* void largeFileSupport(); */
-#if defined(Q_OS_WIN) && !defined(Q_OS_WINCE)
- void largeUncFileSupport();
-#endif
- void tailFile();
- void flush();
- void bufferedRead();
- void isSequential();
- void encodeName();
- void truncate();
- void seekToPos();
- void seekAfterEndOfFile();
- void FILEReadWrite();
- void i18nFileName_data();
- void i18nFileName();
- void longFileName_data();
- void longFileName();
- void fileEngineHandler();
- void useQFileInAFileHandler();
- void getCharFF();
- void remove_and_exists();
- void removeOpenFile();
- void fullDisk();
- void writeLargeDataBlock_data();
- void writeLargeDataBlock();
- void readFromWriteOnlyFile();
- void writeToReadOnlyFile();
- void virtualFile();
- void textFile();
- void rename_data();
- void rename();
- void renameWithAtEndSpecialFile() const;
- void renameFallback();
- void renameMultiple();
- void appendAndRead();
- void miscWithUncPathAsCurrentDir();
- void standarderror();
- void handle();
- void nativeHandleLeaks();
-
- void readEof_data();
- void readEof();
-
- void map_data();
- void map();
- void mapResource_data();
- void mapResource();
- void mapOpenMode_data();
- void mapOpenMode();
-
- void openStandardStreams();
-
- void resize_data();
- void resize();
-
- void objectConstructors();
-#ifdef Q_OS_SYMBIAN
- void platformSecurity_data();
- void platformSecurity();
-#endif
- void caseSensitivity();
-
- void autocloseHandle();
-
- // --- Task related tests below this line
- void task167217();
-
- void openDirectory();
- void writeNothing();
-
-public:
-// disabled this test for the moment... it hangs
- void invalidFile_data();
- void invalidFile();
-
-private:
- enum FileType {
- OpenQFile,
- OpenFd,
- OpenStream,
-#ifdef Q_OS_SYMBIAN
- OpenRFile,
-#endif
- NumberOfFileTypes
- };
-
- void openStandardStreamsFileDescriptors();
- void openStandardStreamsBufferedStreams();
-
- bool openFd(QFile &file, QIODevice::OpenMode mode, QFile::FileHandleFlags handleFlags)
- {
- int fdMode = QT_OPEN_LARGEFILE | QT_OPEN_BINARY;
-
- // File will be truncated if in Write mode.
- if (mode & QIODevice::WriteOnly)
- fdMode |= QT_OPEN_WRONLY | QT_OPEN_TRUNC;
- if (mode & QIODevice::ReadOnly)
- fdMode |= QT_OPEN_RDONLY;
-
- fd_ = QT_OPEN(qPrintable(file.fileName()), fdMode);
-
- return (-1 != fd_) && file.open(fd_, mode, handleFlags);
- }
-
- bool openStream(QFile &file, QIODevice::OpenMode mode, QFile::FileHandleFlags handleFlags)
- {
- char const *streamMode = "";
-
- // File will be truncated if in Write mode.
- if (mode & QIODevice::WriteOnly)
- streamMode = "wb+";
- else if (mode & QIODevice::ReadOnly)
- streamMode = "rb";
-
- stream_ = QT_FOPEN(qPrintable(file.fileName()), streamMode);
-
- return stream_ && file.open(stream_, mode, handleFlags);
- }
-
-#ifdef Q_OS_SYMBIAN
- bool openRFile(QFile &file, QIODevice::OpenMode mode, QFile::FileHandleFlags handleFlags)
- {
- //connect file server first time
- if (!rfs_.Handle() && rfs_.Connect() != KErrNone)
- return false;
- //symbian does not like ./ in filenames, so open by absolute path
- QString fileName(QDir::toNativeSeparators(QFileInfo(file).absoluteFilePath()));
- TPtrC fn(fileName.utf16(), fileName.length());
- TInt smode = 0;
- if (mode & QIODevice::WriteOnly)
- smode |= EFileWrite;
- if (mode & QIODevice::ReadOnly)
- smode |= EFileRead;
- TInt r;
- if ((mode & QIODevice::Truncate) || (!(mode & QIODevice::ReadOnly) && !(mode & QIODevice::Append))) {
- r = rfile_.Replace(rfs_, fn, smode);
- } else {
- r = rfile_.Open(rfs_, fn, smode);
- if (r == KErrNotFound && (mode & QIODevice::WriteOnly)) {
- r = rfile_.Create(rfs_, fn, smode);
- }
- }
- return (r == KErrNone) && file.open(rfile_, mode, handleFlags);
- }
-#endif
-
- bool openFile(QFile &file, QIODevice::OpenMode mode, FileType type = OpenQFile, QFile::FileHandleFlags handleFlags = QFile::DontCloseHandle)
- {
- if (mode & QIODevice::WriteOnly && !file.exists())
- {
- // Make sure the file exists
- QFile createFile(file.fileName());
- if (!createFile.open(QIODevice::ReadWrite))
- return false;
- }
-
- // Note: openFd and openStream will truncate the file if write mode.
- switch (type)
- {
- case OpenQFile:
- return file.open(mode);
-
- case OpenFd:
- return openFd(file, mode, handleFlags);
-
- case OpenStream:
- return openStream(file, mode, handleFlags);
-#ifdef Q_OS_SYMBIAN
- case OpenRFile:
- return openRFile(file, mode, handleFlags);
-#endif
- case NumberOfFileTypes:
- break;
- }
-
- return false;
- }
-
- void closeFile(QFile &file)
- {
- file.close();
-
- if (-1 != fd_)
- QT_CLOSE(fd_);
- if (stream_)
- ::fclose(stream_);
-#ifdef Q_OS_SYMBIAN
- if (rfile_.SubSessionHandle())
- rfile_.Close();
-#endif
-
- fd_ = -1;
- stream_ = 0;
- }
-
- int fd_;
- FILE *stream_;
-#ifdef Q_OS_SYMBIAN
- RFs rfs_;
- RFile rfile_;
-#endif
-};
-
-tst_QFile::tst_QFile()
-{
-}
-
-tst_QFile::~tst_QFile()
-{
-
-}
-
-void tst_QFile::init()
-{
-// TODO: Add initialization code here.
-// This will be executed immediately before each test is run.
- fd_ = -1;
- stream_ = 0;
-}
-
-void tst_QFile::cleanup()
-{
-// TODO: Add cleanup code here.
-// This will be executed immediately after each test is run.
-
- // for copyFallback()
- if (QFile::exists("file-copy-destination.txt")) {
- QFile::setPermissions("file-copy-destination.txt",
- QFile::ReadOwner | QFile::WriteOwner);
- QFile::remove("file-copy-destination.txt");
- }
-
- // for renameFallback()
- QFile::remove("file-rename-destination.txt");
-
- // for copyAfterFail()
- QFile::remove("file-to-be-copied.txt");
- QFile::remove("existing-file.txt");
- QFile::remove("copied-file-1.txt");
- QFile::remove("copied-file-2.txt");
-
- // for renameMultiple()
- QFile::remove("file-to-be-renamed.txt");
- QFile::remove("existing-file.txt");
- QFile::remove("file-renamed-once.txt");
- QFile::remove("file-renamed-twice.txt");
-
- if (-1 != fd_)
- QT_CLOSE(fd_);
- if (stream_)
- ::fclose(stream_);
-}
-
-void tst_QFile::initTestCase()
-{
- QFile::remove("noreadfile");
-
- // create a file and make it read-only
- QFile file("readonlyfile");
- file.open(QFile::WriteOnly);
- file.write("a", 1);
- file.close();
- file.setPermissions(QFile::ReadOwner);
-
- // create another file and make it not readable
- file.setFileName("noreadfile");
- file.open(QFile::WriteOnly);
- file.write("b", 1);
- file.close();
- file.setPermissions(0);
-}
-
-void tst_QFile::cleanupTestCase()
-{
- // clean up the files we created
- QFile::remove("readonlyfile");
- QFile::remove("noreadfile");
- QFile::remove("myLink.lnk");
- QFile::remove("appendme.txt");
- QFile::remove("createme.txt");
- QFile::remove("file.txt");
- QFile::remove("genfile.txt");
- QFile::remove("seekToPos.txt");
- QFile::remove("setsizeseek.txt");
- QFile::remove("stdfile.txt");
- QFile::remove("textfile.txt");
- QFile::remove("truncate.txt");
- QFile::remove("winfile.txt");
- QFile::remove("writeonlyfile");
- QFile::remove("largeblockfile.txt");
- QFile::remove("tst_qfile_copy.cpp");
- QFile::remove("nullinline.txt");
- QFile::remove("myLink2.lnk");
- QFile::remove("resources");
- QFile::remove("qfile_map_testfile");
- QFile::remove("readAllBuffer.txt");
- QFile::remove("qt_file.tmp");
- QFile::remove("File.txt");
-}
-
-//------------------------------------------
-// The 'testfile' is currently just a
-// testfile. The path of this file, the
-// attributes and the contents itself
-// will be changed as far as we have a
-// proper way to handle files in the
-// testing environment.
-//------------------------------------------
-
-void tst_QFile::exists()
-{
- QFile f( SRCDIR "testfile.txt" );
- QCOMPARE( f.exists(), (bool)TRUE );
-
- QFile file("nobodyhassuchafile");
- file.remove();
- QVERIFY(!file.exists());
-
- QFile file2("nobodyhassuchafile");
- QVERIFY(file2.open(QIODevice::WriteOnly));
- file2.close();
-
- QVERIFY(file.exists());
-
- QVERIFY(file.open(QIODevice::WriteOnly));
- file.close();
- QVERIFY(file.exists());
-
- file.remove();
- QVERIFY(!file.exists());
-
-#if defined(Q_OS_WIN) && !defined(Q_OS_WINCE)
- QFile unc("//" + QtNetworkSettings::winServerName() + "/testshare/readme.txt");
- QVERIFY(unc.exists());
-#endif
-}
-
-void tst_QFile::open_data()
-{
- QTest::addColumn<QString>("filename");
- QTest::addColumn<int>("mode");
- QTest::addColumn<bool>("ok");
- QTest::addColumn<QFile::FileError>("status");
-
-#ifdef Q_OS_MAC
- static const QString denied("Operation not permitted");
-#else
- static const QString denied("Permission denied");
-#endif
- QTest::newRow( "exist_readOnly" )
- << QString(SRCDIR "testfile.txt") << int(QIODevice::ReadOnly)
- << (bool)TRUE << QFile::NoError;
-
- QTest::newRow( "exist_writeOnly" )
- << QString("readonlyfile")
- << int(QIODevice::WriteOnly)
- << (bool)FALSE
- << QFile::OpenError;
-
- QTest::newRow( "exist_append" )
- << QString("readonlyfile") << int(QIODevice::Append)
- << (bool)FALSE << QFile::OpenError;
-
- QTest::newRow( "nonexist_readOnly" )
- << QString("nonExist.txt") << int(QIODevice::ReadOnly)
- << (bool)FALSE << QFile::OpenError;
-
- QTest::newRow("emptyfile")
- << QString("")
- << int(QIODevice::ReadOnly)
- << (bool)FALSE
- << QFile::OpenError;
-
- QTest::newRow("nullfile") << QString() << int(QIODevice::ReadOnly) << (bool)FALSE
- << QFile::OpenError;
-
- QTest::newRow("two-dots") << QString(SRCDIR "two.dots.file") << int(QIODevice::ReadOnly) << (bool)TRUE
- << QFile::NoError;
-
- QTest::newRow("readonlyfile") << QString("readonlyfile") << int(QIODevice::WriteOnly)
- << (bool)FALSE << QFile::OpenError;
- QTest::newRow("noreadfile") << QString("noreadfile") << int(QIODevice::ReadOnly)
- << (bool)FALSE << QFile::OpenError;
-#if defined(Q_OS_WIN) && !defined(Q_OS_WINCE)
- QTest::newRow("//./PhysicalDrive0") << QString("//./PhysicalDrive0") << int(QIODevice::ReadOnly)
- << (bool)TRUE << QFile::NoError;
- QTest::newRow("uncFile") << "//" + QtNetworkSettings::winServerName() + "/testshare/test.pri" << int(QIODevice::ReadOnly)
- << true << QFile::NoError;
-#endif
-}
-
-void tst_QFile::open()
-{
- QFETCH( QString, filename );
- QFETCH( int, mode );
-
- QFile f( filename );
-
- QFETCH( bool, ok );
-
-#if defined(Q_OS_SYMBIAN)
- if (qstrcmp(QTest::currentDataTag(), "noreadfile") == 0)
- QSKIP("Symbian does not support non-readable files", SkipSingle);
-#elif defined(Q_OS_UNIX)
- if (::getuid() == 0)
- // root and Chuck Norris don't care for file permissions. Skip.
- QSKIP("Running this test as root doesn't make sense", SkipAll);
-#endif
-
-#if defined(Q_OS_WIN32) || defined(Q_OS_WINCE)
- QEXPECT_FAIL("noreadfile", "Windows does not currently support non-readable files.", Abort);
-#endif
- if (filename.isEmpty())
- QTest::ignoreMessage(QtWarningMsg, "QFSFileEngine::open: No file name specified");
-
- QCOMPARE(f.open( QIODevice::OpenMode(mode) ), ok);
-
- QTEST( f.error(), "status" );
-}
-
-void tst_QFile::openUnbuffered()
-{
- QFile file(SRCDIR "testfile.txt");
- QVERIFY(file.open(QIODevice::ReadOnly | QIODevice::Unbuffered));
- char c = '\0';
- QVERIFY(file.seek(1));
- QCOMPARE(file.pos(), qint64(1));
- QVERIFY(file.getChar(&c));
- QCOMPARE(file.pos(), qint64(2));
- char d = '\0';
- QVERIFY(file.seek(3));
- QCOMPARE(file.pos(), qint64(3));
- QVERIFY(file.getChar(&d));
- QCOMPARE(file.pos(), qint64(4));
- QVERIFY(file.seek(1));
- QCOMPARE(file.pos(), qint64(1));
- char c2 = '\0';
- QVERIFY(file.getChar(&c2));
- QCOMPARE(file.pos(), qint64(2));
- QVERIFY(file.seek(3));
- QCOMPARE(file.pos(), qint64(3));
- char d2 = '\0';
- QVERIFY(file.getChar(&d2));
- QCOMPARE(file.pos(), qint64(4));
- QCOMPARE(c, c2);
- QCOMPARE(d, d2);
- QCOMPARE(c, '-');
- QCOMPARE(d, '-');
-}
-
-void tst_QFile::size_data()
-{
- QTest::addColumn<QString>("filename");
- QTest::addColumn<qint64>("size");
-
- QTest::newRow( "exist01" ) << QString(SRCDIR "testfile.txt") << (qint64)245;
-#if defined(Q_OS_WIN) && !defined(Q_OS_WINCE)
- // Only test UNC on Windows./
- QTest::newRow("unc") << "//" + QString(QtNetworkSettings::winServerName() + "/testshare/test.pri") << (qint64)34;
-#endif
-}
-
-void tst_QFile::size()
-{
- QFETCH( QString, filename );
- QFETCH( qint64, size );
-
-#ifdef Q_WS_WINCE
- filename = QFileInfo(filename).absoluteFilePath();
-#endif
-
- {
- QFile f( filename );
- QCOMPARE( f.size(), size );
-
- QVERIFY( f.open(QIODevice::ReadOnly) );
- QCOMPARE( f.size(), size );
- }
-
- {
- QFile f;
- FILE* stream = QT_FOPEN(filename.toLocal8Bit().constData(), "rb");
- QVERIFY( stream );
- QVERIFY( f.open(stream, QIODevice::ReadOnly) );
- QCOMPARE( f.size(), size );
-
- f.close();
- fclose(stream);
- }
-
- {
-#ifdef Q_WS_WINCE
- QSKIP("Currently low level file I/O not well supported on Windows CE", SkipSingle);
-#endif
- QFile f;
-
- int fd = QT_OPEN(filename.toLocal8Bit().constData(), QT_OPEN_RDONLY);
-
- QVERIFY( fd != -1 );
- QVERIFY( f.open(fd, QIODevice::ReadOnly) );
- QCOMPARE( f.size(), size );
-
- f.close();
- QT_CLOSE(fd);
- }
-}
-
-void tst_QFile::sizeNoExist()
-{
- QFile file("nonexist01");
- QVERIFY( !file.exists() );
- QCOMPARE( file.size(), (qint64)0 );
- QVERIFY( !file.open(QIODevice::ReadOnly) );
-}
-
-void tst_QFile::seek()
-{
- QFile::remove("newfile.txt");
- QFile file("newfile.txt");
- file.open(QIODevice::WriteOnly);
- QCOMPARE(file.size(), qint64(0));
- QCOMPARE(file.pos(), qint64(0));
- QVERIFY(file.seek(10));
- QCOMPARE(file.pos(), qint64(10));
- QCOMPARE(file.size(), qint64(0));
- file.close();
- QFile::remove("newfile.txt");
-}
-
-void tst_QFile::setSize()
-{
- DEPENDS_ON( "size" );
-
- if ( QFile::exists( "createme.txt" ) )
- QFile::remove( "createme.txt" );
- QVERIFY( !QFile::exists( "createme.txt" ) );
-
- QFile f("createme.txt");
- QVERIFY(f.open(QIODevice::Truncate | QIODevice::ReadWrite));
- f.putChar('a');
-
- f.seek(0);
- char c = '\0';
- f.getChar(&c);
- QCOMPARE(c, 'a');
-
- QCOMPARE(f.size(), (qlonglong)1);
- bool ok = f.resize(99);
- QVERIFY(ok);
- QCOMPARE(f.size(), (qlonglong)99);
-
- f.seek(0);
- c = '\0';
- f.getChar(&c);
- QCOMPARE(c, 'a');
-
- QVERIFY(f.resize(1));
- QCOMPARE(f.size(), (qlonglong)1);
-
- f.seek(0);
- c = '\0';
- f.getChar(&c);
- QCOMPARE(c, 'a');
-
- f.close();
-
- QCOMPARE(f.size(), (qlonglong)1);
- QVERIFY(f.resize(100));
- QCOMPARE(f.size(), (qlonglong)100);
- QVERIFY(f.resize(50));
- QCOMPARE(f.size(), (qlonglong)50);
-}
-
-void tst_QFile::setSizeSeek()
-{
- QFile::remove("setsizeseek.txt");
- QFile f("setsizeseek.txt");
- QVERIFY(f.open(QFile::WriteOnly));
- f.write("ABCD");
-
- QCOMPARE(f.pos(), qint64(4));
- f.resize(2);
- QCOMPARE(f.pos(), qint64(2));
- f.resize(4);
- QCOMPARE(f.pos(), qint64(2));
- f.resize(0);
- QCOMPARE(f.pos(), qint64(0));
- f.resize(4);
- QCOMPARE(f.pos(), qint64(0));
-
- f.seek(3);
- QCOMPARE(f.pos(), qint64(3));
- f.resize(2);
- QCOMPARE(f.pos(), qint64(2));
-}
-
-void tst_QFile::atEnd()
-{
- QFile f( SRCDIR "testfile.txt" );
- QVERIFY(f.open( QIODevice::ReadOnly ));
-
- int size = f.size();
- f.seek( size );
-
- bool end = f.atEnd();
- f.close();
- QCOMPARE( end, (bool)TRUE );
-}
-
-void tst_QFile::readLine()
-{
- QFile f( SRCDIR "testfile.txt" );
- QVERIFY(f.open( QIODevice::ReadOnly ));
-
- int i = 0;
- char p[128];
- int foo;
- while ( (foo=f.readLine( p, 128 )) > 0 ) {
- ++i;
- if ( i == 5 ) {
- QCOMPARE( p[0], 'T' );
- QCOMPARE( p[3], 's' );
- QCOMPARE( p[11], 'i' );
- }
- }
- f.close();
- QCOMPARE( i, 6 );
-}
-
-void tst_QFile::readLine2()
-{
- QFile f( SRCDIR "testfile.txt" );
- f.open( QIODevice::ReadOnly );
-
- char p[128];
- QCOMPARE(f.readLine(p, 60), qlonglong(59));
- QCOMPARE(f.readLine(p, 60), qlonglong(59));
- memset(p, '@', sizeof(p));
- QCOMPARE(f.readLine(p, 60), qlonglong(59));
-
- QCOMPARE(p[57], '-');
- QCOMPARE(p[58], '\n');
- QCOMPARE(p[59], '\0');
- QCOMPARE(p[60], '@');
-}
-
-void tst_QFile::readLineNullInLine()
-{
- QFile::remove("nullinline.txt");
- QFile file("nullinline.txt");
- QVERIFY(file.open(QIODevice::ReadWrite));
- QVERIFY(file.write("linewith\0null\nanotherline\0withnull\n\0\nnull\0", 42) > 0);
- QVERIFY(file.flush());
- file.reset();
-
- QCOMPARE(file.readLine(), QByteArray("linewith\0null\n", 14));
- QCOMPARE(file.readLine(), QByteArray("anotherline\0withnull\n", 21));
- QCOMPARE(file.readLine(), QByteArray("\0\n", 2));
- QCOMPARE(file.readLine(), QByteArray("null\0", 5));
- QCOMPARE(file.readLine(), QByteArray());
-}
-
-void tst_QFile::readAll_data()
-{
- QTest::addColumn<bool>("textMode");
- QTest::addColumn<QString>("fileName");
- QTest::newRow( "TextMode unixfile" ) << true << SRCDIR "testfile.txt";
- QTest::newRow( "BinaryMode unixfile" ) << false << SRCDIR "testfile.txt";
- QTest::newRow( "TextMode dosfile" ) << true << SRCDIR "dosfile.txt";
- QTest::newRow( "BinaryMode dosfile" ) << false << SRCDIR "dosfile.txt";
- QTest::newRow( "TextMode bigfile" ) << true << SRCDIR "tst_qfile.cpp";
- QTest::newRow( "BinaryMode bigfile" ) << false << SRCDIR "tst_qfile.cpp";
- QVERIFY(QFile(SRCDIR "tst_qfile.cpp").size() > 64*1024);
-}
-
-void tst_QFile::readAll()
-{
- QFETCH( bool, textMode );
- QFETCH( QString, fileName );
-
- QFile file(fileName);
- if (textMode)
- QVERIFY(file.open(QFile::Text | QFile::ReadOnly));
- else
- QVERIFY(file.open(QFile::ReadOnly));
-
- QByteArray a = file.readAll();
- file.reset();
- QVERIFY(file.pos() == 0);
-
- QVERIFY(file.bytesAvailable() > 7);
- QByteArray b = file.read(1);
- char x;
- file.getChar(&x);
- b.append(x);
- b.append(file.read(5));
- b.append(file.readAll());
-
- QCOMPARE(a, b);
-}
-
-void tst_QFile::readAllBuffer()
-{
- QString fileName = QLatin1String("readAllBuffer.txt");
-
- QFile::remove(fileName);
-
- QFile writer(fileName);
- QFile reader(fileName);
-
- QByteArray data1("This is arguably a very simple text.");
- QByteArray data2("This is surely not as simple a test.");
-
- QVERIFY( writer.open(QIODevice::ReadWrite | QIODevice::Unbuffered) );
- QVERIFY( reader.open(QIODevice::ReadOnly) );
-
- QCOMPARE( writer.write(data1), qint64(data1.size()) );
- QVERIFY( writer.seek(0) );
-
- QByteArray result;
- result = reader.read(18);
- QCOMPARE( result.size(), 18 );
-
- QCOMPARE( writer.write(data2), qint64(data2.size()) ); // new data, old version buffered in reader
- QCOMPARE( writer.write(data2), qint64(data2.size()) ); // new data, unbuffered in reader
-
- result += reader.readAll();
-
- QCOMPARE( result, data1 + data2 );
-
- QFile::remove(fileName);
-}
-
-void tst_QFile::readAllStdin()
-{
-#if defined(Q_OS_WINCE) || defined(Q_OS_SYMBIAN)
- QSKIP("Currently no stdin/out supported for Windows CE or Symbian", SkipAll);
-#endif
-#if defined(QT_NO_PROCESS)
- QSKIP("Qt was compiled with QT_NO_PROCESS", SkipAll);
-#else
- QByteArray lotsOfData(1024, '@'); // 10 megs
-
- QProcess process;
- process.start("stdinprocess/stdinprocess all");
- QVERIFY( process.waitForStarted() );
- for (int i = 0; i < 5; ++i) {
- QTest::qWait(1000);
- process.write(lotsOfData);
- while (process.bytesToWrite() > 0) {
- QVERIFY(process.waitForBytesWritten());
- }
- }
-
- process.closeWriteChannel();
- process.waitForFinished();
- QCOMPARE(process.readAll().size(), lotsOfData.size() * 5);
-#endif
-}
-
-void tst_QFile::readLineStdin()
-{
-#if defined(Q_OS_WINCE) || defined(Q_OS_SYMBIAN)
- QSKIP("Currently no stdin/out supported for Windows CE or Symbian", SkipAll);
-#endif
-#if defined(QT_NO_PROCESS)
- QSKIP("Qt was compiled with QT_NO_PROCESS", SkipAll);
-#else
-
- QByteArray lotsOfData(1024, '@'); // 10 megs
- for (int i = 0; i < lotsOfData.size(); ++i) {
- if ((i % 32) == 31)
- lotsOfData[i] = '\n';
- else
- lotsOfData[i] = char('0' + i % 32);
- }
-
- for (int i = 0; i < 2; ++i) {
- QProcess process;
- process.start(QString("stdinprocess/stdinprocess line %1").arg(i), QIODevice::Text | QIODevice::ReadWrite);
- for (int i = 0; i < 5; ++i) {
- QTest::qWait(1000);
- process.write(lotsOfData);
- while (process.bytesToWrite() > 0) {
- QVERIFY(process.waitForBytesWritten());
- }
- }
-
- process.closeWriteChannel();
- QVERIFY(process.waitForFinished(5000));
-
- QByteArray array = process.readAll();
- QCOMPARE(array.size(), lotsOfData.size() * 5);
- for (int i = 0; i < array.size(); ++i) {
- if ((i % 32) == 31)
- QCOMPARE(char(array[i]), '\n');
- else
- QCOMPARE(char(array[i]), char('0' + i % 32));
- }
- }
-#endif
-}
-
-void tst_QFile::readLineStdin_lineByLine()
-{
-#if defined(Q_OS_WINCE) || defined(Q_OS_SYMBIAN)
- QSKIP("Currently no stdin/out supported for Windows CE", SkipAll);
-#endif
-#if defined(QT_NO_PROCESS)
- QSKIP("Qt was compiled with QT_NO_PROCESS", SkipAll);
-#else
- for (int i = 0; i < 2; ++i) {
- QProcess process;
- process.start(QString("stdinprocess/stdinprocess line %1").arg(i), QIODevice::Text | QIODevice::ReadWrite);
- QVERIFY(process.waitForStarted());
-
- for (int j = 0; j < 3; ++j) {
- QByteArray line = "line " + QByteArray::number(j) + "\n";
- QCOMPARE(process.write(line), qint64(line.size()));
- QVERIFY(process.waitForBytesWritten(2000));
- if (process.bytesAvailable() == 0)
- QVERIFY(process.waitForReadyRead(2000));
- QCOMPARE(process.readAll(), line);
- }
-
- process.closeWriteChannel();
- QVERIFY(process.waitForFinished(5000));
- }
-#endif
-}
-
-void tst_QFile::text()
-{
- // dosfile.txt is a binary CRLF file
- QFile file(SRCDIR "dosfile.txt");
- QVERIFY(file.open(QFile::Text | QFile::ReadOnly));
- QCOMPARE(file.readLine(),
- QByteArray("/dev/system/root / reiserfs acl,user_xattr 1 1\n"));
- QCOMPARE(file.readLine(),
- QByteArray("/dev/sda1 /boot ext3 acl,user_xattr 1 2\n"));
- file.ungetChar('\n');
- file.ungetChar('2');
- QCOMPARE(file.readLine().constData(), QByteArray("2\n").constData());
-}
-
-void tst_QFile::missingEndOfLine()
-{
- QFile file(SRCDIR "noendofline.txt");
- QVERIFY(file.open(QFile::ReadOnly));
-
- int nlines = 0;
- while (!file.atEnd()) {
- ++nlines;
- file.readLine();
- }
-
- QCOMPARE(nlines, 3);
-}
-
-void tst_QFile::readBlock()
-{
- QFile f( SRCDIR "testfile.txt" );
- f.open( QIODevice::ReadOnly );
-
- int length = 0;
- char p[256];
- length = f.read( p, 256 );
- f.close();
- QCOMPARE( length, 245 );
- QCOMPARE( p[59], 'D' );
- QCOMPARE( p[178], 'T' );
- QCOMPARE( p[199], 'l' );
-}
-
-void tst_QFile::getch()
-{
- QFile f( SRCDIR "testfile.txt" );
- f.open( QIODevice::ReadOnly );
-
- char c;
- int i = 0;
- while (f.getChar(&c)) {
- QCOMPARE(f.pos(), qint64(i + 1));
- if ( i == 59 )
- QCOMPARE( c, 'D' );
- ++i;
- }
- f.close();
- QCOMPARE( i, 245 );
-}
-
-void tst_QFile::ungetChar()
-{
- QFile f(SRCDIR "testfile.txt");
- QVERIFY(f.open(QIODevice::ReadOnly));
-
- QByteArray array = f.readLine();
- QCOMPARE(array.constData(), "----------------------------------------------------------\n");
- f.ungetChar('\n');
-
- array = f.readLine();
- QCOMPARE(array.constData(), "\n");
-
- f.ungetChar('\n');
- f.ungetChar('-');
- f.ungetChar('-');
-
- array = f.readLine();
- QCOMPARE(array.constData(), "--\n");
-
- QFile::remove("genfile.txt");
- QFile out("genfile.txt");
- QVERIFY(out.open(QIODevice::ReadWrite));
- out.write("123");
- out.seek(0);
- QCOMPARE(out.readAll().constData(), "123");
- out.ungetChar('3');
- out.write("4");
- out.seek(0);
- QCOMPARE(out.readAll().constData(), "124");
- out.ungetChar('4');
- out.ungetChar('2');
- out.ungetChar('1');
- char buf[3];
- QCOMPARE(out.read(buf, sizeof(buf)), qint64(3));
- QCOMPARE(buf[0], '1');
- QCOMPARE(buf[1], '2');
- QCOMPARE(buf[2], '4');
-}
-
-void tst_QFile::invalidFile_data()
-{
- QTest::addColumn<QString>("fileName");
-#if !defined(Q_WS_WIN) && !defined(Q_OS_SYMBIAN)
- QTest::newRow( "x11" ) << QString( "qwe//" );
-#else
- QTest::newRow( "colon1" ) << QString( "fail:invalid" );
- QTest::newRow( "colon2" ) << QString( "f:ail:invalid" );
- QTest::newRow( "colon3" ) << QString( ":failinvalid" );
- QTest::newRow( "forwardslash" ) << QString( "fail/invalid" );
- QTest::newRow( "asterisk" ) << QString( "fail*invalid" );
- QTest::newRow( "questionmark" ) << QString( "fail?invalid" );
- QTest::newRow( "quote" ) << QString( "fail\"invalid" );
- QTest::newRow( "lt" ) << QString( "fail<invalid" );
- QTest::newRow( "gt" ) << QString( "fail>invalid" );
- QTest::newRow( "pipe" ) << QString( "fail|invalid" );
-#endif
-}
-
-void tst_QFile::invalidFile()
-{
- QFETCH( QString, fileName );
- QFile f( fileName );
- QVERIFY( !f.open( QIODevice::ReadWrite ) );
-}
-
-void tst_QFile::createFile()
-{
- if ( QFile::exists( "createme.txt" ) )
- QFile::remove( "createme.txt" );
- QVERIFY( !QFile::exists( "createme.txt" ) );
-
- QFile f( "createme.txt" );
- QVERIFY( f.open( QIODevice::WriteOnly ) );
- f.close();
- QVERIFY( QFile::exists( "createme.txt" ) );
-}
-
-void tst_QFile::append()
-{
- const QString name("appendme.txt");
- if (QFile::exists(name))
- QFile::remove(name);
- QVERIFY(!QFile::exists(name));
-
- QFile f(name);
- QVERIFY(f.open(QIODevice::WriteOnly | QIODevice::Truncate));
- f.putChar('a');
- f.close();
-
- QVERIFY(f.open(QIODevice::Append));
- QVERIFY(f.pos() == 1);
- f.putChar('a');
- f.close();
- QCOMPARE(int(f.size()), 2);
-}
-
-void tst_QFile::permissions_data()
-{
- QTest::addColumn<QString>("file");
- QTest::addColumn<uint>("perms");
- QTest::addColumn<bool>("expected");
-
- QTest::newRow("data0") << QCoreApplication::instance()->applicationFilePath() << uint(QFile::ExeUser) << true;
- QTest::newRow("data1") << SRCDIR "tst_qfile.cpp" << uint(QFile::ReadUser) << true;
-// QTest::newRow("data2") << "tst_qfile.cpp" << int(QFile::WriteUser) << false;
- QTest::newRow("resource1") << ":/tst_qfileinfo/resources/file1.ext1" << uint(QFile::ReadUser) << true;
- QTest::newRow("resource2") << ":/tst_qfileinfo/resources/file1.ext1" << uint(QFile::WriteUser) << false;
- QTest::newRow("resource3") << ":/tst_qfileinfo/resources/file1.ext1" << uint(QFile::ExeUser) << false;
-}
-
-void tst_QFile::permissions()
-{
-#if defined(Q_OS_SYMBIAN)
- if (qstrcmp(QTest::currentDataTag(), "data0") == 0)
- QSKIP("Symbian does not have execution permissions", SkipSingle);
-#endif
- QFETCH(QString, file);
- QFETCH(uint, perms);
- QFETCH(bool, expected);
- QFile f(file);
- QCOMPARE(((f.permissions() & perms) == QFile::Permissions(perms)), expected);
- QCOMPARE(((QFile::permissions(file) & perms) == QFile::Permissions(perms)), expected);
-}
-
-void tst_QFile::setPermissions()
-{
- DEPENDS_ON( "permissions" ); //if that doesn't work...
-
- if ( QFile::exists( "createme.txt" ) )
- QFile::remove( "createme.txt" );
- QVERIFY( !QFile::exists( "createme.txt" ) );
-
- QFile f("createme.txt");
- QVERIFY(f.open(QIODevice::WriteOnly | QIODevice::Truncate));
- f.putChar('a');
- f.close();
-
- QFile::Permissions perms(QFile::WriteUser | QFile::ReadUser);
- QVERIFY(f.setPermissions(perms));
- QVERIFY((f.permissions() & perms) == perms);
-
-}
-
-void tst_QFile::copy()
-{
- QFile::setPermissions("tst_qfile_copy.cpp", QFile::WriteUser);
- QFile::remove("tst_qfile_copy.cpp");
- QFile::remove("test2");
- QVERIFY(QFile::copy(SRCDIR "tst_qfile.cpp", "tst_qfile_copy.cpp"));
- QFile in1(SRCDIR "tst_qfile.cpp"), in2("tst_qfile_copy.cpp");
- QVERIFY(in1.open(QFile::ReadOnly));
- QVERIFY(in2.open(QFile::ReadOnly));
- QByteArray data1 = in1.readAll(), data2 = in2.readAll();
- QCOMPARE(data1, data2);
- QFile::remove( "main_copy.cpp" );
-
- QFile::copy(QDir::currentPath(), QDir::currentPath() + QLatin1String("/test2"));
-}
-
-void tst_QFile::copyAfterFail()
-{
- QFile file1("file-to-be-copied.txt");
- QFile file2("existing-file.txt");
-
- QVERIFY(file1.open(QIODevice::ReadWrite) && "(test-precondition)");
- QVERIFY(file2.open(QIODevice::ReadWrite) && "(test-precondition)");
- file2.close();
- QVERIFY(!QFile::exists("copied-file-1.txt") && "(test-precondition)");
- QVERIFY(!QFile::exists("copied-file-2.txt") && "(test-precondition)");
-
- QVERIFY(!file1.copy("existing-file.txt"));
- QCOMPARE(file1.error(), QFile::CopyError);
-
- QVERIFY(file1.copy("copied-file-1.txt"));
- QVERIFY(!file1.isOpen());
- QCOMPARE(file1.error(), QFile::NoError);
-
- QVERIFY(!file1.copy("existing-file.txt"));
- QCOMPARE(file1.error(), QFile::CopyError);
-
- QVERIFY(file1.copy("copied-file-2.txt"));
- QVERIFY(!file1.isOpen());
- QCOMPARE(file1.error(), QFile::NoError);
-
- QVERIFY(QFile::exists("copied-file-1.txt"));
- QVERIFY(QFile::exists("copied-file-2.txt"));
-
- QVERIFY(QFile::remove("file-to-be-copied.txt") && "(test-cleanup)");
- QVERIFY(QFile::remove("existing-file.txt") && "(test-cleanup)");
- QVERIFY(QFile::remove("copied-file-1.txt") && "(test-cleanup)");
- QVERIFY(QFile::remove("copied-file-2.txt") && "(test-cleanup)");
-}
-
-void tst_QFile::copyRemovesTemporaryFile() const
-{
- const QString newName(QLatin1String("copyRemovesTemporaryFile"));
- QVERIFY(QFile::copy(SRCDIR "forCopying.txt", newName));
-
- QVERIFY(!QFile::exists(QLatin1String( SRCDIR "qt_temp.XXXXXX")));
- QVERIFY(QFile::remove(newName));
-}
-
-void tst_QFile::copyShouldntOverwrite()
-{
- // Copy should not overwrite existing files.
- QFile::remove("tst_qfile.cpy");
- QFile file(SRCDIR "tst_qfile.cpp");
- QVERIFY(file.copy("tst_qfile.cpy"));
-#if defined(Q_OS_SYMBIAN)
- bool ok = QFile::setPermissions("tst_qfile.cpy", QFile::WriteUser);
-#else
- bool ok = QFile::setPermissions("tst_qfile.cpy", QFile::WriteOther);
-#endif
- QVERIFY(ok);
- QVERIFY(!file.copy("tst_qfile.cpy"));
- QFile::remove("tst_qfile.cpy");
-}
-
-void tst_QFile::copyFallback()
-{
- // Using a resource file to trigger QFile::copy's fallback handling
- QFile file(":/copy-fallback.qrc");
- QFile::remove("file-copy-destination.txt");
-
- QVERIFY2(file.exists(), "test precondition");
- QVERIFY2(!QFile::exists("file-copy-destination.txt"), "test precondition");
-
- // Fallback copy of closed file.
- QVERIFY(file.copy("file-copy-destination.txt"));
- QVERIFY(QFile::exists("file-copy-destination.txt"));
- QVERIFY(!file.isOpen());
-
-#ifdef Q_WS_WINCE
- // Need to reset permissions on Windows to be able to delete
- QVERIFY(QFile::setPermissions("file-copy-destination.txt",
- QFile::WriteOther));
-#else
- // Need to reset permissions on Windows to be able to delete
- QVERIFY(QFile::setPermissions("file-copy-destination.txt",
- QFile::ReadOwner | QFile::WriteOwner));
-#endif
- QVERIFY(QFile::remove("file-copy-destination.txt"));
-
- // Fallback copy of open file.
- QVERIFY(file.open(QIODevice::ReadOnly));
- QVERIFY(file.copy("file-copy-destination.txt"));
- QVERIFY(QFile::exists("file-copy-destination.txt"));
- QVERIFY(!file.isOpen());
-
- file.close();
- QFile::remove("file-copy-destination.txt");
-}
-
-#ifdef Q_OS_WIN
-#include <objbase.h>
-#include <shlobj.h>
-#endif
-
-#if defined(Q_OS_WIN) && !defined(Q_OS_WINCE)
-static QString getWorkingDirectoryForLink(const QString &linkFileName)
-{
- bool neededCoInit = false;
- QString ret;
-
- IShellLink *psl;
- HRESULT hres = CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_IShellLink, (void **)&psl);
- if (hres == CO_E_NOTINITIALIZED) { // COM was not initialized
- neededCoInit = true;
- CoInitialize(NULL);
- hres = CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_IShellLink, (void **)&psl);
- }
-
- if (SUCCEEDED(hres)) { // Get pointer to the IPersistFile interface.
- IPersistFile *ppf;
- hres = psl->QueryInterface(IID_IPersistFile, (LPVOID *)&ppf);
- if (SUCCEEDED(hres)) {
- hres = ppf->Load((LPOLESTR)linkFileName.utf16(), STGM_READ);
- //The original path of the link is retrieved. If the file/folder
- //was moved, the return value still have the old path.
- if(SUCCEEDED(hres)) {
- wchar_t szGotPath[MAX_PATH];
- if (psl->GetWorkingDirectory(szGotPath, MAX_PATH) == NOERROR)
- ret = QString::fromWCharArray(szGotPath);
- }
- ppf->Release();
- }
- psl->Release();
- }
-
- if (neededCoInit) {
- CoUninitialize();
- }
-
- return ret;
-}
-#endif
-
-void tst_QFile::link()
-{
-#if defined(Q_OS_SYMBIAN)
- QSKIP("Symbian does not support links", SkipAll);
-#endif
- QFile::remove("myLink.lnk");
-
- QFileInfo info1(SRCDIR "tst_qfile.cpp");
- QString referenceTarget = QDir::cleanPath(info1.absoluteFilePath());
-
- QVERIFY(QFile::link(SRCDIR "tst_qfile.cpp", "myLink.lnk"));
-
- QFileInfo info2("myLink.lnk");
- QVERIFY(info2.isSymLink());
- QCOMPARE(info2.symLinkTarget(), referenceTarget);
-
- QFile link("myLink.lnk");
- QVERIFY(link.open(QIODevice::ReadOnly));
- QCOMPARE(link.symLinkTarget(), referenceTarget);
- link.close();
-
- QCOMPARE(QFile::symLinkTarget("myLink.lnk"), referenceTarget);
-
-#if defined(Q_OS_WIN) && !defined(Q_OS_WINCE)
- QString wd = getWorkingDirectoryForLink(info2.absoluteFilePath());
- QCOMPARE(QDir::fromNativeSeparators(wd), QDir::cleanPath(info1.absolutePath()));
-#endif
-
- QVERIFY(QFile::remove(info2.absoluteFilePath()));
-}
-
-void tst_QFile::linkToDir()
-{
-#if defined(Q_OS_SYMBIAN)
- QSKIP("Symbian does not support linking to directories", SkipAll);
-#endif
- QFile::remove("myLinkToDir.lnk");
- QDir dir;
- dir.mkdir("myDir");
- QFileInfo info1("myDir");
- QVERIFY(QFile::link("myDir", "myLinkToDir.lnk"));
- QFileInfo info2("myLinkToDir.lnk");
-#if !(defined Q_OS_HPUX && defined(__ia64))
- // absurd HP-UX filesystem bug on gravlaks - checking if a symlink
- // resolves or not alters the file system to make the broken symlink
- // later fail...
- QVERIFY(info2.isSymLink());
-#endif
- QCOMPARE(info2.symLinkTarget(), info1.absoluteFilePath());
- QVERIFY(QFile::remove(info2.absoluteFilePath()));
- QFile::remove("myLinkToDir.lnk");
- dir.rmdir("myDir");
-}
-
-void tst_QFile::absolutePathLinkToRelativePath()
-{
-#if defined(Q_OS_SYMBIAN)
- QSKIP("Symbian does not support links", SkipAll);
-#endif
- QFile::remove("myDir/test.txt");
- QFile::remove("myDir/myLink.lnk");
- QDir dir;
- dir.mkdir("myDir");
- QFile("myDir/test.txt").open(QFile::WriteOnly);
-
-#ifdef Q_OS_WIN
- QVERIFY(QFile::link("test.txt", "myDir/myLink.lnk"));
-#else
- QVERIFY(QFile::link("myDir/test.txt", "myDir/myLink.lnk"));
-#endif
- QEXPECT_FAIL("", "Symlinking using relative paths is currently different on Windows and Unix/Symbian", Continue);
- QCOMPARE(QFileInfo(QFile(QFileInfo("myDir/myLink.lnk").absoluteFilePath()).symLinkTarget()).absoluteFilePath(),
- QFileInfo("myDir/test.txt").absoluteFilePath());
-
- QFile::remove("myDir/test.txt");
- QFile::remove("myDir/myLink.lnk");
- dir.rmdir("myDir");
-}
-
-void tst_QFile::readBrokenLink()
-{
-#if defined(Q_OS_SYMBIAN)
- QSKIP("Symbian does not support links", SkipAll);
-#endif
- QFile::remove("myLink2.lnk");
- QFileInfo info1("file12");
-#if defined(Q_OS_SYMBIAN)
- // In Symbian can't link to nonexisting file directly, so create the file temporarily
- QFile tempFile("file12");
- tempFile.open(QIODevice::WriteOnly);
- tempFile.link("myLink2.lnk");
- tempFile.remove();
-#else
- QVERIFY(QFile::link("file12", "myLink2.lnk"));
-#endif
- QFileInfo info2("myLink2.lnk");
- QVERIFY(info2.isSymLink());
- QCOMPARE(info2.symLinkTarget(), info1.absoluteFilePath());
- QVERIFY(QFile::remove(info2.absoluteFilePath()));
-
-#if !defined(Q_OS_SYMBIAN)
- QVERIFY(QFile::link("ole/..", "myLink2.lnk"));
- QCOMPARE(QFileInfo("myLink2.lnk").symLinkTarget(), QDir::currentPath());
-#endif
-}
-
-void tst_QFile::readTextFile_data()
-{
- QTest::addColumn<QByteArray>("in");
- QTest::addColumn<QByteArray>("out");
-
- QTest::newRow("empty") << QByteArray() << QByteArray();
- QTest::newRow("a") << QByteArray("a") << QByteArray("a");
- QTest::newRow("a\\rb") << QByteArray("a\rb") << QByteArray("ab");
- QTest::newRow("\\n") << QByteArray("\n") << QByteArray("\n");
- QTest::newRow("\\r\\n") << QByteArray("\r\n") << QByteArray("\n");
- QTest::newRow("\\r") << QByteArray("\r") << QByteArray();
- QTest::newRow("twolines") << QByteArray("Hello\r\nWorld\r\n") << QByteArray("Hello\nWorld\n");
- QTest::newRow("twolines no endline") << QByteArray("Hello\r\nWorld") << QByteArray("Hello\nWorld");
-}
-
-void tst_QFile::readTextFile()
-{
- QFETCH(QByteArray, in);
- QFETCH(QByteArray, out);
-
- QFile winfile("winfile.txt");
- QVERIFY(winfile.open(QFile::WriteOnly | QFile::Truncate));
- winfile.write(in);
- winfile.close();
-
- QVERIFY(winfile.open(QFile::ReadOnly));
- QCOMPARE(winfile.readAll(), in);
- winfile.close();
-
- QVERIFY(winfile.open(QFile::ReadOnly | QFile::Text));
- QCOMPARE(winfile.readAll(), out);
-}
-
-void tst_QFile::readTextFile2()
-{
- {
- QFile file(SRCDIR "testlog.txt");
- QVERIFY(file.open(QIODevice::ReadOnly));
- file.read(4097);
- }
-
- {
- QFile file(SRCDIR "testlog.txt");
- QVERIFY(file.open(QIODevice::ReadOnly | QIODevice::Text));
- file.read(4097);
- }
-}
-
-void tst_QFile::writeTextFile_data()
-{
- QTest::addColumn<QByteArray>("in");
-
- QTest::newRow("empty") << QByteArray();
- QTest::newRow("a") << QByteArray("a");
- QTest::newRow("a\\rb") << QByteArray("a\rb");
- QTest::newRow("\\n") << QByteArray("\n");
- QTest::newRow("\\r\\n") << QByteArray("\r\n");
- QTest::newRow("\\r") << QByteArray("\r");
- QTest::newRow("twolines crlf") << QByteArray("Hello\r\nWorld\r\n");
- QTest::newRow("twolines crlf no endline") << QByteArray("Hello\r\nWorld");
- QTest::newRow("twolines lf") << QByteArray("Hello\nWorld\n");
- QTest::newRow("twolines lf no endline") << QByteArray("Hello\nWorld");
- QTest::newRow("mixed") << QByteArray("this\nis\r\na\nmixed\r\nfile\n");
-}
-
-void tst_QFile::writeTextFile()
-{
- QFETCH(QByteArray, in);
-
- QFile file("textfile.txt");
- QVERIFY(file.open(QFile::WriteOnly | QFile::Truncate | QFile::Text));
- QByteArray out = in;
-#ifdef Q_OS_WIN
- out.replace('\n', "\r\n");
-#endif
- QCOMPARE(file.write(in), qlonglong(in.size()));
- file.close();
-
- file.open(QFile::ReadOnly);
- QCOMPARE(file.readAll(), out);
-}
-
-#if defined(Q_OS_WIN) && !defined(Q_OS_WINCE)
-void tst_QFile::largeUncFileSupport()
-{
- qint64 size = Q_INT64_C(8589934592);
- qint64 dataOffset = Q_INT64_C(8589914592);
- QByteArray knownData("LargeFile content at offset 8589914592");
- QString largeFile("//" + QtNetworkSettings::winServerName() + "/testsharelargefile/file.bin");
-
- {
- // 1) Native file handling.
- QFile file(largeFile);
- QCOMPARE(file.size(), size);
- QVERIFY(file.open(QIODevice::ReadOnly));
- QCOMPARE(file.size(), size);
- QVERIFY(file.seek(dataOffset));
- QCOMPARE(file.read(knownData.size()), knownData);
- }
- {
- // 2) stdlib file handling.
-#if _MSC_VER <= 1310
- QSKIP("platform SDK for MSVC 2003 does not support large files", SkipAll);
-#endif
- QFile file;
- FILE *fh = fopen(QFile::encodeName(largeFile).data(), "rb");
- QVERIFY(file.open(fh, QIODevice::ReadOnly));
- QCOMPARE(file.size(), size);
- QVERIFY(file.seek(dataOffset));
- QCOMPARE(file.read(knownData.size()), knownData);
- fclose(fh);
- }
- {
- // 3) stdio file handling.
- QFile file;
- FILE *fh = fopen(QFile::encodeName(largeFile).data(), "rb");
- int fd = int(_fileno(fh));
- QVERIFY(file.open(fd, QIODevice::ReadOnly));
- QCOMPARE(file.size(), size);
- QVERIFY(file.seek(dataOffset));
- QCOMPARE(file.read(knownData.size()), knownData);
- fclose(fh);
- }
-}
-#endif
-
-void tst_QFile::tailFile()
-{
- QSKIP("File change notifications are so far unsupported.", SkipAll);
-
- QFile file("tail.txt");
- QVERIFY(file.open(QFile::WriteOnly | QFile::Append));
-
- QFile tailFile("tail.txt");
- QVERIFY(tailFile.open(QFile::ReadOnly));
- tailFile.seek(file.size());
-
- QSignalSpy readSignal(&tailFile, SIGNAL(readyRead()));
-
- file.write("", 1);
-
- QTestEventLoop::instance().enterLoop(5);
-
- QVERIFY(!QTestEventLoop::instance().timeout());
- QCOMPARE(readSignal.count(), 1);
-}
-
-void tst_QFile::flush()
-{
- QString fileName("stdfile.txt");
-
- QFile::remove(fileName);
-
- {
- QFile file(fileName);
- QVERIFY(file.open(QFile::WriteOnly));
- QCOMPARE(file.write("abc", 3),qint64(3));
- }
-
- {
- QFile file(fileName);
- QVERIFY(file.open(QFile::WriteOnly | QFile::Append));
- QCOMPARE(file.pos(), qlonglong(3));
- QCOMPARE(file.write("def", 3), qlonglong(3));
- QCOMPARE(file.pos(), qlonglong(6));
- }
-
- {
- QFile file("stdfile.txt");
- QVERIFY(file.open(QFile::ReadOnly));
- QCOMPARE(file.readAll(), QByteArray("abcdef"));
- }
-
- QFile::remove(fileName);
-}
-
-void tst_QFile::bufferedRead()
-{
- QFile::remove("stdfile.txt");
-
- QFile file("stdfile.txt");
- QVERIFY(file.open(QFile::WriteOnly));
- file.write("abcdef");
- file.close();
-
-#if defined(Q_OS_WINCE)
- FILE *stdFile = fopen((QCoreApplication::applicationDirPath() + "/stdfile.txt").toAscii() , "r");
-#else
- FILE *stdFile = fopen("stdfile.txt", "r");
-#endif
- QVERIFY(stdFile);
- char c;
- QCOMPARE(int(fread(&c, 1, 1, stdFile)), 1);
- QCOMPARE(c, 'a');
- QCOMPARE(int(ftell(stdFile)), 1);
-
- {
- QFile file;
- QVERIFY(file.open(stdFile, QFile::ReadOnly));
- QCOMPARE(file.pos(), qlonglong(1));
- QCOMPARE(file.read(&c, 1), qlonglong(1));
- QCOMPARE(c, 'b');
- QCOMPARE(file.pos(), qlonglong(2));
- }
-
- fclose(stdFile);
-}
-
-void tst_QFile::isSequential()
-{
-#if defined (Q_OS_WIN) || defined(Q_OS_SYMBIAN)
- QSKIP("Unix only test.", SkipAll);
-#endif
-
- QFile zero("/dev/null");
- QVERIFY(zero.open(QFile::ReadOnly));
- QVERIFY(zero.isSequential());
-}
-
-void tst_QFile::encodeName()
-{
- QCOMPARE(QFile::encodeName(QString::null), QByteArray());
-}
-
-void tst_QFile::truncate()
-{
- for (int i = 0; i < 2; ++i) {
- QFile file("truncate.txt");
- QVERIFY(file.open(QFile::WriteOnly));
- file.write(QByteArray(200, '@'));
- file.close();
-
- QVERIFY(file.open((i ? QFile::WriteOnly : QFile::ReadWrite) | QFile::Truncate));
- file.write(QByteArray(100, '$'));
- file.close();
-
- QVERIFY(file.open(QFile::ReadOnly));
- QCOMPARE(file.readAll(), QByteArray(100, '$'));
- }
-}
-
-void tst_QFile::seekToPos()
-{
- {
- QFile file("seekToPos.txt");
- QVERIFY(file.open(QFile::WriteOnly));
- file.write("a\r\nb\r\nc\r\n");
- file.flush();
- }
-
- QFile file("seekToPos.txt");
- QVERIFY(file.open(QFile::ReadOnly | QFile::Text));
- file.seek(1);
- char c;
- QVERIFY(file.getChar(&c));
- QCOMPARE(c, '\n');
-
- QCOMPARE(file.pos(), qint64(3));
- file.seek(file.pos());
- QCOMPARE(file.pos(), qint64(3));
-
- file.seek(1);
- file.seek(file.pos());
- QCOMPARE(file.pos(), qint64(1));
-
-}
-
-void tst_QFile::seekAfterEndOfFile()
-{
- QLatin1String filename("seekAfterEof.dat");
- QFile::remove(filename);
- {
- QFile file(filename);
- QVERIFY(file.open(QFile::WriteOnly));
- file.write("abcd");
- QCOMPARE(file.size(), qint64(4));
- file.seek(8);
- file.write("ijkl");
- QCOMPARE(file.size(), qint64(12));
- file.seek(4);
- file.write("efgh");
- QCOMPARE(file.size(), qint64(12));
- file.seek(16);
- file.write("----");
- QCOMPARE(file.size(), qint64(20));
- file.flush();
- }
-
- QFile file(filename);
- QVERIFY(file.open(QFile::ReadOnly));
- QByteArray contents = file.readAll();
- QCOMPARE(contents.left(12), QByteArray("abcdefghijkl", 12));
- //bytes 12-15 are uninitialised so we don't care what they read as.
- QCOMPARE(contents.mid(16), QByteArray("----", 4));
- file.close();
- QFile::remove(filename);
-}
-
-void tst_QFile::FILEReadWrite()
-{
- // Tests modifying a file. First creates it then reads in 4 bytes and then overwrites these
- // 4 bytes with new values. At the end check to see the file contains the new values.
-
- QFile::remove("FILEReadWrite.txt");
-
- // create test file
- {
- QFile f("FILEReadWrite.txt");
- QVERIFY(f.open(QFile::WriteOnly));
- QDataStream ds(&f);
- qint8 c = 0;
- ds << c;
- c = 1;
- ds << c;
- c = 2;
- ds << c;
- c = 3;
- ds << c;
- c = 4;
- ds << c;
- c = 5;
- ds << c;
- c = 6;
- ds << c;
- c = 7;
- ds << c;
- c = 8;
- ds << c;
- c = 9;
- ds << c;
- c = 10;
- ds << c;
- c = 11;
- ds << c;
- f.close();
- }
-
-#ifdef Q_OS_WINCE
- FILE *fp = fopen(qPrintable(QCoreApplication::applicationDirPath() + "\\FILEReadWrite.txt"), "r+b");
-#else
- FILE *fp = fopen("FILEReadWrite.txt", "r+b");
-#endif
- QVERIFY(fp);
- QFile file;
- QVERIFY(file.open(fp, QFile::ReadWrite));
- QDataStream sfile(&file) ;
-
- qint8 var1,var2,var3,var4;
- while (!sfile.atEnd())
- {
- qint64 base = file.pos();
-
- QCOMPARE(file.pos(), base + 0);
- sfile >> var1;
- QCOMPARE(file.pos(), base + 1);
- file.flush(); // flushing should not change the base
- QCOMPARE(file.pos(), base + 1);
- sfile >> var2;
- QCOMPARE(file.pos(), base + 2);
- sfile >> var3;
- QCOMPARE(file.pos(), base + 3);
- sfile >> var4;
- QCOMPARE(file.pos(), base + 4);
- file.seek(file.pos() - 4) ; // Move it back 4, for we are going to write new values based on old ones
- QCOMPARE(file.pos(), base + 0);
- sfile << qint8(var1 + 5);
- QCOMPARE(file.pos(), base + 1);
- sfile << qint8(var2 + 5);
- QCOMPARE(file.pos(), base + 2);
- sfile << qint8(var3 + 5);
- QCOMPARE(file.pos(), base + 3);
- sfile << qint8(var4 + 5);
- QCOMPARE(file.pos(), base + 4);
-
- }
- file.close();
- fclose(fp);
-
- // check modified file
- {
- QFile f("FILEReadWrite.txt");
- QVERIFY(f.open(QFile::ReadOnly));
- QDataStream ds(&f);
- qint8 c = 0;
- ds >> c;
- QCOMPARE(c, (qint8)5);
- ds >> c;
- QCOMPARE(c, (qint8)6);
- ds >> c;
- QCOMPARE(c, (qint8)7);
- ds >> c;
- QCOMPARE(c, (qint8)8);
- ds >> c;
- QCOMPARE(c, (qint8)9);
- ds >> c;
- QCOMPARE(c, (qint8)10);
- ds >> c;
- QCOMPARE(c, (qint8)11);
- ds >> c;
- QCOMPARE(c, (qint8)12);
- ds >> c;
- QCOMPARE(c, (qint8)13);
- ds >> c;
- QCOMPARE(c, (qint8)14);
- ds >> c;
- QCOMPARE(c, (qint8)15);
- ds >> c;
- QCOMPARE(c, (qint8)16);
- f.close();
- }
-
- QFile::remove("FILEReadWrite.txt");
-}
-
-
-/*
-#include <qglobal.h>
-#define BUFFSIZE 1
-#define FILESIZE 0x10000000f
-void tst_QFile::largeFileSupport()
-{
-#ifdef Q_OS_SOLARIS
- QSKIP("Solaris does not support statfs", SkipAll);
-#else
- qlonglong sizeNeeded = 2147483647;
- sizeNeeded *= 2;
- sizeNeeded += 1024;
- qlonglong freespace = qlonglong(0);
-#ifdef Q_WS_WIN
- _ULARGE_INTEGER free;
- if (::GetDiskFreeSpaceEx((wchar_t*)QDir::currentPath().utf16(), &free, 0, 0))
- freespace = free.QuadPart;
- if (freespace != 0) {
-#elif defined(Q_OS_IRIX)
- struct statfs info;
- if (statfs(QDir::currentPath().local8Bit(), &info, sizeof(struct statfs), 0) == 0) {
- freespace = qlonglong(info.f_bfree * info.f_bsize);
-#else
- struct statfs info;
- if (statfs(const_cast<char *>(QDir::currentPath().toLocal8Bit().constData()), &info) == 0) {
- freespace = qlonglong(info.f_bavail * info.f_bsize);
-#endif
- if (freespace > sizeNeeded) {
- QFile bigFile("bigfile");
- if (bigFile.open(QFile::ReadWrite)) {
- char c[BUFFSIZE] = {'a'};
- QVERIFY(bigFile.write(c, BUFFSIZE) == BUFFSIZE);
- qlonglong oldPos = bigFile.pos();
- QVERIFY(bigFile.resize(sizeNeeded));
- QCOMPARE(oldPos, bigFile.pos());
- QVERIFY(bigFile.seek(sizeNeeded - BUFFSIZE));
- QVERIFY(bigFile.write(c, BUFFSIZE) == BUFFSIZE);
-
- bigFile.close();
- if (bigFile.open(QFile::ReadOnly)) {
- QVERIFY(bigFile.read(c, BUFFSIZE) == BUFFSIZE);
- int i = 0;
- for (i=0; i<BUFFSIZE; i++)
- QCOMPARE(c[i], 'a');
- QVERIFY(bigFile.seek(sizeNeeded - BUFFSIZE));
- QVERIFY(bigFile.read(c, BUFFSIZE) == BUFFSIZE);
- for (i=0; i<BUFFSIZE; i++)
- QCOMPARE(c[i], 'a');
- bigFile.close();
- QVERIFY(bigFile.remove());
- } else {
- QVERIFY(bigFile.remove());
- QFAIL("Could not reopen file");
- }
- } else {
- QFAIL("Could not open file");
- }
- } else {
- QSKIP("Not enough space to run test", SkipSingle);
- }
- } else {
- QFAIL("Could not determin disk space");
- }
-#endif
-}
-*/
-
-void tst_QFile::i18nFileName_data()
-{
- QTest::addColumn<QString>("fileName");
-
- QTest::newRow( "01" ) << QString::fromUtf8("xxxxxxx.txt");
-}
-
-void tst_QFile::i18nFileName()
-{
- QFETCH(QString, fileName);
- if (QFile::exists(fileName)) {
- QVERIFY(QFile::remove(fileName));
- }
- {
- QFile file(fileName);
- QVERIFY(file.open(QFile::WriteOnly | QFile::Text));
- QTextStream ts(&file);
- ts.setCodec("UTF-8");
- ts << fileName << endl;
- }
- {
- QFile file(fileName);
- QVERIFY(file.open(QFile::ReadOnly | QFile::Text));
- QTextStream ts(&file);
- ts.setCodec("UTF-8");
- QString line = ts.readLine();
- QCOMPARE(line, fileName);
- }
- QVERIFY(QFile::remove(fileName));
-}
-
-
-void tst_QFile::longFileName_data()
-{
- QTest::addColumn<QString>("fileName");
-
- QTest::newRow( "16 chars" ) << QString::fromLatin1("longFileName.txt");
- QTest::newRow( "52 chars" ) << QString::fromLatin1("longFileNamelongFileNamelongFileNamelongFileName.txt");
- QTest::newRow( "148 chars" ) << QString::fromLatin1("longFileNamelongFileNamelongFileNamelongFileName"
- "longFileNamelongFileNamelongFileNamelongFileName"
- "longFileNamelongFileNamelongFileNamelongFileName.txt");
- QTest::newRow( "244 chars" ) << QString::fromLatin1("longFileNamelongFileNamelongFileNamelongFileName"
- "longFileNamelongFileNamelongFileNamelongFileName"
- "longFileNamelongFileNamelongFileNamelongFileName"
- "longFileNamelongFileNamelongFileNamelongFileName"
- "longFileNamelongFileNamelongFileNamelongFileName.txt");
- QTest::newRow( "244 chars to absolutepath" ) << QFileInfo(QString::fromLatin1("longFileNamelongFileNamelongFileNamelongFileName"
- "longFileNamelongFileNamelongFileNamelongFileName"
- "longFileNamelongFileNamelongFileNamelongFileName"
- "longFileNamelongFileNamelongFileNamelongFileName"
- "longFileNamelongFileNamelongFileNamelongFileName.txt")).absoluteFilePath();
- /* needs to be put on a windows 2000 > test machine
- QTest::newRow( "244 chars on UNC" ) << QString::fromLatin1("//arsia/D/troll/tmp/longFileNamelongFileNamelongFileNamelongFileName"
- "longFileNamelongFileNamelongFileNamelongFileName"
- "longFileNamelongFileNamelongFileNamelongFileName"
- "longFileNamelongFileNamelongFileNamelongFileName"
- "longFileNamelongFileNamelongFileNamelongFileName.txt");*/
-}
-
-void tst_QFile::longFileName()
-{
- QFETCH(QString, fileName);
- if (QFile::exists(fileName)) {
- QVERIFY(QFile::remove(fileName));
- }
- {
- QFile file(fileName);
-#if defined(Q_OS_WINCE) || defined(Q_OS_SYMBIAN)
- QEXPECT_FAIL("244 chars", "Full pathname must be less than 260 chars", Abort);
- QEXPECT_FAIL("244 chars to absolutepath", "Full pathname must be less than 260 chars", Abort);
-#endif
- QVERIFY(file.open(QFile::WriteOnly | QFile::Text));
- QTextStream ts(&file);
- ts << fileName << endl;
- }
- {
- QFile file(fileName);
- QVERIFY(file.open(QFile::ReadOnly | QFile::Text));
- QTextStream ts(&file);
- QString line = ts.readLine();
- QCOMPARE(line, fileName);
- }
- QString newName = fileName + QLatin1String("1");
- {
- QVERIFY(QFile::copy(fileName, newName));
- QFile file(newName);
- QVERIFY(file.open(QFile::ReadOnly | QFile::Text));
- QTextStream ts(&file);
- QString line = ts.readLine();
- QCOMPARE(line, fileName);
-
- }
- QVERIFY(QFile::remove(newName));
- {
- QVERIFY(QFile::rename(fileName, newName));
- QFile file(newName);
- QVERIFY(file.open(QFile::ReadOnly | QFile::Text));
- QTextStream ts(&file);
- QString line = ts.readLine();
- QCOMPARE(line, fileName);
- }
- QVERIFY(QFile::exists(newName));
- QVERIFY(QFile::remove(newName));
-}
-
-class MyEngine : public QAbstractFileEngine
-{
-public:
- MyEngine(int n) { number = n; }
- virtual ~MyEngine() {}
-
- void setFileName(const QString &) {}
- bool open(int ) { return false; }
- bool close() { return false; }
- bool flush() { return false; }
- qint64 size() const { return 123 + number; }
- qint64 at() const { return -1; }
- bool seek(qint64) { return false; }
- bool isSequential() const { return false; }
- qint64 read(char *, qint64) { return -1; }
- qint64 write(const char *, qint64) { return -1; }
- bool remove() { return false; }
- bool copy(const QString &) { return false; }
- bool rename(const QString &) { return false; }
- bool link(const QString &) { return false; }
- bool mkdir(const QString &, bool) const { return false; }
- bool rmdir(const QString &, bool) const { return false; }
- bool setSize(qint64) { return false; }
- QStringList entryList(QDir::Filters, const QStringList &) const { return QStringList(); }
- bool caseSensitive() const { return false; }
- bool isRelativePath() const { return false; }
- FileFlags fileFlags(FileFlags) const { return 0; }
- bool chmod(uint) { return false; }
- QString fileName(FileName) const { return name; }
- uint ownerId(FileOwner) const { return 0; }
- QString owner(FileOwner) const { return QString(); }
- QDateTime fileTime(FileTime) const { return QDateTime(); }
-
-private:
- int number;
- QString name;
-};
-
-class MyHandler : public QAbstractFileEngineHandler
-{
-public:
- inline QAbstractFileEngine *create(const QString &) const
- {
- return new MyEngine(1);
- }
-};
-
-class MyHandler2 : public QAbstractFileEngineHandler
-{
-public:
- inline QAbstractFileEngine *create(const QString &) const
- {
- return new MyEngine(2);
- }
-};
-
-void tst_QFile::fileEngineHandler()
-{
- // A file that does not exist has a size of 0.
- QFile::remove("ole.bull");
- QFile file("ole.bull");
- QCOMPARE(file.size(), qint64(0));
-
- // Instantiating our handler will enable the new engine.
- MyHandler handler;
- file.setFileName("ole.bull");
- QCOMPARE(file.size(), qint64(124));
-
- // A new, identical handler should take preference over the last one.
- MyHandler2 handler2;
- file.setFileName("ole.bull");
- QCOMPARE(file.size(), qint64(125));
-
-}
-
-class MyRecursiveHandler : public QAbstractFileEngineHandler
-{
-public:
- inline QAbstractFileEngine *create(const QString &fileName) const
- {
- if (fileName.startsWith(":!")) {
- QDir dir;
- QString realFile = SRCDIR + fileName.mid(2);
- if (dir.exists(realFile))
- return new QFSFileEngine(realFile);
- }
- return 0;
- }
-};
-
-void tst_QFile::useQFileInAFileHandler()
-{
- // This test should not dead-lock
- MyRecursiveHandler handler;
- QFile file(":!tst_qfile.cpp");
- QVERIFY(file.exists());
-}
-
-void tst_QFile::getCharFF()
-{
- QFile file("file.txt");
- file.open(QFile::ReadWrite);
- file.write("\xff\xff\xff");
- file.flush();
- file.seek(0);
-
- char c;
- QVERIFY(file.getChar(&c));
- QVERIFY(file.getChar(&c));
- QVERIFY(file.getChar(&c));
-}
-
-void tst_QFile::remove_and_exists()
-{
- QFile::remove("tull_i_grunn.txt");
- QFile f("tull_i_grunn.txt");
-
- QVERIFY(!f.exists());
-
- bool opened = f.open(QIODevice::WriteOnly);
- QVERIFY(opened);
-
- f.write(QString("testing that remove/exists work...").toLatin1());
- f.close();
-
- QVERIFY(f.exists());
-
- f.remove();
- QVERIFY(!f.exists());
-}
-
-void tst_QFile::removeOpenFile()
-{
- {
- // remove an opened, write-only file
- QFile::remove("remove_unclosed.txt");
- QFile f("remove_unclosed.txt");
-
- QVERIFY(!f.exists());
- bool opened = f.open(QIODevice::WriteOnly);
- QVERIFY(opened);
- f.write(QString("testing that remove closes the file first...").toLatin1());
-
- bool removed = f.remove(); // remove should both close and remove the file
- QVERIFY(removed);
- QVERIFY(!f.isOpen());
- QVERIFY(!f.exists());
- QVERIFY(f.error() == QFile::NoError);
- }
-
- {
- // remove an opened, read-only file
- QFile::remove("remove_unclosed.txt");
-
- // first, write a file that we can remove
- {
- QFile f("remove_unclosed.txt");
- QVERIFY(!f.exists());
- bool opened = f.open(QIODevice::WriteOnly);
- QVERIFY(opened);
- f.write(QString("testing that remove closes the file first...").toLatin1());
- f.close();
- }
-
- QFile f("remove_unclosed.txt");
- bool opened = f.open(QIODevice::ReadOnly);
- QVERIFY(opened);
- f.readAll();
- // this used to only fail on FreeBSD (and Mac OS X)
- QVERIFY(f.flush());
- bool removed = f.remove(); // remove should both close and remove the file
- QVERIFY(removed);
- QVERIFY(!f.isOpen());
- QVERIFY(!f.exists());
- QVERIFY(f.error() == QFile::NoError);
- }
-}
-
-void tst_QFile::fullDisk()
-{
- QFile file("/dev/full");
- if (!file.exists())
- QSKIP("/dev/full doesn't exist on this system", SkipAll);
-
- QVERIFY(file.open(QIODevice::WriteOnly));
- file.write("foobar", 6);
-
- QVERIFY(!file.flush());
- QCOMPARE(file.error(), QFile::ResourceError);
- QVERIFY(!file.flush());
- QCOMPARE(file.error(), QFile::ResourceError);
-
- char c = 0;
- file.write(&c, 0);
- QVERIFY(!file.flush());
- QCOMPARE(file.error(), QFile::ResourceError);
- QCOMPARE(file.write(&c, 1), qint64(1));
- QVERIFY(!file.flush());
- QCOMPARE(file.error(), QFile::ResourceError);
-
- file.close();
- QVERIFY(!file.isOpen());
- QCOMPARE(file.error(), QFile::ResourceError);
-
- file.open(QIODevice::WriteOnly);
- QCOMPARE(file.error(), QFile::NoError);
- QVERIFY(file.flush()); // Shouldn't inherit write buffer
- file.close();
- QCOMPARE(file.error(), QFile::NoError);
-
- // try again without flush:
- QVERIFY(file.open(QIODevice::WriteOnly));
- file.write("foobar", 6);
- file.close();
- QVERIFY(file.error() != QFile::NoError);
-}
-
-void tst_QFile::writeLargeDataBlock_data()
-{
- QTest::addColumn<QString>("fileName");
- QTest::addColumn<int>("type");
-
- QTest::newRow("localfile-QFile") << "./largeblockfile.txt" << (int)OpenQFile;
- QTest::newRow("localfile-Fd") << "./largeblockfile.txt" << (int)OpenFd;
- QTest::newRow("localfile-Stream") << "./largeblockfile.txt" << (int)OpenStream;
-#ifdef Q_OS_SYMBIAN
- QTest::newRow("localfile-RFile") << "./largeblockfile.txt" << (int)OpenRFile;
-#endif
-
-#if defined(Q_OS_WIN) && !defined(Q_OS_WINCE)
- // Some semi-randomness to avoid collisions.
- QTest::newRow("unc file")
- << QString("//" + QtNetworkSettings::winServerName() + "/TESTSHAREWRITABLE/largefile-%1-%2.txt")
- .arg(QHostInfo::localHostName())
- .arg(QTime::currentTime().msec()) << (int)OpenQFile;
-#endif
-}
-
-static QByteArray getLargeDataBlock()
-{
- static QByteArray array;
-
- if (array.isNull())
- {
-#if defined(Q_OS_WINCE) || defined(Q_OS_SYMBIAN)
- int resizeSize = 1024 * 1024; // WinCE and Symbian do not have much space
-#else
- int resizeSize = 64 * 1024 * 1024;
-#endif
- array.resize(resizeSize);
- for (int i = 0; i < array.size(); ++i)
- array[i] = uchar(i);
- }
-
- return array;
-}
-
-void tst_QFile::writeLargeDataBlock()
-{
- QFETCH(QString, fileName);
- QFETCH( int, type );
-
- QByteArray const originalData = getLargeDataBlock();
-
- {
- QFile file(fileName);
-
- QVERIFY2( openFile(file, QIODevice::WriteOnly, (FileType)type),
- qPrintable(QString("Couldn't open file for writing: [%1]").arg(fileName)) );
- QCOMPARE( file.write(originalData), (qint64)originalData.size() );
- QVERIFY( file.flush() );
-
- closeFile(file);
- }
-
- QByteArray readData;
-
- {
- QFile file(fileName);
-
- QVERIFY2( openFile(file, QIODevice::ReadOnly, (FileType)type),
- qPrintable(QString("Couldn't open file for reading: [%1]").arg(fileName)) );
- readData = file.readAll();
- closeFile(file);
- }
-
- QCOMPARE( readData, originalData );
- QVERIFY( QFile::remove(fileName) );
-}
-
-void tst_QFile::readFromWriteOnlyFile()
-{
- QFile file("writeonlyfile");
- QVERIFY(file.open(QFile::WriteOnly));
- char c;
- QTest::ignoreMessage(QtWarningMsg, "QIODevice::read: WriteOnly device");
- QCOMPARE(file.read(&c, 1), qint64(-1));
-}
-
-void tst_QFile::writeToReadOnlyFile()
-{
- QFile file("readonlyfile");
- QVERIFY(file.open(QFile::ReadOnly));
- char c = 0;
- QTest::ignoreMessage(QtWarningMsg, "QIODevice::write: ReadOnly device");
- QCOMPARE(file.write(&c, 1), qint64(-1));
-}
-
-void tst_QFile::virtualFile()
-{
- // test if QFile works with virtual files
- QString fname;
-#if defined(Q_OS_LINUX)
- fname = "/proc/self/maps";
-#elif defined(Q_OS_AIX)
- fname = QString("/proc/%1/map").arg(getpid());
-#elif defined(Q_OS_FREEBSD) || defined(Q_OS_NETBSD)
- fname = "/proc/curproc/map";
-#else
- QSKIP("This platform does not have 0-sized virtual files", SkipAll);
-#endif
-
- // consistency check
- QFileInfo fi(fname);
- QVERIFY(fi.exists());
- QVERIFY(fi.isFile());
- QCOMPARE(fi.size(), Q_INT64_C(0));
-
- // open the file
- QFile f(fname);
- QVERIFY(f.open(QIODevice::ReadOnly));
- QCOMPARE(f.size(), Q_INT64_C(0));
- QVERIFY(f.atEnd());
-
- // read data
- QByteArray data = f.read(16);
- QCOMPARE(data.size(), 16);
- QCOMPARE(f.pos(), Q_INT64_C(16));
-
- // line-reading
- data = f.readLine();
- QVERIFY(!data.isEmpty());
-
- // read all:
- data = f.readAll();
- QVERIFY(f.pos() != 0);
- QVERIFY(!data.isEmpty());
-
- // seeking
- QVERIFY(f.seek(1));
- QCOMPARE(f.pos(), Q_INT64_C(1));
-}
-
-void tst_QFile::textFile()
-{
-#if defined(Q_OS_WINCE)
- FILE *fs = ::fopen((QCoreApplication::applicationDirPath() + "/writeabletextfile").toAscii() , "wt");
-#elif defined(Q_OS_WIN)
- FILE *fs = ::fopen("writeabletextfile", "wt");
-#else
- FILE *fs = ::fopen("writeabletextfile", "w");
-#endif
- QFile f;
- QByteArray part1("This\nis\na\nfile\nwith\nnewlines\n");
- QByteArray part2("Add\nsome\nmore\nnewlines\n");
-
- QVERIFY(f.open(fs, QIODevice::WriteOnly));
- f.write(part1);
- f.write(part2);
- f.close();
- ::fclose(fs);
-
- QFile file("writeabletextfile");
- QVERIFY(file.open(QIODevice::ReadOnly));
-
- QByteArray data = file.readAll();
-
- QByteArray expected = part1 + part2;
-#ifdef Q_OS_WIN
- expected.replace("\n", "\015\012");
-#endif
- QCOMPARE(data, expected);
- file.close();
- file.remove();
-}
-
-void tst_QFile::rename_data()
-{
- QTest::addColumn<QString>("source");
- QTest::addColumn<QString>("destination");
- QTest::addColumn<bool>("result");
-
- QTest::newRow("a -> b") << QString("a") << QString("b") << false;
- QTest::newRow("a -> .") << QString("a") << QString(".") << false;
- QTest::newRow("renamefile -> renamefile") << QString("renamefile") << QString("renamefile") << false;
- QTest::newRow("renamefile -> noreadfile") << QString("renamefile") << QString("noreadfile") << false;
-#if defined(Q_OS_UNIX) && !defined(Q_OS_SYMBIAN)
- QTest::newRow("renamefile -> /etc/renamefile") << QString("renamefile") << QString("/etc/renamefile") << false;
-#endif
- QTest::newRow("renamefile -> renamedfile") << QString("renamefile") << QString("renamedfile") << true;
- QTest::newRow("renamefile -> ..") << QString("renamefile") << QString("..") << false;
-}
-
-void tst_QFile::rename()
-{
- QFETCH(QString, source);
- QFETCH(QString, destination);
- QFETCH(bool, result);
-
- QFile::remove("renamedfile");
- QFile f("renamefile");
- f.open(QFile::WriteOnly);
- f.close();
-
- QFile file(source);
- QCOMPARE(file.rename(destination), result);
-
- if (result)
- QCOMPARE(file.error(), QFile::NoError);
- else
- QCOMPARE(file.error(), QFile::RenameError);
-
- QFile::remove("renamefile");
-}
-
-/*!
- \since 4.5
-
- Some special files have QFile::atEnd() returning true, even though there is
- more data available. True for corner cases, as well as some mounts on OS X.
-
- Here, we reproduce that condition by having a QFile sub-class with this
- peculiar atEnd() behavior.
-
- See task 231583.
- */
-void tst_QFile::renameWithAtEndSpecialFile() const
-{
- class PeculiarAtEnd : public QFile
- {
- public:
- virtual bool atEnd() const
- {
- return true;
- }
- };
-
- const QString newName(QLatin1String("newName.txt"));
- /* Cleanup, so we're a bit more robust. */
- QFile::remove(newName);
-
- const QString originalName(QString(SRCDIR "forRenaming.txt"));
-
- PeculiarAtEnd file;
- file.setFileName(originalName);
- QVERIFY(file.open(QIODevice::ReadOnly));
-
- QVERIFY(file.rename(newName));
-
- file.close();
- /* Guess what, we have to rename it back, otherwise we'll fail on second
- * invocation. */
- QVERIFY(QFile::rename(newName, originalName));
-}
-
-void tst_QFile::renameFallback()
-{
- // Using a resource file both to trigger QFile::rename's fallback handling
- // and as a *read-only* source whose move should fail.
- QFile file(":/rename-fallback.qrc");
- QVERIFY(file.exists() && "(test-precondition)");
- QFile::remove("file-rename-destination.txt");
-
- QVERIFY(!file.rename("file-rename-destination.txt"));
- QVERIFY(!QFile::exists("file-rename-destination.txt"));
- QVERIFY(!file.isOpen());
-}
-
-void tst_QFile::renameMultiple()
-{
- // create the file if it doesn't exist
- QFile file("file-to-be-renamed.txt");
- QFile file2("existing-file.txt");
- QVERIFY(file.open(QIODevice::ReadWrite) && "(test-precondition)");
- QVERIFY(file2.open(QIODevice::ReadWrite) && "(test-precondition)");
-
- // any stale files from previous test failures?
- QFile::remove("file-renamed-once.txt");
- QFile::remove("file-renamed-twice.txt");
-
- // begin testing
- QVERIFY(QFile::exists("existing-file.txt"));
- QVERIFY(!file.rename("existing-file.txt"));
- QCOMPARE(file.error(), QFile::RenameError);
- QCOMPARE(file.fileName(), QString("file-to-be-renamed.txt"));
-
- QVERIFY(file.rename("file-renamed-once.txt"));
- QVERIFY(!file.isOpen());
- QCOMPARE(file.fileName(), QString("file-renamed-once.txt"));
-
- QVERIFY(QFile::exists("existing-file.txt"));
- QVERIFY(!file.rename("existing-file.txt"));
- QCOMPARE(file.error(), QFile::RenameError);
- QCOMPARE(file.fileName(), QString("file-renamed-once.txt"));
-
- QVERIFY(file.rename("file-renamed-twice.txt"));
- QVERIFY(!file.isOpen());
- QCOMPARE(file.fileName(), QString("file-renamed-twice.txt"));
-
- QVERIFY(QFile::exists("existing-file.txt"));
- QVERIFY(!QFile::exists("file-to-be-renamed.txt"));
- QVERIFY(!QFile::exists("file-renamed-once.txt"));
- QVERIFY(QFile::exists("file-renamed-twice.txt"));
-
- file.remove();
- file2.remove();
- QVERIFY(!QFile::exists("file-renamed-twice.txt"));
- QVERIFY(!QFile::exists("existing-file.txt"));
-}
-
-void tst_QFile::appendAndRead()
-{
- QFile writeFile(QLatin1String("appendfile.txt"));
- QVERIFY(writeFile.open(QIODevice::WriteOnly | QIODevice::Truncate));
-
- QFile readFile(QLatin1String("appendfile.txt"));
- QVERIFY(readFile.open(QIODevice::ReadOnly));
-
- // Write to the end of the file, then read that character back, and so on.
- for (int i = 0; i < 100; ++i) {
- char c = '\0';
- writeFile.putChar(char(i % 256));
- writeFile.flush();
- QVERIFY(readFile.getChar(&c));
- QCOMPARE(c, char(i % 256));
- QCOMPARE(readFile.pos(), writeFile.pos());
- }
-
- // Write blocks and read them back
- for (int j = 0; j < 18; ++j) {
- writeFile.write(QByteArray(1 << j, '@'));
- writeFile.flush();
- QCOMPARE(readFile.read(1 << j).size(), 1 << j);
- }
-
- readFile.close();
- QFile::remove(QLatin1String("appendfile.txt"));
-}
-
-void tst_QFile::miscWithUncPathAsCurrentDir()
-{
-#if defined(Q_OS_WIN) && !defined(Q_OS_WINCE)
- QString current = QDir::currentPath();
- QVERIFY(QDir::setCurrent("//" + QtNetworkSettings::winServerName() + "/testshare"));
- QFile file("test.pri");
- QVERIFY(file.exists());
- QCOMPARE(int(file.size()), 34);
- QVERIFY(file.open(QIODevice::ReadOnly));
- QVERIFY(QDir::setCurrent(current));
-#endif
-}
-
-void tst_QFile::standarderror()
-{
- QFile f;
- bool ok = f.open(stderr, QFile::WriteOnly);
- QVERIFY(ok);
- f.close();
-}
-
-void tst_QFile::handle()
-{
- int fd;
-#if !defined(Q_OS_WINCE) && !defined(Q_OS_SYMBIAN)
- QFile file(SRCDIR "tst_qfile.cpp");
- QVERIFY(file.open(QIODevice::ReadOnly));
- fd = int(file.handle());
- QVERIFY(fd > 2);
- QCOMPARE(int(file.handle()), fd);
- char c = '\0';
- QT_READ(int(file.handle()), &c, 1);
- QCOMPARE(c, '/');
-
- // test if the QFile and the handle remain in sync
- QVERIFY(file.getChar(&c));
- QCOMPARE(c, '*');
-
- // same, but read from QFile first now
- file.close();
- QVERIFY(file.open(QIODevice::ReadOnly | QIODevice::Unbuffered));
- fd = int(file.handle());
- QVERIFY(fd > 2);
- QVERIFY(file.getChar(&c));
- QCOMPARE(c, '/');
-#ifdef Q_OS_UNIX
- QCOMPARE(QT_READ(fd, &c, 1), ssize_t(1));
-#else
- QCOMPARE(QT_READ(fd, &c, 1), 1);
-#endif
-
- QCOMPARE(c, '*');
-#endif
-
- //test round trip of adopted stdio file handle
- QFile file2;
- FILE *fp = fopen(SRCDIR "tst_qfile.cpp", "r");
- file2.open(fp, QIODevice::ReadOnly);
- QCOMPARE(int(file2.handle()), int(fileno(fp)));
- QCOMPARE(int(file2.handle()), int(fileno(fp)));
- fclose(fp);
-
- //test round trip of adopted posix file handle
-#ifdef Q_OS_UNIX
- QFile file3;
- fd = QT_OPEN(SRCDIR "tst_qfile.cpp", QT_OPEN_RDONLY);
- file3.open(fd, QIODevice::ReadOnly);
- QCOMPARE(int(file3.handle()), fd);
- QT_CLOSE(fd);
-#endif
-}
-
-void tst_QFile::nativeHandleLeaks()
-{
-#ifdef Q_OS_SYMBIAN
- QSKIP("test assumptions invalid for symbian", SkipAll);
-#else
- int fd1, fd2;
-
-#ifdef Q_OS_WIN
- HANDLE handle1, handle2;
-#endif
-
- {
- QFile file("qt_file.tmp");
- QVERIFY( file.open(QIODevice::ReadWrite) );
-
- fd1 = file.handle();
- QVERIFY( -1 != fd1 );
- }
-
-#ifdef Q_OS_WIN
- handle1 = ::CreateFileA("qt_file.tmp", GENERIC_READ, 0, NULL,
- OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
- QVERIFY( INVALID_HANDLE_VALUE != handle1 );
- QVERIFY( ::CloseHandle(handle1) );
-#endif
-
- {
- QFile file("qt_file.tmp");
- QVERIFY( file.open(QIODevice::ReadOnly) );
-
- fd2 = file.handle();
- QVERIFY( -1 != fd2 );
- }
-
-#ifdef Q_OS_WIN
- handle2 = ::CreateFileA("qt_file.tmp", GENERIC_READ, 0, NULL,
- OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
- QVERIFY( INVALID_HANDLE_VALUE != handle2 );
- QVERIFY( ::CloseHandle(handle2) );
-#endif
-
- QCOMPARE( fd2, fd1 );
-
-#ifdef Q_OS_WIN
- QCOMPARE( handle2, handle1 );
-#endif
-#endif
-}
-
-void tst_QFile::readEof_data()
-{
- QTest::addColumn<QString>("filename");
- QTest::addColumn<int>("imode");
-
- QTest::newRow("buffered") << SRCDIR "testfile.txt" << 0;
- QTest::newRow("unbuffered") << SRCDIR "testfile.txt" << int(QIODevice::Unbuffered);
-
-#if defined(Q_OS_UNIX) && !defined(Q_OS_SYMBIAN)
- QTest::newRow("sequential,buffered") << "/dev/null" << 0;
- QTest::newRow("sequential,unbuffered") << "/dev/null" << int(QIODevice::Unbuffered);
-#endif
-}
-
-void tst_QFile::readEof()
-{
- QFETCH(QString, filename);
- QFETCH(int, imode);
- QIODevice::OpenMode mode = QIODevice::OpenMode(imode);
-
- {
- QFile file(filename);
- QVERIFY(file.open(QIODevice::ReadOnly | mode));
- bool isSequential = file.isSequential();
- if (!isSequential) {
- QVERIFY(file.seek(245));
- QVERIFY(file.atEnd());
- }
-
- char buf[10];
- int ret = file.read(buf, sizeof buf);
- QCOMPARE(ret, 0);
- QVERIFY(file.error() == QFile::NoError);
- QVERIFY(file.atEnd());
-
- // Do it again to ensure that we get the same result
- ret = file.read(buf, sizeof buf);
- QCOMPARE(ret, 0);
- QVERIFY(file.error() == QFile::NoError);
- QVERIFY(file.atEnd());
- }
-
- {
- QFile file(filename);
- QVERIFY(file.open(QIODevice::ReadOnly | mode));
- bool isSequential = file.isSequential();
- if (!isSequential) {
- QVERIFY(file.seek(245));
- QVERIFY(file.atEnd());
- }
-
- QByteArray ret = file.read(10);
- QVERIFY(ret.isEmpty());
- QVERIFY(file.error() == QFile::NoError);
- QVERIFY(file.atEnd());
-
- // Do it again to ensure that we get the same result
- ret = file.read(10);
- QVERIFY(ret.isEmpty());
- QVERIFY(file.error() == QFile::NoError);
- QVERIFY(file.atEnd());
- }
-
- {
- QFile file(filename);
- QVERIFY(file.open(QIODevice::ReadOnly | mode));
- bool isSequential = file.isSequential();
- if (!isSequential) {
- QVERIFY(file.seek(245));
- QVERIFY(file.atEnd());
- }
-
- char buf[10];
- int ret = file.readLine(buf, sizeof buf);
- QCOMPARE(ret, -1);
- QVERIFY(file.error() == QFile::NoError);
- QVERIFY(file.atEnd());
-
- // Do it again to ensure that we get the same result
- ret = file.readLine(buf, sizeof buf);
- QCOMPARE(ret, -1);
- QVERIFY(file.error() == QFile::NoError);
- QVERIFY(file.atEnd());
- }
-
- {
- QFile file(filename);
- QVERIFY(file.open(QIODevice::ReadOnly | mode));
- bool isSequential = file.isSequential();
- if (!isSequential) {
- QVERIFY(file.seek(245));
- QVERIFY(file.atEnd());
- }
-
- QByteArray ret = file.readLine();
- QVERIFY(ret.isNull());
- QVERIFY(file.error() == QFile::NoError);
- QVERIFY(file.atEnd());
-
- // Do it again to ensure that we get the same result
- ret = file.readLine();
- QVERIFY(ret.isNull());
- QVERIFY(file.error() == QFile::NoError);
- QVERIFY(file.atEnd());
- }
-
- {
- QFile file(filename);
- QVERIFY(file.open(QIODevice::ReadOnly | mode));
- bool isSequential = file.isSequential();
- if (!isSequential) {
- QVERIFY(file.seek(245));
- QVERIFY(file.atEnd());
- }
-
- char c;
- QVERIFY(!file.getChar(&c));
- QVERIFY(file.error() == QFile::NoError);
- QVERIFY(file.atEnd());
-
- // Do it again to ensure that we get the same result
- QVERIFY(!file.getChar(&c));
- QVERIFY(file.error() == QFile::NoError);
- QVERIFY(file.atEnd());
- }
-}
-
-void tst_QFile::task167217()
-{
- // Regression introduced in 4.3.0; after a failed stat, pos() could no
- // longer be calculated correctly.
- QFile::remove("tmp.txt");
- QFile file("tmp.txt");
- QVERIFY(!file.exists());
- QVERIFY(file.open(QIODevice::Append));
- QVERIFY(file.exists());
- file.write("qt430", 5);
- QVERIFY(!file.isSequential());
- QCOMPARE(file.pos(), qint64(5));
- file.remove();
-}
-
-#define FILESIZE 65536 * 3
-
-void tst_QFile::map_data()
-{
- QTest::addColumn<int>("fileSize");
- QTest::addColumn<int>("offset");
- QTest::addColumn<int>("size");
- QTest::addColumn<QFile::FileError>("error");
-
- QTest::newRow("zero") << FILESIZE << 0 << FILESIZE << QFile::NoError;
- QTest::newRow("small, but 0") << FILESIZE << 30 << FILESIZE - 30 << QFile::NoError;
- QTest::newRow("a page") << FILESIZE << 4096 << FILESIZE - 4096 << QFile::NoError;
- QTest::newRow("+page") << FILESIZE << 5000 << FILESIZE - 5000 << QFile::NoError;
- QTest::newRow("++page") << FILESIZE << 65576 << FILESIZE - 65576 << QFile::NoError;
- QTest::newRow("bad size") << FILESIZE << 0 << -1 << QFile::ResourceError;
- QTest::newRow("bad offset") << FILESIZE << -1 << 1 << QFile::UnspecifiedError;
- QTest::newRow("zerozero") << FILESIZE << 0 << 0 << QFile::UnspecifiedError;
-}
-
-void tst_QFile::map()
-{
- QFETCH(int, fileSize);
- QFETCH(int, offset);
- QFETCH(int, size);
- QFETCH(QFile::FileError, error);
-
- QString fileName = QDir::currentPath() + '/' + "qfile_map_testfile";
-
-#ifdef Q_WS_WINCE
- fileName = QFileInfo(fileName).absoluteFilePath();
-#endif
-
- if (QFile::exists(fileName)) {
- QVERIFY(QFile::setPermissions(fileName,
- QFile::WriteOwner | QFile::ReadOwner | QFile::WriteUser | QFile::ReadUser));
- QFile::remove(fileName);
- }
- QFile file(fileName);
-
- // invalid, not open
- uchar *memory = file.map(0, size);
- QVERIFY(!memory);
- QCOMPARE(file.error(), QFile::PermissionsError);
- QVERIFY(!file.unmap(memory));
- QCOMPARE(file.error(), QFile::PermissionsError);
-
- // make a file
- QVERIFY(file.open(QFile::ReadWrite));
- QVERIFY(file.resize(fileSize));
- QVERIFY(file.flush());
- file.close();
- QVERIFY(file.open(QFile::ReadWrite));
- memory = file.map(offset, size);
- if (error != QFile::NoError) {
-
- QVERIFY(file.error() != QFile::NoError);
- return;
- }
-
- QCOMPARE(file.error(), error);
- QVERIFY(memory);
- memory[0] = 'Q';
- QVERIFY(file.unmap(memory));
- QCOMPARE(file.error(), QFile::NoError);
-
- // Verify changes were saved
- memory = file.map(offset, size);
- QCOMPARE(file.error(), QFile::NoError);
- QVERIFY(memory);
- QVERIFY(memory[0] == 'Q');
- QVERIFY(file.unmap(memory));
- QCOMPARE(file.error(), QFile::NoError);
-
- // hpux wont let you map multiple times.
-#if !defined(Q_OS_HPUX) && !defined(Q_USE_DEPRECATED_MAP_API) && !defined(Q_OS_WINCE)
- // exotic test to make sure that multiple maps work
-
- // note: windows ce does not reference count mutliple maps
- // it's essentially just the same reference but it
- // cause a resource lock on the file which prevents it
- // from being removed uchar *memory1 = file.map(0, file.size());
- uchar *memory1 = file.map(0, file.size());
- QCOMPARE(file.error(), QFile::NoError);
- uchar *memory2 = file.map(0, file.size());
- QCOMPARE(file.error(), QFile::NoError);
- QVERIFY(memory1);
- QVERIFY(memory2);
- QVERIFY(file.unmap(memory1));
- QCOMPARE(file.error(), QFile::NoError);
- QVERIFY(file.unmap(memory2));
- QCOMPARE(file.error(), QFile::NoError);
- memory1 = file.map(0, file.size());
- QCOMPARE(file.error(), QFile::NoError);
- QVERIFY(memory1);
- QVERIFY(file.unmap(memory1));
- QCOMPARE(file.error(), QFile::NoError);
-#endif
-
- file.close();
-
-#if defined(Q_OS_SYMBIAN)
- if (false) // No permissions for user makes no sense in Symbian
-#elif defined(Q_OS_UNIX)
- if (::getuid() != 0)
- // root always has permissions
-#endif
- {
- // Change permissions on a file, just to confirm it would fail
- QFile::Permissions originalPermissions = file.permissions();
- QVERIFY(file.setPermissions(QFile::ReadOther));
- QVERIFY(!file.open(QFile::ReadWrite));
- memory = file.map(offset, size);
- QCOMPARE(file.error(), QFile::PermissionsError);
- QVERIFY(!memory);
- QVERIFY(file.setPermissions(originalPermissions));
- }
- QVERIFY(file.remove());
-}
-
-void tst_QFile::mapResource_data()
-{
- QTest::addColumn<int>("offset");
- QTest::addColumn<int>("size");
- QTest::addColumn<QFile::FileError>("error");
- QTest::addColumn<QString>("fileName");
-
- QString validFile = ":/tst_qfileinfo/resources/file1.ext1";
- QString invalidFile = ":/tst_qfileinfo/resources/filefoo.ext1";
-
- for (int i = 0; i < 2; ++i) {
- QString file = (i == 0) ? validFile : invalidFile;
- QTest::newRow("0, 0") << 0 << 0 << QFile::UnspecifiedError << file;
- QTest::newRow("0, BIG") << 0 << 4096 << QFile::UnspecifiedError << file;
- QTest::newRow("-1, 0") << -1 << 0 << QFile::UnspecifiedError << file;
- QTest::newRow("0, -1") << 0 << -1 << QFile::UnspecifiedError << file;
- }
-
- QTest::newRow("0, 1") << 0 << 1 << QFile::NoError << validFile;
-}
-
-void tst_QFile::mapResource()
-{
- QFETCH(QString, fileName);
- QFETCH(int, offset);
- QFETCH(int, size);
- QFETCH(QFile::FileError, error);
-
- QFile file(fileName);
- uchar *memory = file.map(offset, size);
- QCOMPARE(file.error(), error);
- QVERIFY((error == QFile::NoError) ? (memory != 0) : (memory == 0));
- if (error == QFile::NoError)
- QCOMPARE(QString(memory[0]), QString::number(offset + 1));
- QVERIFY(file.unmap(memory));
-}
-
-void tst_QFile::mapOpenMode_data()
-{
- QTest::addColumn<int>("openMode");
-
- QTest::newRow("ReadOnly") << int(QIODevice::ReadOnly);
- //QTest::newRow("WriteOnly") << int(QIODevice::WriteOnly); // this doesn't make sense
- QTest::newRow("ReadWrite") << int(QIODevice::ReadWrite);
- QTest::newRow("ReadOnly,Unbuffered") << int(QIODevice::ReadOnly | QIODevice::Unbuffered);
- QTest::newRow("ReadWrite,Unbuffered") << int(QIODevice::ReadWrite | QIODevice::Unbuffered);
-}
-
-void tst_QFile::mapOpenMode()
-{
- QFETCH(int, openMode);
- static const qint64 fileSize = 4096;
-
- QByteArray pattern(fileSize, 'A');
-
- QString fileName = QDir::currentPath() + '/' + "qfile_map_testfile";
- if (QFile::exists(fileName)) {
- QVERIFY(QFile::setPermissions(fileName,
- QFile::WriteOwner | QFile::ReadOwner | QFile::WriteUser | QFile::ReadUser));
- QFile::remove(fileName);
- }
- QFile file(fileName);
-
- // make a file
- QVERIFY(file.open(QFile::ReadWrite));
- QVERIFY(file.write(pattern));
- QVERIFY(file.flush());
- file.close();
-
- // open according to our mode
- QVERIFY(file.open(QIODevice::OpenMode(openMode)));
-
- uchar *memory = file.map(0, fileSize);
- QVERIFY(memory);
- QVERIFY(memcmp(memory, pattern, fileSize) == 0);
-
- if (openMode & QIODevice::WriteOnly) {
- // try to write to the file
- *memory = 'a';
- file.unmap(memory);
- file.close();
- file.open(QIODevice::OpenMode(openMode));
- file.seek(0);
- char c;
- QVERIFY(file.getChar(&c));
- QCOMPARE(c, 'a');
- }
-
- file.close();
-}
-
-void tst_QFile::openDirectory()
-{
- QFile f1(SRCDIR "resources");
- // it's a directory, it must exist
- QVERIFY(f1.exists());
-
- // ...but not be openable
- QVERIFY(!f1.open(QIODevice::ReadOnly));
- f1.close();
- QVERIFY(!f1.open(QIODevice::ReadOnly|QIODevice::Unbuffered));
- f1.close();
- QVERIFY(!f1.open(QIODevice::ReadWrite));
- f1.close();
- QVERIFY(!f1.open(QIODevice::WriteOnly));
- f1.close();
- QVERIFY(!f1.open(QIODevice::WriteOnly|QIODevice::Unbuffered));
- f1.close();
-}
-
-void tst_QFile::openStandardStreamsFileDescriptors()
-{
-#ifdef Q_WS_WINCE
- //allthough Windows CE (not mobile!) has functions that allow redirecting
- //the standard file descriptors to a file (see SetStdioPathW/GetStdioPathW)
- //it does not have functions to simply open them like below .
- QSKIP("Opening standard streams on Windows CE via descriptor not implemented", SkipAll);
-#endif
- // Using file descriptors
- {
- QFile in;
- in.open(STDIN_FILENO, QIODevice::ReadOnly);
- QCOMPARE( in.pos(), (qint64)0 );
- QCOMPARE( in.size(), (qint64)0 );
- QVERIFY( in.isSequential() );
- }
-
- {
- QFile out;
- out.open(STDOUT_FILENO, QIODevice::WriteOnly);
- QCOMPARE( out.pos(), (qint64)0 );
- QCOMPARE( out.size(), (qint64)0 );
- QVERIFY( out.isSequential() );
- }
-
- {
- QFile err;
- err.open(STDERR_FILENO, QIODevice::WriteOnly);
- QCOMPARE( err.pos(), (qint64)0 );
- QCOMPARE( err.size(), (qint64)0 );
- QVERIFY( err.isSequential() );
- }
-}
-
-void tst_QFile::openStandardStreamsBufferedStreams()
-{
-#if defined (Q_OS_WIN) || defined(Q_OS_SYMBIAN)
- QSKIP("Unix only test.", SkipAll);
-#endif
- // Using streams
- {
- QFile in;
- in.open(stdin, QIODevice::ReadOnly);
- QCOMPARE( in.pos(), (qint64)0 );
- QCOMPARE( in.size(), (qint64)0 );
- QVERIFY( in.isSequential() );
- }
-
- {
- QFile out;
- out.open(stdout, QIODevice::WriteOnly);
- QCOMPARE( out.pos(), (qint64)0 );
- QCOMPARE( out.size(), (qint64)0 );
- QVERIFY( out.isSequential() );
- }
-
- {
- QFile err;
- err.open(stderr, QIODevice::WriteOnly);
- QCOMPARE( err.pos(), (qint64)0 );
- QCOMPARE( err.size(), (qint64)0 );
- QVERIFY( err.isSequential() );
- }
-}
-
-void tst_QFile::openStandardStreams()
-{
- openStandardStreamsFileDescriptors();
- openStandardStreamsBufferedStreams();
-}
-
-void tst_QFile::writeNothing()
-{
- for (int i = 0; i < NumberOfFileTypes; ++i) {
- QFile file("file.txt");
- QVERIFY( openFile(file, QIODevice::WriteOnly | QIODevice::Unbuffered, FileType(i)) );
- QVERIFY( 0 == file.write((char *)0, 0) );
- QCOMPARE( file.error(), QFile::NoError );
- closeFile(file);
- }
-}
-
-void tst_QFile::resize_data()
-{
- QTest::addColumn<int>("filetype");
-
- QTest::newRow("native") << int(OpenQFile);
- QTest::newRow("fileno") << int(OpenFd);
- QTest::newRow("stream") << int(OpenStream);
-#ifdef Q_OS_SYMBIAN
- QTest::newRow("rfile") << int(OpenRFile);
-#endif
-}
-
-void tst_QFile::resize()
-{
- QFETCH(int, filetype);
- QString filename(QLatin1String("file.txt"));
- QFile file(filename);
- QVERIFY(openFile(file, QIODevice::ReadWrite, FileType(filetype)));
- QVERIFY(file.resize(8));
- QCOMPARE(file.size(), qint64(8));
- closeFile(file);
- QFile::resize(filename, 4);
- QCOMPARE(QFileInfo(filename).size(), qint64(4));
- QVERIFY(QFile::remove(filename));
-}
-
-void tst_QFile::objectConstructors()
-{
- QObject ob;
- QFile* file1 = new QFile(SRCDIR "testfile.txt", &ob);
- QFile* file2 = new QFile(&ob);
- QVERIFY(file1->exists());
- QVERIFY(!file2->exists());
-}
-
-#ifdef Q_OS_SYMBIAN
-void tst_QFile::platformSecurity_data()
-{
- QTest::addColumn<QString>("file");
- QTest::addColumn<bool>("readable");
- QTest::addColumn<bool>("writable");
-
- QString selfname = QCoreApplication::applicationFilePath();
- QString ownprivate = QCoreApplication::applicationDirPath();
- QString owndrive = selfname.left(2);
- bool amiprivileged = RProcess().HasCapability(ECapabilityAllFiles);
- QTest::newRow("resource") << owndrive + "/resource/apps/tst_qfile.rsc" << true << amiprivileged;
- QTest::newRow("sys") << selfname << amiprivileged << false;
- QTest::newRow("own private") << ownprivate + "/testfile.txt" << true << true;
- QTest::newRow("other private") << owndrive + "/private/10003a3f/import/apps/tst_qfile_reg.rsc" << amiprivileged << amiprivileged;
-}
-
-void tst_QFile::platformSecurity()
-{
- QFETCH(QString,file);
- QFETCH(bool,readable);
- QFETCH(bool,writable);
-
- {
- QFile f(file);
- QCOMPARE(f.open(QIODevice::ReadOnly), readable);
- }
-
- {
- QFile f(file);
- QCOMPARE(f.open(QIODevice::ReadOnly | QIODevice::Unbuffered), readable);
- }
-
- //append mode used to avoid truncating the files.
- {
- QFile f(file);
- QCOMPARE(f.open(QIODevice::WriteOnly | QIODevice::Append), writable);
- }
-
- {
- QFile f(file);
- QCOMPARE(f.open(QIODevice::WriteOnly | QIODevice::Append | QIODevice::Unbuffered), writable);
- }
-
- {
- QFile f(file);
- QCOMPARE(f.open(QIODevice::ReadWrite), writable);
- }
-
- {
- QFile f(file);
- QCOMPARE(f.open(QIODevice::ReadWrite | QIODevice::Unbuffered), writable);
- }
-}
-#endif
-
-void tst_QFile::caseSensitivity()
-{
-#if defined(Q_OS_SYMBIAN) || defined(Q_OS_WIN) || defined(Q_OS_MAC)
- const bool caseSensitive = false;
-#else
- const bool caseSensitive = true;
-#endif
- QByteArray testData("a little test");
- QString filename("File.txt");
- {
- QFile f(filename);
- QVERIFY(f.open(QIODevice::WriteOnly));
- QVERIFY(f.write(testData));
- f.close();
- }
- QStringList alternates;
- QFileInfo fi(filename);
- QVERIFY(fi.exists());
- alternates << "file.txt" << "File.TXT" << "fIlE.TxT" << fi.absoluteFilePath().toUpper() << fi.absoluteFilePath().toLower();
- foreach (QString alt, alternates) {
- QFileInfo fi2(alt);
- QCOMPARE(fi2.exists(), !caseSensitive);
- QCOMPARE(fi.size() == fi2.size(), !caseSensitive);
- QFile f2(alt);
- QCOMPARE(f2.open(QIODevice::ReadOnly), !caseSensitive);
- if (!caseSensitive)
- QCOMPARE(f2.readAll(), testData);
- }
-}
-
-//MSVCRT asserts when any function is called with a closed file handle.
-//This replaces the default crashing error handler with one that ignores the error (allowing EBADF to be returned)
-class AutoIgnoreInvalidParameter
-{
-public:
-#if defined(Q_OS_WIN) && defined (Q_CC_MSVC)
- static void ignore_invalid_parameter(const wchar_t*, const wchar_t*, const wchar_t*, unsigned int, uintptr_t) {}
- AutoIgnoreInvalidParameter()
- {
- oldHandler = _set_invalid_parameter_handler(ignore_invalid_parameter);
- //also disable the abort/retry/ignore popup
- oldReportMode = _CrtSetReportMode(_CRT_ASSERT, _CRTDBG_MODE_DEBUG);
- }
- ~AutoIgnoreInvalidParameter()
- {
- //restore previous settings
- _set_invalid_parameter_handler(oldHandler);
- _CrtSetReportMode(_CRT_ASSERT, oldReportMode);
- }
- _invalid_parameter_handler oldHandler;
- int oldReportMode;
-#endif
-};
-
-void tst_QFile::autocloseHandle()
-{
-#ifdef Q_OS_SYMBIAN
- // these tests are a bit different, because using a closed file handle results in a panic rather than error
- {
- QFile file("readonlyfile");
- QFile file2("readonlyfile");
- QVERIFY(openFile(file, QIODevice::ReadOnly, OpenRFile, QFile::AutoCloseHandle));
- // file is opened with mandatory lock, so opening again should fail
- QVERIFY(!file2.open(QIODevice::ReadOnly));
-
- file.close();
- // opening again should now succeed (because handle is closed)
- QVERIFY(file2.open(QIODevice::ReadOnly));
- }
-
- {
- QFile file("readonlyfile");
- QFile file2("readonlyfile");
- QVERIFY(openFile(file, QIODevice::ReadOnly, OpenRFile, QFile::DontCloseHandle));
- // file is opened with mandatory lock, so opening again should fail
- QVERIFY(!file2.open(QIODevice::ReadOnly));
-
- file.close();
- // opening again should still fail (because handle is not auto closed)
- QVERIFY(!file2.open(QIODevice::ReadOnly));
-
- rfile_.Close();
- // now it should succeed
- QVERIFY(file2.open(QIODevice::ReadOnly));
- }
-#endif
-
- {
- QFile file("readonlyfile");
- QVERIFY(openFile(file, QIODevice::ReadOnly, OpenFd, QFile::AutoCloseHandle));
- int fd = fd_;
- QCOMPARE(file.handle(), fd);
- file.close();
- fd_ = -1;
- QCOMPARE(file.handle(), -1);
- AutoIgnoreInvalidParameter a;
- Q_UNUSED(a);
- //file is closed, read should fail
- char buf;
- QCOMPARE((int)QT_READ(fd, &buf, 1), -1);
- QVERIFY(errno = EBADF);
- }
-
- {
- QFile file("readonlyfile");
- QVERIFY(openFile(file, QIODevice::ReadOnly, OpenFd, QFile::DontCloseHandle));
- QCOMPARE(file.handle(), fd_);
- file.close();
- QCOMPARE(file.handle(), -1);
- //file is not closed, read should succeed
- char buf;
- QCOMPARE((int)QT_READ(fd_, &buf, 1), 1);
- ::close(fd_);
- fd_ = -1;
- }
-
- {
- QFile file("readonlyfile");
- QVERIFY(openFile(file, QIODevice::ReadOnly, OpenStream, QFile::AutoCloseHandle));
- int fd = fileno(stream_);
- QCOMPARE(file.handle(), fd);
- file.close();
- stream_ = 0;
- QCOMPARE(file.handle(), -1);
- AutoIgnoreInvalidParameter a;
- Q_UNUSED(a);
- //file is closed, read should fail
- char buf;
- QCOMPARE((int)QT_READ(fd, &buf, 1), -1); //not using fread because the FILE* was freed by fclose
- }
-
- {
- QFile file("readonlyfile");
- QVERIFY(openFile(file, QIODevice::ReadOnly, OpenStream, QFile::DontCloseHandle));
- QCOMPARE(file.handle(), fileno(stream_));
- file.close();
- QCOMPARE(file.handle(), -1);
- //file is not closed, read should succeed
- char buf;
- QCOMPARE(int(::fread(&buf, 1, 1, stream_)), 1);
- ::fclose(stream_);
- stream_ = 0;
- }
-}
-
-QTEST_MAIN(tst_QFile)
-#include "tst_qfile.moc"