// Copyright 2018 The Fuchsia 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 GARNET_BIN_MEDIA_AUDIO_CORE_TEST_GAIN_CONTROL_TEST_H_
#define GARNET_BIN_MEDIA_AUDIO_CORE_TEST_GAIN_CONTROL_TEST_H_

#include <fuchsia/media/cpp/fidl.h>

#include <lib/gtest/real_loop_fixture.h>

#include "garnet/bin/media/audio_core/test/audio_fidl_tests_shared.h"
#include "lib/component/cpp/environment_services_helper.h"

namespace media {
namespace audio {
namespace test {

// GainControlTestBase
//
// This set of tests verifies asynchronous usage of GainControl.
class GainControlTestBase : public gtest::RealLoopFixture {
 protected:
  // Always augmented by child implementations that set up the API interface.
  void SetUp() override;
  virtual bool ApiIsNull() = 0;
  bool AudioIsBound() { return audio_.is_bound(); }

  void TearDown() final;

  void SetUpRenderer();
  void SetUpCapturer();
  void SetUpRenderer2();
  void SetUpCapturer2();
  void SetUpGainControl();
  void SetUpGainControlOnRenderer();
  void SetUpGainControlOnCapturer();
  void SetUpGainControl2();
  void SetUpGainControl2OnRenderer();
  void SetUpGainControl2OnCapturer();
  void SetUpGainControl2OnRenderer2();
  void SetUpGainControl2OnCapturer2();
  virtual void SetNegativeExpectations();

  void SetGain(float gain_db);
  void SetMute(bool mute);

  // Tests expect a gain callback. Absorb this; perform related error checking.
  virtual bool ReceiveGainCallback(float gain_db, bool mute);

  // Tests expect to receive neither gain callback nor error; assert this.
  virtual bool ReceiveNoGainCallback();

  // Tests expect the API binding to disconnect, then the GainControl binding as
  // well. After the first disconnect, assert that GainControl is still bound.
  virtual bool ReceiveDisconnectCallback();

  // Core test cases that are validated across various scenarios
  void TestSetGain();
  void TestSetMute();
  void TestSetGainMute();
  void TestDuplicateSetGain();
  void TestDuplicateSetMute();
  void TestSetGainTooHigh();
  void TestSetGainTooLow();

  fuchsia::media::AudioRendererPtr audio_renderer_;
  fuchsia::media::AudioCapturerPtr audio_capturer_;
  fuchsia::media::GainControlPtr gain_control_;

  bool error_occurred_ = false;
  bool received_gain_callback_ = false;
  float received_gain_db_ = kTooLowGainDb;
  bool received_mute_ = false;

  // Member variables for tests that use multiple interface bindings
  fuchsia::media::AudioRendererPtr audio_renderer_2_;
  fuchsia::media::AudioCapturerPtr audio_capturer_2_;
  fuchsia::media::GainControlPtr gain_control_2_;

  bool error_occurred_2_ = false;
  bool received_gain_callback_2_ = false;
  float received_gain_db_2_ = kTooLowGainDb;
  bool received_mute_2_ = false;

  // Member variables to manage our expectations
  bool expect_null_api_ = false;
  bool expect_null_gain_control_ = false;
  bool expect_null_gain_control_2_ = true;
  bool expect_error_ = false;
  bool expect_error_2_ = false;

 private:
  std::shared_ptr<component::Services> environment_services_;
  fuchsia::media::AudioPtr audio_;
};

// RenderGainControlTest
//
class RenderGainControlTest : public GainControlTestBase {
 protected:
  void SetUp() override;
  bool ApiIsNull() final { return !audio_renderer_.is_bound(); }
};

// CaptureGainControlTest
//
class CaptureGainControlTest : public GainControlTestBase {
 protected:
  void SetUp() override;
  bool ApiIsNull() final { return !audio_capturer_.is_bound(); }
};

// SiblingGainControlsTest
//
// On a renderer/capturer, sibling GainControls receive identical notifications.
class SiblingGainControlsTest : public GainControlTestBase {
 protected:
  void SetNegativeExpectations() override;

  // Absorb a gain callback from the sibling GainControl as well.
  bool ReceiveGainCallback(float gain_db, bool mute) final;
  bool ReceiveNoGainCallback() final;

  // Absorb the second GainControl's disconnect, once the first disconnects.
  bool ReceiveDisconnectCallback() final;
};

// RendererTwoGainControlsTest
//
// Verify that Renderer's second GainControl receives the same notifications.
class RendererTwoGainControlsTest : public SiblingGainControlsTest {
 protected:
  void SetUp() override;
  bool ApiIsNull() final { return !audio_renderer_.is_bound(); }
};

// CapturerTwoGainControlsTest
//
// Verify that Capturer's second GainControl receives the same notifications.
class CapturerTwoGainControlsTest : public SiblingGainControlsTest {
 protected:
  void SetUp() override;
  bool ApiIsNull() final { return !audio_capturer_.is_bound(); }
};

// IndependentGainControlsTest
//
// Verify that GainControls on different API instances are fully independent.
class IndependentGainControlsTest : public GainControlTestBase {
 protected:
  // Expect nothing from the independent gain control.
  bool ReceiveGainCallback(float gain_db, bool mute) final;
  bool ReceiveNoGainCallback() final;

  // Expect NO disconnect from our independent gain control -- after the first
  // gain control disconnect has already occurred.
  bool ReceiveDisconnectCallback() final;
};

// TwoRenderersGainControlsTest
//
// Verify that Renderers' GainControls are fully independent.
class TwoRenderersGainControlsTest : public IndependentGainControlsTest {
 protected:
  void SetUp() override;
  bool ApiIsNull() final {
    return !audio_renderer_.is_bound() && audio_renderer_2_.is_bound();
  }
};

// RendererCapturerGainControlsTest
//
// Verify that Renderer GainControl does not affect Capturer GainControl.
class RendererCapturerGainControlsTest : public IndependentGainControlsTest {
 protected:
  void SetUp() override;
  bool ApiIsNull() final {
    return !audio_renderer_.is_bound() && audio_capturer_.is_bound();
  }
};

// CapturerRendererGainControlsTest
//
// Verify that Capturer GainControl does not affect Renderer GainControl.
class CapturerRendererGainControlsTest : public IndependentGainControlsTest {
 protected:
  void SetUp() override;
  bool ApiIsNull() final {
    return !audio_capturer_.is_bound() && audio_renderer_.is_bound();
  }
};

// TwoCapturersGainControlsTest
//
// Verify that Capturers' GainControls are fully independent.
class TwoCapturersGainControlsTest : public IndependentGainControlsTest {
 protected:
  void SetUp() override;
  bool ApiIsNull() final {
    return !audio_capturer_.is_bound() && audio_capturer_2_.is_bound();
  }
};

}  // namespace test
}  // namespace audio
}  // namespace media

#endif  // GARNET_BIN_MEDIA_AUDIO_CORE_TEST_GAIN_CONTROL_TEST_H_
