From 01d7109ee1521aa7a25f4e9eb025edd04cf2ef54 Mon Sep 17 00:00:00 2001 From: Mattia Iavarone Date: Wed, 28 Aug 2019 17:55:06 +0200 Subject: [PATCH] Fix tests --- .../engine/CameraIntegration2Test.java | 5 +++ .../engine/CameraIntegrationTest.java | 26 +++++------ .../cameraview/frame/FrameManagerTest.java | 18 +++++--- .../gesture/ScrollGestureFinderTest.java | 6 ++- .../cameraview/engine/Camera2Engine.java | 28 +++++++++--- .../otaliastudios/cameraview/frame/Frame.java | 8 +++- .../cameraview/frame/FrameManager.java | 45 +++++++++---------- .../cameraview/frame/FrameTest.java | 4 +- 8 files changed, 88 insertions(+), 52 deletions(-) rename cameraview/src/{test => androidTest}/java/com/otaliastudios/cameraview/frame/FrameManagerTest.java (87%) diff --git a/cameraview/src/androidTest/java/com/otaliastudios/cameraview/engine/CameraIntegration2Test.java b/cameraview/src/androidTest/java/com/otaliastudios/cameraview/engine/CameraIntegration2Test.java index 32ff78a7..1995eeee 100644 --- a/cameraview/src/androidTest/java/com/otaliastudios/cameraview/engine/CameraIntegration2Test.java +++ b/cameraview/src/androidTest/java/com/otaliastudios/cameraview/engine/CameraIntegration2Test.java @@ -27,4 +27,9 @@ public class CameraIntegration2Test extends CameraIntegrationTest { protected Engine getEngine() { return Engine.CAMERA2; } + + @Override + public void testFrameProcessing_afterVideo() throws Exception { + super.testFrameProcessing_afterVideo(); + } } 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 2bfbdcfa..9f95dfe4 100644 --- a/cameraview/src/androidTest/java/com/otaliastudios/cameraview/engine/CameraIntegrationTest.java +++ b/cameraview/src/androidTest/java/com/otaliastudios/cameraview/engine/CameraIntegrationTest.java @@ -136,6 +136,7 @@ public abstract class CameraIntegrationTest extends BaseTest { } } + @SuppressWarnings("StatementWithEmptyBody") private CameraOptions openSync(boolean expectSuccess) { camera.open(); final Op open = new Op<>(true); @@ -143,10 +144,11 @@ public abstract class CameraIntegrationTest extends BaseTest { CameraOptions result = open.await(DELAY); if (expectSuccess) { assertNotNull("Can open", result); - // Extra wait for the bind state. - // TODO fix this and other while {} in this class in a more elegant way. - //noinspection StatementWithEmptyBody + // Extra wait for the bind and preview state, so we run tests in a fully operational + // state. If we didn't do so, we could have null values, for example, in getPictureSize + // or in getSnapshotSize. while (controller.getBindState() != CameraEngine.STATE_STARTED) {} + while (controller.getPreviewState() != CameraEngine.STATE_STARTED) {} } else { assertNull("Should not open", result); } @@ -194,6 +196,9 @@ public abstract class CameraIntegrationTest extends BaseTest { video.listen(); result = video.await(DELAY); } + // Sleep another 1000, because camera.isTakingVideo() might return false even + // if the result still has to be dispatched. Rare but could happen. + try { Thread.sleep(1000); } catch (InterruptedException ignore) {} } // Now we should be OK. @@ -684,14 +689,11 @@ public abstract class CameraIntegrationTest extends BaseTest { assertEquals(1, latch.getCount()); } - @SuppressWarnings("StatementWithEmptyBody") @Test public void testCapturePicture_size() { openSync(true); - // PictureSize can still be null after opened. - // TODO be more elegant - while (camera.getPictureSize() == null) {} Size size = camera.getPictureSize(); + assertNotNull(size); camera.takePicture(); PictureResult result = waitForPictureResult(true); assertNotNull(result); @@ -734,14 +736,11 @@ public abstract class CameraIntegrationTest extends BaseTest { assertEquals(1, latch.getCount()); } - @SuppressWarnings("StatementWithEmptyBody") @Test public void testCaptureSnapshot_size() { openSync(true); - // SnapshotSize can still be null after opened. - // TODO be more elegant - while (camera.getSnapshotSize() == null) {} Size size = camera.getSnapshotSize(); + assertNotNull(size); camera.takePictureSnapshot(); PictureResult result = waitForPictureResult(true); @@ -764,8 +763,8 @@ public abstract class CameraIntegrationTest extends BaseTest { // Expect 30 frames CountDownLatch latch = new CountDownLatch(30); doCountDown(latch).when(mock).process(any(Frame.class)); - boolean did = latch.await(60, TimeUnit.SECONDS); - assertTrue(did); + boolean did = latch.await(15, TimeUnit.SECONDS); + assertTrue("Latch count should be 0: " + latch.getCount(), did); } @Test @@ -811,6 +810,7 @@ public abstract class CameraIntegrationTest extends BaseTest { openSync(true); takeVideoSync(true,4000); waitForVideoResult(true); + assert30Frames(processor); } diff --git a/cameraview/src/test/java/com/otaliastudios/cameraview/frame/FrameManagerTest.java b/cameraview/src/androidTest/java/com/otaliastudios/cameraview/frame/FrameManagerTest.java similarity index 87% rename from cameraview/src/test/java/com/otaliastudios/cameraview/frame/FrameManagerTest.java rename to cameraview/src/androidTest/java/com/otaliastudios/cameraview/frame/FrameManagerTest.java index 3a3aca89..77375047 100644 --- a/cameraview/src/test/java/com/otaliastudios/cameraview/frame/FrameManagerTest.java +++ b/cameraview/src/androidTest/java/com/otaliastudios/cameraview/frame/FrameManagerTest.java @@ -3,14 +3,18 @@ package com.otaliastudios.cameraview.frame; import android.graphics.ImageFormat; +import androidx.test.ext.junit.runners.AndroidJUnit4; +import androidx.test.filters.SmallTest; + +import com.otaliastudios.cameraview.BaseTest; import com.otaliastudios.cameraview.size.Size; import org.junit.After; import org.junit.Before; import org.junit.Test; +import org.junit.runner.RunWith; import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNull; import static org.mockito.Matchers.any; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; @@ -18,7 +22,9 @@ import static org.mockito.Mockito.reset; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; -public class FrameManagerTest { +@RunWith(AndroidJUnit4.class) +@SmallTest +public class FrameManagerTest extends BaseTest { private FrameManager.BufferCallback callback; @@ -68,11 +74,11 @@ public class FrameManagerTest { // Since frame1 is already taken and poolSize = 1, a new Frame is created. Frame frame2 = manager.getFrame(new byte[length], 0, 0); // Release the first frame so it goes back into the pool. - manager.onFrameReleased(frame1); + manager.onFrameReleased(frame1, frame1.getData()); reset(callback); // Release the second. The pool is already full, so onBufferAvailable should not be called // since this Frame instance will NOT be reused. - manager.onFrameReleased(frame2); + manager.onFrameReleased(frame2, frame2.getData()); verify(callback, never()).onBufferAvailable(frame2.getData()); } @@ -87,7 +93,7 @@ public class FrameManagerTest { // Release the frame and ensure that onBufferAvailable is called. reset(callback); - manager.onFrameReleased(frame); + manager.onFrameReleased(frame, frame.getData()); verify(callback, times(1)).onBufferAvailable(picture); } @@ -105,7 +111,7 @@ public class FrameManagerTest { // Now release the old frame and ensure that onBufferAvailable is NOT called, // because the released data has wrong length. - manager.onFrameReleased(frame); + manager.onFrameReleased(frame, frame.getData()); reset(callback); verify(callback, never()).onBufferAvailable(picture); } diff --git a/cameraview/src/androidTest/java/com/otaliastudios/cameraview/gesture/ScrollGestureFinderTest.java b/cameraview/src/androidTest/java/com/otaliastudios/cameraview/gesture/ScrollGestureFinderTest.java index a7d6bb17..4a886ac2 100644 --- a/cameraview/src/androidTest/java/com/otaliastudios/cameraview/gesture/ScrollGestureFinderTest.java +++ b/cameraview/src/androidTest/java/com/otaliastudios/cameraview/gesture/ScrollGestureFinderTest.java @@ -21,6 +21,8 @@ import static org.junit.Assert.assertTrue; @SmallTest public class ScrollGestureFinderTest extends GestureFinderTest { + private final static long WAIT = 2000; // 500 was too short + @Override protected ScrollGestureFinder createFinder(@NonNull GestureFinder.Controller controller) { return new ScrollGestureFinder(controller); @@ -42,7 +44,7 @@ public class ScrollGestureFinderTest extends GestureFinderTest