/*
*
* Copyright 2014 Netflix, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
package com.netflix.ribbon.transport.netty.http;
import com.google.common.collect.Lists;
import com.google.common.collect.Sets;
import com.google.mockwebserver.MockResponse;
import com.google.mockwebserver.MockWebServer;
import com.netflix.ribbon.transport.netty.RibbonTransport;
import com.netflix.loadbalancer.BaseLoadBalancer;
import com.netflix.loadbalancer.Server;
import io.netty.buffer.ByteBuf;
import io.reactivex.netty.protocol.http.client.HttpClientRequest;
import org.junit.Test;
import java.io.IOException;
import java.util.List;
import java.util.Set;
import static org.junit.Assert.assertEquals;
/**
* Created by awang on 8/4/14.
*/
public class ServerListRefreshTest {
/**
* This test ensures that when server list is refreshed in the load balancer, the set of servers
* which equals to (oldList - newList) should be removed from the map of cached RxClient. Any server
* that is not part of oldList should stay in the map.
*
* @throws IOException
*/
@Test
public void testServerListRefresh() throws IOException {
String content = "Hello world";
MockWebServer server1 = new MockWebServer();
MockWebServer server2 = new MockWebServer();
MockWebServer server3 = new MockWebServer();
MockResponse mockResponse = new MockResponse().setResponseCode(200).setHeader("Content-type", "text/plain")
.setBody(content);
server1.enqueue(mockResponse);
server2.enqueue(mockResponse);
server3.enqueue(mockResponse);
server1.play();
server2.play();
server3.play();
try {
BaseLoadBalancer lb = new BaseLoadBalancer();
List<Server> initialList = Lists.newArrayList(new Server("localhost", server1.getPort()), new Server("localhost", server2.getPort()));
lb.setServersList(initialList);
LoadBalancingHttpClient<ByteBuf, ByteBuf> client = RibbonTransport.newHttpClient(lb);
HttpClientRequest<ByteBuf> request = HttpClientRequest.createGet("/");
client.submit(request).toBlocking().last();
client.submit(request).toBlocking().last();
HttpClientRequest<ByteBuf> request2 = HttpClientRequest.createGet("http://localhost:" + server3.getPort());
client.submit(request2).toBlocking().last();
Set<Server> cachedServers = client.getRxClients().keySet();
assertEquals(Sets.newHashSet(new Server("localhost", server1.getPort()), new Server("localhost", server2.getPort()), new Server("localhost", server3.getPort())), cachedServers);
List<Server> newList = Lists.newArrayList(new Server("localhost", server1.getPort()), new Server("localhost", 99999));
lb.setServersList(newList);
cachedServers = client.getRxClients().keySet();
assertEquals(Sets.newHashSet(new Server("localhost", server1.getPort()), new Server("localhost", server3.getPort())), cachedServers);
} finally {
server1.shutdown();
server2.shutdown();
server3.shutdown();
}
}
}