blob: cf3ba575de0adab093af03704c52abe987a1fd6a [file] [log] [blame]
/*
* Copyright (c) 2017, 2019 Oracle and/or its affiliates. All rights reserved.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v. 2.0, which is available at
* http://www.eclipse.org/legal/epl-2.0.
*
* This Source Code may also be made available under the following Secondary
* Licenses when the conditions for such availability set forth in the
* Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
* version 2 with the GNU Classpath Exception, which is available at
* https://www.gnu.org/software/classpath/license.html.
*
* SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
*/
package org.glassfish.jersey.client;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.ScheduledThreadPoolExecutor;
import javax.ws.rs.NotFoundException;
import javax.ws.rs.client.Client;
import javax.ws.rs.client.ClientBuilder;
import javax.ws.rs.client.CompletionStageRxInvoker;
import javax.ws.rs.client.WebTarget;
import javax.ws.rs.core.GenericType;
import javax.ws.rs.core.Response;
import org.glassfish.jersey.internal.guava.ThreadFactoryBuilder;
import org.glassfish.jersey.process.JerseyProcessingUncaughtExceptionHandler;
import org.hamcrest.Matcher;
import org.junit.After;
import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.containsString;
import static org.hamcrest.Matchers.not;
import static org.hamcrest.core.Is.is;
/**
* @author Pavel Bucek
*/
public class JerseyCompletionStageRxInvokerTest {
private Client client;
private ExecutorService executor;
@Before
public void setUp() throws Exception {
client = ClientBuilder.newClient().register(TerminalClientRequestFilter.class);
executor = new ScheduledThreadPoolExecutor(1, new ThreadFactoryBuilder()
.setNameFormat("jersey-rx-client-test-%d")
.setUncaughtExceptionHandler(new JerseyProcessingUncaughtExceptionHandler())
.build());
}
@After
public void tearDown() throws Exception {
executor.shutdown();
client.close();
client = null;
}
@Test
public void testNewClient() throws Exception {
testClient(ClientBuilder.newClient().register(TerminalClientRequestFilter.class), false);
}
@Test
@Ignore("TODO JAX-RS 2.1")
public void testNewClientExecutor() throws Exception {
testClient(ClientBuilder.newBuilder()
.executorService(executor)
.build()
.register(TerminalClientRequestFilter.class), true);
}
@Test
public void testNotFoundResponse() throws Exception {
CompletionStageRxInvoker invoker = client.target("http://jersey.java.net")
.request()
.header("Response-Status", 404)
.rx();
testInvoker(invoker, 404, false);
}
@Test(expected = NotFoundException.class)
public void testNotFoundReadEntityViaClass() throws Throwable {
try {
client.target("http://jersey.java.net")
.request()
.header("Response-Status", 404)
.rx()
.get(String.class)
.toCompletableFuture()
.get();
} catch (final Exception expected) {
// java.util.concurrent.ExecutionException
throw expected
// javax.ws.rs.NotFoundException
.getCause();
}
}
@Test(expected = NotFoundException.class)
public void testNotFoundReadEntityViaGenericType() throws Throwable {
try {
client.target("http://jersey.java.net")
.request()
.header("Response-Status", 404)
.rx()
.get(new GenericType<String>() {
})
.toCompletableFuture()
.get();
} catch (final Exception expected) {
// java.util.concurrent.ExecutionException
throw expected
// javax.ws.rs.NotFoundException
.getCause();
}
}
@Test
public void testReadEntityViaClass() throws Throwable {
final String response = client.target("http://jersey.java.net")
.request()
.rx()
.get(String.class)
.toCompletableFuture()
.get();
assertThat(response, is("NO-ENTITY"));
}
@Test
public void testReadEntityViaGenericType() throws Throwable {
final String response = client.target("http://jersey.java.net")
.request()
.rx()
.get(new GenericType<String>() { })
.toCompletableFuture()
.get();
assertThat(response, is("NO-ENTITY"));
}
private void testClient(final Client rxClient, final boolean testDedicatedThread)
throws Exception {
testTarget(rxClient.target("http://jersey.java.net"), testDedicatedThread);
}
private void testTarget(final WebTarget rxTarget, boolean dedicatedThread)
throws Exception {
testInvoker(rxTarget.request().rx(), 200, dedicatedThread);
}
private void testInvoker(final CompletionStageRxInvoker rx,
final int expectedStatus,
final boolean testDedicatedThread) throws Exception {
testResponse(rx.get().toCompletableFuture().get(), expectedStatus, testDedicatedThread);
}
private static void testResponse(final Response response, final int expectedStatus, final boolean testDedicatedThread) {
assertThat(response.getStatus(), is(expectedStatus));
assertThat(response.readEntity(String.class), is("NO-ENTITY"));
// Executor.
final Matcher<String> matcher = containsString("jersey-rx-client-test");
assertThat(response.getHeaderString("Test-Thread"), testDedicatedThread ? matcher : not(matcher));
// Properties.
assertThat(response.getHeaderString("Test-Uri"), is("http://jersey.java.net"));
assertThat(response.getHeaderString("Test-Method"), is("GET"));
}
}