/*
* Copyright 2011-2017 Amazon.com, Inc. or its affiliates. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License").
* You may not use this file except in compliance with the License.
* A copy of the License is located at
*
* http://aws.amazon.com/apache2.0
*
* or in the "license" file accompanying this file. This file 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.amazonaws.util;
import com.amazonaws.DefaultRequest;
import com.amazonaws.Request;
import com.amazonaws.SdkClientException;
import org.junit.Test;
import org.junit.experimental.runners.Enclosed;
import org.junit.runner.RunWith;
import java.net.URI;
import java.net.URL;
import java.util.Arrays;
import static org.junit.Assert.assertEquals;
/**
* Unit tests for utility methods in {@link RuntimeHttpUtils}.
*/
@RunWith(Enclosed.class)
public class RuntimeHttpUtilsTest {
/**
* Unit tests for {@link RuntimeHttpUtils#convertRequestToUrl(Request, boolean, boolean)}.
*/
public static class ConvertRequestToUrlTest {
private static final URI ENDPOINT = URI.create("https://test.amazonaws.com");
@Test
public void plainTextPathAndQuery_PathWithoutLeadingSlash() {
Request<?> request = newRequest();
request.setResourcePath("foo/bar");
request.withParameter("queryOne", "valOne")
.withParameter("queryTwo", "valTwo");
URL url = RuntimeHttpUtils.convertRequestToUrl(request, false, true);
assertUrlEquals("https://test.amazonaws.com/foo/bar?queryOne=valOne&queryTwo=valTwo", url);
}
@Test
public void pathWithLeadingSlash_RemovedWhenRemoveLeadingSlashSetToTrue() {
Request<?> request = newRequest();
request.setResourcePath("/foo/bar");
URL url = RuntimeHttpUtils.convertRequestToUrl(request, true, true);
assertUrlEquals("https://test.amazonaws.com/foo/bar", url);
}
@Test
public void pathWithLeadingSlash_EncodedWhenRemoveLeadingSlashSetToFalse() {
Request<?> request = newRequest();
request.setResourcePath("/foo/bar");
URL url = RuntimeHttpUtils.convertRequestToUrl(request, false, true);
assertUrlEquals("https://test.amazonaws.com/%2Ffoo/bar", url);
}
@Test
public void pathWithWhitespace_UrlEncodedWhenFlagSetToTrue() {
Request<?> request = newRequest();
request.setResourcePath("foo bar");
URL url = RuntimeHttpUtils.convertRequestToUrl(request, false, true);
assertUrlEquals("https://test.amazonaws.com/foo%20bar", url);
}
@Test
public void pathWithWhitespace_NotUrlEncodedWhenFlagSetToFalse() {
Request<?> request = newRequest();
request.setResourcePath("foo bar");
URL url = RuntimeHttpUtils.convertRequestToUrl(request, false, false);
assertUrlEquals("https://test.amazonaws.com/foo bar", url);
}
@Test
public void pathWithLeadingSlash_DoubleSlashStillUrlEncodedWhenUrlEncodeSetToFalse() {
Request<?> request = newRequest();
request.setResourcePath("/foo/bar");
URL url = RuntimeHttpUtils.convertRequestToUrl(request, false, false);
assertUrlEquals("https://test.amazonaws.com/%2Ffoo/bar", url);
}
@Test
public void doubleSlashWithinPath_UrlEncoded() {
Request<?> request = newRequest();
request.setResourcePath("foo//bar");
URL url = RuntimeHttpUtils.convertRequestToUrl(request, false, false);
assertUrlEquals("https://test.amazonaws.com/foo/%2Fbar", url);
}
@Test
public void queryParamValuesWithWhitespace_UrlEncoded() {
Request<?> request = newRequest();
request.setResourcePath("foo/bar");
request.withParameter("queryOne", "val one");
request.withParameter("queryTwo", "valTwo");
URL url = RuntimeHttpUtils.convertRequestToUrl(request, false, false);
assertUrlEquals("https://test.amazonaws.com/foo/bar?queryOne=val%20one&queryTwo=valTwo", url);
}
@Test
public void queryParamKeyWithWhitespace_UrlEnocded() {
Request<?> request = newRequest();
request.setResourcePath("foo/bar");
request.withParameter("query one", "valOne");
request.withParameter("queryTwo", "valTwo");
URL url = RuntimeHttpUtils.convertRequestToUrl(request, false, false);
assertUrlEquals("https://test.amazonaws.com/foo/bar?query%20one=valOne&queryTwo=valTwo", url);
}
@Test
public void queryParamWithMultipleValue_OrderingIsPreserved() {
Request<?> request = newRequest();
request.setResourcePath("foo/bar");
request.addParameters("queryList", Arrays.asList("foo", "bar", "baz"));
URL url = RuntimeHttpUtils.convertRequestToUrl(request, false, false);
assertUrlEquals("https://test.amazonaws.com/foo/bar?queryList=foo&queryList=bar&queryList=baz", url);
}
@Test(expected = SdkClientException.class)
public void endpointWithoutProtocol_ThrowsSdkClientException() {
Request<?> request = new DefaultRequest<Object>("foo");
request.setEndpoint(URI.create("foo.amazon.com"));
request.setResourcePath("foo/bar");
RuntimeHttpUtils.convertRequestToUrl(request, false, false);
}
private Request<?> newRequest() {
Request<?> request = new DefaultRequest<Object>("foo");
request.setEndpoint(ENDPOINT);
return request;
}
private void assertUrlEquals(String expected, URL actual) {
assertEquals(expected, actual.toExternalForm());
}
}
}