diff options
author | Wu-cheng Li <wuchengli@google.com> | 2012-04-20 13:56:30 +0800 |
---|---|---|
committer | Wu-cheng Li <wuchengli@google.com> | 2012-04-23 16:22:55 +0800 |
commit | e7386ae9fb2f88313f4d52707db60665e5624971 (patch) | |
tree | 817a5b950016392a429183cb38f5f524ce9d179f /tests | |
parent | b130b9af898f597eb7506dd2f29f0961b858176d (diff) | |
download | Camera-e7386ae9fb2f88313f4d52707db60665e5624971.tar.gz |
Add a picture taking test.
bug:5888633
Change-Id: I2a08101e4a66265d3d0a8a82427d9d41b81c2d2f
Diffstat (limited to 'tests')
-rw-r--r-- | tests/src/com/android/camera/activity/CameraActivityTest.java | 18 | ||||
-rw-r--r-- | tests/src/com/android/camera/activity/CameraTestCase.java | 99 |
2 files changed, 113 insertions, 4 deletions
diff --git a/tests/src/com/android/camera/activity/CameraActivityTest.java b/tests/src/com/android/camera/activity/CameraActivityTest.java index 58fb273e..f336aa30 100644 --- a/tests/src/com/android/camera/activity/CameraActivityTest.java +++ b/tests/src/com/android/camera/activity/CameraActivityTest.java @@ -17,6 +17,8 @@ package com.android.camera.activity; import com.android.camera.Camera; +import com.android.camera.CameraHolder; +import com.android.camera.R; import android.test.suitebuilder.annotation.LargeTest; @@ -39,4 +41,20 @@ public class CameraActivityTest extends CameraTestCase <Camera> { public void testOneCamera() throws Exception { super.internalTestOneCamera(); } + + @LargeTest + public void testTakePicture() throws Exception { + CameraHolder.injectMockCamera(mCameraInfo, mOneMockCamera); + + getActivity(); + getInstrumentation().waitForIdleSync(); + + // Press shutter button to take a picture. + performClick(R.id.shutter_button); + getInstrumentation().waitForIdleSync(); + + // Force the activity to finish. + getActivity().finish(); + getInstrumentation().waitForIdleSync(); + } } diff --git a/tests/src/com/android/camera/activity/CameraTestCase.java b/tests/src/com/android/camera/activity/CameraTestCase.java index 1c2023bd..03b2fd43 100644 --- a/tests/src/com/android/camera/activity/CameraTestCase.java +++ b/tests/src/com/android/camera/activity/CameraTestCase.java @@ -18,8 +18,12 @@ package com.android.camera.activity; import android.app.Activity; import android.app.Instrumentation; +import android.hardware.Camera; +import android.hardware.Camera.AutoFocusCallback; import android.hardware.Camera.CameraInfo; import android.hardware.Camera.Parameters; +import android.hardware.Camera.PictureCallback; +import android.hardware.Camera.ShutterCallback; import android.test.ActivityInstrumentationTestCase2; import android.view.KeyEvent; import android.view.MotionEvent; @@ -28,12 +32,24 @@ import android.view.View; import com.android.camera.CameraHolder; import com.android.camera.CameraManager.CameraProxy; import com.android.camera.R; +import com.android.camera.Util; import static com.google.testing.littlemock.LittleMock.mock; +import static com.google.testing.littlemock.LittleMock.doAnswer; import static com.google.testing.littlemock.LittleMock.doReturn; +import static com.google.testing.littlemock.LittleMock.anyObject; import com.google.testing.littlemock.AppDataDirGuesser; +import com.google.testing.littlemock.ArgumentCaptor; +import com.google.testing.littlemock.Captor; +import com.google.testing.littlemock.LittleMock; +import com.google.testing.littlemock.Mock; import java.io.File; +import java.io.ByteArrayOutputStream; +import java.io.InputStream; +import java.io.IOException; +import java.util.concurrent.Callable; + public class CameraTestCase<T extends Activity> extends ActivityInstrumentationTestCase2<T> { protected CameraInfo mCameraInfo[]; @@ -41,6 +57,52 @@ public class CameraTestCase<T extends Activity> extends ActivityInstrumentationT protected CameraInfo mOneCameraInfo[]; protected CameraProxy mOneMockCamera[]; private static Parameters mParameters; + private byte[] mBlankJpeg; + @Mock private CameraProxy mMockBackCamera; + @Mock private CameraProxy mMockFrontCamera; + @Captor private ArgumentCaptor<ShutterCallback> mShutterCallback; + @Captor private ArgumentCaptor<PictureCallback> mRawPictureCallback; + @Captor private ArgumentCaptor<PictureCallback> mJpegPictureCallback; + @Captor private ArgumentCaptor<AutoFocusCallback> mAutoFocusCallback; + Callable<Object> mAutoFocusCallable = new AutoFocusCallable(); + Callable<Object> mTakePictureCallable = new TakePictureCallable(); + + private class TakePictureCallable implements Callable<Object> { + @Override + public Object call() throws Exception { + Runnable runnable = new Runnable() { + @Override + public void run() { + readBlankJpeg(); + Camera camera = mOneMockCamera[0].getCamera(); + mShutterCallback.getValue().onShutter(); + mRawPictureCallback.getValue().onPictureTaken(null, camera); + mJpegPictureCallback.getValue().onPictureTaken(mBlankJpeg, camera); + } + }; + // Probably need some delay. Make sure shutter callback is called + // after onShutterButtonFocus(false). + getActivity().findViewById(R.id.gl_root_view).postDelayed(runnable, 50); + return null; + } + } + + private class AutoFocusCallable implements Callable<Object> { + @Override + public Object call() throws Exception { + Runnable runnable = new Runnable() { + @Override + public void run() { + Camera camera = mOneMockCamera[0].getCamera(); + mAutoFocusCallback.getValue().onAutoFocus(true, camera); + } + }; + // Need some delay. Otherwise, focus callback will be run before + // onShutterButtonClick + getActivity().findViewById(R.id.gl_root_view).postDelayed(runnable, 50); + return null; + } + } public CameraTestCase(Class<T> activityClass) { super(activityClass); @@ -56,14 +118,15 @@ public class CameraTestCase<T extends Activity> extends ActivityInstrumentationT } }); AppDataDirGuesser.getsInstance().guessSuitableDirectoryForGeneratedClasses(); + LittleMock.initMocks(this); mCameraInfo = new CameraInfo[2]; mCameraInfo[0] = new CameraInfo(); mCameraInfo[0].facing = CameraInfo.CAMERA_FACING_BACK; mCameraInfo[1] = new CameraInfo(); mCameraInfo[1].facing = CameraInfo.CAMERA_FACING_FRONT; mMockCamera = new CameraProxy[2]; - mMockCamera[0] = mock(CameraProxy.class); - mMockCamera[1] = mock(CameraProxy.class); + mMockCamera[0] = mMockBackCamera; + mMockCamera[1] = mMockFrontCamera; doReturn(getParameters()).when(mMockCamera[0]).getParameters(); doReturn(getParameters()).when(mMockCamera[1]).getParameters(); @@ -71,8 +134,36 @@ public class CameraTestCase<T extends Activity> extends ActivityInstrumentationT mOneCameraInfo[0] = new CameraInfo(); mOneCameraInfo[0].facing = CameraInfo.CAMERA_FACING_BACK; mOneMockCamera = new CameraProxy[1]; - mOneMockCamera[0] = mock(CameraProxy.class); + mOneMockCamera[0] = mMockBackCamera; doReturn(getParameters()).when(mOneMockCamera[0]).getParameters(); + + // Mock takePicture call. + doAnswer(mTakePictureCallable).when(mMockBackCamera).takePicture( + mShutterCallback.capture(), mRawPictureCallback.capture(), + (PictureCallback) anyObject(), mJpegPictureCallback.capture()); + + // Mock autoFocus call. + doAnswer(mAutoFocusCallable).when(mMockBackCamera).autoFocus( + mAutoFocusCallback.capture()); + } + + private void readBlankJpeg() { + InputStream ins = getActivity().getResources().openRawResource(R.raw.blank); + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + int size = 0; + + // Read the entire resource into a local byte buffer. + byte[] buffer = new byte[1024]; + try { + while((size = ins.read(buffer, 0, 1024)) >= 0){ + outputStream.write(buffer, 0, size); + } + } catch (IOException e) { + // ignore + } finally { + Util.closeSilently(ins); + } + mBlankJpeg = outputStream.toByteArray(); } @Override @@ -145,7 +236,7 @@ public class CameraTestCase<T extends Activity> extends ActivityInstrumentationT mParameters.unflatten("preview-format-values=yuv420sp,yuv420p,yuv422i-yuyv,yuv420p;" + "preview-format=yuv420sp;" + "preview-size-values=800x480;preview-size=800x480;" + - "picture-size-values=2592x1944;picture-size=2592x1944;" + + "picture-size-values=320x240;picture-size=320x240;" + "jpeg-thumbnail-size-values=320x240,0x0;jpeg-thumbnail-width=320;jpeg-thumbnail-height=240;" + "jpeg-thumbnail-quality=60;jpeg-quality=95;" + "preview-frame-rate-values=30,15;preview-frame-rate=30;" + |