public async Task DirectoryAdded_ThenRemoved(string[] addedDirectories, string[] deletedDirectories, string[] expectedAdded, string[] expectedRemoved) { using (_taskScheduler.Pause()) { foreach (var path in addedDirectories) { DirectoryInfoStubFactory.Create(_fileSystem, path); } RaiseCreated(_directoryWatcher, addedDirectories); _taskScheduler.ScheduledTasksCount.Should().Be(1); } await Task.Delay(20); foreach (var path in deletedDirectories) { DirectoryInfoStubFactory.Delete(_fileSystem, path); } RaiseDeleted(_directoryWatcher, deletedDirectories); await _taskScheduler; _changeset.Should().NotBeNull(); _changeset.AddedDirectories.Should().Equal(expectedAdded); _changeset.RemovedDirectories.Should().Equal(expectedRemoved); }
public async Task DirectoryRemoved_ThenAdded(string[] deletedDirectories, string[] createdDirectories, string[] expectedRemoved, string[] expectedAdded) { await InjectDirectoriesIntoWatcher(_directoryWatcher, _fileSystem, deletedDirectories, _taskScheduler); const string projectDirectorySubtree = @" [a] [def] x.r y.r [z.r] [b] [abc] z.r"; using (_taskScheduler.Pause()) { RaiseDeleted(_directoryWatcher, deletedDirectories); DirectoryInfoStubFactory.FromIndentedString(_fileSystem, ProjectDirectory, projectDirectorySubtree); RaiseCreated(_directoryWatcher, createdDirectories); _taskScheduler.ScheduledTasksCount.Should().Be(1); } await _taskScheduler; _changeset.Should().NotBeNull() .And.HaveAddedDirectories(expectedAdded) .And.HaveRemovedDirectories(expectedRemoved); }
public async Task FileRemoved_DirectoryAdded(string[] deletedFiles, string[] createdDirectories, string[] expectedRemovedFiles, string[] expectedAddedDirectories, string[] expectedAddedFiles) { const string projectDirectorySubtree = @" [a] [def] x.r y.r [z.r] [b] [abc] z.r"; foreach (var path in deletedFiles) { FileInfoStubFactory.Create(_fileSystem, path); } RaiseCreated(_fileWatcher, deletedFiles); await _taskScheduler; using (_taskScheduler.Pause()) { RaiseDeleted(_fileWatcher, deletedFiles); DirectoryInfoStubFactory.FromIndentedString(_fileSystem, ProjectDirectory, projectDirectorySubtree); RaiseCreated(_directoryWatcher, createdDirectories); _taskScheduler.ScheduledTasksCount.Should().Be(1); } await _taskScheduler; _changeset.Should().NotBeNull() .And.HaveAddedFiles(expectedAddedFiles) .And.HaveAddedDirectories(expectedAddedDirectories) .And.HaveRemovedFiles(expectedRemovedFiles) .And.NoOtherChanges(); }
public async Task DirectoryAdded_SymlinkIgnored() { const string projectDirectorySubtree = @" [a] [def] x.r y.r [z.r] "; // a\ var a = (IDirectoryInfo)DirectoryInfoStubFactory.FromIndentedString(_fileSystem, ProjectDirectory, projectDirectorySubtree); // a\def\ var def = (IDirectoryInfo)a.EnumerateFileSystemInfos().Last(); // a\def\z.r\ var z_r = (IDirectoryInfo)def.EnumerateFileSystemInfos().Last(); z_r.Attributes.Returns(FileAttributes.Directory | FileAttributes.ReparsePoint); z_r.EnumerateFileSystemInfos().ThrowsForAnyArgs(new Exception()); using (_taskScheduler.Pause()) { RaiseCreated(_directoryWatcher, @"Z:\abc\a"); } await _taskScheduler; var expectedFiles = new[] { @"a\def\x.r", @"a\def\y.r" }; var expectedDirectories = new[] { @"a\", @"a\def\" }; _changeset.Should().NotBeNull() .And.HaveAddedFiles(expectedFiles) .And.HaveAddedDirectories(expectedDirectories) .And.NoOtherChanges(); }
public async Task DirectoryAdded_ThenRemoved(string[] addedDirectories, string[] deletedDirectories, string[] expectedAdded, string[] expectedRemoved) { await InjectDirectoriesIntoWatcher(_directoryWatcher, _fileSystem, deletedDirectories, _taskScheduler); using (_taskScheduler.Pause()) { foreach (var path in addedDirectories) { DirectoryInfoStubFactory.Create(_fileSystem, path); } RaiseCreated(_directoryWatcher, addedDirectories); foreach (var path in deletedDirectories) { DirectoryInfoStubFactory.Delete(_fileSystem, path); } RaiseDeleted(_directoryWatcher, deletedDirectories); _taskScheduler.ScheduledTasksCount.Should().Be(1); } await _taskScheduler; _changeset.Should().NotBeNull() .And.HaveAddedDirectories(expectedAdded) .And.HaveRemovedDirectories(expectedRemoved) .And.NoOtherChanges(); }
public async Task DirectoryAdded_DirectoryWithContent(string[] addedDirectories, string[] expectedDirectories, string[] expectedFiles) { const string projectDirectorySubtree = @" [a] [def] x.r y.r [z.r] [b] [abc] z.r [c] [ghi] w.r "; DirectoryInfoStubFactory.FromIndentedString(_fileSystem, ProjectDirectory, projectDirectorySubtree); using (_taskScheduler.Pause()) { RaiseCreated(_directoryWatcher, addedDirectories); _taskScheduler.ScheduledTasksCount.Should().Be(1); } await _taskScheduler; _changeset.Should().NotBeNull() .And.HaveAddedFiles(expectedFiles) .And.HaveAddedDirectories(expectedDirectories) .And.NoOtherChanges(); }
private static async Task InjectDirectoriesIntoWatcher(IFileSystemWatcher fileWatcher, IFileSystem fileSystem, IEnumerable <string> fullPaths, ControlledTaskScheduler taskScheduler) { var directories = fullPaths.AsList(); foreach (var path in directories) { DirectoryInfoStubFactory.Create(fileSystem, path); } RaiseCreated(fileWatcher, directories); await taskScheduler; foreach (var path in directories) { DirectoryInfoStubFactory.Delete(fileSystem, path); } }
public async Task DirectoryAdded(string[] addedDirectories, string[] expected) { using (_taskScheduler.Pause()) { foreach (var path in addedDirectories) { DirectoryInfoStubFactory.Create(_fileSystem, path); RaiseCreated(_directoryWatcher, path); } _taskScheduler.ScheduledTasksCount.Should().Be(1); } await _taskScheduler; _changeset.Should().NotBeNull() .And.HaveAddedDirectories(expected) .And.NoOtherChanges(); }
public async Task DirectoryRemoved_SomeStillExists(string[] deletedDirectories, string[] existingDirectories, string[] expected) { await InjectDirectoriesIntoWatcher(_directoryWatcher, _fileSystem, deletedDirectories, _taskScheduler); foreach (var path in existingDirectories) { DirectoryInfoStubFactory.Create(_fileSystem, path); } using (_taskScheduler.Pause()) { RaiseDeleted(_directoryWatcher, deletedDirectories); _taskScheduler.ScheduledTasksCount.Should().Be(1); } await _taskScheduler; _changeset.Should().NotBeNull() .And.HaveRemovedDirectories(expected) .And.NoOtherChanges(); }
public NoDelayNoFiltering() { _fileSystem = Substitute.For <IFileSystem>(); _fileSystem.GetFileAttributes(Arg.Any <string>()).Throws <FileNotFoundException>(); var watchers = GetWatchersFromMsBuildFileSystemWatcher(_fileSystem); var fileSystemFilter = Substitute.For <IMsBuildFileSystemFilter>(); fileSystemFilter.IsFileAllowed(Arg.Any <string>(), Arg.Any <FileAttributes>()).ReturnsForAnyArgs(true); fileSystemFilter.IsDirectoryAllowed(Arg.Any <string>(), Arg.Any <FileAttributes>()).ReturnsForAnyArgs(true); _taskScheduler = new ControlledTaskScheduler(SynchronizationContext.Current); DirectoryInfoStubFactory.Create(_fileSystem, ProjectDirectory); _fileSystemWatcher = new MsBuildFileSystemWatcher(ProjectDirectory, "*", 0, 0, _fileSystem, fileSystemFilter, _taskScheduler, NullLog.Instance); _fileSystemWatcher.Start(); _fileWatcher = watchers.FileWatcher; _directoryWatcher = watchers.DirectoryWatcher; _attributesWatcher = watchers.AttributesWatcher; }