コード例 #1
0
        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);
            }
        }
コード例 #2
0
        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);
            }
        }
コード例 #3
0
        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);
            }
        }