Index: webrtc/p2p/base/faketransportcontroller.h |
diff --git a/webrtc/p2p/base/faketransportcontroller.h b/webrtc/p2p/base/faketransportcontroller.h |
index 9598b822ce0dcf43dff855ebc95b4de475ddf661..d42a93ddae9f95cf1558f9d32f3273f5e9a113c3 100644 |
--- a/webrtc/p2p/base/faketransportcontroller.h |
+++ b/webrtc/p2p/base/faketransportcontroller.h |
@@ -17,7 +17,6 @@ |
#include <vector> |
#include "webrtc/p2p/base/candidatepairinterface.h" |
-#include "webrtc/p2p/base/transport.h" |
#include "webrtc/p2p/base/transportchannel.h" |
#include "webrtc/p2p/base/transportcontroller.h" |
#include "webrtc/p2p/base/transportchannelimpl.h" |
@@ -35,8 +34,6 @@ |
namespace cricket { |
-class FakeTransport; |
- |
namespace { |
struct PacketMessageData : public rtc::MessageData { |
PacketMessageData(const char* data, size_t len) : packet(data, len) {} |
@@ -343,146 +340,6 @@ class FakeTransportChannel : public TransportChannelImpl, |
bool had_connection_ = false; |
}; |
-// Fake transport class, which can be passed to anything that needs a Transport. |
-// Can be informed of another FakeTransport via SetDestination (low-tech way |
-// of doing candidates) |
-class FakeTransport : public Transport { |
- public: |
- typedef std::map<int, FakeTransportChannel*> ChannelMap; |
- |
- explicit FakeTransport(const std::string& name) : Transport(name, nullptr) {} |
- |
- // Note that we only have a constructor with the allocator parameter so it can |
- // be wrapped by a DtlsTransport. |
- FakeTransport(const std::string& name, PortAllocator* allocator) |
- : Transport(name, nullptr) {} |
- |
- ~FakeTransport() { DestroyAllChannels(); } |
- |
- const ChannelMap& channels() const { return channels_; } |
- |
- // If async, will send packets by "Post"-ing to message queue instead of |
- // synchronously "Send"-ing. |
- void SetAsync(bool async) { async_ = async; } |
- void SetAsyncDelay(int delay_ms) { async_delay_ms_ = delay_ms; } |
- |
- // If |asymmetric| is true, only set the destination for this transport, and |
- // not |dest|. |
- void SetDestination(FakeTransport* dest, bool asymmetric = false) { |
- dest_ = dest; |
- for (const auto& kv : channels_) { |
- kv.second->SetLocalCertificate(certificate_); |
- SetChannelDestination(kv.first, kv.second, asymmetric); |
- } |
- } |
- |
- void SetWritable(bool writable) { |
- for (const auto& kv : channels_) { |
- kv.second->SetWritable(writable); |
- } |
- } |
- |
- void SetLocalCertificate( |
- const rtc::scoped_refptr<rtc::RTCCertificate>& certificate) override { |
- certificate_ = certificate; |
- } |
- bool GetLocalCertificate( |
- rtc::scoped_refptr<rtc::RTCCertificate>* certificate) override { |
- if (!certificate_) |
- return false; |
- |
- *certificate = certificate_; |
- return true; |
- } |
- |
- bool GetSslRole(rtc::SSLRole* role) const override { |
- if (channels_.empty()) { |
- return false; |
- } |
- return channels_.begin()->second->GetSslRole(role); |
- } |
- |
- bool SetSslMaxProtocolVersion(rtc::SSLProtocolVersion version) override { |
- ssl_max_version_ = version; |
- for (const auto& kv : channels_) { |
- kv.second->set_ssl_max_protocol_version(ssl_max_version_); |
- } |
- return true; |
- } |
- rtc::SSLProtocolVersion ssl_max_protocol_version() const { |
- return ssl_max_version_; |
- } |
- |
- using Transport::local_description; |
- using Transport::remote_description; |
- using Transport::VerifyCertificateFingerprint; |
- using Transport::NegotiateRole; |
- |
- protected: |
- TransportChannelImpl* CreateTransportChannel(int component) override { |
- if (channels_.find(component) != channels_.end()) { |
- return nullptr; |
- } |
- FakeTransportChannel* channel = new FakeTransportChannel(name(), component); |
- channel->set_ssl_max_protocol_version(ssl_max_version_); |
- channel->SetAsync(async_); |
- channel->SetAsyncDelay(async_delay_ms_); |
- SetChannelDestination(component, channel, false); |
- channels_[component] = channel; |
- return channel; |
- } |
- |
- void DestroyTransportChannel(TransportChannelImpl* channel) override { |
- channels_.erase(channel->component()); |
- delete channel; |
- } |
- |
- private: |
- FakeTransportChannel* GetFakeChannel(int component) { |
- auto it = channels_.find(component); |
- return (it != channels_.end()) ? it->second : nullptr; |
- } |
- |
- void SetChannelDestination(int component, |
- FakeTransportChannel* channel, |
- bool asymmetric) { |
- FakeTransportChannel* dest_channel = nullptr; |
- if (dest_) { |
- dest_channel = dest_->GetFakeChannel(component); |
- if (dest_channel && !asymmetric) { |
- dest_channel->SetLocalCertificate(dest_->certificate_); |
- } |
- } |
- channel->SetDestination(dest_channel, asymmetric); |
- } |
- |
- // Note, this is distinct from the Channel map owned by Transport. |
- // This map just tracks the FakeTransportChannels created by this class. |
- // It's mainly needed so that we can access a FakeTransportChannel directly, |
- // even if wrapped by a DtlsTransportChannelWrapper. |
- ChannelMap channels_; |
- FakeTransport* dest_ = nullptr; |
- bool async_ = false; |
- int async_delay_ms_ = 0; |
- rtc::scoped_refptr<rtc::RTCCertificate> certificate_; |
- rtc::SSLProtocolVersion ssl_max_version_ = rtc::SSL_PROTOCOL_DTLS_12; |
-}; |
- |
-#ifdef HAVE_QUIC |
-class FakeQuicTransport : public QuicTransport { |
- public: |
- FakeQuicTransport(const std::string& transport_name) |
- : QuicTransport(transport_name, nullptr, nullptr) {} |
- |
- protected: |
- QuicTransportChannel* CreateTransportChannel(int component) override { |
- FakeTransportChannel* fake_ice_transport_channel = |
- new FakeTransportChannel(name(), component); |
- return new QuicTransportChannel(fake_ice_transport_channel); |
- } |
-}; |
-#endif |
- |
// Fake candidate pair class, which can be passed to BaseChannel for testing |
// purposes. |
class FakeCandidatePair : public CandidatePairInterface { |
@@ -512,52 +369,66 @@ class FakeTransportController : public TransportController { |
FakeTransportController() |
: TransportController(rtc::Thread::Current(), |
rtc::Thread::Current(), |
- nullptr), |
- fail_create_channel_(false) {} |
+ nullptr) {} |
explicit FakeTransportController(bool redetermine_role_on_ice_restart) |
: TransportController(rtc::Thread::Current(), |
rtc::Thread::Current(), |
nullptr, |
- redetermine_role_on_ice_restart), |
- fail_create_channel_(false) {} |
+ redetermine_role_on_ice_restart) {} |
explicit FakeTransportController(IceRole role) |
: TransportController(rtc::Thread::Current(), |
rtc::Thread::Current(), |
- nullptr), |
- fail_create_channel_(false) { |
+ nullptr) { |
SetIceRole(role); |
} |
explicit FakeTransportController(rtc::Thread* network_thread) |
- : TransportController(rtc::Thread::Current(), network_thread, nullptr), |
- fail_create_channel_(false) {} |
+ : TransportController(rtc::Thread::Current(), network_thread, nullptr) {} |
FakeTransportController(rtc::Thread* network_thread, IceRole role) |
- : TransportController(rtc::Thread::Current(), network_thread, nullptr), |
- fail_create_channel_(false) { |
+ : TransportController(rtc::Thread::Current(), network_thread, nullptr) { |
SetIceRole(role); |
} |
- FakeTransport* GetTransport_n(const std::string& transport_name) { |
- return static_cast<FakeTransport*>( |
- TransportController::GetTransport_n(transport_name)); |
+ FakeTransportChannel* GetFakeTransportChannel_n( |
+ const std::string& transport_name, |
+ int component) { |
+ return static_cast<FakeTransportChannel*>( |
+ get_channel_for_testing(transport_name, component)); |
} |
+ // Simulate the exchange of transport descriptions, and the gathering and |
+ // exchange of ICE candidates. |
void Connect(FakeTransportController* dest) { |
+ for (const std::string& transport_name : transport_names_for_testing()) { |
+ TransportDescription local_desc( |
+ std::vector<std::string>(), |
+ rtc::CreateRandomString(cricket::ICE_UFRAG_LENGTH), |
+ rtc::CreateRandomString(cricket::ICE_PWD_LENGTH), |
+ cricket::ICEMODE_FULL, cricket::CONNECTIONROLE_NONE, nullptr); |
+ TransportDescription remote_desc( |
+ std::vector<std::string>(), |
+ rtc::CreateRandomString(cricket::ICE_UFRAG_LENGTH), |
+ rtc::CreateRandomString(cricket::ICE_PWD_LENGTH), |
+ cricket::ICEMODE_FULL, cricket::CONNECTIONROLE_NONE, nullptr); |
+ std::string err; |
+ SetLocalTransportDescription(transport_name, local_desc, |
+ cricket::CA_OFFER, &err); |
+ dest->SetRemoteTransportDescription(transport_name, local_desc, |
+ cricket::CA_OFFER, &err); |
+ dest->SetLocalTransportDescription(transport_name, remote_desc, |
+ cricket::CA_ANSWER, &err); |
+ SetRemoteTransportDescription(transport_name, remote_desc, |
+ cricket::CA_ANSWER, &err); |
+ } |
+ MaybeStartGathering(); |
+ dest->MaybeStartGathering(); |
network_thread()->Invoke<void>( |
RTC_FROM_HERE, |
- rtc::Bind(&FakeTransportController::Connect_n, this, dest)); |
- } |
- |
- TransportChannel* CreateTransportChannel_n(const std::string& transport_name, |
- int component) override { |
- if (fail_create_channel_) { |
- return nullptr; |
- } |
- return TransportController::CreateTransportChannel_n(transport_name, |
- component); |
+ rtc::Bind(&FakeTransportController::SetChannelDestinations_n, this, |
+ dest)); |
} |
FakeCandidatePair* CreateFakeCandidatePair( |
@@ -572,50 +443,35 @@ class FakeTransportController : public TransportController { |
return new FakeCandidatePair(local_candidate, remote_candidate); |
} |
- void set_fail_channel_creation(bool fail_channel_creation) { |
- fail_create_channel_ = fail_channel_creation; |
- } |
- |
protected: |
- Transport* CreateTransport_n(const std::string& transport_name) override { |
-#ifdef HAVE_QUIC |
- if (quic()) { |
- return new FakeQuicTransport(transport_name); |
- } |
-#endif |
- return new FakeTransport(transport_name); |
+ // The ICE channel is never actually used by TransportController directly, |
+ // since (currently) the DTLS channel pretends to be both ICE + DTLS. This |
+ // will change when we get rid of TransportChannelImpl. |
+ TransportChannelImpl* CreateIceTransportChannel_n( |
+ const std::string& transport_name, |
+ int component) override { |
+ return nullptr; |
} |
- void Connect_n(FakeTransportController* dest) { |
- // Simulate the exchange of candidates. |
- ConnectChannels_n(); |
- dest->ConnectChannels_n(); |
- for (auto& kv : transports()) { |
- FakeTransport* transport = static_cast<FakeTransport*>(kv.second); |
- transport->SetDestination(dest->GetTransport_n(kv.first)); |
- } |
+ TransportChannelImpl* CreateDtlsTransportChannel_n( |
+ const std::string& transport_name, |
+ int component, |
+ TransportChannelImpl*) override { |
+ return new FakeTransportChannel(transport_name, component); |
} |
- void ConnectChannels_n() { |
- TransportDescription faketransport_desc( |
- std::vector<std::string>(), |
- rtc::CreateRandomString(cricket::ICE_UFRAG_LENGTH), |
- rtc::CreateRandomString(cricket::ICE_PWD_LENGTH), cricket::ICEMODE_FULL, |
- cricket::CONNECTIONROLE_NONE, nullptr); |
- for (auto& kv : transports()) { |
- FakeTransport* transport = static_cast<FakeTransport*>(kv.second); |
- // Set local transport description for FakeTransport before connecting. |
- // Otherwise, the RTC_CHECK in Transport.ConnectChannel will fail. |
- if (!transport->local_description()) { |
- transport->SetLocalTransportDescription(faketransport_desc, |
- cricket::CA_OFFER, nullptr); |
+ private: |
+ void SetChannelDestinations_n(FakeTransportController* dest) { |
+ for (TransportChannelImpl* tc : channels_for_testing()) { |
+ FakeTransportChannel* local = static_cast<FakeTransportChannel*>(tc); |
+ FakeTransportChannel* remote = dest->GetFakeTransportChannel_n( |
+ local->transport_name(), local->component()); |
+ if (remote) { |
+ bool asymmetric = false; |
+ local->SetDestination(remote, asymmetric); |
} |
- transport->MaybeStartGathering(); |
} |
} |
- |
- private: |
- bool fail_create_channel_; |
}; |
} // namespace cricket |