summaryrefslogtreecommitdiffstats
path: root/testing/web-platform/tests/webrtc/RTCSctpTransport-constructor.html
diff options
context:
space:
mode:
Diffstat (limited to 'testing/web-platform/tests/webrtc/RTCSctpTransport-constructor.html')
-rw-r--r--testing/web-platform/tests/webrtc/RTCSctpTransport-constructor.html125
1 files changed, 125 insertions, 0 deletions
diff --git a/testing/web-platform/tests/webrtc/RTCSctpTransport-constructor.html b/testing/web-platform/tests/webrtc/RTCSctpTransport-constructor.html
new file mode 100644
index 0000000000..484967f76b
--- /dev/null
+++ b/testing/web-platform/tests/webrtc/RTCSctpTransport-constructor.html
@@ -0,0 +1,125 @@
+<!doctype html>
+<meta charset="utf-8">
+<title>RTCSctpTransport constructor</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="RTCPeerConnection-helper.js"></script>
+<script>
+'use strict';
+
+// Test is based on the following revision:
+// https://rawgit.com/w3c/webrtc-pc/1cc5bfc3ff18741033d804c4a71f7891242fb5b3/webrtc.html
+
+// The following helper functions are called from RTCPeerConnection-helper.js:
+// generateDataChannelOffer()
+// generateAnswer()
+
+/*
+ 6.1.
+
+ partial interface RTCPeerConnection {
+ readonly attribute RTCSctpTransport? sctp;
+ ...
+ };
+
+ 6.1.1.
+
+ interface RTCSctpTransport {
+ readonly attribute RTCDtlsTransport transport;
+ readonly attribute RTCSctpTransportState state;
+ readonly attribute unrestricted double maxMessageSize;
+ attribute EventHandler onstatechange;
+ };
+
+ 4.4.1.1. Constructor
+ 9. Let connection have an [[SctpTransport]] internal slot, initialized to null.
+
+ 4.4.1.6. Set the RTCSessionSessionDescription
+ 2.2.6. If description is of type "answer" or "pranswer", then run the
+ following steps:
+ 1. If description initiates the establishment of a new SCTP association, as defined in
+ [SCTP-SDP], Sections 10.3 and 10.4, create an RTCSctpTransport with an initial state
+ of "connecting" and assign the result to the [[SctpTransport]] slot.
+ */
+
+promise_test(async (t) => {
+ const pc1 = new RTCPeerConnection();
+ const pc2 = new RTCPeerConnection();
+ t.add_cleanup(() => pc1.close());
+ t.add_cleanup(() => pc2.close());
+
+ assert_equals(pc1.sctp, null, 'RTCSctpTransport must be null');
+
+ const offer = await generateAudioReceiveOnlyOffer(pc1);
+ await Promise.all([pc1.setLocalDescription(offer), pc2.setRemoteDescription(offer)]);
+ const answer = await pc2.createAnswer();
+ await pc1.setRemoteDescription(answer);
+
+ assert_equals(pc1.sctp, null, 'RTCSctpTransport must remain null');
+}, 'setRemoteDescription() with answer not containing data media should not initialize pc.sctp');
+
+promise_test(async (t) => {
+ const pc1 = new RTCPeerConnection();
+ const pc2 = new RTCPeerConnection();
+ t.add_cleanup(() => pc1.close());
+ t.add_cleanup(() => pc2.close());
+
+ assert_equals(pc1.sctp, null, 'RTCSctpTransport must be null');
+
+ const offer = await generateAudioReceiveOnlyOffer(pc2);
+ await Promise.all([pc2.setLocalDescription(offer), pc1.setRemoteDescription(offer)]);
+ const answer = await pc1.createAnswer();
+ await pc1.setLocalDescription(answer);
+
+ assert_equals(pc1.sctp, null, 'RTCSctpTransport must remain null');
+}, 'setLocalDescription() with answer not containing data media should not initialize pc.sctp');
+
+function validateSctpTransport(sctp) {
+ assert_not_equals(sctp, null, 'RTCSctpTransport must be available');
+
+ assert_true(sctp instanceof RTCSctpTransport,
+ 'Expect pc.sctp to be instance of RTCSctpTransport');
+
+ assert_true(sctp.transport instanceof RTCDtlsTransport,
+ 'Expect sctp.transport to be instance of RTCDtlsTransport');
+
+ assert_equals(sctp.state, 'connecting', 'RTCSctpTransport should be in the connecting state');
+
+ // Note: Yes, Number.POSITIVE_INFINITY is also a 'number'
+ assert_equals(typeof sctp.maxMessageSize, 'number',
+ 'Expect sctp.maxMessageSize to be a number');
+}
+
+promise_test(async (t) => {
+ const pc1 = new RTCPeerConnection();
+ const pc2 = new RTCPeerConnection();
+ t.add_cleanup(() => pc1.close());
+ t.add_cleanup(() => pc2.close());
+
+ assert_equals(pc1.sctp, null, 'RTCSctpTransport must be null');
+
+ const offer = await generateDataChannelOffer(pc1);
+ await Promise.all([pc1.setLocalDescription(offer), pc2.setRemoteDescription(offer)]);
+ const answer = await pc2.createAnswer();
+ await pc1.setRemoteDescription(answer);
+
+ validateSctpTransport(pc1.sctp);
+}, 'setRemoteDescription() with answer containing data media should initialize pc.sctp');
+
+promise_test(async (t) => {
+ const pc1 = new RTCPeerConnection();
+ const pc2 = new RTCPeerConnection();
+ t.add_cleanup(() => pc1.close());
+ t.add_cleanup(() => pc2.close());
+
+ assert_equals(pc1.sctp, null, 'RTCSctpTransport must be null');
+
+ const offer = await generateDataChannelOffer(pc2);
+ await Promise.all([pc2.setLocalDescription(offer), pc1.setRemoteDescription(offer)]);
+ const answer = await pc1.createAnswer();
+ await pc1.setLocalDescription(answer);
+
+ validateSctpTransport(pc1.sctp);
+}, 'setLocalDescription() with answer containing data media should initialize pc.sctp');
+
+</script>