/* * 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 { private final SettableFuture completion = SettableFuture.create(); private final List responses = new ArrayList<>(); List 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 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 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 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(); } }