// Copyright 2017 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_PUBLIC_CPP_BINDINGS_TESTS_BINDINGS_TEST_BASE_H_
#define MOJO_PUBLIC_CPP_BINDINGS_TESTS_BINDINGS_TEST_BASE_H_

#include "base/test/scoped_task_environment.h"
#include "testing/gtest/include/gtest/gtest.h"

namespace mojo {

// Used to parameterize tests which inherit from BindingsTestBase to exercise
// various message serialization-related code paths for intra-process bindings
// usage.
enum class BindingsTestSerializationMode {
  // Messages should be serialized immediately before sending.
  kSerializeBeforeSend,

  // Messages should be serialized immediately before dispatching.
  kSerializeBeforeDispatch,

  // Messages should never be serialized.
  kNeverSerialize,
};

class BindingsTestBase
    : public testing::Test,
      public testing::WithParamInterface<BindingsTestSerializationMode> {
 public:
  BindingsTestBase();
  ~BindingsTestBase();

  // Helper which other test fixtures can use.
  static void SetupSerializationBehavior(BindingsTestSerializationMode mode);

 private:
  base::test::ScopedTaskEnvironment task_environment_;
};

}  // namespace mojo

#define INSTANTIATE_MOJO_BINDINGS_TEST_CASE_P(fixture)                   \
  INSTANTIATE_TEST_CASE_P(                                               \
      , fixture,                                                         \
      testing::Values(                                                   \
          mojo::BindingsTestSerializationMode::kSerializeBeforeSend,     \
          mojo::BindingsTestSerializationMode::kSerializeBeforeDispatch, \
          mojo::BindingsTestSerializationMode::kNeverSerialize))

#endif  // MOJO_PUBLIC_CPP_BINDINGS_TESTS_BINDINGS_TEST_BASE_H_