blob: 6eb662cb95a4c7eab81a9a52aa1b5867a77d91ed [file] [log] [blame]
// Copyright 2019 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 "third_party/blink/renderer/modules/peerconnection/adapters/quic_packet_transport_adapter.h"
#include "net/test/gtest_util.h"
#include "third_party/webrtc/p2p/base/mockicetransport.h"
namespace blink {
namespace {
using testing::StrEq;
} // namespace
class MockWriteObserver : public P2PQuicPacketTransport::WriteObserver {
public:
MOCK_METHOD0(OnCanWrite, void());
};
class MockReceiveDelegate : public P2PQuicPacketTransport::ReceiveDelegate {
public:
MOCK_METHOD2(OnPacketDataReceived, void(const char*, size_t));
};
class QuicPacketTransportAdapterTest : public testing::Test {
public:
QuicPacketTransportAdapterTest()
: quic_packet_transport_adapter_(&mock_ice_transport_) {}
~QuicPacketTransportAdapterTest() override {
quic_packet_transport_adapter_.SetReceiveDelegate(nullptr);
quic_packet_transport_adapter_.SetWriteObserver(nullptr);
}
cricket::MockIceTransport* mock_ice_transport() {
return &mock_ice_transport_;
}
QuicPacketTransportAdapter* quic_packet_transport_adapter() {
return &quic_packet_transport_adapter_;
}
private:
cricket::MockIceTransport mock_ice_transport_;
QuicPacketTransportAdapter quic_packet_transport_adapter_;
};
// Tests that when the underlying ICE transport is ready to send data that
// the QuicPacketTransportAdapter will tell the WriteObserver.
TEST_F(QuicPacketTransportAdapterTest, IceTransportReadyTriggersCanWrite) {
MockWriteObserver mock_write_observer;
quic_packet_transport_adapter()->SetWriteObserver(&mock_write_observer);
EXPECT_CALL(mock_write_observer, OnCanWrite());
mock_ice_transport()->SignalReadyToSend(mock_ice_transport());
}
// Tests that writing a packet to the QuicPacketTransportAdapter will write
// the data to the underlying ICE transport.
TEST_F(QuicPacketTransportAdapterTest, WritePacketWritesToIceTransport) {
std::string packet("hola");
EXPECT_CALL(*mock_ice_transport(),
SendPacket(StrEq(packet), packet.size(), _, _));
P2PQuicPacketTransport::QuicPacket quic_packet;
quic_packet.buffer = packet.c_str();
quic_packet.buf_len = packet.size();
quic_packet_transport_adapter()->WritePacket(quic_packet);
}
// Tests that when the underlying ICE transport receives data it it
// is passed appropriately to the ReceiveDelegate.
TEST_F(QuicPacketTransportAdapterTest, ReadPacketGivenToReceiveDelegate) {
MockReceiveDelegate mock_receive_delegate;
quic_packet_transport_adapter()->SetReceiveDelegate(&mock_receive_delegate);
std::string packet("hola");
EXPECT_CALL(mock_receive_delegate,
OnPacketDataReceived(StrEq(packet), packet.size()));
mock_ice_transport()->SignalReadPacket(mock_ice_transport(), packet.c_str(),
packet.size(), 0, 0);
}
// Tests that the most recent packet that was received before the
// ReceiveDelegate is hooked up will be given to the ReceiveDelegate once it is
// set. This is used as an optimization in the case that a QUIC CHLO is received
// early.
TEST_F(QuicPacketTransportAdapterTest,
MostRecentCachedPacketGivenToReceiveDelegate) {
std::string packet("hola");
std::string latest_packet("bonjour");
mock_ice_transport()->SignalReadPacket(mock_ice_transport(), packet.c_str(),
packet.size(), 0, 0);
mock_ice_transport()->SignalReadPacket(
mock_ice_transport(), latest_packet.c_str(), latest_packet.size(), 0, 0);
// The receive delegate is set after packets have been received.
MockReceiveDelegate mock_receive_delegate;
EXPECT_CALL(mock_receive_delegate,
OnPacketDataReceived(StrEq(latest_packet), latest_packet.size()));
quic_packet_transport_adapter()->SetReceiveDelegate(&mock_receive_delegate);
}
// Tests that the cached packet is not reused once it has been handed off to
// a set ReceiveDelegate.
TEST_F(QuicPacketTransportAdapterTest, CachedPacketIsNotReused) {
std::string packet("hola");
mock_ice_transport()->SignalReadPacket(mock_ice_transport(), packet.c_str(),
packet.size(), 0, 0);
MockReceiveDelegate mock_receive_delegate;
EXPECT_CALL(mock_receive_delegate, OnPacketDataReceived(_, _));
quic_packet_transport_adapter()->SetReceiveDelegate(&mock_receive_delegate);
MockReceiveDelegate latest_receive_delegate;
EXPECT_CALL(latest_receive_delegate, OnPacketDataReceived(_, _)).Times(0);
quic_packet_transport_adapter()->SetReceiveDelegate(&latest_receive_delegate);
}
} // namespace blink