blob: 905c1534214e39b3315e0cebd13977fe08f3451d [file] [log] [blame]
// Copyright 2018 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.
#include "services/media_session/public/cpp/test/test_media_controller.h"
namespace media_session {
namespace test {
TestMediaControllerObserver::TestMediaControllerObserver(
mojom::MediaControllerPtr& media_controller)
: binding_(this) {
mojom::MediaControllerObserverPtr observer;
binding_.Bind(mojo::MakeRequest(&observer));
media_controller->AddObserver(std::move(observer));
}
TestMediaControllerObserver::~TestMediaControllerObserver() = default;
void TestMediaControllerObserver::MediaSessionInfoChanged(
mojom::MediaSessionInfoPtr session) {
session_info_ = std::move(session);
if (session_info_.has_value() && !session_info_->is_null()) {
if (wanted_state_ == session_info()->state ||
session_info()->playback_state == wanted_playback_state_) {
run_loop_->Quit();
}
} else if (waiting_for_empty_info_) {
waiting_for_empty_info_ = false;
run_loop_->Quit();
}
}
void TestMediaControllerObserver::MediaSessionMetadataChanged(
const base::Optional<MediaMetadata>& metadata) {
session_metadata_ = metadata;
if (waiting_for_empty_metadata_ &&
(!metadata.has_value() || metadata->IsEmpty())) {
run_loop_->Quit();
waiting_for_empty_metadata_ = false;
} else if (waiting_for_non_empty_metadata_ && metadata.has_value() &&
!metadata->IsEmpty()) {
run_loop_->Quit();
waiting_for_non_empty_metadata_ = false;
}
}
void TestMediaControllerObserver::MediaSessionActionsChanged(
const std::vector<mojom::MediaSessionAction>& actions) {
session_actions_ = actions;
session_actions_set_ =
std::set<mojom::MediaSessionAction>(actions.begin(), actions.end());
if (waiting_for_actions_) {
run_loop_->Quit();
waiting_for_actions_ = false;
}
}
void TestMediaControllerObserver::WaitForState(
mojom::MediaSessionInfo::SessionState wanted_state) {
if (session_info_ && session_info()->state == wanted_state)
return;
wanted_state_ = wanted_state;
StartWaiting();
}
void TestMediaControllerObserver::WaitForPlaybackState(
mojom::MediaPlaybackState wanted_state) {
if (session_info_ && session_info()->playback_state == wanted_state)
return;
wanted_playback_state_ = wanted_state;
StartWaiting();
}
void TestMediaControllerObserver::WaitForEmptyInfo() {
if (session_info_.has_value() && session_info_->is_null())
return;
waiting_for_empty_info_ = true;
StartWaiting();
}
void TestMediaControllerObserver::WaitForEmptyMetadata() {
if (session_metadata_.has_value())
return;
waiting_for_empty_metadata_ = true;
StartWaiting();
}
void TestMediaControllerObserver::WaitForNonEmptyMetadata() {
if (session_metadata_.has_value() && !session_metadata_.value()->IsEmpty())
return;
waiting_for_non_empty_metadata_ = true;
StartWaiting();
}
void TestMediaControllerObserver::WaitForActions() {
if (session_actions_.has_value())
return;
waiting_for_actions_ = true;
StartWaiting();
}
void TestMediaControllerObserver::StartWaiting() {
DCHECK(!run_loop_);
run_loop_ = std::make_unique<base::RunLoop>();
run_loop_->Run();
run_loop_.reset();
}
TestMediaController::TestMediaController() = default;
TestMediaController::~TestMediaController() = default;
mojom::MediaControllerPtr TestMediaController::CreateMediaControllerPtr() {
mojom::MediaControllerPtr ptr;
binding_.Bind(mojo::MakeRequest(&ptr));
return ptr;
}
void TestMediaController::Suspend() {
++suspend_count_;
}
void TestMediaController::Resume() {
++resume_count_;
}
void TestMediaController::ToggleSuspendResume() {
++toggle_suspend_resume_count_;
}
void TestMediaController::AddObserver(
mojom::MediaControllerObserverPtr observer) {
++add_observer_count_;
observers_.AddPtr(std::move(observer));
}
void TestMediaController::PreviousTrack() {
++previous_track_count_;
}
void TestMediaController::NextTrack() {
++next_track_count_;
}
void TestMediaController::Seek(base::TimeDelta seek_time) {
DCHECK(!seek_time.is_zero());
if (seek_time > base::TimeDelta()) {
++seek_forward_count_;
} else if (seek_time < base::TimeDelta()) {
++seek_backward_count_;
}
}
void TestMediaController::SimulateMediaSessionActionsChanged(
const std::vector<mojom::MediaSessionAction>& actions) {
observers_.ForAllPtrs([&actions](mojom::MediaControllerObserver* observer) {
observer->MediaSessionActionsChanged(actions);
});
}
void TestMediaController::Flush() {
observers_.FlushForTesting();
}
} // namespace test
} // namespace media_session