diff --git a/camera/ndk/ndk_vendor/tests/AImageReaderVendorTest.cpp b/camera/ndk/ndk_vendor/tests/AImageReaderVendorTest.cpp index b1e501b215..579412ecf4 100644 --- a/camera/ndk/ndk_vendor/tests/AImageReaderVendorTest.cpp +++ b/camera/ndk/ndk_vendor/tests/AImageReaderVendorTest.cpp @@ -209,7 +209,18 @@ class CameraHelper { int takePicture() { int seqId; - return ACameraCaptureSession_capture(mSession, nullptr, 1, &mStillRequest, &seqId); + return ACameraCaptureSession_capture(mSession, &mCaptureCallbacks, 1, &mStillRequest, + &seqId); + } + + bool checkCallbacks(int pictureCount) { + std::lock_guard lock(mMutex); + if (mCompletedCaptureCallbackCount != pictureCount) { + ALOGE("Completed capture callaback count not as expected. expected %d actual %d", + pictureCount, mCompletedCaptureCallbackCount); + return false; + } + return true; } static void onDeviceDisconnected(void* /*obj*/, ACameraDevice* /*device*/) {} @@ -246,6 +257,26 @@ class CameraHelper { bool mIsCameraReady = false; const char* mCameraId; + int mCompletedCaptureCallbackCount = 0; + std::mutex mMutex; + ACameraCaptureSession_captureCallbacks mCaptureCallbacks = { + // TODO: Add tests for other callbacks + this, // context + nullptr, // onCaptureStarted + nullptr, // onCaptureProgressed + // onCaptureCompleted, called serially, so no lock needed. + [](void* ctx , ACameraCaptureSession *, ACaptureRequest *, + const ACameraMetadata *) { + CameraHelper *ch = static_cast(ctx); + std::lock_guard lock(ch->mMutex); + ch->mCompletedCaptureCallbackCount++; + }, + nullptr, // onCaptureFailed + nullptr, // onCaptureSequenceCompleted + nullptr, // onCaptureSequenceAborted + nullptr, // onCaptureBufferLost + }; + }; class ImageReaderTestCase { @@ -445,34 +476,36 @@ class ImageReaderTestCase { AImageReader_BufferRemovedListener mReaderDetachedCb{this, onBufferRemoved}; }; -int takePictures(uint64_t readerUsage, int readerMaxImages, bool readerAsync, int pictureCount) { +bool takePictures(uint64_t readerUsage, int readerMaxImages, bool readerAsync, int pictureCount) { int ret = 0; - ImageReaderTestCase testCase( kTestImageWidth, kTestImageHeight, kTestImageFormat, readerUsage, readerMaxImages, readerAsync); ret = testCase.initImageReader(); if (ret < 0) { - return ret; + ALOGE("Unable to initialize ImageReader"); + return false; } CameraHelper cameraHelper(testCase.getNativeWindow()); ret = cameraHelper.initCamera(); if (ret < 0) { - return ret; + ALOGE("Unable to initialize camera helper"); + return false; } if (!cameraHelper.isCameraReady()) { ALOGW("Camera is not ready after successful initialization. It's either due to camera on " "board lacks BACKWARDS_COMPATIBLE capability or the device does not have camera on " "board."); - return 0; + return true; } for (int i = 0; i < pictureCount; i++) { ret = cameraHelper.takePicture(); if (ret < 0) { - return ret; + ALOGE("Unable to take picture"); + return false; } } @@ -485,7 +518,8 @@ int takePictures(uint64_t readerUsage, int readerMaxImages, bool readerAsync, in break; } } - return testCase.getAcquiredImageCount() == pictureCount ? 0 : -1; + return testCase.getAcquiredImageCount() == pictureCount && + cameraHelper.checkCallbacks(pictureCount); } class AImageReaderWindowHandleTest : public ::testing::Test { @@ -504,7 +538,7 @@ bool testTakePicturesNative() { for (auto& readerMaxImages : {1, 4, 8}) { for (auto& readerAsync : {true, false}) { for (auto& pictureCount : {1, 4, 8}) { - if (takePictures(readerUsage, readerMaxImages, readerAsync, pictureCount)) { + if (!takePictures(readerUsage, readerMaxImages, readerAsync, pictureCount)) { ALOGE("Test takePictures failed for test case usage=%" PRIu64 ", maxImages=%d, " "async=%d, pictureCount=%d", readerUsage, readerMaxImages, readerAsync, pictureCount);