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 TryUpdateApplicationPropertiesAsync_should_return_true_and_set_new_properties_for_existent_application()
        {
            var initProperties = GetProperties();

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

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

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

            serviceDiscoveryManager.GetApplicationAsync("environment", "vostok")
            .GetAwaiter()
            .GetResult()
            .Properties
            .Should()
            .BeEquivalentTo(initProperties);

            serviceDiscoveryManager.TryUpdateApplicationPropertiesAsync("environment", "vostok", UpdatePropertiesFunc)
            .GetAwaiter()
            .GetResult()
            .Should()
            .BeTrue();

            Action assert = () => serviceDiscoveryManager.GetApplicationAsync("environment", "vostok")
                            .GetAwaiter()
                            .GetResult()
                            .Properties
                            .Should()
                            .BeEquivalentTo(initProperties.Concat(updatedProperties));
        }
        public void GetApplicationAsync_should_return_null_if_application_does_not_exist()
        {
            CreateApplicationNode("notMyEnv", "notMyApp");

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

            serviceDiscoveryManager.GetApplicationAsync("default", "vostok")
            .GetAwaiter()
            .GetResult()
            .Should()
            .BeNull();
        }
        public void GetApplicationAsync_should_return_not_null_if_application_exists()
        {
            var replica = new ReplicaInfo("default", "vostok", "https://github.com/vostok");

            CreateApplicationNode(replica.Environment, replica.Application);

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

            serviceDiscoveryManager.GetApplicationAsync(replica.Environment, replica.Application)
            .GetAwaiter()
            .GetResult()
            .Should()
            .BeEquivalentTo(new ApplicationInfo(replica.Environment, replica.Application, null));
        }
        public void TryUpdateApplicationPropertiesAsync_should_return_false_and_do_not_create_non_existent_environment_nor_non_existent_application()
        {
            const string environment = "environment";
            const string application = "vostok";

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

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

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

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

            serviceDiscoveryManager.GetApplicationAsync(environment, application)
            .GetAwaiter()
            .GetResult()
            .Should()
            .BeNull();

            serviceDiscoveryManager.GetEnvironmentAsync(environment)
            .GetAwaiter()
            .GetResult()
            .Should()
            .BeNull();
        }