Reland "Added PeerConnectionObserver::OnRemoveTrack."

This reverts commit 6c0c55c31817ecfa32409424495eb68b31828c40.

Reason for revert:
Fixed the flake.

Original change's description:
> Revert "Added PeerConnectionObserver::OnRemoveTrack."
> 
> This reverts commit ba97ba7af917d4152f5f3363aba1c1561c6673dc.
> 
> Reason for revert: The new tests have caused several test failures on the test bots; the method FakeAudioMediaStreamTrack:GetSignalLevel, which is not supposed to be called is sometimes called anyway.
> 
> Original change's description:
> > Added PeerConnectionObserver::OnRemoveTrack.
> > 
> > This corresponds to processing the removal of a remote track step of
> > the spec, with processing the addition of a remote track already
> > covered by OnAddTrack.
> > https://w3c.github.io/webrtc-pc/#processing-remote-mediastreamtracks
> > 
> > Bug: webrtc:8260, webrtc:8315
> > Change-Id: Ica8be92369733eb3cf1397fb60385d45a9b58700
> > Reviewed-on: https://webrtc-review.googlesource.com/4722
> > Commit-Queue: Henrik Boström <hbos@webrtc.org>
> > Reviewed-by: Taylor Brandstetter <deadbeef@webrtc.org>
> > Reviewed-by: Steve Anton <steveanton@webrtc.org>
> > Cr-Commit-Position: refs/heads/master@{#20214}
> 
> TBR=steveanton@webrtc.org,deadbeef@webrtc.org,hbos@webrtc.org
> 
> Change-Id: Id2d9533e27227254769b4280a8ff10a47313e714
> No-Presubmit: true
> No-Tree-Checks: true
> No-Try: true
> Bug: webrtc:8260, webrtc:8315
> Reviewed-on: https://webrtc-review.googlesource.com/7940
> Reviewed-by: Alex Loiko <aleloi@webrtc.org>
> Commit-Queue: Alex Loiko <aleloi@webrtc.org>
> Cr-Commit-Position: refs/heads/master@{#20218}

TBR=steveanton@webrtc.org,deadbeef@webrtc.org,aleloi@webrtc.org,hbos@webrtc.org

Change-Id: Iab7500bebf98535754b102874259de43831fff6b
No-Presubmit: true
No-Tree-Checks: true
No-Try: true
Bug: webrtc:8260, webrtc:8315
Reviewed-on: https://webrtc-review.googlesource.com/8180
Commit-Queue: Henrik Boström <hbos@webrtc.org>
Reviewed-by: Henrik Boström <hbos@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#20227}
diff --git a/pc/peerconnection_rtp_unittest.cc b/pc/peerconnection_rtp_unittest.cc
new file mode 100644
index 0000000..38ba5fb
--- /dev/null
+++ b/pc/peerconnection_rtp_unittest.cc
@@ -0,0 +1,165 @@
+/*
+ *  Copyright 2017 The WebRTC project authors. All Rights Reserved.
+ *
+ *  Use of this source code is governed by a BSD-style license
+ *  that can be found in the LICENSE file in the root of the source
+ *  tree. An additional intellectual property rights grant can be found
+ *  in the file PATENTS.  All contributing project authors may
+ *  be found in the AUTHORS file in the root of the source tree.
+ */
+
+#include <memory>
+#include <vector>
+
+#include "api/jsep.h"
+#include "api/mediastreaminterface.h"
+#include "api/peerconnectioninterface.h"
+#include "pc/mediastream.h"
+#include "pc/mediastreamtrack.h"
+#include "pc/peerconnectionwrapper.h"
+#include "pc/test/fakeaudiocapturemodule.h"
+#include "pc/test/mockpeerconnectionobservers.h"
+#include "rtc_base/checks.h"
+#include "rtc_base/gunit.h"
+#include "rtc_base/ptr_util.h"
+#include "rtc_base/refcountedobject.h"
+#include "rtc_base/scoped_ref_ptr.h"
+#include "rtc_base/thread.h"
+
+// This file contains tests for RTP Media API-related behavior of
+// |webrtc::PeerConnection|, see https://w3c.github.io/webrtc-pc/#rtp-media-api.
+
+namespace {
+
+class PeerConnectionRtpTest : public testing::Test {
+ public:
+  PeerConnectionRtpTest()
+      :
+        pc_factory_(webrtc::CreatePeerConnectionFactory(
+            rtc::Thread::Current(),
+            rtc::Thread::Current(),
+            rtc::Thread::Current(),
+            FakeAudioCaptureModule::Create(),
+            nullptr,
+            nullptr)) {}
+
+  std::unique_ptr<webrtc::PeerConnectionWrapper> CreatePeerConnection() {
+    webrtc::PeerConnectionInterface::RTCConfiguration config;
+    auto observer = rtc::MakeUnique<webrtc::MockPeerConnectionObserver>();
+    auto pc = pc_factory_->CreatePeerConnection(config, nullptr, nullptr,
+                                                observer.get());
+    return std::unique_ptr<webrtc::PeerConnectionWrapper>(
+        new webrtc::PeerConnectionWrapper(pc_factory_, pc,
+                                          std::move(observer)));
+  }
+
+ protected:
+  rtc::scoped_refptr<webrtc::PeerConnectionFactoryInterface> pc_factory_;
+};
+
+TEST_F(PeerConnectionRtpTest, AddTrackWithoutStreamFiresOnAddTrack) {
+  auto caller = CreatePeerConnection();
+  auto callee = CreatePeerConnection();
+
+  rtc::scoped_refptr<webrtc::AudioTrackInterface> audio_track(
+      pc_factory_->CreateAudioTrack("audio_track", nullptr));
+  EXPECT_TRUE(caller->pc()->AddTrack(audio_track.get(), {}));
+  ASSERT_TRUE(callee->SetRemoteDescription(caller->CreateOfferAndSetAsLocal()));
+
+  ASSERT_EQ(1u, callee->observer()->add_track_events_.size());
+  // TODO(deadbeef): When no stream is handled correctly we would expect
+  // |add_track_events_[0].streams| to be empty. https://crbug.com/webrtc/7933
+  ASSERT_EQ(1u, callee->observer()->add_track_events_[0].streams.size());
+  EXPECT_TRUE(
+      callee->observer()->add_track_events_[0].streams[0]->FindAudioTrack(
+          "audio_track"));
+}
+
+TEST_F(PeerConnectionRtpTest, AddTrackWithStreamFiresOnAddTrack) {
+  auto caller = CreatePeerConnection();
+  auto callee = CreatePeerConnection();
+
+  rtc::scoped_refptr<webrtc::AudioTrackInterface> audio_track(
+      pc_factory_->CreateAudioTrack("audio_track", nullptr));
+  auto stream = webrtc::MediaStream::Create("audio_stream");
+  EXPECT_TRUE(caller->pc()->AddTrack(audio_track.get(), {stream.get()}));
+  ASSERT_TRUE(callee->SetRemoteDescription(caller->CreateOfferAndSetAsLocal()));
+
+  ASSERT_EQ(1u, callee->observer()->add_track_events_.size());
+  ASSERT_EQ(1u, callee->observer()->add_track_events_[0].streams.size());
+  EXPECT_EQ("audio_stream",
+            callee->observer()->add_track_events_[0].streams[0]->label());
+  EXPECT_TRUE(
+      callee->observer()->add_track_events_[0].streams[0]->FindAudioTrack(
+          "audio_track"));
+}
+
+TEST_F(PeerConnectionRtpTest, RemoveTrackWithoutStreamFiresOnRemoveTrack) {
+  auto caller = CreatePeerConnection();
+  auto callee = CreatePeerConnection();
+
+  rtc::scoped_refptr<webrtc::AudioTrackInterface> audio_track(
+      pc_factory_->CreateAudioTrack("audio_track", nullptr));
+  auto sender = caller->pc()->AddTrack(audio_track.get(), {});
+  ASSERT_TRUE(callee->SetRemoteDescription(caller->CreateOfferAndSetAsLocal()));
+  ASSERT_EQ(1u, callee->observer()->add_track_events_.size());
+  EXPECT_TRUE(caller->pc()->RemoveTrack(sender));
+  ASSERT_TRUE(callee->SetRemoteDescription(caller->CreateOfferAndSetAsLocal()));
+
+  ASSERT_EQ(1u, callee->observer()->add_track_events_.size());
+  EXPECT_EQ(callee->observer()->GetAddTrackReceivers(),
+            callee->observer()->remove_track_events_);
+}
+
+TEST_F(PeerConnectionRtpTest, RemoveTrackWithStreamFiresOnRemoveTrack) {
+  auto caller = CreatePeerConnection();
+  auto callee = CreatePeerConnection();
+
+  rtc::scoped_refptr<webrtc::AudioTrackInterface> audio_track(
+      pc_factory_->CreateAudioTrack("audio_track", nullptr));
+  auto stream = webrtc::MediaStream::Create("audio_stream");
+  auto sender = caller->pc()->AddTrack(audio_track.get(), {stream.get()});
+  ASSERT_TRUE(callee->SetRemoteDescription(caller->CreateOfferAndSetAsLocal()));
+  ASSERT_EQ(1u, callee->observer()->add_track_events_.size());
+  EXPECT_TRUE(caller->pc()->RemoveTrack(sender));
+  ASSERT_TRUE(callee->SetRemoteDescription(caller->CreateOfferAndSetAsLocal()));
+
+  ASSERT_EQ(1u, callee->observer()->add_track_events_.size());
+  EXPECT_EQ(callee->observer()->GetAddTrackReceivers(),
+            callee->observer()->remove_track_events_);
+}
+
+TEST_F(PeerConnectionRtpTest, RemoveTrackWithSharedStreamFiresOnRemoveTrack) {
+  auto caller = CreatePeerConnection();
+  auto callee = CreatePeerConnection();
+
+  rtc::scoped_refptr<webrtc::AudioTrackInterface> audio_track1(
+      pc_factory_->CreateAudioTrack("audio_track1", nullptr));
+  rtc::scoped_refptr<webrtc::AudioTrackInterface> audio_track2(
+      pc_factory_->CreateAudioTrack("audio_track2", nullptr));
+  auto stream = webrtc::MediaStream::Create("shared_audio_stream");
+  std::vector<webrtc::MediaStreamInterface*> streams{stream.get()};
+  auto sender1 = caller->pc()->AddTrack(audio_track1.get(), streams);
+  auto sender2 = caller->pc()->AddTrack(audio_track2.get(), streams);
+  ASSERT_TRUE(callee->SetRemoteDescription(caller->CreateOfferAndSetAsLocal()));
+
+  ASSERT_EQ(2u, callee->observer()->add_track_events_.size());
+
+  // Remove "audio_track1".
+  EXPECT_TRUE(caller->pc()->RemoveTrack(sender1));
+  ASSERT_TRUE(callee->SetRemoteDescription(caller->CreateOfferAndSetAsLocal()));
+  ASSERT_EQ(2u, callee->observer()->add_track_events_.size());
+  EXPECT_EQ(
+      std::vector<rtc::scoped_refptr<webrtc::RtpReceiverInterface>>{
+          callee->observer()->add_track_events_[0].receiver},
+      callee->observer()->remove_track_events_);
+
+  // Remove "audio_track2".
+  EXPECT_TRUE(caller->pc()->RemoveTrack(sender2));
+  ASSERT_TRUE(callee->SetRemoteDescription(caller->CreateOfferAndSetAsLocal()));
+  ASSERT_EQ(2u, callee->observer()->add_track_events_.size());
+  EXPECT_EQ(callee->observer()->GetAddTrackReceivers(),
+            callee->observer()->remove_track_events_);
+}
+
+}  // namespace