Commit a727fe24 authored by Harald Alvestrand's avatar Harald Alvestrand Committed by Chromium LUCI CQ

Test closing multiple datachannels

Tests that when a PeerConnection closes, all open datachannels
get the error and close events.
(The bug was fixed earlier, but this adds a test for it)

Bug: webrtc:6881
Change-Id: I4734f3d29333dcad98c34cf5dbdc8d4b04a5f986
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2568278
Commit-Queue: Harald Alvestrand <hta@chromium.org>
Reviewed-by: default avatarHenrik Boström <hbos@chromium.org>
Cr-Commit-Position: refs/heads/master@{#833346}
parent 9ee523bc
......@@ -45,7 +45,7 @@ for (const options of [{}, {negotiated: true, id: 0}]) {
assert_true(closingSeen, 'Closing event was seen');
}, `Close ${mode} causes closing and close event to be called`);
promise_test(async t => {
promise_test(async t => {
const pc1 = new RTCPeerConnection();
t.add_cleanup(() => pc1.close());
const [channel1, channel2] = await createDataChannelPair(t, options, pc1);
......@@ -100,5 +100,81 @@ for (const options of [{}, {negotiated: true, id: 0}]) {
pc1.close();
await new Promise(resolve => t.step_timeout(resolve, 10));
}, `Close peerconnection after ${mode} close causes no events`);
promise_test(async t => {
const pc1 = new RTCPeerConnection();
t.add_cleanup(() => pc1.close());
const pc2 = new RTCPeerConnection();
t.add_cleanup(() => pc2.close());
pc1.createDataChannel('not-counted', options);
const tokenDataChannel = new Promise(resolve => {
pc2.ondatachannel = resolve;
});
exchangeIceCandidates(pc1, pc2);
await exchangeOfferAnswer(pc1, pc2);
if (!options.negotiated) {
await tokenDataChannel;
}
let closeExpectedCount = 0;
let errorExpectedCount = 0;
let resolveCountIsZero;
let waitForCountIsZero = new Promise(resolve => {
resolveCountIsZero = resolve;
});
for (let i = 1; i <= 10; i++) {
if ('id' in options) {
options.id = i;
}
pc1.createDataChannel('', options);
if (options.negotiated) {
const channel = pc2.createDataChannel('', options);
channel.addEventListener('error', t.step_func(event => {
assert_true(event instanceof RTCErrorEvent, 'error event ' + event);
errorExpectedCount -= 1;
}));
channel.addEventListener('close', t.step_func(event => {
closeExpectedCount -= 1;
if (closeExpectedCount == 0) {
resolveCountIsZero();
}
}));
} else {
await new Promise(resolve => {
pc2.ondatachannel = ({channel}) => {
channel.addEventListener('error', t.step_func(event => {
assert_true(event instanceof RTCErrorEvent);
errorExpectedCount -= 1;
}));
channel.addEventListener('close', t.step_func(event => {
closeExpectedCount -= 1;
if (closeExpectedCount == 0) {
resolveCountIsZero();
}
}));
resolve();
}
});
}
++closeExpectedCount;
++errorExpectedCount;
}
assert_equals(closeExpectedCount, 10);
// We have to wait until SCTP is connected before we close, otherwise
// there will be no signal.
// The state is not available under Plan B, and unreliable on negotiated
// channels.
// TODO(bugs.webrtc.org/12259): Remove dependency on "negotiated"
if (pc1.sctp && !options.negotiated) {
waitForState(pc1.sctp, 'connected');
} else {
// Under plan B, we don't have a dtls transport to wait on, so just
// wait a bit.
await new Promise(resolve => t.step_timeout(resolve, 100));
}
pc1.close();
await waitForCountIsZero;
assert_equals(closeExpectedCount, 0);
assert_equals(errorExpectedCount, 0);
}, `Close peerconnection causes close event and error on many channels, ${mode}`);
}
</script>
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment