public async Task AfterUnsubscribe_StartChangingFiles_DoNothing(int initFilesCount, int renamesCount) { var searcher = new Mock <ISearcher <string, string> >(); var indexer = new Mock <IIndexer <string, string> >(); var tokenizer = new Mock <ITokenizer <string> >(); var analyzer = new FileAnalyzer(tokenizer.Object, searcher.Object, indexer.Object); using var tmp = new TempFolder(initFilesCount); var folder = tmp.FolderPath; var files = tmp.Files.ToList(); foreach (var file in files) { indexer.Setup(x => x.Remove(file)); } await Task.Run(async() => await analyzer.Subscribe(folder)); SpinWait.SpinUntil(() => !analyzer.IsIndexing); await Task.Run(async() => await analyzer.Unsubscribe(folder)); SpinWait.SpinUntil(() => !analyzer.IsIndexing); var newFiles = new List <(string oldFile, string newFile)>(); if (tmp.Files.Any()) { for (var i = 0; i < renamesCount; i++) { var newName = Path.GetRandomFileName(); var newFile = Path.Join(tmp.FolderPath, newName); var oldFile = tmp.GetRandomFile(); tmp.RenameFile(oldFile, newName); newFiles.Add((oldFile, newFile)); } } foreach (var file in files) { indexer.Verify(x => x.Remove(file), Times.Once); } foreach (var(oldFile, newFile) in newFiles) { indexer.Verify(x => x.Remove(newFile), Times.Never); indexer.Verify(x => x.Switch(oldFile, newFile), Times.Never); } }
public async Task AfterSubscribe_RenameFile_ReIndex(int initCount, int renameCount) { var searcher = new Mock <ISearcher <string, string> >(); var tokenizer = new Mock <ITokenizer <string> >(); var indexer = new Mock <IIndexer <string, string> >(); var analyzer = new FileAnalyzer(tokenizer.Object, searcher.Object, indexer.Object); using var tmp = new TempFolder(initCount); foreach (var file in tmp.Files) { indexer.Setup(x => x.Add(file, It.IsAny <IEnumerable <string> >())); } await analyzer.Subscribe(tmp.FolderPath); indexer.Verify(x => x.Add(It.IsAny <string>(), It.IsAny <IEnumerable <string> >()), Times.Exactly(initCount)); foreach (var file in tmp.Files) { indexer.Verify(x => x.Add(file, It.IsAny <IEnumerable <string> >()), Times.Once); } var renamed = new List <(string, string)>(); long renames = 0; for (var i = 0; i < renameCount; i++) { var newFile = Path.GetRandomFileName(); var newPath = PathExtensions.NormalizePath(Path.Join(tmp.FolderPath, newFile)); var oldPath = tmp.GetRandomFile(); indexer.Setup(x => x.Switch(oldPath, newPath)).Callback(() => Interlocked.Increment(ref renames)); tmp.RenameFile(oldPath, newFile); renamed.Add((oldPath, newPath)); } // Даем время сработать событиям переименования. SpinWait.SpinUntil(() => Interlocked.Read(ref renames) == renameCount); indexer.Verify(x => x.Switch(It.IsAny <string>(), It.IsAny <string>()), Times.Exactly(renameCount)); foreach (var(oldPath, newPath) in renamed) { indexer.Verify(x => x.Switch(oldPath, newPath), Times.Once); } }
public async Task OnUnsubscribe_StartChangingFiles_AddOrCancelThenRemoveIndex(int initFilesCount, int renamesCount) { var searcher = new Mock <ISearcher <string, string> >(); var indexer = new Mock <IIndexer <string, string> >(MockBehavior.Strict); var tokenizer = new Mock <ITokenizer <string> >(); var analyzer = new FileAnalyzer(tokenizer.Object, searcher.Object, indexer.Object); using var tmp = new TempFolder(initFilesCount); var folder = tmp.FolderPath; await Task.Run(async() => await analyzer.Subscribe(folder)); SpinWait.SpinUntil(() => !analyzer.IsIndexing); var unsubscribe = Task.Run(async() => await analyzer.Unsubscribe(folder)); await Task.Delay(10); var newFiles = new List <(string oldFile, string newFile)>(); if (tmp.Files.Any()) { for (var i = 0; i < renamesCount; i++) { var sequence = new MockSequence(); var newName = Path.GetRandomFileName(); var newFile = Path.Join(tmp.FolderPath, newName); var oldFile = tmp.GetRandomFile(); indexer.InSequence(sequence).Setup(x => x.Switch(oldFile, newFile)); indexer.InSequence(sequence).Setup(x => x.Remove(newFile)); tmp.RenameFile(oldFile, newName); newFiles.Add((oldFile, newFile)); } } await unsubscribe; foreach (var(oldFile, newFile) in newFiles) { indexer.Verify(x => x.Switch(oldFile, newFile), Times.AtMostOnce); indexer.Verify(x => x.Remove(newFile), Times.AtMostOnce); } }