/* * Copyright (C) 2015 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.messaging.ui.mediapicker; import android.hardware.Camera; import android.hardware.Camera.CameraInfo; import android.os.AsyncTask; import android.test.suitebuilder.annotation.SmallTest; import com.android.messaging.BugleTestCase; import com.android.messaging.ui.mediapicker.CameraManager.CameraWrapper; import org.mockito.InOrder; import org.mockito.Mockito; @SmallTest public class CameraManagerTest extends BugleTestCase { @Override protected void setUp() throws Exception { super.setUp(); // Force each test to set up a camera wrapper to match their needs CameraManager.setCameraWrapper(null); } @Override protected void tearDown() throws Exception { super.tearDown(); MockCameraFactory.cleanup(); } public void testNoCameraDeviceGetInfo() { CameraManager.setCameraWrapper(MockCameraFactory.createCameraWrapper()); assertEquals(false, CameraManager.get().hasAnyCamera()); assertEquals(false, CameraManager.get().hasFrontAndBackCamera()); try { CameraManager.get().selectCamera(CameraInfo.CAMERA_FACING_BACK); fail("selectCamera should have thrown"); } catch (AssertionError e) { } } public void testFrontFacingOnlyGetInfo() { CameraManager.setCameraWrapper(MockCameraFactory.createCameraWrapper( MockCameraFactory.createCamera(CameraInfo.CAMERA_FACING_FRONT) )); assertEquals(true, CameraManager.get().hasAnyCamera()); assertEquals(false, CameraManager.get().hasFrontAndBackCamera()); CameraManager.get().selectCamera(CameraInfo.CAMERA_FACING_FRONT); assertEquals(CameraInfo.CAMERA_FACING_FRONT, CameraManager.get().getCameraInfo().facing); CameraManager.get().selectCamera(CameraInfo.CAMERA_FACING_BACK); assertEquals(CameraInfo.CAMERA_FACING_FRONT, CameraManager.get().getCameraInfo().facing); } public void testBackFacingOnlyGetInfo() { CameraManager.setCameraWrapper(MockCameraFactory.createCameraWrapper( MockCameraFactory.createCamera(CameraInfo.CAMERA_FACING_BACK) )); assertEquals(true, CameraManager.get().hasAnyCamera()); assertEquals(false, CameraManager.get().hasFrontAndBackCamera()); CameraManager.get().selectCamera(CameraInfo.CAMERA_FACING_FRONT); assertEquals(CameraInfo.CAMERA_FACING_BACK, CameraManager.get().getCameraInfo().facing); CameraManager.get().selectCamera(CameraInfo.CAMERA_FACING_BACK); assertEquals(CameraInfo.CAMERA_FACING_BACK, CameraManager.get().getCameraInfo().facing); } public void testFrontAndBackGetInfo() { CameraManager.setCameraWrapper(MockCameraFactory.createCameraWrapper( MockCameraFactory.createCamera(CameraInfo.CAMERA_FACING_FRONT), MockCameraFactory.createCamera(CameraInfo.CAMERA_FACING_BACK) )); assertEquals(true, CameraManager.get().hasAnyCamera()); assertEquals(true, CameraManager.get().hasFrontAndBackCamera()); CameraManager.get().selectCamera(CameraInfo.CAMERA_FACING_FRONT); assertEquals(CameraInfo.CAMERA_FACING_FRONT, CameraManager.get().getCameraInfo().facing); CameraManager.get().selectCamera(CameraInfo.CAMERA_FACING_BACK); assertEquals(CameraInfo.CAMERA_FACING_BACK, CameraManager.get().getCameraInfo().facing); } public void testSwapCamera() { CameraManager.setCameraWrapper(MockCameraFactory.createCameraWrapper( MockCameraFactory.createCamera(CameraInfo.CAMERA_FACING_FRONT), MockCameraFactory.createCamera(CameraInfo.CAMERA_FACING_BACK) )); CameraManager.get().selectCamera(CameraInfo.CAMERA_FACING_FRONT); assertEquals(CameraInfo.CAMERA_FACING_FRONT, CameraManager.get().getCameraInfo().facing); CameraManager.get().swapCamera(); assertEquals(CameraInfo.CAMERA_FACING_BACK, CameraManager.get().getCameraInfo().facing); } public void testOpenCamera() { Camera backCamera = MockCameraFactory.createCamera(CameraInfo.CAMERA_FACING_BACK); Camera frontCamera = MockCameraFactory.createCamera(CameraInfo.CAMERA_FACING_FRONT); CameraWrapper wrapper = MockCameraFactory.createCameraWrapper(frontCamera, backCamera); CameraManager.setCameraWrapper(wrapper); CameraManager.get().selectCamera(CameraInfo.CAMERA_FACING_BACK); CameraManager.get().openCamera(); CameraManager.get().openCamera(); CameraManager.get().openCamera(); waitForPendingAsyncTasks(); Mockito.verify(wrapper, Mockito.never()).open(0); Mockito.verify(wrapper).open(1); Mockito.verify(wrapper, Mockito.never()).release(frontCamera); Mockito.verify(wrapper, Mockito.never()).release(backCamera); CameraManager.get().swapCamera(); waitForPendingAsyncTasks(); Mockito.verify(wrapper).open(0); Mockito.verify(wrapper).open(1); Mockito.verify(wrapper, Mockito.never()).release(frontCamera); Mockito.verify(wrapper).release(backCamera); InOrder inOrder = Mockito.inOrder(wrapper); inOrder.verify(wrapper).open(1); inOrder.verify(wrapper).release(backCamera); inOrder.verify(wrapper).open(0); } private void waitForPendingAsyncTasks() { try { final Object lockObject = new Object(); new AsyncTask() { @Override protected Void doInBackground(Void... voids) { return null; } @Override protected void onPostExecute(Void aVoid) { super.onPostExecute(aVoid); synchronized (lockObject) { lockObject.notifyAll(); } } }.execute(); synchronized (lockObject) { lockObject.wait(500); } } catch (InterruptedException e) { fail(); } } }