| Index: skia/tools/filter_fuzz_stub/filter_fuzz_stub.cc
|
| diff --git a/skia/tools/filter_fuzz_stub/filter_fuzz_stub.cc b/skia/tools/filter_fuzz_stub/filter_fuzz_stub.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..6da11369f3ca5ca0bc3c0dc5503233e910c56164
|
| --- /dev/null
|
| +++ b/skia/tools/filter_fuzz_stub/filter_fuzz_stub.cc
|
| @@ -0,0 +1,93 @@
|
| +// Copyright (c) 2013 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +#include "base/file_util.h"
|
| +#include "base/logging.h"
|
| +#include "third_party/skia/include/core/SkBitmapDevice.h"
|
| +#include "third_party/skia/include/core/SkCanvas.h"
|
| +#include "third_party/skia/include/core/SkFlattenableSerialization.h"
|
| +#include "third_party/skia/include/core/SkImageFilter.h"
|
| +
|
| +namespace {
|
| +
|
| +static const int BitmapSize = 24;
|
| +
|
| +bool ReadTestCase(const char* filename, std::string* ipc_filter_message) {
|
| + base::FilePath filepath = base::FilePath::FromUTF8Unsafe(filename);
|
| +
|
| + if (!base::ReadFileToString(filepath, ipc_filter_message)) {
|
| + LOG(ERROR) << filename << ": couldn't read file.";
|
| + return false;
|
| + }
|
| +
|
| + return true;
|
| +}
|
| +
|
| +void RunTestCase(std::string& ipc_filter_message, SkBitmap& bitmap,
|
| + SkCanvas* canvas) {
|
| + // This call shouldn't crash or cause ASAN to flag any memory issues
|
| + // If nothing bad happens within this call, everything is fine
|
| + SkFlattenable* flattenable = SkValidatingDeserializeFlattenable(
|
| + ipc_filter_message.c_str(), ipc_filter_message.size(),
|
| + SkImageFilter::GetFlattenableType());
|
| +
|
| + // Adding some info, but the test passed if we got here without any trouble
|
| + if (flattenable != NULL) {
|
| + LOG(INFO) << "Valid stream detected.";
|
| + // Let's see if using the filters can cause any trouble...
|
| + SkPaint paint;
|
| + paint.setImageFilter(static_cast<SkImageFilter*>(flattenable))->unref();
|
| + canvas->save();
|
| + canvas->clipRect(SkRect::MakeXYWH(
|
| + 0, 0, SkIntToScalar(BitmapSize), SkIntToScalar(BitmapSize)));
|
| +
|
| + // This call shouldn't crash or cause ASAN to flag any memory issues
|
| + // If nothing bad happens within this call, everything is fine
|
| + canvas->drawBitmap(bitmap, 0, 0, &paint);
|
| +
|
| + LOG(INFO) << "Filter DAG rendered successfully";
|
| + canvas->restore();
|
| + } else {
|
| + LOG(INFO) << "Invalid stream detected.";
|
| + }
|
| +}
|
| +
|
| +bool ReadAndRunTestCase(const char* filename, SkBitmap& bitmap,
|
| + SkCanvas* canvas) {
|
| + std::string ipc_filter_message;
|
| +
|
| + LOG(INFO) << "Test case: " << filename;
|
| +
|
| + // ReadTestCase will print a useful error message if it fails.
|
| + if (!ReadTestCase(filename, &ipc_filter_message))
|
| + return false;
|
| +
|
| + RunTestCase(ipc_filter_message, bitmap, canvas);
|
| +
|
| + return true;
|
| +}
|
| +
|
| +}
|
| +
|
| +int main(int argc, char** argv) {
|
| + int ret = 0;
|
| +
|
| + SkBitmap bitmap;
|
| + bitmap.setConfig(SkBitmap::kARGB_8888_Config, BitmapSize, BitmapSize);
|
| + bitmap.allocPixels();
|
| + SkBitmapDevice device(bitmap);
|
| + SkCanvas canvas(&device);
|
| + canvas.clear(0x00000000);
|
| +
|
| + for (int i = 1; i < argc; i++)
|
| + if (!ReadAndRunTestCase(argv[i], bitmap, &canvas))
|
| + ret = 2;
|
| +
|
| + // Cluster-Fuzz likes "#EOF" as the last line of output to help distinguish
|
| + // successful runs from crashes.
|
| + printf("#EOF\n");
|
| +
|
| + return ret;
|
| +}
|
| +
|
|
|