blob: 3250485dfbae165a830720d69aef09214cbd2c00 [file] [log] [blame]
/*
* Copyright 2016 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 org.junit.Assert.assertEquals;
import static org.junit.Assert.assertSame;
import static org.junit.Assert.fail;
import java.util.Collections;
import java.util.HashSet;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
/** Unit tests for {@link ServerServiceDefinition}. */
@RunWith(JUnit4.class)
public class ServerServiceDefinitionTest {
private String serviceName = "com.example.service";
private MethodDescriptor<String, Integer> method1 = MethodDescriptor.<String, Integer>newBuilder()
.setType(MethodDescriptor.MethodType.UNKNOWN)
.setFullMethodName(MethodDescriptor.generateFullMethodName(serviceName, "method1"))
.setRequestMarshaller(StringMarshaller.INSTANCE)
.setResponseMarshaller(IntegerMarshaller.INSTANCE)
.build();
private MethodDescriptor<String, Integer> diffMethod1 =
method1.toBuilder().setIdempotent(true).build();
private MethodDescriptor<String, Integer> method2 = method1.toBuilder()
.setFullMethodName(MethodDescriptor.generateFullMethodName(serviceName, "method2"))
.build();
private ServerCallHandler<String, Integer> methodHandler1
= new NoopServerCallHandler<String, Integer>();
private ServerCallHandler<String, Integer> methodHandler2
= new NoopServerCallHandler<String, Integer>();
private ServerMethodDefinition<String, Integer> methodDef1
= ServerMethodDefinition.create(method1, methodHandler1);
private ServerMethodDefinition<String, Integer> methodDef2
= ServerMethodDefinition.create(method2, methodHandler2);
@Rule
public ExpectedException thrown = ExpectedException.none();
@Test
public void noMethods() {
ServiceDescriptor sd = new ServiceDescriptor(serviceName);
ServerServiceDefinition ssd = ServerServiceDefinition.builder(sd)
.build();
assertSame(sd, ssd.getServiceDescriptor());
assertEquals(Collections.<MethodDescriptor<?, ?>>emptyList(),
ssd.getServiceDescriptor().getMethods());
}
@Test
public void addMethod_twoArg() {
ServiceDescriptor sd = new ServiceDescriptor(serviceName, method1, method2);
ServerServiceDefinition ssd = ServerServiceDefinition.builder(sd)
.addMethod(method1, methodHandler1)
.addMethod(method2, methodHandler2)
.build();
assertSame(sd, ssd.getServiceDescriptor());
for (ServerMethodDefinition<?, ?> serverMethod : ssd.getMethods()) {
MethodDescriptor<?, ?> method = serverMethod.getMethodDescriptor();
if (method1.equals(method)) {
assertSame(methodHandler1, serverMethod.getServerCallHandler());
} else if (method2.equals(method)) {
assertSame(methodHandler2, serverMethod.getServerCallHandler());
} else {
fail("Unexpected method descriptor: " + method.getFullMethodName());
}
}
}
@Test
public void addMethod_duplicateName() {
ServiceDescriptor sd = new ServiceDescriptor(serviceName, method1);
ServerServiceDefinition.Builder ssd = ServerServiceDefinition.builder(sd)
.addMethod(method1, methodHandler1);
thrown.expect(IllegalStateException.class);
ssd.addMethod(diffMethod1, methodHandler2)
.build();
}
@Test
public void buildMisaligned_extraMethod() {
ServiceDescriptor sd = new ServiceDescriptor(serviceName);
ServerServiceDefinition.Builder ssd = ServerServiceDefinition.builder(sd)
.addMethod(methodDef1);
thrown.expect(IllegalStateException.class);
ssd.build();
}
@Test
public void buildMisaligned_diffMethodInstance() {
ServiceDescriptor sd = new ServiceDescriptor(serviceName, method1);
ServerServiceDefinition.Builder ssd = ServerServiceDefinition.builder(sd)
.addMethod(diffMethod1, methodHandler1);
thrown.expect(IllegalStateException.class);
ssd.build();
}
@Test
public void buildMisaligned_missingMethod() {
ServiceDescriptor sd = new ServiceDescriptor(serviceName, method1);
ServerServiceDefinition.Builder ssd = ServerServiceDefinition.builder(sd);
thrown.expect(IllegalStateException.class);
ssd.build();
}
@Test
public void builderWithServiceName() {
ServerServiceDefinition ssd = ServerServiceDefinition.builder(serviceName)
.addMethod(methodDef1)
.addMethod(methodDef2)
.build();
assertEquals(serviceName, ssd.getServiceDescriptor().getName());
HashSet<MethodDescriptor<?, ?>> goldenMethods = new HashSet<MethodDescriptor<?, ?>>();
goldenMethods.add(method1);
goldenMethods.add(method2);
assertEquals(goldenMethods,
new HashSet<MethodDescriptor<?, ?>>(ssd.getServiceDescriptor().getMethods()));
HashSet<ServerMethodDefinition<?, ?>> goldenMethodDefs
= new HashSet<ServerMethodDefinition<?, ?>>();
goldenMethodDefs.add(methodDef1);
goldenMethodDefs.add(methodDef2);
assertEquals(goldenMethodDefs, new HashSet<ServerMethodDefinition<?, ?>>(ssd.getMethods()));
}
@Test
public void builderWithServiceName_noMethods() {
ServerServiceDefinition ssd = ServerServiceDefinition.builder(serviceName)
.build();
assertEquals(Collections.<MethodDescriptor<?, ?>>emptyList(),
ssd.getServiceDescriptor().getMethods());
assertEquals(Collections.<ServerMethodDefinition<?, ?>>emptySet(),
new HashSet<ServerMethodDefinition<?, ?>>(ssd.getMethods()));
}
private static class NoopServerCallHandler<ReqT, RespT>
implements ServerCallHandler<ReqT, RespT> {
@Override
public ServerCall.Listener<ReqT> startCall(ServerCall<ReqT, RespT> call, Metadata headers) {
throw new UnsupportedOperationException();
}
}
}