public void ProposeDistributionFor()
        {
            var systemDiagnostics = new SystemDiagnostics((p, s) => { }, null);
            var offlineInfo       = CreateOfflineInfo(new Mock <IPersistenceInformation>().Object);
            var result            = new DatasetActivationProposal
            {
                Endpoint                   = EndpointIdExtensions.CreateEndpointIdForCurrentProcess(),
                IsAvailable                = true,
                ActivationTime             = new TimeSpan(0, 1, 0),
                TransferTime               = new TimeSpan(0, 1, 0),
                PercentageOfAvailableDisk  = 50,
                PercentageOfMaximumMemory  = 50,
                PercentageOfPhysicalMemory = 50,
            };

            var localDistributor = new Mock <ICalculateDistributionParameters>();
            {
                localDistributor.Setup(l => l.ProposeForLocalMachine(It.IsAny <ExpectedDatasetLoad>()))
                .Returns(result);
            }

            var communicationLayer = new Mock <ICommunicationLayer>();
            {
                communicationLayer.Setup(s => s.LocalConnectionFor(It.Is <ChannelType>(c => c == ChannelType.NamedPipe)))
                .Returns(
                    new Tuple <EndpointId, Uri, Uri>(
                        EndpointIdExtensions.CreateEndpointIdForCurrentProcess(),
                        new Uri("net.pipe://localhost/pipe"),
                        new Uri("net.pipe://localhost/pipe/data")));
            }

            var loader          = new Mock <IDatasetActivator>();
            var commandHub      = new Mock <ISendCommandsToRemoteEndpoints>();
            var notificationHub = new Mock <INotifyOfRemoteEndpointEvents>();
            var uploads         = new Mock <IStoreUploads>();

            var distributor = new LocalDatasetDistributor(
                localDistributor.Object,
                loader.Object,
                commandHub.Object,
                notificationHub.Object,
                uploads.Object,
                (d, e, n) =>
            {
                return(new DatasetOnlineInformation(
                           d,
                           e,
                           n,
                           commandHub.Object,
                           notificationHub.Object,
                           systemDiagnostics));
            },
                communicationLayer.Object,
                systemDiagnostics,
                new CurrentThreadTaskScheduler());

            var request = new DatasetActivationRequest
            {
                DatasetToActivate      = offlineInfo,
                ExpectedLoadPerMachine = new ExpectedDatasetLoad(),
                PreferredLocations     = DistributionLocations.All,
            };
            var plans = distributor.ProposeDistributionFor(request, new CancellationToken());

            Assert.AreEqual(1, plans.Count());

            var plan = plans.First();

            Assert.IsTrue(ReferenceEquals(offlineInfo, plan.DistributionFor));
            Assert.AreEqual(new NetworkIdentifier(result.Endpoint.OriginatesOnMachine()), plan.MachineToDistributeTo);
            Assert.IsTrue(ReferenceEquals(result, plan.Proposal));
        }
        public void ImplementPlan()
        {
            var systemDiagnostics = new SystemDiagnostics((p, s) => { }, null);

            var filePath = @"c:\temp\myfile.txt";
            var storage = new Mock<IPersistenceInformation>();
            {
                storage.Setup(s => s.AsFile())
                    .Returns(new FileInfo(filePath));
            }

            var offlineInfo = CreateOfflineInfo(storage.Object);
            var plan = CreateNewDistributionPlan(new DatasetActivationProposal(), offlineInfo, systemDiagnostics);
            var localDistributor = new Mock<ICalculateDistributionParameters>();

            var datasetEndpoint = new EndpointId("OtherMachine:5678");
            var loader = new Mock<IDatasetActivator>();
            {
                loader.Setup(l => l.ActivateDataset(It.IsAny<EndpointId>(), It.IsAny<ChannelType>(), It.IsAny<Uri>()))
                    .Returns(datasetEndpoint);
            }

            var commands = new Mock<IDatasetApplicationCommands>();
            {
                commands.Setup(c => c.Load(It.IsAny<EndpointId>(), It.IsAny<UploadToken>()))
                    .Returns(
                        Task.Factory.StartNew(
                            () => { },
                            new CancellationToken(),
                            TaskCreationOptions.None,
                            new CurrentThreadTaskScheduler()));
            }

            var commandHub = new Mock<ISendCommandsToRemoteEndpoints>();
            {
                commandHub.Setup(h => h.HasCommandsFor(It.IsAny<EndpointId>()))
                    .Returns(true);
                commandHub.Setup(h => h.HasCommandFor(It.IsAny<EndpointId>(), It.IsAny<Type>()))
                    .Returns(true);
                commandHub.Setup(h => h.CommandsFor<IDatasetApplicationCommands>(It.IsAny<EndpointId>()))
                    .Callback<EndpointId>(e => Assert.AreSame(datasetEndpoint, e))
                    .Returns(commands.Object);
            }

            var notifications = new Mock<IDatasetApplicationNotifications>();
            var notificationHub = new Mock<INotifyOfRemoteEndpointEvents>();
            {
                notificationHub.Setup(n => n.HasNotificationsFor(It.IsAny<EndpointId>()))
                    .Returns(true);
                notificationHub.Setup(n => n.NotificationsFor<IDatasetApplicationNotifications>(It.IsAny<EndpointId>()))
                    .Callback<EndpointId>(e => Assert.AreSame(datasetEndpoint, e))
                    .Returns(notifications.Object);
            }

            var communicationLayer = new Mock<ICommunicationLayer>();
            {
                communicationLayer.Setup(s => s.LocalConnectionFor(It.Is<ChannelType>(c => c == ChannelType.NamedPipe)))
                    .Returns(
                        new Tuple<EndpointId, Uri, Uri>(
                            EndpointIdExtensions.CreateEndpointIdForCurrentProcess(),
                            new Uri("net.pipe://localhost/pipe"),
                            new Uri("net.pipe://localhost/pipe/data")));
            }

            var uploads = new Mock<IStoreUploads>();

            var distributor = new LocalDatasetDistributor(
                localDistributor.Object,
                loader.Object,
                commandHub.Object,
                notificationHub.Object,
                uploads.Object,
                (d, e, n) =>
                {
                    return new DatasetOnlineInformation(
                        d,
                        e,
                        n,
                        commandHub.Object,
                        notificationHub.Object,
                        systemDiagnostics);
                },
                communicationLayer.Object,
                systemDiagnostics,
                new CurrentThreadTaskScheduler());

            Action<int, string, bool> progress = (p, m, e) => { };
            var result = distributor.ImplementPlan(plan, new CancellationToken(), progress);
            result.Wait();

            Assert.AreSame(datasetEndpoint, result.Result.Endpoint);
            Assert.AreSame(plan.DistributionFor.Id, result.Result.Id);
            Assert.AreSame(plan.MachineToDistributeTo, result.Result.RunsOn);
        }
        public void ImplementPlan()
        {
            var systemDiagnostics = new SystemDiagnostics((p, s) => { }, null);

            var filePath = @"c:\temp\myfile.txt";
            var storage  = new Mock <IPersistenceInformation>();
            {
                storage.Setup(s => s.AsFile())
                .Returns(new FileInfo(filePath));
            }

            var offlineInfo      = CreateOfflineInfo(storage.Object);
            var plan             = CreateNewDistributionPlan(new DatasetActivationProposal(), offlineInfo, systemDiagnostics);
            var localDistributor = new Mock <ICalculateDistributionParameters>();

            var datasetEndpoint = new EndpointId("OtherMachine:5678");
            var loader          = new Mock <IDatasetActivator>();
            {
                loader.Setup(l => l.ActivateDataset(It.IsAny <EndpointId>(), It.IsAny <ChannelType>(), It.IsAny <Uri>()))
                .Returns(datasetEndpoint);
            }

            var commands = new Mock <IDatasetApplicationCommands>();
            {
                commands.Setup(c => c.Load(It.IsAny <EndpointId>(), It.IsAny <UploadToken>()))
                .Returns(
                    Task.Factory.StartNew(
                        () => { },
                        new CancellationToken(),
                        TaskCreationOptions.None,
                        new CurrentThreadTaskScheduler()));
            }

            var commandHub = new Mock <ISendCommandsToRemoteEndpoints>();
            {
                commandHub.Setup(h => h.HasCommandsFor(It.IsAny <EndpointId>()))
                .Returns(true);
                commandHub.Setup(h => h.HasCommandFor(It.IsAny <EndpointId>(), It.IsAny <Type>()))
                .Returns(true);
                commandHub.Setup(h => h.CommandsFor <IDatasetApplicationCommands>(It.IsAny <EndpointId>()))
                .Callback <EndpointId>(e => Assert.AreSame(datasetEndpoint, e))
                .Returns(commands.Object);
            }

            var notifications   = new Mock <IDatasetApplicationNotifications>();
            var notificationHub = new Mock <INotifyOfRemoteEndpointEvents>();
            {
                notificationHub.Setup(n => n.HasNotificationsFor(It.IsAny <EndpointId>()))
                .Returns(true);
                notificationHub.Setup(n => n.NotificationsFor <IDatasetApplicationNotifications>(It.IsAny <EndpointId>()))
                .Callback <EndpointId>(e => Assert.AreSame(datasetEndpoint, e))
                .Returns(notifications.Object);
            }

            var communicationLayer = new Mock <ICommunicationLayer>();
            {
                communicationLayer.Setup(s => s.LocalConnectionFor(It.Is <ChannelType>(c => c == ChannelType.NamedPipe)))
                .Returns(
                    new Tuple <EndpointId, Uri, Uri>(
                        EndpointIdExtensions.CreateEndpointIdForCurrentProcess(),
                        new Uri("net.pipe://localhost/pipe"),
                        new Uri("net.pipe://localhost/pipe/data")));
            }

            var uploads = new Mock <IStoreUploads>();

            var distributor = new LocalDatasetDistributor(
                localDistributor.Object,
                loader.Object,
                commandHub.Object,
                notificationHub.Object,
                uploads.Object,
                (d, e, n) =>
            {
                return(new DatasetOnlineInformation(
                           d,
                           e,
                           n,
                           commandHub.Object,
                           notificationHub.Object,
                           systemDiagnostics));
            },
                communicationLayer.Object,
                systemDiagnostics,
                new CurrentThreadTaskScheduler());

            Action <int, string, bool> progress = (p, m, e) => { };
            var result = distributor.ImplementPlan(plan, new CancellationToken(), progress);

            result.Wait();

            Assert.AreSame(datasetEndpoint, result.Result.Endpoint);
            Assert.AreSame(plan.DistributionFor.Id, result.Result.Id);
            Assert.AreSame(plan.MachineToDistributeTo, result.Result.RunsOn);
        }
        public void ProposeDistributionFor()
        {
            var systemDiagnostics = new SystemDiagnostics((p, s) => { }, null);
            var offlineInfo = CreateOfflineInfo(new Mock<IPersistenceInformation>().Object);
            var result = new DatasetActivationProposal
                {
                    Endpoint = EndpointIdExtensions.CreateEndpointIdForCurrentProcess(),
                    IsAvailable = true,
                    ActivationTime = new TimeSpan(0, 1, 0),
                    TransferTime = new TimeSpan(0, 1, 0),
                    PercentageOfAvailableDisk = 50,
                    PercentageOfMaximumMemory = 50,
                    PercentageOfPhysicalMemory = 50,
                };

            var localDistributor = new Mock<ICalculateDistributionParameters>();
            {
                localDistributor.Setup(l => l.ProposeForLocalMachine(It.IsAny<ExpectedDatasetLoad>()))
                    .Returns(result);
            }

            var communicationLayer = new Mock<ICommunicationLayer>();
            {
                communicationLayer.Setup(s => s.LocalConnectionFor(It.Is<ChannelType>(c => c == ChannelType.NamedPipe)))
                    .Returns(
                        new Tuple<EndpointId, Uri, Uri>(
                            EndpointIdExtensions.CreateEndpointIdForCurrentProcess(),
                            new Uri("net.pipe://localhost/pipe"),
                            new Uri("net.pipe://localhost/pipe/data")));
            }

            var loader = new Mock<IDatasetActivator>();
            var commandHub = new Mock<ISendCommandsToRemoteEndpoints>();
            var notificationHub = new Mock<INotifyOfRemoteEndpointEvents>();
            var uploads = new Mock<IStoreUploads>();

            var distributor = new LocalDatasetDistributor(
                localDistributor.Object,
                loader.Object,
                commandHub.Object,
                notificationHub.Object,
                uploads.Object,
                (d, e, n) =>
                {
                    return new DatasetOnlineInformation(
                        d,
                        e,
                        n,
                        commandHub.Object,
                        notificationHub.Object,
                        systemDiagnostics);
                },
                communicationLayer.Object,
                systemDiagnostics,
                new CurrentThreadTaskScheduler());

            var request = new DatasetActivationRequest
                {
                    DatasetToActivate = offlineInfo,
                    ExpectedLoadPerMachine = new ExpectedDatasetLoad(),
                    PreferredLocations = DistributionLocations.All,
                };
            var plans = distributor.ProposeDistributionFor(request, new CancellationToken());
            Assert.AreEqual(1, plans.Count());

            var plan = plans.First();
            Assert.IsTrue(ReferenceEquals(offlineInfo, plan.DistributionFor));
            Assert.AreEqual(new NetworkIdentifier(result.Endpoint.OriginatesOnMachine()), plan.MachineToDistributeTo);
            Assert.IsTrue(ReferenceEquals(result, plan.Proposal));
        }