| /* |
| * Copyright (C) 2013 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| package com.android.mediaframeworktest.unit; |
| |
| import static org.mockito.Mockito.*; |
| |
| import android.graphics.ImageFormat; |
| import android.media.Image; |
| import android.media.Image.Plane; |
| import android.media.ImageReader; |
| import android.media.ImageReader.OnImageAvailableListener; |
| import android.test.AndroidTestCase; |
| import android.test.suitebuilder.annotation.SmallTest; |
| |
| public class ImageReaderTest extends AndroidTestCase { |
| |
| private static final String TAG = "ImageReaderTest-unit"; |
| |
| private static final int DEFAULT_WIDTH = 640; |
| private static final int DEFAULT_HEIGHT = 480; |
| private static final int DEFAULT_FORMAT = ImageFormat.YUV_420_888; |
| private static final int DEFAULT_MAX_IMAGES = 3; |
| |
| private ImageReader mReader; |
| private Image mImage1; |
| private Image mImage2; |
| private Image mImage3; |
| |
| @Override |
| protected void setUp() throws Exception { |
| super.setUp(); |
| |
| /** |
| * Workaround for mockito and JB-MR2 incompatibility |
| * |
| * Avoid java.lang.IllegalArgumentException: dexcache == null |
| * https://code.google.com/p/dexmaker/issues/detail?id=2 |
| */ |
| System.setProperty("dexmaker.dexcache", getContext().getCacheDir().toString()); |
| |
| // TODO: refactor above into one of the test runners |
| |
| mReader = spy(ImageReader.newInstance(DEFAULT_WIDTH, DEFAULT_HEIGHT, DEFAULT_FORMAT, |
| DEFAULT_MAX_IMAGES)); |
| mImage1 = mock(Image.class); |
| mImage2 = mock(Image.class); |
| mImage3 = mock(Image.class); |
| |
| /** |
| * Ensure rest of classes are mockable |
| */ |
| { |
| mock(Plane.class); |
| mock(OnImageAvailableListener.class); |
| } |
| |
| } |
| |
| @Override |
| protected void tearDown() throws Exception { |
| mReader.close(); |
| |
| super.tearDown(); |
| } |
| |
| /** |
| * Return null when there is nothing in the image queue. |
| */ |
| @SmallTest |
| public void testGetLatestImageEmpty() { |
| when(mReader.acquireNextImage()).thenReturn(null); |
| when(mReader.acquireNextImageNoThrowISE()).thenReturn(null); |
| assertEquals(null, mReader.acquireLatestImage()); |
| } |
| |
| /** |
| * Return the last image from the image queue, close up the rest. |
| */ |
| @SmallTest |
| public void testGetLatestImage1() { |
| when(mReader.acquireNextImage()).thenReturn(mImage1); |
| when(mReader.acquireNextImageNoThrowISE()).thenReturn(null); |
| assertEquals(mImage1, mReader.acquireLatestImage()); |
| verify(mImage1, never()).close(); |
| } |
| |
| /** |
| * Return the last image from the image queue, close up the rest. |
| */ |
| @SmallTest |
| public void testGetLatestImage2() { |
| when(mReader.acquireNextImage()).thenReturn(mImage1); |
| when(mReader.acquireNextImageNoThrowISE()).thenReturn(mImage2).thenReturn(null); |
| assertEquals(mImage2, mReader.acquireLatestImage()); |
| verify(mImage1, atLeastOnce()).close(); |
| verify(mImage2, never()).close(); |
| } |
| |
| /** |
| * Return the last image from the image queue, close up the rest. |
| */ |
| @SmallTest |
| public void testGetLatestImage3() { |
| when(mReader.acquireNextImage()).thenReturn(mImage1); |
| when(mReader.acquireNextImageNoThrowISE()).thenReturn(mImage2). |
| thenReturn(mImage3). |
| thenReturn(null); |
| assertEquals(mImage3, mReader.acquireLatestImage()); |
| verify(mImage1, atLeastOnce()).close(); |
| verify(mImage2, atLeastOnce()).close(); |
| verify(mImage3, never()).close(); |
| } |
| |
| /** |
| * Return null if get a IllegalStateException with no images in the queue. |
| */ |
| @SmallTest |
| public void testGetLatestImageTooManyBuffersAcquiredEmpty() { |
| when(mReader.acquireNextImage()).thenThrow(new IllegalStateException()); |
| try { |
| mReader.acquireLatestImage(); |
| fail("Expected IllegalStateException to be thrown"); |
| } catch(IllegalStateException e) { |
| } |
| } |
| |
| /** |
| * All images are cleaned up when we get an unexpected Error. |
| */ |
| @SmallTest |
| public void testGetLatestImageExceptionalError() { |
| when(mReader.acquireNextImage()).thenReturn(mImage1); |
| when(mReader.acquireNextImageNoThrowISE()).thenReturn(mImage2). |
| thenReturn(mImage3). |
| thenThrow(new OutOfMemoryError()); |
| try { |
| mReader.acquireLatestImage(); |
| fail("Impossible"); |
| } catch(OutOfMemoryError e) { |
| } |
| |
| verify(mImage1, atLeastOnce()).close(); |
| verify(mImage2, atLeastOnce()).close(); |
| verify(mImage3, atLeastOnce()).close(); |
| } |
| |
| /** |
| * All images are cleaned up when we get an unexpected RuntimeException. |
| */ |
| @SmallTest |
| public void testGetLatestImageExceptionalRuntime() { |
| |
| when(mReader.acquireNextImage()).thenReturn(mImage1); |
| when(mReader.acquireNextImageNoThrowISE()).thenReturn(mImage2). |
| thenReturn(mImage3). |
| thenThrow(new RuntimeException()); |
| try { |
| mReader.acquireLatestImage(); |
| fail("Impossible"); |
| } catch(RuntimeException e) { |
| } |
| |
| verify(mImage1, atLeastOnce()).close(); |
| verify(mImage2, atLeastOnce()).close(); |
| verify(mImage3, atLeastOnce()).close(); |
| } |
| } |