• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright 2020 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 org.junit.Test;
23 import org.junit.runner.RunWith;
24 import org.junit.runners.JUnit4;
25 
26 /** Unit tests for {@link ServerRegistry}. */
27 @RunWith(JUnit4.class)
28 public class ServerRegistryTest {
29   private int port = 123;
30   private ServerCredentials creds = new ServerCredentials() {};
31 
32   @Test
register_unavailableProviderThrows()33   public void register_unavailableProviderThrows() {
34     ServerRegistry reg = new ServerRegistry();
35     try {
36       reg.register(new BaseProvider(false, 5));
37       fail("Should throw");
38     } catch (IllegalArgumentException e) {
39       assertThat(e).hasMessageThat().contains("isAvailable() returned false");
40     }
41     assertThat(reg.providers()).isEmpty();
42   }
43 
44   @Test
deregister()45   public void deregister() {
46     ServerRegistry reg = new ServerRegistry();
47     ServerProvider p1 = new BaseProvider(true, 5);
48     ServerProvider p2 = new BaseProvider(true, 5);
49     ServerProvider p3 = new BaseProvider(true, 5);
50     reg.register(p1);
51     reg.register(p2);
52     reg.register(p3);
53     assertThat(reg.providers()).containsExactly(p1, p2, p3).inOrder();
54     reg.deregister(p2);
55     assertThat(reg.providers()).containsExactly(p1, p3).inOrder();
56   }
57 
58   @Test
provider_sorted()59   public void provider_sorted() {
60     ServerRegistry reg = new ServerRegistry();
61     ServerProvider p1 = new BaseProvider(true, 5);
62     ServerProvider p2 = new BaseProvider(true, 3);
63     ServerProvider p3 = new BaseProvider(true, 8);
64     ServerProvider p4 = new BaseProvider(true, 3);
65     ServerProvider p5 = new BaseProvider(true, 8);
66     reg.register(p1);
67     reg.register(p2);
68     reg.register(p3);
69     reg.register(p4);
70     reg.register(p5);
71     assertThat(reg.providers()).containsExactly(p3, p5, p1, p2, p4).inOrder();
72   }
73 
74   @Test
getProvider_noProvider()75   public void getProvider_noProvider() {
76     assertThat(new ServerRegistry().provider()).isNull();
77   }
78 
79   @Test
newServerBuilderForPort_providerReturnsError()80   public void newServerBuilderForPort_providerReturnsError() {
81     final String errorString = "brisking";
82     class ErrorProvider extends BaseProvider {
83       ErrorProvider() {
84         super(true, 5);
85       }
86 
87       @Override
88       public NewServerBuilderResult newServerBuilderForPort(
89           int passedPort, ServerCredentials passedCreds) {
90         assertThat(passedPort).isEqualTo(port);
91         assertThat(passedCreds).isSameInstanceAs(creds);
92         return NewServerBuilderResult.error(errorString);
93       }
94     }
95 
96     ServerRegistry registry = new ServerRegistry();
97     registry.register(new ErrorProvider());
98     try {
99       registry.newServerBuilderForPort(port, creds);
100       fail("expected exception");
101     } catch (ServerRegistry.ProviderNotFoundException ex) {
102       assertThat(ex).hasMessageThat().contains(errorString);
103       assertThat(ex).hasMessageThat().contains(ErrorProvider.class.getName());
104     }
105   }
106 
107   @Test
newServerBuilderForPort_providerReturnsNonNull()108   public void newServerBuilderForPort_providerReturnsNonNull() {
109     ServerRegistry registry = new ServerRegistry();
110     registry.register(new BaseProvider(true, 5) {
111       @Override
112       public NewServerBuilderResult newServerBuilderForPort(
113           int passedPort, ServerCredentials passedCreds) {
114         return NewServerBuilderResult.error("dodging");
115       }
116     });
117     class MockServerBuilder extends ForwardingServerBuilder<MockServerBuilder> {
118       @Override public ServerBuilder<?> delegate() {
119         throw new UnsupportedOperationException();
120       }
121     }
122 
123     final ServerBuilder<?> mcb = new MockServerBuilder();
124     registry.register(new BaseProvider(true, 4) {
125       @Override
126       public NewServerBuilderResult newServerBuilderForPort(
127           int passedPort, ServerCredentials passedCreds) {
128         return NewServerBuilderResult.serverBuilder(mcb);
129       }
130     });
131     registry.register(new BaseProvider(true, 3) {
132       @Override
133       public NewServerBuilderResult newServerBuilderForPort(
134           int passedPort, ServerCredentials passedCreds) {
135         fail("Should not be called");
136         throw new AssertionError();
137       }
138     });
139     assertThat(registry.newServerBuilderForPort(port, creds)).isSameInstanceAs(mcb);
140   }
141 
142   @Test
newServerBuilderForPort_noProvider()143   public void newServerBuilderForPort_noProvider() {
144     ServerRegistry registry = new ServerRegistry();
145     try {
146       registry.newServerBuilderForPort(port, creds);
147       fail("expected exception");
148     } catch (ServerRegistry.ProviderNotFoundException ex) {
149       assertThat(ex).hasMessageThat().contains("No functional server found");
150       assertThat(ex).hasMessageThat().contains("grpc-netty");
151     }
152   }
153 
154   private static class BaseProvider extends ServerProvider {
155     private final boolean isAvailable;
156     private final int priority;
157 
BaseProvider(boolean isAvailable, int priority)158     public BaseProvider(boolean isAvailable, int priority) {
159       this.isAvailable = isAvailable;
160       this.priority = priority;
161     }
162 
163     @Override
isAvailable()164     protected boolean isAvailable() {
165       return isAvailable;
166     }
167 
168     @Override
priority()169     protected int priority() {
170       return priority;
171     }
172 
173     @Override
builderForPort(int port)174     protected ServerBuilder<?> builderForPort(int port) {
175       throw new UnsupportedOperationException();
176     }
177   }
178 }
179