Skip to content

Commit

Permalink
Merge pull request #6 from spotify/krka/tests
Browse files Browse the repository at this point in the history
Add more tests
  • Loading branch information
spkrka committed Feb 23, 2015
2 parents 7d8aa84 + 48b782a commit 080f96e
Show file tree
Hide file tree
Showing 3 changed files with 211 additions and 29 deletions.
63 changes: 34 additions & 29 deletions src/test/java/com/spotify/futures/AsyncRetrierTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -19,40 +19,30 @@
import com.google.common.base.Predicate;
import com.google.common.base.Supplier;
import com.google.common.util.concurrent.ListenableFuture;

import org.jmock.lib.concurrent.DeterministicScheduler;
import org.junit.Before;
import org.junit.Test;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.mockito.invocation.InvocationOnMock;
import org.mockito.stubbing.Answer;

import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

import static com.google.common.util.concurrent.Futures.immediateFailedFuture;
import static com.google.common.util.concurrent.Futures.immediateFuture;
import static com.google.common.util.concurrent.Uninterruptibles.getUninterruptibly;
import static java.util.concurrent.TimeUnit.MILLISECONDS;
import static java.util.concurrent.TimeUnit.SECONDS;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.anyLong;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.reset;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyZeroInteractions;
import static org.mockito.Mockito.when;

