diff options
Diffstat (limited to 'cast/sender/cast_platform_client_unittest.cc')
-rw-r--r-- | cast/sender/cast_platform_client_unittest.cc | 109 |
1 files changed, 109 insertions, 0 deletions
diff --git a/cast/sender/cast_platform_client_unittest.cc b/cast/sender/cast_platform_client_unittest.cc new file mode 100644 index 00000000..e4f3769b --- /dev/null +++ b/cast/sender/cast_platform_client_unittest.cc @@ -0,0 +1,109 @@ +// Copyright 2020 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "cast/sender/cast_platform_client.h" + +#include "cast/common/channel/testing/fake_cast_socket.h" +#include "cast/common/channel/testing/mock_socket_error_handler.h" +#include "cast/common/channel/virtual_connection_manager.h" +#include "cast/common/channel/virtual_connection_router.h" +#include "cast/common/public/service_info.h" +#include "cast/sender/testing/test_helpers.h" +#include "gmock/gmock.h" +#include "gtest/gtest.h" +#include "platform/test/fake_clock.h" +#include "platform/test/fake_task_runner.h" +#include "util/json/json_serialization.h" +#include "util/json/json_value.h" + +namespace openscreen { +namespace cast { + +using ::cast::channel::CastMessage; + +using ::testing::_; + +class CastPlatformClientTest : public ::testing::Test { + public: + void SetUp() override { + socket_ = fake_cast_socket_pair_.socket.get(); + router_.TakeSocket(&mock_error_handler_, + std::move(fake_cast_socket_pair_.socket)); + + receiver_.v4_endpoint = IPEndpoint{{192, 168, 0, 17}, 4434}; + receiver_.unique_id = "deviceId1"; + platform_client_.AddOrUpdateReceiver(receiver_, socket_->socket_id()); + } + + protected: + CastSocket& peer_socket() { return *fake_cast_socket_pair_.peer_socket; } + MockCastSocketClient& peer_client() { + return fake_cast_socket_pair_.mock_peer_client; + } + + FakeCastSocketPair fake_cast_socket_pair_; + CastSocket* socket_ = nullptr; + MockSocketErrorHandler mock_error_handler_; + VirtualConnectionManager manager_; + VirtualConnectionRouter router_{&manager_}; + FakeClock clock_{Clock::now()}; + FakeTaskRunner task_runner_{&clock_}; + CastPlatformClient platform_client_{&router_, &manager_, &FakeClock::now, + &task_runner_}; + ServiceInfo receiver_; +}; + +TEST_F(CastPlatformClientTest, AppAvailability) { + int request_id = -1; + std::string sender_id; + EXPECT_CALL(peer_client(), OnMessage(_, _)) + .WillOnce([&request_id, &sender_id](CastSocket* socket, + CastMessage message) { + VerifyAppAvailabilityRequest(message, "AAA", &request_id, &sender_id); + }); + bool ran = false; + platform_client_.RequestAppAvailability( + "deviceId1", "AAA", + [&ran](const std::string& app_id, AppAvailabilityResult availability) { + EXPECT_EQ("AAA", app_id); + EXPECT_EQ(availability, AppAvailabilityResult::kAvailable); + ran = true; + }); + + CastMessage availability_response = + CreateAppAvailableResponseChecked(request_id, sender_id, "AAA"); + EXPECT_TRUE(peer_socket().SendMessage(availability_response).ok()); + EXPECT_TRUE(ran); + + // NOTE: Callback should only fire once, so it should not fire again here. + ran = false; + EXPECT_TRUE(peer_socket().SendMessage(availability_response).ok()); + EXPECT_FALSE(ran); +} + +TEST_F(CastPlatformClientTest, CancelRequest) { + int request_id = -1; + std::string sender_id; + EXPECT_CALL(peer_client(), OnMessage(_, _)) + .WillOnce([&request_id, &sender_id](CastSocket* socket, + CastMessage message) { + VerifyAppAvailabilityRequest(message, "AAA", &request_id, &sender_id); + }); + absl::optional<int> maybe_request_id = + platform_client_.RequestAppAvailability( + "deviceId1", "AAA", + [](const std::string& app_id, AppAvailabilityResult availability) { + EXPECT_TRUE(false); + }); + ASSERT_TRUE(maybe_request_id); + int local_request_id = maybe_request_id.value(); + platform_client_.CancelRequest(local_request_id); + + CastMessage availability_response = + CreateAppAvailableResponseChecked(request_id, sender_id, "AAA"); + EXPECT_TRUE(peer_socket().SendMessage(availability_response).ok()); +} + +} // namespace cast +} // namespace openscreen |