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