public void ResolveHost_RegisteredInDistributor_ShouldReturnNextHost()
        {
            var inMemoryProvider = new InMemoryRegistrationProvider(_inMemoryLoggerMock.Object, _configurationMock);
            var discovery        = new RoundRobinDistribution(inMemoryProvider, _discoveryLoggerMock.Object);
            var uid = inMemoryProvider.Register("ClientApp", "https://www.someclient.com");

            var host = discovery.ResolveHost(uid, "ClientApp");

            Assert.AreEqual("https://www.someclient.com", host);
        }
        public void ResolveHost_NoRegistration_ThrowsRpcException()
        {
            var discovery = new RoundRobinDistribution(_inMemoryProvider, _discoveryLoggerMock.Object);

            Assert.Throws <RpcException>(() => discovery.ResolveHost(
                                             new UUID()
            {
                Value = Guid.NewGuid().ToString()
            },
                                             "SomeAppName"));
        }
        public static void AddDiscoverio(this IServiceCollection serviceCollection)
        {
            var provider = serviceCollection.BuildServiceProvider();

            var registrationProviderLogger = provider.GetService <ILogger <InMemoryRegistrationProvider> >();
            var distributionLogger         = provider.GetService <ILogger <RoundRobinDistribution> >();
            var configuration = provider.GetService <IConfiguration>();

            var inMemoryRegistrationProvider = new InMemoryRegistrationProvider(registrationProviderLogger, configuration);
            var roundRobinDistribution       = new RoundRobinDistribution(inMemoryRegistrationProvider, distributionLogger);

            serviceCollection.AddSingleton <IRegistrationProvider, InMemoryRegistrationProvider>(x => inMemoryRegistrationProvider);
            serviceCollection.AddSingleton <IServiceDiscoveryLoadBalancer, RoundRobinDistribution>(x => roundRobinDistribution);
        }
        public void ResolveHost_NotRegisteredInDistributor_ThrowsRpcException()
        {
            var uid = Guid.NewGuid().ToString();
            var inMemoryProvider = new Mock <IRegistrationProvider>();

            inMemoryProvider.Setup(x => x.HasRegistration(It.IsAny <UUID>())).Returns(true);

            var discovery = new RoundRobinDistribution(inMemoryProvider.Object, _discoveryLoggerMock.Object);

            Assert.Throws <RpcException>(() => discovery.ResolveHost(
                                             new UUID()
            {
                Value = uid
            },
                                             "SomeAppName"
                                             )
                                         );
        }
        public void ResolveHost_RegistrationExpiredInDistributor_ThrowsRpcException()
        {
            var inMemorySettings = new Dictionary <string, string> {
                { "Discoverio.Server:DeRegisterCycleFrequency", "1" },
                { "Discoverio.Server:ElapsedTimeToDeRegister", "1" },
            };

            var configuration = new ConfigurationBuilder()
                                .AddInMemoryCollection(inMemorySettings)
                                .Build();

            var inMemoryProvider = new InMemoryRegistrationProvider(_inMemoryLoggerMock.Object, configuration);
            var discovery        = new RoundRobinDistribution(inMemoryProvider, _discoveryLoggerMock.Object);
            var uid = inMemoryProvider.Register("ClientApp", "https://www.someclient.com");

            var host = discovery.ResolveHost(uid, "ClientApp");

            Assert.AreEqual("https://www.someclient.com", host);

            Thread.Sleep(TimeSpan.FromSeconds(2));

            Assert.Throws <RpcException>(() => discovery.ResolveHost(uid, "SomeAppName"));
        }