1 // Copyright 2017 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 
5 #include "chrome/common/media_router/mojom/media_router_mojom_traits.h"
6 
7 #include <utility>
8 
9 #include "base/test/task_environment.h"
10 #include "chrome/common/media_router/discovery/media_sink_internal.h"
11 #include "chrome/common/media_router/mojom/media_router.mojom.h"
12 #include "chrome/common/media_router/mojom/media_router_traits_test_service.mojom.h"
13 #include "mojo/public/cpp/bindings/receiver_set.h"
14 #include "mojo/public/cpp/bindings/remote.h"
15 #include "testing/gtest/include/gtest/gtest.h"
16 
17 namespace media_router {
18 
19 class MediaRouterStructTraitsTest
20     : public testing::Test,
21       public media_router::mojom::MediaRouterTraitsTestService {
22  public:
MediaRouterStructTraitsTest()23   MediaRouterStructTraitsTest() {}
24 
25  protected:
GetTraitsTestRemote()26   mojo::Remote<mojom::MediaRouterTraitsTestService> GetTraitsTestRemote() {
27     mojo::Remote<mojom::MediaRouterTraitsTestService> remote;
28     traits_test_receivers_.Add(this, remote.BindNewPipeAndPassReceiver());
29     return remote;
30   }
31 
32  private:
33   // MediaRouterTraitsTestService Impl
EchoMediaSink(const MediaSinkInternal & sink,EchoMediaSinkCallback callback)34   void EchoMediaSink(const MediaSinkInternal& sink,
35                      EchoMediaSinkCallback callback) override {
36     std::move(callback).Run(sink);
37   }
38 
39   base::test::TaskEnvironment task_environment_;
40   mojo::ReceiverSet<MediaRouterTraitsTestService> traits_test_receivers_;
41 
42   DISALLOW_COPY_AND_ASSIGN(MediaRouterStructTraitsTest);
43 };
44 
TEST_F(MediaRouterStructTraitsTest,DialMediaSink)45 TEST_F(MediaRouterStructTraitsTest, DialMediaSink) {
46   MediaSink::Id sink_id("sinkId123");
47   std::string sink_name("The sink");
48   SinkIconType icon_type(SinkIconType::CAST);
49   MediaRouteProviderId provider_id(MediaRouteProviderId::EXTENSION);
50   std::string ip_address("192.168.1.2");
51   std::string model_name("model name");
52   GURL app_url("https://example.com");
53 
54   MediaSink sink(sink_id, sink_name, icon_type, provider_id);
55   DialSinkExtraData extra_data;
56   EXPECT_TRUE(extra_data.ip_address.AssignFromIPLiteral(ip_address));
57   extra_data.model_name = model_name;
58   extra_data.app_url = app_url;
59 
60   MediaSinkInternal dial_sink(sink, extra_data);
61 
62   mojo::Remote<mojom::MediaRouterTraitsTestService> remote =
63       GetTraitsTestRemote();
64   MediaSinkInternal output;
65   remote->EchoMediaSink(dial_sink, &output);
66 
67   EXPECT_EQ(dial_sink, output);
68 }
69 
TEST_F(MediaRouterStructTraitsTest,CastMediaSink)70 TEST_F(MediaRouterStructTraitsTest, CastMediaSink) {
71   MediaSink::Id sink_id("sinkId123");
72   std::string sink_name("The sink");
73   SinkIconType icon_type(SinkIconType::CAST);
74   MediaRouteProviderId provider_id(MediaRouteProviderId::EXTENSION);
75   std::string model_name("model name");
76 
77   MediaSink sink(sink_id, sink_name, icon_type, provider_id);
78   CastSinkExtraData extra_data;
79   extra_data.ip_endpoint = net::IPEndPoint(net::IPAddress(192, 168, 1, 2), 0);
80   extra_data.model_name = model_name;
81   extra_data.capabilities = 2;
82   extra_data.cast_channel_id = 3;
83 
84   MediaSinkInternal cast_sink(sink, extra_data);
85 
86   mojo::Remote<mojom::MediaRouterTraitsTestService> remote =
87       GetTraitsTestRemote();
88   MediaSinkInternal output;
89   remote->EchoMediaSink(cast_sink, &output);
90 
91   EXPECT_EQ(cast_sink, output);
92 }
93 
TEST_F(MediaRouterStructTraitsTest,GenericMediaSink)94 TEST_F(MediaRouterStructTraitsTest, GenericMediaSink) {
95   MediaSink::Id sink_id("sinkId123");
96   std::string sink_name("The sink");
97   SinkIconType icon_type(SinkIconType::CAST);
98   MediaRouteProviderId provider_id(MediaRouteProviderId::EXTENSION);
99 
100   MediaSink sink(sink_id, sink_name, icon_type, provider_id);
101   MediaSinkInternal generic_sink;
102   generic_sink.set_sink(sink);
103 
104   mojo::Remote<mojom::MediaRouterTraitsTestService> remote =
105       GetTraitsTestRemote();
106   MediaSinkInternal output;
107   remote->EchoMediaSink(generic_sink, &output);
108 
109   EXPECT_EQ(generic_sink, output);
110 }
111 
112 }  // namespace media_router
113