public class AsyncRetrierTest {

@Mock
Supplier<ListenableFuture<String>> fun;

@Mock
ScheduledExecutorService executorService;
DeterministicScheduler executorService = new DeterministicScheduler();

AsyncRetrier retrier;

Expand All @@ -67,46 +57,50 @@ public void setUp() throws Exception {

when(fun.get()).thenReturn(f1, f2, f3, f4);

when(executorService.schedule(any(Runnable.class), anyLong(), any(TimeUnit.class)))
.then(new Answer<Object>() {
@Override
public Object answer(InvocationOnMock invocation) throws Throwable {
Runnable command = (Runnable) invocation.getArguments()[0];
command.run();
return null;
}
});

retrier = AsyncRetrier.create(executorService);
}

@Test
public void testRetry() throws Exception {
ListenableFuture<String> retry = retrier.retry(fun, 5, 0);

executorService.tick(1, MILLISECONDS);
assertTrue(retry.isDone());

String s = getUninterruptibly(retry);

assertEquals("success", s);
verifyZeroInteractions(executorService);
}

@Test
public void testRetryDelayMillis() throws Exception {
ListenableFuture<String> retry = retrier.retry(fun, 5, 100);

executorService.tick(199, MILLISECONDS);
assertFalse(retry.isDone());

executorService.tick(1, MILLISECONDS);
assertTrue(retry.isDone());

String s = getUninterruptibly(retry);

assertEquals("success", s);
verify(executorService, times(2))
.schedule(any(Runnable.class), eq(100L), eq(MILLISECONDS));
}

@Test
public void testRetryDelayTimeUnit() throws Exception {
ListenableFuture<String> retry = retrier.retry(fun, 5, 1, SECONDS);

executorService.tick(1999, MILLISECONDS);
assertFalse(retry.isDone());

executorService.tick(1, MILLISECONDS);
assertTrue(retry.isDone());

String s = getUninterruptibly(retry);

assertEquals("success", s);
verify(executorService, times(2))
.schedule(any(Runnable.class), eq(1L), eq(SECONDS));
}

@Test
Expand All @@ -115,16 +109,21 @@ public void testImmediateSuccess() throws Exception {
when(fun.get()).thenReturn(immediateFuture("direct success"));

ListenableFuture<String> retry = retrier.retry(fun, 5, 100);

assertTrue(retry.isDone());

String s = getUninterruptibly(retry);

assertEquals("direct success", s);
verifyZeroInteractions(executorService);
}

@Test
public void testRetryFailing() throws Exception {
ListenableFuture<String> retry = retrier.retry(fun, 1, 0);

executorService.tick(1, MILLISECONDS);
assertTrue(retry.isDone());

try {
getUninterruptibly(retry);
fail();
Expand All @@ -137,6 +136,9 @@ public void testRetryFailing() throws Exception {
public void testRetryFailureOnCustomPredicate() throws Exception {
ListenableFuture<String> retry = retrier.retry(fun, 2, 0, SECONDS, successPredicate());

executorService.tick(1, MILLISECONDS);
assertTrue(retry.isDone());

try {
getUninterruptibly(retry);
fail();
Expand All @@ -149,6 +151,9 @@ public void testRetryFailureOnCustomPredicate() throws Exception {
public void testRetrySuccessOnCustomPredicate() throws Exception {
ListenableFuture<String> retry = retrier.retry(fun, 3, 0, SECONDS, successPredicate());

executorService.tick(1, MILLISECONDS);
assertTrue(retry.isDone());

assertEquals("success!!!", getUninterruptibly(retry));
}

Expand Down
165 changes: 165 additions & 0 deletions src/test/java/com/spotify/futures/FuturesExtraTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -262,4 +262,169 @@ public void validate(Integer value) throws Exception {
}
}
}

@Test
public void testSyncTransform2() throws Exception {
ListenableFuture<String> futureA = Futures.immediateFuture("a");
ListenableFuture<String> futureB = Futures.immediateFuture("b");
assertEquals("ab", FuturesExtra.syncTransform2(futureA, futureB,
new FuturesExtra.Function2<String, String, String>() {
@Override
public String apply(String a, String b) {
return a + b;
}
}
).get());
}

@Test
public void testAsyncTransform2() throws Exception {
ListenableFuture<String> futureA = Futures.immediateFuture("a");
ListenableFuture<String> futureB = Futures.immediateFuture("b");
assertEquals("ab", FuturesExtra.asyncTransform2(futureA, futureB,
new FuturesExtra.AsyncFunction2<String, String, String>() {
@Override
public ListenableFuture<String> apply(String a, String b) {
return Futures.immediateFuture(a + b);
}
}
).get());
}

@Test
public void testSyncTransform3() throws Exception {
ListenableFuture<String> futureA = Futures.immediateFuture("a");
ListenableFuture<String> futureB = Futures.immediateFuture("b");
ListenableFuture<String> futureC = Futures.immediateFuture("c");
assertEquals("abc", FuturesExtra.syncTransform3(futureA, futureB, futureC,
new FuturesExtra.Function3<String, String, String, String>() {
@Override
public String apply(String a, String b, String c) {
return a + b + c;
}
}
).get());
}

@Test
public void testAsyncTransform3() throws Exception {
ListenableFuture<String> futureA = Futures.immediateFuture("a");
ListenableFuture<String> futureB = Futures.immediateFuture("b");
ListenableFuture<String> futureC = Futures.immediateFuture("c");
assertEquals("abc", FuturesExtra.asyncTransform3(futureA, futureB, futureC,
new FuturesExtra.AsyncFunction3<String, String, String, String>() {
@Override
public ListenableFuture<String> apply(String a, String b, String c) {
return Futures.immediateFuture(a + b + c);
}
}
).get());
}

@Test
public void testSyncTransform4() throws Exception {
ListenableFuture<String> futureA = Futures.immediateFuture("a");
ListenableFuture<String> futureB = Futures.immediateFuture("b");
ListenableFuture<String> futureC = Futures.immediateFuture("c");
ListenableFuture<String> futureD = Futures.immediateFuture("d");
assertEquals("abcd", FuturesExtra.syncTransform4(futureA, futureB, futureC, futureD,
new FuturesExtra.Function4<String, String, String, String, String>() {
@Override
public String apply(String a, String b, String c, String d) {
return a + b + c + d;
}
}
).get());
}

@Test
public void testAsyncTransform4() throws Exception {
ListenableFuture<String> futureA = Futures.immediateFuture("a");
ListenableFuture<String> futureB = Futures.immediateFuture("b");
ListenableFuture<String> futureC = Futures.immediateFuture("c");
ListenableFuture<String> futureD = Futures.immediateFuture("d");
assertEquals("abcd", FuturesExtra.asyncTransform4(futureA, futureB, futureC, futureD,
new FuturesExtra.AsyncFunction4<String, String, String, String, String>() {
@Override
public ListenableFuture<String> apply(String a, String b, String c, String d) {
return Futures.immediateFuture(a + b + c + d);
}
}
).get());
}

@Test
public void testSyncTransform5() throws Exception {
ListenableFuture<String> futureA = Futures.immediateFuture("a");
ListenableFuture<String> futureB = Futures.immediateFuture("b");
ListenableFuture<String> futureC = Futures.immediateFuture("c");
ListenableFuture<String> futureD = Futures.immediateFuture("d");
ListenableFuture<String> futureE = Futures.immediateFuture("e");
assertEquals("abcde", FuturesExtra.syncTransform5(futureA, futureB, futureC, futureD, futureE,
new FuturesExtra.Function5<String, String, String, String, String, String>() {
@Override
public String apply(String a, String b, String c, String d, String e) {
return a + b + c + d + e;
}
}
).get());
}

@Test
public void testAsyncTransform5() throws Exception {
ListenableFuture<String> futureA = Futures.immediateFuture("a");
ListenableFuture<String> futureB = Futures.immediateFuture("b");
ListenableFuture<String> futureC = Futures.immediateFuture("c");
ListenableFuture<String> futureD = Futures.immediateFuture("d");
ListenableFuture<String> futureE = Futures.immediateFuture("e");
assertEquals("abcde", FuturesExtra.asyncTransform5(futureA, futureB, futureC, futureD, futureE,
new FuturesExtra.AsyncFunction5<String, String, String, String, String, String>() {
@Override
public ListenableFuture<String> apply(
String a, String b, String c, String d, String e) {
return Futures.immediateFuture(a + b + c + d + e);
}
}
).get());
}

@Test
public void testSyncTransform6() throws Exception {
ListenableFuture<String> futureA = Futures.immediateFuture("a");
ListenableFuture<String> futureB = Futures.immediateFuture("b");
ListenableFuture<String> futureC = Futures.immediateFuture("c");
ListenableFuture<String> futureD = Futures.immediateFuture("d");
ListenableFuture<String> futureE = Futures.immediateFuture("e");
ListenableFuture<String> futureF = Futures.immediateFuture("f");
assertEquals("abcdef", FuturesExtra.syncTransform6(
futureA, futureB, futureC, futureD, futureE, futureF,
new FuturesExtra.Function6<String, String, String, String, String, String, String>() {
@Override
public String apply(String a, String b, String c, String d, String e, String f) {
return a + b + c + d + e + f;
}
}
).get());
}

@Test
public void testAsyncTransform6() throws Exception {
ListenableFuture<String> futureA = Futures.immediateFuture("a");
ListenableFuture<String> futureB = Futures.immediateFuture("b");
ListenableFuture<String> futureC = Futures.immediateFuture("c");
ListenableFuture<String> futureD = Futures.immediateFuture("d");
ListenableFuture<String> futureE = Futures.immediateFuture("e");
ListenableFuture<String> futureF = Futures.immediateFuture("f");
assertEquals("abcdef", FuturesExtra.asyncTransform6(
futureA, futureB, futureC, futureD, futureE, futureF,
new FuturesExtra.AsyncFunction6<
String, String, String, String, String, String, String>() {
@Override
public ListenableFuture<String> apply(
String a, String b, String c, String d, String e, String f) {
return Futures.immediateFuture(a + b + c + d + e + f);
}
}
).get());
}
}
12 changes: 12 additions & 0 deletions src/test/java/com/spotify/futures/JoinedResultsTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -17,9 +17,11 @@

import static org.junit.Assert.assertEquals;

import java.util.Arrays;
import java.util.Collections;
import java.util.List;

import com.google.common.collect.Lists;
import org.junit.Test;

import com.google.common.util.concurrent.Futures;
Expand All @@ -40,6 +42,16 @@ public void testMixedTypes() throws Exception {
assertEquals("value", joined.get(list).get(0));
}

@Test
public void testWithList() throws Exception {
ListenableFuture<String> futureA = Futures.immediateFuture("a");
ListenableFuture<String> futureB = Futures.immediateFuture("b");
List<ListenableFuture<?>> list = Arrays.<ListenableFuture<?>>asList(futureA, futureB);
JoinedResults joined = FuturesExtra.join(list).get();
assertEquals("a", joined.get(futureA));
assertEquals("b", joined.get(futureB));
}

@Test
public void testNullTypes() throws Exception {
ListenableFuture<String> nullable = Futures.immediateFuture(null);
Expand Down

0 comments on commit 080f96e

Please sign in to comment.