/* * Copyright 2016 LinkedIn, Inc * * 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 com.linkedin.restli.client; import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertFalse; import static org.testng.Assert.assertTrue; import org.testng.annotations.Test; import com.linkedin.parseq.Task; import com.linkedin.restli.client.config.RequestConfigOverrides; import com.linkedin.restli.examples.greetings.api.Greeting; import com.linkedin.restli.examples.greetings.client.GreetingsBuilders; public abstract class ParSeqRestClientBatchingIntegrationTest extends ParSeqRestClientIntegrationTest { protected abstract boolean expectBatching(); protected abstract boolean expectBatchingOverrides(); protected abstract RequestConfigOverrides overrides(); @Test public void testGetRequests() { Task<?> task = Task.par(greetingGet(1L), greetingGet(2L)); runAndWait(getTestClassName() + ".testGetRequests", task); if (expectBatching()) { assertTrue(hasTask("greetings batch_get(reqs: 2, ids: 2)", task.getTrace())); } else { assertFalse(hasTask("greetings batch_get(reqs: 2, ids: 2)", task.getTrace())); } } @Test public void testGetRequestsOverrides() { Task<?> task = Task.par(greetingGet(1L, overrides()), greetingGet(2L, overrides())); runAndWait(getTestClassName() + ".testGetRequestsOverrides", task); if (expectBatchingOverrides()) { assertTrue(hasTask("greetings batch_get(reqs: 2, ids: 2)", task.getTrace())); } else { assertFalse(hasTask("greetings batch_get(reqs: 2, ids: 2)", task.getTrace())); } } @Test public void testGetRequestsWithSameCustomHeaders() { Task<?> t1 = _parseqClient.createTask(new GreetingsBuilders().get().id(1L) .addHeader("H1", "V1").build()); Task<?> t2 = _parseqClient.createTask(new GreetingsBuilders().get().id(2L) .addHeader("H1", "V1").build()); Task<?> task = Task.par(t1, t2); runAndWait(getTestClassName() + ".testGetRequestsWithSameCustomHeaders", task); if (expectBatching()) { assertTrue(hasTask("greetings batch_get(reqs: 2, ids: 2)", task.getTrace())); } else { assertFalse(hasTask("greetings batch_get(reqs: 2, ids: 2)", task.getTrace())); } } @Test public void testGetRequestsWithSameCustomHeadersOverrides() { Task<?> t1 = _parseqClient.createTask(new GreetingsBuilders().get().id(1L) .addHeader("H1", "V1").build(), overrides()); Task<?> t2 = _parseqClient.createTask(new GreetingsBuilders().get().id(2L) .addHeader("H1", "V1").build(), overrides()); Task<?> task = Task.par(t1, t2); runAndWait(getTestClassName() + ".testGetRequestsWithSameCustomHeadersOverrides", task); if (expectBatchingOverrides()) { assertTrue(hasTask("greetings batch_get(reqs: 2, ids: 2)", task.getTrace())); } else { assertFalse(hasTask("greetings batch_get(reqs: 2, ids: 2)", task.getTrace())); } } @Test public void testGetRequestsWithSameQueryParams() { Task<?> t1 = _parseqClient.createTask(new GreetingsBuilders().get().id(1L) .addParam("K1", "V1").build()); Task<?> t2 = _parseqClient.createTask(new GreetingsBuilders().get().id(2L) .addParam("K1", "V1").build()); Task<?> task = Task.par(t1, t2); runAndWait(getTestClassName() + ".testGetRequestsWithSameQueryParams", task); if (expectBatching()) { assertTrue(hasTask("greetings batch_get(reqs: 2, ids: 2)", task.getTrace())); } else { assertFalse(hasTask("greetings batch_get(reqs: 2, ids: 2)", task.getTrace())); } } @Test public void testGetRequestsWithSameQueryParamsOverrides() { Task<?> t1 = _parseqClient.createTask(new GreetingsBuilders().get().id(1L) .addParam("K1", "V1").build(), overrides()); Task<?> t2 = _parseqClient.createTask(new GreetingsBuilders().get().id(2L) .addParam("K1", "V1").build(), overrides()); Task<?> task = Task.par(t1, t2); runAndWait(getTestClassName() + ".testGetRequestsWithSameQueryParamsOverrides", task); if (expectBatchingOverrides()) { assertTrue(hasTask("greetings batch_get(reqs: 2, ids: 2)", task.getTrace())); } else { assertFalse(hasTask("greetings batch_get(reqs: 2, ids: 2)", task.getTrace())); } } @Test public void testGetRequestsWithDifferentCustomQueryParamValuesNoBatching() { Task<?> t1 = _parseqClient.createTask(new GreetingsBuilders().get().id(1L) .addParam("K1", "V1").build()); Task<?> t2 = _parseqClient.createTask(new GreetingsBuilders().get().id(2L) .addParam("K1", "V2").build()); Task<?> task = Task.par(t1, t2); runAndWait(getTestClassName() + ".testGetRequestsWithDifferentCustomQueryParamValuesNoBatching", task); assertFalse(hasTask("greetings batch_get(reqs: 2, ids: 2)", task.getTrace())); } @Test public void testGetRequestsWithDifferentCustomQueryParamValuesNoBatchingOverrides() { Task<?> t1 = _parseqClient.createTask(new GreetingsBuilders().get().id(1L) .addParam("K1", "V1").build(), overrides()); Task<?> t2 = _parseqClient.createTask(new GreetingsBuilders().get().id(2L) .addParam("K1", "V2").build(), overrides()); Task<?> task = Task.par(t1, t2); runAndWait(getTestClassName() + ".testGetRequestsWithDifferentCustomQueryParamValuesNoBatchingOverrides", task); assertFalse(hasTask("greetings batch_get(reqs: 2, ids: 2)", task.getTrace())); } @Test public void testGetRequestsWithDifferentCustomHeaderValuesNoBatching() { Task<?> t1 = _parseqClient.createTask(new GreetingsBuilders().get().id(1L) .addHeader("H1", "V1").build()); Task<?> t2 = _parseqClient.createTask(new GreetingsBuilders().get().id(2L) .addHeader("H1", "V2").build()); Task<?> task = Task.par(t1, t2); runAndWait(getTestClassName() + ".testGetRequestsWithDifferentCustomHeadersNoBatching", task); assertFalse(hasTask("greetings batch_get(reqs: 2, ids: 2)", task.getTrace())); } @Test public void testGetRequestsWithDifferentCustomHeaderValuesNoBatchingOverrides() { Task<?> t1 = _parseqClient.createTask(new GreetingsBuilders().get().id(1L) .addHeader("H1", "V1").build(), overrides()); Task<?> t2 = _parseqClient.createTask(new GreetingsBuilders().get().id(2L) .addHeader("H1", "V2").build(), overrides()); Task<?> task = Task.par(t1, t2); runAndWait(getTestClassName() + ".testGetRequestsWithDifferentCustomHeaderValuesNoBatchingOverrides", task); assertFalse(hasTask("greetings batch_get(reqs: 2, ids: 2)", task.getTrace())); } @Test public void testGetRequestsWithDifferentCustomHeadersNoBatching() { Task<?> t1 = _parseqClient.createTask(new GreetingsBuilders().get().id(1L) .addHeader("H1", "V1").build()); Task<?> t2 = _parseqClient.createTask(new GreetingsBuilders().get().id(2L) .addHeader("H2", "V1").build()); Task<?> task = Task.par(t1, t2); runAndWait(getTestClassName() + ".testGetRequestsWithDifferentCustomHeadersNoBatching", task); assertFalse(hasTask("greetings batch_get(reqs: 2, ids: 2)", task.getTrace())); } @Test public void testGetRequestsWithDifferentCustomHeadersNoBatchingOverrides() { Task<?> t1 = _parseqClient.createTask(new GreetingsBuilders().get().id(1L) .addHeader("H1", "V1").build(), overrides()); Task<?> t2 = _parseqClient.createTask(new GreetingsBuilders().get().id(2L) .addHeader("H2", "V1").build(), overrides()); Task<?> task = Task.par(t1, t2); runAndWait(getTestClassName() + ".testGetRequestsWithDifferentCustomHeadersNoBatchingOverrides", task); assertFalse(hasTask("greetings batch_get(reqs: 2, ids: 2)", task.getTrace())); } @Test public void testGetRequestsWithDifferentCustomQueryParamsNoBatching() { Task<?> t1 = _parseqClient.createTask(new GreetingsBuilders().get().id(1L) .addParam("K1", "V1").build()); Task<?> t2 = _parseqClient.createTask(new GreetingsBuilders().get().id(2L) .addParam("K2", "V1").build()); Task<?> task = Task.par(t1, t2); runAndWait(getTestClassName() + ".testGetRequestsWithDifferentCustomQueryParamsNoBatching", task); assertFalse(hasTask("greetings batch_get(reqs: 2, ids: 2)", task.getTrace())); } @Test public void testGetRequestsWithDifferentCustomQueryParamsNoBatchingOverrides() { Task<?> t1 = _parseqClient.createTask(new GreetingsBuilders().get().id(1L) .addParam("K1", "V1").build(), overrides()); Task<?> t2 = _parseqClient.createTask(new GreetingsBuilders().get().id(2L) .addParam("K2", "V1").build(), overrides()); Task<?> task = Task.par(t1, t2); runAndWait(getTestClassName() + ".testGetRequestsWithDifferentCustomQueryParamsNoBatchingOverrides", task); assertFalse(hasTask("greetings batch_get(reqs: 2, ids: 2)", task.getTrace())); } @Test public void testGetRequestsWithError() { Task<String> task = Task.par(toMessage(greetingGet(1L)), toMessage(greetingGet(-1L)).recover(e -> "failed")) .map("combine", (x, y) -> x + y); runAndWait(getTestClassName() + ".testGetRequestsWithError", task); assertEquals(task.get(), "Good morning!failed"); if (expectBatching()) { assertTrue(hasTask("greetings batch_get(reqs: 2, ids: 2)", task.getTrace())); } else { assertFalse(hasTask("greetings batch_get(reqs: 2, ids: 2)", task.getTrace())); } } @Test public void testGetRequestsWithErrorOverrides() { Task<String> task = Task.par(toMessage(greetingGet(1L, overrides())), toMessage(greetingGet(-1L, overrides())).recover(e -> "failed")) .map("combine", (x, y) -> x + y); runAndWait(getTestClassName() + ".testGetRequestsWithErrorOverrides", task); assertEquals(task.get(), "Good morning!failed"); if (expectBatchingOverrides()) { assertTrue(hasTask("greetings batch_get(reqs: 2, ids: 2)", task.getTrace())); } else { assertFalse(hasTask("greetings batch_get(reqs: 2, ids: 2)", task.getTrace())); } } @Test public void testBatchGetRequests() { Task<?> task = Task.par(greetings(1L, 2L), greetings(3L, 4L)); runAndWait(getTestClassName() + ".testBatchGetRequests", task); if (expectBatching()) { assertTrue(hasTask("greetings batch_get(reqs: 2, ids: 4)", task.getTrace())); } else { assertFalse(hasTask("greetings batch_get(reqs: 2, ids: 4)", task.getTrace())); } } @Test public void testBatchGetRequestsOverrides() { Task<?> task = Task.par(greetings(overrides(), 1L, 2L), greetings(overrides(), 3L, 4L)); runAndWait(getTestClassName() + ".testBatchGetRequestsOverrides", task); if (expectBatchingOverrides()) { assertTrue(hasTask("greetings batch_get(reqs: 2, ids: 4)", task.getTrace())); } else { assertFalse(hasTask("greetings batch_get(reqs: 2, ids: 4)", task.getTrace())); } } @Test public void testGetAndBatchGetRequests() { Task<?> task = Task.par(greetingGet(1L), greetings(2L, 3L)); runAndWait(getTestClassName() + ".testGetAndBatchGetRequests", task); if (expectBatching()) { assertTrue(hasTask("greetings batch_get(reqs: 2, ids: 3)", task.getTrace())); } else { assertFalse(hasTask("greetings batch_get(reqs: 2, ids: 3)", task.getTrace())); } } @Test public void testGetAndBatchGetRequestsOverrides() { Task<?> task = Task.par(greetingGet(1L, overrides()), greetings(overrides(), 2L, 3L)); runAndWait(getTestClassName() + ".testGetAndBatchGetRequestsOverrides", task); if (expectBatchingOverrides()) { assertTrue(hasTask("greetings batch_get(reqs: 2, ids: 3)", task.getTrace())); } else { assertFalse(hasTask("greetings batch_get(reqs: 2, ids: 3)", task.getTrace())); } } @Test public void testSingleGetRequestIsNotBatched() { Task<?> task = greetingGet(1L); runAndWait(getTestClassName() + ".testSingleGetRequestIsNotBatched", task); assertFalse(hasTask("greetings batch_get(reqs: 1, ids: 1)", task.getTrace())); } @Test public void testSingleGetRequestIsNotBatchedOverrides() { Task<?> task = greetingGet(1L, overrides()); runAndWait(getTestClassName() + ".testSingleGetRequestIsNotBatchedOverrides", task); assertFalse(hasTask("greetings batch_get(reqs: 1, ids: 1)", task.getTrace())); } @Test public void testDuplicateGetRequestIsNotBatched() { Task<?> task = Task.par(greetingGet(1L), greetingGet(1L)); runAndWait(getTestClassName() + ".testDuplicateGetRequestIsNotBatched", task); assertFalse(hasTask("greetings batch_get(reqs: 1, ids: 1)", task.getTrace())); } @Test public void testDuplicateGetRequestIsNotBatchedOverrides() { Task<?> task = Task.par(greetingGet(1L, overrides()), greetingGet(1L, overrides())); runAndWait(getTestClassName() + ".testDuplicateGetRequestIsNotBatchedOverrides", task); assertFalse(hasTask("greetings batch_get(reqs: 1, ids: 1)", task.getTrace())); } @Test public void testBatchGet404() { try { setInboundRequestContext(new InboundRequestContextBuilder() .setName("withBatching") .build()); Task<?> task = Task.par(greetingGet(1L).map(Response::getEntity).map(Greeting::getMessage), greetingGet(2L).map(Response::getEntity).map(Greeting::getMessage), greetingGet(400L).map(Response::getEntity).map(Greeting::getMessage).recover(t -> t.toString())) .map((a, b, c) -> a + b + c); runAndWait(getTestClassName() + ".testBatchGet404", task); assertTrue(task.get().toString().contains("Good morning!")); assertTrue(task.get().toString().contains("Guten Morgen!")); assertTrue(task.get().toString().contains("com.linkedin.restli.client.RestLiResponseException: Response status 404")); } finally { clearInboundRequestContext(); } } }