| Index: talk/media/webrtc/webrtcvoiceengine_unittest.cc
 | 
| diff --git a/talk/media/webrtc/webrtcvoiceengine_unittest.cc b/talk/media/webrtc/webrtcvoiceengine_unittest.cc
 | 
| index 0e2781b94719e5f2a5e11cb973889b51e0671f33..b123a8430b154e527134bce5af31ad70b7f81f3c 100644
 | 
| --- a/talk/media/webrtc/webrtcvoiceengine_unittest.cc
 | 
| +++ b/talk/media/webrtc/webrtcvoiceengine_unittest.cc
 | 
| @@ -124,12 +124,10 @@ class WebRtcVoiceEngineTestFake : public testing::Test {
 | 
|    void SetupForMultiSendStream() {
 | 
|      EXPECT_TRUE(SetupEngineWithSendStream());
 | 
|      // Remove stream added in Setup.
 | 
| -    int default_channel_num = voe_.GetLastChannel();
 | 
| -    EXPECT_EQ(kSsrc1, voe_.GetLocalSSRC(default_channel_num));
 | 
| +    EXPECT_TRUE(call_.GetAudioSendStream(kSsrc1));
 | 
|      EXPECT_TRUE(channel_->RemoveSendStream(kSsrc1));
 | 
| -
 | 
|      // Verify the channel does not exist.
 | 
| -    EXPECT_EQ(-1, voe_.GetChannelFromLocalSsrc(kSsrc1));
 | 
| +    EXPECT_FALSE(call_.GetAudioSendStream(kSsrc1));
 | 
|    }
 | 
|    void DeliverPacket(const void* data, int len) {
 | 
|      rtc::Buffer packet(reinterpret_cast<const uint8_t*>(data), len);
 | 
| @@ -140,6 +138,12 @@ class WebRtcVoiceEngineTestFake : public testing::Test {
 | 
|      engine_.Terminate();
 | 
|    }
 | 
|  
 | 
| +  const webrtc::AudioSendStream::Config& GetSendStreamConfig(uint32_t ssrc) {
 | 
| +    const auto* send_stream = call_.GetAudioSendStream(ssrc);
 | 
| +    EXPECT_TRUE(send_stream);
 | 
| +    return send_stream->GetConfig();
 | 
| +  }
 | 
| +
 | 
|    void TestInsertDtmf(uint32_t ssrc, bool caller) {
 | 
|      EXPECT_TRUE(engine_.Init(rtc::Thread::Current()));
 | 
|      channel_ = engine_.CreateChannel(&call_, cricket::AudioOptions());
 | 
| @@ -212,41 +216,44 @@ class WebRtcVoiceEngineTestFake : public testing::Test {
 | 
|  
 | 
|    void TestSetSendRtpHeaderExtensions(const std::string& ext) {
 | 
|      EXPECT_TRUE(SetupEngineWithSendStream());
 | 
| -    int channel_num = voe_.GetLastChannel();
 | 
|  
 | 
|      // Ensure extensions are off by default.
 | 
| -    EXPECT_EQ(-1, voe_.GetSendRtpExtensionId(channel_num, ext));
 | 
| +    EXPECT_EQ(0u, GetSendStreamConfig(kSsrc1).rtp.extensions.size());
 | 
|  
 | 
|      // Ensure unknown extensions won't cause an error.
 | 
|      send_parameters_.extensions.push_back(cricket::RtpHeaderExtension(
 | 
|          "urn:ietf:params:unknownextention", 1));
 | 
|      EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
 | 
| -    EXPECT_EQ(-1, voe_.GetSendRtpExtensionId(channel_num, ext));
 | 
| +    EXPECT_EQ(0u, GetSendStreamConfig(kSsrc1).rtp.extensions.size());
 | 
|  
 | 
|      // Ensure extensions stay off with an empty list of headers.
 | 
|      send_parameters_.extensions.clear();
 | 
|      EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
 | 
| -    EXPECT_EQ(-1, voe_.GetSendRtpExtensionId(channel_num, ext));
 | 
| +    EXPECT_EQ(0u, GetSendStreamConfig(kSsrc1).rtp.extensions.size());
 | 
|  
 | 
|      // Ensure extension is set properly.
 | 
|      const int id = 1;
 | 
|      send_parameters_.extensions.push_back(cricket::RtpHeaderExtension(ext, id));
 | 
|      EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
 | 
| -    EXPECT_EQ(id, voe_.GetSendRtpExtensionId(channel_num, ext));
 | 
| +    EXPECT_EQ(1u, GetSendStreamConfig(kSsrc1).rtp.extensions.size());
 | 
| +    EXPECT_EQ(ext, GetSendStreamConfig(kSsrc1).rtp.extensions[0].name);
 | 
| +    EXPECT_EQ(id, GetSendStreamConfig(kSsrc1).rtp.extensions[0].id);
 | 
|  
 | 
|      // Ensure extension is set properly on new channels.
 | 
|      EXPECT_TRUE(channel_->AddSendStream(
 | 
|          cricket::StreamParams::CreateLegacy(kSsrc2)));
 | 
| -    int new_channel_num = voe_.GetLastChannel();
 | 
| -    EXPECT_NE(channel_num, new_channel_num);
 | 
| -    EXPECT_EQ(id, voe_.GetSendRtpExtensionId(new_channel_num, ext));
 | 
| +    EXPECT_NE(call_.GetAudioSendStream(kSsrc1),
 | 
| +              call_.GetAudioSendStream(kSsrc2));
 | 
| +    EXPECT_EQ(1u, GetSendStreamConfig(kSsrc2).rtp.extensions.size());
 | 
| +    EXPECT_EQ(ext, GetSendStreamConfig(kSsrc2).rtp.extensions[0].name);
 | 
| +    EXPECT_EQ(id, GetSendStreamConfig(kSsrc2).rtp.extensions[0].id);
 | 
|  
 | 
|      // Ensure all extensions go back off with an empty list.
 | 
|      send_parameters_.codecs.push_back(kPcmuCodec);
 | 
|      send_parameters_.extensions.clear();
 | 
|      EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
 | 
| -    EXPECT_EQ(-1, voe_.GetSendRtpExtensionId(channel_num, ext));
 | 
| -    EXPECT_EQ(-1, voe_.GetSendRtpExtensionId(new_channel_num, ext));
 | 
| +    EXPECT_EQ(0u, GetSendStreamConfig(kSsrc1).rtp.extensions.size());
 | 
| +    EXPECT_EQ(0u, GetSendStreamConfig(kSsrc2).rtp.extensions.size());
 | 
|    }
 | 
|  
 | 
|    void TestSetRecvRtpHeaderExtensions(const std::string& ext) {
 | 
| @@ -1976,21 +1983,16 @@ TEST_F(WebRtcVoiceEngineTestFake, CreateAndDeleteMultipleSendStreams) {
 | 
|    for (uint32_t ssrc : kSsrcs4) {
 | 
|      EXPECT_TRUE(channel_->AddSendStream(
 | 
|          cricket::StreamParams::CreateLegacy(ssrc)));
 | 
| -    EXPECT_NE(nullptr, call_.GetAudioSendStream(ssrc));
 | 
| -
 | 
|      // Verify that we are in a sending state for all the created streams.
 | 
| -    int channel_num = voe_.GetChannelFromLocalSsrc(ssrc);
 | 
| -    EXPECT_TRUE(voe_.GetSend(channel_num));
 | 
| +    EXPECT_TRUE(voe_.GetSend(GetSendStreamConfig(ssrc).voe_channel_id));
 | 
|    }
 | 
|    EXPECT_EQ(arraysize(kSsrcs4), call_.GetAudioSendStreams().size());
 | 
|  
 | 
|    // Delete the send streams.
 | 
|    for (uint32_t ssrc : kSsrcs4) {
 | 
|      EXPECT_TRUE(channel_->RemoveSendStream(ssrc));
 | 
| -    EXPECT_EQ(nullptr, call_.GetAudioSendStream(ssrc));
 | 
| -    // Stream should already be deleted.
 | 
| +    EXPECT_FALSE(call_.GetAudioSendStream(ssrc));
 | 
|      EXPECT_FALSE(channel_->RemoveSendStream(ssrc));
 | 
| -    EXPECT_EQ(-1, voe_.GetChannelFromLocalSsrc(ssrc));
 | 
|    }
 | 
|    EXPECT_EQ(0u, call_.GetAudioSendStreams().size());
 | 
|  }
 | 
| @@ -2015,7 +2017,7 @@ TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsWithMultipleSendStreams) {
 | 
|    // Verify ISAC and VAD are corrected configured on all send channels.
 | 
|    webrtc::CodecInst gcodec;
 | 
|    for (uint32_t ssrc : kSsrcs4) {
 | 
| -    int channel_num = voe_.GetChannelFromLocalSsrc(ssrc);
 | 
| +    int channel_num = GetSendStreamConfig(ssrc).voe_channel_id;
 | 
|      EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
 | 
|      EXPECT_STREQ("ISAC", gcodec.plname);
 | 
|      EXPECT_TRUE(voe_.GetVAD(channel_num));
 | 
| @@ -2026,7 +2028,7 @@ TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsWithMultipleSendStreams) {
 | 
|    parameters.codecs[0] = kPcmuCodec;
 | 
|    EXPECT_TRUE(channel_->SetSendParameters(parameters));
 | 
|    for (uint32_t ssrc : kSsrcs4) {
 | 
| -    int channel_num = voe_.GetChannelFromLocalSsrc(ssrc);
 | 
| +    int channel_num = GetSendStreamConfig(ssrc).voe_channel_id;
 | 
|      EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
 | 
|      EXPECT_STREQ("PCMU", gcodec.plname);
 | 
|      EXPECT_FALSE(voe_.GetVAD(channel_num));
 | 
| @@ -2049,7 +2051,7 @@ TEST_F(WebRtcVoiceEngineTestFake, SetSendWithMultipleSendStreams) {
 | 
|    EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
 | 
|    for (uint32_t ssrc : kSsrcs4) {
 | 
|      // Verify that we are in a sending state for all the send streams.
 | 
| -    int channel_num = voe_.GetChannelFromLocalSsrc(ssrc);
 | 
| +    int channel_num = GetSendStreamConfig(ssrc).voe_channel_id;
 | 
|      EXPECT_TRUE(voe_.GetSend(channel_num));
 | 
|    }
 | 
|  
 | 
| @@ -2057,7 +2059,7 @@ TEST_F(WebRtcVoiceEngineTestFake, SetSendWithMultipleSendStreams) {
 | 
|    EXPECT_TRUE(channel_->SetSend(cricket::SEND_NOTHING));
 | 
|    for (uint32_t ssrc : kSsrcs4) {
 | 
|      // Verify that we are in a stop state for all the send streams.
 | 
| -    int channel_num = voe_.GetChannelFromLocalSsrc(ssrc);
 | 
| +    int channel_num = GetSendStreamConfig(ssrc).voe_channel_id;
 | 
|      EXPECT_FALSE(voe_.GetSend(channel_num));
 | 
|    }
 | 
|  }
 | 
| @@ -2338,7 +2340,7 @@ TEST_F(WebRtcVoiceEngineTestFake, TraceFilterViaTraceOptions) {
 | 
|  // SSRC is set in SetupEngine by calling AddSendStream.
 | 
|  TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrc) {
 | 
|    EXPECT_TRUE(SetupEngineWithSendStream());
 | 
| -  EXPECT_EQ(kSsrc1, voe_.GetLocalSSRC(voe_.GetLastChannel()));
 | 
| +  EXPECT_TRUE(call_.GetAudioSendStream(kSsrc1));
 | 
|  }
 | 
|  
 | 
|  TEST_F(WebRtcVoiceEngineTestFake, GetStats) {
 | 
| @@ -2399,7 +2401,7 @@ TEST_F(WebRtcVoiceEngineTestFake, GetStats) {
 | 
|  // SSRC is set in SetupEngine by calling AddSendStream.
 | 
|  TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrcWithMultipleStreams) {
 | 
|    EXPECT_TRUE(SetupEngineWithSendStream());
 | 
| -  EXPECT_EQ(kSsrc1, voe_.GetLocalSSRC(voe_.GetLastChannel()));
 | 
| +  EXPECT_TRUE(call_.GetAudioSendStream(kSsrc1));
 | 
|    EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
 | 
|    EXPECT_EQ(kSsrc1, voe_.GetLocalSSRC(voe_.GetLastChannel()));
 | 
|  }
 | 
| @@ -2414,9 +2416,8 @@ TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrcAfterCreatingReceiveChannel) {
 | 
|    int receive_channel_num = voe_.GetLastChannel();
 | 
|    EXPECT_TRUE(channel_->AddSendStream(
 | 
|        cricket::StreamParams::CreateLegacy(1234)));
 | 
| -  int send_channel_num = voe_.GetLastChannel();
 | 
|  
 | 
| -  EXPECT_EQ(1234U, voe_.GetLocalSSRC(send_channel_num));
 | 
| +  EXPECT_TRUE(call_.GetAudioSendStream(1234));
 | 
|    EXPECT_EQ(1234U, voe_.GetLocalSSRC(receive_channel_num));
 | 
|  }
 | 
|  
 | 
| @@ -3053,6 +3054,8 @@ TEST_F(WebRtcVoiceEngineTestFake, ConfigureCombinedBweForNewRecvStreams) {
 | 
|    EXPECT_EQ(arraysize(kSsrcs), call_.GetAudioReceiveStreams().size());
 | 
|  }
 | 
|  
 | 
| +// TODO(solenberg): Remove, once recv streams are configured through Call.
 | 
| +//                  (This is then covered by TestSetRecvRtpHeaderExtensions.)
 | 
|  TEST_F(WebRtcVoiceEngineTestFake, ConfiguresAudioReceiveStreamRtpExtensions) {
 | 
|    // Test that setting the header extensions results in the expected state
 | 
|    // changes on an associated Call.
 | 
| 
 |