public async Task ForCorrectServiceName_UsingBalanceLoadValidateServiceName_ReturnResponse()
        {
            var balancerClient = new LoadBalancer.LoadBalancerClient(_channel);
            var initialRequest = new InitialLoadBalanceRequest()
            {
                Name = "test-service-name"
            };
            var request = new LoadBalanceRequest()
            {
                InitialRequest = initialRequest
            };

            // Act
            using var balancingStreaming = balancerClient.BalanceLoad();
            await balancingStreaming.RequestStream.WriteAsync(request);

            await balancingStreaming.RequestStream.CompleteAsync();

            var hasFirstElement = await balancingStreaming.ResponseStream.MoveNext();

            var hasSecondElement = await balancingStreaming.ResponseStream.MoveNext();

            // Assert
            Assert.True(hasFirstElement);
            Assert.True(hasSecondElement);
        }
        public async Task ForInitialRequest_UsingBalanceLoadCheckReportInterval_ReturnFiveSeconds()
        {
            var balancerClient = new LoadBalancer.LoadBalancerClient(_channel);
            var initialRequest = new InitialLoadBalanceRequest()
            {
                Name = "test-service-name"
            };
            var request = new LoadBalanceRequest()
            {
                InitialRequest = initialRequest
            };

            // Act
            using var balancingStreaming = balancerClient.BalanceLoad();
            await balancingStreaming.RequestStream.WriteAsync(request);

            await balancingStreaming.RequestStream.CompleteAsync();

            var hasFirstElement = await balancingStreaming.ResponseStream.MoveNext();

            var response         = balancingStreaming.ResponseStream.Current;
            var hasSecondElement = await balancingStreaming.ResponseStream.MoveNext();

            // Assert
            Assert.True(hasFirstElement);
            Assert.True(hasSecondElement);
            Assert.Equal(LoadBalanceResponse.LoadBalanceResponseTypeOneofCase.InitialResponse, response.LoadBalanceResponseTypeCase);
            Assert.NotNull(response.InitialResponse);
            Assert.Equal(TimeSpan.FromSeconds(5), response.InitialResponse.ClientStatsReportInterval.ToTimeSpan());
        }
        public async Task ForWrongServiceName_UsingBalanceLoadValidateServiceName_ThrowException()
        {
            var balancerClient = new LoadBalancer.LoadBalancerClient(_channel);
            var initialRequest = new InitialLoadBalanceRequest()
            {
                Name = "wrong-service-name"
            };
            var request = new LoadBalanceRequest()
            {
                InitialRequest = initialRequest
            };

            // Act
            // Assert
            using var balancingStreaming = balancerClient.BalanceLoad();
            await balancingStreaming.RequestStream.WriteAsync(request);

            await balancingStreaming.RequestStream.CompleteAsync();

            var exception = await Assert.ThrowsAsync <RpcException>(async() =>
            {
                var _ = await balancingStreaming.ResponseStream.MoveNext();
            });

            Assert.Equal(StatusCode.Unknown, exception.StatusCode);
        }
        public async Task ForInitialRequest_UsingBalanceLoad_EnsureResponseMessages()
        {
            // Arrange
            var balancerClient = new LoadBalancer.LoadBalancerClient(_channel);
            var initialRequest = new InitialLoadBalanceRequest()
            {
                Name = "test-service-name"
            };
            var request = new LoadBalanceRequest()
            {
                InitialRequest = initialRequest
            };

            // Act
            using var balancingStreaming = balancerClient.BalanceLoad();
            await balancingStreaming.RequestStream.WriteAsync(request);

            await balancingStreaming.RequestStream.CompleteAsync();

            var hasNextElement = await balancingStreaming.ResponseStream.MoveNext();

            Assert.True(hasNextElement);
            var initialResponse = balancingStreaming.ResponseStream.Current;

            hasNextElement = await balancingStreaming.ResponseStream.MoveNext();

            Assert.True(hasNextElement);
            var secondResponse = balancingStreaming.ResponseStream.Current;

            // Assert
            Assert.Equal(LoadBalanceResponseTypeOneofCase.InitialResponse, initialResponse.LoadBalanceResponseTypeCase);
            Assert.NotNull(initialResponse.InitialResponse);
            Assert.Equal(TimeSpan.FromSeconds(10), initialResponse.InitialResponse.ClientStatsReportInterval.ToTimeSpan());
            Assert.Equal(LoadBalanceResponseTypeOneofCase.ServerList, secondResponse.LoadBalanceResponseTypeCase);
            Assert.NotNull(secondResponse.ServerList);
            Assert.Equal(3, secondResponse.ServerList.Servers.Count);
            Assert.All(secondResponse.ServerList.Servers, server =>
            {
                Assert.StartsWith("10.1.6.", new IPAddress(server.IpAddress.ToByteArray()).ToString());
                Assert.Equal(80, server.Port);
                Assert.False(string.IsNullOrWhiteSpace(server.LoadBalanceToken));
            });
        }