Index: webrtc/sdk/android/instrumentationtests/src/org/webrtc/PeerConnectionTest.java |
diff --git a/webrtc/sdk/android/instrumentationtests/src/org/webrtc/PeerConnectionTest.java b/webrtc/sdk/android/instrumentationtests/src/org/webrtc/PeerConnectionTest.java |
index 699c7de20579b19951e1c5189bb35e46579c32cb..62190640a31fa58c7e59d04219a1d59fb5d637f9 100644 |
--- a/webrtc/sdk/android/instrumentationtests/src/org/webrtc/PeerConnectionTest.java |
+++ b/webrtc/sdk/android/instrumentationtests/src/org/webrtc/PeerConnectionTest.java |
@@ -64,6 +64,7 @@ public class PeerConnectionTest { |
private int expectedHeight = 0; |
private int expectedFramesDelivered = 0; |
private int expectedTracksAdded = 0; |
+ private int expectedTracksRemoved = 0; |
private LinkedList<SignalingState> expectedSignalingChanges = new LinkedList<SignalingState>(); |
private LinkedList<IceConnectionState> expectedIceConnectionChanges = |
new LinkedList<IceConnectionState>(); |
@@ -72,8 +73,8 @@ public class PeerConnectionTest { |
private LinkedList<String> expectedAddStreamLabels = new LinkedList<String>(); |
private LinkedList<String> expectedRemoveStreamLabels = new LinkedList<String>(); |
private final LinkedList<IceCandidate> gotIceCandidates = new LinkedList<IceCandidate>(); |
- private Map<MediaStream, WeakReference<VideoRenderer>> renderers = |
- new IdentityHashMap<MediaStream, WeakReference<VideoRenderer>>(); |
+ private Map<VideoTrack, WeakReference<VideoRenderer>> renderers = |
+ new IdentityHashMap<VideoTrack, WeakReference<VideoRenderer>>(); |
private DataChannel dataChannel; |
private LinkedList<DataChannel.Buffer> expectedBuffers = new LinkedList<DataChannel.Buffer>(); |
private LinkedList<DataChannel.State> expectedStateChanges = |
@@ -198,9 +199,6 @@ public class PeerConnectionTest { |
assertTrue(stream.audioTracks.get(0).id().endsWith("AudioTrack")); |
assertEquals("video", stream.videoTracks.get(0).kind()); |
assertEquals("audio", stream.audioTracks.get(0).kind()); |
- VideoRenderer renderer = createVideoRenderer(this); |
- stream.videoTracks.get(0).addRenderer(renderer); |
- assertNull(renderers.put(stream, new WeakReference<VideoRenderer>(renderer))); |
gotRemoteStreams.add(stream); |
} |
@@ -211,11 +209,7 @@ public class PeerConnectionTest { |
@Override |
public synchronized void onRemoveStream(MediaStream stream) { |
assertEquals(expectedRemoveStreamLabels.removeFirst(), stream.label()); |
- WeakReference<VideoRenderer> renderer = renderers.remove(stream); |
- assertNotNull(renderer); |
- assertNotNull(renderer.get()); |
- assertEquals(1, stream.videoTracks.size()); |
- stream.videoTracks.get(0).removeRenderer(renderer.get()); |
+ assertEquals(0, stream.videoTracks.size()); |
gotRemoteStreams.remove(stream); |
} |
@@ -243,9 +237,31 @@ public class PeerConnectionTest { |
this.expectedTracksAdded = expectedTracksAdded; |
} |
+ public synchronized void expectRemoveTrack(int expectedTracksRemove) { |
+ this.expectedTracksRemoved = expectedTracksRemove; |
+ } |
+ |
@Override |
public synchronized void onAddTrack(RtpReceiver receiver, MediaStream[] mediaStreams) { |
expectedTracksAdded--; |
+ if (receiver.track() instanceof VideoTrack) { |
+ VideoTrack vt = (VideoTrack) receiver.track(); |
+ VideoRenderer renderer = createVideoRenderer(this); |
+ vt.addRenderer(renderer); |
+ assertNull(renderers.put(vt, new WeakReference<VideoRenderer>(renderer))); |
+ } |
+ } |
+ |
+ @Override |
+ public void onRemoveTrack(RtpReceiver receiver, MediaStream[] mediaStreams) { |
+ expectedTracksRemoved--; |
+ if (receiver.track() instanceof VideoTrack) { |
+ VideoTrack vt = (VideoTrack) receiver.track(); |
+ WeakReference<VideoRenderer> renderer = renderers.remove(vt); |
+ assertNotNull(renderer); |
+ assertNotNull(renderer.get()); |
+ vt.removeRenderer(renderer.get()); |
+ } |
} |
public synchronized void expectMessage(ByteBuffer expectedBuffer, boolean expectedBinary) { |
@@ -379,6 +395,9 @@ public class PeerConnectionTest { |
if (expectedTracksAdded != 0) { |
stillWaitingForExpectations.add("expectedAddedTrack: " + expectedTracksAdded); |
} |
+ if (expectedTracksRemoved != 0) { |
+ stillWaitingForExpectations.add("expectedTracksRemoved: " + expectedTracksRemoved); |
+ } |
return stillWaitingForExpectations; |
} |
@@ -1122,35 +1141,40 @@ public class PeerConnectionTest { |
VideoTrack offererVideoTrack = oLMS.get().videoTracks.get(0); |
// Note that when we call removeTrack, we regain responsibility for |
// disposing of the track. |
+ offeringExpectations.expectRenegotiationNeeded(); |
+ answeringExpectations.expectRemoveTrack(1); |
oLMS.get().removeTrack(offererVideoTrack); |
negotiate(offeringPC, offeringExpectations, answeringPC, answeringExpectations); |
// Make sure the track was really removed. |
- // TODO(deadbeef): Currently the expectation is that the video track's |
- // state will be set to "ended". However, in the future, it's likely that |
- // the video track will be completely removed from the remote stream |
- // (as it is on the C++ level). |
MediaStream aRMS = answeringExpectations.gotRemoteStreams.iterator().next(); |
- assertEquals(aRMS.videoTracks.get(0).state(), MediaStreamTrack.State.ENDED); |
+ assertEquals(0, aRMS.videoTracks.size()); |
// Add the video track to test if the answeringPC will create a new track |
// for the updated remote description. |
+ offeringExpectations.expectRenegotiationNeeded(); |
oLMS.get().addTrack(offererVideoTrack); |
// The answeringPC sets the updated remote description with a track added. |
// So the onAddTrack callback is expected to be called once. |
answeringExpectations.expectAddTrack(1); |
offeringExpectations.expectAddTrack(0); |
negotiate(offeringPC, offeringExpectations, answeringPC, answeringExpectations); |
+ assertEquals(1, aRMS.videoTracks.size()); |
// Finally, remove both the audio and video tracks, which should completely |
// remove the remote stream. This used to trigger an assert. |
// See: https://bugs.chromium.org/p/webrtc/issues/detail?id=5128 |
+ offeringExpectations.expectRenegotiationNeeded(); |
oLMS.get().removeTrack(offererVideoTrack); |
AudioTrack offererAudioTrack = oLMS.get().audioTracks.get(0); |
+ offeringExpectations.expectRenegotiationNeeded(); |
oLMS.get().removeTrack(offererAudioTrack); |
answeringExpectations.expectRemoveStream("offeredMediaStream"); |
+ answeringExpectations.expectRemoveTrack(2); |
negotiate(offeringPC, offeringExpectations, answeringPC, answeringExpectations); |
+ assertEquals(0, aRMS.videoTracks.size()); |
+ assertEquals(0, aRMS.audioTracks.size()); |
// Make sure the stream was really removed. |
assertTrue(answeringExpectations.gotRemoteStreams.isEmpty()); |