Refactored camera_Parameters_fuzzer
The following are updates to the fuzzer:
1. Randomized order of API calls.
2. Randomized parameter values.
exec/s: 18748
Test: ./camera_Parameters_fuzzer
Bug: 309571245
Change-Id: Ibf5db7874cbcf52681e62cc52acdcf27e321c2a5
diff --git a/camera/tests/fuzzer/camera_Parameters_fuzzer.cpp b/camera/tests/fuzzer/camera_Parameters_fuzzer.cpp
index 07efc20..e59f76c 100644
--- a/camera/tests/fuzzer/camera_Parameters_fuzzer.cpp
+++ b/camera/tests/fuzzer/camera_Parameters_fuzzer.cpp
@@ -16,6 +16,7 @@
#include <CameraParameters.h>
#include <CameraParameters2.h>
+#include <camera/StringUtils.h>
#include <fcntl.h>
#include <fuzzer/FuzzedDataProvider.h>
#include <utils/String16.h>
@@ -24,6 +25,8 @@
using namespace std;
using namespace android;
+constexpr int8_t kMaxBytes = 20;
+
string kValidFormats[] = {
CameraParameters::PIXEL_FORMAT_YUV422SP, CameraParameters::PIXEL_FORMAT_YUV420SP,
CameraParameters::PIXEL_FORMAT_YUV422I, CameraParameters::PIXEL_FORMAT_YUV420P,
@@ -34,26 +37,22 @@
class CameraParametersFuzzer {
public:
void process(const uint8_t* data, size_t size);
- ~CameraParametersFuzzer() {
- delete mCameraParameters;
- delete mCameraParameters2;
- }
private:
void invokeCameraParameters();
template <class type>
- void initCameraParameters(type** obj);
+ void initCameraParameters(unique_ptr<type>& obj);
template <class type>
- void cameraParametersCommon(type* obj);
- CameraParameters* mCameraParameters = nullptr;
- CameraParameters2* mCameraParameters2 = nullptr;
+ void callCameraParametersAPIs(unique_ptr<type>& obj);
+ unique_ptr<CameraParameters> mCameraParameters;
+ unique_ptr<CameraParameters2> mCameraParameters2;
FuzzedDataProvider* mFDP = nullptr;
};
template <class type>
-void CameraParametersFuzzer::initCameraParameters(type** obj) {
+void CameraParametersFuzzer::initCameraParameters(unique_ptr<type>& obj) {
if (mFDP->ConsumeBool()) {
- *obj = new type();
+ obj = make_unique<type>();
} else {
string params;
if (mFDP->ConsumeBool()) {
@@ -61,94 +60,176 @@
int32_t height = mFDP->ConsumeIntegral<int32_t>();
int32_t minFps = mFDP->ConsumeIntegral<int32_t>();
int32_t maxFps = mFDP->ConsumeIntegral<int32_t>();
- params = CameraParameters::KEY_SUPPORTED_VIDEO_SIZES;
+ params = mFDP->ConsumeBool() ? mFDP->ConsumeRandomLengthString(kMaxBytes).c_str()
+ : CameraParameters::KEY_SUPPORTED_VIDEO_SIZES;
params += '=' + to_string(width) + 'x' + to_string(height) + ';';
if (mFDP->ConsumeBool()) {
- params += CameraParameters::KEY_PREVIEW_FPS_RANGE;
+ params += mFDP->ConsumeBool() ? mFDP->ConsumeRandomLengthString(kMaxBytes).c_str()
+ : CameraParameters::KEY_PREVIEW_FPS_RANGE;
params += '=' + to_string(minFps) + ',' + to_string(maxFps) + ';';
}
if (mFDP->ConsumeBool()) {
- params += CameraParameters::KEY_SUPPORTED_PICTURE_SIZES;
+ params += mFDP->ConsumeBool() ? mFDP->ConsumeRandomLengthString(kMaxBytes).c_str()
+ : CameraParameters::KEY_SUPPORTED_PICTURE_SIZES;
params += '=' + to_string(width) + 'x' + to_string(height) + ';';
}
if (mFDP->ConsumeBool()) {
- params += CameraParameters::KEY_SUPPORTED_PREVIEW_FORMATS;
- params += '=' + mFDP->PickValueInArray(kValidFormats) + ';';
+ params += mFDP->ConsumeBool() ? mFDP->ConsumeRandomLengthString(kMaxBytes).c_str()
+ : CameraParameters::KEY_SUPPORTED_PREVIEW_FORMATS;
+ params += '=' +
+ (mFDP->ConsumeBool() ? mFDP->ConsumeRandomLengthString(kMaxBytes).c_str()
+ : mFDP->PickValueInArray(kValidFormats)) + ';';
}
} else {
- params = mFDP->ConsumeRandomLengthString();
+ params = mFDP->ConsumeRandomLengthString(kMaxBytes);
}
- *obj = new type(toString8(params));
+ obj = make_unique<type>(toString8(params));
}
}
template <class type>
-void CameraParametersFuzzer::cameraParametersCommon(type* obj) {
- Vector<Size> supportedPreviewSizes;
- obj->getSupportedPreviewSizes(supportedPreviewSizes);
- int32_t previewWidth = mFDP->ConsumeIntegral<int32_t>();
- int32_t previewHeight = mFDP->ConsumeIntegral<int32_t>();
- obj->setPreviewSize(previewWidth, previewHeight);
- obj->getPreviewSize(&previewWidth, &previewHeight);
-
+void CameraParametersFuzzer::callCameraParametersAPIs(unique_ptr<type>& obj) {
Vector<Size> supportedVideoSizes;
- obj->getSupportedVideoSizes(supportedVideoSizes);
- if (supportedVideoSizes.size() != 0) {
- int32_t videoWidth, videoHeight, preferredVideoWidth, preferredVideoHeight;
- if (mFDP->ConsumeBool()) {
- int32_t idx = mFDP->ConsumeIntegralInRange<int32_t>(0, supportedVideoSizes.size() - 1);
- obj->setVideoSize(supportedVideoSizes[idx].width, supportedVideoSizes[idx].height);
- } else {
- videoWidth = mFDP->ConsumeIntegral<int32_t>();
- videoHeight = mFDP->ConsumeIntegral<int32_t>();
- obj->setVideoSize(videoWidth, videoHeight);
- }
- obj->getVideoSize(&videoWidth, &videoHeight);
- obj->getPreferredPreviewSizeForVideo(&preferredVideoWidth, &preferredVideoHeight);
- }
-
- int32_t fps = mFDP->ConsumeIntegral<int32_t>();
- obj->setPreviewFrameRate(fps);
- obj->getPreviewFrameRate();
- string previewFormat = mFDP->ConsumeBool() ? mFDP->PickValueInArray(kValidFormats)
- : mFDP->ConsumeRandomLengthString();
- obj->setPreviewFormat(previewFormat.c_str());
-
- int32_t pictureWidth = mFDP->ConsumeIntegral<int32_t>();
- int32_t pictureHeight = mFDP->ConsumeIntegral<int32_t>();
- Vector<Size> supportedPictureSizes;
- obj->setPictureSize(pictureWidth, pictureHeight);
- obj->getPictureSize(&pictureWidth, &pictureHeight);
- obj->getSupportedPictureSizes(supportedPictureSizes);
- string pictureFormat = mFDP->ConsumeBool() ? mFDP->PickValueInArray(kValidFormats)
- : mFDP->ConsumeRandomLengthString();
- obj->setPictureFormat(pictureFormat.c_str());
- obj->getPictureFormat();
-
- if (mFDP->ConsumeBool()) {
- obj->dump();
- } else {
- int32_t fd = open("/dev/null", O_CLOEXEC | O_RDWR | O_CREAT);
- Vector<String16> args = {};
- obj->dump(fd, args);
- close(fd);
+ while (mFDP->remaining_bytes()) {
+ auto callCameraUtilsAPIs = mFDP->PickValueInArray<const std::function<void()>>({
+ [&]() {
+ Vector<Size> supportedPreviewSizes;
+ obj->getSupportedPreviewSizes(supportedPreviewSizes);
+ },
+ [&]() {
+ int32_t previewWidth = mFDP->ConsumeIntegral<int32_t>();
+ int32_t previewHeight = mFDP->ConsumeIntegral<int32_t>();
+ obj->setPreviewSize(previewWidth, previewHeight);
+ },
+ [&]() {
+ int32_t previewWidth, previewHeight;
+ obj->getPreviewSize(&previewWidth, &previewHeight);
+ },
+ [&]() { obj->getSupportedVideoSizes(supportedVideoSizes); },
+ [&]() {
+ int32_t videoWidth, videoHeight;
+ if (supportedVideoSizes.size()) {
+ int32_t idx = mFDP->ConsumeIntegralInRange<int32_t>(
+ 0, supportedVideoSizes.size() - 1);
+ videoWidth = mFDP->ConsumeBool() ? supportedVideoSizes[idx].width
+ : mFDP->ConsumeIntegral<int32_t>();
+ videoHeight = mFDP->ConsumeBool() ? supportedVideoSizes[idx].height
+ : mFDP->ConsumeIntegral<int32_t>();
+ obj->setVideoSize(videoWidth, videoHeight);
+ }
+ },
+ [&]() {
+ int32_t videoWidth, videoHeight;
+ obj->getVideoSize(&videoWidth, &videoHeight);
+ },
+ [&]() {
+ int32_t preferredVideoWidth, preferredVideoHeight;
+ obj->getPreferredPreviewSizeForVideo(&preferredVideoWidth,
+ &preferredVideoHeight);
+ },
+ [&]() {
+ int32_t fps = mFDP->ConsumeIntegral<int32_t>();
+ obj->setPreviewFrameRate(fps);
+ },
+ [&]() { obj->getPreviewFrameRate(); },
+ [&]() {
+ string previewFormat = mFDP->ConsumeBool()
+ ? mFDP->PickValueInArray(kValidFormats)
+ : mFDP->ConsumeRandomLengthString(kMaxBytes);
+ obj->setPreviewFormat(previewFormat.c_str());
+ },
+ [&]() {
+ int32_t pictureWidth = mFDP->ConsumeIntegral<int32_t>();
+ int32_t pictureHeight = mFDP->ConsumeIntegral<int32_t>();
+ obj->setPictureSize(pictureWidth, pictureHeight);
+ },
+ [&]() {
+ int32_t pictureWidth, pictureHeight;
+ obj->getPictureSize(&pictureWidth, &pictureHeight);
+ },
+ [&]() {
+ Vector<Size> supportedPictureSizes;
+ obj->getSupportedPictureSizes(supportedPictureSizes);
+ },
+ [&]() {
+ string pictureFormat = mFDP->ConsumeBool()
+ ? mFDP->PickValueInArray(kValidFormats)
+ : mFDP->ConsumeRandomLengthString(kMaxBytes);
+ obj->setPictureFormat(pictureFormat.c_str());
+ },
+ [&]() { obj->getPictureFormat(); },
+ [&]() {
+ if (mFDP->ConsumeBool()) {
+ obj->dump();
+ } else {
+ int32_t fd = open("/dev/null", O_CLOEXEC | O_RDWR | O_CREAT);
+ Vector<String16> args = {};
+ obj->dump(fd, args);
+ close(fd);
+ }
+ },
+ [&]() { obj->flatten(); },
+ [&]() {
+ string key = mFDP->ConsumeRandomLengthString(kMaxBytes);
+ float value = mFDP->ConsumeFloatingPoint<float>();
+ obj->setFloat(key.c_str(), value);
+ },
+ [&]() {
+ string key = mFDP->ConsumeRandomLengthString(kMaxBytes);
+ obj->getFloat(key.c_str());
+ },
+ [&]() { obj->getPreviewFormat(); },
+ [&]() {
+ string key = mFDP->ConsumeRandomLengthString(kMaxBytes);
+ obj->remove(key.c_str());
+ },
+ [&]() {
+ if (std::is_same_v<type, CameraParameters>) {
+ string format = mFDP->ConsumeBool()
+ ? mFDP->ConsumeRandomLengthString(kMaxBytes)
+ : mFDP->PickValueInArray(kValidFormats);
+ mCameraParameters->previewFormatToEnum(format.c_str());
+ }
+ },
+ [&]() {
+ if (std::is_same_v<type, CameraParameters>) {
+ mCameraParameters->isEmpty();
+ }
+ },
+ [&]() {
+ if (std::is_same_v<type, CameraParameters>) {
+ Vector<int32_t> formats;
+ mCameraParameters->getSupportedPreviewFormats(formats);
+ }
+ },
+ [&]() {
+ if (std::is_same_v<type, CameraParameters2>) {
+ string key1 = mFDP->ConsumeRandomLengthString(kMaxBytes);
+ string key2 = mFDP->ConsumeRandomLengthString(kMaxBytes);
+ int32_t order;
+ mCameraParameters2->compareSetOrder(key1.c_str(), key2.c_str(), &order);
+ }
+ },
+ [&]() {
+ if (std::is_same_v<type, CameraParameters2>) {
+ int32_t minFps = mFDP->ConsumeIntegral<int32_t>();
+ int32_t maxFps = mFDP->ConsumeIntegral<int32_t>();
+ mCameraParameters2->setPreviewFpsRange(minFps, maxFps);
+ }
+ },
+ });
+ callCameraUtilsAPIs();
}
}
void CameraParametersFuzzer::invokeCameraParameters() {
- initCameraParameters<CameraParameters>(&mCameraParameters);
- cameraParametersCommon<CameraParameters>(mCameraParameters);
- initCameraParameters<CameraParameters2>(&mCameraParameters2);
- cameraParametersCommon<CameraParameters2>(mCameraParameters2);
-
- int32_t minFPS, maxFPS;
- mCameraParameters->getPreviewFpsRange(&minFPS, &maxFPS);
- string format = mFDP->ConsumeBool() ? mFDP->PickValueInArray(kValidFormats)
- : mFDP->ConsumeRandomLengthString();
- mCameraParameters->previewFormatToEnum(format.c_str());
- mCameraParameters->isEmpty();
- Vector<int32_t> formats;
- mCameraParameters->getSupportedPreviewFormats(formats);
+ if (mFDP->ConsumeBool()) {
+ initCameraParameters<CameraParameters>(mCameraParameters);
+ callCameraParametersAPIs(mCameraParameters);
+ } else {
+ initCameraParameters<CameraParameters2>(mCameraParameters2);
+ callCameraParametersAPIs(mCameraParameters2);
+ }
}
void CameraParametersFuzzer::process(const uint8_t* data, size_t size) {