LBBuilderTest.java 8.0 KB
Newer Older
A
Allen Wang 已提交
1 2
package com.netflix.niws.loadbalancer;

3 4 5 6
import com.google.common.collect.Lists;
import com.netflix.appinfo.InstanceInfo;
import com.netflix.client.config.DefaultClientConfigImpl;
import com.netflix.client.config.IClientConfig;
7
import com.netflix.client.config.IClientConfigKey.Keys;
8 9 10
import com.netflix.config.ConfigurationManager;
import com.netflix.discovery.DiscoveryClient;
import com.netflix.discovery.DiscoveryManager;
A
Allen Wang 已提交
11
import com.netflix.loadbalancer.AvailabilityFilteringRule;
12 13 14 15 16
import com.netflix.loadbalancer.BaseLoadBalancer;
import com.netflix.loadbalancer.DummyPing;
import com.netflix.loadbalancer.DynamicServerListLoadBalancer;
import com.netflix.loadbalancer.ILoadBalancer;
import com.netflix.loadbalancer.IRule;
A
Allen Wang 已提交
17
import com.netflix.loadbalancer.LoadBalancerBuilder;
18
import com.netflix.loadbalancer.PollingServerListUpdater;
19 20 21 22
import com.netflix.loadbalancer.RoundRobinRule;
import com.netflix.loadbalancer.Server;
import com.netflix.loadbalancer.ServerList;
import com.netflix.loadbalancer.ServerListFilter;
23
import com.netflix.loadbalancer.ServerListUpdater;
A
Allen Wang 已提交
24 25
import com.netflix.loadbalancer.ZoneAffinityServerListFilter;
import com.netflix.loadbalancer.ZoneAwareLoadBalancer;
26 27
import org.apache.commons.configuration.Configuration;
import org.junit.Before;
28
import org.junit.Ignore;
29 30 31 32 33 34 35 36 37 38 39 40 41
import org.junit.Test;
import org.junit.runner.RunWith;
import org.powermock.api.easymock.PowerMock;
import org.powermock.core.classloader.annotations.PowerMockIgnore;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;

import java.util.List;

import static org.easymock.EasyMock.expect;
import static org.junit.Assert.*;
import static org.powermock.api.easymock.PowerMock.createMock;
import static org.powermock.api.easymock.PowerMock.replay;
A
Allen Wang 已提交
42

43 44 45
@RunWith(PowerMockRunner.class)
@PrepareForTest( {DiscoveryManager.class, DiscoveryClient.class} )
@PowerMockIgnore({"javax.management.*", "com.sun.jersey.*", "com.sun.*", "org.apache.*", "weblogic.*", "com.netflix.config.*", "com.sun.jndi.dns.*",
E
elandau 已提交
46
    "javax.naming.*", "com.netflix.logging.*", "javax.ws.*", "com.google.*"})
A
Allen Wang 已提交
47
public class LBBuilderTest {
48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
    
    static Server expected = new Server("www.example.com", 8001);
    
    static class NiwsClientConfig extends DefaultClientConfigImpl {
        public NiwsClientConfig() {
            super();
        }

        @Override
        public String getNameSpace() {
            return "niws.client";
        }
    }
    
