• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright 2018 The gRPC Authors
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *     http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package io.grpc;
18 
19 import static com.google.common.truth.Truth.assertThat;
20 import static org.junit.Assert.fail;
21 
22 import io.grpc.grpclb.GrpclbLoadBalancerProvider;
23 import io.grpc.internal.PickFirstLoadBalancerProvider;
24 import java.util.List;
25 import org.junit.Test;
26 import org.junit.runner.RunWith;
27 import org.junit.runners.JUnit4;
28 
29 /** Unit tests for {@link LoadBalancerRegistry}. */
30 @RunWith(JUnit4.class)
31 public class LoadBalancerRegistryTest {
32   @Test
getClassesViaHardcoded_classesPresent()33   public void getClassesViaHardcoded_classesPresent() throws Exception {
34     List<Class<?>> classes = LoadBalancerRegistry.getHardCodedClasses();
35     assertThat(classes).hasSize(2);
36     assertThat(classes.get(0)).isEqualTo(PickFirstLoadBalancerProvider.class);
37     assertThat(classes.get(1).getName()).isEqualTo(
38         "io.grpc.util.SecretRoundRobinLoadBalancerProvider$Provider");
39   }
40 
41   @Test
stockProviders()42   public void stockProviders() {
43     LoadBalancerRegistry defaultRegistry = LoadBalancerRegistry.getDefaultRegistry();
44     assertThat(defaultRegistry.providers()).hasSize(4);
45 
46     LoadBalancerProvider pickFirst = defaultRegistry.getProvider("pick_first");
47     assertThat(pickFirst).isInstanceOf(PickFirstLoadBalancerProvider.class);
48     assertThat(pickFirst.getPriority()).isEqualTo(5);
49 
50     LoadBalancerProvider roundRobin = defaultRegistry.getProvider("round_robin");
51     assertThat(roundRobin.getClass().getName()).isEqualTo(
52         "io.grpc.util.SecretRoundRobinLoadBalancerProvider$Provider");
53     assertThat(roundRobin.getPriority()).isEqualTo(5);
54 
55     LoadBalancerProvider outlierDetection = defaultRegistry.getProvider(
56         "outlier_detection_experimental");
57     assertThat(outlierDetection.getClass().getName()).isEqualTo(
58         "io.grpc.util.OutlierDetectionLoadBalancerProvider");
59     assertThat(roundRobin.getPriority()).isEqualTo(5);
60 
61     LoadBalancerProvider grpclb = defaultRegistry.getProvider("grpclb");
62     assertThat(grpclb).isInstanceOf(GrpclbLoadBalancerProvider.class);
63     assertThat(grpclb.getPriority()).isEqualTo(5);
64   }
65 
66   @Test
unavilableProviderThrows()67   public void unavilableProviderThrows() {
68     LoadBalancerRegistry reg = new LoadBalancerRegistry();
69     try {
70       reg.register(new FakeProvider("great", 5, false));
71       fail("Should throw");
72     } catch (IllegalArgumentException e) {
73       assertThat(e.getMessage()).contains("isAvailable() returned false");
74     }
75     assertThat(reg.getProvider("great")).isNull();
76   }
77 
78   @Test
registerAndDeregister()79   public void registerAndDeregister() {
80     LoadBalancerProvider[] providers = new LoadBalancerProvider[] {
81       new FakeProvider("cool", 5, true),
82       new FakeProvider("cool", 6, true),
83       new FakeProvider("great", 5, true),
84       new FakeProvider("great", 4, true),
85       new FakeProvider("excellent", 5, true),
86       new FakeProvider("excellent", 5, true)};
87     LoadBalancerRegistry reg = new LoadBalancerRegistry();
88     for (LoadBalancerProvider provider : providers) {
89       reg.register(provider);
90     }
91 
92     assertThat(reg.providers()).hasSize(3);
93     assertThat(reg.getProvider("cool")).isSameInstanceAs(providers[1]);
94     assertThat(reg.getProvider("great")).isSameInstanceAs(providers[2]);
95     assertThat(reg.getProvider("excellent")).isSameInstanceAs(providers[4]);
96 
97     reg.deregister(providers[1]);
98     assertThat(reg.getProvider("cool")).isSameInstanceAs(providers[0]);
99     reg.deregister(providers[2]);
100     assertThat(reg.getProvider("great")).isSameInstanceAs(providers[3]);
101     reg.deregister(providers[4]);
102     assertThat(reg.getProvider("excellent")).isSameInstanceAs(providers[5]);
103   }
104 
105   private static class FakeProvider extends LoadBalancerProvider {
106     final String policy;
107     final int priority;
108     final boolean isAvailable;
109 
FakeProvider(String policy, int priority, boolean isAvailable)110     FakeProvider(String policy, int priority, boolean isAvailable) {
111       this.policy = policy;
112       this.priority = priority;
113       this.isAvailable = isAvailable;
114     }
115 
116     @Override
isAvailable()117     public boolean isAvailable() {
118       return isAvailable;
119     }
120 
121     @Override
getPriority()122     public int getPriority() {
123       return priority;
124     }
125 
126     @Override
getPolicyName()127     public String getPolicyName() {
128       return policy;
129     }
130 
131     @Override
newLoadBalancer(LoadBalancer.Helper helper)132     public LoadBalancer newLoadBalancer(LoadBalancer.Helper helper) {
133       throw new AssertionError("Should not be called in test");
134     }
135   }
136 }
137