summaryrefslogtreecommitdiffstats
path: root/tests_camera/src/com/android/camera/activity
diff options
context:
space:
mode:
authorDoris Liu <tianliu@google.com>2013-01-31 19:03:48 -0800
committerDoris Liu <tianliu@google.com>2013-02-01 13:02:08 -0800
commitffa6237aed496373cd578ccdb9d2a47cde90e25d (patch)
tree3d3bd259a201f5527ba4ef6048a8107b7f9d4b62 /tests_camera/src/com/android/camera/activity
parent865c12a79c5ab045d689c26be621d53586ee2a05 (diff)
downloadandroid_packages_apps_Snap-ffa6237aed496373cd578ccdb9d2a47cde90e25d.tar.gz
android_packages_apps_Snap-ffa6237aed496373cd578ccdb9d2a47cde90e25d.tar.bz2
android_packages_apps_Snap-ffa6237aed496373cd578ccdb9d2a47cde90e25d.zip
Move tests from camera to gallery2
Change-Id: If9143fff7d22295a5ad3bb01c4b860d07c3ee1c9
Diffstat (limited to 'tests_camera/src/com/android/camera/activity')
-rw-r--r--tests_camera/src/com/android/camera/activity/CameraActivityTest.java53
-rw-r--r--tests_camera/src/com/android/camera/activity/CameraTestCase.java246
2 files changed, 299 insertions, 0 deletions
diff --git a/tests_camera/src/com/android/camera/activity/CameraActivityTest.java b/tests_camera/src/com/android/camera/activity/CameraActivityTest.java
new file mode 100644
index 000000000..cc8ed83c3
--- /dev/null
+++ b/tests_camera/src/com/android/camera/activity/CameraActivityTest.java
@@ -0,0 +1,53 @@
+/*
+ * Copyright (C) 2012 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.camera.activity;
+
+import android.hardware.Camera.Parameters;
+import android.test.suitebuilder.annotation.LargeTest;
+
+import com.android.camera.CameraActivity;
+import com.android.camera.CameraHolder;
+import com.android.camera.R;
+
+import static com.google.testing.littlemock.LittleMock.doReturn;
+
+public class CameraActivityTest extends CameraTestCase <CameraActivity> {
+ public CameraActivityTest() {
+ super(CameraActivity.class);
+ }
+
+ @LargeTest
+ public void testFailToConnect() throws Exception {
+ super.internalTestFailToConnect();
+ }
+
+ @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_camera/src/com/android/camera/activity/CameraTestCase.java b/tests_camera/src/com/android/camera/activity/CameraTestCase.java
new file mode 100644
index 000000000..7c7c38daf
--- /dev/null
+++ b/tests_camera/src/com/android/camera/activity/CameraTestCase.java
@@ -0,0 +1,246 @@
+/*
+ * Copyright (C) 2012 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+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;
+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[];
+ protected CameraProxy mMockCamera[];
+ 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);
+ }
+
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+ AppDataDirGuesser.setInstance(new AppDataDirGuesser() {
+ @Override
+ public File guessSuitableDirectoryForGeneratedClasses() {
+ return getInstrumentation().getTargetContext().getCacheDir();
+ }
+ });
+ 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] = mMockBackCamera;
+ mMockCamera[1] = mMockFrontCamera;
+ doReturn(getParameters()).when(mMockCamera[0]).getParameters();
+ doReturn(getParameters()).when(mMockCamera[1]).getParameters();
+
+ mOneCameraInfo = new CameraInfo[1];
+ mOneCameraInfo[0] = new CameraInfo();
+ mOneCameraInfo[0].facing = CameraInfo.CAMERA_FACING_BACK;
+ mOneMockCamera = new CameraProxy[1];
+ 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
+ protected void tearDown() throws Exception {
+ super.tearDown();
+ CameraHolder.injectMockCamera(null, null);
+ }
+
+ protected void internalTestFailToConnect() throws Exception {
+ CameraHolder.injectMockCamera(mCameraInfo, null);
+
+ getActivity();
+ Instrumentation inst = getInstrumentation();
+ inst.waitForIdleSync();
+ inst.sendKeyDownUpSync(KeyEvent.KEYCODE_DPAD_CENTER); // close dialog
+ }
+
+ protected void performClick(final int id) {
+ Activity activity = getActivity();
+ getInstrumentation().waitForIdleSync();
+ assertNotNull(activity.findViewById(id));
+ Instrumentation inst = getInstrumentation();
+ inst.runOnMainSync(new Runnable() {
+ @Override
+ public void run() {
+ View v = getActivity().findViewById(id);
+ float x = (v.getLeft() + v.getRight()) / 2;
+ float y = (v.getTop() + v.getBottom()) / 2;
+ MotionEvent down = MotionEvent.obtain(0, 0,
+ MotionEvent.ACTION_DOWN, x, y, 0, 0, 0, 0, 0, 0, 0);
+ MotionEvent up = MotionEvent.obtain(0, 0,
+ MotionEvent.ACTION_UP, x, y, 0, 0, 0, 0, 0, 0, 0);
+ View parent = (View) v.getParent();
+ parent.dispatchTouchEvent(down);
+ parent.dispatchTouchEvent(up);
+ }
+ });
+ inst.waitForIdleSync();
+ }
+
+ protected void assertViewNotExist(int id) {
+ Activity activity = getActivity();
+ getInstrumentation().waitForIdleSync();
+ assertNull(activity.findViewById(id));
+ }
+
+ protected void assertViewNotVisible(int id) {
+ Activity activity = getActivity();
+ getInstrumentation().waitForIdleSync();
+ View view = activity.findViewById(id);
+ assertTrue(view.getVisibility() != View.VISIBLE);
+ }
+
+ protected static Parameters getParameters() {
+ synchronized (CameraTestCase.class) {
+ if (mParameters == null) {
+ mParameters = android.hardware.Camera.getEmptyParameters();
+ mParameters.unflatten("preview-format-values=yuv420sp,yuv420p,yuv422i-yuyv,yuv420p;" +
+ "preview-format=yuv420sp;" +
+ "preview-size-values=800x480;preview-size=800x480;" +
+ "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;" +
+ "focus-mode-values=continuous-video,auto,macro,infinity,continuous-picture;focus-mode=auto;" +
+ "preview-fps-range-values=(15000,30000);preview-fps-range=15000,30000;" +
+ "scene-mode-values=auto,action,night;scene-mode=auto;" +
+ "flash-mode-values=off,on,auto,torch;flash-mode=off;" +
+ "whitebalance-values=auto,daylight,fluorescent,incandescent;whitebalance=auto;" +
+ "effect-values=none,mono,sepia;effect=none;" +
+ "zoom-supported=true;zoom-ratios=100,200,400;max-zoom=2;" +
+ "picture-format-values=jpeg;picture-format=jpeg;" +
+ "min-exposure-compensation=-30;max-exposure-compensation=30;" +
+ "exposure-compensation=0;exposure-compensation-step=0.1;" +
+ "horizontal-view-angle=40;vertical-view-angle=40;");
+ }
+ }
+ return mParameters;
+ }
+}