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 
5 #include "cast/sender/cast_platform_client.h"
6 
7 #include "cast/common/channel/testing/fake_cast_socket.h"
8 #include "cast/common/channel/testing/mock_socket_error_handler.h"
9 #include "cast/common/channel/virtual_connection_manager.h"
10 #include "cast/common/channel/virtual_connection_router.h"
11 #include "cast/common/public/service_info.h"
12 #include "cast/sender/testing/test_helpers.h"
13 #include "gmock/gmock.h"
14 #include "gtest/gtest.h"
15 #include "platform/test/fake_clock.h"
16 #include "platform/test/fake_task_runner.h"
17 #include "util/json/json_serialization.h"
18 #include "util/json/json_value.h"
19 
20 namespace openscreen {
21 namespace cast {
22 
23 using ::cast::channel::CastMessage;
24 
25 using ::testing::_;
26 
27 class CastPlatformClientTest : public ::testing::Test {
28  public:
SetUp()29   void SetUp() override {
30     socket_ = fake_cast_socket_pair_.socket.get();
31     router_.TakeSocket(&mock_error_handler_,
32                        std::move(fake_cast_socket_pair_.socket));
33 
34     receiver_.v4_address = IPAddress{192, 168, 0, 17};
35     receiver_.port = 4434;
36     receiver_.unique_id = "deviceId1";
37     platform_client_.AddOrUpdateReceiver(receiver_, socket_->socket_id());
38   }
39 
40  protected:
peer_socket()41   CastSocket& peer_socket() { return *fake_cast_socket_pair_.peer_socket; }
peer_client()42   MockCastSocketClient& peer_client() {
43     return fake_cast_socket_pair_.mock_peer_client;
44   }
45 
46   FakeCastSocketPair fake_cast_socket_pair_;
47   CastSocket* socket_ = nullptr;
48   MockSocketErrorHandler mock_error_handler_;
49   VirtualConnectionManager manager_;
50   VirtualConnectionRouter router_{&manager_};
51   FakeClock clock_{Clock::now()};
52   FakeTaskRunner task_runner_{&clock_};
53   CastPlatformClient platform_client_{&router_, &manager_, &FakeClock::now,
54                                       &task_runner_};
55   ServiceInfo receiver_;
56 };
57 
TEST_F(CastPlatformClientTest,AppAvailability)58 TEST_F(CastPlatformClientTest, AppAvailability) {
59   int request_id = -1;
60   std::string sender_id;
61   EXPECT_CALL(peer_client(), OnMessage(_, _))
62       .WillOnce([&request_id, &sender_id](CastSocket* socket,
63                                           CastMessage message) {
64         VerifyAppAvailabilityRequest(message, "AAA", &request_id, &sender_id);
65       });
66   bool ran = false;
67   platform_client_.RequestAppAvailability(
68       "deviceId1", "AAA",
69       [&ran](const std::string& app_id, AppAvailabilityResult availability) {
70         EXPECT_EQ("AAA", app_id);
71         EXPECT_EQ(availability, AppAvailabilityResult::kAvailable);
72         ran = true;
73       });
74 
75   CastMessage availability_response =
76       CreateAppAvailableResponseChecked(request_id, sender_id, "AAA");
77   EXPECT_TRUE(peer_socket().SendMessage(availability_response).ok());
78   EXPECT_TRUE(ran);
79 
80   // NOTE: Callback should only fire once, so it should not fire again here.
81   ran = false;
82   EXPECT_TRUE(peer_socket().SendMessage(availability_response).ok());
83   EXPECT_FALSE(ran);
84 }
85 
TEST_F(CastPlatformClientTest,CancelRequest)86 TEST_F(CastPlatformClientTest, CancelRequest) {
87   int request_id = -1;
88   std::string sender_id;
89   EXPECT_CALL(peer_client(), OnMessage(_, _))
90       .WillOnce([&request_id, &sender_id](CastSocket* socket,
91                                           CastMessage message) {
92         VerifyAppAvailabilityRequest(message, "AAA", &request_id, &sender_id);
93       });
94   absl::optional<int> maybe_request_id =
95       platform_client_.RequestAppAvailability(
96           "deviceId1", "AAA",
97           [](const std::string& app_id, AppAvailabilityResult availability) {
98             EXPECT_TRUE(false);
99           });
100   ASSERT_TRUE(maybe_request_id);
101   int local_request_id = maybe_request_id.value();
102   platform_client_.CancelRequest(local_request_id);
103 
104   CastMessage availability_response =
105       CreateAppAvailableResponseChecked(request_id, sender_id, "AAA");
106   EXPECT_TRUE(peer_socket().SendMessage(availability_response).ok());
107 }
108 
109 }  // namespace cast
110 }  // namespace openscreen
111