/*
 * 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_ZZUF_FUZZER_H_
#define COBALT_MEDIA_SANDBOX_ZZUF_FUZZER_H_

#include <vector>

#include "base/basictypes.h"

extern "C" {
#include "third_party/zzuf/src/common/fd.h"
#include "third_party/zzuf/src/common/fuzz.h"
}

namespace cobalt {
namespace media {
namespace sandbox {

// This class provide fuzzed content based on the original content and a seed
// that can be advanced.  By default the first fuzzed content it returns is the
// same as the original content.
class ZzufFuzzer {
 public:
  static const int kSeedForOriginalContent = -1;

  // |initial_seed| can be used to "fast-forward" to the particular seed that
  // generates the data to cause an issue.  During normal fuzzing this should be
  // left to its default argument to ensure that it covers the original data.
  ZzufFuzzer(const std::vector<uint8>& original_content, double min_ratio,
             double max_ratio, int initial_seed = kSeedForOriginalContent);
  ~ZzufFuzzer();

  int seed() const { return seed_; }
  const std::vector<uint8_t>& GetOriginalContent() const {
    return original_content_;
  }
  const std::vector<uint8_t>& GetFuzzedContent() const {
    return fuzzed_content_;
  }

  void AdvanceSeed();

 private:
  void UpdateFuzzedContent();

  int seed_;
  std::vector<uint8_t> original_content_;
  std::vector<uint8_t> fuzzed_content_;
};

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

#endif  // COBALT_MEDIA_SANDBOX_ZZUF_FUZZER_H_
