public async Task TestProcessRemoveTimeLimit()
        {
            bool calledActual = false;

            ClusterConfig config = new ClusterConfig()
            {
                MaxClusterUptime = TimeSpan.FromHours(2)
            };

            MockReliableStateManager stateManager    = new MockReliableStateManager();
            MockClusterOperator      clusterOperator = new MockClusterOperator()
            {
                DeleteClusterAsyncFunc = name =>
                {
                    calledActual = true;
                    return(Task.FromResult(true));
                }
            };

            ClusterService target = new ClusterService(clusterOperator, stateManager)
            {
                Config = config
            };

            Cluster cluster = new Cluster()
            {
                Status    = ClusterStatus.Ready,
                CreatedOn = DateTimeOffset.UtcNow - config.MaxClusterUptime
            };

            await target.ProcessClusterStatusAsync(cluster);

            Assert.IsTrue(calledActual);
            Assert.AreEqual(ClusterStatus.Deleting, cluster.Status);
        }
        public async Task TestProcessRemove()
        {
            bool   calledActual = false;
            string nameActual   = null;

            MockReliableStateManager stateManager    = new MockReliableStateManager();
            MockClusterOperator      clusterOperator = new MockClusterOperator()
            {
                DeleteClusterAsyncFunc = name =>
                {
                    nameActual   = name;
                    calledActual = true;
                    return(Task.FromResult(true));
                }
            };

            ClusterService target = new ClusterService(clusterOperator, stateManager);

            Cluster cluster = new Cluster()
            {
                Status = ClusterStatus.Remove
            };

            await target.ProcessClusterStatusAsync(cluster);

            Assert.IsTrue(calledActual);
            Assert.AreEqual(ClusterStatus.Deleting, cluster.Status);
        }
        public async Task TestProcessNewCluster()
        {
            bool   calledActual = false;
            string nameTemplate = "Test:{0}";
            string nameActual   = null;

            MockReliableStateManager stateManager    = new MockReliableStateManager();
            MockClusterOperator      clusterOperator = new MockClusterOperator()
            {
                CreateClusterAsyncFunc = name =>
                {
                    nameActual   = name;
                    calledActual = true;
                    return(Task.FromResult(String.Format(nameTemplate, name)));
                }
            };

            ClusterService target = new ClusterService(clusterOperator, stateManager);

            Cluster cluster = new Cluster()
            {
                Status = ClusterStatus.New
            };

            await target.ProcessClusterStatusAsync(cluster);

            Assert.IsTrue(calledActual);
            Assert.AreEqual(ClusterStatus.Creating, cluster.Status);
            Assert.AreEqual(String.Format(nameTemplate, nameActual), cluster.Address);
        }
        public async Task TestProcessDeletingSuccessful()
        {
            MockReliableStateManager stateManager    = new MockReliableStateManager();
            MockClusterOperator      clusterOperator = new MockClusterOperator()
            {
                GetClusterStatusAsyncFunc = domain => Task.FromResult(ClusterOperationStatus.ClusterNotFound)
            };

            ClusterService target = new ClusterService(clusterOperator, stateManager);

            Cluster cluster = new Cluster()
            {
                Status = ClusterStatus.Deleting
            };

            await target.ProcessClusterStatusAsync(cluster);

            Assert.AreEqual(ClusterStatus.Deleted, cluster.Status);
        }
        public async Task TestProcessCreatingClusterFailed()
        {
            MockReliableStateManager stateManager    = new MockReliableStateManager();
            MockClusterOperator      clusterOperator = new MockClusterOperator()
            {
                GetClusterStatusAsyncFunc = name => Task.FromResult(ClusterOperationStatus.CreateFailed)
            };

            ClusterService target  = new ClusterService(clusterOperator, stateManager);
            Cluster        cluster = new Cluster()
            {
                Status = ClusterStatus.Creating
            };

            await target.ProcessClusterStatusAsync(cluster);

            Assert.AreEqual(ClusterStatus.New, cluster.Status);
            Assert.AreEqual(0, cluster.Ports.Count());
            Assert.AreEqual(0, cluster.Users.Count());
        }
        public async Task TestProcessCreatingClusterSuccess()
        {
            MockReliableStateManager stateManager    = new MockReliableStateManager();
            MockClusterOperator      clusterOperator = new MockClusterOperator()
            {
                GetClusterStatusAsyncFunc = name => Task.FromResult(ClusterOperationStatus.Ready)
            };

            ClusterService target  = new ClusterService(clusterOperator, stateManager);
            Cluster        cluster = new Cluster()
            {
                Status = ClusterStatus.Creating
            };

            await target.ProcessClusterStatusAsync(cluster);

            Assert.AreEqual(ClusterStatus.Ready, cluster.Status);
            Assert.IsTrue(cluster.CreatedOn.ToUniversalTime() <= DateTimeOffset.UtcNow);
            cluster.Ports.SequenceEqual(await clusterOperator.GetClusterPortsAsync(""));
        }