| /* |
| * Copyright 2018 The gRPC Authors |
| * |
| * 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 io.grpc; |
| |
| import static com.google.common.truth.Truth.assertThat; |
| import static org.junit.Assert.fail; |
| |
| import io.grpc.grpclb.GrpclbLoadBalancerProvider; |
| import io.grpc.internal.PickFirstLoadBalancerProvider; |
| import java.util.List; |
| import org.junit.Test; |
| import org.junit.runner.RunWith; |
| import org.junit.runners.JUnit4; |
| |
| /** Unit tests for {@link LoadBalancerRegistry}. */ |
| @RunWith(JUnit4.class) |
| public class LoadBalancerRegistryTest { |
| @Test |
| public void getClassesViaHardcoded_classesPresent() throws Exception { |
| List<Class<?>> classes = LoadBalancerRegistry.getHardCodedClasses(); |
| assertThat(classes).hasSize(2); |
| assertThat(classes.get(0)).isEqualTo(PickFirstLoadBalancerProvider.class); |
| assertThat(classes.get(1).getName()).isEqualTo( |
| "io.grpc.util.SecretRoundRobinLoadBalancerProvider$Provider"); |
| } |
| |
| @Test |
| public void stockProviders() { |
| LoadBalancerRegistry defaultRegistry = LoadBalancerRegistry.getDefaultRegistry(); |
| assertThat(defaultRegistry.providers()).hasSize(4); |
| |
| LoadBalancerProvider pickFirst = defaultRegistry.getProvider("pick_first"); |
| assertThat(pickFirst).isInstanceOf(PickFirstLoadBalancerProvider.class); |
| assertThat(pickFirst.getPriority()).isEqualTo(5); |
| |
| LoadBalancerProvider roundRobin = defaultRegistry.getProvider("round_robin"); |
| assertThat(roundRobin.getClass().getName()).isEqualTo( |
| "io.grpc.util.SecretRoundRobinLoadBalancerProvider$Provider"); |
| assertThat(roundRobin.getPriority()).isEqualTo(5); |
| |
| LoadBalancerProvider outlierDetection = defaultRegistry.getProvider( |
| "outlier_detection_experimental"); |
| assertThat(outlierDetection.getClass().getName()).isEqualTo( |
| "io.grpc.util.OutlierDetectionLoadBalancerProvider"); |
| assertThat(roundRobin.getPriority()).isEqualTo(5); |
| |
| LoadBalancerProvider grpclb = defaultRegistry.getProvider("grpclb"); |
| assertThat(grpclb).isInstanceOf(GrpclbLoadBalancerProvider.class); |
| assertThat(grpclb.getPriority()).isEqualTo(5); |
| } |
| |
| @Test |
| public void unavilableProviderThrows() { |
| LoadBalancerRegistry reg = new LoadBalancerRegistry(); |
| try { |
| reg.register(new FakeProvider("great", 5, false)); |
| fail("Should throw"); |
| } catch (IllegalArgumentException e) { |
| assertThat(e.getMessage()).contains("isAvailable() returned false"); |
| } |
| assertThat(reg.getProvider("great")).isNull(); |
| } |
| |
| @Test |
| public void registerAndDeregister() { |
| LoadBalancerProvider[] providers = new LoadBalancerProvider[] { |
| new FakeProvider("cool", 5, true), |
| new FakeProvider("cool", 6, true), |
| new FakeProvider("great", 5, true), |
| new FakeProvider("great", 4, true), |
| new FakeProvider("excellent", 5, true), |
| new FakeProvider("excellent", 5, true)}; |
| LoadBalancerRegistry reg = new LoadBalancerRegistry(); |
| for (LoadBalancerProvider provider : providers) { |
| reg.register(provider); |
| } |
| |
| assertThat(reg.providers()).hasSize(3); |
| assertThat(reg.getProvider("cool")).isSameInstanceAs(providers[1]); |
| assertThat(reg.getProvider("great")).isSameInstanceAs(providers[2]); |
| assertThat(reg.getProvider("excellent")).isSameInstanceAs(providers[4]); |
| |
| reg.deregister(providers[1]); |
| assertThat(reg.getProvider("cool")).isSameInstanceAs(providers[0]); |
| reg.deregister(providers[2]); |
| assertThat(reg.getProvider("great")).isSameInstanceAs(providers[3]); |
| reg.deregister(providers[4]); |
| assertThat(reg.getProvider("excellent")).isSameInstanceAs(providers[5]); |
| } |
| |
| private static class FakeProvider extends LoadBalancerProvider { |
| final String policy; |
| final int priority; |
| final boolean isAvailable; |
| |
| FakeProvider(String policy, int priority, boolean isAvailable) { |
| this.policy = policy; |
| this.priority = priority; |
| this.isAvailable = isAvailable; |
| } |
| |
| @Override |
| public boolean isAvailable() { |
| return isAvailable; |
| } |
| |
| @Override |
| public int getPriority() { |
| return priority; |
| } |
| |
| @Override |
| public String getPolicyName() { |
| return policy; |
| } |
| |
| @Override |
| public LoadBalancer newLoadBalancer(LoadBalancer.Helper helper) { |
| throw new AssertionError("Should not be called in test"); |
| } |
| } |
| } |