You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
155 lines
5.5 KiB
155 lines
5.5 KiB
/*
|
|
* Copyright (C) 2016 The Dagger 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 dagger.grpc.functional.server;
|
|
|
|
import static com.google.common.truth.Truth.assertThat;
|
|
import static com.google.common.util.concurrent.Futures.getUnchecked;
|
|
import static com.google.protos.test.CoffeeService.CoffeeType.AMERICANO;
|
|
import static com.google.protos.test.CoffeeService.CoffeeType.DRIP;
|
|
import static com.google.protos.test.CoffeeService.CoffeeType.ESPRESSO;
|
|
import static com.google.protos.test.CoffeeService.CoffeeType.LATTE;
|
|
import static com.google.protos.test.CoffeeService.CoffeeType.POUR_OVER;
|
|
import static java.util.Arrays.asList;
|
|
|
|
import com.google.common.collect.ImmutableList;
|
|
import com.google.common.util.concurrent.SettableFuture;
|
|
import com.google.protos.test.BaristaGrpc;
|
|
import com.google.protos.test.BaristaGrpc.BaristaStub;
|
|
import com.google.protos.test.CoffeeService.CoffeeRequest;
|
|
import com.google.protos.test.CoffeeService.CoffeeResponse;
|
|
import com.google.protos.test.CoffeeService.CoffeeType;
|
|
import io.grpc.inprocess.InProcessChannelBuilder;
|
|
import io.grpc.stub.StreamObserver;
|
|
import java.util.ArrayList;
|
|
import java.util.List;
|
|
import org.junit.Before;
|
|
import org.junit.ClassRule;
|
|
import org.junit.Rule;
|
|
import org.junit.Test;
|
|
import org.junit.runner.RunWith;
|
|
import org.junit.runners.Parameterized;
|
|
import org.junit.runners.Parameterized.Parameters;
|
|
|
|
@RunWith(Parameterized.class)
|
|
public class BaristaTest {
|
|
|
|
private static final class CoffeeResponseObserver implements StreamObserver<CoffeeResponse> {
|
|
private final SettableFuture<Void> completion = SettableFuture.create();
|
|
private final List<CoffeeResponse> responses = new ArrayList<>();
|
|
|
|
List<CoffeeResponse> responses() {
|
|
getUnchecked(completion);
|
|
return responses;
|
|
}
|
|
|
|
@Override
|
|
public void onNext(CoffeeResponse value) {
|
|
responses.add(value);
|
|
}
|
|
|
|
@Override
|
|
public void onError(Throwable t) {
|
|
completion.setException(t);
|
|
}
|
|
|
|
@Override
|
|
public void onCompleted() {
|
|
completion.set(null);
|
|
}
|
|
}
|
|
|
|
@ClassRule
|
|
public static CoffeeServerResource coffeeServerWithCallScope =
|
|
new CoffeeServerResource("CallScope", DaggerCoffeeServerWithCallScopeService.builder());
|
|
|
|
@ClassRule
|
|
public static CoffeeServerResource coffeeServerWithSingletonScope =
|
|
new CoffeeServerResource("Unscoped", DaggerCoffeeServerWithUnscopedService.builder());
|
|
|
|
@Parameters(name = "{0}")
|
|
public static Iterable<Object[]> coffeeServers() {
|
|
return ImmutableList.copyOf(
|
|
new Object[][] {{coffeeServerWithCallScope}, {coffeeServerWithSingletonScope}});
|
|
}
|
|
|
|
@Rule public final VerifyInterceptor verifyCount;
|
|
private final CoffeeServerResource coffeeServer;
|
|
private final CoffeeResponseObserver responseObserver = new CoffeeResponseObserver();
|
|
|
|
private BaristaStub barista;
|
|
|
|
public BaristaTest(CoffeeServerResource coffeeServer) {
|
|
this.coffeeServer = coffeeServer;
|
|
this.verifyCount = new VerifyInterceptor(coffeeServer);
|
|
}
|
|
|
|
@Before
|
|
public void setUp() {
|
|
barista = BaristaGrpc.newStub(InProcessChannelBuilder.forName(coffeeServer.name()).build());
|
|
}
|
|
|
|
@Test
|
|
public void testUnaryGetCoffee() {
|
|
barista.unaryGetCoffee(request(POUR_OVER, LATTE), responseObserver);
|
|
assertThat(responseObserver.responses())
|
|
.containsExactly(response("Here you go!", POUR_OVER, LATTE));
|
|
}
|
|
|
|
@Test
|
|
public void testClientStreamingGetCoffee() {
|
|
StreamObserver<CoffeeRequest> requestObserver =
|
|
barista.clientStreamingGetCoffee(responseObserver);
|
|
requestObserver.onNext(request(POUR_OVER, LATTE));
|
|
requestObserver.onNext(request(AMERICANO));
|
|
requestObserver.onNext(request(DRIP, ESPRESSO));
|
|
requestObserver.onCompleted();
|
|
assertThat(responseObserver.responses())
|
|
.containsExactly(response("All yours!", POUR_OVER, LATTE, AMERICANO, DRIP, ESPRESSO));
|
|
}
|
|
|
|
@Test
|
|
public void testServerStreamingGetCoffee() {
|
|
barista.serverStreamingGetCoffee(request(DRIP, AMERICANO), responseObserver);
|
|
assertThat(responseObserver.responses())
|
|
.containsExactly(
|
|
response("Here's a DRIP", DRIP), response("Here's a AMERICANO", AMERICANO));
|
|
}
|
|
|
|
@Test
|
|
public void testBidiStreamingGetCoffee() {
|
|
StreamObserver<CoffeeRequest> requestObserver =
|
|
barista.bidiStreamingGetCoffee(responseObserver);
|
|
requestObserver.onNext(request(POUR_OVER, LATTE));
|
|
requestObserver.onNext(request(AMERICANO));
|
|
requestObserver.onNext(request(DRIP, ESPRESSO));
|
|
requestObserver.onCompleted();
|
|
assertThat(responseObserver.responses())
|
|
.containsExactly(
|
|
response("Enjoy!", POUR_OVER, LATTE),
|
|
response("Enjoy!", AMERICANO),
|
|
response("Enjoy!", DRIP, ESPRESSO));
|
|
}
|
|
|
|
private CoffeeRequest request(CoffeeType... types) {
|
|
return CoffeeRequest.newBuilder().addAllType(asList(types)).build();
|
|
}
|
|
|
|
private CoffeeResponse response(String message, CoffeeType... types) {
|
|
return CoffeeResponse.newBuilder().setMessage(message).addAllCup(asList(types)).build();
|
|
}
|
|
}
|