summaryrefslogtreecommitdiffstats
path: root/dom/media/webrtc/tests/mochitests/dataChannel.js
diff options
context:
space:
mode:
Diffstat (limited to 'dom/media/webrtc/tests/mochitests/dataChannel.js')
-rw-r--r--dom/media/webrtc/tests/mochitests/dataChannel.js352
1 files changed, 352 insertions, 0 deletions
diff --git a/dom/media/webrtc/tests/mochitests/dataChannel.js b/dom/media/webrtc/tests/mochitests/dataChannel.js
new file mode 100644
index 0000000000..eac52f96ab
--- /dev/null
+++ b/dom/media/webrtc/tests/mochitests/dataChannel.js
@@ -0,0 +1,352 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/**
+ * Returns the contents of a blob as text
+ *
+ * @param {Blob} blob
+ The blob to retrieve the contents from
+ */
+function getBlobContent(blob) {
+ return new Promise(resolve => {
+ var reader = new FileReader();
+ // Listen for 'onloadend' which will always be called after a success or failure
+ reader.onloadend = event => resolve(event.target.result);
+ reader.readAsText(blob);
+ });
+}
+
+var commandsCreateDataChannel = [
+ function PC_REMOTE_EXPECT_DATA_CHANNEL(test) {
+ test.pcRemote.expectDataChannel();
+ },
+
+ function PC_LOCAL_CREATE_DATA_CHANNEL(test) {
+ var channel = test.pcLocal.createDataChannel({});
+ is(channel.binaryType, "blob", channel + " is of binary type 'blob'");
+
+ is(
+ test.pcLocal.signalingState,
+ STABLE,
+ "Create datachannel does not change signaling state"
+ );
+ return test.pcLocal.observedNegotiationNeeded;
+ },
+];
+
+var commandsWaitForDataChannel = [
+ function PC_LOCAL_VERIFY_DATA_CHANNEL_STATE(test) {
+ return test.pcLocal.dataChannels[0].opened;
+ },
+
+ function PC_REMOTE_VERIFY_DATA_CHANNEL_STATE(test) {
+ return test.pcRemote.nextDataChannel.then(channel => channel.opened);
+ },
+];
+
+var commandsCheckDataChannel = [
+ function SEND_MESSAGE(test) {
+ var message = "Lorem ipsum dolor sit amet";
+
+ info("Sending message:" + message);
+ return test.send(message).then(result => {
+ is(
+ result.data,
+ message,
+ "Message correctly transmitted from pcLocal to pcRemote."
+ );
+ });
+ },
+
+ function SEND_BLOB(test) {
+ var contents = "At vero eos et accusam et justo duo dolores et ea rebum.";
+ var blob = new Blob([contents], { type: "text/plain" });
+
+ info("Sending blob");
+ return test
+ .send(blob)
+ .then(result => {
+ ok(result.data instanceof Blob, "Received data is of instance Blob");
+ is(result.data.size, blob.size, "Received data has the correct size.");
+
+ return getBlobContent(result.data);
+ })
+ .then(recv_contents =>
+ is(recv_contents, contents, "Received data has the correct content.")
+ );
+ },
+
+ function CREATE_SECOND_DATA_CHANNEL(test) {
+ return test.createDataChannel({}).then(result => {
+ is(
+ result.remote.binaryType,
+ "blob",
+ "remote data channel is of binary type 'blob'"
+ );
+ });
+ },
+
+ function SEND_MESSAGE_THROUGH_LAST_OPENED_CHANNEL(test) {
+ var channels = test.pcRemote.dataChannels;
+ var message = "I am the Omega";
+
+ info("Sending message:" + message);
+ return test.send(message).then(result => {
+ is(
+ channels.indexOf(result.channel),
+ channels.length - 1,
+ "Last channel used"
+ );
+ is(result.data, message, "Received message has the correct content.");
+ });
+ },
+
+ function SEND_MESSAGE_THROUGH_FIRST_CHANNEL(test) {
+ var message = "Message through 1st channel";
+ var options = {
+ sourceChannel: test.pcLocal.dataChannels[0],
+ targetChannel: test.pcRemote.dataChannels[0],
+ };
+
+ info("Sending message:" + message);
+ return test.send(message, options).then(result => {
+ is(
+ test.pcRemote.dataChannels.indexOf(result.channel),
+ 0,
+ "1st channel used"
+ );
+ is(result.data, message, "Received message has the correct content.");
+ });
+ },
+
+ function SEND_MESSAGE_BACK_THROUGH_FIRST_CHANNEL(test) {
+ var message = "Return a message also through 1st channel";
+ var options = {
+ sourceChannel: test.pcRemote.dataChannels[0],
+ targetChannel: test.pcLocal.dataChannels[0],
+ };
+
+ info("Sending message:" + message);
+ return test.send(message, options).then(result => {
+ is(
+ test.pcLocal.dataChannels.indexOf(result.channel),
+ 0,
+ "1st channel used"
+ );
+ is(result.data, message, "Return message has the correct content.");
+ });
+ },
+
+ function CREATE_NEGOTIATED_DATA_CHANNEL_MAX_RETRANSMITS(test) {
+ var options = {
+ negotiated: true,
+ id: 5,
+ protocol: "foo/bar",
+ ordered: false,
+ maxRetransmits: 500,
+ };
+ return test.createDataChannel(options).then(result => {
+ is(
+ result.local.binaryType,
+ "blob",
+ result.remote + " is of binary type 'blob'"
+ );
+ is(
+ result.local.id,
+ options.id,
+ result.local + " id is:" + result.local.id
+ );
+ is(
+ result.local.protocol,
+ options.protocol,
+ result.local + " protocol is:" + result.local.protocol
+ );
+ is(
+ result.local.reliable,
+ false,
+ result.local + " reliable is:" + result.local.reliable
+ );
+ is(
+ result.local.ordered,
+ options.ordered,
+ result.local + " ordered is:" + result.local.ordered
+ );
+ is(
+ result.local.maxRetransmits,
+ options.maxRetransmits,
+ result.local + " maxRetransmits is:" + result.local.maxRetransmits
+ );
+ is(
+ result.local.maxPacketLifeTime,
+ null,
+ result.local + " maxPacketLifeTime is:" + result.local.maxPacketLifeTime
+ );
+
+ is(
+ result.remote.binaryType,
+ "blob",
+ result.remote + " is of binary type 'blob'"
+ );
+ is(
+ result.remote.id,
+ options.id,
+ result.remote + " id is:" + result.remote.id
+ );
+ is(
+ result.remote.protocol,
+ options.protocol,
+ result.remote + " protocol is:" + result.remote.protocol
+ );
+ is(
+ result.remote.reliable,
+ false,
+ result.remote + " reliable is:" + result.remote.reliable
+ );
+ is(
+ result.remote.ordered,
+ options.ordered,
+ result.remote + " ordered is:" + result.remote.ordered
+ );
+ is(
+ result.remote.maxRetransmits,
+ options.maxRetransmits,
+ result.remote + " maxRetransmits is:" + result.remote.maxRetransmits
+ );
+ is(
+ result.remote.maxPacketLifeTime,
+ null,
+ result.remote +
+ " maxPacketLifeTime is:" +
+ result.remote.maxPacketLifeTime
+ );
+ });
+ },
+
+ function SEND_MESSAGE_THROUGH_LAST_OPENED_CHANNEL2(test) {
+ var channels = test.pcRemote.dataChannels;
+ var message = "I am the walrus; Goo goo g'joob";
+
+ info("Sending message:" + message);
+ return test.send(message).then(result => {
+ is(
+ channels.indexOf(result.channel),
+ channels.length - 1,
+ "Last channel used"
+ );
+ is(result.data, message, "Received message has the correct content.");
+ });
+ },
+
+ function CREATE_NEGOTIATED_DATA_CHANNEL_MAX_PACKET_LIFE_TIME(test) {
+ var options = {
+ ordered: false,
+ maxPacketLifeTime: 10,
+ };
+ return test.createDataChannel(options).then(result => {
+ is(
+ result.local.binaryType,
+ "blob",
+ result.local + " is of binary type 'blob'"
+ );
+ is(
+ result.local.protocol,
+ "",
+ result.local + " protocol is:" + result.local.protocol
+ );
+ is(
+ result.local.reliable,
+ false,
+ result.local + " reliable is:" + result.local.reliable
+ );
+ is(
+ result.local.ordered,
+ options.ordered,
+ result.local + " ordered is:" + result.local.ordered
+ );
+ is(
+ result.local.maxRetransmits,
+ null,
+ result.local + " maxRetransmits is:" + result.local.maxRetransmits
+ );
+ is(
+ result.local.maxPacketLifeTime,
+ options.maxPacketLifeTime,
+ result.local + " maxPacketLifeTime is:" + result.local.maxPacketLifeTime
+ );
+
+ is(
+ result.remote.binaryType,
+ "blob",
+ result.remote + " is of binary type 'blob'"
+ );
+ is(
+ result.remote.protocol,
+ "",
+ result.remote + " protocol is:" + result.remote.protocol
+ );
+ is(
+ result.remote.reliable,
+ false,
+ result.remote + " reliable is:" + result.remote.reliable
+ );
+ is(
+ result.remote.ordered,
+ options.ordered,
+ result.remote + " ordered is:" + result.remote.ordered
+ );
+ is(
+ result.remote.maxRetransmits,
+ null,
+ result.remote + " maxRetransmits is:" + result.remote.maxRetransmits
+ );
+ is(
+ result.remote.maxPacketLifeTime,
+ options.maxPacketLifeTime,
+ result.remote +
+ " maxPacketLifeTime is:" +
+ result.remote.maxPacketLifeTime
+ );
+ });
+ },
+
+ function SEND_MESSAGE_THROUGH_LAST_OPENED_CHANNEL3(test) {
+ var channels = test.pcRemote.dataChannels;
+ var message = "Nice to see you working maxPacketLifeTime";
+
+ info("Sending message:" + message);
+ return test.send(message).then(result => {
+ is(
+ channels.indexOf(result.channel),
+ channels.length - 1,
+ "Last channel used"
+ );
+ is(result.data, message, "Received message has the correct content.");
+ });
+ },
+];
+
+var commandsCheckLargeXfer = [
+ function SEND_BIG_BUFFER(test) {
+ var size = 2 * 1024 * 1024; // SCTP internal buffer is now 1MB, so use 2MB to ensure the buffer gets full
+ var buffer = new ArrayBuffer(size);
+ // note: type received is always blob for binary data
+ var options = {};
+ options.bufferedAmountLowThreshold = 64 * 1024;
+ info("Sending arraybuffer");
+ return test.send(buffer, options).then(result => {
+ ok(result.data instanceof Blob, "Received data is of instance Blob");
+ is(result.data.size, size, "Received data has the correct size.");
+ });
+ },
+];
+
+function addInitialDataChannel(chain) {
+ chain.insertBefore("PC_LOCAL_CREATE_OFFER", commandsCreateDataChannel);
+ chain.insertBefore(
+ "PC_LOCAL_WAIT_FOR_MEDIA_FLOW",
+ commandsWaitForDataChannel
+ );
+ chain.removeAfter("PC_REMOTE_CHECK_ICE_CONNECTIONS");
+ chain.append(commandsCheckDataChannel);
+}