// Copyright 2016 Google Inc. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#ifndef COBALT_MEDIA_SANDBOX_FUZZER_APP_H_
#define COBALT_MEDIA_SANDBOX_FUZZER_APP_H_

#include <map>
#include <string>
#include <vector>

#include "base/basictypes.h"
#include "cobalt/media/sandbox/zzuf_fuzzer.h"

namespace cobalt {
namespace media {
namespace sandbox {

// This class provides common functionalities required by fuzzer applications
// including command line parsing, file data collecting, and the fuzzing loop.
class FuzzerApp {
 public:
  FuzzerApp();

  bool Init(int argc, char* argv[], double min_ratio = 0.01f,
            double max_ratio = 0.05f);
  void RunFuzzingLoop();

  // This function parse |file_content| and returns the content used to fuzz.
  // The return value may be different than |file_content|.  It will be used to
  // generate the |fuzzing_content| parameter passed to Fuzz().
  // The derived class may also take this opportunity to initialize any other
  // data required by the fuzzing process and associate with |file_name|.
  // If the return value is empty, the file will be excluded during the fuzzing
  // process.
  virtual std::vector<uint8> ParseFileContent(
      const std::string& file_name, const std::vector<uint8>& file_content) = 0;
  virtual void Fuzz(const std::string& file_name,
                    const std::vector<uint8>& fuzzing_content) = 0;

 protected:
  ~FuzzerApp() {}

  const std::vector<uint8>& GetFileContent(const std::string& filename) const;

 private:
  struct FileEntry {
    std::vector<uint8> file_content;
    ZzufFuzzer fuzzer;

    FileEntry(const std::vector<uint8>& file_content,
              const std::vector<uint8>& fuzz_content, double min_ratio,
              double max_ratio, int initial_seed);
  };

  typedef std::map<std::string, FileEntry> FileEntries;

  bool ParseInitialSeedAndNumberOfIterations(int argc, char* argv[],
                                             int* initial_seed);
  void CollectFiles(const std::string& path_name, double min_ratio,
                    double max_ratio, int initial_seed);
  void AddFile(const std::string& file_name, double min_ratio, double max_ratio,
               int initial_seed);

  int number_of_iterations_;
  // Map from filename to file data.
  FileEntries file_entries_;
};

}  // namespace sandbox
}  // namespace media
}  // namespace cobalt

#endif  // COBALT_MEDIA_SANDBOX_FUZZER_APP_H_
