blob: d6c5b429cb72a0778223c888985914d79f8f19c3 [file] [log] [blame]
/*
* 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();
}
}