cast_streaming_browsertest.cc 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199
  1. // Copyright 2020 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include <fuchsia/mem/cpp/fidl.h>
  5. #include "base/callback_helpers.h"
  6. #include "base/fuchsia/mem_buffer_util.h"
  7. #include "base/test/test_future.h"
  8. #include "base/threading/platform_thread.h"
  9. #include "components/cast/message_port/fuchsia/message_port_fuchsia.h"
  10. #include "components/cast/message_port/platform_message_port.h"
  11. #include "components/cast_streaming/browser/test/cast_streaming_test_sender.h"
  12. #include "content/public/test/browser_test.h"
  13. #include "fuchsia_web/common/test/fit_adapter.h"
  14. #include "fuchsia_web/common/test/frame_test_util.h"
  15. #include "fuchsia_web/common/test/test_navigation_listener.h"
  16. #include "fuchsia_web/webengine/browser/context_impl.h"
  17. #include "fuchsia_web/webengine/browser/frame_impl.h"
  18. #include "fuchsia_web/webengine/test/frame_for_test.h"
  19. #include "fuchsia_web/webengine/test/test_data.h"
  20. #include "fuchsia_web/webengine/test/web_engine_browser_test.h"
  21. #include "media/base/media_util.h"
  22. #include "testing/gtest/include/gtest/gtest.h"
  23. namespace {
  24. const char kCastStreamingReceiverPath[] = "/cast_streaming_receiver.html";
  25. media::AudioDecoderConfig GetDefaultAudioConfig() {
  26. return media::AudioDecoderConfig(
  27. media::AudioCodec::kOpus, media::SampleFormat::kSampleFormatF32,
  28. media::ChannelLayout::CHANNEL_LAYOUT_STEREO,
  29. 48000 /* samples_per_second */, media::EmptyExtraData(),
  30. media::EncryptionScheme::kUnencrypted);
  31. }
  32. media::VideoDecoderConfig GetDefaultVideoConfig() {
  33. const gfx::Size kVideoSize = {1920, 1080};
  34. const gfx::Rect kVideoRect(kVideoSize);
  35. return media::VideoDecoderConfig(
  36. media::VideoCodec::kVP8, media::VideoCodecProfile::VP8PROFILE_MIN,
  37. media::VideoDecoderConfig::AlphaMode::kIsOpaque, media::VideoColorSpace(),
  38. media::VideoTransformation(), kVideoSize, kVideoRect, kVideoSize,
  39. media::EmptyExtraData(), media::EncryptionScheme::kUnencrypted);
  40. }
  41. } // namespace
  42. // Base test fixture for Cast Streaming tests.
  43. class CastStreamingBaseTest : public WebEngineBrowserTest {
  44. public:
  45. CastStreamingBaseTest() {
  46. set_test_server_root(base::FilePath(kTestServerRoot));
  47. }
  48. ~CastStreamingBaseTest() override = default;
  49. CastStreamingBaseTest(const CastStreamingBaseTest&) = delete;
  50. CastStreamingBaseTest& operator=(const CastStreamingBaseTest&) = delete;
  51. };
  52. // Test fixture for Cast Streaming tests with the Cast Streaming Receiver flag
  53. // disabled.
  54. class CastStreamingDisabledTest : public CastStreamingBaseTest {
  55. public:
  56. CastStreamingDisabledTest() = default;
  57. ~CastStreamingDisabledTest() override = default;
  58. CastStreamingDisabledTest(const CastStreamingDisabledTest&) = delete;
  59. CastStreamingDisabledTest& operator=(const CastStreamingDisabledTest&) =
  60. delete;
  61. protected:
  62. void SetUpCommandLine(base::CommandLine* command_line) override {
  63. content::BrowserTestBase::SetUpCommandLine(command_line);
  64. command_line->RemoveSwitch("enable-cast-streaming-receiver");
  65. }
  66. };
  67. // Test fixture for Cast Streaming tests with the Cast Streaming Receiver flag
  68. // enabled.
  69. class CastStreamingTest : public CastStreamingBaseTest {
  70. public:
  71. CastStreamingTest() = default;
  72. ~CastStreamingTest() override = default;
  73. CastStreamingTest(const CastStreamingTest&) = delete;
  74. CastStreamingTest& operator=(const CastStreamingTest&) = delete;
  75. protected:
  76. void SetUpCommandLine(base::CommandLine* command_line) override {
  77. content::BrowserTestBase::SetUpCommandLine(command_line);
  78. command_line->AppendSwitch("enable-cast-streaming-receiver");
  79. }
  80. };
  81. // Check that attempting to load the cast streaming media source URL when the
  82. // command line switch is not set fails as expected.
  83. IN_PROC_BROWSER_TEST_F(CastStreamingDisabledTest, LoadFailure) {
  84. ASSERT_TRUE(embedded_test_server()->Start());
  85. const GURL page_url(
  86. embedded_test_server()->GetURL(kCastStreamingReceiverPath));
  87. auto frame =
  88. FrameForTest::Create(context(), fuchsia::web::CreateFrameParams());
  89. EXPECT_TRUE(LoadUrlAndExpectResponse(frame.GetNavigationController(),
  90. fuchsia::web::LoadUrlParams(),
  91. page_url.spec()));
  92. frame.navigation_listener().RunUntilTitleEquals("error");
  93. }
  94. // Check that attempting to load the cast streaming media source URL when the
  95. // command line switch is set properly succeeds.
  96. IN_PROC_BROWSER_TEST_F(CastStreamingTest, LoadSuccess) {
  97. ASSERT_TRUE(embedded_test_server()->Start());
  98. const GURL page_url(
  99. embedded_test_server()->GetURL(kCastStreamingReceiverPath));
  100. fuchsia::mem::Buffer ignored_message_string =
  101. base::MemBufferFromString("hi", "test");
  102. std::unique_ptr<cast_api_bindings::MessagePort> sender_message_port;
  103. std::unique_ptr<cast_api_bindings::MessagePort> receiver_message_port;
  104. cast_api_bindings::CreatePlatformMessagePortPair(&sender_message_port,
  105. &receiver_message_port);
  106. fidl::InterfaceRequest<::fuchsia::web::MessagePort> message_port_request =
  107. cast_api_bindings::MessagePortFuchsia::FromMessagePort(
  108. receiver_message_port.get())
  109. ->TakeServiceRequest();
  110. // Start the Sender
  111. cast_streaming::CastStreamingTestSender sender;
  112. sender.Start(std::move(sender_message_port), net::IPAddress::IPv6Localhost(),
  113. GetDefaultAudioConfig(), GetDefaultVideoConfig());
  114. // Create a Frame and set the Receiver MessagePort on it.
  115. auto frame =
  116. FrameForTest::Create(context(), fuchsia::web::CreateFrameParams());
  117. base::test::TestFuture<fuchsia::web::Frame_PostMessage_Result> post_result;
  118. frame->PostMessage(
  119. "cast-streaming:receiver",
  120. CreateWebMessageWithMessagePortRequest(std::move(message_port_request),
  121. std::move(ignored_message_string)),
  122. CallbackToFitFunction(post_result.GetCallback()));
  123. EXPECT_TRUE(LoadUrlAndExpectResponse(frame.GetNavigationController(),
  124. fuchsia::web::LoadUrlParams(),
  125. page_url.spec()));
  126. ASSERT_TRUE(sender.RunUntilActive());
  127. frame.navigation_listener().RunUntilTitleEquals("canplay");
  128. EXPECT_TRUE(post_result.Wait());
  129. EXPECT_NE(sender.audio_decoder_config(), absl::nullopt);
  130. EXPECT_NE(sender.video_decoder_config(), absl::nullopt);
  131. }
  132. // Check that attempting to start a video-only receiver properly disables audio.
  133. IN_PROC_BROWSER_TEST_F(CastStreamingTest, VideoOnlyReceiver) {
  134. ASSERT_TRUE(embedded_test_server()->Start());
  135. const GURL kPageUrl(
  136. embedded_test_server()->GetURL(kCastStreamingReceiverPath));
  137. fuchsia::mem::Buffer ignored_message_string =
  138. base::MemBufferFromString("hi", "test");
  139. std::unique_ptr<cast_api_bindings::MessagePort> sender_message_port;
  140. std::unique_ptr<cast_api_bindings::MessagePort> receiver_message_port;
  141. cast_api_bindings::CreatePlatformMessagePortPair(&sender_message_port,
  142. &receiver_message_port);
  143. fidl::InterfaceRequest<::fuchsia::web::MessagePort> message_port_request =
  144. cast_api_bindings::MessagePortFuchsia::FromMessagePort(
  145. receiver_message_port.get())
  146. ->TakeServiceRequest();
  147. // Start the Sender
  148. cast_streaming::CastStreamingTestSender sender;
  149. sender.Start(std::move(sender_message_port), net::IPAddress::IPv6Localhost(),
  150. GetDefaultAudioConfig(), GetDefaultVideoConfig());
  151. // Create a Frame and set the Receiver MessagePort on it.
  152. auto frame =
  153. FrameForTest::Create(context(), fuchsia::web::CreateFrameParams());
  154. base::test::TestFuture<fuchsia::web::Frame_PostMessage_Result> post_result;
  155. frame->PostMessage(
  156. "cast-streaming:video-only-receiver",
  157. CreateWebMessageWithMessagePortRequest(std::move(message_port_request),
  158. std::move(ignored_message_string)),
  159. CallbackToFitFunction(post_result.GetCallback()));
  160. EXPECT_TRUE(LoadUrlAndExpectResponse(frame.GetNavigationController(),
  161. fuchsia::web::LoadUrlParams(),
  162. kPageUrl.spec()));
  163. ASSERT_TRUE(sender.RunUntilActive());
  164. frame.navigation_listener().RunUntilTitleEquals("canplay");
  165. EXPECT_TRUE(post_result.Wait());
  166. EXPECT_EQ(sender.audio_decoder_config(), absl::nullopt);
  167. EXPECT_NE(sender.video_decoder_config(), absl::nullopt);
  168. }