diff options
author | Christian Kamm <kamm@incasoftware.de> | 2014-11-06 02:36:04 +0300 |
---|---|---|
committer | Christian Kamm <kamm@incasoftware.de> | 2014-11-20 14:36:17 +0300 |
commit | d4e0941c2732508b2d944f19115c2c76c7eb593b (patch) | |
tree | 9277dda39773485e72ee9c6a2808d6395e722bc8 /test | |
parent | 9dc57359b9e74ed6d8f74d17a72e00c73a67ce49 (diff) |
Windows filewatcher: switch to ReadDirectoryChangesW.
Based on danimo's #2454 fix for #2455 and related to #2297.
Diffstat (limited to 'test')
-rw-r--r-- | test/testfolderwatcher.h | 96 |
1 files changed, 70 insertions, 26 deletions
diff --git a/test/testfolderwatcher.h b/test/testfolderwatcher.h index 061a629ab..cc0584673 100644 --- a/test/testfolderwatcher.h +++ b/test/testfolderwatcher.h @@ -15,15 +15,23 @@ using namespace Mirall; +class FriendlyThread : public QThread +{ + friend class TestFolderWatcher; +}; + class TestFolderWatcher : public QObject { Q_OBJECT public slots: void slotFolderChanged( const QString& path ) { - qDebug() << "COMPARE: " << path << _checkMark; - QVERIFY(_checkMark == path); - _checkMark.clear(); + if (_skipNotifications.contains(path)) { + return; + } + if (_requiredNotifications.contains(path)) { + _receivedNotifications.insert(path); + } } void slotEnd() { // in case something goes wrong... @@ -36,7 +44,16 @@ private: FolderWatcher *_watcher; QEventLoop _loop; QTimer _timer; - QString _checkMark; + QSet<QString> _requiredNotifications; + QSet<QString> _receivedNotifications; + QSet<QString> _skipNotifications; + + void processAndWait() + { + _loop.processEvents(); + FriendlyThread::msleep(200); + _loop.processEvents(); + } private slots: void initTestCase() { @@ -52,68 +69,95 @@ private slots: rootDir.mkpath(_root + "/a2/b3/c3"); Utility::writeRandomFile( _root+"/a1/random.bin"); Utility::writeRandomFile( _root+"/a1/b2/todelete.bin"); - Utility::writeRandomFile( _root+"/a2/movefile"); + Utility::writeRandomFile( _root+"/a2/renamefile"); + Utility::writeRandomFile( _root+"/a1/movefile"); _watcher = new FolderWatcher(_root); QObject::connect(_watcher, SIGNAL(folderChanged(QString)), this, SLOT(slotFolderChanged(QString))); - _timer.singleShot(3000, this, SLOT(slotEnd())); + _timer.singleShot(5000, this, SLOT(slotEnd())); + } + + void init() + { + _receivedNotifications.clear(); + _requiredNotifications.clear(); + _skipNotifications.clear(); + } + + void checkNotifications() + { + processAndWait(); + QCOMPARE(_receivedNotifications, _requiredNotifications); } void testACreate() { // create a new file QString cmd; - _checkMark = _root; + _requiredNotifications.insert(_root); cmd = QString("echo \"xyz\" > %1/foo.txt").arg(_root); qDebug() << "Command: " << cmd; system(cmd.toLocal8Bit()); - _loop.processEvents(); - QVERIFY(_checkMark.isEmpty()); // the slot clears the checkmark. + checkNotifications(); } void testATouch() { // touch an existing file. + _requiredNotifications.insert(_root+"/a1"); +#ifdef Q_OS_WIN + Utility::writeRandomFile(QString("%1/a1/random.bin").arg(_root)); +#else QString cmd; cmd = QString("/usr/bin/touch %1/a1/random.bin").arg(_root); - _checkMark = _root+"/a1"; qDebug() << "Command: " << cmd; system(cmd.toLocal8Bit()); +#endif - _loop.processEvents(); - QVERIFY(_checkMark.isEmpty()); // the slot clears the checkmark. + checkNotifications(); } void testCreateADir() { - _checkMark = _root+"/a1/b1"; + _requiredNotifications.insert(_root+"/a1/b1"); + _skipNotifications.insert(_root + "/a1/b1/new_dir"); QDir dir; dir.mkdir( _root + "/a1/b1/new_dir"); QVERIFY(QFile::exists(_root + "/a1/b1/new_dir")); - _loop.processEvents(); - QVERIFY(_checkMark.isEmpty()); // the slot clears the checkmark. + + checkNotifications(); } void testRemoveADir() { - _checkMark = _root+"/a1/b3"; + _requiredNotifications.insert(_root+"/a1/b3"); QDir dir; QVERIFY(dir.rmdir(_root+"/a1/b3/c3")); - _loop.processEvents(); - QVERIFY(_checkMark.isEmpty()); // the slot clears the checkmark. + + checkNotifications(); } void testRemoveAFile() { - _checkMark = _root+"/a1/b2"; + _requiredNotifications.insert(_root+"/a1/b2"); QVERIFY(QFile::exists(_root+"/a1/b2/todelete.bin")); QFile::remove(_root+"/a1/b2/todelete.bin"); QVERIFY(!QFile::exists(_root+"/a1/b2/todelete.bin")); - _loop.processEvents(); - QVERIFY(_checkMark.isEmpty()); // the slot clears the checkmark. + + checkNotifications(); + } + + void testRenameAFile() { + _requiredNotifications.insert(_root+"/a2"); + QVERIFY(QFile::exists(_root+"/a2/renamefile")); + QFile::rename(_root+"/a2/renamefile", _root+"/a2/renamefile.renamed" ); + QVERIFY(QFile::exists(_root+"/a2/renamefile.renamed")); + + checkNotifications(); } void testMoveAFile() { - _checkMark = _root+"/a2"; - QVERIFY(QFile::exists(_root+"/a2/movefile")); - QFile::rename(_root+"/a2/movefile", _root+"/a2/movefile.renamed" ); + _requiredNotifications.insert(_root+"/a1"); + _requiredNotifications.insert(_root+"/a2"); + QVERIFY(QFile::exists(_root+"/a1/movefile")); + QFile::rename(_root+"/a1/movefile", _root+"/a2/movefile.renamed" ); QVERIFY(QFile::exists(_root+"/a2/movefile.renamed")); - _loop.processEvents(); - QVERIFY(_checkMark.isEmpty()); // the slot clears the checkmark. + + checkNotifications(); } void cleanupTestCase() { |