// Copyright 2015 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.

#ifndef MOJO_DART_UNITTESTS_EMBEDDER_TESTER_DART_TEST_H_
#define MOJO_DART_UNITTESTS_EMBEDDER_TESTER_DART_TEST_H_

#include "base/bind.h"
#include "base/files/file_path.h"
#include "base/path_service.h"
#include "base/rand_util.h"
#include "mojo/dart/embedder/dart_controller.h"
#include "mojo/public/c/system/types.h"
#include "mojo/public/cpp/environment/environment.h"
#include "testing/gtest/include/gtest/gtest.h"

namespace mojo {
namespace dart {

class DartTest : public testing::Test {
 public:
  DartTest() {}

  static void SetUpTestCase() {
    DartController::Initialize(nullptr, true, false, nullptr, 0);
  }

  static void TearDownTestCase() {
    DartController::Shutdown();
  }

  void RunDartTest(const base::FilePath& path,
                   const std::vector<std::string>& script_arguments,
                   bool compile_all,
                   bool expect_unhandled_exception,
                   int expected_unclosed_handles);

 protected:
  static bool GenerateEntropy(uint8_t* buffer, intptr_t length) {
    base::RandBytes(static_cast<void*>(buffer), length);
    return true;
  }

  static void ExceptionCallback(bool* exception,
                                int64_t* closed_handles,
                                Dart_Handle error,
                                int64_t count) {
    EXPECT_TRUE(Dart_IsError(error));
    *exception = true;
    *closed_handles = count;
  }
};

}  // namespace dart
}  // namespace mojo

#endif  // MOJO_DART_UNITTESTS_EMBEDDER_TESTER_DART_TEST_H_
