xref: /aosp_15_r20/external/dagger2/javatests/dagger/producers/internal/ProducersTest.java (revision f585d8a307d0621d6060bd7e80091fdcbf94fe27)
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