public async Task NotificationIsReceivedWhenConflictIsDetected()
        {
            var sourceContent      = new RandomlyModifiedStream(new RandomStream(1), 0.01);
            var destinationContent = new RandomlyModifiedStream(sourceContent, 0.01);

            var sourceMetadata = new RavenJObject
            {
                { "SomeTest-metadata", "some-value" }
            };

            var destinationMetadata = new RavenJObject
            {
                { "SomeTest-metadata", "should-be-overwritten" }
            };

            await destinationClient.UploadAsync("abc.txt", destinationMetadata, destinationContent);

            await sourceClient.UploadAsync("abc.txt", sourceMetadata, sourceContent);

            var notificationTask = destinationClient.Changes().ForConflicts()
                                   .OfType <ConflictDetectedNotification>()
                                   .Timeout(TimeSpan.FromSeconds(5))
                                   .Take(1)
                                   .ToTask();

            await sourceClient.Synchronization.StartAsync("abc.txt", destinationClient);

            var conflictDetected = await notificationTask;

            Assert.Equal("abc.txt", conflictDetected.FileName);
            Assert.Equal(new Uri(sourceClient.ServerUrl).Port, new Uri(conflictDetected.SourceServerUrl).Port);
        }
Пример #2
0
        public async Task NotificationReceivedWhenFileAdded()
        {
            var notificationTask = client.Changes().ForFolder("/")
                                   .Timeout(TimeSpan.FromSeconds(2))
                                   .Take(1).ToTask();

            await client.UploadAsync("abc.txt", new MemoryStream());

            var fileChange = await notificationTask;

            Assert.Equal("/abc.txt", fileChange.File);
            Assert.Equal(FileChangeAction.Add, fileChange.Action);
        }
        public async Task NotificationsAreReceivedOnSourceWhenSynchronizationsAreStartedAndFinished()
        {
            // content update
            await source.UploadAsync("test.bin", new MemoryStream(new byte[] { 1, 2, 3 }));

            var notificationTask =
                source.Changes().ForSynchronization()
                .Where(s => s.SynchronizationDirection == SynchronizationDirection.Outgoing)
                .Timeout(TimeSpan.FromSeconds(20)).Take(2).ToArray().
                ToTask();

            var report = await source.Synchronization.StartAsync("test.bin", destination);

            Assert.Null(report.Exception);

            var synchronizationUpdates = await notificationTask;

            Assert.Equal(SynchronizationAction.Start, synchronizationUpdates[0].Action);
            Assert.Equal("test.bin", synchronizationUpdates[0].FileName);
            Assert.Equal(SynchronizationType.ContentUpdate, synchronizationUpdates[0].Type);
            Assert.Equal(SynchronizationAction.Finish, synchronizationUpdates[1].Action);
            Assert.Equal("test.bin", synchronizationUpdates[1].FileName);
            Assert.Equal(SynchronizationType.ContentUpdate, synchronizationUpdates[1].Type);

            // metadata update
            await source.UpdateMetadataAsync("test.bin", new RavenJObject { { "key", "value" } });

            notificationTask = source.Changes().ForSynchronization()
                               .Where(s => s.SynchronizationDirection == SynchronizationDirection.Outgoing)
                               .Timeout(TimeSpan.FromSeconds(20))
                               .Take(2).ToArray()
                               .ToTask();

            report = await source.Synchronization.StartAsync("test.bin", destination);

            Assert.Null(report.Exception);

            synchronizationUpdates = await notificationTask;

            Assert.Equal(SynchronizationAction.Start, synchronizationUpdates[0].Action);
            Assert.Equal("test.bin", synchronizationUpdates[0].FileName);
            Assert.Equal(SynchronizationType.MetadataUpdate, synchronizationUpdates[0].Type);
            Assert.Equal(SynchronizationAction.Finish, synchronizationUpdates[1].Action);
            Assert.Equal("test.bin", synchronizationUpdates[1].FileName);
            Assert.Equal(SynchronizationType.MetadataUpdate, synchronizationUpdates[1].Type);

            // rename update
            await source.RenameAsync("test.bin", "rename.bin");

            notificationTask = source.Changes().ForSynchronization()
                               .Where(s => s.SynchronizationDirection == SynchronizationDirection.Outgoing)
                               .Timeout(TimeSpan.FromSeconds(20))
                               .Take(2).ToArray()
                               .ToTask();

            report = await source.Synchronization.StartAsync("test.bin", destination);

            Assert.Null(report.Exception);

            synchronizationUpdates = await notificationTask;

            Assert.Equal(SynchronizationAction.Start, synchronizationUpdates[0].Action);
            Assert.Equal("test.bin", synchronizationUpdates[0].FileName);
            Assert.Equal(SynchronizationType.Rename, synchronizationUpdates[0].Type);
            Assert.Equal(SynchronizationAction.Finish, synchronizationUpdates[1].Action);
            Assert.Equal("test.bin", synchronizationUpdates[1].FileName);
            Assert.Equal(SynchronizationType.Rename, synchronizationUpdates[1].Type);

            // delete update
            await source.DeleteAsync("rename.bin");

            notificationTask = source.Changes().ForSynchronization()
                               .Where(s => s.SynchronizationDirection == SynchronizationDirection.Outgoing)
                               .Timeout(TimeSpan.FromSeconds(20))
                               .Take(2).ToArray()
                               .ToTask();

            report = await source.Synchronization.StartAsync("rename.bin", destination);

            Assert.Null(report.Exception);

            synchronizationUpdates = await notificationTask;

            Assert.Equal(SynchronizationAction.Start, synchronizationUpdates[0].Action);
            Assert.Equal("rename.bin", synchronizationUpdates[0].FileName);
            Assert.Equal(SynchronizationType.Delete, synchronizationUpdates[0].Type);
            Assert.Equal(SynchronizationAction.Finish, synchronizationUpdates[1].Action);
            Assert.Equal("rename.bin", synchronizationUpdates[1].FileName);
            Assert.Equal(SynchronizationType.Delete, synchronizationUpdates[1].Type);
        }