webrtc-adapter
Version:
A shim to insulate apps from WebRTC spec changes and browser prefix differences
112 lines (100 loc) • 3.42 kB
JavaScript
/*
* Copyright (c) 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.
*/
/* eslint-env node */
;
describe('removeTrack', () => {
let pc;
beforeEach(() => {
pc = new RTCPeerConnection();
});
afterEach(() => {
if (pc.signalingState !== 'closed') {
pc.close();
}
});
describe('throws an exception', () => {
it('if the sender does not belong to the peerconnection', () => {
return navigator.mediaDevices.getUserMedia({audio: true})
.then(stream => {
const pc2 = new RTCPeerConnection();
const sender = pc2.addTrack(stream.getTracks()[0], stream);
const invalidSender = () => {
pc.removeTrack(sender);
};
expect(invalidSender).to.throw(/not created/)
.that.has.property('name').that.equals('InvalidAccessError');
pc2.close();
});
});
it('if the peerconnection has been closed already', () => {
return navigator.mediaDevices.getUserMedia({audio: true})
.then(stream => {
const sender = pc.addTrack(stream.getTracks()[0], stream);
pc.close();
const afterClose = () => {
pc.removeTrack(sender);
};
expect(afterClose).to.throw(/closed/)
.that.has.property('name').that.equals('InvalidStateError');
});
});
});
it('allows removeTrack twice', () => {
return navigator.mediaDevices.getUserMedia({audio: true})
.then(stream => {
const sender = pc.addTrack(stream.getTracks()[0], stream);
pc.removeTrack(sender);
const again = () => {
pc.removeTrack(sender);
};
expect(again).not.to.throw();
});
});
['addStream', 'addTrack'].forEach(variant => {
describe('after ' + variant + ' for an audio/video track', () => {
beforeEach(() => {
return navigator.mediaDevices.getUserMedia({audio: true, video: true})
.then(stream => {
if (variant === 'addStream') {
pc.addStream(stream);
} else {
stream.getTracks().forEach(track => {
pc.addTrack(track, stream);
});
}
});
});
describe('after removing a single track', () => {
it('only a single sender remains', () => {
const senders = pc.getSenders();
expect(pc.getSenders()).to.have.length(2);
pc.removeTrack(senders[0]);
expect(pc.getSenders()).to.have.length(1);
});
it('the local stream remains untouched', () => {
const senders = pc.getSenders();
pc.removeTrack(senders[0]);
expect(pc.getLocalStreams()).to.have.length(1);
expect(pc.getLocalStreams()[0].getTracks()).to.have.length(2);
});
});
describe('after removing all tracks', () => {
it('no senders remain', () => {
const senders = pc.getSenders();
senders.forEach(sender => pc.removeTrack(sender));
expect(pc.getSenders()).to.have.length(0);
});
it('no local streams remain', () => {
const senders = pc.getSenders();
senders.forEach(sender => pc.removeTrack(sender));
expect(pc.getLocalStreams()).to.have.length(0);
});
});
});
});
});