1 /*
2  * Copyright (C) 2018 The Dagger Authors.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package dagger.functional.producers.cancellation;
18 
19 import static com.google.common.base.Preconditions.checkNotNull;
20 import static com.google.common.truth.Truth.assertThat;
21 
22 import com.google.common.util.concurrent.ListenableFuture;
23 import dagger.Provides;
24 import dagger.producers.Producer;
25 import dagger.producers.ProducerModule;
26 import dagger.producers.Produces;
27 import javax.inject.Named;
28 
29 @SuppressWarnings("unused") // not actually using dependencies
30 @ProducerModule(subcomponents = CancellationSubcomponent.class)
31 final class CancellationModule {
32 
33   private final ProducerTester tester;
34 
CancellationModule(ProducerTester tester)35   CancellationModule(ProducerTester tester) {
36     this.tester = checkNotNull(tester);
37   }
38 
39   @Produces
40   @Named("leaf1")
produceLeaf1()41   ListenableFuture<String> produceLeaf1() {
42     return tester.start("leaf1");
43   }
44 
45   @Produces
46   @Named("leaf2")
produceLeaf2()47   ListenableFuture<String> produceLeaf2() {
48     return tester.start("leaf2");
49   }
50 
51   @Produces
52   @Named("leaf3")
produceLeaf3()53   ListenableFuture<String> produceLeaf3() {
54     return tester.start("leaf3");
55   }
56 
57   @Produces
58   @Named("foo")
produceFoo(@amed"leaf1") String leaf1, @Named("leaf2") String leaf2)59   ListenableFuture<String> produceFoo(@Named("leaf1") String leaf1, @Named("leaf2") String leaf2) {
60     return tester.start("foo");
61   }
62 
63   @Produces
64   @Named("bar")
produceBar(@amed"leaf2") String leaf2, @Named("leaf3") String leaf3)65   ListenableFuture<String> produceBar(@Named("leaf2") String leaf2, @Named("leaf3") String leaf3) {
66     return tester.start("bar");
67   }
68 
69   @Produces
70   @Named("baz")
produceBaz( @amed"foo") Producer<String> foo, @Named("bar") String bar)71   ListenableFuture<String> produceBaz(
72       @Named("foo") Producer<String> foo, @Named("bar") String bar) {
73     ListenableFuture<String> fooFuture = foo.get();
74     if (!fooFuture.isDone()) {
75       assertThat(fooFuture.cancel(true)).isTrue();
76       assertThat(fooFuture.isCancelled()).isTrue();
77     }
78     return tester.start("baz");
79   }
80 
81   @Provides
82   @Named("providesDep")
provideProvidesDep()83   static String provideProvidesDep() {
84     return "providesDep";
85   }
86 
87   @Produces
88   @Named("qux")
produceQux( @amed"baz") String baz, @Named("providesDep") String providesDep)89   ListenableFuture<String> produceQux(
90       @Named("baz") String baz, @Named("providesDep") String providesDep) {
91     return tester.start("qux");
92   }
93 
94   @Produces
95   @Named("ep1")
produceEntryPoint1(@amed"qux") String qux)96   ListenableFuture<String> produceEntryPoint1(@Named("qux") String qux) {
97     return tester.start("entryPoint1");
98   }
99 
100   @Produces
101   @Named("ep2")
produceEntryPoint2(@amed"bar") String bar, String dependency)102   ListenableFuture<String> produceEntryPoint2(@Named("bar") String bar, String dependency) {
103     return tester.start("entryPoint2");
104   }
105 
106   @Produces
107   @Named("ep3")
produceEntryPoint3(Producer<String> dependencyProducer)108   static ListenableFuture<String> produceEntryPoint3(Producer<String> dependencyProducer) {
109     ListenableFuture<String> dependencyFuture = dependencyProducer.get();
110     assertThat(dependencyFuture.isDone()).isFalse();
111     assertThat(dependencyFuture.cancel(true)).isTrue();
112     assertThat(dependencyFuture.isCancelled()).isTrue();
113     return dependencyFuture;
114   }
115 }
116