/*
* Copyright (c) 2011 Google 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.google.api.client.http.apache;
import com.google.api.client.testing.http.apache.MockHttpClient;
import com.google.api.client.util.ByteArrayStreamingContent;
import com.google.api.client.util.StringUtils;
import junit.framework.TestCase;
import org.apache.http.HttpVersion;
import org.apache.http.client.HttpClient;
import org.apache.http.client.params.ClientPNames;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.impl.client.DefaultHttpRequestRetryHandler;
import org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager;
import org.apache.http.params.CoreConnectionPNames;
import org.apache.http.params.HttpParams;
import org.apache.http.params.HttpProtocolParams;
/**
* Tests {@link ApacheHttpTransport}.
*
* @author Yaniv Inbar
*/
public class ApacheHttpTransportTest extends TestCase {
public void testApacheHttpTransport() {
ApacheHttpTransport transport = new ApacheHttpTransport();
DefaultHttpClient httpClient = (DefaultHttpClient) transport.getHttpClient();
checkDefaultHttpClient(httpClient);
checkHttpClient(httpClient);
}
public void testApacheHttpTransportWithParam() {
ApacheHttpTransport transport = new ApacheHttpTransport(new DefaultHttpClient());
checkHttpClient(transport.getHttpClient());
}
public void testNewDefaultHttpClient() {
checkDefaultHttpClient(ApacheHttpTransport.newDefaultHttpClient());
}
public void testRequestsWithContent() throws Exception {
ApacheHttpTransport transport = new ApacheHttpTransport(new MockHttpClient());
// Test GET.
subtestUnsupportedRequestsWithContent(
transport.buildRequest("GET", "http://www.test.url"), "GET");
// Test DELETE.
subtestUnsupportedRequestsWithContent(
transport.buildRequest("DELETE", "http://www.test.url"), "DELETE");
// Test HEAD.
subtestUnsupportedRequestsWithContent(
transport.buildRequest("HEAD", "http://www.test.url"), "HEAD");
// Test PUT.
execute(transport.buildRequest("PUT", "http://www.test.url"));
// Test POST.
execute(transport.buildRequest("POST", "http://www.test.url"));
// Test PATCH.
execute(transport.buildRequest("PATCH", "http://www.test.url"));
}
private void subtestUnsupportedRequestsWithContent(ApacheHttpRequest request, String method)
throws Exception {
try {
execute(request);
fail("expected " + IllegalArgumentException.class);
} catch (IllegalArgumentException e) {
// expected
assertEquals(e.getMessage(),
"Apache HTTP client does not support " + method + " requests with content.");
}
}
private void execute(ApacheHttpRequest request) throws Exception {
byte[] bytes = StringUtils.getBytesUtf8("abc");
request.setStreamingContent(new ByteArrayStreamingContent(bytes));
request.setContentType("text/html");
request.setContentLength(bytes.length);
request.execute();
}
private void checkDefaultHttpClient(DefaultHttpClient client) {
HttpParams params = client.getParams();
assertTrue(client.getConnectionManager() instanceof ThreadSafeClientConnManager);
assertEquals(8192, params.getIntParameter(CoreConnectionPNames.SOCKET_BUFFER_SIZE, -1));
DefaultHttpRequestRetryHandler retryHandler =
(DefaultHttpRequestRetryHandler) client.getHttpRequestRetryHandler();
assertEquals(0, retryHandler.getRetryCount());
assertFalse(retryHandler.isRequestSentRetryEnabled());
}
private void checkHttpClient(HttpClient client) {
HttpParams params = client.getParams();
assertFalse(params.getBooleanParameter(ClientPNames.HANDLE_REDIRECTS, true));
assertEquals(HttpVersion.HTTP_1_1, HttpProtocolParams.getVersion(params));
}
}