summaryrefslogtreecommitdiffstats
path: root/tests/auto/corelib/io
diff options
context:
space:
mode:
authorLiang Qi <liang.qi@theqtcompany.com>2015-04-27 21:36:32 +0200
committerLiang Qi <liang.qi@theqtcompany.com>2015-04-27 21:36:32 +0200
commit1c8451bdbbd6ca909dfc5b96a24be909810522fc (patch)
tree9cc69a4794e23f7224d75fc2323fc70e294a9454 /tests/auto/corelib/io
parent7ebec0fa848de299d4cdee06ccc611ee46494fbf (diff)
parent0635b1a69dd666f5eed4b096895bd80b1a9420ff (diff)
Merge remote-tracking branch 'origin/5.5' into dev
Conflicts: src/tools/qdoc/tree.cpp tests/auto/gui/painting/qcolor/tst_qcolor.cpp Change-Id: Iaa78f601a63191fa643aabf853520f913f2f0fdc
Diffstat (limited to 'tests/auto/corelib/io')
-rw-r--r--tests/auto/corelib/io/qfilesystemwatcher/tst_qfilesystemwatcher.cpp74
-rw-r--r--tests/auto/corelib/io/qlockfile/tst_qlockfile.cpp65
-rw-r--r--tests/auto/corelib/io/qlockfile/tst_qlockfile.pro1
-rw-r--r--tests/auto/corelib/io/qresourceengine/qresourceengine.pro1
4 files changed, 134 insertions, 7 deletions
diff --git a/tests/auto/corelib/io/qfilesystemwatcher/tst_qfilesystemwatcher.cpp b/tests/auto/corelib/io/qfilesystemwatcher/tst_qfilesystemwatcher.cpp
index 458dbc532d..0ebfd2ae35 100644
--- a/tests/auto/corelib/io/qfilesystemwatcher/tst_qfilesystemwatcher.cpp
+++ b/tests/auto/corelib/io/qfilesystemwatcher/tst_qfilesystemwatcher.cpp
@@ -36,6 +36,9 @@
#include <QTemporaryDir>
#include <QFileSystemWatcher>
+#include <QElapsedTimer>
+#include <QTextStream>
+#include <QDir>
/* All tests need to run in temporary directories not used
* by the application to avoid non-deterministic failures on Windows
@@ -387,6 +390,60 @@ void tst_QFileSystemWatcher::addPaths()
QCOMPARE(watcher.addPaths(paths), QStringList());
}
+// A signal spy that records the paths and times received for better diagnostics.
+class FileSystemWatcherSpy : public QObject {
+ Q_OBJECT
+public:
+ enum Mode {
+ SpyOnDirectoryChanged,
+ SpyOnFileChanged
+ };
+
+ explicit FileSystemWatcherSpy(QFileSystemWatcher *watcher, Mode mode)
+ {
+ connect(watcher, mode == SpyOnDirectoryChanged ?
+ &QFileSystemWatcher::directoryChanged : &QFileSystemWatcher::fileChanged,
+ this, &FileSystemWatcherSpy::spySlot);
+ m_elapsedTimer.start();
+ }
+
+ int count() const { return m_entries.size(); }
+ void clear()
+ {
+ m_entries.clear();
+ m_elapsedTimer.restart();
+ }
+
+ QByteArray receivedFilesMessage() const
+ {
+ QString result;
+ QTextStream str(&result);
+ str << "At " << m_elapsedTimer.elapsed() << "ms, received "
+ << count() << " changes: ";
+ for (int i =0, e = m_entries.size(); i < e; ++i) {
+ if (i)
+ str << ", ";
+ str << m_entries.at(i).timeStamp << "ms: " << QDir::toNativeSeparators(m_entries.at(i).path);
+ }
+ return result.toLocal8Bit();
+ }
+
+private slots:
+ void spySlot(const QString &p) { m_entries.append(Entry(m_elapsedTimer.elapsed(), p)); }
+
+private:
+ struct Entry {
+ Entry() : timeStamp(0) {}
+ Entry(qint64 t, const QString &p) : timeStamp(t), path(p) {}
+
+ qint64 timeStamp;
+ QString path;
+ };
+
+ QElapsedTimer m_elapsedTimer;
+ QList<Entry> m_entries;
+};
+
void tst_QFileSystemWatcher::removePaths()
{
QFileSystemWatcher watcher;
@@ -438,9 +495,8 @@ void tst_QFileSystemWatcher::watchFileAndItsDirectory()
QVERIFY(watcher.addPath(testFileName));
QSignalSpy fileChangedSpy(&watcher, &QFileSystemWatcher::fileChanged);
- QSignalSpy dirChangedSpy(&watcher, &QFileSystemWatcher::directoryChanged);
+ FileSystemWatcherSpy dirChangedSpy(&watcher, FileSystemWatcherSpy::SpyOnDirectoryChanged);
QVERIFY(fileChangedSpy.isValid());
- QVERIFY(dirChangedSpy.isValid());
QEventLoop eventLoop;
QTimer timer;
connect(&timer, SIGNAL(timeout()), &eventLoop, SLOT(quit()));
@@ -460,7 +516,7 @@ void tst_QFileSystemWatcher::watchFileAndItsDirectory()
#endif
QTRY_VERIFY(fileChangedSpy.count() > 0);
- QCOMPARE(dirChangedSpy.count(), 0);
+ QVERIFY2(dirChangedSpy.count() == 0, dirChangedSpy.receivedFilesMessage());
fileChangedSpy.clear();
QFile secondFile(secondFileName);
@@ -640,13 +696,14 @@ private:
// emitted with the destination path instead of the starting path
void tst_QFileSystemWatcher::signalsEmittedAfterFileMoved()
{
+ const int fileCount = 10;
QTemporaryDir temporaryDirectory(m_tempDirPattern);
QVERIFY(temporaryDirectory.isValid());
QDir testDir(temporaryDirectory.path());
QVERIFY(testDir.mkdir("movehere"));
QString movePath = testDir.filePath("movehere");
- for (int i = 0; i < 10; i++) {
+ for (int i = 0; i < fileCount; ++i) {
QFile f(testDir.filePath(QString("test%1.txt").arg(i)));
QVERIFY(f.open(QIODevice::WriteOnly));
f.write(QByteArray("i am ") + QByteArray::number(i));
@@ -659,6 +716,7 @@ void tst_QFileSystemWatcher::signalsEmittedAfterFileMoved()
// add files to watcher
QFileInfoList files = testDir.entryInfoList(QDir::Files | QDir::NoSymLinks);
+ QCOMPARE(files.size(), fileCount);
foreach (const QFileInfo &finfo, files)
QVERIFY(watcher.addPath(finfo.absoluteFilePath()));
@@ -667,14 +725,16 @@ void tst_QFileSystemWatcher::signalsEmittedAfterFileMoved()
connect(&watcher, SIGNAL(fileChanged(QString)), &signalReceiver, SLOT(fileChanged(QString)));
// watch signals
- QSignalSpy changedSpy(&watcher, &QFileSystemWatcher::fileChanged);
- QVERIFY(changedSpy.isValid());
+ FileSystemWatcherSpy changedSpy(&watcher, FileSystemWatcherSpy::SpyOnFileChanged);
+ QCOMPARE(changedSpy.count(), 0);
// move files to second directory
foreach (const QFileInfo &finfo, files)
QVERIFY(testDir.rename(finfo.fileName(), QString("movehere/%2").arg(finfo.fileName())));
- QTRY_COMPARE(changedSpy.count(), 10);
+ QCoreApplication::processEvents();
+ QVERIFY2(changedSpy.count() <= fileCount, changedSpy.receivedFilesMessage());
+ QTRY_COMPARE(changedSpy.count(), fileCount);
}
#endif // QT_NO_FILESYSTEMWATCHER
diff --git a/tests/auto/corelib/io/qlockfile/tst_qlockfile.cpp b/tests/auto/corelib/io/qlockfile/tst_qlockfile.cpp
index 90f65e9dbc..bef3d3a012 100644
--- a/tests/auto/corelib/io/qlockfile/tst_qlockfile.cpp
+++ b/tests/auto/corelib/io/qlockfile/tst_qlockfile.cpp
@@ -36,8 +36,11 @@
#include <QtConcurrentRun>
#include <qlockfile.h>
#include <qtemporarydir.h>
+#include <qsysinfo.h>
#if defined(Q_OS_UNIX) && !defined(Q_OS_VXWORKS)
#include <unistd.h>
+#elif defined(Q_OS_WIN) && !defined(Q_OS_WINCE) && !defined(Q_OS_WINRT)
+# include <qt_windows.h>
#endif
class tst_QLockFile : public QObject
@@ -58,6 +61,7 @@ private slots:
void staleLongLockFromBusyProcess();
void staleLockRace();
void noPermissions();
+ void noPermissionsWindows();
public:
QString m_helperApp;
@@ -415,5 +419,66 @@ void tst_QLockFile::noPermissions()
QCOMPARE(int(lockFile.error()), int(QLockFile::PermissionError));
}
+enum ProcessProperty {
+ ElevatedProcess = 0x1,
+ VirtualStore = 0x2
+};
+
+Q_DECLARE_FLAGS(ProcessProperties, ProcessProperty)
+Q_DECLARE_OPERATORS_FOR_FLAGS(ProcessProperties)
+
+static inline ProcessProperties processProperties()
+{
+ ProcessProperties result;
+#if defined(Q_OS_WIN) && !defined(Q_OS_WINCE) && !defined(Q_OS_WINRT)
+ HANDLE processToken = NULL;
+ if (OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, &processToken)) {
+ DWORD elevation; // struct containing a DWORD, not present in some MinGW headers.
+ DWORD cbSize = sizeof(elevation);
+ if (GetTokenInformation(processToken, TokenElevation, &elevation, cbSize, &cbSize)
+ && elevation) {
+ result |= ElevatedProcess;
+ }
+ // Check for UAC virtualization (compatibility mode for old software
+ // allowing it to write to system folders by mirroring them under
+ // "\Users\...\AppData\Local\VirtualStore\", which is typically the case
+ // for MinGW).
+ DWORD virtualStoreEnabled = 0;
+ cbSize = sizeof(virtualStoreEnabled);
+ if (GetTokenInformation(processToken, TokenVirtualizationEnabled, &virtualStoreEnabled, cbSize, &cbSize)
+ && virtualStoreEnabled) {
+ result |= VirtualStore;
+ }
+ CloseHandle(processToken);
+ }
+#endif
+ return result;
+}
+
+void tst_QLockFile::noPermissionsWindows()
+{
+ // Windows: Do the permissions test in a system directory in which
+ // files cannot be created.
+#if !defined(Q_OS_WIN) || defined(Q_OS_WINCE) || defined(Q_OS_WINRT)
+ QSKIP("This test is for desktop Windows only");
+#endif
+#ifdef Q_OS_WIN
+ if (QSysInfo::windowsVersion() < QSysInfo::WV_WINDOWS7)
+ QSKIP("This test requires at least Windows 7");
+#endif
+ if (const int p = processProperties()) {
+ const QByteArray message = "This test cannot be run (properties=0x"
+ + QByteArray::number(p, 16) + ')';
+ QSKIP(message.constData());
+ }
+
+ const QString fileName = QFile::decodeName(qgetenv("ProgramFiles"))
+ + QLatin1Char('/') + QCoreApplication::applicationName()
+ + QDateTime::currentDateTime().toString(QStringLiteral("yyMMddhhmm"));
+ QLockFile lockFile(fileName);
+ QVERIFY(!lockFile.lock());
+ QCOMPARE(int(lockFile.error()), int(QLockFile::PermissionError));
+}
+
QTEST_MAIN(tst_QLockFile)
#include "tst_qlockfile.moc"
diff --git a/tests/auto/corelib/io/qlockfile/tst_qlockfile.pro b/tests/auto/corelib/io/qlockfile/tst_qlockfile.pro
index 2f7009b736..6eb72343bc 100644
--- a/tests/auto/corelib/io/qlockfile/tst_qlockfile.pro
+++ b/tests/auto/corelib/io/qlockfile/tst_qlockfile.pro
@@ -4,3 +4,4 @@ TARGET = tst_qlockfile
SOURCES += tst_qlockfile.cpp
QT = core testlib concurrent
+win32:!wince:!winrt:LIBS += -ladvapi32
diff --git a/tests/auto/corelib/io/qresourceengine/qresourceengine.pro b/tests/auto/corelib/io/qresourceengine/qresourceengine.pro
index 92d0952b89..64f5cb46e0 100644
--- a/tests/auto/corelib/io/qresourceengine/qresourceengine.pro
+++ b/tests/auto/corelib/io/qresourceengine/qresourceengine.pro
@@ -10,6 +10,7 @@ runtime_resource.depends = $$PWD/testqrc/test.qrc
runtime_resource.commands = $$QMAKE_RCC -root /runtime_resource/ -binary $${runtime_resource.depends} -o $${runtime_resource.target}
QMAKE_EXTRA_TARGETS = runtime_resource
PRE_TARGETDEPS += $${runtime_resource.target}
+QMAKE_DISTCLEAN += $${runtime_resource.target}
TESTDATA += \
parentdir.txt \