1*f585d8a3SJacky Wang /* 2*f585d8a3SJacky Wang * Copyright (C) 2014 The Dagger Authors. 3*f585d8a3SJacky Wang * 4*f585d8a3SJacky Wang * Licensed under the Apache License, Version 2.0 (the "License"); 5*f585d8a3SJacky Wang * you may not use this file except in compliance with the License. 6*f585d8a3SJacky Wang * You may obtain a copy of the License at 7*f585d8a3SJacky Wang * 8*f585d8a3SJacky Wang * http://www.apache.org/licenses/LICENSE-2.0 9*f585d8a3SJacky Wang * 10*f585d8a3SJacky Wang * Unless required by applicable law or agreed to in writing, software 11*f585d8a3SJacky Wang * distributed under the License is distributed on an "AS IS" BASIS, 12*f585d8a3SJacky Wang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*f585d8a3SJacky Wang * See the License for the specific language governing permissions and 14*f585d8a3SJacky Wang * limitations under the License. 15*f585d8a3SJacky Wang */ 16*f585d8a3SJacky Wang 17*f585d8a3SJacky Wang package dagger.producers.internal; 18*f585d8a3SJacky Wang 19*f585d8a3SJacky Wang import static com.google.common.truth.Truth.assertThat; 20*f585d8a3SJacky Wang import static org.junit.Assert.fail; 21*f585d8a3SJacky Wang 22*f585d8a3SJacky Wang import com.google.common.collect.ImmutableList; 23*f585d8a3SJacky Wang import com.google.common.util.concurrent.Futures; 24*f585d8a3SJacky Wang import com.google.common.util.concurrent.ListenableFuture; 25*f585d8a3SJacky Wang import com.google.common.util.concurrent.SettableFuture; 26*f585d8a3SJacky Wang import dagger.internal.Provider; 27*f585d8a3SJacky Wang import dagger.producers.Produced; 28*f585d8a3SJacky Wang import dagger.producers.Producer; 29*f585d8a3SJacky Wang import java.util.Set; 30*f585d8a3SJacky Wang import java.util.concurrent.CancellationException; 31*f585d8a3SJacky Wang import java.util.concurrent.ExecutionException; 32*f585d8a3SJacky Wang import org.junit.Test; 33*f585d8a3SJacky Wang import org.junit.runner.RunWith; 34*f585d8a3SJacky Wang import org.junit.runners.JUnit4; 35*f585d8a3SJacky Wang 36*f585d8a3SJacky Wang /** 37*f585d8a3SJacky Wang * Tests {@link Producers}. 38*f585d8a3SJacky Wang */ 39*f585d8a3SJacky Wang @RunWith(JUnit4.class) 40*f585d8a3SJacky Wang public class ProducersTest { createFutureProduced_success()41*f585d8a3SJacky Wang @Test public void createFutureProduced_success() throws Exception { 42*f585d8a3SJacky Wang ListenableFuture<String> future = Futures.immediateFuture("monkey"); 43*f585d8a3SJacky Wang ListenableFuture<Produced<String>> producedFuture = Producers.createFutureProduced(future); 44*f585d8a3SJacky Wang assertThat(producedFuture.isDone()).isTrue(); 45*f585d8a3SJacky Wang assertThat(producedFuture.get().get()).isEqualTo("monkey"); 46*f585d8a3SJacky Wang } 47*f585d8a3SJacky Wang createFutureProduced_failure()48*f585d8a3SJacky Wang @Test public void createFutureProduced_failure() throws Exception { 49*f585d8a3SJacky Wang ListenableFuture<String> future = Futures.immediateFailedFuture(new RuntimeException("monkey")); 50*f585d8a3SJacky Wang ListenableFuture<Produced<String>> producedFuture = Producers.createFutureProduced(future); 51*f585d8a3SJacky Wang assertThat(producedFuture.isDone()).isTrue(); 52*f585d8a3SJacky Wang assertThat(getProducedException(producedFuture.get())) 53*f585d8a3SJacky Wang .hasCauseThat() 54*f585d8a3SJacky Wang .hasMessageThat() 55*f585d8a3SJacky Wang .isEqualTo("monkey"); 56*f585d8a3SJacky Wang } 57*f585d8a3SJacky Wang createFutureProduced_cancelPropagatesBackwards()58*f585d8a3SJacky Wang @Test public void createFutureProduced_cancelPropagatesBackwards() throws Exception { 59*f585d8a3SJacky Wang ListenableFuture<String> future = SettableFuture.create(); 60*f585d8a3SJacky Wang ListenableFuture<Produced<String>> producedFuture = Producers.createFutureProduced(future); 61*f585d8a3SJacky Wang assertThat(producedFuture.isDone()).isFalse(); 62*f585d8a3SJacky Wang producedFuture.cancel(false); 63*f585d8a3SJacky Wang assertThat(future.isCancelled()).isTrue(); 64*f585d8a3SJacky Wang } 65*f585d8a3SJacky Wang createFutureProduced_cancelDoesNotPropagateForwards()66*f585d8a3SJacky Wang @Test public void createFutureProduced_cancelDoesNotPropagateForwards() throws Exception { 67*f585d8a3SJacky Wang ListenableFuture<String> future = SettableFuture.create(); 68*f585d8a3SJacky Wang ListenableFuture<Produced<String>> producedFuture = Producers.createFutureProduced(future); 69*f585d8a3SJacky Wang assertThat(producedFuture.isDone()).isFalse(); 70*f585d8a3SJacky Wang future.cancel(false); 71*f585d8a3SJacky Wang assertThat(producedFuture.isCancelled()).isFalse(); 72*f585d8a3SJacky Wang assertThat(getProducedException(producedFuture.get())) 73*f585d8a3SJacky Wang .hasCauseThat() 74*f585d8a3SJacky Wang .isInstanceOf(CancellationException.class); 75*f585d8a3SJacky Wang } 76*f585d8a3SJacky Wang getProducedException(Produced<T> produced)77*f585d8a3SJacky Wang private <T> ExecutionException getProducedException(Produced<T> produced) { 78*f585d8a3SJacky Wang try { 79*f585d8a3SJacky Wang T value = produced.get(); 80*f585d8a3SJacky Wang throw new IllegalArgumentException("produced did not throw, but returned " + value); 81*f585d8a3SJacky Wang } catch (ExecutionException e) { 82*f585d8a3SJacky Wang return e; 83*f585d8a3SJacky Wang } 84*f585d8a3SJacky Wang } 85*f585d8a3SJacky Wang createFutureSingletonSet_success()86*f585d8a3SJacky Wang @Test public void createFutureSingletonSet_success() throws Exception { 87*f585d8a3SJacky Wang ListenableFuture<String> future = Futures.immediateFuture("monkey"); 88*f585d8a3SJacky Wang ListenableFuture<Set<String>> setFuture = Producers.createFutureSingletonSet(future); 89*f585d8a3SJacky Wang assertThat(setFuture.isDone()).isTrue(); 90*f585d8a3SJacky Wang assertThat(setFuture.get()).containsExactly("monkey"); 91*f585d8a3SJacky Wang } 92*f585d8a3SJacky Wang createFutureSingletonSet_failure()93*f585d8a3SJacky Wang @Test public void createFutureSingletonSet_failure() throws Exception { 94*f585d8a3SJacky Wang ListenableFuture<String> future = Futures.immediateFailedFuture(new RuntimeException("monkey")); 95*f585d8a3SJacky Wang ListenableFuture<Set<String>> setFuture = Producers.createFutureSingletonSet(future); 96*f585d8a3SJacky Wang assertThat(setFuture.isDone()).isTrue(); 97*f585d8a3SJacky Wang try { 98*f585d8a3SJacky Wang setFuture.get(); 99*f585d8a3SJacky Wang fail(); 100*f585d8a3SJacky Wang } catch (ExecutionException e) { 101*f585d8a3SJacky Wang assertThat(e).hasCauseThat().hasMessageThat().isEqualTo("monkey"); 102*f585d8a3SJacky Wang } 103*f585d8a3SJacky Wang } 104*f585d8a3SJacky Wang 105*f585d8a3SJacky Wang @Test allAsSet_success()106*f585d8a3SJacky Wang public void allAsSet_success() throws Exception { 107*f585d8a3SJacky Wang ListenableFuture<Set<String>> future = 108*f585d8a3SJacky Wang Producers.allAsSet( 109*f585d8a3SJacky Wang ImmutableList.of( 110*f585d8a3SJacky Wang Futures.immediateFuture("monkey"), Futures.immediateFuture("gorilla"))); 111*f585d8a3SJacky Wang assertThat(future.isDone()).isTrue(); 112*f585d8a3SJacky Wang assertThat(future.get()).containsExactly("monkey", "gorilla"); 113*f585d8a3SJacky Wang } 114*f585d8a3SJacky Wang 115*f585d8a3SJacky Wang @Test allAsSet_failure()116*f585d8a3SJacky Wang public void allAsSet_failure() throws Exception { 117*f585d8a3SJacky Wang ListenableFuture<Set<String>> future = 118*f585d8a3SJacky Wang Producers.allAsSet( 119*f585d8a3SJacky Wang ImmutableList.of( 120*f585d8a3SJacky Wang Futures.immediateFuture("monkey"), 121*f585d8a3SJacky Wang Futures.<String>immediateFailedFuture(new RuntimeException("gorilla")))); 122*f585d8a3SJacky Wang assertThat(future.isDone()).isTrue(); 123*f585d8a3SJacky Wang try { 124*f585d8a3SJacky Wang future.get(); 125*f585d8a3SJacky Wang fail(); 126*f585d8a3SJacky Wang } catch (ExecutionException e) { 127*f585d8a3SJacky Wang assertThat(e).hasCauseThat().hasMessageThat().isEqualTo("gorilla"); 128*f585d8a3SJacky Wang } 129*f585d8a3SJacky Wang } 130*f585d8a3SJacky Wang producerFromProvider_doesntCache()131*f585d8a3SJacky Wang @Test public void producerFromProvider_doesntCache() throws Exception { 132*f585d8a3SJacky Wang Producer<Integer> producer = Producers.producerFromProvider(new Provider<Integer>() { 133*f585d8a3SJacky Wang int i = 0; 134*f585d8a3SJacky Wang 135*f585d8a3SJacky Wang @Override public Integer get() { 136*f585d8a3SJacky Wang return i++; 137*f585d8a3SJacky Wang } 138*f585d8a3SJacky Wang }); 139*f585d8a3SJacky Wang assertThat(producer.get().get()).isEqualTo(0); 140*f585d8a3SJacky Wang assertThat(producer.get().get()).isEqualTo(1); 141*f585d8a3SJacky Wang assertThat(producer.get().get()).isEqualTo(2); 142*f585d8a3SJacky Wang } 143*f585d8a3SJacky Wang } 144