/*
* 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.common.memory.PooledByteBuffer;
import com.facebook.common.references.CloseableReference;
import com.facebook.imagepipeline.image.EncodedImage;
import org.junit.*;
import org.junit.runner.*;
import org.mockito.*;
import org.mockito.invocation.*;
import org.mockito.stubbing.*;
import org.robolectric.*;
import org.robolectric.annotation.*;
import static org.junit.Assert.*;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.any;
import static org.mockito.Mockito.*;
@RunWith(RobolectricTestRunner.class)
@Config(manifest= Config.NONE)
public class RemoveImageTransformMetaDataProducerTest {
@Mock public Producer mInputProducer;
@Mock public Consumer<CloseableReference<PooledByteBuffer>> mConsumer;
@Mock public EncodedImage mEncodedImage;
@Mock public ProducerContext mProducerContext;
@Mock public Exception mException;
private RemoveImageTransformMetaDataProducer mRemoveMetaDataProducer;
private Consumer<EncodedImage> mRemoveMetaDataConsumer;
private PooledByteBuffer mIntermediateByteBuffer;
private PooledByteBuffer mFinalByteBuffer;
private CloseableReference<PooledByteBuffer> mIntermediateResult;
private CloseableReference<PooledByteBuffer> mFinalResult;
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
mRemoveMetaDataProducer = new RemoveImageTransformMetaDataProducer(mInputProducer);
mIntermediateByteBuffer = mock(PooledByteBuffer.class);
mFinalByteBuffer = mock(PooledByteBuffer.class);
mIntermediateResult = CloseableReference.of(mIntermediateByteBuffer);
mFinalResult = CloseableReference.of(mFinalByteBuffer);
mRemoveMetaDataConsumer = null;
doAnswer(
new Answer() {
@Override
public Object answer(InvocationOnMock invocation) throws Throwable {
mRemoveMetaDataConsumer = (Consumer<EncodedImage>) invocation.getArguments()[0];
return null;
}
}).when(mInputProducer).produceResults(any(Consumer.class), any(ProducerContext.class));
mRemoveMetaDataProducer.produceResults(mConsumer, mProducerContext);
}
@Test
public void testOnNewResult() {
when(mEncodedImage.getByteBufferRef()).thenReturn(mIntermediateResult);
when(mEncodedImage.isValid()).thenReturn(true);
mRemoveMetaDataConsumer.onNewResult(mEncodedImage, Consumer.NO_FLAGS);
ArgumentCaptor<CloseableReference> argumentCaptor =
ArgumentCaptor.forClass(CloseableReference.class);
verify(mConsumer).onNewResult(argumentCaptor.capture(), eq(Consumer.NO_FLAGS));
CloseableReference intermediateResult = argumentCaptor.getValue();
assertEquals(
mIntermediateResult.getUnderlyingReferenceTestOnly().getRefCountTestOnly(),
intermediateResult.getUnderlyingReferenceTestOnly().getRefCountTestOnly());
when(mEncodedImage.getByteBufferRef()).thenReturn(mFinalResult);
mRemoveMetaDataConsumer.onNewResult(mEncodedImage, Consumer.IS_LAST);
verify(mConsumer).onNewResult(argumentCaptor.capture(), eq(Consumer.NO_FLAGS));
CloseableReference finalResult = argumentCaptor.getValue();
assertEquals(
mFinalResult.getUnderlyingReferenceTestOnly().getRefCountTestOnly(),
finalResult.getUnderlyingReferenceTestOnly().getRefCountTestOnly());
}
@Test
public void testOnNullResult() {
mRemoveMetaDataConsumer.onNewResult(null, Consumer.NO_FLAGS);
verify(mConsumer).onNewResult(null, Consumer.NO_FLAGS);
}
@Test
public void testOnFailure() {
mRemoveMetaDataConsumer.onFailure(mException);
verify(mConsumer).onFailure(mException);
}
@Test
public void testOnCancellation() {
mRemoveMetaDataConsumer.onCancellation();
verify(mConsumer).onCancellation();
}
}