@Override public HttpJsonCallContext getEmptyCallContext() { return HttpJsonCallContext.createDefault(); }
@Override public HttpJsonCallContext getEmptyCallContext() { return HttpJsonCallContext.createDefault(); }
@Override public ApiFuture<ResponseT> futureCall(RequestT request, ApiCallContext inputContext) { HttpJsonCallContext context = HttpJsonCallContext.createDefault().nullToSelf(inputContext); ApiFuture<ResponseT> innerCallFuture = callable.futureCall(request, context); ExceptionTransformingFuture transformingFuture = new ExceptionTransformingFuture(innerCallFuture); ApiFutures.addCallback(innerCallFuture, transformingFuture, directExecutor()); return transformingFuture; }
@Override public ApiFuture<ResponseT> futureCall(RequestT request, ApiCallContext inputContext) { HttpJsonCallContext context = HttpJsonCallContext.createDefault().nullToSelf(inputContext); ApiFuture<ResponseT> innerCallFuture = callable.futureCall(request, context); ExceptionTransformingFuture transformingFuture = new ExceptionTransformingFuture(innerCallFuture); ApiFutures.addCallback(innerCallFuture, transformingFuture, directExecutor()); return transformingFuture; }
@Test public void testMergeWithTimeout() { Duration timeout = Duration.ofSeconds(19); HttpJsonCallContext ctx1 = HttpJsonCallContext.createDefault(); HttpJsonCallContext ctx2 = HttpJsonCallContext.createDefault().withTimeout(timeout); Truth.assertThat(ctx1.merge(ctx2).getTimeout()).isEqualTo(timeout); }
@Test public void testMergeWithNullTimeout() { Duration timeout = Duration.ofSeconds(10); HttpJsonCallContext baseContext = HttpJsonCallContext.createDefault().withTimeout(timeout); HttpJsonCallContext defaultOverlay = HttpJsonCallContext.createDefault(); Truth.assertThat(baseContext.merge(defaultOverlay).getTimeout()).isEqualTo(timeout); HttpJsonCallContext explicitNullOverlay = HttpJsonCallContext.createDefault().withTimeout(null); Truth.assertThat(baseContext.merge(explicitNullOverlay).getTimeout()).isEqualTo(timeout); }
@Test public void testWithTimeout() { Truth.assertThat(HttpJsonCallContext.createDefault().withTimeout(null).getTimeout()).isNull(); }
@Test public void testWithCredentials() { Credentials credentials = Mockito.mock(Credentials.class); HttpJsonCallContext emptyContext = HttpJsonCallContext.createDefault(); Truth.assertThat(emptyContext.getCredentials()).isNull(); HttpJsonCallContext context = emptyContext.withCredentials(credentials); Truth.assertThat(context.getCredentials()).isNotNull(); }
@Override public ApiFuture<ResponseT> futureCall(RequestT request, ApiCallContext inputContext) { Preconditions.checkNotNull(request); HttpJsonCallContext context = HttpJsonCallContext.createDefault().nullToSelf(inputContext); @Nullable Instant deadline = context.getDeadline(); // Try to convert the timeout into a deadline and use it if it occurs before the actual deadline if (context.getTimeout() != null) { @Nonnull Instant newDeadline = Instant.now().plus(context.getTimeout()); if (deadline == null || newDeadline.isBefore(deadline)) { deadline = newDeadline; } } HttpJsonCallOptions callOptions = HttpJsonCallOptions.newBuilder() .setDeadline(deadline) .setCredentials(context.getCredentials()) .build(); return context.getChannel().issueFutureUnaryCall(callOptions, request, descriptor); }
@Override public ApiFuture<ResponseT> futureCall(RequestT request, ApiCallContext inputContext) { Preconditions.checkNotNull(request); HttpJsonCallContext context = HttpJsonCallContext.createDefault().nullToSelf(inputContext); @Nullable Instant deadline = context.getDeadline(); // Try to convert the timeout into a deadline and use it if it occurs before the actual deadline if (context.getTimeout() != null) { @Nonnull Instant newDeadline = Instant.now().plus(context.getTimeout()); if (deadline == null || newDeadline.isBefore(deadline)) { deadline = newDeadline; } } HttpJsonCallOptions callOptions = HttpJsonCallOptions.newBuilder() .setDeadline(deadline) .setCredentials(context.getCredentials()) .build(); return context.getChannel().issueFutureUnaryCall(callOptions, request, descriptor); }
@Test public void testWithZeroTimeout() { Truth.assertThat( HttpJsonCallContext.createDefault().withTimeout(Duration.ofSeconds(0L)).getTimeout()) .isNull(); }
@Test public void testMergeWithTracer() { ApiTracer explicitTracer = Mockito.mock(ApiTracer.class); HttpJsonCallContext ctxWithExplicitTracer = HttpJsonCallContext.createDefault().withTracer(explicitTracer); HttpJsonCallContext ctxWithDefaultTracer = HttpJsonCallContext.createDefault(); ApiTracer defaultTracer = ctxWithDefaultTracer.getTracer(); // Explicit tracer overrides the default tracer. Truth.assertThat(ctxWithDefaultTracer.merge(ctxWithExplicitTracer).getTracer()) .isSameAs(explicitTracer); // Default tracer does not override an explicit tracer. Truth.assertThat(ctxWithExplicitTracer.merge(ctxWithDefaultTracer).getTracer()) .isSameAs(explicitTracer); // Default tracer does not override another default tracer. Truth.assertThat(ctxWithDefaultTracer.merge(HttpJsonCallContext.createDefault()).getTracer()) .isSameAs(defaultTracer); } }
@Test public void testWithNegativeTimeout() { Truth.assertThat( HttpJsonCallContext.createDefault().withTimeout(Duration.ofSeconds(-1L)).getTimeout()) .isNull(); }
@Test public void testNullToSelfWrongType() { thrown.expect(IllegalArgumentException.class); HttpJsonCallContext.createDefault().nullToSelf(FakeCallContext.createDefault()); }
@Test public void testWithTransportChannel() { ManagedHttpJsonChannel channel = Mockito.mock(ManagedHttpJsonChannel.class); HttpJsonCallContext context = HttpJsonCallContext.createDefault() .withTransportChannel( HttpJsonTransportChannel.newBuilder().setManagedChannel(channel).build()); Truth.assertThat(context.getChannel()).isSameAs(channel); }
@Test public void testMergeWrongType() { thrown.expect(IllegalArgumentException.class); HttpJsonCallContext.createDefault().merge(FakeCallContext.createDefault()); }
@Test public void testWithTransportChannelWrongType() { thrown.expect(IllegalArgumentException.class); FakeChannel channel = new FakeChannel(); HttpJsonCallContext.createDefault().withTransportChannel(FakeTransportChannel.create(channel)); }
@Before public void resetClock() { fakeClock = new FakeApiClock(System.nanoTime()); executor = RecordingScheduler.create(fakeClock); clientContext = ClientContext.newBuilder() .setExecutor(executor) .setClock(fakeClock) .setDefaultCallContext(HttpJsonCallContext.createDefault()) .build(); }
@Test public void testWithShorterTimeout() { HttpJsonCallContext ctxWithLongTimeout = HttpJsonCallContext.createDefault().withTimeout(Duration.ofSeconds(10)); // Sanity check Truth.assertThat(ctxWithLongTimeout.getTimeout()).isEqualTo(Duration.ofSeconds(10)); // Shorten the timeout and make sure it changed HttpJsonCallContext ctxWithShorterTimeout = ctxWithLongTimeout.withTimeout(Duration.ofSeconds(5)); Truth.assertThat(ctxWithShorterTimeout.getTimeout()).isEqualTo(Duration.ofSeconds(5)); }
@Test public void testWithLongerTimeout() { HttpJsonCallContext ctxWithShortTimeout = HttpJsonCallContext.createDefault().withTimeout(Duration.ofSeconds(5)); // Sanity check Truth.assertThat(ctxWithShortTimeout.getTimeout()).isEqualTo(Duration.ofSeconds(5)); // Try to extend the timeout and verify that it was ignored HttpJsonCallContext ctxWithUnchangedTimeout = ctxWithShortTimeout.withTimeout(Duration.ofSeconds(10)); Truth.assertThat(ctxWithUnchangedTimeout.getTimeout()).isEqualTo(Duration.ofSeconds(5)); }