• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright 2016 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.netty;
18 
19 import io.grpc.ServerStreamTracer;
20 import io.grpc.internal.ClientTransportFactory;
21 import io.grpc.internal.FakeClock;
22 import io.grpc.internal.InternalServer;
23 import io.grpc.internal.ManagedClientTransport;
24 import io.grpc.internal.testing.AbstractTransportTest;
25 import java.net.InetSocketAddress;
26 import java.util.List;
27 import java.util.concurrent.TimeUnit;
28 import org.junit.After;
29 import org.junit.runner.RunWith;
30 import org.junit.runners.JUnit4;
31 
32 /** Unit tests for Netty transport. */
33 @RunWith(JUnit4.class)
34 public class NettyTransportTest extends AbstractTransportTest {
35   private final FakeClock fakeClock = new FakeClock();
36   // Avoid LocalChannel for testing because LocalChannel can fail with
37   // io.netty.channel.ChannelException instead of java.net.ConnectException which breaks
38   // serverNotListening test.
39   private final ClientTransportFactory clientFactory = NettyChannelBuilder
40       // Although specified here, address is ignored because we never call build.
41       .forAddress("localhost", 0)
42       .flowControlWindow(65 * 1024)
43       .negotiationType(NegotiationType.PLAINTEXT)
44       .setTransportTracerFactory(fakeClockTransportTracer)
45       .buildTransportFactory();
46 
47   @Override
haveTransportTracer()48   protected boolean haveTransportTracer() {
49     return true;
50   }
51 
52   @After
releaseClientFactory()53   public void releaseClientFactory() {
54     clientFactory.close();
55   }
56 
57   @Override
newServer(List<ServerStreamTracer.Factory> streamTracerFactories)58   protected InternalServer newServer(List<ServerStreamTracer.Factory> streamTracerFactories) {
59     return NettyServerBuilder
60         .forPort(0)
61         .flowControlWindow(65 * 1024)
62         .setTransportTracerFactory(fakeClockTransportTracer)
63         .buildTransportServer(streamTracerFactories);
64   }
65 
66   @Override
newServer( InternalServer server, List<ServerStreamTracer.Factory> streamTracerFactories)67   protected InternalServer newServer(
68       InternalServer server, List<ServerStreamTracer.Factory> streamTracerFactories) {
69     int port = server.getPort();
70     return NettyServerBuilder
71         .forPort(port)
72         .flowControlWindow(65 * 1024)
73         .setTransportTracerFactory(fakeClockTransportTracer)
74         .buildTransportServer(streamTracerFactories);
75   }
76 
77   @Override
testAuthority(InternalServer server)78   protected String testAuthority(InternalServer server) {
79     return "localhost:" + server.getPort();
80   }
81 
82   @Override
advanceClock(long offset, TimeUnit unit)83   protected void advanceClock(long offset, TimeUnit unit) {
84     fakeClock.forwardNanos(unit.toNanos(offset));
85   }
86 
87   @Override
fakeCurrentTimeNanos()88   protected long fakeCurrentTimeNanos() {
89     return fakeClock.getTicker().read();
90   }
91 
92   @Override
newClientTransport(InternalServer server)93   protected ManagedClientTransport newClientTransport(InternalServer server) {
94     int port = server.getPort();
95     return clientFactory.newClientTransport(
96         new InetSocketAddress("localhost", port),
97         new ClientTransportFactory.ClientTransportOptions()
98           .setAuthority(testAuthority(server)));
99   }
100 }
101