// Copyright (c) 2011 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 CONTENT_TEST_PPAPI_UNITTEST_H_
#define CONTENT_TEST_PPAPI_UNITTEST_H_

#include <memory>

#include "base/macros.h"
#include "base/memory/ref_counted.h"
#include "testing/gtest/include/gtest/gtest.h"

namespace base {
class MessageLoop;
}

namespace content {

class PepperPluginInstanceImpl;
class PluginModule;

class PpapiUnittest : public testing::Test {
 public:
  PpapiUnittest();
  ~PpapiUnittest() override;

  void SetUp() override;
  void TearDown() override;

  PluginModule* module() const { return module_.get(); }
  PepperPluginInstanceImpl* instance() const { return instance_.get(); }

  // Provides access to the interfaces implemented by the test. The default one
  // implements PPP_INSTANCE.
  virtual const void* GetMockInterface(const char* interface_name) const;

  // Deletes the instance and module to simulate module shutdown.
  void ShutdownModule();

  // Sets the view size of the plugin instance.
  void SetViewSize(int width, int height) const;

 private:
  // Note: module must be declared first since we want it to get destroyed last.
  scoped_refptr<PluginModule> module_;
  scoped_refptr<PepperPluginInstanceImpl> instance_;

  std::unique_ptr<base::MessageLoop> message_loop_;

  DISALLOW_COPY_AND_ASSIGN(PpapiUnittest);
};

}  // namespace content

#endif  // CONTENT_TEST_PPAPI_UNITTEST_H_
