/* * Copyright (c) 2015-present, Facebook, Inc. * All rights reserved. * * This source code is licensed under the BSD-style license found in the * LICENSE file in the root directory of this source tree. An additional grant * of patent rights can be found in the PATENTS file in the same directory. */ package com.facebook.imagepipeline.producers; import com.facebook.imagepipeline.common.Priority; import com.facebook.imagepipeline.producers.ThreadHandoffProducerQueue; import com.facebook.imagepipeline.request.ImageRequest; import com.facebook.imagepipeline.testing.FakeClock; import com.facebook.imagepipeline.testing.TestExecutorService; import org.junit.*; import org.junit.runner.*; import org.mockito.*; import org.robolectric.*; import org.robolectric.annotation.*; import static org.mockito.Mockito.*; @RunWith(RobolectricTestRunner.class) @Config(manifest= Config.NONE) public class ThreadHandoffProducerTest { @Mock public Producer mInputProducer; @Mock public Consumer mConsumer; @Mock public ImageRequest mImageRequest; @Mock public ProducerListener mProducerListener; private final String mRequestId = "mRequestId"; private SettableProducerContext mProducerContext; private ThreadHandoffProducer mThreadHandoffProducer; private TestExecutorService mTestExecutorService; @Before public void setUp() { MockitoAnnotations.initMocks(this); mProducerContext = new SettableProducerContext( mImageRequest, mRequestId, mProducerListener, mock(Object.class), ImageRequest.RequestLevel.FULL_FETCH, false, true, Priority.MEDIUM); mTestExecutorService = new TestExecutorService(new FakeClock()); mThreadHandoffProducer = new ThreadHandoffProducer( mInputProducer, new ThreadHandoffProducerQueue(mTestExecutorService)); } @Test public void testSuccess() { mThreadHandoffProducer.produceResults(mConsumer, mProducerContext); mTestExecutorService.runUntilIdle(); verify(mInputProducer).produceResults(mConsumer, mProducerContext); verify(mProducerListener).onProducerStart(mRequestId, ThreadHandoffProducer.PRODUCER_NAME); verify(mProducerListener).onProducerFinishWithSuccess( mRequestId, ThreadHandoffProducer.PRODUCER_NAME, null); verifyNoMoreInteractions(mProducerListener); } @Test public void testCancellation() { mThreadHandoffProducer.produceResults(mConsumer, mProducerContext); mProducerContext.cancel(); mTestExecutorService.runUntilIdle(); verify(mInputProducer, never()).produceResults(mConsumer, mProducerContext); verify(mConsumer).onCancellation(); verify(mProducerListener).onProducerStart(mRequestId, ThreadHandoffProducer.PRODUCER_NAME); verify(mProducerListener).requiresExtraMap(mRequestId); verify(mProducerListener).onProducerFinishWithCancellation( mRequestId, ThreadHandoffProducer.PRODUCER_NAME, null); verifyNoMoreInteractions(mProducerListener); } }