// Copyright 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 "SkCanvas.h"
#include "SkFlattenableSerialization.h"
#include "SkImageFilter.h"
#include "SkOSFile.h"
#include "SkString.h"

static const int kBitmapSize = 24;

static bool read_test_case(const char* filename, SkString* testdata) {
  SkFILE* file = sk_fopen(filename, kRead_SkFILE_Flag);
  if (!file) {
    SkDebugf("couldn't open file %s\n", filename);
    return false;
  }
  size_t len = sk_fgetsize(file);
  if (!len) {
    SkDebugf("couldn't read file %s\n", filename);
    return false;
  }
  testdata->resize(len);
  (void) sk_fread(testdata->writable_str(), len, file);
  return true;
}

static void run_test_case(const SkString& testdata, const 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(
        testdata.c_str(), testdata.size(), SkImageFilter::GetFlattenableType());

  // Adding some info, but the test passed if we got here without any trouble
  if (flattenable != nullptr) {
    SkDebugf("Valid stream detected.\n");
    // 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(kBitmapSize), SkIntToScalar(kBitmapSize)));

    // 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);

    SkDebugf("Filter DAG rendered successfully.\n");
    canvas->restore();
  } else {
    SkDebugf("Invalid stream detected.\n");
  }
}

static bool read_and_run_test_case(const char* filename, const SkBitmap& bitmap,
                        SkCanvas* canvas) {
  SkString testdata;
  SkDebugf("Test case: %s\n", filename);
  // read_test_case will print a useful error message if it fails.
  if (!read_test_case(filename, &testdata))
    return false;
  run_test_case(testdata, bitmap, canvas);
  return true;
}

int main(int argc, char** argv) {
  int ret = 0;
  SkBitmap bitmap;
  bitmap.allocN32Pixels(kBitmapSize, kBitmapSize);
  SkCanvas canvas(bitmap);
  canvas.clear(0x00000000);
  for (int i = 1; i < argc; i++)
    if (!read_and_run_test_case(argv[i], bitmap, &canvas))
      ret = 2;
  // Cluster-Fuzz likes "#EOF" as the last line of output to help distinguish
  // successful runs from crashes.
  SkDebugf("#EOF\n");
  return ret;
}

