1e363fbb2647aeb5ef4c87160d84c6b9ae8d45598Igor Murashkin/* 2e363fbb2647aeb5ef4c87160d84c6b9ae8d45598Igor Murashkin * Copyright (C) 2013 The Android Open Source Project 3e363fbb2647aeb5ef4c87160d84c6b9ae8d45598Igor Murashkin * 4e363fbb2647aeb5ef4c87160d84c6b9ae8d45598Igor Murashkin * Licensed under the Apache License, Version 2.0 (the "License"); 5e363fbb2647aeb5ef4c87160d84c6b9ae8d45598Igor Murashkin * you may not use this file except in compliance with the License. 6e363fbb2647aeb5ef4c87160d84c6b9ae8d45598Igor Murashkin * You may obtain a copy of the License at 7e363fbb2647aeb5ef4c87160d84c6b9ae8d45598Igor Murashkin * 8e363fbb2647aeb5ef4c87160d84c6b9ae8d45598Igor Murashkin * http://www.apache.org/licenses/LICENSE-2.0 9e363fbb2647aeb5ef4c87160d84c6b9ae8d45598Igor Murashkin * 10e363fbb2647aeb5ef4c87160d84c6b9ae8d45598Igor Murashkin * Unless required by applicable law or agreed to in writing, software 11e363fbb2647aeb5ef4c87160d84c6b9ae8d45598Igor Murashkin * distributed under the License is distributed on an "AS IS" BASIS, 12e363fbb2647aeb5ef4c87160d84c6b9ae8d45598Igor Murashkin * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13e363fbb2647aeb5ef4c87160d84c6b9ae8d45598Igor Murashkin * See the License for the specific language governing permissions and 14e363fbb2647aeb5ef4c87160d84c6b9ae8d45598Igor Murashkin * limitations under the License. 15e363fbb2647aeb5ef4c87160d84c6b9ae8d45598Igor Murashkin */ 16e363fbb2647aeb5ef4c87160d84c6b9ae8d45598Igor Murashkin 17e363fbb2647aeb5ef4c87160d84c6b9ae8d45598Igor Murashkinpackage com.android.mediaframeworktest.unit; 18e363fbb2647aeb5ef4c87160d84c6b9ae8d45598Igor Murashkin 192f1a2e423e0fbb64467d6fcfa4e82c6384f31210Eino-Ville Talvalaimport android.hardware.camera2.CameraAccessException; 202f1a2e423e0fbb64467d6fcfa4e82c6384f31210Eino-Ville Talvalaimport android.hardware.camera2.utils.CameraBinderDecorator; 212f1a2e423e0fbb64467d6fcfa4e82c6384f31210Eino-Ville Talvalaimport android.hardware.camera2.utils.CameraRuntimeException; 22e363fbb2647aeb5ef4c87160d84c6b9ae8d45598Igor Murashkinimport android.os.DeadObjectException; 23e363fbb2647aeb5ef4c87160d84c6b9ae8d45598Igor Murashkinimport android.os.RemoteException; 24e363fbb2647aeb5ef4c87160d84c6b9ae8d45598Igor Murashkinimport android.os.TransactionTooLargeException; 25e363fbb2647aeb5ef4c87160d84c6b9ae8d45598Igor Murashkinimport android.test.suitebuilder.annotation.SmallTest; 26e363fbb2647aeb5ef4c87160d84c6b9ae8d45598Igor Murashkin 27e363fbb2647aeb5ef4c87160d84c6b9ae8d45598Igor Murashkinimport static org.mockito.Mockito.*; 282f1a2e423e0fbb64467d6fcfa4e82c6384f31210Eino-Ville Talvalaimport static android.hardware.camera2.utils.CameraBinderDecorator.*; 292f1a2e423e0fbb64467d6fcfa4e82c6384f31210Eino-Ville Talvalaimport static android.hardware.camera2.CameraAccessException.*; 30e363fbb2647aeb5ef4c87160d84c6b9ae8d45598Igor Murashkin 31e363fbb2647aeb5ef4c87160d84c6b9ae8d45598Igor Murashkinimport junit.framework.Assert; 32e363fbb2647aeb5ef4c87160d84c6b9ae8d45598Igor Murashkin 33e363fbb2647aeb5ef4c87160d84c6b9ae8d45598Igor Murashkinpublic class CameraUtilsBinderDecoratorTest extends junit.framework.TestCase { 34e363fbb2647aeb5ef4c87160d84c6b9ae8d45598Igor Murashkin 35e363fbb2647aeb5ef4c87160d84c6b9ae8d45598Igor Murashkin private interface ICameraBinderStereotype { 36e363fbb2647aeb5ef4c87160d84c6b9ae8d45598Igor Murashkin 37e363fbb2647aeb5ef4c87160d84c6b9ae8d45598Igor Murashkin double doNothing(); 38e363fbb2647aeb5ef4c87160d84c6b9ae8d45598Igor Murashkin 39e363fbb2647aeb5ef4c87160d84c6b9ae8d45598Igor Murashkin // int is a 'status_t' 40e363fbb2647aeb5ef4c87160d84c6b9ae8d45598Igor Murashkin int doSomethingPositive(); 41e363fbb2647aeb5ef4c87160d84c6b9ae8d45598Igor Murashkin 42e363fbb2647aeb5ef4c87160d84c6b9ae8d45598Igor Murashkin int doSomethingNoError(); 43e363fbb2647aeb5ef4c87160d84c6b9ae8d45598Igor Murashkin 44e363fbb2647aeb5ef4c87160d84c6b9ae8d45598Igor Murashkin int doSomethingPermissionDenied(); 45e363fbb2647aeb5ef4c87160d84c6b9ae8d45598Igor Murashkin 46e363fbb2647aeb5ef4c87160d84c6b9ae8d45598Igor Murashkin int doSomethingAlreadyExists(); 47e363fbb2647aeb5ef4c87160d84c6b9ae8d45598Igor Murashkin 48e363fbb2647aeb5ef4c87160d84c6b9ae8d45598Igor Murashkin int doSomethingBadValue(); 49e363fbb2647aeb5ef4c87160d84c6b9ae8d45598Igor Murashkin 50e363fbb2647aeb5ef4c87160d84c6b9ae8d45598Igor Murashkin int doSomethingDeadObject() throws CameraRuntimeException; 51e363fbb2647aeb5ef4c87160d84c6b9ae8d45598Igor Murashkin 52e363fbb2647aeb5ef4c87160d84c6b9ae8d45598Igor Murashkin int doSomethingBadPolicy() throws CameraRuntimeException; 53e363fbb2647aeb5ef4c87160d84c6b9ae8d45598Igor Murashkin 54e363fbb2647aeb5ef4c87160d84c6b9ae8d45598Igor Murashkin int doSomethingDeviceBusy() throws CameraRuntimeException; 55e363fbb2647aeb5ef4c87160d84c6b9ae8d45598Igor Murashkin 56e363fbb2647aeb5ef4c87160d84c6b9ae8d45598Igor Murashkin int doSomethingNoSuchDevice() throws CameraRuntimeException; 57e363fbb2647aeb5ef4c87160d84c6b9ae8d45598Igor Murashkin 58e363fbb2647aeb5ef4c87160d84c6b9ae8d45598Igor Murashkin int doSomethingUnknownErrorCode(); 59e363fbb2647aeb5ef4c87160d84c6b9ae8d45598Igor Murashkin 60e363fbb2647aeb5ef4c87160d84c6b9ae8d45598Igor Murashkin int doSomethingThrowDeadObjectException() throws RemoteException; 61e363fbb2647aeb5ef4c87160d84c6b9ae8d45598Igor Murashkin 62e363fbb2647aeb5ef4c87160d84c6b9ae8d45598Igor Murashkin int doSomethingThrowTransactionTooLargeException() throws RemoteException; 63e363fbb2647aeb5ef4c87160d84c6b9ae8d45598Igor Murashkin } 64e363fbb2647aeb5ef4c87160d84c6b9ae8d45598Igor Murashkin 65e363fbb2647aeb5ef4c87160d84c6b9ae8d45598Igor Murashkin private static final double SOME_ARBITRARY_DOUBLE = 1.0; 66e363fbb2647aeb5ef4c87160d84c6b9ae8d45598Igor Murashkin private static final int SOME_ARBITRARY_POSITIVE_INT = 5; 67e363fbb2647aeb5ef4c87160d84c6b9ae8d45598Igor Murashkin private static final int SOME_ARBITRARY_NEGATIVE_INT = -0xC0FFEE; 68e363fbb2647aeb5ef4c87160d84c6b9ae8d45598Igor Murashkin 69e363fbb2647aeb5ef4c87160d84c6b9ae8d45598Igor Murashkin @SmallTest 70e363fbb2647aeb5ef4c87160d84c6b9ae8d45598Igor Murashkin public void testStereotypes() { 71e363fbb2647aeb5ef4c87160d84c6b9ae8d45598Igor Murashkin 72e363fbb2647aeb5ef4c87160d84c6b9ae8d45598Igor Murashkin ICameraBinderStereotype mock = mock(ICameraBinderStereotype.class); 73e363fbb2647aeb5ef4c87160d84c6b9ae8d45598Igor Murashkin try { 74e363fbb2647aeb5ef4c87160d84c6b9ae8d45598Igor Murashkin when(mock.doNothing()).thenReturn(SOME_ARBITRARY_DOUBLE); 75e363fbb2647aeb5ef4c87160d84c6b9ae8d45598Igor Murashkin when(mock.doSomethingPositive()).thenReturn(SOME_ARBITRARY_POSITIVE_INT); 76e363fbb2647aeb5ef4c87160d84c6b9ae8d45598Igor Murashkin when(mock.doSomethingNoError()).thenReturn(NO_ERROR); 77e363fbb2647aeb5ef4c87160d84c6b9ae8d45598Igor Murashkin when(mock.doSomethingPermissionDenied()).thenReturn(PERMISSION_DENIED); 78e363fbb2647aeb5ef4c87160d84c6b9ae8d45598Igor Murashkin when(mock.doSomethingAlreadyExists()).thenReturn(ALREADY_EXISTS); 79e363fbb2647aeb5ef4c87160d84c6b9ae8d45598Igor Murashkin when(mock.doSomethingBadValue()).thenReturn(BAD_VALUE); 80e363fbb2647aeb5ef4c87160d84c6b9ae8d45598Igor Murashkin when(mock.doSomethingDeadObject()).thenReturn(DEAD_OBJECT); 81e363fbb2647aeb5ef4c87160d84c6b9ae8d45598Igor Murashkin when(mock.doSomethingBadPolicy()).thenReturn(EACCES); 82e363fbb2647aeb5ef4c87160d84c6b9ae8d45598Igor Murashkin when(mock.doSomethingDeviceBusy()).thenReturn(EBUSY); 83e363fbb2647aeb5ef4c87160d84c6b9ae8d45598Igor Murashkin when(mock.doSomethingNoSuchDevice()).thenReturn(ENODEV); 84e363fbb2647aeb5ef4c87160d84c6b9ae8d45598Igor Murashkin when(mock.doSomethingUnknownErrorCode()).thenReturn(SOME_ARBITRARY_NEGATIVE_INT); 85e363fbb2647aeb5ef4c87160d84c6b9ae8d45598Igor Murashkin when(mock.doSomethingThrowDeadObjectException()).thenThrow(new DeadObjectException()); 86e363fbb2647aeb5ef4c87160d84c6b9ae8d45598Igor Murashkin when(mock.doSomethingThrowTransactionTooLargeException()).thenThrow( 87e363fbb2647aeb5ef4c87160d84c6b9ae8d45598Igor Murashkin new TransactionTooLargeException()); 88e363fbb2647aeb5ef4c87160d84c6b9ae8d45598Igor Murashkin } catch (RemoteException e) { 89e363fbb2647aeb5ef4c87160d84c6b9ae8d45598Igor Murashkin Assert.fail("Unreachable"); 90e363fbb2647aeb5ef4c87160d84c6b9ae8d45598Igor Murashkin } 91e363fbb2647aeb5ef4c87160d84c6b9ae8d45598Igor Murashkin 92e363fbb2647aeb5ef4c87160d84c6b9ae8d45598Igor Murashkin ICameraBinderStereotype decoratedMock = CameraBinderDecorator.newInstance(mock); 93e363fbb2647aeb5ef4c87160d84c6b9ae8d45598Igor Murashkin 94e363fbb2647aeb5ef4c87160d84c6b9ae8d45598Igor Murashkin // ignored by decorator because return type is double, not int 95e363fbb2647aeb5ef4c87160d84c6b9ae8d45598Igor Murashkin assertEquals(SOME_ARBITRARY_DOUBLE, decoratedMock.doNothing()); 96e363fbb2647aeb5ef4c87160d84c6b9ae8d45598Igor Murashkin 97e363fbb2647aeb5ef4c87160d84c6b9ae8d45598Igor Murashkin // pass through for positive values 98e363fbb2647aeb5ef4c87160d84c6b9ae8d45598Igor Murashkin assertEquals(SOME_ARBITRARY_POSITIVE_INT, decoratedMock.doSomethingPositive()); 99e363fbb2647aeb5ef4c87160d84c6b9ae8d45598Igor Murashkin 100e363fbb2647aeb5ef4c87160d84c6b9ae8d45598Igor Murashkin // pass through NO_ERROR 101e363fbb2647aeb5ef4c87160d84c6b9ae8d45598Igor Murashkin assertEquals(NO_ERROR, decoratedMock.doSomethingNoError()); 102e363fbb2647aeb5ef4c87160d84c6b9ae8d45598Igor Murashkin 103e363fbb2647aeb5ef4c87160d84c6b9ae8d45598Igor Murashkin try { 104e363fbb2647aeb5ef4c87160d84c6b9ae8d45598Igor Murashkin decoratedMock.doSomethingPermissionDenied(); 105e363fbb2647aeb5ef4c87160d84c6b9ae8d45598Igor Murashkin Assert.fail("Should've thrown SecurityException"); 106e363fbb2647aeb5ef4c87160d84c6b9ae8d45598Igor Murashkin } catch (SecurityException e) { 107e363fbb2647aeb5ef4c87160d84c6b9ae8d45598Igor Murashkin } 108e363fbb2647aeb5ef4c87160d84c6b9ae8d45598Igor Murashkin 109e363fbb2647aeb5ef4c87160d84c6b9ae8d45598Igor Murashkin assertEquals(ALREADY_EXISTS, decoratedMock.doSomethingAlreadyExists()); 110e363fbb2647aeb5ef4c87160d84c6b9ae8d45598Igor Murashkin 111e363fbb2647aeb5ef4c87160d84c6b9ae8d45598Igor Murashkin try { 112e363fbb2647aeb5ef4c87160d84c6b9ae8d45598Igor Murashkin decoratedMock.doSomethingBadValue(); 113e363fbb2647aeb5ef4c87160d84c6b9ae8d45598Igor Murashkin Assert.fail("Should've thrown IllegalArgumentException"); 114e363fbb2647aeb5ef4c87160d84c6b9ae8d45598Igor Murashkin } catch (IllegalArgumentException e) { 115e363fbb2647aeb5ef4c87160d84c6b9ae8d45598Igor Murashkin } 116e363fbb2647aeb5ef4c87160d84c6b9ae8d45598Igor Murashkin 117e363fbb2647aeb5ef4c87160d84c6b9ae8d45598Igor Murashkin try { 118e363fbb2647aeb5ef4c87160d84c6b9ae8d45598Igor Murashkin decoratedMock.doSomethingDeadObject(); 119e363fbb2647aeb5ef4c87160d84c6b9ae8d45598Igor Murashkin Assert.fail("Should've thrown CameraRuntimeException"); 120e363fbb2647aeb5ef4c87160d84c6b9ae8d45598Igor Murashkin } catch (CameraRuntimeException e) { 121e363fbb2647aeb5ef4c87160d84c6b9ae8d45598Igor Murashkin assertEquals(CAMERA_DISCONNECTED, e.getReason()); 122e363fbb2647aeb5ef4c87160d84c6b9ae8d45598Igor Murashkin } 123e363fbb2647aeb5ef4c87160d84c6b9ae8d45598Igor Murashkin 124e363fbb2647aeb5ef4c87160d84c6b9ae8d45598Igor Murashkin try { 125e363fbb2647aeb5ef4c87160d84c6b9ae8d45598Igor Murashkin decoratedMock.doSomethingBadPolicy(); 126e363fbb2647aeb5ef4c87160d84c6b9ae8d45598Igor Murashkin Assert.fail("Should've thrown CameraRuntimeException"); 127e363fbb2647aeb5ef4c87160d84c6b9ae8d45598Igor Murashkin } catch (CameraRuntimeException e) { 128e363fbb2647aeb5ef4c87160d84c6b9ae8d45598Igor Murashkin assertEquals(CAMERA_DISABLED, e.getReason()); 129e363fbb2647aeb5ef4c87160d84c6b9ae8d45598Igor Murashkin } 130e363fbb2647aeb5ef4c87160d84c6b9ae8d45598Igor Murashkin 131e363fbb2647aeb5ef4c87160d84c6b9ae8d45598Igor Murashkin try { 132e363fbb2647aeb5ef4c87160d84c6b9ae8d45598Igor Murashkin decoratedMock.doSomethingDeviceBusy(); 133e363fbb2647aeb5ef4c87160d84c6b9ae8d45598Igor Murashkin Assert.fail("Should've thrown CameraRuntimeException"); 134e363fbb2647aeb5ef4c87160d84c6b9ae8d45598Igor Murashkin } catch (CameraRuntimeException e) { 135e363fbb2647aeb5ef4c87160d84c6b9ae8d45598Igor Murashkin assertEquals(CAMERA_IN_USE, e.getReason()); 136e363fbb2647aeb5ef4c87160d84c6b9ae8d45598Igor Murashkin } 137e363fbb2647aeb5ef4c87160d84c6b9ae8d45598Igor Murashkin 138e363fbb2647aeb5ef4c87160d84c6b9ae8d45598Igor Murashkin try { 139e363fbb2647aeb5ef4c87160d84c6b9ae8d45598Igor Murashkin decoratedMock.doSomethingNoSuchDevice(); 140e363fbb2647aeb5ef4c87160d84c6b9ae8d45598Igor Murashkin Assert.fail("Should've thrown CameraRuntimeException"); 141e363fbb2647aeb5ef4c87160d84c6b9ae8d45598Igor Murashkin } catch (CameraRuntimeException e) { 142e363fbb2647aeb5ef4c87160d84c6b9ae8d45598Igor Murashkin assertEquals(CAMERA_DISCONNECTED, e.getReason()); 143e363fbb2647aeb5ef4c87160d84c6b9ae8d45598Igor Murashkin } 144e363fbb2647aeb5ef4c87160d84c6b9ae8d45598Igor Murashkin 145e363fbb2647aeb5ef4c87160d84c6b9ae8d45598Igor Murashkin try { 146e363fbb2647aeb5ef4c87160d84c6b9ae8d45598Igor Murashkin decoratedMock.doSomethingUnknownErrorCode(); 147e363fbb2647aeb5ef4c87160d84c6b9ae8d45598Igor Murashkin Assert.fail("Should've thrown UnsupportedOperationException"); 148e363fbb2647aeb5ef4c87160d84c6b9ae8d45598Igor Murashkin } catch (UnsupportedOperationException e) { 149e363fbb2647aeb5ef4c87160d84c6b9ae8d45598Igor Murashkin assertEquals(String.format("Unknown error %d", 150e363fbb2647aeb5ef4c87160d84c6b9ae8d45598Igor Murashkin SOME_ARBITRARY_NEGATIVE_INT), e.getMessage()); 151e363fbb2647aeb5ef4c87160d84c6b9ae8d45598Igor Murashkin } 152e363fbb2647aeb5ef4c87160d84c6b9ae8d45598Igor Murashkin 153e363fbb2647aeb5ef4c87160d84c6b9ae8d45598Igor Murashkin try { 154e363fbb2647aeb5ef4c87160d84c6b9ae8d45598Igor Murashkin decoratedMock.doSomethingThrowDeadObjectException(); 155e363fbb2647aeb5ef4c87160d84c6b9ae8d45598Igor Murashkin Assert.fail("Should've thrown CameraRuntimeException"); 156e363fbb2647aeb5ef4c87160d84c6b9ae8d45598Igor Murashkin } catch (CameraRuntimeException e) { 157e363fbb2647aeb5ef4c87160d84c6b9ae8d45598Igor Murashkin assertEquals(CAMERA_DISCONNECTED, e.getReason()); 158e363fbb2647aeb5ef4c87160d84c6b9ae8d45598Igor Murashkin } catch (RemoteException e) { 159e363fbb2647aeb5ef4c87160d84c6b9ae8d45598Igor Murashkin Assert.fail("Should not throw a DeadObjectException directly, but rethrow"); 160e363fbb2647aeb5ef4c87160d84c6b9ae8d45598Igor Murashkin } 161e363fbb2647aeb5ef4c87160d84c6b9ae8d45598Igor Murashkin 162e363fbb2647aeb5ef4c87160d84c6b9ae8d45598Igor Murashkin try { 163e363fbb2647aeb5ef4c87160d84c6b9ae8d45598Igor Murashkin decoratedMock.doSomethingThrowTransactionTooLargeException(); 164e363fbb2647aeb5ef4c87160d84c6b9ae8d45598Igor Murashkin Assert.fail("Should've thrown UnsupportedOperationException"); 165e363fbb2647aeb5ef4c87160d84c6b9ae8d45598Igor Murashkin } catch (UnsupportedOperationException e) { 166e363fbb2647aeb5ef4c87160d84c6b9ae8d45598Igor Murashkin assertTrue(e.getCause() instanceof TransactionTooLargeException); 167e363fbb2647aeb5ef4c87160d84c6b9ae8d45598Igor Murashkin } catch (RemoteException e) { 168e363fbb2647aeb5ef4c87160d84c6b9ae8d45598Igor Murashkin Assert.fail("Should not throw a TransactionTooLargeException directly, but rethrow"); 169e363fbb2647aeb5ef4c87160d84c6b9ae8d45598Igor Murashkin } 170e363fbb2647aeb5ef4c87160d84c6b9ae8d45598Igor Murashkin } 171e363fbb2647aeb5ef4c87160d84c6b9ae8d45598Igor Murashkin 172e363fbb2647aeb5ef4c87160d84c6b9ae8d45598Igor Murashkin} 173