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