352 lines
9.8 KiB
JavaScript
352 lines
9.8 KiB
JavaScript
/* 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);
|
|
}
|