diff --git a/integration-testing/src/main/java/com/google/net/stubby/testing/integration/TestServiceServer.java b/integration-testing/src/main/java/com/google/net/stubby/testing/integration/TestServiceServer.java
index 3d5e564f0a..7452e719de 100644
--- a/integration-testing/src/main/java/com/google/net/stubby/testing/integration/TestServiceServer.java
+++ b/integration-testing/src/main/java/com/google/net/stubby/testing/integration/TestServiceServer.java
@@ -31,8 +31,6 @@
package com.google.net.stubby.testing.integration;
-import com.google.common.base.Preconditions;
-import com.google.common.collect.Maps;
import com.google.common.util.concurrent.MoreExecutors;
import com.google.net.stubby.ServerImpl;
import com.google.net.stubby.ServerInterceptors;
@@ -42,100 +40,26 @@ import com.google.net.stubby.transport.netty.NettyServerBuilder;
import io.netty.handler.ssl.SslContext;
import java.io.File;
-import java.util.Map;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
-import java.util.logging.Logger;
/**
- * Server that manages startup/shutdown of a single {@code TestService}. The server can be started
- * with any one of the supported transports.
+ * Server that manages startup/shutdown of a single {@code TestService}.
*/
public class TestServiceServer {
- private static final int DEFAULT_NUM_THREADS = 100;
- private static final int STARTUP_TIMEOUT_MILLS = 5000;
- private static final String RPC_PORT_ARG = "--port";
- private static final String TRANSPORT_ARG = "--transport";
- private static final String GRPC_VERSION_ARG = "--grpc_version";
- private final TestServiceImpl testService;
-
- /** Supported transport protocols */
- public enum Transport {
- HTTP2_NETTY, HTTP2_NETTY_TLS
- }
-
- private static final Logger log = Logger.getLogger(TestServiceServer.class.getName());
-
- private final ScheduledExecutorService executor;
- private final int port;
- private final ServerImpl server;
-
/**
- * Constructs the GRPC server.
- *
- * @param transport the transport over which to send GRPC frames.
- * @param port the port to be used for RPC communications.
- */
- public TestServiceServer(Transport transport, int port)
- throws Exception {
- Preconditions.checkNotNull(transport, "transport");
- this.executor = Executors.newScheduledThreadPool(DEFAULT_NUM_THREADS);
- this.port = port;
-
- // Create the GRPC service.
- testService = new TestServiceImpl(executor);
-
- switch (transport) {
- case HTTP2_NETTY:
- server = createServer(false);
- break;
- case HTTP2_NETTY_TLS:
- server = createServer(true);
- break;
- default:
- throw new IllegalArgumentException("Unsupported transport: " + transport);
- }
- }
-
- public void start() throws Exception {
- server.startAsync();
- server.awaitRunning(STARTUP_TIMEOUT_MILLS, TimeUnit.MILLISECONDS);
- log.info("GRPC server started.");
- }
-
- public void stop() throws Exception {
- log.info("GRPC server stopping...");
- server.stopAsync();
- server.awaitTerminated();
- MoreExecutors.shutdownAndAwaitTermination(executor, 5, TimeUnit.SECONDS);
- }
-
- /**
- * The main application allowing this server to be launched from the command line. Accepts the
- * following arguments:
- *
- * --transport= Identifies the transport
- * over which GRPC frames should be sent.
- * --port= The port number for RPC communications.
+ * The main application allowing this server to be launched from the command line.
*/
public static void main(String[] args) throws Exception {
- Map argMap = parseArgs(args);
- Transport transport = getTransport(argMap);
- int port = getPort(RPC_PORT_ARG, argMap);
-
- // TODO(user): Remove. Ideally stop passing the arg in scripts first.
- if (getGrpcVersion(argMap) != 2) {
- System.err.println("Only grpc_version=2 is supported");
- System.exit(1);
- }
-
- final TestServiceServer server = new TestServiceServer(transport, port);
+ final TestServiceServer server = new TestServiceServer();
+ server.parseArgs(args);
Runtime.getRuntime().addShutdownHook(new Thread() {
@Override
public void run() {
try {
+ System.out.println("Shutting down");
server.stop();
} catch (Exception e) {
e.printStackTrace();
@@ -143,63 +67,85 @@ public class TestServiceServer {
}
});
server.start();
+ System.out.println("Server started");
}
- private static Transport getTransport(Map argMap) {
- String value = argMap.get(TRANSPORT_ARG.toLowerCase());
- Preconditions.checkNotNull(value, "%s argument must be provided.", TRANSPORT_ARG);
- Transport transport = Transport.valueOf(value.toUpperCase().trim());
- System.out.println(TRANSPORT_ARG + " set to: " + transport);
- return transport;
- }
+ private int port = 8080;
+ private boolean useTls = true;
- private static int getPort(String argName, Map argMap) {
- String value = argMap.get(argName.toLowerCase());
- if (value != null) {
- int port = Integer.parseInt(value);
- System.out.println(argName + " set to port: " + port);
- return port;
- }
+ private ScheduledExecutorService executor;
+ private ServerImpl server;
- int port = Util.pickUnusedPort();
- System.out.println(argName + " not, provided. Using port: " + port);
- return port;
- }
-
- private static int getGrpcVersion(Map argMap) {
- String value = argMap.get(GRPC_VERSION_ARG.toLowerCase());
- if (value == null) {
- return 2;
- }
- int version = Integer.parseInt(value);
- System.out.println(GRPC_VERSION_ARG + " set to version: " + version);
- return version;
- }
-
- private static Map parseArgs(String[] args) {
- Map argMap = Maps.newHashMap();
+ private void parseArgs(String[] args) {
+ boolean usage = false;
for (String arg : args) {
- String[] parts = arg.split("=");
- Preconditions.checkArgument(parts.length == 2, "Failed parsing argument: %s", arg);
- argMap.put(parts[0].toLowerCase().trim(), parts[1].trim());
+ if (!arg.startsWith("--")) {
+ System.err.println("All arguments must start with '--': " + arg);
+ usage = true;
+ break;
+ }
+ String[] parts = arg.substring(2).split("=", 2);
+ String key = parts[0];
+ if ("help".equals(key)) {
+ usage = true;
+ break;
+ }
+ if (parts.length != 2) {
+ System.err.println("All arguments must be of the form --arg=value");
+ usage = true;
+ break;
+ }
+ String value = parts[1];
+ if ("port".equals(key)) {
+ port = Integer.parseInt(value);
+ } else if ("use_tls".equals(key)) {
+ useTls = Boolean.parseBoolean(value);
+ } else if ("grpc_version".equals(key)) {
+ if (!"2".equals(value)) {
+ System.err.println("Only grpc version 2 is supported");
+ usage = true;
+ break;
+ }
+ } else {
+ System.err.println("Unknown argument: " + key);
+ usage = true;
+ break;
+ }
+ }
+ if (usage) {
+ TestServiceServer s = new TestServiceServer();
+ System.out.println(
+ "Usage: [ARGS...]"
+ + "\n"
+ + "\n --port=PORT Port to connect to. Default " + s.port
+ + "\n --use_tls=true|false Whether to use TLS. Default " + s.useTls
+ );
+ System.exit(1);
}
-
- return argMap;
}
- private ServerImpl createServer(boolean enableSSL) throws Exception {
+ private void start() throws Exception {
+ executor = Executors.newSingleThreadScheduledExecutor();
SslContext sslContext = null;
- if (enableSSL) {
+ if (useTls) {
String dir = "integration-testing/certs";
sslContext = SslContext.newServerContext(
new File(dir + "/server1.pem"),
new File(dir + "/server1.key"));
}
- return NettyServerBuilder.forPort(port)
- .executor(executor)
+ server = NettyServerBuilder.forPort(port)
.sslContext(sslContext)
- .addService(ServerInterceptors.intercept(TestServiceGrpc.bindService(testService),
- TestUtils.echoRequestHeadersInterceptor(Util.METADATA_KEY)))
+ .addService(ServerInterceptors.intercept(
+ TestServiceGrpc.bindService(new TestServiceImpl(executor)),
+ TestUtils.echoRequestHeadersInterceptor(Util.METADATA_KEY)))
.build();
+ server.startAsync();
+ server.awaitRunning(5, TimeUnit.SECONDS);
+ }
+
+ private void stop() throws Exception {
+ server.stopAsync();
+ server.awaitTerminated();
+ MoreExecutors.shutdownAndAwaitTermination(executor, 5, TimeUnit.SECONDS);
}
}