blob: e05e1fc59f5210dee4e6503caef287532e3e7d21 [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
Zhijun He7b7a1542013-09-25 16:33:35 -070019import android.graphics.ImageFormat;
Igor Murashkin70725502013-06-25 20:27:06 +000020import android.graphics.SurfaceTexture;
Eino-Ville Talvala2f1a2e42013-07-25 17:12:05 -070021import android.hardware.camera2.CameraMetadata;
Igor Murashkin68f40062013-09-10 12:15:54 -070022import android.hardware.camera2.CameraCharacteristics;
Eino-Ville Talvala2f1a2e42013-07-25 17:12:05 -070023import android.hardware.camera2.CaptureRequest;
24import android.hardware.camera2.ICameraDeviceCallbacks;
25import android.hardware.camera2.ICameraDeviceUser;
Eino-Ville Talvala70c22072013-08-27 12:09:04 -070026import android.hardware.camera2.impl.CameraMetadataNative;
Igor Murashkin72f9f0a2014-05-14 15:46:10 -070027import android.hardware.camera2.impl.CaptureResultExtras;
Yin-Chia Yeh981e0562015-03-12 13:39:26 -070028import android.hardware.camera2.params.OutputConfiguration;
Ruben Brunk66ef6452013-08-08 13:05:30 -070029import android.hardware.camera2.utils.BinderHolder;
Zhijun He7b7a1542013-09-25 16:33:35 -070030import android.media.Image;
31import android.media.ImageReader;
32import android.os.Handler;
33import android.os.HandlerThread;
Igor Murashkin70725502013-06-25 20:27:06 +000034import android.os.RemoteException;
Eino-Ville Talvalae841d4e2013-09-05 09:04:08 -070035import android.os.SystemClock;
Igor Murashkin70725502013-06-25 20:27:06 +000036import android.test.AndroidTestCase;
37import android.test.suitebuilder.annotation.SmallTest;
38import android.util.Log;
39import android.view.Surface;
40
Eino-Ville Talvala2f1a2e42013-07-25 17:12:05 -070041import static android.hardware.camera2.CameraDevice.TEMPLATE_PREVIEW;
Igor Murashkin70725502013-06-25 20:27:06 +000042
43import com.android.mediaframeworktest.MediaFrameworkIntegrationTestRunner;
Zhijun He693e21d2013-07-31 14:16:14 -070044
45import org.mockito.ArgumentMatcher;
Eino-Ville Talvalae841d4e2013-09-05 09:04:08 -070046import org.mockito.ArgumentCaptor;
Zhijun He693e21d2013-07-31 14:16:14 -070047import static org.mockito.Mockito.*;
Igor Murashkin70725502013-06-25 20:27:06 +000048
49public class CameraDeviceBinderTest extends AndroidTestCase {
50 private static String TAG = "CameraDeviceBinderTest";
Zhijun He693e21d2013-07-31 14:16:14 -070051 // Number of streaming callbacks need to check.
52 private static int NUM_CALLBACKS_CHECKED = 10;
Ruben Brunk66ef6452013-08-08 13:05:30 -070053 // Wait for capture result timeout value: 1500ms
54 private final static int WAIT_FOR_COMPLETE_TIMEOUT_MS = 1500;
Eino-Ville Talvalae841d4e2013-09-05 09:04:08 -070055 // Wait for flush timeout value: 1000ms
56 private final static int WAIT_FOR_FLUSH_TIMEOUT_MS = 1000;
57 // Wait for idle timeout value: 2000ms
58 private final static int WAIT_FOR_IDLE_TIMEOUT_MS = 2000;
59 // Wait while camera device starts working on requests
60 private final static int WAIT_FOR_WORK_MS = 300;
Zhijun He7b7a1542013-09-25 16:33:35 -070061 // Default size is VGA, which is mandatory camera supported image size by CDD.
62 private static final int DEFAULT_IMAGE_WIDTH = 640;
63 private static final int DEFAULT_IMAGE_HEIGHT = 480;
64 private static final int MAX_NUM_IMAGES = 5;
Igor Murashkin70725502013-06-25 20:27:06 +000065
66 private int mCameraId;
67 private ICameraDeviceUser mCameraUser;
68 private CameraBinderTestUtils mUtils;
Zhijun He693e21d2013-07-31 14:16:14 -070069 private ICameraDeviceCallbacks.Stub mMockCb;
70 private Surface mSurface;
Yin-Chia Yeh981e0562015-03-12 13:39:26 -070071 private OutputConfiguration mOutputConfiguration;
Zhijun He7b7a1542013-09-25 16:33:35 -070072 private HandlerThread mHandlerThread;
73 private Handler mHandler;
74 ImageReader mImageReader;
Igor Murashkin70725502013-06-25 20:27:06 +000075
76 public CameraDeviceBinderTest() {
77 }
78
Zhijun He7b7a1542013-09-25 16:33:35 -070079 private class ImageDropperListener implements ImageReader.OnImageAvailableListener {
80
81 @Override
82 public void onImageAvailable(ImageReader reader) {
83 Image image = reader.acquireNextImage();
84 if (image != null) image.close();
85 }
86 }
87
Zhijun He693e21d2013-07-31 14:16:14 -070088 public class DummyCameraDeviceCallbacks extends ICameraDeviceCallbacks.Stub {
Igor Murashkin70725502013-06-25 20:27:06 +000089
Zhijun He438d77e2014-04-10 17:09:22 -070090 /*
91 * (non-Javadoc)
92 * @see
Eino-Ville Talvalaacc00952014-08-06 14:31:08 -070093 * android.hardware.camera2.ICameraDeviceCallbacks#onDeviceError(int,
Zhijun He438d77e2014-04-10 17:09:22 -070094 * android.hardware.camera2.CaptureResultExtras)
95 */
Eino-Ville Talvalaacc00952014-08-06 14:31:08 -070096 public void onDeviceError(int errorCode, CaptureResultExtras resultExtras)
Zhijun He438d77e2014-04-10 17:09:22 -070097 throws RemoteException {
98 // TODO Auto-generated method stub
99
Igor Murashkin70725502013-06-25 20:27:06 +0000100 }
101
Zhijun He438d77e2014-04-10 17:09:22 -0700102 /*
103 * (non-Javadoc)
Eino-Ville Talvalaacc00952014-08-06 14:31:08 -0700104 * @see android.hardware.camera2.ICameraDeviceCallbacks#onDeviceIdle()
Zhijun He438d77e2014-04-10 17:09:22 -0700105 */
Eino-Ville Talvalaacc00952014-08-06 14:31:08 -0700106 public void onDeviceIdle() throws RemoteException {
Zhijun He438d77e2014-04-10 17:09:22 -0700107 // TODO Auto-generated method stub
108
Eino-Ville Talvalae841d4e2013-09-05 09:04:08 -0700109 }
110
Zhijun He438d77e2014-04-10 17:09:22 -0700111 /*
112 * (non-Javadoc)
113 * @see
114 * android.hardware.camera2.ICameraDeviceCallbacks#onCaptureStarted(
115 * android.hardware.camera2.CaptureResultExtras, long)
116 */
117 public void onCaptureStarted(CaptureResultExtras resultExtras, long timestamp)
118 throws RemoteException {
119 // TODO Auto-generated method stub
120
Eino-Ville Talvalae841d4e2013-09-05 09:04:08 -0700121 }
122
Zhijun He438d77e2014-04-10 17:09:22 -0700123 /*
124 * (non-Javadoc)
125 * @see
126 * android.hardware.camera2.ICameraDeviceCallbacks#onResultReceived(
127 * android.hardware.camera2.impl.CameraMetadataNative,
128 * android.hardware.camera2.CaptureResultExtras)
129 */
130 public void onResultReceived(CameraMetadataNative result, CaptureResultExtras resultExtras)
131 throws RemoteException {
132 // TODO Auto-generated method stub
133
Igor Murashkin70725502013-06-25 20:27:06 +0000134 }
135 }
136
Eino-Ville Talvala70c22072013-08-27 12:09:04 -0700137 class IsMetadataNotEmpty extends ArgumentMatcher<CameraMetadataNative> {
Zhijun He20011882013-09-25 10:05:59 -0700138 @Override
Zhijun He693e21d2013-07-31 14:16:14 -0700139 public boolean matches(Object obj) {
Eino-Ville Talvala70c22072013-08-27 12:09:04 -0700140 return !((CameraMetadataNative) obj).isEmpty();
Zhijun He693e21d2013-07-31 14:16:14 -0700141 }
Eino-Ville Talvalae841d4e2013-09-05 09:04:08 -0700142 }
Zhijun He693e21d2013-07-31 14:16:14 -0700143
144 private void createDefaultSurface() {
Zhijun He7b7a1542013-09-25 16:33:35 -0700145 mImageReader =
146 ImageReader.newInstance(DEFAULT_IMAGE_WIDTH,
147 DEFAULT_IMAGE_HEIGHT,
148 ImageFormat.YUV_420_888,
149 MAX_NUM_IMAGES);
150 mImageReader.setOnImageAvailableListener(new ImageDropperListener(), mHandler);
151 mSurface = mImageReader.getSurface();
Yin-Chia Yeh981e0562015-03-12 13:39:26 -0700152 mOutputConfiguration = new OutputConfiguration(mSurface);
Zhijun He693e21d2013-07-31 14:16:14 -0700153 }
154
Eino-Ville Talvala70c22072013-08-27 12:09:04 -0700155 private CaptureRequest.Builder createDefaultBuilder(boolean needStream) throws Exception {
156 CameraMetadataNative metadata = new CameraMetadataNative();
Zhijun He693e21d2013-07-31 14:16:14 -0700157 assertTrue(metadata.isEmpty());
158
Zhijun He693e21d2013-07-31 14:16:14 -0700159 int status = mCameraUser.createDefaultRequest(TEMPLATE_PREVIEW, /* out */metadata);
160 assertEquals(CameraBinderTestUtils.NO_ERROR, status);
161 assertFalse(metadata.isEmpty());
162
Eino-Ville Talvala70c22072013-08-27 12:09:04 -0700163 CaptureRequest.Builder request = new CaptureRequest.Builder(metadata);
Zhijun He693e21d2013-07-31 14:16:14 -0700164 assertFalse(request.isEmpty());
Eino-Ville Talvala70c22072013-08-27 12:09:04 -0700165 assertFalse(metadata.isEmpty());
Zhijun He693e21d2013-07-31 14:16:14 -0700166 if (needStream) {
Yin-Chia Yeh981e0562015-03-12 13:39:26 -0700167 int streamId = mCameraUser.createStream(mOutputConfiguration);
Zhijun He693e21d2013-07-31 14:16:14 -0700168 assertEquals(0, streamId);
169 request.addTarget(mSurface);
170 }
171 return request;
172 }
173
174 private int submitCameraRequest(CaptureRequest request, boolean streaming) throws Exception {
Zhijun He438d77e2014-04-10 17:09:22 -0700175 int requestId = mCameraUser.submitRequest(request, streaming, null);
Igor Murashkin5c207ec2014-04-01 15:50:48 -0700176 assertTrue(
177 "Request IDs should be non-negative (expected: >= 0, actual: " + requestId + ")",
178 requestId >= 0);
Zhijun He693e21d2013-07-31 14:16:14 -0700179 return requestId;
180 }
181
Igor Murashkin70725502013-06-25 20:27:06 +0000182 @Override
183 protected void setUp() throws Exception {
184 super.setUp();
185
Zhijun He693e21d2013-07-31 14:16:14 -0700186 /**
187 * Workaround for mockito and JB-MR2 incompatibility
188 *
189 * Avoid java.lang.IllegalArgumentException: dexcache == null
190 * https://code.google.com/p/dexmaker/issues/detail?id=2
191 */
192 System.setProperty("dexmaker.dexcache", getContext().getCacheDir().toString());
Igor Murashkin70725502013-06-25 20:27:06 +0000193 mUtils = new CameraBinderTestUtils(getContext());
194
195 // This cannot be set in the constructor, since the onCreate isn't
196 // called yet
197 mCameraId = MediaFrameworkIntegrationTestRunner.mCameraId;
198
Zhijun He693e21d2013-07-31 14:16:14 -0700199 ICameraDeviceCallbacks.Stub dummyCallbacks = new DummyCameraDeviceCallbacks();
Igor Murashkin70725502013-06-25 20:27:06 +0000200
201 String clientPackageName = getContext().getPackageName();
202
Zhijun He693e21d2013-07-31 14:16:14 -0700203 mMockCb = spy(dummyCallbacks);
204
Ruben Brunk66ef6452013-08-08 13:05:30 -0700205 BinderHolder holder = new BinderHolder();
206 mUtils.getCameraService().connectDevice(mMockCb, mCameraId,
207 clientPackageName, CameraBinderTestUtils.USE_CALLING_UID, holder);
208 mCameraUser = ICameraDeviceUser.Stub.asInterface(holder.getBinder());
Igor Murashkin70725502013-06-25 20:27:06 +0000209 assertNotNull(String.format("Camera %s was null", mCameraId), mCameraUser);
Zhijun He7b7a1542013-09-25 16:33:35 -0700210 mHandlerThread = new HandlerThread(TAG);
211 mHandlerThread.start();
212 mHandler = new Handler(mHandlerThread.getLooper());
Zhijun He693e21d2013-07-31 14:16:14 -0700213 createDefaultSurface();
Igor Murashkin70725502013-06-25 20:27:06 +0000214
215 Log.v(TAG, String.format("Camera %s connected", mCameraId));
216 }
217
218 @Override
219 protected void tearDown() throws Exception {
220 mCameraUser.disconnect();
221 mCameraUser = null;
Zhijun He693e21d2013-07-31 14:16:14 -0700222 mSurface.release();
Zhijun He7b7a1542013-09-25 16:33:35 -0700223 mImageReader.close();
224 mHandlerThread.quitSafely();
Igor Murashkin70725502013-06-25 20:27:06 +0000225 }
226
227 @SmallTest
228 public void testCreateDefaultRequest() throws Exception {
Eino-Ville Talvala70c22072013-08-27 12:09:04 -0700229 CameraMetadataNative metadata = new CameraMetadataNative();
Igor Murashkin70725502013-06-25 20:27:06 +0000230 assertTrue(metadata.isEmpty());
231
232 int status = mCameraUser.createDefaultRequest(TEMPLATE_PREVIEW, /* out */metadata);
233 assertEquals(CameraBinderTestUtils.NO_ERROR, status);
234 assertFalse(metadata.isEmpty());
235
Igor Murashkin70725502013-06-25 20:27:06 +0000236 }
237
238 @SmallTest
239 public void testCreateStream() throws Exception {
Yin-Chia Yeh981e0562015-03-12 13:39:26 -0700240 int streamId = mCameraUser.createStream(mOutputConfiguration);
Igor Murashkin70725502013-06-25 20:27:06 +0000241 assertEquals(0, streamId);
242
243 assertEquals(CameraBinderTestUtils.ALREADY_EXISTS,
Yin-Chia Yeh981e0562015-03-12 13:39:26 -0700244 mCameraUser.createStream(mOutputConfiguration));
Igor Murashkin70725502013-06-25 20:27:06 +0000245
246 assertEquals(CameraBinderTestUtils.NO_ERROR, mCameraUser.deleteStream(streamId));
247 }
248
249 @SmallTest
250 public void testDeleteInvalidStream() throws Exception {
251 assertEquals(CameraBinderTestUtils.BAD_VALUE, mCameraUser.deleteStream(-1));
252 assertEquals(CameraBinderTestUtils.BAD_VALUE, mCameraUser.deleteStream(0));
253 assertEquals(CameraBinderTestUtils.BAD_VALUE, mCameraUser.deleteStream(1));
254 assertEquals(CameraBinderTestUtils.BAD_VALUE, mCameraUser.deleteStream(0xC0FFEE));
255 }
256
257 @SmallTest
258 public void testCreateStreamTwo() throws Exception {
259
260 // Create first stream
Yin-Chia Yeh981e0562015-03-12 13:39:26 -0700261 int streamId = mCameraUser.createStream(mOutputConfiguration);
Igor Murashkin70725502013-06-25 20:27:06 +0000262 assertEquals(0, streamId);
263
264 assertEquals(CameraBinderTestUtils.ALREADY_EXISTS,
Yin-Chia Yeh981e0562015-03-12 13:39:26 -0700265 mCameraUser.createStream(mOutputConfiguration));
Igor Murashkin70725502013-06-25 20:27:06 +0000266
Zhijun He693e21d2013-07-31 14:16:14 -0700267 // Create second stream with a different surface.
268 SurfaceTexture surfaceTexture = new SurfaceTexture(/* ignored */0);
269 surfaceTexture.setDefaultBufferSize(640, 480);
270 Surface surface2 = new Surface(surfaceTexture);
Yin-Chia Yeh981e0562015-03-12 13:39:26 -0700271 OutputConfiguration output2 = new OutputConfiguration(surface2);
Igor Murashkin70725502013-06-25 20:27:06 +0000272
Yin-Chia Yeh981e0562015-03-12 13:39:26 -0700273 int streamId2 = mCameraUser.createStream(output2);
Igor Murashkin70725502013-06-25 20:27:06 +0000274 assertEquals(1, streamId2);
275
276 // Clean up streams
Igor Murashkin70725502013-06-25 20:27:06 +0000277 assertEquals(CameraBinderTestUtils.NO_ERROR, mCameraUser.deleteStream(streamId));
278 assertEquals(CameraBinderTestUtils.NO_ERROR, mCameraUser.deleteStream(streamId2));
279 }
280
281 @SmallTest
282 public void testSubmitBadRequest() throws Exception {
283
Eino-Ville Talvala70c22072013-08-27 12:09:04 -0700284 CaptureRequest.Builder builder = createDefaultBuilder(/* needStream */false);
285 CaptureRequest request1 = builder.build();
Zhijun He438d77e2014-04-10 17:09:22 -0700286 int status = mCameraUser.submitRequest(request1, /* streaming */false, null);
Igor Murashkin70725502013-06-25 20:27:06 +0000287 assertEquals("Expected submitRequest to return BAD_VALUE " +
288 "since we had 0 surface targets set.", CameraBinderTestUtils.BAD_VALUE, status);
289
Eino-Ville Talvala70c22072013-08-27 12:09:04 -0700290 builder.addTarget(mSurface);
291 CaptureRequest request2 = builder.build();
Zhijun He438d77e2014-04-10 17:09:22 -0700292 status = mCameraUser.submitRequest(request2, /* streaming */false, null);
Igor Murashkin70725502013-06-25 20:27:06 +0000293 assertEquals("Expected submitRequest to return BAD_VALUE since " +
294 "the target surface wasn't registered with createStream.",
295 CameraBinderTestUtils.BAD_VALUE, status);
Igor Murashkin70725502013-06-25 20:27:06 +0000296 }
297
298 @SmallTest
299 public void testSubmitGoodRequest() throws Exception {
300
Eino-Ville Talvala70c22072013-08-27 12:09:04 -0700301 CaptureRequest.Builder builder = createDefaultBuilder(/* needStream */true);
302 CaptureRequest request = builder.build();
Igor Murashkin70725502013-06-25 20:27:06 +0000303
304 // Submit valid request twice.
Zhijun He693e21d2013-07-31 14:16:14 -0700305 int requestId1 = submitCameraRequest(request, /* streaming */false);
306 int requestId2 = submitCameraRequest(request, /* streaming */false);
Igor Murashkin70725502013-06-25 20:27:06 +0000307 assertNotSame("Request IDs should be unique for multiple requests", requestId1, requestId2);
308
Igor Murashkin70725502013-06-25 20:27:06 +0000309 }
310
311 @SmallTest
312 public void testSubmitStreamingRequest() throws Exception {
313
Eino-Ville Talvala70c22072013-08-27 12:09:04 -0700314 CaptureRequest.Builder builder = createDefaultBuilder(/* needStream */true);
315
316 CaptureRequest request = builder.build();
Igor Murashkin70725502013-06-25 20:27:06 +0000317
318 // Submit valid request once (non-streaming), and another time
319 // (streaming)
Zhijun He693e21d2013-07-31 14:16:14 -0700320 int requestId1 = submitCameraRequest(request, /* streaming */false);
Igor Murashkin70725502013-06-25 20:27:06 +0000321
Zhijun He693e21d2013-07-31 14:16:14 -0700322 int requestIdStreaming = submitCameraRequest(request, /* streaming */true);
Igor Murashkin70725502013-06-25 20:27:06 +0000323 assertNotSame("Request IDs should be unique for multiple requests", requestId1,
324 requestIdStreaming);
325
Zhijun He438d77e2014-04-10 17:09:22 -0700326 int status = mCameraUser.cancelRequest(-1, null);
Igor Murashkin70725502013-06-25 20:27:06 +0000327 assertEquals("Invalid request IDs should not be cancellable",
328 CameraBinderTestUtils.BAD_VALUE, status);
329
Zhijun He438d77e2014-04-10 17:09:22 -0700330 status = mCameraUser.cancelRequest(requestId1, null);
Igor Murashkin70725502013-06-25 20:27:06 +0000331 assertEquals("Non-streaming request IDs should not be cancellable",
332 CameraBinderTestUtils.BAD_VALUE, status);
333
Zhijun He438d77e2014-04-10 17:09:22 -0700334 status = mCameraUser.cancelRequest(requestIdStreaming, null);
Igor Murashkin70725502013-06-25 20:27:06 +0000335 assertEquals("Streaming request IDs should be cancellable", CameraBinderTestUtils.NO_ERROR,
336 status);
337
Igor Murashkin70725502013-06-25 20:27:06 +0000338 }
Igor Murashkind7bf1772013-07-12 18:01:31 -0700339
340 @SmallTest
341 public void testCameraInfo() throws RemoteException {
Eino-Ville Talvala70c22072013-08-27 12:09:04 -0700342 CameraMetadataNative info = new CameraMetadataNative();
Igor Murashkind7bf1772013-07-12 18:01:31 -0700343
344 int status = mCameraUser.getCameraInfo(/*out*/info);
345 assertEquals(CameraBinderTestUtils.NO_ERROR, status);
346
347 assertFalse(info.isEmpty());
Igor Murashkin68f40062013-09-10 12:15:54 -0700348 assertNotNull(info.get(CameraCharacteristics.SCALER_AVAILABLE_FORMATS));
Igor Murashkind7bf1772013-07-12 18:01:31 -0700349 }
350
Zhijun He7f4d3142013-07-23 07:54:38 -0700351 @SmallTest
Zhijun He20011882013-09-25 10:05:59 -0700352 public void testCameraCharacteristics() throws RemoteException {
353 CameraMetadataNative info = new CameraMetadataNative();
354
355 int status = mUtils.getCameraService().getCameraCharacteristics(mCameraId, /*out*/info);
356 assertEquals(CameraBinderTestUtils.NO_ERROR, status);
357
358 assertFalse(info.isEmpty());
359 assertNotNull(info.get(CameraCharacteristics.SCALER_AVAILABLE_FORMATS));
360 }
361
362 @SmallTest
Zhijun He7f4d3142013-07-23 07:54:38 -0700363 public void testWaitUntilIdle() throws Exception {
Eino-Ville Talvala70c22072013-08-27 12:09:04 -0700364 CaptureRequest.Builder builder = createDefaultBuilder(/* needStream */true);
365 int requestIdStreaming = submitCameraRequest(builder.build(), /* streaming */true);
Zhijun He7f4d3142013-07-23 07:54:38 -0700366
367 // Test Bad case first: waitUntilIdle when there is active repeating request
Zhijun He693e21d2013-07-31 14:16:14 -0700368 int status = mCameraUser.waitUntilIdle();
Zhijun He7f4d3142013-07-23 07:54:38 -0700369 assertEquals("waitUntilIdle is invalid operation when there is active repeating request",
370 CameraBinderTestUtils.INVALID_OPERATION, status);
371
372 // Test good case, waitUntilIdle when there is no active repeating request
Zhijun He438d77e2014-04-10 17:09:22 -0700373 status = mCameraUser.cancelRequest(requestIdStreaming, null);
Zhijun He7f4d3142013-07-23 07:54:38 -0700374 assertEquals(CameraBinderTestUtils.NO_ERROR, status);
375 status = mCameraUser.waitUntilIdle();
376 assertEquals(CameraBinderTestUtils.NO_ERROR, status);
377 }
378
Zhijun He693e21d2013-07-31 14:16:14 -0700379 @SmallTest
380 public void testCaptureResultCallbacks() throws Exception {
381 IsMetadataNotEmpty matcher = new IsMetadataNotEmpty();
Eino-Ville Talvala70c22072013-08-27 12:09:04 -0700382 CaptureRequest request = createDefaultBuilder(/* needStream */true).build();
Zhijun He693e21d2013-07-31 14:16:14 -0700383
384 // Test both single request and streaming request.
Zhijun He693e21d2013-07-31 14:16:14 -0700385 verify(mMockCb, timeout(WAIT_FOR_COMPLETE_TIMEOUT_MS).times(1)).onResultReceived(
Zhijun He438d77e2014-04-10 17:09:22 -0700386 argThat(matcher),
387 any(CaptureResultExtras.class));
Zhijun He693e21d2013-07-31 14:16:14 -0700388
Zhijun He693e21d2013-07-31 14:16:14 -0700389 verify(mMockCb, timeout(WAIT_FOR_COMPLETE_TIMEOUT_MS).atLeast(NUM_CALLBACKS_CHECKED))
390 .onResultReceived(
Zhijun He438d77e2014-04-10 17:09:22 -0700391 argThat(matcher),
392 any(CaptureResultExtras.class));
Zhijun He693e21d2013-07-31 14:16:14 -0700393 }
Eino-Ville Talvala8ebd52b2013-08-13 12:09:44 -0700394
395 @SmallTest
Eino-Ville Talvalae841d4e2013-09-05 09:04:08 -0700396 public void testCaptureStartedCallbacks() throws Exception {
397 CaptureRequest request = createDefaultBuilder(/* needStream */true).build();
398
399 ArgumentCaptor<Long> timestamps = ArgumentCaptor.forClass(Long.class);
400
401 // Test both single request and streaming request.
402 int requestId1 = submitCameraRequest(request, /* streaming */false);
403 verify(mMockCb, timeout(WAIT_FOR_COMPLETE_TIMEOUT_MS).times(1)).onCaptureStarted(
Zhijun He438d77e2014-04-10 17:09:22 -0700404 any(CaptureResultExtras.class),
Eino-Ville Talvalae841d4e2013-09-05 09:04:08 -0700405 anyLong());
406
407 int streamingId = submitCameraRequest(request, /* streaming */true);
408 verify(mMockCb, timeout(WAIT_FOR_COMPLETE_TIMEOUT_MS).atLeast(NUM_CALLBACKS_CHECKED))
409 .onCaptureStarted(
Zhijun He438d77e2014-04-10 17:09:22 -0700410 any(CaptureResultExtras.class),
Eino-Ville Talvalae841d4e2013-09-05 09:04:08 -0700411 timestamps.capture());
412
413 long timestamp = 0; // All timestamps should be larger than 0.
414 for (Long nextTimestamp : timestamps.getAllValues()) {
415 Log.v(TAG, "next t: " + nextTimestamp + " current t: " + timestamp);
416 assertTrue("Captures are out of order", timestamp < nextTimestamp);
417 timestamp = nextTimestamp;
418 }
419 }
420
421 @SmallTest
422 public void testIdleCallback() throws Exception {
423 int status;
424 CaptureRequest request = createDefaultBuilder(/* needStream */true).build();
425
426 // Try streaming
427 int streamingId = submitCameraRequest(request, /* streaming */true);
428
429 // Wait a bit to fill up the queue
430 SystemClock.sleep(WAIT_FOR_WORK_MS);
431
432 // Cancel and make sure we eventually quiesce
Zhijun He438d77e2014-04-10 17:09:22 -0700433 status = mCameraUser.cancelRequest(streamingId, null);
Eino-Ville Talvalae841d4e2013-09-05 09:04:08 -0700434
Eino-Ville Talvalaacc00952014-08-06 14:31:08 -0700435 verify(mMockCb, timeout(WAIT_FOR_IDLE_TIMEOUT_MS).times(1)).onDeviceIdle();
Eino-Ville Talvalae841d4e2013-09-05 09:04:08 -0700436
437 // Submit a few capture requests
438 int requestId1 = submitCameraRequest(request, /* streaming */false);
439 int requestId2 = submitCameraRequest(request, /* streaming */false);
440 int requestId3 = submitCameraRequest(request, /* streaming */false);
441 int requestId4 = submitCameraRequest(request, /* streaming */false);
442 int requestId5 = submitCameraRequest(request, /* streaming */false);
443
444 // And wait for more idle
Eino-Ville Talvalaacc00952014-08-06 14:31:08 -0700445 verify(mMockCb, timeout(WAIT_FOR_IDLE_TIMEOUT_MS).times(2)).onDeviceIdle();
Eino-Ville Talvalae841d4e2013-09-05 09:04:08 -0700446
447 }
448
449 @SmallTest
Eino-Ville Talvala8ebd52b2013-08-13 12:09:44 -0700450 public void testFlush() throws Exception {
451 int status;
452
453 // Initial flush should work
Zhijun He438d77e2014-04-10 17:09:22 -0700454 status = mCameraUser.flush(null);
Eino-Ville Talvala8ebd52b2013-08-13 12:09:44 -0700455 assertEquals(CameraBinderTestUtils.NO_ERROR, status);
456
457 // Then set up a stream
Eino-Ville Talvala70c22072013-08-27 12:09:04 -0700458 CaptureRequest request = createDefaultBuilder(/* needStream */true).build();
Eino-Ville Talvala8ebd52b2013-08-13 12:09:44 -0700459
460 // Flush should still be a no-op, really
Zhijun He438d77e2014-04-10 17:09:22 -0700461 status = mCameraUser.flush(null);
Eino-Ville Talvala8ebd52b2013-08-13 12:09:44 -0700462 assertEquals(CameraBinderTestUtils.NO_ERROR, status);
463
464 // Submit a few capture requests
465 int requestId1 = submitCameraRequest(request, /* streaming */false);
466 int requestId2 = submitCameraRequest(request, /* streaming */false);
467 int requestId3 = submitCameraRequest(request, /* streaming */false);
468 int requestId4 = submitCameraRequest(request, /* streaming */false);
469 int requestId5 = submitCameraRequest(request, /* streaming */false);
470
Eino-Ville Talvalae841d4e2013-09-05 09:04:08 -0700471 // Then flush and wait for idle
Zhijun He438d77e2014-04-10 17:09:22 -0700472 status = mCameraUser.flush(null);
Eino-Ville Talvala8ebd52b2013-08-13 12:09:44 -0700473 assertEquals(CameraBinderTestUtils.NO_ERROR, status);
474
Eino-Ville Talvalaacc00952014-08-06 14:31:08 -0700475 verify(mMockCb, timeout(WAIT_FOR_FLUSH_TIMEOUT_MS).times(1)).onDeviceIdle();
Eino-Ville Talvalae841d4e2013-09-05 09:04:08 -0700476
477 // Now a streaming request
478 int streamingId = submitCameraRequest(request, /* streaming */true);
479
480 // Wait a bit to fill up the queue
481 SystemClock.sleep(WAIT_FOR_WORK_MS);
482
483 // Then flush and wait for the idle callback
Zhijun He438d77e2014-04-10 17:09:22 -0700484 status = mCameraUser.flush(null);
Eino-Ville Talvalae841d4e2013-09-05 09:04:08 -0700485 assertEquals(CameraBinderTestUtils.NO_ERROR, status);
486
Eino-Ville Talvalaacc00952014-08-06 14:31:08 -0700487 verify(mMockCb, timeout(WAIT_FOR_FLUSH_TIMEOUT_MS).times(2)).onDeviceIdle();
Eino-Ville Talvalae841d4e2013-09-05 09:04:08 -0700488
Eino-Ville Talvala8ebd52b2013-08-13 12:09:44 -0700489 // TODO: When errors are hooked up, count that errors + successful
490 // requests equal to 5.
491 }
Igor Murashkin70725502013-06-25 20:27:06 +0000492}