// ----------------------------------------------------------------------- // // TODO: Update copyright text. // // ----------------------------------------------------------------------- using System.Collections.Concurrent; using System.ComponentModel; using System.IO; using System.Threading; using System.Threading.Tasks; using System.Threading.Tasks.Dataflow; using NUnit.Framework; using Pithos.Core.Agents; namespace Pithos.Core.Test { using System; using System.Collections.Generic; using System.Linq; using System.Text; /// /// TODO: Update summary. /// [TestFixture] public class IdleBatchTest { [Test] public void TestEnqueue() { var queue=new ConcurrentQueue(); var batch = new IdleBatch(1000,queue.AddFromEnumerable ); batch.Post(new FileSystemEventArgs(WatcherChangeTypes.Created,"path1","file1")); batch.Post(new FileSystemEventArgs(WatcherChangeTypes.Changed, "path1", "file1")); batch.Post(new FileSystemEventArgs(WatcherChangeTypes.Changed, "path1", "file1")); batch.Post(new FileSystemEventArgs(WatcherChangeTypes.Changed, "path1", "file1")); batch.ForceTrigger(); Assert.That(queue.Count,Is.EqualTo(4)); } [Test] public void TestTimeout() { var queue=new ConcurrentQueue(); var batch = new IdleBatch(100,queue.AddFromEnumerable ); batch.Post(new FileSystemEventArgs(WatcherChangeTypes.Created,"path1","file1")); batch.Post(new FileSystemEventArgs(WatcherChangeTypes.Changed, "path1", "file1")); batch.Post(new FileSystemEventArgs(WatcherChangeTypes.Changed, "path1", "file1")); batch.Post(new FileSystemEventArgs(WatcherChangeTypes.Changed, "path1", "file1")); Thread.Sleep(500); Assert.That(queue.Count,Is.EqualTo(4)); queue.Clear(); batch.Post(new FileSystemEventArgs(WatcherChangeTypes.Changed, "path1", "file1")); batch.Post(new FileSystemEventArgs(WatcherChangeTypes.Changed, "path1", "file1")); Thread.Sleep(500); Assert.That(queue.Count,Is.EqualTo(2)); } [Test] public void TestCreationSequence() { Dictionary events = null; var batch = new FileEventIdleBatch(100, dict => events = dict); batch.Post(new FileSystemEventArgs(WatcherChangeTypes.Created,"path1","file1")); batch.Post(new FileSystemEventArgs(WatcherChangeTypes.Changed, "path1", "file1")); batch.Post(new FileSystemEventArgs(WatcherChangeTypes.Changed, "path1", "file1")); batch.Post(new FileSystemEventArgs(WatcherChangeTypes.Changed, "path1", "file1")); Thread.Sleep(500); Assert.That(events[@"path1\file1"].Select(arg => arg.ChangeType), Is.EquivalentTo(new[] { WatcherChangeTypes.Created })); } [Test] public void TestCreateDeleteSequence() { Dictionary events = null; var batch = new FileEventIdleBatch(100, dict => events = dict); batch.Post(new FileSystemEventArgs(WatcherChangeTypes.Created,"path1","file1")); batch.Post(new FileSystemEventArgs(WatcherChangeTypes.Changed, "path1", "file1")); batch.Post(new FileSystemEventArgs(WatcherChangeTypes.Changed, "path1", "file1")); batch.Post(new FileSystemEventArgs(WatcherChangeTypes.Deleted, "path1", "file1")); Thread.Sleep(500); Assert.That(events.ContainsKey("path1\\file1"), Is.False); } [Test] public void TestChangeSequence() { Dictionary events = null; var batch = new FileEventIdleBatch(100, dict => events = dict); batch.Post(new FileSystemEventArgs(WatcherChangeTypes.Changed, "path1", "file1")); batch.Post(new FileSystemEventArgs(WatcherChangeTypes.Changed, "path1", "file1")); batch.Post(new FileSystemEventArgs(WatcherChangeTypes.Changed, "path1", "file1")); Thread.Sleep(500); Assert.That(events[@"path1\file1"].Select(arg=>arg.ChangeType),Is.EquivalentTo(new[]{WatcherChangeTypes.Changed})); } [Test] public void TestEnsureEmptyAfterTrigger() { Dictionary events = null; var batch = new FileEventIdleBatch(100, dict => events = dict); batch.Post(new FileSystemEventArgs(WatcherChangeTypes.Changed, "path1", "file1")); batch.Post(new FileSystemEventArgs(WatcherChangeTypes.Changed, "path1", "file1")); batch.Post(new FileSystemEventArgs(WatcherChangeTypes.Changed, "path1", "file1")); Thread.Sleep(500); Assert.That(events[@"path1\file1"].Select(arg => arg.ChangeType), Is.EquivalentTo(new[] { WatcherChangeTypes.Changed })); events = new Dictionary(); Thread.Sleep(500); Assert.That(events, Is.Empty); } [Test] public void TestChangeDeleteSequence() { Dictionary events = null; var batch = new FileEventIdleBatch(100, dict => events = dict); batch.Post(new FileSystemEventArgs(WatcherChangeTypes.Changed, "path1", "file1")); batch.Post(new FileSystemEventArgs(WatcherChangeTypes.Changed, "path1", "file1")); batch.Post(new FileSystemEventArgs(WatcherChangeTypes.Deleted, "path1", "file1")); Thread.Sleep(500); Assert.That(events[@"path1\file1"].Select(arg => arg.ChangeType), Is.EquivalentTo(new[] { WatcherChangeTypes.Deleted })); } [Test] public void TestCreateChangeDeleteSequence() { Dictionary events = null; var batch = new FileEventIdleBatch(100, dict => events = dict); batch.Post(new FileSystemEventArgs(WatcherChangeTypes.Created, "path1", "file1")); batch.Post(new FileSystemEventArgs(WatcherChangeTypes.Changed, "path1", "file1")); batch.Post(new FileSystemEventArgs(WatcherChangeTypes.Deleted, "path1", "file1")); Thread.Sleep(500); Assert.That(events.ContainsKey("path1\\file1"), Is.False); } [Test] public void TestCreateDeleteCreateSequence() { Dictionary events = null; var batch = new FileEventIdleBatch(100, dict => events = dict); batch.Post(new FileSystemEventArgs(WatcherChangeTypes.Created, "path1", "file1")); batch.Post(new FileSystemEventArgs(WatcherChangeTypes.Changed, "path1", "file1")); batch.Post(new FileSystemEventArgs(WatcherChangeTypes.Deleted, "path1", "file1")); batch.Post(new FileSystemEventArgs(WatcherChangeTypes.Created, "path1", "file1")); batch.Post(new FileSystemEventArgs(WatcherChangeTypes.Changed, "path1", "file1")); Thread.Sleep(500); Assert.That(events[@"path1\file1"].Select(arg => arg.ChangeType), Is.EquivalentTo(new[] { WatcherChangeTypes.Created })); } public void TestCreateCreateSequence() { Dictionary events = null; var batch = new FileEventIdleBatch(100, dict => events = dict); batch.Post(new FileSystemEventArgs(WatcherChangeTypes.Created, "path1", "file1")); batch.Post(new FileSystemEventArgs(WatcherChangeTypes.Changed, "path1", "file1")); batch.Post(new FileSystemEventArgs(WatcherChangeTypes.Created, "path1", "file2")); batch.Post(new FileSystemEventArgs(WatcherChangeTypes.Changed, "path1", "file2")); Thread.Sleep(500); Assert.That(events[@"path1\file1"].Select(arg => arg.ChangeType), Is.EquivalentTo(new[] { WatcherChangeTypes.Created })); Assert.That(events[@"path1\file2"].Select(arg => arg.ChangeType), Is.EquivalentTo(new[] { WatcherChangeTypes.Created })); } [Test] public void TestCreateRenameSequence() { Dictionary events = null; var batch = new FileEventIdleBatch(100, dict => events = dict); batch.Post(new FileSystemEventArgs(WatcherChangeTypes.Created, "path1", "file1")); batch.Post(new FileSystemEventArgs(WatcherChangeTypes.Changed, "path1", "file1")); batch.Post(new MovedEventArgs("path1", "file2", "path1", "file1")); Thread.Sleep(500); Assert.That(events.ContainsKey("path1\\file1"), Is.False); var changes = events[@"path1\file2"]; Assert.That(changes.Length,Is.EqualTo(1)); var change = changes[0]; Assert.That(change.ChangeType, Is.EqualTo(WatcherChangeTypes.Created)); Assert.That(change.FullPath,Is.EqualTo("path1\\file2")); } [Test] public void TestRenameChangeSequence() { Dictionary events = null; var batch = new FileEventIdleBatch(100, dict => events = dict); batch.Post(new FileSystemEventArgs(WatcherChangeTypes.Changed, "path1", "file1")); batch.Post(new MovedEventArgs("path1", "file2","path1","file1")); batch.Post(new FileSystemEventArgs(WatcherChangeTypes.Changed, "path1", "file2")); Thread.Sleep(500); Assert.That(events.ContainsKey("path1\\file1"),Is.False); Assert.That(events["path1\\file2"].Select(arg => arg.ChangeType), Is.EquivalentTo(new[] { WatcherChangeTypes.Renamed, WatcherChangeTypes.Changed })); } [Test] public void TestCreateRenameChangeSequence() { Dictionary events = null; var batch = new FileEventIdleBatch(100, dict => events = dict); batch.Post(new FileSystemEventArgs(WatcherChangeTypes.Created, "path1", "file1")); batch.Post(new MovedEventArgs("path1", "file2", "path1", "file1")); batch.Post(new FileSystemEventArgs(WatcherChangeTypes.Changed, "path1", "file2")); Thread.Sleep(500); Assert.That(events.ContainsKey("path1\\file1"), Is.False); var changes = events["path1\\file2"]; Assert.That(changes.Length, Is.EqualTo(1)); var change = changes[0]; Assert.That(change.ChangeType, Is.EqualTo(WatcherChangeTypes.Created)); Assert.That(change.FullPath, Is.EqualTo(@"path1\file2")); } [Test] public void TestCreateRenameChangeDeleteSequence() { Dictionary events = null; var batch = new FileEventIdleBatch(100, dict => events = dict); batch.Post(new FileSystemEventArgs(WatcherChangeTypes.Created, "path1", "file1")); batch.Post(new MovedEventArgs("path1", "file2", "path1", "file1")); batch.Post(new FileSystemEventArgs(WatcherChangeTypes.Changed, "path1", "file2")); batch.Post(new FileSystemEventArgs(WatcherChangeTypes.Deleted, "path1", "file2")); Thread.Sleep(500); Assert.That(events.ContainsKey("path1\\file1"), Is.False); Assert.That(events.ContainsKey("path1\\file2"), Is.False); } [Test] public void TestCreateRenameOtherSequence() { Dictionary events = null; var batch = new FileEventIdleBatch(100,dict=>events=dict); batch.Post(new FileSystemEventArgs(WatcherChangeTypes.Created, "path1", "file1")); batch.Post(new FileSystemEventArgs(WatcherChangeTypes.Changed, "path1", "file1")); batch.Post(new MovedEventArgs("path1", "file3", "path1", "file2")); Thread.Sleep(500); Assert.That(events.ContainsKey("path1\\file1"),Is.True); Assert.That(events.ContainsKey("path1\\file2"), Is.False); Assert.That(events[@"path1\file3"].Select(arg => arg.ChangeType), Is.EquivalentTo(new[] { WatcherChangeTypes.Renamed })); } } }