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