// Copyright 2016 the V8 project authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef TEST_FUZZER_FUZZER_SUPPORT_H_
#define TEST_FUZZER_FUZZER_SUPPORT_H_

#include "include/libplatform/libplatform.h"
#include "include/v8.h"

namespace v8_fuzzer {

class FuzzerSupport {
 public:
  FuzzerSupport(int* argc, char*** argv);

  ~FuzzerSupport();

  static void InitializeFuzzerSupport(int* argc, char*** argv);

  static FuzzerSupport* Get();

  v8::Isolate* GetIsolate() const { return isolate_; }

  v8::Local<v8::Context> GetContext();

  bool PumpMessageLoop(v8::platform::MessageLoopBehavior =
                           v8::platform::MessageLoopBehavior::kDoNotWait);

 private:
  // Prevent copying. Not implemented.
  FuzzerSupport(const FuzzerSupport&);
  FuzzerSupport& operator=(const FuzzerSupport&);

  static std::unique_ptr<FuzzerSupport> fuzzer_support_;
  std::unique_ptr<v8::Platform> platform_;
  v8::ArrayBuffer::Allocator* allocator_;
  v8::Isolate* isolate_;
  v8::Global<v8::Context> context_;
};

}  // namespace v8_fuzzer

#endif  //  TEST_FUZZER_FUZZER_SUPPORT_H_
