Test basic behavior of RTCPeerConnection.add/removeTrack()

On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".


Test bad addTrack() arguments
PASS pc.addTrack() threw exception TypeError: Not enough arguments.
PASS pc.addTrack(null) threw exception TypeError: Argument 1 ('track') to RTCPeerConnection.addTrack must be an instance of MediaStreamTrack.
PASS pc.addTrack({}) threw exception TypeError: Argument 1 ('track') to RTCPeerConnection.addTrack must be an instance of MediaStreamTrack.
PASS pc.addTrack(track, null) threw exception TypeError: Argument 2 ('streams') to RTCPeerConnection.addTrack must be an instance of MediaStream.
PASS pc.addTrack(track, {}) threw exception TypeError: Argument 2 ('streams') to RTCPeerConnection.addTrack must be an instance of MediaStream.
PASS pc.addTrack(track, stream, null) threw exception TypeError: Argument 3 ('streams') to RTCPeerConnection.addTrack must be an instance of MediaStream.

Test bad removeTrack() arguments
PASS pc.removeTrack() threw exception TypeError: Not enough arguments.
PASS pc.removeTrack(null) threw exception TypeError: Argument 1 ('sender') to RTCPeerConnection.removeTrack must be an instance of RTCRtpSender.
PASS pc.removeTrack({}) threw exception TypeError: Argument 1 ('sender') to RTCPeerConnection.removeTrack must be an instance of RTCRtpSender.

PASS pc.getSenders().length is 0
PASS sender = pc.addTrack(track, stream) did not throw exception.
PASS sender is an instance of RTCRtpSender
PASS sender.track is track
PASS pc.getSenders().length is 1
PASS pc.getSenders()[0] is sender
PASS pc.getReceivers().length is 1
PASS receiver.track is an instance of MediaStreamTrack
PASS receiver.track.muted is true
PASS receiver.track.kind is sender.track.kind
PASS pc.getTransceivers().length is 1
PASS transceiver.mid is null
PASS transceiver.sender is sender
PASS transceiver.receiver is receiver
PASS transceiver.stopped is false
Try to add same track again
PASS sender = pc.addTrack(track, stream) threw exception InvalidAccessError (DOM Exception 15): The object does not support the operation or argument..
PASS sender2 = pc.addTrack(track2, stream, stream2) did not throw exception.
PASS pc.getSenders().length is 2
PASS pc.getSenders()[0] is sender
PASS pc.getSenders()[1] is sender2
PASS pc.removeTrack(sender) did not throw exception.
Sender is still in getSenders() list
PASS pc.getSenders().length is 2
PASS senderFromPc2 = pc2.addTrack(track, stream) did not throw exception.
removeTrack() with 'foreign' sender must be ignored (not throw)
PASS pc.removeTrack(senderFromPc2) did not throw exception.
PASS pc.addTrack(null); threw exception TypeError: Argument 1 ('track') to RTCPeerConnection.addTrack must be an instance of MediaStreamTrack.
PASS pc.addTrack(undefined); threw exception TypeError: Argument 1 ('track') to RTCPeerConnection.addTrack must be an instance of MediaStreamTrack.
PASS pc.removeTrack(null); threw exception TypeError: Argument 1 ('sender') to RTCPeerConnection.removeTrack must be an instance of RTCRtpSender.
PASS pc.removeTrack(undefined); threw exception TypeError: Argument 1 ('sender') to RTCPeerConnection.removeTrack must be an instance of RTCRtpSender.
PASS successfullyParsed is true

TEST COMPLETE

