/**
 *
 * 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);
   }

}