AbstractProducerTest.java revision 5d3207ac2713386ed61c6ca8f0356e8f093a62e1
15d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffin/* 25d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffin * Copyright (C) 2014 Google, Inc. 35d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffin * 45d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffin * Licensed under the Apache License, Version 2.0 (the "License"); 55d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffin * you may not use this file except in compliance with the License. 65d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffin * You may obtain a copy of the License at 75d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffin * 85d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffin * http://www.apache.org/licenses/LICENSE-2.0 95d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffin * 105d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffin * Unless required by applicable law or agreed to in writing, software 115d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffin * distributed under the License is distributed on an "AS IS" BASIS, 125d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffin * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 135d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffin * See the License for the specific language governing permissions and 145d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffin * limitations under the License. 155d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffin */ 165d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffinpackage dagger.producers.internal; 175d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffin 185d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffinimport com.google.common.util.concurrent.Futures; 195d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffinimport com.google.common.util.concurrent.ListenableFuture; 205d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffinimport com.google.common.util.concurrent.SettableFuture; 215d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffinimport dagger.producers.Producer; 225d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffinimport dagger.producers.monitoring.ProducerMonitor; 235d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffinimport java.util.concurrent.ExecutionException; 245d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffinimport org.junit.Before; 255d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffinimport org.junit.Test; 265d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffinimport org.junit.runner.RunWith; 275d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffinimport org.junit.runners.JUnit4; 285d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffinimport org.mockito.Mock; 295d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffinimport org.mockito.MockitoAnnotations; 305d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffin 315d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffinimport static com.google.common.truth.Truth.assertThat; 325d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffinimport static org.junit.Assert.fail; 335d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffinimport static org.mockito.Mockito.verify; 345d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffinimport static org.mockito.Mockito.verifyNoMoreInteractions; 355d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffinimport static org.mockito.Mockito.verifyZeroInteractions; 365d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffin 375d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffin/** 385d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffin * Tests {@link AbstractProducer}. 395d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffin */ 405d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffin@RunWith(JUnit4.class) 415d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffinpublic class AbstractProducerTest { 425d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffin @Mock private ProducerMonitor monitor; 435d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffin 445d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffin @Before 455d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffin public void initMocks() { 465d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffin MockitoAnnotations.initMocks(this); 475d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffin } 485d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffin 495d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffin @Test 505d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffin public void get_nullPointerException() { 515d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffin Producer<Object> producer = new DelegateProducer<>(monitor, null); 525d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffin try { 535d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffin producer.get(); 545d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffin fail(); 555d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffin } catch (NullPointerException expected) { 565d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffin } 575d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffin } 585d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffin 595d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffin @Test public void get() throws Exception { 605d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffin Producer<Integer> producer = 615d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffin new AbstractProducer<Integer>(monitor) { 625d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffin int i = 0; 635d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffin 645d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffin @Override 655d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffin public ListenableFuture<Integer> compute() { 665d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffin return Futures.immediateFuture(i++); 675d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffin } 685d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffin }; 695d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffin assertThat(producer.get().get()).isEqualTo(0); 705d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffin assertThat(producer.get().get()).isEqualTo(0); 715d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffin assertThat(producer.get().get()).isEqualTo(0); 725d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffin } 735d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffin 745d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffin @Test 755d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffin public void monitor_success() throws Exception { 765d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffin SettableFuture<Integer> delegateFuture = SettableFuture.create(); 775d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffin Producer<Integer> producer = new DelegateProducer<>(monitor, delegateFuture); 785d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffin 795d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffin ListenableFuture<Integer> future = producer.get(); 805d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffin assertThat(future.isDone()).isFalse(); 815d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffin verifyZeroInteractions(monitor); 825d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffin delegateFuture.set(-42); 835d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffin assertThat(future.get()).isEqualTo(-42); 845d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffin verify(monitor).succeeded(-42); 855d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffin verifyNoMoreInteractions(monitor); 865d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffin } 875d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffin 885d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffin @Test 895d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffin public void monitor_failure() throws Exception { 905d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffin SettableFuture<Integer> delegateFuture = SettableFuture.create(); 915d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffin Producer<Integer> producer = new DelegateProducer<>(monitor, delegateFuture); 925d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffin 935d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffin ListenableFuture<Integer> future = producer.get(); 945d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffin assertThat(future.isDone()).isFalse(); 955d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffin verifyZeroInteractions(monitor); 965d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffin Throwable t = new RuntimeException("monkey"); 975d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffin delegateFuture.setException(t); 985d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffin try { 995d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffin future.get(); 1005d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffin fail(); 1015d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffin } catch (ExecutionException e) { 1025d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffin assertThat(e.getCause()).isSameAs(t); 1035d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffin } 1045d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffin verify(monitor).failed(t); 1055d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffin verifyNoMoreInteractions(monitor); 1065d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffin } 1075d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffin 1085d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffin @Test 1095d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffin public void monitor_null() throws Exception { 1105d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffin Producer<Integer> producer = new DelegateProducer<>(null, Futures.immediateFuture(42)); 1115d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffin assertThat(producer.get().get()).isEqualTo(42); 1125d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffin } 1135d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffin 1145d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffin static final class DelegateProducer<T> extends AbstractProducer<T> { 1155d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffin private final ListenableFuture<T> delegate; 1165d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffin 1175d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffin DelegateProducer(ProducerMonitor monitor, ListenableFuture<T> delegate) { 1185d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffin super(monitor); 1195d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffin this.delegate = delegate; 1205d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffin } 1215d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffin 1225d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffin @Override 1235d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffin public ListenableFuture<T> compute() { 1245d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffin return delegate; 1255d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffin } 1265d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffin } 1275d3207ac2713386ed61c6ca8f0356e8f093a62e1Paul Duffin} 128