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