1 /* 2 * Copyright (C) 2015 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package com.android.messaging.ui.mediapicker; 18 19 import android.hardware.Camera; 20 import android.hardware.Camera.CameraInfo; 21 import android.os.AsyncTask; 22 23 import androidx.test.filters.SmallTest; 24 25 import com.android.messaging.BugleTestCase; 26 import com.android.messaging.ui.mediapicker.CameraManager.CameraWrapper; 27 28 import org.mockito.InOrder; 29 import org.mockito.Mockito; 30 31 @SmallTest 32 public class CameraManagerTest extends BugleTestCase { 33 @Override setUp()34 protected void setUp() throws Exception { 35 super.setUp(); 36 // Force each test to set up a camera wrapper to match their needs 37 CameraManager.setCameraWrapper(null); 38 } 39 40 @Override tearDown()41 protected void tearDown() throws Exception { 42 super.tearDown(); 43 MockCameraFactory.cleanup(); 44 } 45 testNoCameraDeviceGetInfo()46 public void testNoCameraDeviceGetInfo() { 47 CameraManager.setCameraWrapper(MockCameraFactory.createCameraWrapper()); 48 assertEquals(false, CameraManager.get().hasAnyCamera()); 49 assertEquals(false, CameraManager.get().hasFrontAndBackCamera()); 50 boolean threw = false; 51 try { 52 CameraManager.get().selectCamera(CameraInfo.CAMERA_FACING_BACK); 53 } catch (AssertionError e) { 54 threw = true; 55 } 56 if (!threw) { 57 fail("selectCamera should have thrown"); 58 } 59 } 60 testFrontFacingOnlyGetInfo()61 public void testFrontFacingOnlyGetInfo() { 62 CameraManager.setCameraWrapper(MockCameraFactory.createCameraWrapper( 63 MockCameraFactory.createCamera(CameraInfo.CAMERA_FACING_FRONT) 64 )); 65 assertEquals(true, CameraManager.get().hasAnyCamera()); 66 assertEquals(false, CameraManager.get().hasFrontAndBackCamera()); 67 CameraManager.get().selectCamera(CameraInfo.CAMERA_FACING_FRONT); 68 assertEquals(CameraInfo.CAMERA_FACING_FRONT, CameraManager.get().getCameraInfo().facing); 69 CameraManager.get().selectCamera(CameraInfo.CAMERA_FACING_BACK); 70 assertEquals(CameraInfo.CAMERA_FACING_FRONT, CameraManager.get().getCameraInfo().facing); 71 } 72 testBackFacingOnlyGetInfo()73 public void testBackFacingOnlyGetInfo() { 74 CameraManager.setCameraWrapper(MockCameraFactory.createCameraWrapper( 75 MockCameraFactory.createCamera(CameraInfo.CAMERA_FACING_BACK) 76 )); 77 assertEquals(true, CameraManager.get().hasAnyCamera()); 78 assertEquals(false, CameraManager.get().hasFrontAndBackCamera()); 79 CameraManager.get().selectCamera(CameraInfo.CAMERA_FACING_FRONT); 80 assertEquals(CameraInfo.CAMERA_FACING_BACK, CameraManager.get().getCameraInfo().facing); 81 CameraManager.get().selectCamera(CameraInfo.CAMERA_FACING_BACK); 82 assertEquals(CameraInfo.CAMERA_FACING_BACK, CameraManager.get().getCameraInfo().facing); 83 } 84 testFrontAndBackGetInfo()85 public void testFrontAndBackGetInfo() { 86 CameraManager.setCameraWrapper(MockCameraFactory.createCameraWrapper( 87 MockCameraFactory.createCamera(CameraInfo.CAMERA_FACING_FRONT), 88 MockCameraFactory.createCamera(CameraInfo.CAMERA_FACING_BACK) 89 )); 90 assertEquals(true, CameraManager.get().hasAnyCamera()); 91 assertEquals(true, CameraManager.get().hasFrontAndBackCamera()); 92 CameraManager.get().selectCamera(CameraInfo.CAMERA_FACING_FRONT); 93 assertEquals(CameraInfo.CAMERA_FACING_FRONT, CameraManager.get().getCameraInfo().facing); 94 CameraManager.get().selectCamera(CameraInfo.CAMERA_FACING_BACK); 95 assertEquals(CameraInfo.CAMERA_FACING_BACK, CameraManager.get().getCameraInfo().facing); 96 } 97 testSwapCamera()98 public void testSwapCamera() { 99 CameraManager.setCameraWrapper(MockCameraFactory.createCameraWrapper( 100 MockCameraFactory.createCamera(CameraInfo.CAMERA_FACING_FRONT), 101 MockCameraFactory.createCamera(CameraInfo.CAMERA_FACING_BACK) 102 )); 103 CameraManager.get().selectCamera(CameraInfo.CAMERA_FACING_FRONT); 104 assertEquals(CameraInfo.CAMERA_FACING_FRONT, CameraManager.get().getCameraInfo().facing); 105 CameraManager.get().swapCamera(); 106 assertEquals(CameraInfo.CAMERA_FACING_BACK, CameraManager.get().getCameraInfo().facing); 107 } 108 testOpenCamera()109 public void testOpenCamera() { 110 Camera backCamera = MockCameraFactory.createCamera(CameraInfo.CAMERA_FACING_BACK); 111 Camera frontCamera = MockCameraFactory.createCamera(CameraInfo.CAMERA_FACING_FRONT); 112 CameraWrapper wrapper = MockCameraFactory.createCameraWrapper(frontCamera, backCamera); 113 CameraManager.setCameraWrapper(wrapper); 114 CameraManager.get().selectCamera(CameraInfo.CAMERA_FACING_BACK); 115 CameraManager.get().openCamera(); 116 CameraManager.get().openCamera(); 117 CameraManager.get().openCamera(); 118 waitForPendingAsyncTasks(); 119 Mockito.verify(wrapper, Mockito.never()).open(0); 120 Mockito.verify(wrapper).open(1); 121 Mockito.verify(wrapper, Mockito.never()).release(frontCamera); 122 Mockito.verify(wrapper, Mockito.never()).release(backCamera); 123 CameraManager.get().swapCamera(); 124 waitForPendingAsyncTasks(); 125 Mockito.verify(wrapper).open(0); 126 Mockito.verify(wrapper).open(1); 127 Mockito.verify(wrapper, Mockito.never()).release(frontCamera); 128 Mockito.verify(wrapper).release(backCamera); 129 InOrder inOrder = Mockito.inOrder(wrapper); 130 inOrder.verify(wrapper).open(1); 131 inOrder.verify(wrapper).release(backCamera); 132 inOrder.verify(wrapper).open(0); 133 } 134 waitForPendingAsyncTasks()135 private void waitForPendingAsyncTasks() { 136 try { 137 final Object lockObject = new Object(); 138 139 new AsyncTask<Void, Void, Void>() { 140 @Override 141 protected Void doInBackground(Void... voids) { 142 return null; 143 } 144 145 @Override 146 protected void onPostExecute(Void aVoid) { 147 super.onPostExecute(aVoid); 148 synchronized (lockObject) { 149 lockObject.notifyAll(); 150 } 151 } 152 }.execute(); 153 154 synchronized (lockObject) { 155 lockObject.wait(500); 156 } 157 } catch (InterruptedException e) { 158 fail(); 159 } 160 } 161 } 162