From 1a37c4c92c6f7f15cb7d19c037ae8750495bfadd Mon Sep 17 00:00:00 2001 From: Mattia Iavarone Date: Thu, 12 Dec 2019 16:54:43 +0100 Subject: [PATCH] Test --- .github/workflows/emulator_script.sh | 2 +- .../engine/CameraIntegrationTest.java | 23 +------ .../cameraview/tools/RecoverCameraRule.java | 66 ------------------- .../cameraview/engine/CameraEngine.java | 11 ++-- 4 files changed, 8 insertions(+), 94 deletions(-) delete mode 100644 cameraview/src/androidTest/java/com/otaliastudios/cameraview/tools/RecoverCameraRule.java diff --git a/.github/workflows/emulator_script.sh b/.github/workflows/emulator_script.sh index 27592975..e2c7d1fb 100755 --- a/.github/workflows/emulator_script.sh +++ b/.github/workflows/emulator_script.sh @@ -1,4 +1,4 @@ #!/usr/bin/env bash adb logcat -c -adb logcat CameraOrchestrator:I CameraEngine:I CameraView:I CameraCallbacks:I CameraIntegrationTest:I MediaEncoderEngine:I MediaEncoder:I AudioMediaEncoder:I VideoMediaEncoder:I TextureMediaEncoder:I VideoRecorder:I FullVideoRecorder:I SnapshotVideoRecorder:I MessageQueue:W MPEG4Writer:I *:E -v color & +adb logcat CameraOrchestrator:I CameraEngine:I CameraView:I CameraCallbacks:I CameraIntegrationTest:I MediaEncoderEngine:I MediaEncoder:I AudioMediaEncoder:I VideoMediaEncoder:I TextureMediaEncoder:I VideoRecorder:I FullVideoRecorder:I SnapshotVideoRecorder:I MessageQueue:W WorkerHandler:I MPEG4Writer:I *:E -v color & ./gradlew cameraview:connectedCheck \ No newline at end of file diff --git a/cameraview/src/androidTest/java/com/otaliastudios/cameraview/engine/CameraIntegrationTest.java b/cameraview/src/androidTest/java/com/otaliastudios/cameraview/engine/CameraIntegrationTest.java index 2ba47b8e..2aafc6a9 100644 --- a/cameraview/src/androidTest/java/com/otaliastudios/cameraview/engine/CameraIntegrationTest.java +++ b/cameraview/src/androidTest/java/com/otaliastudios/cameraview/engine/CameraIntegrationTest.java @@ -33,11 +33,9 @@ import com.otaliastudios.cameraview.tools.Op; import com.otaliastudios.cameraview.internal.utils.WorkerHandler; import com.otaliastudios.cameraview.overlay.Overlay; import com.otaliastudios.cameraview.size.Size; -import com.otaliastudios.cameraview.tools.RecoverCameraRule; import androidx.annotation.NonNull; import androidx.annotation.Nullable; -import androidx.test.annotation.UiThreadTest; import androidx.test.rule.ActivityTestRule; import org.junit.After; @@ -75,21 +73,6 @@ public abstract class CameraIntegrationTest extends Base @Rule public ActivityTestRule activityRule = new ActivityTestRule<>(TestActivity.class); - @Rule - public RecoverCameraRule recoverRule = new RecoverCameraRule(new RecoverCameraRule.Callback() { - @NonNull - @Override - public CameraView getCamera() { - return camera; - } - - @NonNull - @Override - public CameraLogger getLogger() { - return LOG; - } - }); - protected CameraView camera; protected E controller; private CameraListener listener; @@ -218,15 +201,15 @@ public abstract class CameraIntegrationTest extends Base // power saving mode which makes the CPU extremely slow. This is especially problematic // with video snapshots where we do lots of processing. The videoEnd callback can return // long after the actual stop() call, so if we're still processing, let's wait more. - if (expectSuccess && camera.isTakingVideo()) { - while (camera.isTakingVideo()) { + if (expectSuccess) { + while (wait1Result == null) { LOG.w("[WAIT VIDEO]", "Waiting extra", DELAY, "milliseconds..."); wait1.listen(); wait1Result = wait1.await(DELAY); } } - // Now wait for onVideoResult(). + // Now wait for onVideoResult(). One cycle should be enough. LOG.i("[WAIT VIDEO]", "Waiting for onVideoTaken()..."); VideoResult wait2Result = wait2.await(DELAY); diff --git a/cameraview/src/androidTest/java/com/otaliastudios/cameraview/tools/RecoverCameraRule.java b/cameraview/src/androidTest/java/com/otaliastudios/cameraview/tools/RecoverCameraRule.java deleted file mode 100644 index aa9f9856..00000000 --- a/cameraview/src/androidTest/java/com/otaliastudios/cameraview/tools/RecoverCameraRule.java +++ /dev/null @@ -1,66 +0,0 @@ -package com.otaliastudios.cameraview.tools; - -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; - -import com.otaliastudios.cameraview.CameraException; -import com.otaliastudios.cameraview.CameraListener; -import com.otaliastudios.cameraview.CameraLogger; -import com.otaliastudios.cameraview.CameraView; - -import org.junit.rules.TestRule; -import org.junit.runner.Description; -import org.junit.runners.model.Statement; - -public class RecoverCameraRule implements TestRule { - - public interface Callback { - @NonNull - CameraView getCamera(); - @NonNull - CameraLogger getLogger(); - } - - private final Callback mCallback; - - public RecoverCameraRule(@NonNull Callback callback) { - mCallback = callback; - } - - @Override - public Statement apply(final Statement base, Description description) { - return new Statement() { - @Override - public void evaluate() throws Throwable { - try { - base.evaluate(); - } catch (Throwable throwable) { - mCallback.getLogger().w("**************************************"); - mCallback.getLogger().w("!!! TEST FAILED? THROWABLE FOUND:", throwable); - mCallback.getLogger().w("**************************************"); - CameraException exception = findCameraException(throwable); - if (exception != null) { - mCallback.getLogger().e("**************************************"); - mCallback.getLogger().e("!!! TEST FAILED, TRYING TO RECOVER !!!"); - mCallback.getLogger().e("**************************************"); - mCallback.getCamera().destroy(); - base.evaluate(); - } else { - throw throwable; - } - } - } - }; - } - - @Nullable - private CameraException findCameraException(@NonNull Throwable throwable) { - if (throwable instanceof CameraException - && ((CameraException) throwable).isUnrecoverable()) { - return (CameraException) throwable; - } - if (throwable.getCause() == null) return null; - if (throwable == throwable.getCause()) return null; - return findCameraException(throwable.getCause()); - } -} diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/engine/CameraEngine.java b/cameraview/src/main/java/com/otaliastudios/cameraview/engine/CameraEngine.java index 8e80718c..f6eca562 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/engine/CameraEngine.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/engine/CameraEngine.java @@ -214,10 +214,9 @@ public abstract class CameraEngine implements protected CameraEngine(@NonNull Callback callback) { mCallback = callback; mCrashHandler = new Handler(Looper.getMainLooper()); - mHandler = WorkerHandler.get("CameraViewEngine"); - mHandler.getThread().setUncaughtExceptionHandler(new CrashExceptionHandler()); mFrameManager = instantiateFrameManager(); mAngles = new Angles(); + recreateHandler(); } public void setPreview(@NonNull CameraPreview cameraPreview) { @@ -310,7 +309,7 @@ public abstract class CameraEngine implements } private void recreateHandler() { - mHandler.destroy(); + if (mHandler != null) mHandler.destroy(); mHandler = WorkerHandler.get("CameraViewEngine"); mHandler.getThread().setUncaughtExceptionHandler(new CrashExceptionHandler()); } @@ -370,10 +369,8 @@ public abstract class CameraEngine implements // onStopEngine() implementation and comments. LOG.w("DESTROY: Could not destroy synchronously after 6 seconds.", "Current thread:", Thread.currentThread(), - "Handler thread: ", mHandler.getThread(), - "Trying again on a new thread..."); - recreateHandler(); - destroy(unrecoverably); + "Handler thread: ", mHandler.getThread()); + // TODO find a solution } } catch (InterruptedException ignore) {} }