    @Before
    public void setupMock(){
M
Mike Smith 已提交
64
        List<InstanceInfo> instances = LoadBalancerTestUtils.getDummyInstanceInfo("dummy", expected.getHost(), "127.0.0.1", expected.getPort());
65 66 67
        PowerMock.mockStatic(DiscoveryManager.class);
        PowerMock.mockStatic(DiscoveryClient.class);

M
Mike Smith 已提交
68
        DiscoveryClient mockedDiscoveryClient = LoadBalancerTestUtils.mockDiscoveryClient();
69 70 71
        DiscoveryManager mockedDiscoveryManager = createMock(DiscoveryManager.class);

        expect(DiscoveryManager.getInstance()).andReturn(mockedDiscoveryManager).anyTimes();
72
        expect(mockedDiscoveryManager.getEurekaClient()).andReturn(mockedDiscoveryClient).anyTimes();
73 74 75 76 77 78 79 80 81

        expect(mockedDiscoveryClient.getInstancesByVipAddress("dummy:7001", false, null)).andReturn(instances).anyTimes();

        replay(DiscoveryManager.class);
        replay(DiscoveryClient.class);
        replay(mockedDiscoveryManager);
        replay(mockedDiscoveryClient);
    }

A
Allen Wang 已提交
82
    @Test
83 84 85
    public void testBuildWithDiscoveryEnabledNIWSServerList() {
        IRule rule = new AvailabilityFilteringRule();
        ServerList<DiscoveryEnabledServer> list = new DiscoveryEnabledNIWSServerList("dummy:7001");
86
        ServerListFilter<DiscoveryEnabledServer> filter = new ZoneAffinityServerListFilter<>();
A
Allen Wang 已提交
87
        ZoneAwareLoadBalancer<DiscoveryEnabledServer> lb = LoadBalancerBuilder.<DiscoveryEnabledServer>newBuilder()
88 89 90
                .withDynamicServerList(list)
                .withRule(rule)
                .withServerListFilter(filter)
A
Allen Wang 已提交
91 92
                .buildDynamicServerListLoadBalancer();
        assertNotNull(lb);
93
        assertEquals(Lists.newArrayList(expected), lb.getAllServers());
94 95
        assertSame(filter, lb.getFilter());
        assertSame(list, lb.getServerListImpl());
96 97 98
        Server server = lb.chooseServer();
        // make sure load balancer does not recreate the server instance
        assertTrue(server instanceof DiscoveryEnabledServer);
A
Allen Wang 已提交
99 100
    }

101 102 103 104
    @Test
    public void testBuildWithDiscoveryEnabledNIWSServerListAndUpdater() {
        IRule rule = new AvailabilityFilteringRule();
        ServerList<DiscoveryEnabledServer> list = new DiscoveryEnabledNIWSServerList("dummy:7001");
105
        ServerListFilter<DiscoveryEnabledServer> filter = new ZoneAffinityServerListFilter<>();
106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122
        ServerListUpdater updater = new PollingServerListUpdater();
        ZoneAwareLoadBalancer<DiscoveryEnabledServer> lb = LoadBalancerBuilder.<DiscoveryEnabledServer>newBuilder()
                .withDynamicServerList(list)
                .withRule(rule)
                .withServerListFilter(filter)
                .withServerListUpdater(updater)
                .buildDynamicServerListLoadBalancerWithUpdater();
        assertNotNull(lb);
        assertEquals(Lists.newArrayList(expected), lb.getAllServers());
        assertSame(filter, lb.getFilter());
        assertSame(list, lb.getServerListImpl());
        assertSame(updater, lb.getServerListUpdater());
        Server server = lb.chooseServer();
        // make sure load balancer does not recreate the server instance
        assertTrue(server instanceof DiscoveryEnabledServer);
    }

123 124 125
    @Test
    public void testBuildWithArchaiusProperties() {
        Configuration config = ConfigurationManager.getConfigInstance();
126 127 128 129 130 131
        config.setProperty("client1.niws.client." + Keys.DeploymentContextBasedVipAddresses, "dummy:7001");
        config.setProperty("client1.niws.client." + Keys.InitializeNFLoadBalancer, "true");
        config.setProperty("client1.niws.client." + Keys.NFLoadBalancerClassName, DynamicServerListLoadBalancer.class.getName());
        config.setProperty("client1.niws.client." + Keys.NFLoadBalancerRuleClassName, RoundRobinRule.class.getName());
        config.setProperty("client1.niws.client." + Keys.NIWSServerListClassName, DiscoveryEnabledNIWSServerList.class.getName());
        config.setProperty("client1.niws.client." + Keys.NIWSServerListFilterClassName, ZoneAffinityServerListFilter.class.getName());
132
        config.setProperty("client1.niws.client." + Keys.ServerListUpdaterClassName, PollingServerListUpdater.class.getName());
133
        IClientConfig clientConfig = IClientConfig.Builder.newBuilder(NiwsClientConfig.class, "client1").build();
134 135 136 137
        ILoadBalancer lb = LoadBalancerBuilder.newBuilder().withClientConfig(clientConfig).buildLoadBalancerFromConfigWithReflection();
        assertNotNull(lb);
        assertEquals(DynamicServerListLoadBalancer.class.getName(), lb.getClass().getName());
        DynamicServerListLoadBalancer<Server> dynamicLB = (DynamicServerListLoadBalancer<Server>) lb;
138
        assertTrue(dynamicLB.getServerListUpdater() instanceof PollingServerListUpdater);
139 140 141
        assertTrue(dynamicLB.getFilter() instanceof ZoneAffinityServerListFilter);
        assertTrue(dynamicLB.getRule() instanceof RoundRobinRule);
        assertTrue(dynamicLB.getPing() instanceof DummyPing);
142
        assertEquals(Lists.newArrayList(expected), lb.getAllServers());
143 144 145 146 147 148
    }

    @Test
    public void testBuildStaticServerListLoadBalancer() {
        List<Server> list = Lists.newArrayList(expected, expected);
        IRule rule = new AvailabilityFilteringRule();
149 150
        IClientConfig clientConfig = IClientConfig.Builder.newBuilder()
                .withDefaultValues()
151 152
                .withMaxAutoRetriesNextServer(3).build();

153
        assertEquals(3, clientConfig.get(Keys.MaxAutoRetriesNextServer).intValue());
154 155 156
        BaseLoadBalancer lb = LoadBalancerBuilder.newBuilder()
                .withRule(rule)
                .buildFixedServerListLoadBalancer(list);
157
        assertEquals(list, lb.getAllServers());
158 159
        assertSame(rule, lb.getRule());
    }
A
Allen Wang 已提交
160
}