/**
 *
 * 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.concurrent;

import static org.jclouds.concurrent.ConcurrentUtils.makeListenable;
import static org.jclouds.util.Utils.propagateOrNull;
import static org.testng.Assert.assertEquals;

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;

import org.testng.annotations.Test;

import com.google.common.base.Function;
import com.google.common.base.Throwables;
import com.google.common.collect.Iterables;
import com.google.common.util.concurrent.Executors;
import com.google.common.util.concurrent.ListenableFuture;

/**
 * Tests behavior of ListenableFutureExceptionParser
 * 
 * @author Adrian Cole
 */
@Test(groups = "unit", testName = "concurrent.ListenableFutureExceptionParserTest")
public class FutureExceptionParserTest {
   ExecutorService executorService = Executors.sameThreadExecutor();

   @Test
   public void testGet() throws InterruptedException, ExecutionException {
      ListenableFuture<?> future = createListenableFuture(new RuntimeException("foo"));
      assertEquals(future.get(), "foo");
   }

   @Test(expectedExceptions = Exception.class)
   public void testGetUnmatched() throws InterruptedException, ExecutionException {
      ListenableFuture<?> future = createListenableFuture(new Exception("foo"));
      assertEquals(future.get(), "foo");
   }

   @Test
   public void testGetLongTimeUnit() throws InterruptedException, ExecutionException,
            TimeoutException {
      ListenableFuture<?> future = createListenableFuture(new RuntimeException("foo"));
      assertEquals(future.get(1, TimeUnit.SECONDS), "foo");
   }

   @Test(expectedExceptions = Exception.class)
   public void testGetLongTimeUnitUnmatched() throws InterruptedException, ExecutionException,
            TimeoutException {
      ListenableFuture<?> future = createListenableFuture(new Exception("foo"));
      assertEquals(future.get(1, TimeUnit.SECONDS), "foo");
   }

   @SuppressWarnings("unchecked")
   private ListenableFuture<?> createListenableFuture(final Exception exception) {
      ListenableFuture<?> future = makeListenable(executorService.submit(new Callable<String>() {

         public String call() throws Exception {
            throw exception;
         }

      }), executorService);

      future = new FutureExceptionParser(future, new Function<Exception, String>() {

         public String apply(Exception from) {
            if (Iterables.size(Iterables.filter(Throwables.getCausalChain(from),
                     RuntimeException.class)) >= 1)
               return from.getMessage();
            return String.class.cast(propagateOrNull(from));
         }

      });
      return future;
   }

}
