10e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org/* 20e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * libjingle 30e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * Copyright 2009, Google, Inc. 40e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * 50e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * Redistribution and use in source and binary forms, with or without 60e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * modification, are permitted provided that the following conditions are met: 70e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * 80e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * 1. Redistributions of source code must retain the above copyright notice, 90e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * this list of conditions and the following disclaimer. 100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * 2. Redistributions in binary form must reproduce the above copyright notice, 110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * this list of conditions and the following disclaimer in the documentation 120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * and/or other materials provided with the distribution. 130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * 3. The name of the author may not be used to endorse or promote products 140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * derived from this software without specific prior written permission. 150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * 160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED 170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO 190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org */ 270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#ifndef TALK_P2P_BASE_FAKESESSION_H_ 290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#define TALK_P2P_BASE_FAKESESSION_H_ 300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include <map> 320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include <string> 330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include <vector> 340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "talk/p2p/base/session.h" 360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "talk/p2p/base/transport.h" 370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "talk/p2p/base/transportchannel.h" 380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "talk/p2p/base/transportchannelimpl.h" 39cf81adffe15fa8ea0f333432e41f6d504148f18abuildbot@webrtc.org#include "webrtc/base/buffer.h" 40cf81adffe15fa8ea0f333432e41f6d504148f18abuildbot@webrtc.org#include "webrtc/base/fakesslidentity.h" 41cf81adffe15fa8ea0f333432e41f6d504148f18abuildbot@webrtc.org#include "webrtc/base/messagequeue.h" 42cf81adffe15fa8ea0f333432e41f6d504148f18abuildbot@webrtc.org#include "webrtc/base/sigslot.h" 43cf81adffe15fa8ea0f333432e41f6d504148f18abuildbot@webrtc.org#include "webrtc/base/sslfingerprint.h" 440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgnamespace cricket { 460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgclass FakeTransport; 480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 492a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.orgstruct PacketMessageData : public rtc::MessageData { 500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org PacketMessageData(const char* data, size_t len) : packet(data, len) { 510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 522a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::Buffer packet; 530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}; 540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Fake transport channel class, which can be passed to anything that needs a 560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// transport channel. Can be informed of another FakeTransportChannel via 570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// SetDestination. 580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgclass FakeTransportChannel : public TransportChannelImpl, 592a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org public rtc::MessageHandler { 600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org public: 610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org explicit FakeTransportChannel(Transport* transport, 620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const std::string& content_name, 630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org int component) 640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org : TransportChannelImpl(content_name, component), 650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org transport_(transport), 660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org dest_(NULL), 670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org state_(STATE_INIT), 680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org async_(false), 690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org identity_(NULL), 700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org do_dtls_(false), 71e560834da4ee5a5f38a96a8cb9290c5ce1096989mallinath@webrtc.org role_(ICEROLE_UNKNOWN), 720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org tiebreaker_(0), 730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ice_proto_(ICEPROTO_HYBRID), 740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org remote_ice_mode_(ICEMODE_FULL), 75fd0545a26fb7b9467151c50e53b6fa7ec8a8ae8emallinath@webrtc.org dtls_fingerprint_("", NULL, 0), 762a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org ssl_role_(rtc::SSL_CLIENT), 77f5e5b3a9ce372d0e3cc594bf0036dda64a57d81dmallinath@webrtc.org connection_count_(0) { 780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ~FakeTransportChannel() { 800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org Reset(); 810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 83e560834da4ee5a5f38a96a8cb9290c5ce1096989mallinath@webrtc.org uint64 IceTiebreaker() const { return tiebreaker_; } 840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org TransportProtocol protocol() const { return ice_proto_; } 850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org IceMode remote_ice_mode() const { return remote_ice_mode_; } 860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const std::string& ice_ufrag() const { return ice_ufrag_; } 870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const std::string& ice_pwd() const { return ice_pwd_; } 880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const std::string& remote_ice_ufrag() const { return remote_ice_ufrag_; } 890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const std::string& remote_ice_pwd() const { return remote_ice_pwd_; } 902a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org const rtc::SSLFingerprint& dtls_fingerprint() const { 910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return dtls_fingerprint_; 920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org void SetAsync(bool async) { 950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org async_ = async; 960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org virtual Transport* GetTransport() { 990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return transport_; 1000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 1010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 102e560834da4ee5a5f38a96a8cb9290c5ce1096989mallinath@webrtc.org virtual void SetIceRole(IceRole role) { role_ = role; } 103e560834da4ee5a5f38a96a8cb9290c5ce1096989mallinath@webrtc.org virtual IceRole GetIceRole() const { return role_; } 104f5e5b3a9ce372d0e3cc594bf0036dda64a57d81dmallinath@webrtc.org virtual size_t GetConnectionCount() const { return connection_count_; } 105e560834da4ee5a5f38a96a8cb9290c5ce1096989mallinath@webrtc.org virtual void SetIceTiebreaker(uint64 tiebreaker) { tiebreaker_ = tiebreaker; } 106b881d27f23e9a8f52dc6a60fc66ebd75f9c2f15cmallinath@webrtc.org virtual bool GetIceProtocolType(IceProtocolType* type) const { 107b881d27f23e9a8f52dc6a60fc66ebd75f9c2f15cmallinath@webrtc.org *type = ice_proto_; 108b881d27f23e9a8f52dc6a60fc66ebd75f9c2f15cmallinath@webrtc.org return true; 109b881d27f23e9a8f52dc6a60fc66ebd75f9c2f15cmallinath@webrtc.org } 1100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org virtual void SetIceProtocolType(IceProtocolType type) { ice_proto_ = type; } 1110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org virtual void SetIceCredentials(const std::string& ice_ufrag, 1120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const std::string& ice_pwd) { 1130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ice_ufrag_ = ice_ufrag; 1140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ice_pwd_ = ice_pwd; 1150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 1160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org virtual void SetRemoteIceCredentials(const std::string& ice_ufrag, 1170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const std::string& ice_pwd) { 1180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org remote_ice_ufrag_ = ice_ufrag; 1190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org remote_ice_pwd_ = ice_pwd; 1200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 1210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org virtual void SetRemoteIceMode(IceMode mode) { remote_ice_mode_ = mode; } 1230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org virtual bool SetRemoteFingerprint(const std::string& alg, const uint8* digest, 1240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org size_t digest_len) { 1252a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org dtls_fingerprint_ = rtc::SSLFingerprint(alg, digest, digest_len); 1260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return true; 1270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 1282a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org virtual bool SetSslRole(rtc::SSLRole role) { 129a487db2aeda23ade81f0b2e5fd4d50f874d06a9csergeyu@chromium.org ssl_role_ = role; 130a487db2aeda23ade81f0b2e5fd4d50f874d06a9csergeyu@chromium.org return true; 131a487db2aeda23ade81f0b2e5fd4d50f874d06a9csergeyu@chromium.org } 1322a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org virtual bool GetSslRole(rtc::SSLRole* role) const { 133a487db2aeda23ade81f0b2e5fd4d50f874d06a9csergeyu@chromium.org *role = ssl_role_; 134a487db2aeda23ade81f0b2e5fd4d50f874d06a9csergeyu@chromium.org return true; 135a487db2aeda23ade81f0b2e5fd4d50f874d06a9csergeyu@chromium.org } 1360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org virtual void Connect() { 1380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (state_ == STATE_INIT) { 1390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org state_ = STATE_CONNECTING; 1400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 1410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 1420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org virtual void Reset() { 1430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (state_ != STATE_INIT) { 1440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org state_ = STATE_INIT; 1450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (dest_) { 1460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org dest_->state_ = STATE_INIT; 1470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org dest_->dest_ = NULL; 1480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org dest_ = NULL; 1490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 1500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 1510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 1520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org void SetWritable(bool writable) { 1540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org set_writable(writable); 1550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 1560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org void SetDestination(FakeTransportChannel* dest) { 1580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (state_ == STATE_CONNECTING && dest) { 1590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // This simulates the delivery of candidates. 1600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org dest_ = dest; 1610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org dest_->dest_ = this; 1620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (identity_ && dest_->identity_) { 1630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org do_dtls_ = true; 1640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org dest_->do_dtls_ = true; 1650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org NegotiateSrtpCiphers(); 1660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 1670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org state_ = STATE_CONNECTED; 1680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org dest_->state_ = STATE_CONNECTED; 1690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org set_writable(true); 1700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org dest_->set_writable(true); 1710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } else if (state_ == STATE_CONNECTED && !dest) { 1720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Simulates loss of connectivity, by asymmetrically forgetting dest_. 1730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org dest_ = NULL; 1740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org state_ = STATE_CONNECTING; 1750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org set_writable(false); 1760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 1770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 1780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 179f5e5b3a9ce372d0e3cc594bf0036dda64a57d81dmallinath@webrtc.org void SetConnectionCount(size_t connection_count) { 180f5e5b3a9ce372d0e3cc594bf0036dda64a57d81dmallinath@webrtc.org size_t old_connection_count = connection_count_; 181f5e5b3a9ce372d0e3cc594bf0036dda64a57d81dmallinath@webrtc.org connection_count_ = connection_count; 182f5e5b3a9ce372d0e3cc594bf0036dda64a57d81dmallinath@webrtc.org if (connection_count_ < old_connection_count) 183f5e5b3a9ce372d0e3cc594bf0036dda64a57d81dmallinath@webrtc.org SignalConnectionRemoved(this); 184f5e5b3a9ce372d0e3cc594bf0036dda64a57d81dmallinath@webrtc.org } 185f5e5b3a9ce372d0e3cc594bf0036dda64a57d81dmallinath@webrtc.org 186391247d05a663265807c400947ab6eb01ae3d690mallinath@webrtc.org virtual int SendPacket(const char* data, size_t len, 1872a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org const rtc::PacketOptions& options, int flags) { 1880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (state_ != STATE_CONNECTED) { 1890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return -1; 1900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 1910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (flags != PF_SRTP_BYPASS && flags != 0) { 1930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return -1; 1940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 1950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org PacketMessageData* packet = new PacketMessageData(data, len); 1970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (async_) { 1982a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::Thread::Current()->Post(this, 0, packet); 1990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } else { 2002a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::Thread::Current()->Send(this, 0, packet); 2010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 2021a04b881e0ef480802fb01b4fbe9bcd5388d2c69henrike@webrtc.org return static_cast<int>(len); 2030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 2042a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org virtual int SetOption(rtc::Socket::Option opt, int value) { 2050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return true; 2060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 2070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org virtual int GetError() { 2080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return 0; 2090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 2100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 2110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org virtual void OnSignalingReady() { 2120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 2130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org virtual void OnCandidate(const Candidate& candidate) { 2140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 2150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 2162a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org virtual void OnMessage(rtc::Message* msg) { 2170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org PacketMessageData* data = static_cast<PacketMessageData*>( 2180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org msg->pdata); 2190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org dest_->SignalReadPacket(dest_, data->packet.data(), 220f89a403cd8db88001322bbb0765c4636fd123700wu@webrtc.org data->packet.length(), 2212a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::CreatePacketTime(0), 0); 2220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org delete data; 2230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 2240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 2252a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org bool SetLocalIdentity(rtc::SSLIdentity* identity) { 2260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org identity_ = identity; 2270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return true; 2280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 2290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 23062fe97f10a7a3200c9724851f6a18537ed270cddwu@webrtc.org 2312a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org void SetRemoteCertificate(rtc::FakeSSLCertificate* cert) { 23262fe97f10a7a3200c9724851f6a18537ed270cddwu@webrtc.org remote_cert_ = cert; 23362fe97f10a7a3200c9724851f6a18537ed270cddwu@webrtc.org } 23462fe97f10a7a3200c9724851f6a18537ed270cddwu@webrtc.org 23562fe97f10a7a3200c9724851f6a18537ed270cddwu@webrtc.org virtual bool IsDtlsActive() const { 2360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return do_dtls_; 2370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 2380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 23962fe97f10a7a3200c9724851f6a18537ed270cddwu@webrtc.org virtual bool SetSrtpCiphers(const std::vector<std::string>& ciphers) { 2400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org srtp_ciphers_ = ciphers; 2410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return true; 2420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 2430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 2440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org virtual bool GetSrtpCipher(std::string* cipher) { 2450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (!chosen_srtp_cipher_.empty()) { 2460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org *cipher = chosen_srtp_cipher_; 2470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return true; 2480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 2490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return false; 2500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 2510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 2522a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org virtual bool GetLocalIdentity(rtc::SSLIdentity** identity) const { 25362fe97f10a7a3200c9724851f6a18537ed270cddwu@webrtc.org if (!identity_) 25462fe97f10a7a3200c9724851f6a18537ed270cddwu@webrtc.org return false; 25562fe97f10a7a3200c9724851f6a18537ed270cddwu@webrtc.org 25662fe97f10a7a3200c9724851f6a18537ed270cddwu@webrtc.org *identity = identity_->GetReference(); 25762fe97f10a7a3200c9724851f6a18537ed270cddwu@webrtc.org return true; 25862fe97f10a7a3200c9724851f6a18537ed270cddwu@webrtc.org } 25962fe97f10a7a3200c9724851f6a18537ed270cddwu@webrtc.org 2602a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org virtual bool GetRemoteCertificate(rtc::SSLCertificate** cert) const { 26162fe97f10a7a3200c9724851f6a18537ed270cddwu@webrtc.org if (!remote_cert_) 26262fe97f10a7a3200c9724851f6a18537ed270cddwu@webrtc.org return false; 26362fe97f10a7a3200c9724851f6a18537ed270cddwu@webrtc.org 26462fe97f10a7a3200c9724851f6a18537ed270cddwu@webrtc.org *cert = remote_cert_->GetReference(); 26562fe97f10a7a3200c9724851f6a18537ed270cddwu@webrtc.org return true; 26662fe97f10a7a3200c9724851f6a18537ed270cddwu@webrtc.org } 26762fe97f10a7a3200c9724851f6a18537ed270cddwu@webrtc.org 2680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org virtual bool ExportKeyingMaterial(const std::string& label, 2690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const uint8* context, 2700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org size_t context_len, 2710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org bool use_context, 2720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org uint8* result, 2730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org size_t result_len) { 2740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (!chosen_srtp_cipher_.empty()) { 2750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org memset(result, 0xff, result_len); 2760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return true; 2770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 2780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 2790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return false; 2800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 2810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 2820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org virtual void NegotiateSrtpCiphers() { 2830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org for (std::vector<std::string>::const_iterator it1 = srtp_ciphers_.begin(); 2840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org it1 != srtp_ciphers_.end(); ++it1) { 2850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org for (std::vector<std::string>::const_iterator it2 = 2860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org dest_->srtp_ciphers_.begin(); 2870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org it2 != dest_->srtp_ciphers_.end(); ++it2) { 2880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (*it1 == *it2) { 2890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org chosen_srtp_cipher_ = *it1; 2900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org dest_->chosen_srtp_cipher_ = *it2; 2910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return; 2920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 2930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 2940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 2950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 2960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 2970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org virtual bool GetStats(ConnectionInfos* infos) OVERRIDE { 2980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ConnectionInfo info; 2990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org infos->clear(); 3000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org infos->push_back(info); 3010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return true; 3020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 3030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 3040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org private: 3050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org enum State { STATE_INIT, STATE_CONNECTING, STATE_CONNECTED }; 3060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org Transport* transport_; 3070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org FakeTransportChannel* dest_; 3080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org State state_; 3090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org bool async_; 3102a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::SSLIdentity* identity_; 3112a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::FakeSSLCertificate* remote_cert_; 3120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org bool do_dtls_; 3130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::vector<std::string> srtp_ciphers_; 3140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::string chosen_srtp_cipher_; 315e560834da4ee5a5f38a96a8cb9290c5ce1096989mallinath@webrtc.org IceRole role_; 3160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org uint64 tiebreaker_; 3170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org IceProtocolType ice_proto_; 3180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::string ice_ufrag_; 3190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::string ice_pwd_; 3200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::string remote_ice_ufrag_; 3210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::string remote_ice_pwd_; 3220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org IceMode remote_ice_mode_; 3232a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::SSLFingerprint dtls_fingerprint_; 3242a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::SSLRole ssl_role_; 325f5e5b3a9ce372d0e3cc594bf0036dda64a57d81dmallinath@webrtc.org size_t connection_count_; 3260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}; 3270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 3280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Fake transport class, which can be passed to anything that needs a Transport. 3290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Can be informed of another FakeTransport via SetDestination (low-tech way 3300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// of doing candidates) 3310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgclass FakeTransport : public Transport { 3320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org public: 3330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org typedef std::map<int, FakeTransportChannel*> ChannelMap; 3342a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org FakeTransport(rtc::Thread* signaling_thread, 3352a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::Thread* worker_thread, 3360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const std::string& content_name, 3370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org PortAllocator* alllocator = NULL) 3380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org : Transport(signaling_thread, worker_thread, 3390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org content_name, "test_type", NULL), 3400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org dest_(NULL), 3410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org async_(false), 3420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org identity_(NULL) { 3430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 3440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ~FakeTransport() { 3450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org DestroyAllChannels(); 3460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 3470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 3480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const ChannelMap& channels() const { return channels_; } 3490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 3500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org void SetAsync(bool async) { async_ = async; } 3510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org void SetDestination(FakeTransport* dest) { 3520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org dest_ = dest; 3530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org for (ChannelMap::iterator it = channels_.begin(); it != channels_.end(); 3540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ++it) { 3550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org it->second->SetLocalIdentity(identity_); 3560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SetChannelDestination(it->first, it->second); 3570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 3580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 3590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 3600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org void SetWritable(bool writable) { 3610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org for (ChannelMap::iterator it = channels_.begin(); it != channels_.end(); 3620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ++it) { 3630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org it->second->SetWritable(writable); 3640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 3650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 3660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 3672a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org void set_identity(rtc::SSLIdentity* identity) { 3680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org identity_ = identity; 3690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 3700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 3710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org using Transport::local_description; 3720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org using Transport::remote_description; 3730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 3740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org protected: 3750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org virtual TransportChannelImpl* CreateTransportChannel(int component) { 3760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (channels_.find(component) != channels_.end()) { 3770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return NULL; 3780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 3790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org FakeTransportChannel* channel = 3800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org new FakeTransportChannel(this, content_name(), component); 3810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org channel->SetAsync(async_); 3820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SetChannelDestination(component, channel); 3830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org channels_[component] = channel; 3840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return channel; 3850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 3860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org virtual void DestroyTransportChannel(TransportChannelImpl* channel) { 3870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org channels_.erase(channel->component()); 3880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org delete channel; 3890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 3902a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org virtual void SetIdentity_w(rtc::SSLIdentity* identity) { 39162fe97f10a7a3200c9724851f6a18537ed270cddwu@webrtc.org identity_ = identity; 39262fe97f10a7a3200c9724851f6a18537ed270cddwu@webrtc.org } 3932a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org virtual bool GetIdentity_w(rtc::SSLIdentity** identity) { 39462fe97f10a7a3200c9724851f6a18537ed270cddwu@webrtc.org if (!identity_) 39562fe97f10a7a3200c9724851f6a18537ed270cddwu@webrtc.org return false; 39662fe97f10a7a3200c9724851f6a18537ed270cddwu@webrtc.org 39762fe97f10a7a3200c9724851f6a18537ed270cddwu@webrtc.org *identity = identity_->GetReference(); 39862fe97f10a7a3200c9724851f6a18537ed270cddwu@webrtc.org return true; 39962fe97f10a7a3200c9724851f6a18537ed270cddwu@webrtc.org } 4000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 4010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org private: 4020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org FakeTransportChannel* GetFakeChannel(int component) { 4030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ChannelMap::iterator it = channels_.find(component); 4040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return (it != channels_.end()) ? it->second : NULL; 4050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 4060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org void SetChannelDestination(int component, 4070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org FakeTransportChannel* channel) { 4080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org FakeTransportChannel* dest_channel = NULL; 4090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (dest_) { 4100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org dest_channel = dest_->GetFakeChannel(component); 4110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (dest_channel) { 4120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org dest_channel->SetLocalIdentity(dest_->identity_); 4130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 4140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 4150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org channel->SetDestination(dest_channel); 4160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 4170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 4180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Note, this is distinct from the Channel map owned by Transport. 4190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // This map just tracks the FakeTransportChannels created by this class. 4200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ChannelMap channels_; 4210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org FakeTransport* dest_; 4220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org bool async_; 4232a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::SSLIdentity* identity_; 4240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}; 4250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 4260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Fake session class, which can be passed into a BaseChannel object for 4270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// test purposes. Can be connected to other FakeSessions via Connect(). 4280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgclass FakeSession : public BaseSession { 4290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org public: 4300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org explicit FakeSession() 4312a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org : BaseSession(rtc::Thread::Current(), 4322a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::Thread::Current(), 4330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org NULL, "", "", true), 4340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org fail_create_channel_(false) { 4350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 4360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org explicit FakeSession(bool initiator) 4372a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org : BaseSession(rtc::Thread::Current(), 4382a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::Thread::Current(), 4390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org NULL, "", "", initiator), 4400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org fail_create_channel_(false) { 4410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 4422a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org FakeSession(rtc::Thread* worker_thread, bool initiator) 4432a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org : BaseSession(rtc::Thread::Current(), 4445528070a0c76057a000b877fc56ca4180ad2087bmallinath@webrtc.org worker_thread, 4455528070a0c76057a000b877fc56ca4180ad2087bmallinath@webrtc.org NULL, "", "", initiator), 4465528070a0c76057a000b877fc56ca4180ad2087bmallinath@webrtc.org fail_create_channel_(false) { 4475528070a0c76057a000b877fc56ca4180ad2087bmallinath@webrtc.org } 4480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 4490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org FakeTransport* GetTransport(const std::string& content_name) { 4500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return static_cast<FakeTransport*>( 4510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org BaseSession::GetTransport(content_name)); 4520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 4530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 4540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org void Connect(FakeSession* dest) { 4550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Simulate the exchange of candidates. 4560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org CompleteNegotiation(); 4570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org dest->CompleteNegotiation(); 4580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org for (TransportMap::const_iterator it = transport_proxies().begin(); 4590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org it != transport_proxies().end(); ++it) { 4600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org static_cast<FakeTransport*>(it->second->impl())->SetDestination( 4610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org dest->GetTransport(it->first)); 4620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 4630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 4640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 4650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org virtual TransportChannel* CreateChannel( 4660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const std::string& content_name, 4670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const std::string& channel_name, 4680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org int component) { 4690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (fail_create_channel_) { 4700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return NULL; 4710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 4720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return BaseSession::CreateChannel(content_name, channel_name, component); 4730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 4740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 4750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org void set_fail_channel_creation(bool fail_channel_creation) { 4760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org fail_create_channel_ = fail_channel_creation; 4770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 4780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 4790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // TODO: Hoist this into Session when we re-work the Session code. 4802a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org void set_ssl_identity(rtc::SSLIdentity* identity) { 4810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org for (TransportMap::const_iterator it = transport_proxies().begin(); 4820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org it != transport_proxies().end(); ++it) { 4830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // We know that we have a FakeTransport* 4840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 4850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org static_cast<FakeTransport*>(it->second->impl())->set_identity 4860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org (identity); 4870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 4880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 4890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 4900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org protected: 4910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org virtual Transport* CreateTransport(const std::string& content_name) { 4920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return new FakeTransport(signaling_thread(), worker_thread(), content_name); 4930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 4940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 4950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org void CompleteNegotiation() { 4960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org for (TransportMap::const_iterator it = transport_proxies().begin(); 4970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org it != transport_proxies().end(); ++it) { 4980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org it->second->CompleteNegotiation(); 4990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org it->second->ConnectChannels(); 5000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 5010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 5020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 5030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org private: 5040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org bool fail_create_channel_; 5050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}; 5060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 5070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} // namespace cricket 5080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 5090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#endif // TALK_P2P_BASE_FAKESESSION_H_ 510