blob: eacbbed20adbb5ea0603b8029a5e9c98acbef1f0 [file] [log] [blame]
/**
*
* Copyright (C) 2009 Cloud Conscious, LLC. <info@cloudconscious.com>
*
* ====================================================================
* 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 org.jclouds.http;
import static org.testng.Assert.assertEquals;
import static org.testng.Assert.fail;
import java.io.IOException;
import java.util.Properties;
import java.util.concurrent.ExecutionException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.jclouds.http.config.JavaUrlHttpCommandExecutorServiceModule;
import org.jclouds.http.handlers.BackoffLimitedRetryHandler;
import org.mortbay.jetty.Request;
import org.testng.annotations.Test;
import com.google.inject.Module;
/**
* Tests the retry behavior of the default {@link RetryHandler} implementation
* {@link BackoffLimitedRetryHandler} to ensure that retries up to the default limit succeed.
*
* TODO: Should either explicitly set retry limit or get it from Guice, rather than assuming it's 5.
*
* @author James Murty
*/
@Test(sequential = true)
public class BackoffLimitedRetryJavaIntegrationTest extends BaseJettyTest {
private int beginToFailOnRequestNumber = 0;
private int endFailuresOnRequestNumber = 0;
private int requestCount = 0;
@Override
protected void addConnectionProperties(Properties props) {
}
@Override
protected Module createConnectionModule() {
return new JavaUrlHttpCommandExecutorServiceModule();
}
@Override
protected boolean failEveryTenRequests(HttpServletRequest request, HttpServletResponse response)
throws IOException {
requestCount++;
boolean shouldFail = requestCount >= beginToFailOnRequestNumber
&& requestCount <= endFailuresOnRequestNumber;
if (shouldFail) {
response.sendError(500);
((Request) request).setHandled(true);
return true;
} else {
return false;
}
}
protected String submitGetRequest() throws InterruptedException, ExecutionException {
return client.download("");
}
@Test
public void testNoRetriesSuccessful() throws InterruptedException, ExecutionException {
beginToFailOnRequestNumber = 1;
endFailuresOnRequestNumber = 1;
requestCount = 0;
assertEquals(submitGetRequest().trim(), XML);
}
@Test
public void testSingleRetrySuccessful() throws InterruptedException, ExecutionException {
beginToFailOnRequestNumber = 0;
endFailuresOnRequestNumber = 1;
requestCount = 0;
assertEquals(submitGetRequest().trim(), XML);
}
@Test
public void testMaximumRetriesSuccessful() throws InterruptedException, ExecutionException {
beginToFailOnRequestNumber = 0;
endFailuresOnRequestNumber = 5;
requestCount = 0;
assertEquals(submitGetRequest().trim(), XML);
}
@Test
public void testMaximumRetriesExceeded() throws InterruptedException, ExecutionException {
beginToFailOnRequestNumber = 0;
endFailuresOnRequestNumber = 6;
requestCount = 0;
try {
submitGetRequest();
fail("Request should not succeed within " + endFailuresOnRequestNumber + " requests");
} catch (HttpResponseException e) {
assertEquals(e.getResponse().getStatusCode(), 500);
}
}
@Test
public void testInterleavedSuccessesAndFailures() throws InterruptedException,
ExecutionException {
beginToFailOnRequestNumber = 3;
endFailuresOnRequestNumber = 3 + 5; // Force third request to fail completely
requestCount = 0;
assertEquals(submitGetRequest().trim(), XML);
assertEquals(submitGetRequest().trim(), XML);
try {
submitGetRequest();
fail("Third request should not succeed by attempt number " + requestCount);
} catch (HttpResponseException e) {
assertEquals(e.getResponse().getStatusCode(), 500);
}
assertEquals(submitGetRequest().trim(), XML);
}
}