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