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