blob: 1f478d2e56e8497f4fd04d8b06608ce867f6f8c1 [file] [log] [blame]
Igor Murashkin70725502013-06-25 20:27:06 +00001/*
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;
Igor Murashkind7bf1772013-07-12 18:01:31 -070021import android.hardware.photography.CameraPropertiesKeys;
Igor Murashkin70725502013-06-25 20:27:06 +000022import 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 */true);
275 assertTrue("Request IDs should be non-negative", requestId1 >= 0);
276
277 int requestIdStreaming = mCameraUser.submitRequest(request, /* streaming */false);
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 }
Igor Murashkind7bf1772013-07-12 18:01:31 -0700298
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
Igor Murashkin70725502013-06-25 20:27:06 +0000310}