@ -1,5 +1,5 @@
@@ -1,5 +1,5 @@
/ *
* Copyright 2002 - 2010 the original author or authors .
* Copyright 2002 - 2012 the original author or authors .
*
* Licensed under the Apache License , Version 2 . 0 ( the "License" ) ;
* you may not use this file except in compliance with the License .
@ -20,31 +20,31 @@ import java.util.concurrent.Callable;
@@ -20,31 +20,31 @@ import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException ;
import java.util.concurrent.Future ;
import junit.framework.Assert ;
import static junit.framework.Assert.* ;
import org.junit.Before ;
import org.junit.Test ;
import org.springframework.core.task.SimpleAsyncTaskExecutor ;
import org.springframework.scheduling.annotation.Async ;
import org.springframework.scheduling.annotation.AsyncResult ;
import static org.junit.Assert.* ;
/ * *
* Unit tests for { @link AnnotationAsyncExecutionAspect } .
*
* @author Ramnivas Laddad
* /
public class AnnotationAsyncExecutionAspectTests {
private static final long WAIT_TIME = 1000 ; //milli seconds
private static final long WAIT_TIME = 1000 ; //milliseconds
private CountingExecutor executor ;
@Before
public void setUp ( ) {
executor = new CountingExecutor ( ) ;
AnnotationAsyncExecutionAspect . aspectOf ( ) . setExecutor ( executor ) ;
}
@Test
public void asyncMethodGetsRoutedAsynchronously ( ) {
ClassWithoutAsyncAnnotation obj = new ClassWithoutAsyncAnnotation ( ) ;
@ -54,7 +54,7 @@ public class AnnotationAsyncExecutionAspectTests {
@@ -54,7 +54,7 @@ public class AnnotationAsyncExecutionAspectTests {
assertEquals ( 1 , executor . submitStartCounter ) ;
assertEquals ( 1 , executor . submitCompleteCounter ) ;
}
@Test
public void asyncMethodReturningFutureGetsRoutedAsynchronouslyAndReturnsAFuture ( ) throws InterruptedException , ExecutionException {
ClassWithoutAsyncAnnotation obj = new ClassWithoutAsyncAnnotation ( ) ;
@ -73,8 +73,8 @@ public class AnnotationAsyncExecutionAspectTests {
@@ -73,8 +73,8 @@ public class AnnotationAsyncExecutionAspectTests {
assertEquals ( 1 , obj . counter ) ;
assertEquals ( 0 , executor . submitStartCounter ) ;
assertEquals ( 0 , executor . submitCompleteCounter ) ;
}
}
@Test
public void voidMethodInAsyncClassGetsRoutedAsynchronously ( ) {
ClassWithAsyncAnnotation obj = new ClassWithAsyncAnnotation ( ) ;
@ -102,13 +102,14 @@ public class AnnotationAsyncExecutionAspectTests {
@@ -102,13 +102,14 @@ public class AnnotationAsyncExecutionAspectTests {
assertEquals ( 5 , returnValue ) ;
assertEquals ( 0 , executor . submitStartCounter ) ;
assertEquals ( 0 , executor . submitCompleteCounter ) ;
}
}
@SuppressWarnings ( "serial" )
private static class CountingExecutor extends SimpleAsyncTaskExecutor {
int submitStartCounter ;
int submitCompleteCounter ;
@Override
public < T > Future < T > submit ( Callable < T > task ) {
submitStartCounter + + ;
@ -119,52 +120,56 @@ public class AnnotationAsyncExecutionAspectTests {
@@ -119,52 +120,56 @@ public class AnnotationAsyncExecutionAspectTests {
}
return future ;
}
public synchronized void waitForCompletion ( ) {
try {
wait ( WAIT_TIME ) ;
} catch ( InterruptedException e ) {
Assert . fail ( "Didn't finish the async job in " + WAIT_TIME + " milliseconds" ) ;
fail ( "Didn't finish the async job in " + WAIT_TIME + " milliseconds" ) ;
}
}
}
static class ClassWithoutAsyncAnnotation {
int counter ;
@Async public void incrementAsync ( ) {
counter + + ;
}
public void increment ( ) {
counter + + ;
}
@Async public Future < Integer > incrementReturningAFuture ( ) {
counter + + ;
return new AsyncResult < Integer > ( 5 ) ;
}
// It should be an error to attach @Async to a method that returns a non-void
// or non-Future.
// We need to keep this commented out, otherwise there will be a compile-time error.
// Please uncomment and re-comment this periodically to check that the compiler
// produces an error message due to the 'declare error' statement
// in AnnotationAsyncExecutionAspect
/ * *
* It should raise an error to attach @Async to a method that returns a non - void
* or non - Future . This method must remain commented - out , otherwise there will be a
* compile - time error . Uncomment to manually verify that the compiler produces an
* error message due to the ' declare error ' statement in
* { @link AnnotationAsyncExecutionAspect } .
* /
// @Async public int getInt() {
// return 0;
// }
}
@Async
static class ClassWithAsyncAnnotation {
int counter ;
public void increment ( ) {
counter + + ;
}
// Manually check that there is a warning from the 'declare warning' statement in AnnotationAsynchExecutionAspect
// Manually check that there is a warning from the 'declare warning' statement in
// AnnotationAsyncExecutionAspect
public int return5 ( ) {
return 5 ;
}