CameraDeviceBinderTest.java revision 7f4d3147d1851d2f0c544e45390c139bda9fd9aa
1/*
2 * Copyright (C) 2013 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
17package com.android.mediaframeworktest.integration;
18
19import android.graphics.SurfaceTexture;
20import android.hardware.photography.CameraMetadata;
21import android.hardware.photography.CameraPropertiesKeys;
22import android.hardware.photography.CaptureRequest;
23import android.hardware.photography.ICameraDeviceCallbacks;
24import android.hardware.photography.ICameraDeviceUser;
25import android.os.RemoteException;
26import android.test.AndroidTestCase;
27import android.test.suitebuilder.annotation.SmallTest;
28import android.util.Log;
29import android.view.Surface;
30
31import static android.hardware.photography.CameraDevice.TEMPLATE_PREVIEW;
32
33import com.android.mediaframeworktest.MediaFrameworkIntegrationTestRunner;
34import com.android.mediaframeworktest.integration.CameraBinderTest.DummyBase;
35
36public class CameraDeviceBinderTest extends AndroidTestCase {
37    private static String TAG = "CameraDeviceBinderTest";
38
39    private int mCameraId;
40    private ICameraDeviceUser mCameraUser;
41    private CameraBinderTestUtils mUtils;
42
43    public CameraDeviceBinderTest() {
44    }
45
46    static class DummyCameraDeviceCallbacks extends DummyBase implements ICameraDeviceCallbacks {
47
48        @Override
49        public void notifyCallback(int msgType, int ext1, int ext2) throws RemoteException {
50        }
51
52        @Override
53        public void onResultReceived(int frameId, CameraMetadata result) throws RemoteException {
54        }
55    }
56
57    @Override
58    protected void setUp() throws Exception {
59        super.setUp();
60
61        mUtils = new CameraBinderTestUtils(getContext());
62
63        // This cannot be set in the constructor, since the onCreate isn't
64        // called yet
65        mCameraId = MediaFrameworkIntegrationTestRunner.mCameraId;
66
67        ICameraDeviceCallbacks dummyCallbacks = new DummyCameraDeviceCallbacks();
68
69        String clientPackageName = getContext().getPackageName();
70
71        mCameraUser = mUtils.getCameraService().connectDevice(dummyCallbacks, mCameraId,
72                clientPackageName, CameraBinderTestUtils.USE_CALLING_UID);
73        assertNotNull(String.format("Camera %s was null", mCameraId), mCameraUser);
74
75        Log.v(TAG, String.format("Camera %s connected", mCameraId));
76    }
77
78    @Override
79    protected void tearDown() throws Exception {
80        mCameraUser.disconnect();
81        mCameraUser = null;
82    }
83
84    @SmallTest
85    public void testCreateDefaultRequest() throws Exception {
86        CameraMetadata metadata = new CameraMetadata();
87        assertTrue(metadata.isEmpty());
88
89        int status = mCameraUser.createDefaultRequest(TEMPLATE_PREVIEW, /* out */metadata);
90        assertEquals(CameraBinderTestUtils.NO_ERROR, status);
91        assertFalse(metadata.isEmpty());
92
93        metadata.close();
94    }
95
96    @SmallTest
97    public void testCreateStream() throws Exception {
98        SurfaceTexture surfaceTexture = new SurfaceTexture(/* ignored */0);
99        surfaceTexture.setDefaultBufferSize(640, 480);
100        Surface surface = new Surface(surfaceTexture);
101
102        int streamId = mCameraUser.createStream(/* ignored */10, /* ignored */20, /* ignored */30,
103                surface);
104
105        assertEquals(0, streamId);
106
107        assertEquals(CameraBinderTestUtils.ALREADY_EXISTS,
108                mCameraUser.createStream(/* ignored */0, /* ignored */0, /* ignored */0, surface));
109
110        assertEquals(CameraBinderTestUtils.NO_ERROR, mCameraUser.deleteStream(streamId));
111    }
112
113    @SmallTest
114    public void testDeleteInvalidStream() throws Exception {
115        assertEquals(CameraBinderTestUtils.BAD_VALUE, mCameraUser.deleteStream(-1));
116        assertEquals(CameraBinderTestUtils.BAD_VALUE, mCameraUser.deleteStream(0));
117        assertEquals(CameraBinderTestUtils.BAD_VALUE, mCameraUser.deleteStream(1));
118        assertEquals(CameraBinderTestUtils.BAD_VALUE, mCameraUser.deleteStream(0xC0FFEE));
119    }
120
121    @SmallTest
122    public void testCreateStreamTwo() throws Exception {
123
124        // Create first stream
125
126        SurfaceTexture surfaceTexture = new SurfaceTexture(/* ignored */0);
127        surfaceTexture.setDefaultBufferSize(640, 480);
128        Surface surface = new Surface(surfaceTexture);
129
130        int streamId = mCameraUser.createStream(/* ignored */0, /* ignored */0, /* ignored */0,
131                surface);
132
133        assertEquals(0, streamId);
134
135        assertEquals(CameraBinderTestUtils.ALREADY_EXISTS,
136                mCameraUser.createStream(/* ignored */0, /* ignored */0, /* ignored */0, surface));
137
138        // Create second stream.
139
140        SurfaceTexture surfaceTexture2 = new SurfaceTexture(/* ignored */0);
141        surfaceTexture2.setDefaultBufferSize(640, 480);
142        Surface surface2 = new Surface(surfaceTexture2);
143
144        int streamId2 = mCameraUser.createStream(/* ignored */0, /* ignored */0, /* ignored */0,
145                surface2);
146
147        assertEquals(1, streamId2);
148
149        // Clean up streams
150
151        assertEquals(CameraBinderTestUtils.NO_ERROR, mCameraUser.deleteStream(streamId));
152        assertEquals(CameraBinderTestUtils.NO_ERROR, mCameraUser.deleteStream(streamId2));
153    }
154
155    @SmallTest
156    public void testSubmitBadRequest() throws Exception {
157
158        CameraMetadata metadata = new CameraMetadata();
159        assertTrue(metadata.isEmpty());
160
161        CaptureRequest request = new CaptureRequest();
162        assertTrue(request.isEmpty());
163
164        int status = mCameraUser.createDefaultRequest(TEMPLATE_PREVIEW, /* out */metadata);
165        assertEquals(CameraBinderTestUtils.NO_ERROR, status);
166        assertFalse(metadata.isEmpty());
167
168        request.swap(metadata);
169        assertFalse(request.isEmpty());
170        assertTrue(metadata.isEmpty());
171
172        status = mCameraUser.submitRequest(request, /* streaming */false);
173        assertEquals("Expected submitRequest to return BAD_VALUE " +
174                "since we had 0 surface targets set.", CameraBinderTestUtils.BAD_VALUE, status);
175
176        SurfaceTexture surfaceTexture = new SurfaceTexture(/* ignored */0);
177        surfaceTexture.setDefaultBufferSize(640, 480);
178        Surface surface = new Surface(surfaceTexture);
179        request.addTarget(surface);
180
181        status = mCameraUser.submitRequest(request, /* streaming */false);
182        assertEquals("Expected submitRequest to return BAD_VALUE since " +
183                "the target surface wasn't registered with createStream.",
184                CameraBinderTestUtils.BAD_VALUE, status);
185
186        request.close();
187        metadata.close();
188        surface.release();
189    }
190
191    @SmallTest
192    public void testSubmitGoodRequest() throws Exception {
193
194        CameraMetadata metadata = new CameraMetadata();
195        assertTrue(metadata.isEmpty());
196
197        CaptureRequest request = new CaptureRequest();
198        assertTrue(request.isEmpty());
199
200        // Create default request from template.
201
202        int status = mCameraUser.createDefaultRequest(TEMPLATE_PREVIEW, /* out */metadata);
203        assertEquals(CameraBinderTestUtils.NO_ERROR, status);
204        assertFalse(metadata.isEmpty());
205
206        request.swap(metadata);
207        assertFalse(request.isEmpty());
208        assertTrue(metadata.isEmpty());
209
210        SurfaceTexture surfaceTexture = new SurfaceTexture(/* ignored */0);
211        surfaceTexture.setDefaultBufferSize(640, 480);
212        Surface surface = new Surface(surfaceTexture);
213
214        // Create stream first. Pre-requisite to submitting a request using that
215        // stream.
216
217        int streamId = mCameraUser.createStream(/* ignored */10, /* ignored */20, /* ignored */30,
218                surface);
219        assertEquals(0, streamId);
220
221        request.addTarget(surface);
222
223        // Submit valid request twice.
224
225        int requestId1;
226        requestId1 = mCameraUser.submitRequest(request, /* streaming */false);
227        assertTrue("Request IDs should be non-negative", requestId1 >= 0);
228
229        int requestId2 = mCameraUser.submitRequest(request, /* streaming */false);
230        assertTrue("Request IDs should be non-negative", requestId2 >= 0);
231        assertNotSame("Request IDs should be unique for multiple requests", requestId1, requestId2);
232
233        surface.release();
234        request.close();
235        metadata.close();
236    }
237
238    @SmallTest
239    public void testSubmitStreamingRequest() throws Exception {
240
241        CameraMetadata metadata = new CameraMetadata();
242        assertTrue(metadata.isEmpty());
243
244        CaptureRequest request = new CaptureRequest();
245        assertTrue(request.isEmpty());
246
247        // Create default request from template.
248
249        int status = mCameraUser.createDefaultRequest(TEMPLATE_PREVIEW, /* out */metadata);
250        assertEquals(CameraBinderTestUtils.NO_ERROR, status);
251        assertFalse(metadata.isEmpty());
252
253        request.swap(metadata);
254        assertFalse(request.isEmpty());
255        assertTrue(metadata.isEmpty());
256
257        SurfaceTexture surfaceTexture = new SurfaceTexture(/* ignored */0);
258        surfaceTexture.setDefaultBufferSize(640, 480);
259        Surface surface = new Surface(surfaceTexture);
260
261        // Create stream first. Pre-requisite to submitting a request using that
262        // stream.
263
264        int streamId = mCameraUser.createStream(/* ignored */10, /* ignored */20, /* ignored */30,
265                surface);
266        assertEquals(0, streamId);
267
268        request.addTarget(surface);
269
270        // Submit valid request once (non-streaming), and another time
271        // (streaming)
272
273        int requestId1;
274        requestId1 = mCameraUser.submitRequest(request, /* streaming */false);
275        assertTrue("Request IDs should be non-negative", requestId1 >= 0);
276
277        int requestIdStreaming = mCameraUser.submitRequest(request, /* streaming */true);
278        assertTrue("Request IDs should be non-negative", requestIdStreaming >= 0);
279        assertNotSame("Request IDs should be unique for multiple requests", requestId1,
280                requestIdStreaming);
281
282        status = mCameraUser.cancelRequest(-1);
283        assertEquals("Invalid request IDs should not be cancellable",
284                CameraBinderTestUtils.BAD_VALUE, status);
285
286        status = mCameraUser.cancelRequest(requestId1);
287        assertEquals("Non-streaming request IDs should not be cancellable",
288                CameraBinderTestUtils.BAD_VALUE, status);
289
290        status = mCameraUser.cancelRequest(requestIdStreaming);
291        assertEquals("Streaming request IDs should be cancellable", CameraBinderTestUtils.NO_ERROR,
292                status);
293
294        surface.release();
295        request.close();
296        metadata.close();
297    }
298
299    @SmallTest
300    public void testCameraInfo() throws RemoteException {
301        CameraMetadata info = new CameraMetadata();
302
303        int status = mCameraUser.getCameraInfo(/*out*/info);
304        assertEquals(CameraBinderTestUtils.NO_ERROR, status);
305
306        assertFalse(info.isEmpty());
307        assertNotNull(info.get(CameraPropertiesKeys.Scaler.AVAILABLE_FORMATS));
308    }
309
310    @SmallTest
311    public void testWaitUntilIdle() throws Exception {
312        CameraMetadata metadata = new CameraMetadata();
313        assertTrue(metadata.isEmpty());
314
315        CaptureRequest request = new CaptureRequest();
316        assertTrue(request.isEmpty());
317
318        // Create default request from template.
319        int status = mCameraUser.createDefaultRequest(TEMPLATE_PREVIEW, /* out */metadata);
320        assertEquals(CameraBinderTestUtils.NO_ERROR, status);
321        assertFalse(metadata.isEmpty());
322
323        request.swap(metadata);
324        assertFalse(request.isEmpty());
325        assertTrue(metadata.isEmpty());
326
327        SurfaceTexture surfaceTexture = new SurfaceTexture(/* ignored */0);
328        surfaceTexture.setDefaultBufferSize(640, 480);
329        Surface surface = new Surface(surfaceTexture);
330
331        // Create stream first. Pre-requisite to submitting a request using that
332        // stream.
333
334        int streamId = mCameraUser.createStream(/* ignored */10, /* ignored */20, /* ignored */30,
335                surface);
336        assertEquals(0, streamId);
337
338        request.addTarget(surface);
339
340        int requestIdStreaming = mCameraUser.submitRequest(request, /* streaming */true);
341        assertTrue("Request IDs should be non-negative", requestIdStreaming >= 0);
342
343        // Test Bad case first: waitUntilIdle when there is active repeating request
344        status = mCameraUser.waitUntilIdle();
345        assertEquals("waitUntilIdle is invalid operation when there is active repeating request",
346            CameraBinderTestUtils.INVALID_OPERATION, status);
347
348        // Test good case, waitUntilIdle when there is no active repeating request
349        status = mCameraUser.cancelRequest(requestIdStreaming);
350        assertEquals(CameraBinderTestUtils.NO_ERROR, status);
351        status = mCameraUser.waitUntilIdle();
352        assertEquals(CameraBinderTestUtils.NO_ERROR, status);
353    }
354
355}
356