/*
* Licensed to the Apache Software Foundation (ASF) under one or more contributor license
* agreements. See the NOTICE file distributed with this work for additional information regarding
* copyright ownership. The ASF licenses this file to You 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 org.apache.geode.management.internal.web.http;
import static org.junit.Assert.*;
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 org.jmock.Mockery;
import org.jmock.lib.legacy.ClassImposteriser;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.experimental.categories.Category;
import org.springframework.http.HttpEntity;
import org.springframework.http.MediaType;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
import org.apache.geode.management.internal.web.AbstractWebTestCase;
import org.apache.geode.management.internal.web.domain.Link;
import org.apache.geode.test.junit.categories.UnitTest;
/**
* The ClientHttpRequestJUnitTest class is a test suite of test cases testing the contract and
* functionality of the ClientHttpRequest class.
* <p/>
*
* @see org.apache.geode.management.internal.web.AbstractWebTestCase
* @see org.apache.geode.management.internal.web.http.ClientHttpRequest
* @see org.jmock.Mockery
* @see org.junit.Assert
* @see org.junit.Test
* @since GemFire 8.0
*/
@Category(UnitTest.class)
public class ClientHttpRequestJUnitTest extends AbstractWebTestCase {
private Mockery mockContext;
@Before
public void setUp() {
mockContext = new Mockery();
mockContext.setImposteriser(ClassImposteriser.INSTANCE);
}
@After
public void tearDown() {
mockContext.assertIsSatisfied();
mockContext = null;
}
@Test
public void testCreateClientHttpRequest() throws Exception {
final Link expectedLink = new Link("test", toUri("http://host.domain.com:8080/app/service"));
final ClientHttpRequest request = new ClientHttpRequest(expectedLink);
assertNotNull(request);
assertEquals(expectedLink, request.getLink());
}
@Test(expected = AssertionError.class)
public void testCreateClientHttpRequestWithNullLink() {
new ClientHttpRequest(null);
}
@Test
public void testGetMethod() throws Exception {
Link link = new Link("get-resource", toUri("http://host.domain.com:8080/app/resources/{id}"));
ClientHttpRequest request = new ClientHttpRequest(link);
assertEquals(link, request.getLink());
assertEquals(org.springframework.http.HttpMethod.GET, request.getMethod());
link = new Link("delete-resource", toUri("http://host.domain.com:8080/app/resources/{id}"),
HttpMethod.DELETE);
request = new ClientHttpRequest(link);
assertEquals(link, request.getLink());
assertEquals(org.springframework.http.HttpMethod.DELETE, request.getMethod());
link = new Link("delete-resource", toUri("http://host.domain.com:8080/app/service"),
HttpMethod.HEAD);
request = new ClientHttpRequest(link);
assertEquals(link, request.getLink());
assertEquals(org.springframework.http.HttpMethod.HEAD, request.getMethod());
link = new Link("delete-resource", toUri("http://host.domain.com:8080/app/service"),
HttpMethod.OPTIONS);
request = new ClientHttpRequest(link);
assertEquals(link, request.getLink());
assertEquals(org.springframework.http.HttpMethod.OPTIONS, request.getMethod());
link = new Link("delete-resource", toUri("http://host.domain.com:8080/app/resources"),
HttpMethod.POST);
request = new ClientHttpRequest(link);
assertEquals(link, request.getLink());
assertEquals(org.springframework.http.HttpMethod.POST, request.getMethod());
link = new Link("delete-resource", toUri("http://host.domain.com:8080/app/resources"),
HttpMethod.PUT);
request = new ClientHttpRequest(link);
assertEquals(link, request.getLink());
assertEquals(org.springframework.http.HttpMethod.PUT, request.getMethod());
link = new Link("delete-resource", toUri("http://host.domain.com:8080/app"), HttpMethod.TRACE);
request = new ClientHttpRequest(link);
assertEquals(link, request.getLink());
assertEquals(org.springframework.http.HttpMethod.TRACE, request.getMethod());
}
@Test
public void testIsDelete() throws Exception {
final Link expectedLink = new Link("delete",
toUri("http://host.domain.com:8080/app/resources/{id}"), HttpMethod.DELETE);
final ClientHttpRequest request = new ClientHttpRequest(expectedLink);
assertEquals(expectedLink, request.getLink());
assertTrue(request.isDelete());
assertFalse(request.isGet());
assertFalse(request.isPost());
assertFalse(request.isPut());
}
@Test
public void testIsGet() throws Exception {
final Link expectedLink =
new Link("get", toUri("http://host.domain.com:8080/app/resources/{id}"), HttpMethod.GET);
final ClientHttpRequest request = new ClientHttpRequest(expectedLink);
assertEquals(expectedLink, request.getLink());
assertFalse(request.isDelete());
assertTrue(request.isGet());
assertFalse(request.isPost());
assertFalse(request.isPut());
}
@Test
public void testIsPost() throws Exception {
final Link expectedLink =
new Link("post", toUri("http://host.domain.com:8080/app/resources"), HttpMethod.POST);
final ClientHttpRequest request = new ClientHttpRequest(expectedLink);
assertEquals(expectedLink, request.getLink());
assertFalse(request.isDelete());
assertFalse(request.isGet());
assertTrue(request.isPost());
assertFalse(request.isPut());
}
@Test
public void testIsPut() throws Exception {
final Link expectedLink =
new Link("put", toUri("http://host.domain.com:8080/app/resources/{id}"), HttpMethod.PUT);
final ClientHttpRequest request = new ClientHttpRequest(expectedLink);
assertEquals(expectedLink, request.getLink());
assertFalse(request.isDelete());
assertFalse(request.isGet());
assertFalse(request.isPost());
assertTrue(request.isPut());
}
@Test
public void testGetPathVariables() throws Exception {
final Link expectedLink = new Link("test",
toUri("http://host.domain.com:8080/app/libraries/{name}/books/{author}/{title}"));
final ClientHttpRequest request = new ClientHttpRequest(expectedLink);
assertEquals(expectedLink, request.getLink());
assertEquals(Arrays.asList("name", "author", "title"), request.getPathVariables());
}
@Test
public void testGetPathVariablesWithUriHavingNoPathVariables() throws Exception {
final Link expectedLink = new Link("test", toUri("http://host.domain.com:8080/app/service"));
final ClientHttpRequest request = new ClientHttpRequest(expectedLink);
assertEquals(expectedLink, request.getLink());
final List<String> actualPathVariables = request.getPathVariables();
assertNotNull(actualPathVariables);
assertTrue(actualPathVariables.isEmpty());
}
@Test
public void testGetURI() throws Exception {
final URI expectedURI = toUri("http://host.domain.com:8080/app/service");
final Link expectedLink = new Link("test", expectedURI);
final ClientHttpRequest request = new ClientHttpRequest(expectedLink);
assertEquals(expectedLink, request.getLink());
assertEquals(expectedURI, request.getURI());
}
@Test
public void testGetURLForGet() throws Exception {
final Link expectedLink = new Link("find",
toUri("http://host.domain.com:8080/app/libraries/{name}/books"), HttpMethod.GET);
final ClientHttpRequest request = new ClientHttpRequest(expectedLink);
request.addParameterValues("author", "Rowling");
request.addParameterValues("category", "science-fiction");
assertEquals(expectedLink, request.getLink());
assertEquals(
"http://host.domain.com:8080/app/libraries/amazon/books?author=Rowling&category=science-fiction",
toString(request.getURL(Collections.singletonMap("name", "amazon"))));
}
@Test
public void testGetURLForGetEncoded() throws Exception {
final Link expectedLink = new Link("readValue4Key",
toUri("http://host.domain.com:8080/app/regions/{region}/keys/{key}"), HttpMethod.GET);
final ClientHttpRequest request = new ClientHttpRequest(expectedLink);
final Map<String, Object> uriVariables = new HashMap<String, Object>(4);
uriVariables.put("region", "Customers/Accounts/Orders");
uriVariables.put("key", "123");
uriVariables.put("item", "456");
assertEquals(expectedLink, request.getLink());
assertEquals("http://host.domain.com:8080/app/regions/Customers%2FAccounts%2FOrders/keys/123",
toString(request.getURL(uriVariables)));
}
@Test
public void testGetURLForGetWithQueryParametersNoBody() throws Exception {
final Link expectedLink = new Link("find",
toUri("http://host.domain.com:8080/app/libraries/{name}/books/{author}"), HttpMethod.GET);
final ClientHttpRequest request = new ClientHttpRequest(expectedLink);
request.addParameterValues("author", "Rowling");
request.addParameterValues("category", "science-fiction");
request.addParameterValues("name", "Boston");
request.addParameterValues("year", "2007");
final Map<String, Object> uriVariables = new HashMap<String, Object>(4);
uriVariables.put("author", "Rowling");
uriVariables.put("category", "mystery");
uriVariables.put("isbn", "0-123456789");
uriVariables.put("name", "Amazon");
assertEquals(expectedLink, request.getLink());
assertEquals(
"http://host.domain.com:8080/app/libraries/Amazon/books/Rowling?category=science-fiction&year=2007",
toString(request.getURL(uriVariables)));
}
@Test
public void testGetURLForDelete() throws Exception {
final Link expectedLink = new Link("delete-all",
toUri("http://host.domain.com:8080/app/libraries/{name}/books"), HttpMethod.DELETE);
final ClientHttpRequest request = new ClientHttpRequest(expectedLink);
request.addParameterValues("category", "romance");
assertEquals(expectedLink, request.getLink());
assertEquals("http://host.domain.com:8080/app/libraries/congress/books?category=romance",
toString(request.getURL(Collections.singletonMap("name", "congress"))));
}
@Test
public void testGetURLForPost() throws Exception {
final Link expectedLink = new Link("post",
toUri("http://host.domain.com:8080/app/libraries/{name}/books"), HttpMethod.POST);
final ClientHttpRequest request = new ClientHttpRequest(expectedLink);
request.addParameterValues("author", "Douglas Adams");
request.addParameterValues("title", "The Hitchhiker's Guide to the Galaxy");
request.addParameterValues("year", "1979");
request.addParameterValues("isbn", "0345453743");
assertEquals(expectedLink, request.getLink());
assertEquals("http://host.domain.com:8080/app/libraries/royal/books",
toString(request.getURL(Collections.singletonMap("name", "royal"))));
}
@Test
public void testGetURLForPut() throws Exception {
final Link expectedLink = new Link("put",
toUri("http://host.domain.com:8080/app/libraries/{name}/books/{isbn}"), HttpMethod.PUT);
final ClientHttpRequest request = new ClientHttpRequest(expectedLink);
request.addParameterValues("year", "1983");
final Map<String, String> uriVariables = new HashMap<String, String>(2);
uriVariables.put("name", "royal");
uriVariables.put("isbn", "0345453743");
assertEquals(expectedLink, request.getLink());
assertEquals("http://host.domain.com:8080/app/libraries/royal/books/0345453743",
toString(request.getURL(uriVariables)));
}
@Test
public void testCreateRequestEntityForGet() throws Exception {
final Link expectedLink = new Link("find",
toUri("http://host.domain.com:8080/app/libraries/{name}/books"), HttpMethod.GET);
final ClientHttpRequest request = new ClientHttpRequest(expectedLink);
assertEquals(expectedLink, request.getLink());
request.addHeaderValues(HttpHeader.CONTENT_TYPE.getName(), MediaType.TEXT_PLAIN_VALUE);
request.addParameterValues("author", "Rowling");
request.addParameterValues("category", "science-fiction");
final HttpEntity<?> requestEntity = request.createRequestEntity();
assertNotNull(requestEntity);
assertNotNull(requestEntity.getHeaders());
assertEquals(MediaType.TEXT_PLAIN, requestEntity.getHeaders().getContentType());
assertNull(requestEntity.getBody());
}
@Test
public void testCreateRequestEntityForDelete() throws Exception {
final Link expectedLink = new Link("delete-all",
toUri("http://host.domain.com:8080/app/libraries/{name}/books"), HttpMethod.DELETE);
final ClientHttpRequest request = new ClientHttpRequest(expectedLink);
assertEquals(expectedLink, request.getLink());
request.addHeaderValues(HttpHeader.ACCEPT.getName(), MediaType.APPLICATION_JSON_VALUE);
request.addParameterValues("category", "romance");
final HttpEntity<?> requestEntity = request.createRequestEntity();
assertNotNull(requestEntity);
assertNotNull(requestEntity.getHeaders());
assertEquals(Collections.singletonList(MediaType.APPLICATION_JSON),
requestEntity.getHeaders().getAccept());
assertNull(requestEntity.getBody());
}
@Test
@SuppressWarnings("unchecked")
public void testCreateRequestEntityForPost() throws Exception {
final Link expectedLink = new Link("post",
toUri("http://host.domain.com:8080/app/libraries/{name}/books"), HttpMethod.POST);
final ClientHttpRequest request = new ClientHttpRequest(expectedLink);
assertEquals(expectedLink, request.getLink());
final MultiValueMap<String, Object> expectedRequestParameters =
new LinkedMultiValueMap<String, Object>(4);
expectedRequestParameters.add("author", "Douglas Adams");
expectedRequestParameters.add("title", "The Hitchhiker's Guide to the Galaxy");
expectedRequestParameters.add("year", "1979");
expectedRequestParameters.add("isbn", "0345453743");
request.addHeaderValues(HttpHeader.CONTENT_TYPE.getName(),
MediaType.APPLICATION_FORM_URLENCODED_VALUE);
request.addParameterValues("author", expectedRequestParameters.getFirst("author"));
request.addParameterValues("title", expectedRequestParameters.getFirst("title"));
request.addParameterValues("year", expectedRequestParameters.getFirst("year"));
request.addParameterValues("isbn", expectedRequestParameters.getFirst("isbn"));
final HttpEntity<MultiValueMap<String, Object>> requestEntity =
(HttpEntity<MultiValueMap<String, Object>>) request.createRequestEntity();
assertNotNull(requestEntity);
assertNotNull(requestEntity.getHeaders());
assertEquals(MediaType.APPLICATION_FORM_URLENCODED,
requestEntity.getHeaders().getContentType());
assertEquals(expectedRequestParameters, requestEntity.getBody());
}
@Test
@SuppressWarnings("unchecked")
public void testCreateRequestEntityForPut() throws Exception {
final Link expectedLink = new Link("put",
toUri("http://host.domain.com:8080/app/libraries/{name}/books/{isbn}"), HttpMethod.PUT);
final ClientHttpRequest request = new ClientHttpRequest(expectedLink);
assertEquals(expectedLink, request.getLink());
final MultiValueMap<String, Object> expectedRequestParameters =
new LinkedMultiValueMap<String, Object>(4);
expectedRequestParameters.add("year", "1979");
request.addHeaderValues(HttpHeader.ACCEPT.getName(), MediaType.TEXT_XML_VALUE);
request.addHeaderValues(HttpHeader.CONTENT_TYPE.getName(),
MediaType.APPLICATION_FORM_URLENCODED_VALUE);
request.addParameterValues("year", expectedRequestParameters.getFirst("year"));
final HttpEntity<MultiValueMap<String, Object>> requestEntity =
(HttpEntity<MultiValueMap<String, Object>>) request.createRequestEntity();
assertNotNull(requestEntity);
assertNotNull(requestEntity.getHeaders());
assertEquals(Collections.singletonList(MediaType.TEXT_XML),
requestEntity.getHeaders().getAccept());
assertEquals(MediaType.APPLICATION_FORM_URLENCODED,
requestEntity.getHeaders().getContentType());
assertEquals(expectedRequestParameters, requestEntity.getBody());
}
@Test
public void testCreateRequestEntityOnPost() throws Exception {
final Library mockLibrary =
mockContext.mock(Library.class, "testCreateRequestEntityOnPost.Library");
final Link expectedLink =
new Link("post", toUri("http://host.domain.com:8080/app/libraries"), HttpMethod.POST);
final ClientHttpRequest request = new ClientHttpRequest(expectedLink);
assertEquals(expectedLink, request.getLink());
assertTrue(request.isPost());
assertNull(request.getContent());
request.setContent(mockLibrary);
assertSame(mockLibrary, request.getContent());
final HttpEntity<?> requestEntity = request.createRequestEntity();
assertNotNull(requestEntity);
assertTrue(requestEntity.getBody() instanceof Library);
}
@Test
public void testCreateRequestEntityOnPut() throws Exception {
final Book mockBook = mockContext.mock(Book.class, "testCreateRequestEntityOnPut.Book");
final Link expectedLink = new Link("put",
toUri("http://host.domain.com:8080/app/libraries/{name}/books/{id}"), HttpMethod.PUT);
final ClientHttpRequest request = new ClientHttpRequest(expectedLink);
assertEquals(expectedLink, request.getLink());
assertTrue(request.isPut());
assertNull(request.getContent());
request.setContent(mockBook);
request.addParameterValues("isbn", "0-123456789");
request.addParameterValues("category", "science-fiction", "sci-fi", "fiction");
assertSame(mockBook, request.getContent());
assertEquals("0-123456789", request.getParameterValue("isbn"));
assertTrue(request.getParameterValues("category")
.containsAll(Arrays.asList("science-fiction", "sci-fi", "fiction")));
final HttpEntity<?> requestEntity = request.createRequestEntity();
assertNotNull(requestEntity);
assertTrue(requestEntity.getBody() instanceof MultiValueMap);
assertEquals(MediaType.APPLICATION_FORM_URLENCODED,
requestEntity.getHeaders().getContentType());
}
@Test
public void testSetAndGetHeaderValues() throws Exception {
final Link expectedLink =
new Link("put", toUri("http://host.domain.com:8080/app/libraries"), HttpMethod.PUT);
final ClientHttpRequest request = new ClientHttpRequest(expectedLink);
assertEquals(expectedLink, request.getLink());
assertTrue(request.getHeaders().isEmpty());
request.addHeaderValues(HttpHeader.CONTENT_TYPE.getName(), MediaType.APPLICATION_JSON_VALUE);
request.addHeaderValues(HttpHeader.ACCEPT.getName(), MediaType.APPLICATION_JSON_VALUE,
MediaType.APPLICATION_XML_VALUE, MediaType.TEXT_PLAIN_VALUE);
assertEquals(MediaType.APPLICATION_JSON_VALUE,
request.getHeaderValue(HttpHeader.CONTENT_TYPE.getName()));
assertEquals(1, request.getHeaderValues(HttpHeader.CONTENT_TYPE.getName()).size());
assertEquals(MediaType.APPLICATION_JSON_VALUE,
request.getHeaderValue(HttpHeader.ACCEPT.getName()));
assertEquals(3, request.getHeaderValues(HttpHeader.ACCEPT.getName()).size());
assertTrue(request.getHeaderValues(HttpHeader.ACCEPT.getName())
.containsAll(Arrays.asList(MediaType.APPLICATION_JSON_VALUE,
MediaType.APPLICATION_XML_VALUE, MediaType.TEXT_PLAIN_VALUE)));
request.setHeader(HttpHeader.ACCEPT.getName(), MediaType.APPLICATION_OCTET_STREAM_VALUE);
assertEquals(MediaType.APPLICATION_OCTET_STREAM_VALUE,
request.getHeaderValue(HttpHeader.ACCEPT.getName()));
assertEquals(1, request.getHeaderValues(HttpHeader.ACCEPT.getName()).size());
assertTrue(request.getHeaderValues(HttpHeader.ACCEPT.getName())
.containsAll(Arrays.asList(MediaType.APPLICATION_OCTET_STREAM_VALUE)));
}
@Test
public void testSetAndGetParameterValues() throws Exception {
final Link expectedLink =
new Link("put", toUri("http://host.domain.com:8080/app/libraries"), HttpMethod.PUT);
final ClientHttpRequest request = new ClientHttpRequest(expectedLink);
assertEquals(expectedLink, request.getLink());
assertTrue(request.getParameters().isEmpty());
request.addParameterValues("parameterOne", "value");
request.addParameterValues("parameterTwo", "test", "testing", "tested");
assertEquals("value", request.getParameterValue("parameterOne"));
assertEquals(1, request.getParameterValues("parameterOne").size());
assertEquals("test", request.getParameterValue("parameterTwo"));
assertEquals(3, request.getParameterValues("parameterTwo").size());
assertTrue(request.getParameterValues("parameterTwo")
.containsAll(Arrays.asList("test", "testing", "tested")));
request.setParameter("parameterTwo", "development");
assertEquals("development", request.getParameterValue("parameterTwo"));
assertEquals(1, request.getParameterValues("parameterTwo").size());
assertTrue(
request.getParameterValues("parameterTwo").containsAll(Arrays.asList("development")));
}
@SuppressWarnings("unused")
private static interface Library {
public String getName();
}
@SuppressWarnings("unused")
private static interface Book {
public String getAuthor();
public String getIsbn();
public String getTitle();
public Integer getYear();
}
}