// Copyright 2016 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_RENDERER_MEDIA_MOCK_AUDIO_DEVICE_FACTORY_H_
#define CONTENT_RENDERER_MEDIA_MOCK_AUDIO_DEVICE_FACTORY_H_

#include "content/renderer/media/audio_device_factory.h"

#include "media/base/audio_capturer_source.h"
#include "media/base/audio_renderer_sink.h"
#include "testing/gmock/include/gmock/gmock.h"

namespace content {

// MockAudioDeviceFactory creates an instance of this.
class MockCapturerSource : public media::AudioCapturerSource {
 public:
  MockCapturerSource();
  MOCK_METHOD3(Initialize, void(const media::AudioParameters& params,
                                CaptureCallback* callback,
                                int session_id));
  MOCK_METHOD0(Start, void());
  MOCK_METHOD0(Stop, void());
  MOCK_METHOD1(SetAutomaticGainControl, void(bool enable));
  void SetVolume(double volume) override;

 protected:
  ~MockCapturerSource() override;
};

// Creates one MockCapturerSource instance for unit testing. This replaces the
// need for unit tests to open a real platform audio output. Instantiating this
// class sets the global content::AudioDeviceFactory implementation to |this|.
class MockAudioDeviceFactory : public AudioDeviceFactory {
 public:
  MockAudioDeviceFactory();
  ~MockAudioDeviceFactory() override;

  // Returns the MockCapturerSource created by this factory.
  const scoped_refptr<MockCapturerSource>& mock_capturer_source() const {
    return mock_capturer_source_;
  }

  // These methods are just mocked because tests currently don't need them to be
  // implemented.
  MOCK_METHOD4(CreateFinalAudioRendererSink,
               scoped_refptr<media::AudioRendererSink>(
                   int render_frame_id,
                   int sesssion_id,
                   const std::string& device_id,
                   const url::Origin& security_origin));
  MOCK_METHOD5(CreateAudioRendererSink,
               scoped_refptr<media::AudioRendererSink>(
                   SourceType source_type,
                   int render_frame_id,
                   int sesssion_id,
                   const std::string& device_id,
                   const url::Origin& security_origin));
  MOCK_METHOD5(CreateSwitchableAudioRendererSink,
               scoped_refptr<media::SwitchableAudioRendererSink>(
                   SourceType source_type,
                   int render_frame_id,
                   int sesssion_id,
                   const std::string& device_id,
                   const url::Origin& security_origin));

  // Returns mock_capturer_source_ once. If called a second time, the process
  // will crash.
  scoped_refptr<media::AudioCapturerSource> CreateAudioCapturerSource(
      int render_frame_id) override;

 private:
  scoped_refptr<MockCapturerSource> mock_capturer_source_;
  bool did_create_once_;

  DISALLOW_COPY_AND_ASSIGN(MockAudioDeviceFactory);
};

}  // namespace content

#endif  // CONTENT_RENDERER_MEDIA_AUDIO_DEVICE_FACTORY_H_
