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