| Index: webrtc/api/peerconnectionendtoend_unittest.cc
 | 
| diff --git a/webrtc/api/peerconnectionendtoend_unittest.cc b/webrtc/api/peerconnectionendtoend_unittest.cc
 | 
| index 95369b15c0823a0bbb81f6e517780711f94d2c1d..9ccf6ed8afaa7a9630002d7e9e4691520c5f1c35 100644
 | 
| --- a/webrtc/api/peerconnectionendtoend_unittest.cc
 | 
| +++ b/webrtc/api/peerconnectionendtoend_unittest.cc
 | 
| @@ -55,6 +55,9 @@ class PeerConnectionEndToEndTest
 | 
|          "caller", &worker_thread_);
 | 
|      callee_ = new rtc::RefCountedObject<PeerConnectionTestWrapper>(
 | 
|          "callee", &worker_thread_);
 | 
| +    webrtc::PeerConnectionInterface::IceServer ice_server;
 | 
| +    ice_server.uri = "stun:stun.l.google.com:19302";
 | 
| +    config_.servers.push_back(ice_server);
 | 
|  #ifdef WEBRTC_ANDROID
 | 
|      webrtc::InitializeAndroidObjects();
 | 
|  #endif
 | 
| @@ -65,8 +68,8 @@ class PeerConnectionEndToEndTest
 | 
|    }
 | 
|  
 | 
|    void CreatePcs(const MediaConstraintsInterface* pc_constraints) {
 | 
| -    EXPECT_TRUE(caller_->CreatePc(pc_constraints));
 | 
| -    EXPECT_TRUE(callee_->CreatePc(pc_constraints));
 | 
| +    EXPECT_TRUE(caller_->CreatePc(pc_constraints, config_));
 | 
| +    EXPECT_TRUE(callee_->CreatePc(pc_constraints, config_));
 | 
|      PeerConnectionTestWrapper::Connect(caller_.get(), callee_.get());
 | 
|  
 | 
|      caller_->SignalOnDataChannel.connect(
 | 
| @@ -160,6 +163,7 @@ class PeerConnectionEndToEndTest
 | 
|    rtc::scoped_refptr<PeerConnectionTestWrapper> callee_;
 | 
|    DataChannelList caller_signaled_data_channels_;
 | 
|    DataChannelList callee_signaled_data_channels_;
 | 
| +  webrtc::PeerConnectionInterface::RTCConfiguration config_;
 | 
|  };
 | 
|  
 | 
|  // Disabled for TSan v2, see
 | 
| @@ -315,6 +319,68 @@ TEST_F(PeerConnectionEndToEndTest,
 | 
|    EXPECT_EQ(1U, dc_2_observer->received_message_count());
 | 
|  }
 | 
|  
 | 
| +#ifdef HAVE_QUIC
 | 
| +// Test that QUIC data channels can be used and that messages go to the correct
 | 
| +// remote data channel when both peers want to use QUIC. It is assumed that the
 | 
| +// application has externally negotiated the data channel parameters.
 | 
| +TEST_F(PeerConnectionEndToEndTest, MessageTransferBetweenQuicDataChannels) {
 | 
| +  config_.enable_quic = true;
 | 
| +  CreatePcs();
 | 
| +
 | 
| +  webrtc::DataChannelInit init_1;
 | 
| +  init_1.id = 0;
 | 
| +  init_1.ordered = false;
 | 
| +  init_1.reliable = true;
 | 
| +
 | 
| +  webrtc::DataChannelInit init_2;
 | 
| +  init_2.id = 1;
 | 
| +  init_2.ordered = false;
 | 
| +  init_2.reliable = true;
 | 
| +
 | 
| +  rtc::scoped_refptr<DataChannelInterface> caller_dc_1(
 | 
| +      caller_->CreateDataChannel("data", init_1));
 | 
| +  ASSERT_NE(nullptr, caller_dc_1);
 | 
| +  rtc::scoped_refptr<DataChannelInterface> caller_dc_2(
 | 
| +      caller_->CreateDataChannel("data", init_2));
 | 
| +  ASSERT_NE(nullptr, caller_dc_2);
 | 
| +  rtc::scoped_refptr<DataChannelInterface> callee_dc_1(
 | 
| +      callee_->CreateDataChannel("data", init_1));
 | 
| +  ASSERT_NE(nullptr, callee_dc_1);
 | 
| +  rtc::scoped_refptr<DataChannelInterface> callee_dc_2(
 | 
| +      callee_->CreateDataChannel("data", init_2));
 | 
| +  ASSERT_NE(nullptr, callee_dc_2);
 | 
| +
 | 
| +  Negotiate();
 | 
| +  WaitForConnection();
 | 
| +  EXPECT_TRUE_WAIT(caller_dc_1->state() == webrtc::DataChannelInterface::kOpen,
 | 
| +                   kMaxWait);
 | 
| +  EXPECT_TRUE_WAIT(callee_dc_1->state() == webrtc::DataChannelInterface::kOpen,
 | 
| +                   kMaxWait);
 | 
| +  EXPECT_TRUE_WAIT(caller_dc_2->state() == webrtc::DataChannelInterface::kOpen,
 | 
| +                   kMaxWait);
 | 
| +  EXPECT_TRUE_WAIT(callee_dc_2->state() == webrtc::DataChannelInterface::kOpen,
 | 
| +                   kMaxWait);
 | 
| +
 | 
| +  rtc::scoped_ptr<webrtc::MockDataChannelObserver> dc_1_observer(
 | 
| +      new webrtc::MockDataChannelObserver(callee_dc_1.get()));
 | 
| +
 | 
| +  rtc::scoped_ptr<webrtc::MockDataChannelObserver> dc_2_observer(
 | 
| +      new webrtc::MockDataChannelObserver(callee_dc_2.get()));
 | 
| +
 | 
| +  const std::string message_1 = "hello 1";
 | 
| +  const std::string message_2 = "hello 2";
 | 
| +
 | 
| +  caller_dc_1->Send(webrtc::DataBuffer(message_1));
 | 
| +  EXPECT_EQ_WAIT(message_1, dc_1_observer->last_message(), kMaxWait);
 | 
| +
 | 
| +  caller_dc_2->Send(webrtc::DataBuffer(message_2));
 | 
| +  EXPECT_EQ_WAIT(message_2, dc_2_observer->last_message(), kMaxWait);
 | 
| +
 | 
| +  EXPECT_EQ(1U, dc_1_observer->received_message_count());
 | 
| +  EXPECT_EQ(1U, dc_2_observer->received_message_count());
 | 
| +}
 | 
| +#endif  // HAVE_QUIC
 | 
| +
 | 
|  // Verifies that a DataChannel added from an OPEN message functions after
 | 
|  // a channel has been previously closed (webrtc issue 3778).
 | 
|  // This previously failed because the new channel re-uses the ID of the closed
 | 
| 
 |