From d2c720398f8e459f8e18188ad6183d05f494cd7d Mon Sep 17 00:00:00 2001 From: Jan Korous Date: Thu, 1 Aug 2019 23:24:30 +0000 Subject: [PATCH] [DirectoryWatcher] Relax assumption to prevent test flakiness git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@367632 91177308-0d34-0410-b5e6-96231b3b80d8 --- .../mac/DirectoryWatcher-mac.cpp | 18 ++++++++++++++++++ .../DirectoryWatcher/DirectoryWatcherTest.cpp | 2 +- 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/lib/DirectoryWatcher/mac/DirectoryWatcher-mac.cpp b/lib/DirectoryWatcher/mac/DirectoryWatcher-mac.cpp index 3df79ac48a..ae3cb61416 100644 --- a/lib/DirectoryWatcher/mac/DirectoryWatcher-mac.cpp +++ b/lib/DirectoryWatcher/mac/DirectoryWatcher-mac.cpp @@ -25,6 +25,24 @@ static void stopFSEventStream(FSEventStreamRef); namespace { +/// This implementation is based on FSEvents API which implementation is +/// aggressively coallescing events. This can manifest as duplicate events. +/// +/// For example this scenario has been observed: +/// +/// create foo/bar +/// sleep 5 s +/// create DirectoryWatcherMac for dir foo +/// receive notification: bar EventKind::Modified +/// sleep 5 s +/// modify foo/bar +/// receive notification: bar EventKind::Modified +/// receive notification: bar EventKind::Modified +/// sleep 5 s +/// delete foo/bar +/// receive notification: bar EventKind::Modified +/// receive notification: bar EventKind::Modified +/// receive notification: bar EventKind::Removed class DirectoryWatcherMac : public clang::DirectoryWatcher { public: DirectoryWatcherMac( diff --git a/unittests/DirectoryWatcher/DirectoryWatcherTest.cpp b/unittests/DirectoryWatcher/DirectoryWatcherTest.cpp index a6b48e5623..c26ba57354 100644 --- a/unittests/DirectoryWatcher/DirectoryWatcherTest.cpp +++ b/unittests/DirectoryWatcher/DirectoryWatcherTest.cpp @@ -377,7 +377,7 @@ TEST(DirectoryWatcherTest, DeleteFile) { VerifyingConsumer TestConsumer{ {{EventKind::Modified, "a"}}, {{EventKind::Removed, "a"}}, - {{EventKind::Modified, "a"}}}; + {{EventKind::Modified, "a"}, {EventKind::Removed, "a"}}}; auto DW = DirectoryWatcher::create( fixture.TestWatchedDir, -- 2.50.1