123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329 |
- import { $iq } from 'strophe.js';
-
- import FeatureFlags from '../flags/FeatureFlags';
-
- import SDP from './SDP';
- import { SDPDiffer } from './SDPDiffer';
- import SampleSdpStrings from './SampleSdpStrings';
-
- /* eslint-disable max-len*/
-
- describe('SDPDiffer', () => {
- beforeEach(() => {
- FeatureFlags.init({ });
- });
- describe('toJingle', () => {
- it('should include source names in added/removed sources', () => {
- FeatureFlags.init({ });
-
- const testSdpOld = [
- 'v=0\r\n',
- 'o=thisisadapterortc 2719486166053431 0 IN IP4 127.0.0.1\r\n',
- 's=-\r\n',
- 't=0 0\r\n',
- 'a=group:BUNDLE audio video\r\n',
- 'm=audio 9 UDP/TLS/RTP/SAVPF 111 126\r\n',
- 'a=mid:audio\r\n',
- 'a=ssrc:2002 msid:26D16D51-503A-420B-8274-3DD1174E498F 8205D1FC-50B4-407C-87D5-9C45F1B779F0\r\n',
- 'a=ssrc:2002 cname:juejgy8a01\r\n',
- 'a=ssrc:2002 name:a8f7g30-a0\r\n',
- 'm=video 9 UDP/TLS/RTP/SAVPF 107 100 99 96\r\n',
- 'a=mid:video\r\n'
- ].join('');
- const testSdpNew = [
- 'v=0\r\n',
- 'o=thisisadapterortc 2719486166053431 0 IN IP4 127.0.0.1\r\n',
- 's=-\r\n',
- 't=0 0\r\n',
- 'a=group:BUNDLE audio video\r\n',
- 'm=audio 9 UDP/TLS/RTP/SAVPF 111 126\r\n',
- 'a=mid:audio\r\n',
- 'm=video 9 UDP/TLS/RTP/SAVPF 107 100 99 96\r\n',
- 'a=mid:video\r\n',
- 'a=ssrc:4004 msid:7C0035E5-2DA1-4AEA-804A-9E75BF9B3768 225E9CDA-0384-4C92-92DD-E74C1153EC68\r\n',
- 'a=ssrc:4005 msid:7C0035E5-2DA1-4AEA-804A-9E75BF9B3768 225E9CDA-0384-4C92-92DD-E74C1153EC68\r\n',
- 'a=ssrc:4004 cname:juejgy8a01\r\n',
- 'a=ssrc:4005 cname:juejgy8a01\r\n',
- 'a=ssrc:4004 name:a8f7g30-v0\r\n',
- 'a=ssrc:4005 name:a8f7g30-v0\r\n',
- 'a=ssrc-group:FID 4004 4005\r\n'
- ].join('');
- const newToOldDiff = new SDPDiffer(new SDP(testSdpNew), new SDP(testSdpOld));
- const sourceRemoveIq = $iq({})
- .c('jingle', { action: 'source-remove' });
-
- newToOldDiff.toJingle(sourceRemoveIq);
-
- const removedAudioSources = sourceRemoveIq.nodeTree.querySelectorAll('description[media=\'audio\']>source');
-
- expect(removedAudioSources[0].getAttribute('name')).toBe('a8f7g30-a0');
-
- const oldToNewDiff = new SDPDiffer(new SDP(testSdpOld), new SDP(testSdpNew));
- const sourceAddIq = $iq({})
- .c('jingle', { action: 'source-add' });
-
- oldToNewDiff.toJingle(sourceAddIq);
-
- const addedVideoSources = sourceAddIq.nodeTree.querySelectorAll('description[media=\'video\']>source');
- const addedVideoSourceGroups = sourceAddIq.nodeTree.querySelectorAll('description[media=\'video\']>ssrc-group');
-
- expect(addedVideoSources.length).toBe(2);
- expect(addedVideoSources[0].getAttribute('name')).toBe('a8f7g30-v0');
- expect(addedVideoSources[1].getAttribute('name')).toBe('a8f7g30-v0');
- expect(addedVideoSourceGroups.length).toBe(1);
- });
-
- it('should send source-remove/source-add when ssrc changes', () => {
- FeatureFlags.init({ });
-
- const testSdpOld = [
- 'v=0\r\n',
- 'o=thisisadapterortc 2719486166053431 0 IN IP4 127.0.0.1\r\n',
- 's=-\r\n',
- 't=0 0\r\n',
- 'a=group:BUNDLE audio video\r\n',
- 'm=audio 9 UDP/TLS/RTP/SAVPF 111 126\r\n',
- 'a=mid:audio\r\n',
- 'a=ssrc:2002 msid:26D16D51-503A-420B-8274-3DD1174E498F 8205D1FC-50B4-407C-87D5-9C45F1B779F0\r\n',
- 'a=ssrc:2002 cname:juejgy8a01\r\n',
- 'a=ssrc:2002 name:a8f7g30-a0\r\n',
- 'm=video 9 UDP/TLS/RTP/SAVPF 107 100 99 96\r\n',
- 'a=mid:video\r\n',
- 'a=ssrc:4004 msid:7C0035E5-2DA1-4AEA-804A-9E75BF9B3768 225E9CDA-0384-4C92-92DD-E74C1153EC68\r\n',
- 'a=ssrc:4005 msid:7C0035E5-2DA1-4AEA-804A-9E75BF9B3768 225E9CDA-0384-4C92-92DD-E74C1153EC68\r\n',
- 'a=ssrc:4004 cname:juejgy8a01\r\n',
- 'a=ssrc:4005 cname:juejgy8a01\r\n',
- 'a=ssrc:4004 name:a8f7g30-v0\r\n',
- 'a=ssrc:4005 name:a8f7g30-v0\r\n',
- 'a=ssrc-group:FID 4004 4005\r\n'
- ].join('');
- const testSdpNew = [
- 'v=0\r\n',
- 'o=thisisadapterortc 2719486166053431 0 IN IP4 127.0.0.1\r\n',
- 's=-\r\n',
- 't=0 0\r\n',
- 'a=group:BUNDLE audio video\r\n',
- 'm=audio 9 UDP/TLS/RTP/SAVPF 111 126\r\n',
- 'a=mid:audio\r\n',
- 'a=ssrc:2003 msid:26D16D51-503A-420B-8274-3DD1174E498F 8205D1FC-50B4-407C-87D5-9C45F1B779F0\r\n',
- 'a=ssrc:2003 cname:juejgy8a01\r\n',
- 'a=ssrc:2003 name:a8f7g30-a0\r\n',
- 'm=video 9 UDP/TLS/RTP/SAVPF 107 100 99 96\r\n',
- 'a=mid:video\r\n',
- 'a=ssrc:4004 msid:7C0035E5-2DA1-4AEA-804A-9E75BF9B3768 225E9CDA-0384-4C92-92DD-E74C1153EC68\r\n',
- 'a=ssrc:4005 msid:7C0035E5-2DA1-4AEA-804A-9E75BF9B3768 225E9CDA-0384-4C92-92DD-E74C1153EC68\r\n',
- 'a=ssrc:4004 cname:juejgy8a01\r\n',
- 'a=ssrc:4005 cname:juejgy8a01\r\n',
- 'a=ssrc:4004 name:a8f7g30-v0\r\n',
- 'a=ssrc:4005 name:a8f7g30-v0\r\n',
- 'a=ssrc-group:FID 4004 4005\r\n'
- ].join('');
- const newToOldDiff = new SDPDiffer(new SDP(testSdpNew), new SDP(testSdpOld));
- const sourceRemoveIq = $iq({})
- .c('jingle', { action: 'source-remove' });
-
- newToOldDiff.toJingle(sourceRemoveIq);
-
- const removedAudioSources = sourceRemoveIq.nodeTree.querySelectorAll('description[media=\'audio\']>source');
- const removedVideoSources = sourceRemoveIq.nodeTree.querySelectorAll('description[media=\'video\']>source');
-
- expect(removedAudioSources.length).toBe(1);
- expect(removedAudioSources[0].getAttribute('name')).toBe('a8f7g30-a0');
- expect(removedAudioSources[0].getAttribute('ssrc')).toBe('2002');
- expect(removedVideoSources.length).toBe(0);
-
- const oldToNewDiff = new SDPDiffer(new SDP(testSdpOld), new SDP(testSdpNew));
- const sourceAddIq = $iq({})
- .c('jingle', { action: 'source-add' });
-
- oldToNewDiff.toJingle(sourceAddIq);
-
- const addedAudioSources = sourceAddIq.nodeTree.querySelectorAll('description[media=\'audio\']>source');
- const addedVideoSources = sourceAddIq.nodeTree.querySelectorAll('description[media=\'video\']>source');
-
- expect(addedAudioSources.length).toBe(1);
- expect(addedAudioSources[0].getAttribute('name')).toBe('a8f7g30-a0');
- expect(addedAudioSources[0].getAttribute('ssrc')).toBe('2003');
- expect(addedVideoSources.length).toBe(0);
- });
-
- it('should not send source-remove/source-add when nothing changes', () => {
- FeatureFlags.init({ });
-
- const testSdpOld = [
- 'v=0\r\n',
- 'o=thisisadapterortc 2719486166053431 0 IN IP4 127.0.0.1\r\n',
- 's=-\r\n',
- 't=0 0\r\n',
- 'a=group:BUNDLE audio video\r\n',
- 'm=audio 9 UDP/TLS/RTP/SAVPF 111 126\r\n',
- 'a=mid:audio\r\n',
- 'a=ssrc:2002 msid:26D16D51-503A-420B-8274-3DD1174E498F 8205D1FC-50B4-407C-87D5-9C45F1B779F0\r\n',
- 'a=ssrc:2002 cname:juejgy8a01\r\n',
- 'a=ssrc:2002 name:a8f7g30-a0\r\n',
- 'm=video 9 UDP/TLS/RTP/SAVPF 107 100 99 96\r\n',
- 'a=mid:video\r\n',
- 'a=ssrc:4004 msid:7C0035E5-2DA1-4AEA-804A-9E75BF9B3768 225E9CDA-0384-4C92-92DD-E74C1153EC68\r\n',
- 'a=ssrc:4005 msid:7C0035E5-2DA1-4AEA-804A-9E75BF9B3768 225E9CDA-0384-4C92-92DD-E74C1153EC68\r\n',
- 'a=ssrc:4004 cname:juejgy8a01\r\n',
- 'a=ssrc:4005 cname:juejgy8a01\r\n',
- 'a=ssrc:4004 name:a8f7g30-v0\r\n',
- 'a=ssrc:4005 name:a8f7g30-v0\r\n',
- 'a=ssrc-group:FID 4004 4005\r\n'
- ].join('');
- const testSdpNew = [
- 'v=0\r\n',
- 'o=thisisadapterortc 2719486166053431 0 IN IP4 127.0.0.1\r\n',
- 's=-\r\n',
- 't=0 0\r\n',
- 'a=group:BUNDLE audio video\r\n',
- 'm=audio 9 UDP/TLS/RTP/SAVPF 111 126\r\n',
- 'a=mid:audio\r\n',
- 'a=ssrc:2002 msid:26D16D51-503A-420B-8274-3DD1174E498F 8205D1FC-50B4-407C-87D5-9C45F1B779F0\r\n',
- 'a=ssrc:2002 cname:juejgy8a01\r\n',
- 'a=ssrc:2002 name:a8f7g30-a0\r\n',
- 'm=video 9 UDP/TLS/RTP/SAVPF 107 100 99 96\r\n',
- 'a=mid:video\r\n',
- 'a=ssrc:4004 msid:7C0035E5-2DA1-4AEA-804A-9E75BF9B3768 225E9CDA-0384-4C92-92DD-E74C1153EC68\r\n',
- 'a=ssrc:4005 msid:7C0035E5-2DA1-4AEA-804A-9E75BF9B3768 225E9CDA-0384-4C92-92DD-E74C1153EC68\r\n',
- 'a=ssrc:4004 cname:juejgy8a01\r\n',
- 'a=ssrc:4005 cname:juejgy8a01\r\n',
- 'a=ssrc:4004 name:a8f7g30-v0\r\n',
- 'a=ssrc:4005 name:a8f7g30-v0\r\n',
- 'a=ssrc-group:FID 4004 4005\r\n'
- ].join('');
- const newToOldDiff = new SDPDiffer(new SDP(testSdpNew), new SDP(testSdpOld));
- const sourceRemoveIq = $iq({})
- .c('jingle', { action: 'source-remove' });
-
- newToOldDiff.toJingle(sourceRemoveIq);
-
- const removedAudioSources = sourceRemoveIq.nodeTree.querySelectorAll('description[media=\'audio\']>source');
- const removedVideoSources = sourceRemoveIq.nodeTree.querySelectorAll('description[media=\'video\']>source');
-
- expect(removedAudioSources.length).toBe(0);
- expect(removedVideoSources.length).toBe(0);
-
- const oldToNewDiff = new SDPDiffer(new SDP(testSdpOld), new SDP(testSdpNew));
- const sourceAddIq = $iq({})
- .c('jingle', { action: 'source-add' });
-
- oldToNewDiff.toJingle(sourceAddIq);
-
- const addedAudioSources = sourceAddIq.nodeTree.querySelectorAll('description[media=\'audio\']>source');
- const addedVideoSources = sourceAddIq.nodeTree.querySelectorAll('description[media=\'video\']>source');
-
- expect(addedAudioSources.length).toBe(0);
- expect(addedVideoSources.length).toBe(0);
- });
-
- it('should send source-adds for 2 sources', () => {
- FeatureFlags.init({ });
-
- const testSdpOld = [
- 'v=0\r\n',
- 'o=thisisadapterortc 2719486166053431 0 IN IP4 127.0.0.1\r\n',
- 's=-\r\n',
- 't=0 0\r\n',
- 'a=group:BUNDLE audio video\r\n',
- 'm=audio 9 UDP/TLS/RTP/SAVPF 111 126\r\n',
- 'a=mid:audio\r\n',
- 'm=video 9 UDP/TLS/RTP/SAVPF 107 100 99 96\r\n',
- 'a=mid:video\r\n'
- ].join('');
- const testSdpNew = [
- 'v=0\r\n',
- 'o=thisisadapterortc 2719486166053431 0 IN IP4 127.0.0.1\r\n',
- 's=-\r\n',
- 't=0 0\r\n',
- 'a=group:BUNDLE audio video\r\n',
- 'm=audio 9 UDP/TLS/RTP/SAVPF 111 126\r\n',
- 'a=mid:audio\r\n',
- 'a=ssrc:2002 msid:26D16D51-503A-420B-8274-3DD1174E498F 8205D1FC-50B4-407C-87D5-9C45F1B779F0\r\n',
- 'a=ssrc:2002 cname:juejgy8a01\r\n',
- 'a=ssrc:2002 name:a8f7g30-a0\r\n',
- 'm=video 9 UDP/TLS/RTP/SAVPF 107 100 99 96\r\n',
- 'a=mid:video\r\n',
- 'a=ssrc:4004 msid:7C0035E5-2DA1-4AEA-804A-9E75BF9B3768 225E9CDA-0384-4C92-92DD-E74C1153EC68\r\n',
- 'a=ssrc:4005 msid:7C0035E5-2DA1-4AEA-804A-9E75BF9B3768 225E9CDA-0384-4C92-92DD-E74C1153EC68\r\n',
- 'a=ssrc:4004 cname:juejgy8a01\r\n',
- 'a=ssrc:4005 cname:juejgy8a01\r\n',
- 'a=ssrc:4004 name:a8f7g30-v0\r\n',
- 'a=ssrc:4005 name:a8f7g30-v0\r\n',
- 'a=ssrc-group:FID 4004 4005\r\n'
- ].join('');
- const newToOldDiff = new SDPDiffer(new SDP(testSdpNew), new SDP(testSdpOld));
- const sourceRemoveIq = $iq({})
- .c('jingle', { action: 'source-remove' });
-
- newToOldDiff.toJingle(sourceRemoveIq);
-
- const removedAudioSources = sourceRemoveIq.nodeTree.querySelectorAll('description[media=\'audio\']>source');
- const removedVideoSources = sourceRemoveIq.nodeTree.querySelectorAll('description[media=\'video\']>source');
-
- expect(removedAudioSources.length).toBe(0);
- expect(removedVideoSources.length).toBe(0);
-
- const oldToNewDiff = new SDPDiffer(new SDP(testSdpOld), new SDP(testSdpNew));
- const sourceAddIq = $iq({})
- .c('jingle', { action: 'source-add' });
-
- oldToNewDiff.toJingle(sourceAddIq);
-
- const addedAudioSources = sourceAddIq.nodeTree.querySelectorAll('description[media=\'audio\']>source');
- const addedVideoSources = sourceAddIq.nodeTree.querySelectorAll('description[media=\'video\']>source');
- const addedVideoSourceGroups = sourceAddIq.nodeTree.querySelectorAll('description[media=\'video\']>ssrc-group');
-
- expect(addedAudioSources.length).toBe(1);
- expect(addedVideoSources.length).toBe(2);
- expect(addedVideoSourceGroups.length).toBe(1);
- });
- });
-
- describe('getNewMedia', () => {
- it(' should generate sources for source-remove when SSCRs are missing from the new SDP', () => {
- const oldSdp = new SDP(SampleSdpStrings.simulcastSdpStr);
- const newSdp = new SDP(SampleSdpStrings.recvOnlySdpStrChrome);
-
- let sdpDiffer = new SDPDiffer(newSdp, oldSdp, false);
- let diff = sdpDiffer.getNewMedia();
-
- // There should be 2 sources for source-remove.
- expect(Object.keys(diff).length).toBe(2);
-
- sdpDiffer = new SDPDiffer(oldSdp, newSdp, false);
- diff = sdpDiffer.getNewMedia();
-
- // There should zero sources for source-add.
- expect(Object.keys(diff).length).toBe(0);
- });
-
- it(' should not generate sources for source-remove or source-add if the SDP does not change', () => {
- const oldSdp = new SDP(SampleSdpStrings.simulcastSdpStr);
- const newSdp = new SDP(SampleSdpStrings.simulcastSdpStr);
-
- const sdpDiffer = new SDPDiffer(newSdp, oldSdp, false);
- const diff = sdpDiffer.getNewMedia();
-
- // There should be zero sources in diff.
- expect(Object.keys(diff).length).toBe(0);
- });
-
- it(' should generate sources for source-remove and source-add when SSRC changes', () => {
- const oldSdp = new SDP(SampleSdpStrings.simulcastSdpStr);
- const newSdp = new SDP(SampleSdpStrings.simulcastDifferentSsrcSdpStr);
-
- let sdpDiffer = new SDPDiffer(newSdp, oldSdp, false);
- let diff = sdpDiffer.getNewMedia();
-
- // There should be 1 source for source-remove.
- expect(Object.keys(diff).length).toBe(1);
-
- sdpDiffer = new SDPDiffer(oldSdp, newSdp, false);
- diff = sdpDiffer.getNewMedia();
-
- // There should 1 source for source-add.
- expect(Object.keys(diff).length).toBe(1);
- });
- });
- });
|