Commit 677f9a3d authored by Fabrice de Gans-Riberi's avatar Fabrice de Gans-Riberi Committed by Chromium LUCI CQ

[fuchsia] End the Cast Streaming session on MessagePort disconnect

Open Screen does not end the Cast Streaming session on MessagePort
disconnect. This change ends the session on the receiver end when the
Cast Streaming MessagePort disconnects.
This is a necessary change to unit test the Cast Streaming Receiver.

Bug: 1110490
Change-Id: I272da7bad03c5f7efa31d3a8eb30f3ebdfe49f23
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2572167
Commit-Queue: Fabrice de Gans-Riberi <fdegans@chromium.org>
Reviewed-by: default avatarKevin Marshall <kmarshall@chromium.org>
Cr-Commit-Position: refs/heads/master@{#833865}
parent dccd5f22
......@@ -14,8 +14,9 @@
namespace cast_streaming {
CastMessagePortImpl::CastMessagePortImpl(
std::unique_ptr<cast_api_bindings::MessagePort> message_port)
: message_port_(std::move(message_port)) {
std::unique_ptr<cast_api_bindings::MessagePort> message_port,
base::OnceClosure on_close)
: message_port_(std::move(message_port)), on_close_(std::move(on_close)) {
DVLOG(1) << __func__;
message_port_->SetReceiver(this);
......@@ -26,12 +27,18 @@ CastMessagePortImpl::CastMessagePortImpl(
CastMessagePortImpl::~CastMessagePortImpl() = default;
void CastMessagePortImpl::MaybeClose() {
if (message_port_)
if (message_port_) {
message_port_.reset();
}
if (client_) {
client_->OnError(
openscreen::Error(openscreen::Error::Code::kCastV2CastSocketError));
}
if (on_close_) {
// |this| might be deleted as part of |on_close_| being run. Do not add any
// code after running the closure.
std::move(on_close_).Run();
}
}
void CastMessagePortImpl::SetClient(
......
......@@ -5,6 +5,7 @@
#ifndef FUCHSIA_CAST_STREAMING_CAST_MESSAGE_PORT_IMPL_H_
#define FUCHSIA_CAST_STREAMING_CAST_MESSAGE_PORT_IMPL_H_
#include "base/callback.h"
#include "components/cast/message_port/message_port.h"
#include "third_party/openscreen/src/cast/common/public/message_port.h"
......@@ -15,8 +16,9 @@ namespace cast_streaming {
class CastMessagePortImpl : public openscreen::cast::MessagePort,
public cast_api_bindings::MessagePort::Receiver {
public:
explicit CastMessagePortImpl(
std::unique_ptr<cast_api_bindings::MessagePort> message_port);
CastMessagePortImpl(
std::unique_ptr<cast_api_bindings::MessagePort> message_port,
base::OnceClosure on_close);
~CastMessagePortImpl() final;
CastMessagePortImpl(const CastMessagePortImpl&) = delete;
......@@ -47,6 +49,7 @@ class CastMessagePortImpl : public openscreen::cast::MessagePort,
Client* client_ = nullptr;
std::unique_ptr<cast_api_bindings::MessagePort> message_port_;
base::OnceClosure on_close_;
};
} // namespace cast_streaming
......
......@@ -33,8 +33,10 @@ class CastMessagePortImplTest : public testing::Test,
&receiver);
sender_message_port_->SetReceiver(&sender_message_port_receiver_);
receiver_message_port_ =
std::make_unique<CastMessagePortImpl>(std::move(receiver));
receiver_message_port_ = std::make_unique<CastMessagePortImpl>(
std::move(receiver),
base::BindOnce(&CastMessagePortImplTest::OnCastChannelClosed,
base::Unretained(this)));
receiver_message_port_->SetClient(this, kSenderId);
}
......@@ -59,6 +61,20 @@ class CastMessagePortImplTest : public testing::Test,
run_loop.Run();
}
void RunUntilCastChannelClosed() {
base::RunLoop run_loop;
cast_channel_closed_closure_ = run_loop.QuitClosure();
run_loop.Run();
}
void OnCastChannelClosed() {
if (cast_channel_closed_closure_) {
std::move(cast_channel_closed_closure_).Run();
} else {
ADD_FAILURE() << "Cast Streaming Session MessagePort disconnected";
}
}
// openscreen::cast::MessagePort::Client implementation.
void OnMessage(const std::string& source_sender_id,
const std::string& message_namespace,
......@@ -83,6 +99,7 @@ class CastMessagePortImplTest : public testing::Test,
std::vector<CastMessage> receiver_messages_;
base::OnceClosure receiver_message_closure_;
base::OnceClosure error_closure_;
base::OnceClosure cast_channel_closed_closure_;
std::unique_ptr<CastMessagePortImpl> receiver_message_port_;
std::unique_ptr<cast_api_bindings::MessagePort> sender_message_port_;
......@@ -185,4 +202,10 @@ TEST_F(CastMessagePortImplTest, BadMessage) {
openscreen::Error(openscreen::Error::Code::kCastV2InvalidMessage));
}
// Tests closing the sender-end of the Cast Channel properly runs the closure.
TEST_F(CastMessagePortImplTest, CastChannelClosed) {
sender_message_port_.reset();
RunUntilCastChannelClosed();
}
} // namespace cast_streaming
......@@ -112,7 +112,10 @@ class CastStreamingSession::Internal
scoped_refptr<base::SequencedTaskRunner> task_runner)
: task_runner_(task_runner),
environment_(&openscreen::Clock::now, &task_runner_),
cast_message_port_impl_(std::move(message_port)),
cast_message_port_impl_(
std::move(message_port),
base::BindOnce(&CastStreamingSession::Internal::OnCastChannelClosed,
base::Unretained(this))),
client_(client) {
DCHECK(task_runner);
DCHECK(client_);
......@@ -315,6 +318,11 @@ class CastStreamingSession::Internal
receiver_session_.reset();
}
void OnCastChannelClosed() {
DVLOG(1) << __func__;
receiver_session_.reset();
}
openscreen_platform::TaskRunner task_runner_;
openscreen::cast::Environment environment_;
CastMessagePortImpl cast_message_port_impl_;
......@@ -335,6 +343,7 @@ void CastStreamingSession::Start(
Client* client,
std::unique_ptr<cast_api_bindings::MessagePort> message_port,
scoped_refptr<base::SequencedTaskRunner> task_runner) {
DVLOG(1) << __func__;
DCHECK(client);
DCHECK(!internal_);
internal_ =
......@@ -342,6 +351,7 @@ void CastStreamingSession::Start(
}
void CastStreamingSession::Stop() {
DVLOG(1) << __func__;
DCHECK(internal_);
internal_.reset();
}
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment