Commit 9c85129d authored by Kehuang Li's avatar Kehuang Li Committed by Commit Bot

[Chromecast] Update capture service receiver tests

As crbug/946657 has been fixed, fulfill the TODO in the unittest.

Bug: internal: 133880006
Test: Run unit tests.
Change-Id: I7cbc5ac0ea18b19cf584c8842b1d3405fb663e63
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1724930Reviewed-by: default avatarYuchen Liu <yucliu@chromium.org>
Reviewed-by: default avatarKenneth MacKay <kmackay@chromium.org>
Reviewed-by: default avatarGabriel Charette <gab@chromium.org>
Commit-Queue: Kehuang Li <kehuangli@chromium.org>
Cr-Commit-Position: refs/heads/master@{#682354}
parent 394c077f
...@@ -9,12 +9,10 @@ ...@@ -9,12 +9,10 @@
#include <utility> #include <utility>
#include "base/bind.h" #include "base/bind.h"
#include "base/callback.h"
#include "base/location.h" #include "base/location.h"
#include "base/logging.h" #include "base/logging.h"
#include "base/message_loop/message_pump_type.h" #include "base/message_loop/message_pump_type.h"
#include "base/threading/sequenced_task_runner_handle.h" #include "base/threading/sequenced_task_runner_handle.h"
#include "base/time/time.h"
#include "base/timer/timer.h" #include "base/timer/timer.h"
#include "chromecast/media/audio/capture_service/capture_service_buildflags.h" #include "chromecast/media/audio/capture_service/capture_service_buildflags.h"
#include "chromecast/media/audio/capture_service/constants.h" #include "chromecast/media/audio/capture_service/constants.h"
...@@ -47,13 +45,6 @@ ...@@ -47,13 +45,6 @@
namespace chromecast { namespace chromecast {
namespace media { namespace media {
namespace {
constexpr base::TimeDelta kConnectTimeout = base::TimeDelta::FromSeconds(1);
constexpr base::TimeDelta kInactivityTimeout = base::TimeDelta::FromSeconds(5);
} // namespace
class CaptureServiceReceiver::Socket : public SmallMessageSocket { class CaptureServiceReceiver::Socket : public SmallMessageSocket {
public: public:
Socket(std::unique_ptr<net::StreamSocket> socket, int channels); Socket(std::unique_ptr<net::StreamSocket> socket, int channels);
...@@ -95,7 +86,8 @@ CaptureServiceReceiver::Socket::~Socket() = default; ...@@ -95,7 +86,8 @@ CaptureServiceReceiver::Socket::~Socket() = default;
void CaptureServiceReceiver::Socket::Start( void CaptureServiceReceiver::Socket::Start(
::media::AudioInputStream::AudioInputCallback* input_callback) { ::media::AudioInputStream::AudioInputCallback* input_callback) {
input_callback_ = input_callback; input_callback_ = input_callback;
inactivity_timer_.Start(FROM_HERE, kInactivityTimeout, this, inactivity_timer_.Start(FROM_HERE, CaptureServiceReceiver::kInactivityTimeout,
this,
&CaptureServiceReceiver::Socket::OnInactivityTimeout); &CaptureServiceReceiver::Socket::OnInactivityTimeout);
ReceiveMessages(); ReceiveMessages();
} }
...@@ -158,6 +150,10 @@ bool CaptureServiceReceiver::Socket::HandleAudio( ...@@ -158,6 +150,10 @@ bool CaptureServiceReceiver::Socket::HandleAudio(
return true; return true;
} }
// static
constexpr base::TimeDelta CaptureServiceReceiver::kConnectTimeout;
constexpr base::TimeDelta CaptureServiceReceiver::kInactivityTimeout;
CaptureServiceReceiver::CaptureServiceReceiver( CaptureServiceReceiver::CaptureServiceReceiver(
const ::media::AudioParameters& audio_params) const ::media::AudioParameters& audio_params)
: audio_params_(audio_params), io_thread_(__func__) { : audio_params_(audio_params), io_thread_(__func__) {
...@@ -241,10 +237,6 @@ void CaptureServiceReceiver::OnConnected( ...@@ -241,10 +237,6 @@ void CaptureServiceReceiver::OnConnected(
input_callback->OnError(); input_callback->OnError();
connecting_socket_.reset(); connecting_socket_.reset();
} }
if (!connected_cb_.is_null()) {
std::move(connected_cb_).Run();
}
} }
void CaptureServiceReceiver::OnConnectTimeout( void CaptureServiceReceiver::OnConnectTimeout(
...@@ -264,11 +256,6 @@ void CaptureServiceReceiver::Stop() { ...@@ -264,11 +256,6 @@ void CaptureServiceReceiver::Stop() {
socket_.reset(); socket_.reset();
} }
void CaptureServiceReceiver::SetConnectClosureForTest(
base::OnceClosure connected_cb) {
connected_cb_ = std::move(connected_cb);
}
void CaptureServiceReceiver::SetTaskRunnerForTest( void CaptureServiceReceiver::SetTaskRunnerForTest(
scoped_refptr<base::SequencedTaskRunner> task_runner) { scoped_refptr<base::SequencedTaskRunner> task_runner) {
task_runner_ = std::move(task_runner); task_runner_ = std::move(task_runner);
......
...@@ -7,10 +7,10 @@ ...@@ -7,10 +7,10 @@
#include <memory> #include <memory>
#include "base/callback_forward.h"
#include "base/macros.h" #include "base/macros.h"
#include "base/memory/scoped_refptr.h" #include "base/memory/scoped_refptr.h"
#include "base/threading/thread.h" #include "base/threading/thread.h"
#include "base/time/time.h"
#include "media/audio/audio_io.h" #include "media/audio/audio_io.h"
#include "media/base/audio_parameters.h" #include "media/base/audio_parameters.h"
...@@ -27,6 +27,14 @@ namespace media { ...@@ -27,6 +27,14 @@ namespace media {
class CaptureServiceReceiver { class CaptureServiceReceiver {
public: public:
// The timeout for a connecting socket to stop waiting and report error.
static constexpr base::TimeDelta kConnectTimeout =
base::TimeDelta::FromSeconds(1);
// The timeout for a connected socket to disconnect due to inactivity.
static constexpr base::TimeDelta kInactivityTimeout =
base::TimeDelta::FromSeconds(5);
explicit CaptureServiceReceiver(const ::media::AudioParameters& audio_params); explicit CaptureServiceReceiver(const ::media::AudioParameters& audio_params);
~CaptureServiceReceiver(); ~CaptureServiceReceiver();
...@@ -39,18 +47,8 @@ class CaptureServiceReceiver { ...@@ -39,18 +47,8 @@ class CaptureServiceReceiver {
::media::AudioInputStream::AudioInputCallback* input_callback, ::media::AudioInputStream::AudioInputCallback* input_callback,
std::unique_ptr<net::StreamSocket> connecting_socket); std::unique_ptr<net::StreamSocket> connecting_socket);
// Unit test can wait for the closure as a async way to run to idle. E.g.,
//
// base::RunLoop run_loop;
// SetConnectClosureForTest(run_loop.QuitClosure());
// StartWithSocket(...);
// run_loop.Run();
//
void SetConnectClosureForTest(base::OnceClosure connected_cb);
// Unit test can set test task runner so as to run test in sync. Must be // Unit test can set test task runner so as to run test in sync. Must be
// called after construction and before any other methods. Do not mix with the // called after construction and before any other methods.
// use of SetConnectClosureForTest().
void SetTaskRunnerForTest( void SetTaskRunnerForTest(
scoped_refptr<base::SequencedTaskRunner> task_runner); scoped_refptr<base::SequencedTaskRunner> task_runner);
...@@ -75,8 +73,6 @@ class CaptureServiceReceiver { ...@@ -75,8 +73,6 @@ class CaptureServiceReceiver {
std::unique_ptr<net::StreamSocket> connecting_socket_; std::unique_ptr<net::StreamSocket> connecting_socket_;
std::unique_ptr<Socket> socket_; std::unique_ptr<Socket> socket_;
base::OnceClosure connected_cb_;
DISALLOW_COPY_AND_ASSIGN(CaptureServiceReceiver); DISALLOW_COPY_AND_ASSIGN(CaptureServiceReceiver);
}; };
......
...@@ -8,6 +8,7 @@ ...@@ -8,6 +8,7 @@
#include "base/big_endian.h" #include "base/big_endian.h"
#include "base/run_loop.h" #include "base/run_loop.h"
#include "base/task/post_task.h"
#include "base/test/scoped_task_environment.h" #include "base/test/scoped_task_environment.h"
#include "chromecast/media/audio/mock_audio_input_callback.h" #include "chromecast/media/audio/mock_audio_input_callback.h"
#include "chromecast/net/mock_stream_socket.h" #include "chromecast/net/mock_stream_socket.h"
...@@ -36,11 +37,15 @@ class CaptureServiceReceiverTest : public ::testing::Test { ...@@ -36,11 +37,15 @@ class CaptureServiceReceiverTest : public ::testing::Test {
::media::AudioParameters::AUDIO_PCM_LINEAR, ::media::AudioParameters::AUDIO_PCM_LINEAR,
::media::ChannelLayout::CHANNEL_LAYOUT_MONO, ::media::ChannelLayout::CHANNEL_LAYOUT_MONO,
16000, 16000,
160)) {} 160)) {
receiver_.SetTaskRunnerForTest(base::CreateSequencedTaskRunner(
{base::ThreadPool(), base::TaskPriority::USER_BLOCKING}));
}
~CaptureServiceReceiverTest() override = default; ~CaptureServiceReceiverTest() override = default;
protected: protected:
base::test::ScopedTaskEnvironment scoped_task_environment_; base::test::ScopedTaskEnvironment scoped_task_environment_{
base::test::ScopedTaskEnvironment::TimeSource::MOCK_TIME};
chromecast::MockAudioInputCallback audio_; chromecast::MockAudioInputCallback audio_;
CaptureServiceReceiver receiver_; CaptureServiceReceiver receiver_;
}; };
...@@ -53,15 +58,14 @@ TEST_F(CaptureServiceReceiverTest, StartStop) { ...@@ -53,15 +58,14 @@ TEST_F(CaptureServiceReceiverTest, StartStop) {
EXPECT_CALL(*socket2, Connect(_)).WillOnce(Return(net::OK)); EXPECT_CALL(*socket2, Connect(_)).WillOnce(Return(net::OK));
// Sync. // Sync.
base::RunLoop run_loop;
receiver_.SetConnectClosureForTest(run_loop.QuitClosure());
receiver_.StartWithSocket(&audio_, std::move(socket1)); receiver_.StartWithSocket(&audio_, std::move(socket1));
run_loop.Run(); scoped_task_environment_.RunUntilIdle();
receiver_.Stop(); receiver_.Stop();
// Async. // Async.
receiver_.StartWithSocket(&audio_, std::move(socket2)); receiver_.StartWithSocket(&audio_, std::move(socket2));
receiver_.Stop(); receiver_.Stop();
scoped_task_environment_.RunUntilIdle();
} }
TEST_F(CaptureServiceReceiverTest, ConnectFailed) { TEST_F(CaptureServiceReceiverTest, ConnectFailed) {
...@@ -69,15 +73,19 @@ TEST_F(CaptureServiceReceiverTest, ConnectFailed) { ...@@ -69,15 +73,19 @@ TEST_F(CaptureServiceReceiverTest, ConnectFailed) {
EXPECT_CALL(*socket, Connect(_)).WillOnce(Return(net::ERR_FAILED)); EXPECT_CALL(*socket, Connect(_)).WillOnce(Return(net::ERR_FAILED));
EXPECT_CALL(audio_, OnError()); EXPECT_CALL(audio_, OnError());
base::RunLoop run_loop;
receiver_.SetConnectClosureForTest(run_loop.QuitClosure());
receiver_.StartWithSocket(&audio_, std::move(socket)); receiver_.StartWithSocket(&audio_, std::move(socket));
run_loop.Run(); scoped_task_environment_.RunUntilIdle();
} }
// TODO(https://crbug.com/946657): Add unit tests for timeout once supporting of TEST_F(CaptureServiceReceiverTest, ConnectTimeout) {
// MOCK_TIME for threads other than the main thread is available. Also, update auto socket = std::make_unique<MockStreamSocket>();
// the use of task runner in the following tests. EXPECT_CALL(*socket, Connect(_)).WillOnce(Return(net::ERR_IO_PENDING));
EXPECT_CALL(audio_, OnError());
receiver_.StartWithSocket(&audio_, std::move(socket));
scoped_task_environment_.FastForwardBy(
CaptureServiceReceiver::kConnectTimeout);
}
TEST_F(CaptureServiceReceiverTest, ReceiveValidMessage) { TEST_F(CaptureServiceReceiverTest, ReceiveValidMessage) {
auto socket = std::make_unique<MockStreamSocket>(); auto socket = std::make_unique<MockStreamSocket>();
...@@ -99,8 +107,6 @@ TEST_F(CaptureServiceReceiverTest, ReceiveValidMessage) { ...@@ -99,8 +107,6 @@ TEST_F(CaptureServiceReceiverTest, ReceiveValidMessage) {
.WillOnce(Return(net::ERR_IO_PENDING)); .WillOnce(Return(net::ERR_IO_PENDING));
EXPECT_CALL(audio_, OnData(_, _, 1.0 /* volume */)); EXPECT_CALL(audio_, OnData(_, _, 1.0 /* volume */));
receiver_.SetTaskRunnerForTest(
scoped_task_environment_.GetMainThreadTaskRunner());
receiver_.StartWithSocket(&audio_, std::move(socket)); receiver_.StartWithSocket(&audio_, std::move(socket));
scoped_task_environment_.RunUntilIdle(); scoped_task_environment_.RunUntilIdle();
} }
...@@ -119,8 +125,6 @@ TEST_F(CaptureServiceReceiverTest, ReceiveInvalidMessage) { ...@@ -119,8 +125,6 @@ TEST_F(CaptureServiceReceiverTest, ReceiveInvalidMessage) {
})); }));
EXPECT_CALL(audio_, OnError()); EXPECT_CALL(audio_, OnError());
receiver_.SetTaskRunnerForTest(
scoped_task_environment_.GetMainThreadTaskRunner());
receiver_.StartWithSocket(&audio_, std::move(socket)); receiver_.StartWithSocket(&audio_, std::move(socket));
scoped_task_environment_.RunUntilIdle(); scoped_task_environment_.RunUntilIdle();
} }
...@@ -132,8 +136,6 @@ TEST_F(CaptureServiceReceiverTest, ReceiveError) { ...@@ -132,8 +136,6 @@ TEST_F(CaptureServiceReceiverTest, ReceiveError) {
.WillOnce(Return(net::ERR_CONNECTION_RESET)); .WillOnce(Return(net::ERR_CONNECTION_RESET));
EXPECT_CALL(audio_, OnError()); EXPECT_CALL(audio_, OnError());
receiver_.SetTaskRunnerForTest(
scoped_task_environment_.GetMainThreadTaskRunner());
receiver_.StartWithSocket(&audio_, std::move(socket)); receiver_.StartWithSocket(&audio_, std::move(socket));
scoped_task_environment_.RunUntilIdle(); scoped_task_environment_.RunUntilIdle();
} }
...@@ -144,12 +146,21 @@ TEST_F(CaptureServiceReceiverTest, ReceiveEosMessage) { ...@@ -144,12 +146,21 @@ TEST_F(CaptureServiceReceiverTest, ReceiveEosMessage) {
EXPECT_CALL(*socket, Read(_, _, _)).WillOnce(Return(0)); EXPECT_CALL(*socket, Read(_, _, _)).WillOnce(Return(0));
EXPECT_CALL(audio_, OnError()); EXPECT_CALL(audio_, OnError());
receiver_.SetTaskRunnerForTest(
scoped_task_environment_.GetMainThreadTaskRunner());
receiver_.StartWithSocket(&audio_, std::move(socket)); receiver_.StartWithSocket(&audio_, std::move(socket));
scoped_task_environment_.RunUntilIdle(); scoped_task_environment_.RunUntilIdle();
} }
TEST_F(CaptureServiceReceiverTest, ReceiveTimeout) {
auto socket = std::make_unique<MockStreamSocket>();
EXPECT_CALL(*socket, Connect(_)).WillOnce(Return(net::OK));
EXPECT_CALL(*socket, Read(_, _, _)).WillOnce(Return(net::ERR_IO_PENDING));
EXPECT_CALL(audio_, OnError());
receiver_.StartWithSocket(&audio_, std::move(socket));
scoped_task_environment_.FastForwardBy(
CaptureServiceReceiver::kInactivityTimeout);
}
} // namespace } // namespace
} // namespace capture_service } // namespace capture_service
} // namespace media } // namespace media
......
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