public void TryUpdateEnvironmentParentAsync_should_return_true_and_set_new_parent_for_existent_environment()
        {
            const string oldParent = "root";

            CreateEnvironmentNode("environment", oldParent, GetProperties());

            var serviceDiscoveryManager = new ServiceDiscoveryManager(GetZooKeeperClient(), log: Log);

            serviceDiscoveryManager.GetEnvironmentAsync("environment")
            .GetAwaiter()
            .GetResult()
            .ParentEnvironment
            .Should()
            .BeEquivalentTo(oldParent);

            const string newParent = "newWorldRoot";

            serviceDiscoveryManager.TryUpdateEnvironmentParentAsync("environment", newParent)
            .GetAwaiter()
            .GetResult()
            .Should()
            .BeTrue();

            serviceDiscoveryManager.GetEnvironmentAsync("environment")
            .GetAwaiter()
            .GetResult()
            .ParentEnvironment
            .Should()
            .BeEquivalentTo(newParent);
        }
        public void TryUpdateEnvironmentPropertiesAsync_should_return_false_and_do_not_create_non_existent_environment()
        {
            const string environment = "environment";

            var updatedProperties = new Dictionary <string, string>()
            {
                ["updatedKey"] = "updatedValue"
            };

            IEnvironmentInfoProperties UpdatePropertiesFunc(IEnvironmentInfoProperties props)
            {
                foreach (var property in updatedProperties)
                {
                    props.Set(property.Key, property.Value);
                }
                return(props);
            }

            var serviceDiscoveryManager = new ServiceDiscoveryManager(GetZooKeeperClient(), log: Log);

            serviceDiscoveryManager.TryUpdateEnvironmentPropertiesAsync(environment, UpdatePropertiesFunc)
            .GetAwaiter()
            .GetResult()
            .Should()
            .BeFalse();

            serviceDiscoveryManager.GetEnvironmentAsync(environment)
            .GetAwaiter()
            .GetResult()
            .Should()
            .BeNull();
        }
        public void TryCreatePermanentReplicaAsync_should_return_true_and_create_new_replica_environment_and_application_if_they_do_not_exist()
        {
            var replicaInfo             = new ReplicaInfo("default", "vostok", "replica1", GetProperties());
            var serviceDiscoveryManager = new ServiceDiscoveryManager(GetZooKeeperClient(), log: Log);

            serviceDiscoveryManager.TryCreatePermanentReplicaAsync(replicaInfo)
            .GetAwaiter()
            .GetResult()
            .Should()
            .BeTrue();

            serviceDiscoveryManager
            .GetAllReplicasAsync(replicaInfo.Environment, replicaInfo.Application)
            .GetAwaiter()
            .GetResult()
            .Should()
            .BeEquivalentTo("replica1");

            serviceDiscoveryManager
            .GetEnvironmentAsync("default")
            .GetAwaiter()
            .GetResult()
            .Should()
            .NotBeNull();

            serviceDiscoveryManager
            .GetApplicationAsync("default", "vostok")
            .GetAwaiter()
            .GetResult()
            .Should()
            .NotBeNull();
        }
        public void TryUpdateEnvironmentPropertiesAsync_should_return_true_and_set_new_properties_for_existent_environment()
        {
            var initProperties = GetProperties();
            var environment    = "environment";

            CreateEnvironmentNode(environment, properties: initProperties);
            var updatedProperties = new Dictionary <string, string>()
            {
                ["updatedKey"] = "updatedValue"
            };

            IEnvironmentInfoProperties UpdatePropertiesFunc(IEnvironmentInfoProperties props)
            {
                foreach (var property in updatedProperties)
                {
                    props = props.Set(property.Key, property.Value);
                }
                return(props);
            }

            var serviceDiscoveryManager = new ServiceDiscoveryManager(GetZooKeeperClient(), log: Log);

            serviceDiscoveryManager.GetEnvironmentAsync(environment)
            .GetAwaiter()
            .GetResult()
            .Properties
            .Should()
            .BeEquivalentTo(initProperties);

            serviceDiscoveryManager.TryUpdateEnvironmentPropertiesAsync(environment, UpdatePropertiesFunc)
            .GetAwaiter()
            .GetResult()
            .Should()
            .BeTrue();

            serviceDiscoveryManager.GetEnvironmentAsync(environment)
            .GetAwaiter()
            .GetResult()
            .Properties
            .Should()
            .BeEquivalentTo(initProperties.Concat(updatedProperties));
        }
        public void GetEnvironmentAsync_should_return_not_null_if_environment_exists()
        {
            var replica = new ReplicaInfo("default", "vostok", "https://github.com/vostok");

            CreateEnvironmentNode(replica.Environment);

            var serviceDiscoveryManager = new ServiceDiscoveryManager(GetZooKeeperClient(), log: Log);

            serviceDiscoveryManager.GetEnvironmentAsync(replica.Environment)
            .GetAwaiter()
            .GetResult()
            .Should()
            .NotBeNull();
        }
        public void TryDeleteEnvironmentAsync_should_return_true_for_non_existent_environment()
        {
            var serviceDiscoveryManager = new ServiceDiscoveryManager(GetZooKeeperClient(), log: Log);

            serviceDiscoveryManager.TryDeleteEnvironmentAsync("default")
            .GetAwaiter()
            .GetResult()
            .Should()
            .BeTrue();

            serviceDiscoveryManager.GetEnvironmentAsync("default")
            .GetAwaiter()
            .GetResult()
            .Should()
            .BeNull();
        }
        public void TryDeleteEnvironmentAsync_should_return_true_and_delete_existent_environment_without_children()
        {
            CreateEnvironmentNode("default", "parent", GetProperties());
            var serviceDiscoveryManager = new ServiceDiscoveryManager(GetZooKeeperClient(), log: Log);

            serviceDiscoveryManager.TryDeleteEnvironmentAsync("default")
            .GetAwaiter()
            .GetResult()
            .Should()
            .BeTrue();

            serviceDiscoveryManager.GetEnvironmentAsync("default")
            .GetAwaiter()
            .GetResult()
            .Should()
            .BeNull();
        }
        public void TryUpdateEnvironmentParentAsync_should_return_false_if_environment_does_not_exist()
        {
            var serviceDiscoveryManager = new ServiceDiscoveryManager(GetZooKeeperClient(), log: Log);

            const string newParent = "newWorldRoot";

            serviceDiscoveryManager.TryUpdateEnvironmentParentAsync("environment", newParent)
            .GetAwaiter()
            .GetResult()
            .Should()
            .BeFalse();

            serviceDiscoveryManager.GetEnvironmentAsync("environment")
            .GetAwaiter()
            .GetResult()
            .Should()
            .BeNull();
        }
        public void TryCreateEnvironmentAsync_should_return_true_and_create_new_environment()
        {
            var serviceDiscoveryManager = new ServiceDiscoveryManager(GetZooKeeperClient(), log: Log);

            var environmentInfo = new EnvironmentInfo("default", "parent", GetProperties());

            serviceDiscoveryManager.TryCreateEnvironmentAsync(environmentInfo)
            .GetAwaiter()
            .GetResult()
            .Should()
            .BeTrue();

            serviceDiscoveryManager.GetEnvironmentAsync("default")
            .GetAwaiter()
            .GetResult()
            .Should()
            .BeEquivalentTo(environmentInfo);
        }
        public void TryCreateEnvironmentAsync_should_return_false_and_not_create_environment_if_it_exists()
        {
            CreateEnvironmentNode("default", "parent", GetProperties());
            var serviceDiscoveryManager = new ServiceDiscoveryManager(GetZooKeeperClient(), log: Log);

            var environmentInfo = new EnvironmentInfo("default", "parent", new Dictionary <string, string> {
                ["prop"] = "propValue"
            });

            serviceDiscoveryManager.TryCreateEnvironmentAsync(environmentInfo)
            .GetAwaiter()
            .GetResult()
            .Should()
            .BeFalse();

            serviceDiscoveryManager.GetEnvironmentAsync("default")
            .GetAwaiter()
            .GetResult()
            .Should()
            .BeEquivalentTo(new EnvironmentInfo("default", "parent", GetProperties()));
        }