Enhance test coverage with helpers + platform-agnostic watcher tests #728
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
This PR introduces test helpers and new integration tests for watchers.
testmodule containing reusable utilities (e.g.,testdir(),channel(),TestWatcher,Receiver,expected()) to streamline writing and maintaining file-system event tests. I think it is the main point of an interestRecommendedWatcherfn poll_senderfor thePollWatcher, but it has#[cfg(test)]eitherThe tests already have found bugs: #727, #729
Remark: surprisingly, poll watcher is the most flaky due to a slow file system - the file may still appear in an immediate
readdirresult. Because of that, I had to introduce a small helper I didn’t really want to:sleep_until.PollWatchertests follow the patternwatch -- do something -- wait for fs state -- detect changes -- check, which seems reliable enough.@dfaust I think I've done it
The main point to check is test helpers in
notify/src/test.rs, I tried to make it clear and simple, but I'm not sure.The tests follow the pattern
testdir()- it is required due to macos behaviour, where theTempDirhas non-canonicalized path, but we trigger it canonicalized in eventsTestWatcher+Receiver.TestWatcher<W: Watcher>is a simple helper panicking onErrfromwatchcallsReceiveris a rx-part of thempsc::channeland used to wait new eventswait_method onReceiver:wait_ordered- wait events in the same order as its providedwait_unordered- wait events in the same order as its providedwait_..._exact- as above, but panics if encountered an unexpected oneThe main idea to compare events is
test::expectmodule. It introducesExpectedEvent- a helper, that can be used toPartialEq<Event>. It may be created in any way, likeexpected(path)matches any event with the specifiedpath,expected(path).modify()matches an event with an equalpathsandEventKind::Modify(_),expected(path).modify_content_any()matchespathandModify(Content(Any))and so onevent(path)/event([path1, path2])- fn to create expected event from something path-like (&Path,PathBuf,[&Path]etc.)ExpectedState/trait ExpectedCollectionare helpers to check a collection ofExpectedEvent.It may be ordered, may handle optional and multiple events and make well-read panic messages (The example from CI)