blob: e3be2f91c2905dfc22f04e90cec7c87b05c76fa4 [file] [log] [blame]
/*
* Copyright (c) 2012, 2018 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.io.IOException;
import java.net.URI;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.ws.rs.WebApplicationException;
import javax.ws.rs.client.ClientBuilder;
import javax.ws.rs.client.WebTarget;
import javax.ws.rs.core.UriBuilder;
import javax.ws.rs.ext.ReaderInterceptor;
import javax.ws.rs.ext.ReaderInterceptorContext;
import org.glassfish.jersey.uri.internal.JerseyUriBuilder;
import org.junit.Before;
import org.junit.Test;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.fail;
/**
* {@code JerseyWebTarget} implementation unit tests.
*
* @author Martin Matula
*/
public class JerseyWebTargetTest {
private JerseyClient client;
private JerseyWebTarget target;
@Before
public void setUp() {
this.client = (JerseyClient) ClientBuilder.newClient();
this.target = client.target("/");
}
@Test
public void testClose() {
client.close();
try {
target.getUriBuilder();
fail("IllegalStateException was expected.");
} catch (IllegalStateException e) {
// ignore
}
try {
target.getConfiguration();
fail("IllegalStateException was expected.");
} catch (IllegalStateException e) {
// ignore
}
}
public static class TestProvider implements ReaderInterceptor {
@Override
public Object aroundReadFrom(ReaderInterceptorContext context) throws IOException, WebApplicationException {
return context.proceed();
}
}
// Reproducer JERSEY-1637
@Test
public void testRegisterNullOrEmptyContracts() {
final TestProvider provider = new TestProvider();
target.register(TestProvider.class, (Class<?>[]) null);
assertFalse(target.getConfiguration().isRegistered(TestProvider.class));
target.register(provider, (Class<?>[]) null);
assertFalse(target.getConfiguration().isRegistered(TestProvider.class));
assertFalse(target.getConfiguration().isRegistered(provider));
target.register(TestProvider.class, new Class[0]);
assertFalse(target.getConfiguration().isRegistered(TestProvider.class));
target.register(provider, new Class[0]);
assertFalse(target.getConfiguration().isRegistered(TestProvider.class));
assertFalse(target.getConfiguration().isRegistered(provider));
}
@Test
public void testResolveTemplate() {
URI uri;
UriBuilder uriBuilder;
uri = target.resolveTemplate("a", "v").getUri();
assertEquals("/", uri.toString());
uri = target.path("{a}").resolveTemplate("a", "v").getUri();
assertEquals("/v", uri.toString());
uriBuilder = target.path("{a}").resolveTemplate("qqq", "qqq").getUriBuilder();
assertEquals("/{a}", uriBuilder.toTemplate());
uriBuilder = target.path("{a}").resolveTemplate("a", "v").resolveTemplate("a", "x").getUriBuilder();
assertEquals("/v", uriBuilder.build().toString());
try {
target.resolveTemplate(null, null);
fail("NullPointerException expected.");
} catch (NullPointerException ex) {
// expected
}
}
@Test
public void testResolveTemplate2() {
final JerseyWebTarget newTarget = target.path("path/{a}").queryParam("query", "{q}").resolveTemplate("a", "param-a");
final JerseyUriBuilder uriBuilder = (JerseyUriBuilder) newTarget.getUriBuilder();
uriBuilder.resolveTemplate("q", "param-q").resolveTemplate("a", "will-be-ignored");
assertEquals(URI.create("/path/param-a?query=param-q"), uriBuilder.build());
final UriBuilder uriBuilderNew = newTarget.resolveTemplate("a", "will-be-ignored").resolveTemplate("q",
"new-q").getUriBuilder();
assertEquals(URI.create("/path/param-a?query=new-q"), uriBuilderNew.build());
}
@Test
public void testResolveTemplate3() {
final JerseyWebTarget webTarget = target.path("path/{a}").path("{b}").queryParam("query", "{q}")
.resolveTemplate("a", "param-a").resolveTemplate("q", "param-q");
assertEquals("/path/param-a/{b}?query=param-q", webTarget.getUriBuilder().toTemplate());
// resolve b in webTarget
assertEquals(URI.create("/path/param-a/param-b?query=param-q"), webTarget.resolveTemplate("b",
"param-b").getUri());
// check that original webTarget has not been changed
assertEquals("/path/param-a/{b}?query=param-q", webTarget.getUriBuilder().toTemplate());
// resolve b in UriBuilder
assertEquals(URI.create("/path/param-a/param-b?query=param-q"), ((JerseyUriBuilder) webTarget.getUriBuilder())
.resolveTemplate("b", "param-b").build());
// resolve in build method
assertEquals(URI.create("/path/param-a/param-b?query=param-q"), ((JerseyUriBuilder) webTarget.getUriBuilder())
.build("param-b"));
}
@Test
public void testResolveTemplateFromEncoded() {
final String a = "a%20%3F/*/";
final String b = "/b/";
assertEquals("/path/a%20%3F/*///b/", target.path("path/{a}/{b}").resolveTemplateFromEncoded("a",
a).resolveTemplateFromEncoded("b", b).getUri().toString());
assertEquals("/path/a%2520%253F%2F*%2F/%2Fb%2F", target.path("path/{a}/{b}").resolveTemplate("a",
a).resolveTemplate("b", b).getUri().toString());
assertEquals("/path/a%2520%253F/*///b/", target.path("path/{a}/{b}").resolveTemplate("a",
a, false).resolveTemplate("b", b, false).getUri().toString());
}
@Test
public void testResolveTemplatesFromEncoded() {
Map<String, Object> map = new HashMap<String, Object>();
map.put("a", "a%20%3F/*/");
map.put("b", "/b/");
assertEquals("/path/a%20%3F/*///b/", target.path("path/{a}/{b}").resolveTemplatesFromEncoded(map).getUri()
.toString());
assertEquals("/path/a%2520%253F%2F*%2F/%2Fb%2F", target.path("path/{a}/{b}").resolveTemplates(map).getUri()
.toString());
assertEquals("/path/a%2520%253F/*///b/", target.path("path/{a}/{b}").resolveTemplates(map,
false).getUri().toString());
List<Map<String, Object>> corruptedTemplateValuesList = Arrays.asList(
null,
new HashMap<String, Object>() {{
put(null, "value");
}},
new HashMap<String, Object>() {{
put("name", null);
}},
new HashMap<String, Object>() {{
put("a", "foo");
put("name", null);
}},
new HashMap<String, Object>() {{
put("name", null);
put("a", "foo");
}}
);
for (final Map<String, Object> corruptedTemplateValues : corruptedTemplateValuesList) {
try {
target.path("path/{a}/{b}").resolveTemplatesFromEncoded(corruptedTemplateValues);
fail("NullPointerException expected. " + corruptedTemplateValues);
} catch (NullPointerException ex) {
// expected
} catch (Exception e) {
fail("NullPointerException expected for template values " + corruptedTemplateValues + ", caught: " + e);
}
}
for (final Map<String, Object> corruptedTemplateValues : corruptedTemplateValuesList) {
try {
target.path("path/{a}/{b}").resolveTemplates(corruptedTemplateValues);
fail("NullPointerException expected. " + corruptedTemplateValues);
} catch (NullPointerException ex) {
// expected
} catch (Exception e) {
fail("NullPointerException expected for template values " + corruptedTemplateValues + ", caught: " + e);
}
}
for (final Map<String, Object> corruptedTemplateValues : corruptedTemplateValuesList) {
for (final boolean encode : new boolean[]{true, false}) {
try {
target.path("path/{a}/{b}").resolveTemplates(corruptedTemplateValues, encode);
fail("NullPointerException expected. " + corruptedTemplateValues);
} catch (NullPointerException ex) {
// expected
} catch (Exception e) {
fail("NullPointerException expected for template values " + corruptedTemplateValues + ", caught: " + e);
}
}
}
}
@Test
public void testGetUriBuilder() {
final Map<String, Object> params = new HashMap<String, Object>(2);
params.put("a", "w1");
UriBuilder uriBuilder = target.path("{a}").resolveTemplate("a", "v1").resolveTemplates(params).getUriBuilder();
assertEquals("/v1", uriBuilder.build().toString());
}
@Test
public void testQueryParams() {
URI uri;
uri = target.path("a").queryParam("q", "v1", "v2").queryParam("q").getUri();
assertEquals("/a", uri.toString());
uri = target.path("a").queryParam("q", "v1", "v2").queryParam("q", (Object) null).getUri();
assertEquals("/a", uri.toString());
uri = target.path("a").queryParam("q", "v1", "v2").queryParam("q", (Object[]) null).getUri();
assertEquals("/a", uri.toString());
uri = target.path("a").queryParam("q", "v1", "v2").queryParam("q", new Object[]{}).getUri();
assertEquals("/a", uri.toString());
uri = target.path("a").queryParam("q", "v").getUri();
assertEquals("/a?q=v", uri.toString());
uri = target.path("a").queryParam("q1", "v1").queryParam("q2", "v2").queryParam("q1", (Object) null).getUri();
assertEquals("/a?q2=v2", uri.toString());
try {
target.queryParam("q", "v1", null, "v2", null);
fail("NullPointerException expected.");
} catch (NullPointerException ex) {
// expected
}
{
uri = target.path("a").queryParam("q1", "v1").queryParam("q2", "v2").queryParam("q1", "w1", "w2")
.queryParam("q2", (Object) null).getUri();
assertEquals("/a?q1=v1&q1=w1&q1=w2", uri.toString());
}
try {
target.queryParam(null);
fail("NullPointerException expected.");
} catch (NullPointerException ex) {
// expected
}
try {
target.queryParam(null, "param");
fail("NullPointerException expected.");
} catch (NullPointerException ex) {
// expected
}
try {
target.path("a").queryParam("q1", "v1").queryParam("q2", "v2").queryParam("q1", "w1", null)
.queryParam("q2", (Object) null);
fail("NullPointerException expected.");
} catch (NullPointerException ex) {
// expected
}
}
@Test
public void testMatrixParams() {
URI uri;
uri = target.path("a").matrixParam("q", "v1", "v2").matrixParam("q").getUri();
assertEquals("/a", uri.toString());
uri = target.path("a").matrixParam("q", "v1", "v2").matrixParam("q", (Object) null).getUri();
assertEquals("/a", uri.toString());
uri = target.path("a").matrixParam("q", "v1", "v2").matrixParam("q", (Object[]) null).getUri();
assertEquals("/a", uri.toString());
uri = target.path("a").matrixParam("q", "v1", "v2").matrixParam("q", new Object[]{}).getUri();
assertEquals("/a", uri.toString());
uri = target.path("a").matrixParam("q", "v").getUri();
assertEquals("/a;q=v", uri.toString());
uri = target.path("a").matrixParam("q1", "v1").matrixParam("q2", "v2").matrixParam("q1", (Object) null).getUri();
assertEquals("/a;q2=v2", uri.toString());
try {
target.matrixParam("q", "v1", null, "v2", null);
fail("NullPointerException expected.");
} catch (NullPointerException ex) {
// expected
}
}
@Test
public void testRemoveMatrixParams() {
WebTarget wt = target;
wt = wt.matrixParam("matrix1", "segment1");
wt = wt.path("path1");
wt = wt.matrixParam("matrix2", "segment1");
wt = wt.matrixParam("matrix2", new Object[]{null});
wt = wt.path("path2");
wt = wt.matrixParam("matrix1", "segment1");
wt = wt.matrixParam("matrix1", new Object[]{null});
wt = wt.path("path3");
URI uri = wt.getUri();
assertEquals("/;matrix1=segment1/path1/path2/path3", uri.toString());
}
@Test
public void testReplaceMatrixParam() {
WebTarget wt = target;
wt = wt.path("path1");
wt = wt.matrixParam("matrix10", "segment10-delete");
wt = wt.matrixParam("matrix11", "segment11");
wt = wt.matrixParam("matrix10", new Object[]{null});
wt = wt.path("path2");
wt = wt.matrixParam("matrix20", "segment20-delete");
wt = wt.matrixParam("matrix20", new Object[]{null});
wt = wt.matrixParam("matrix20", "segment20-delete-again");
wt = wt.matrixParam("matrix20", new Object[]{null});
wt = wt.path("path3");
wt = wt.matrixParam("matrix30", "segment30-delete");
wt = wt.matrixParam("matrix30", new Object[]{null});
wt = wt.matrixParam("matrix30", "segment30-delete-again");
wt = wt.matrixParam("matrix30", new Object[]{null});
wt = wt.matrixParam("matrix30", "segment30");
wt = wt.path("path4");
wt = wt.matrixParam("matrix40", "segment40-delete");
wt = wt.matrixParam("matrix40", new Object[]{null});
URI uri = wt.getUri();
assertEquals("/path1;matrix11=segment11/path2/path3;matrix30=segment30/path4", uri.toString());
}
@Test(expected = NullPointerException.class)
public void testQueryParamNull() {
WebTarget wt = target;
wt.queryParam(null);
}
@Test(expected = NullPointerException.class)
public void testPathNull() {
WebTarget wt = target;
wt.path(null);
}
@Test(expected = NullPointerException.class)
public void testResolveTemplateNull1() {
WebTarget wt = target;
wt.resolveTemplate(null, "", true);
}
@Test(expected = NullPointerException.class)
public void testResolveTemplateNull2() {
WebTarget wt = target;
wt.resolveTemplate("name", null, true);
}
@Test(expected = NullPointerException.class)
public void testResolveTemplateFromEncodedNull1() {
WebTarget wt = target;
wt.resolveTemplateFromEncoded(null, "");
}
@Test(expected = NullPointerException.class)
public void testResolveTemplateFromEncodedNull2() {
WebTarget wt = target;
wt.resolveTemplateFromEncoded("name", null);
}
@Test
public void testResolveTemplatesEncodedEmptyMap() {
WebTarget wt = target;
wt = wt.resolveTemplatesFromEncoded(Collections.<String, Object>emptyMap());
assertEquals(target, wt);
}
@Test
public void testResolveTemplatesEmptyMap() {
WebTarget wt = target;
wt = wt.resolveTemplates(Collections.<String, Object>emptyMap());
assertEquals(target, wt);
}
@Test
public void testResolveTemplatesEncodeSlashEmptyMap() {
WebTarget wt = target;
wt = wt.resolveTemplates(Collections.<String, Object>emptyMap(), false);
assertEquals(target, wt);
}
}