Merge branch 'master' into development
Bringing beta up to date with production v1.0.40
This commit is contained in:
commit
f013eed9d1
19 changed files with 675 additions and 251 deletions
|
@ -118,26 +118,35 @@
|
|||
rotateSignedPreKey: function() {
|
||||
return this.queueTask(function() {
|
||||
var signedKeyId = textsecure.storage.get('signedKeyId', 1);
|
||||
|
||||
if (typeof signedKeyId != 'number') {
|
||||
throw new Error('Invalid signedKeyId');
|
||||
}
|
||||
|
||||
var store = textsecure.storage.protocol;
|
||||
var server = this.server;
|
||||
var cleanSignedPreKeys = this.cleanSignedPreKeys;
|
||||
|
||||
return store.getIdentityKeyPair().then(function(identityKey) {
|
||||
return libsignal.KeyHelper.generateSignedPreKey(identityKey, signedKeyId);
|
||||
}).then(function(res) {
|
||||
return server.setSignedPreKey({
|
||||
keyId : res.keyId,
|
||||
publicKey : res.keyPair.pubKey,
|
||||
signature : res.signature
|
||||
console.log('Saving new signed prekey', res.keyId);
|
||||
return Promise.all([
|
||||
textsecure.storage.put('signedKeyId', signedKeyId + 1),
|
||||
store.storeSignedPreKey(res.keyId, res.keyPair),
|
||||
server.setSignedPreKey({
|
||||
keyId : res.keyId,
|
||||
publicKey : res.keyPair.pubKey,
|
||||
signature : res.signature
|
||||
}),
|
||||
]).then(function() {
|
||||
var confirmed = true;
|
||||
console.log('Confirming new signed prekey', res.keyId);
|
||||
return Promise.all([
|
||||
textsecure.storage.remove('signedKeyRotationRejected'),
|
||||
store.storeSignedPreKey(res.keyId, res.keyPair, confirmed),
|
||||
]);
|
||||
}).then(function() {
|
||||
textsecure.storage.put('signedKeyId', signedKeyId + 1);
|
||||
textsecure.storage.remove('signedKeyRotationRejected');
|
||||
return store.storeSignedPreKey(res.keyId, res.keyPair).then(function() {
|
||||
return cleanSignedPreKeys();
|
||||
});
|
||||
return cleanSignedPreKeys();
|
||||
});
|
||||
}).catch(function(e) {
|
||||
console.log(
|
||||
|
@ -149,9 +158,9 @@
|
|||
var rejections = 1 + textsecure.storage.get('signedKeyRotationRejected', 0);
|
||||
textsecure.storage.put('signedKeyRotationRejected', rejections);
|
||||
console.log('Signed key rotation rejected count:', rejections);
|
||||
} else {
|
||||
throw e;
|
||||
}
|
||||
|
||||
throw e;
|
||||
});
|
||||
}.bind(this));
|
||||
},
|
||||
|
@ -160,35 +169,72 @@
|
|||
return this.pending = this.pending.then(taskWithTimeout, taskWithTimeout);
|
||||
},
|
||||
cleanSignedPreKeys: function() {
|
||||
var nextSignedKeyId = textsecure.storage.get('signedKeyId');
|
||||
if (typeof nextSignedKeyId != 'number') {
|
||||
return Promise.resolve();
|
||||
}
|
||||
var activeSignedPreKeyId = nextSignedKeyId - 1;
|
||||
|
||||
var MINIMUM_KEYS = 3;
|
||||
var store = textsecure.storage.protocol;
|
||||
return store.loadSignedPreKeys().then(function(allRecords) {
|
||||
var oldRecords = allRecords.filter(function(record) {
|
||||
return record.keyId !== activeSignedPreKeyId;
|
||||
});
|
||||
oldRecords.sort(function(a, b) {
|
||||
return store.loadSignedPreKeys().then(function(allKeys) {
|
||||
allKeys.sort(function(a, b) {
|
||||
return (a.created_at || 0) - (b.created_at || 0);
|
||||
});
|
||||
allKeys.reverse(); // we want the most recent first
|
||||
var confirmed = allKeys.filter(function(key) {
|
||||
return key.confirmed;
|
||||
});
|
||||
var unconfirmed = allKeys.filter(function(key) {
|
||||
return !key.confirmed;
|
||||
});
|
||||
|
||||
console.log("Active signed prekey: " + activeSignedPreKeyId);
|
||||
console.log("Old signed prekey record count: " + oldRecords.length);
|
||||
var recent = allKeys[0] ? allKeys[0].keyId : 'none';
|
||||
var recentConfirmed = confirmed[0] ? confirmed[0].keyId : 'none';
|
||||
console.log('Most recent signed key: ' + recent);
|
||||
console.log('Most recent confirmed signed key: ' + recentConfirmed);
|
||||
console.log(
|
||||
'Total signed key count:',
|
||||
allKeys.length,
|
||||
'-',
|
||||
confirmed.length,
|
||||
'confirmed'
|
||||
);
|
||||
|
||||
oldRecords.forEach(function(oldRecord) {
|
||||
if ( oldRecord.keyId > activeSignedPreKeyId - 3 ) {
|
||||
// keep at least the last 3 signed keys
|
||||
var confirmedCount = confirmed.length;
|
||||
|
||||
// Keep MINIMUM_KEYS confirmed keys, then drop if older than a week
|
||||
confirmed = confirmed.forEach(function(key, index) {
|
||||
if (index < MINIMUM_KEYS) {
|
||||
return;
|
||||
}
|
||||
var created_at = oldRecord.created_at || 0;
|
||||
var archiveDuration = Date.now() - created_at;
|
||||
if (archiveDuration > ARCHIVE_AGE) {
|
||||
console.log("Removing signed prekey record:",
|
||||
oldRecord.keyId, "with timestamp:", created_at);
|
||||
store.removeSignedPreKey(oldRecord.keyId);
|
||||
var created_at = key.created_at || 0;
|
||||
var age = Date.now() - created_at;
|
||||
if (age > ARCHIVE_AGE) {
|
||||
console.log(
|
||||
'Removing confirmed signed prekey:',
|
||||
key.keyId,
|
||||
'with timestamp:',
|
||||
created_at
|
||||
);
|
||||
store.removeSignedPreKey(key.keyId);
|
||||
confirmedCount--;
|
||||
}
|
||||
});
|
||||
|
||||
var stillNeeded = MINIMUM_KEYS - confirmedCount;
|
||||
|
||||
// If we still don't have enough total keys, we keep as many unconfirmed
|
||||
// keys as necessary. If not necessary, and over a week old, we drop.
|
||||
unconfirmed.forEach(function(key, index) {
|
||||
if (index < stillNeeded) {
|
||||
return;
|
||||
}
|
||||
|
||||
var created_at = key.created_at || 0;
|
||||
var age = Date.now() - created_at;
|
||||
if (age > ARCHIVE_AGE) {
|
||||
console.log(
|
||||
'Removing unconfirmed signed prekey:',
|
||||
key.keyId,
|
||||
'with timestamp:',
|
||||
created_at
|
||||
);
|
||||
store.removeSignedPreKey(key.keyId);
|
||||
}
|
||||
});
|
||||
});
|
||||
|
|
|
@ -618,8 +618,7 @@ MessageReceiver.prototype.extend({
|
|||
console.log('Got SyncMessage Request');
|
||||
return this.removeFromCache(envelope);
|
||||
} else if (syncMessage.read && syncMessage.read.length) {
|
||||
console.log('read messages',
|
||||
'from', envelope.source + '.' + envelope.sourceDevice);
|
||||
console.log('read messages from', this.getEnvelopeId(envelope));
|
||||
return this.handleRead(envelope, syncMessage.read);
|
||||
} else if (syncMessage.verified) {
|
||||
return this.handleVerified(envelope, syncMessage.verified);
|
||||
|
@ -730,6 +729,7 @@ MessageReceiver.prototype.extend({
|
|||
}.bind(this));
|
||||
},
|
||||
handleBlocked: function(envelope, blocked) {
|
||||
console.log('Setting these numbers as blocked:', blocked.numbers);
|
||||
textsecure.storage.put('blocked', blocked.numbers);
|
||||
},
|
||||
isBlocked: function(number) {
|
||||
|
|
|
@ -265,10 +265,11 @@ MessageSender.prototype = {
|
|||
var proto = textsecure.protobuf.DataMessage.decode(encodedMessage);
|
||||
return new Promise(function(resolve, reject) {
|
||||
this.sendMessageProto(timestamp, numbers, proto, function(res) {
|
||||
if (res.errors.length > 0)
|
||||
if (res.errors.length > 0) {
|
||||
reject(res);
|
||||
else
|
||||
} else {
|
||||
resolve(res);
|
||||
}
|
||||
});
|
||||
}.bind(this));
|
||||
},
|
||||
|
@ -320,7 +321,9 @@ MessageSender.prototype = {
|
|||
syncMessage.sent = sentMessage;
|
||||
var contentMessage = new textsecure.protobuf.Content();
|
||||
contentMessage.syncMessage = syncMessage;
|
||||
return this.sendIndividualProto(myNumber, contentMessage, Date.now());
|
||||
|
||||
var silent = true;
|
||||
return this.sendIndividualProto(myNumber, contentMessage, Date.now(), silent);
|
||||
},
|
||||
|
||||
getProfile: function(number) {
|
||||
|
@ -341,7 +344,8 @@ MessageSender.prototype = {
|
|||
var contentMessage = new textsecure.protobuf.Content();
|
||||
contentMessage.syncMessage = syncMessage;
|
||||
|
||||
return this.sendIndividualProto(myNumber, contentMessage, Date.now());
|
||||
var silent = true;
|
||||
return this.sendIndividualProto(myNumber, contentMessage, Date.now(), silent);
|
||||
}
|
||||
|
||||
return Promise.resolve();
|
||||
|
@ -357,7 +361,8 @@ MessageSender.prototype = {
|
|||
var contentMessage = new textsecure.protobuf.Content();
|
||||
contentMessage.syncMessage = syncMessage;
|
||||
|
||||
return this.sendIndividualProto(myNumber, contentMessage, Date.now());
|
||||
var silent = true;
|
||||
return this.sendIndividualProto(myNumber, contentMessage, Date.now(), silent);
|
||||
}
|
||||
|
||||
return Promise.resolve();
|
||||
|
@ -374,7 +379,8 @@ MessageSender.prototype = {
|
|||
var contentMessage = new textsecure.protobuf.Content();
|
||||
contentMessage.syncMessage = syncMessage;
|
||||
|
||||
return this.sendIndividualProto(myNumber, contentMessage, Date.now());
|
||||
var silent = true;
|
||||
return this.sendIndividualProto(myNumber, contentMessage, Date.now(), silent);
|
||||
}
|
||||
|
||||
return Promise.resolve();
|
||||
|
@ -387,7 +393,8 @@ MessageSender.prototype = {
|
|||
var contentMessage = new textsecure.protobuf.Content();
|
||||
contentMessage.receiptMessage = receiptMessage;
|
||||
|
||||
return this.sendIndividualProto(sender, contentMessage, Date.now(), true /*silent*/);
|
||||
var silent = true;
|
||||
return this.sendIndividualProto(sender, contentMessage, Date.now(), silent);
|
||||
},
|
||||
syncReadMessages: function(reads) {
|
||||
var myNumber = textsecure.storage.user.getNumber();
|
||||
|
@ -404,7 +411,8 @@ MessageSender.prototype = {
|
|||
var contentMessage = new textsecure.protobuf.Content();
|
||||
contentMessage.syncMessage = syncMessage;
|
||||
|
||||
return this.sendIndividualProto(myNumber, contentMessage, Date.now());
|
||||
var silent = true;
|
||||
return this.sendIndividualProto(myNumber, contentMessage, Date.now(), silent);
|
||||
}
|
||||
|
||||
return Promise.resolve();
|
||||
|
@ -412,38 +420,44 @@ MessageSender.prototype = {
|
|||
syncVerification: function(destination, state, identityKey) {
|
||||
var myNumber = textsecure.storage.user.getNumber();
|
||||
var myDevice = textsecure.storage.user.getDeviceId();
|
||||
if (myDevice != 1) {
|
||||
// First send a null message to mask the sync message.
|
||||
var nullMessage = new textsecure.protobuf.NullMessage();
|
||||
var now = Date.now();
|
||||
|
||||
// Generate a random int from 1 and 512
|
||||
var buffer = libsignal.crypto.getRandomBytes(1);
|
||||
var paddingLength = (new Uint8Array(buffer)[0] & 0x1ff) + 1;
|
||||
|
||||
// Generate a random padding buffer of the chosen size
|
||||
nullMessage.padding = libsignal.crypto.getRandomBytes(paddingLength);
|
||||
|
||||
var contentMessage = new textsecure.protobuf.Content();
|
||||
contentMessage.nullMessage = nullMessage;
|
||||
|
||||
return this.sendIndividualProto(destination, contentMessage, Date.now()).then(function() {
|
||||
var verified = new textsecure.protobuf.Verified();
|
||||
verified.state = state;
|
||||
verified.destination = destination;
|
||||
verified.identityKey = identityKey;
|
||||
verified.nullMessage = nullMessage.padding;
|
||||
|
||||
var syncMessage = this.createSyncMessage();
|
||||
syncMessage.verified = verified;
|
||||
|
||||
var contentMessage = new textsecure.protobuf.Content();
|
||||
contentMessage.syncMessage = syncMessage;
|
||||
|
||||
return this.sendIndividualProto(myNumber, contentMessage, Date.now());
|
||||
}.bind(this));
|
||||
if (myDevice === 1) {
|
||||
return Promise.resolve();
|
||||
}
|
||||
|
||||
return Promise.resolve();
|
||||
// First send a null message to mask the sync message.
|
||||
var nullMessage = new textsecure.protobuf.NullMessage();
|
||||
|
||||
// Generate a random int from 1 and 512
|
||||
var buffer = libsignal.crypto.getRandomBytes(1);
|
||||
var paddingLength = (new Uint8Array(buffer)[0] & 0x1ff) + 1;
|
||||
|
||||
// Generate a random padding buffer of the chosen size
|
||||
nullMessage.padding = libsignal.crypto.getRandomBytes(paddingLength);
|
||||
|
||||
var contentMessage = new textsecure.protobuf.Content();
|
||||
contentMessage.nullMessage = nullMessage;
|
||||
|
||||
// We want the NullMessage to look like a normal outgoing message; not silent
|
||||
const promise = this.sendIndividualProto(destination, contentMessage, now);
|
||||
|
||||
return promise.then(function() {
|
||||
var verified = new textsecure.protobuf.Verified();
|
||||
verified.state = state;
|
||||
verified.destination = destination;
|
||||
verified.identityKey = identityKey;
|
||||
verified.nullMessage = nullMessage.padding;
|
||||
|
||||
var syncMessage = this.createSyncMessage();
|
||||
syncMessage.verified = verified;
|
||||
|
||||
var contentMessage = new textsecure.protobuf.Content();
|
||||
contentMessage.syncMessage = syncMessage;
|
||||
|
||||
var silent = true;
|
||||
return this.sendIndividualProto(myNumber, contentMessage, now, silent);
|
||||
}.bind(this));
|
||||
},
|
||||
|
||||
sendGroupProto: function(numbers, proto, timestamp) {
|
||||
|
@ -455,14 +469,17 @@ MessageSender.prototype = {
|
|||
}
|
||||
|
||||
return new Promise(function(resolve, reject) {
|
||||
this.sendMessageProto(timestamp, numbers, proto, function(res) {
|
||||
var silent = true;
|
||||
var callback = function(res) {
|
||||
res.dataMessage = proto.toArrayBuffer();
|
||||
if (res.errors.length > 0) {
|
||||
reject(res);
|
||||
} else {
|
||||
resolve(res);
|
||||
}
|
||||
}.bind(this));
|
||||
}.bind(this);
|
||||
|
||||
this.sendMessageProto(timestamp, numbers, proto, callback, silent);
|
||||
}.bind(this));
|
||||
},
|
||||
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
mocha.setup("bdd");
|
||||
window.assert = chai.assert;
|
||||
window.PROTO_ROOT = '../../protos';
|
||||
|
||||
(function() {
|
||||
var OriginalReporter = mocha._reporter;
|
||||
|
@ -52,3 +53,5 @@ function hexToArrayBuffer(str) {
|
|||
array[i] = parseInt(str.substr(i*2, 2), 16);
|
||||
return ret;
|
||||
};
|
||||
|
||||
window.MockSocket.prototype.addEventListener = function() {};
|
||||
|
|
156
libtextsecure/test/account_manager_test.js
Normal file
156
libtextsecure/test/account_manager_test.js
Normal file
|
@ -0,0 +1,156 @@
|
|||
'use strict';
|
||||
|
||||
describe("AccountManager", function() {
|
||||
let accountManager;
|
||||
let originalServer;
|
||||
|
||||
before(function() {
|
||||
originalServer = window.TextSecureServer;
|
||||
window.TextSecureServer = function() {};
|
||||
});
|
||||
after(function() {
|
||||
window.TextSecureServer = originalServer;
|
||||
});
|
||||
|
||||
beforeEach(function() {
|
||||
accountManager = new window.textsecure.AccountManager();
|
||||
});
|
||||
|
||||
describe('#cleanSignedPreKeys', function() {
|
||||
let originalProtocolStorage;
|
||||
let signedPreKeys;
|
||||
const DAY = 1000 * 60 * 60 * 24;
|
||||
|
||||
beforeEach(function() {
|
||||
originalProtocolStorage = window.textsecure.storage.protocol;
|
||||
window.textsecure.storage.protocol = {
|
||||
loadSignedPreKeys: function() {
|
||||
return Promise.resolve(signedPreKeys);
|
||||
},
|
||||
};
|
||||
});
|
||||
afterEach(function() {
|
||||
window.textsecure.storage.protocol = originalProtocolStorage;
|
||||
});
|
||||
|
||||
it('keeps three confirmed keys even if over a week old', function() {
|
||||
const now = Date.now();
|
||||
signedPreKeys = [{
|
||||
keyId: 1,
|
||||
created_at: now - DAY * 21,
|
||||
confirmed: true,
|
||||
}, {
|
||||
keyId: 2,
|
||||
created_at: now - DAY * 14,
|
||||
confirmed: true,
|
||||
}, {
|
||||
keyId: 3,
|
||||
created_at: now - DAY * 18,
|
||||
confirmed: true,
|
||||
}];
|
||||
|
||||
// should be no calls to store.removeSignedPreKey, would cause crash
|
||||
return accountManager.cleanSignedPreKeys();
|
||||
});
|
||||
|
||||
it('eliminates confirmed keys over a week old, if more than three', function() {
|
||||
const now = Date.now();
|
||||
signedPreKeys = [{
|
||||
keyId: 1,
|
||||
created_at: now - DAY * 21,
|
||||
confirmed: true,
|
||||
}, {
|
||||
keyId: 2,
|
||||
created_at: now - DAY * 14,
|
||||
confirmed: true,
|
||||
}, {
|
||||
keyId: 3,
|
||||
created_at: now - DAY * 4,
|
||||
confirmed: true,
|
||||
}, {
|
||||
keyId: 4,
|
||||
created_at: now - DAY * 18,
|
||||
confirmed: true,
|
||||
}, {
|
||||
keyId: 5,
|
||||
created_at: now - DAY,
|
||||
confirmed: true,
|
||||
}];
|
||||
|
||||
let count = 0;
|
||||
window.textsecure.storage.protocol.removeSignedPreKey = function(keyId) {
|
||||
if (keyId !== 1 && keyId !== 4) {
|
||||
throw new Error('Wrong keys were eliminated! ' + keyId);
|
||||
}
|
||||
|
||||
count++;
|
||||
};
|
||||
|
||||
return accountManager.cleanSignedPreKeys().then(function() {
|
||||
assert.strictEqual(count, 2);
|
||||
});
|
||||
});
|
||||
|
||||
it('keeps at least three unconfirmed keys if no confirmed', function() {
|
||||
const now = Date.now();
|
||||
signedPreKeys = [{
|
||||
keyId: 1,
|
||||
created_at: now - DAY * 14,
|
||||
}, {
|
||||
keyId: 2,
|
||||
created_at: now - DAY * 21,
|
||||
}, {
|
||||
keyId: 3,
|
||||
created_at: now - DAY * 18,
|
||||
}, {
|
||||
keyId: 4,
|
||||
created_at: now - DAY
|
||||
}];
|
||||
|
||||
let count = 0;
|
||||
window.textsecure.storage.protocol.removeSignedPreKey = function(keyId) {
|
||||
if (keyId !== 2) {
|
||||
throw new Error('Wrong keys were eliminated! ' + keyId);
|
||||
}
|
||||
|
||||
count++;
|
||||
};
|
||||
|
||||
return accountManager.cleanSignedPreKeys().then(function() {
|
||||
assert.strictEqual(count, 1);
|
||||
});
|
||||
});
|
||||
|
||||
it('if some confirmed keys, keeps unconfirmed to addd up to three total', function() {
|
||||
const now = Date.now();
|
||||
signedPreKeys = [{
|
||||
keyId: 1,
|
||||
created_at: now - DAY * 21,
|
||||
confirmed: true,
|
||||
}, {
|
||||
keyId: 2,
|
||||
created_at: now - DAY * 14,
|
||||
confirmed: true,
|
||||
}, {
|
||||
keyId: 3,
|
||||
created_at: now - DAY * 12,
|
||||
}, {
|
||||
keyId: 4,
|
||||
created_at: now - DAY * 8,
|
||||
}];
|
||||
|
||||
let count = 0;
|
||||
window.textsecure.storage.protocol.removeSignedPreKey = function(keyId) {
|
||||
if (keyId !== 3) {
|
||||
throw new Error('Wrong keys were eliminated! ' + keyId);
|
||||
}
|
||||
|
||||
count++;
|
||||
};
|
||||
|
||||
return accountManager.cleanSignedPreKeys().then(function() {
|
||||
assert.strictEqual(count, 1);
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
|
@ -1,6 +1,7 @@
|
|||
<html>
|
||||
|
||||
<head>
|
||||
<meta charset='utf-8'>
|
||||
<title>libTextSecure test runner</title>
|
||||
<link rel="stylesheet" href="../../components/mocha/mocha.css" />
|
||||
</head>
|
||||
|
@ -12,7 +13,6 @@
|
|||
</div>
|
||||
|
||||
<script type="text/javascript" src="test.js"></script>
|
||||
<script type="text/javascript" src="blanket_mocha.js"></script>
|
||||
<script type="text/javascript" src="in_memory_signal_protocol_store.js"></script>
|
||||
|
||||
<script type="text/javascript" src="../components.js"></script>
|
||||
|
@ -23,12 +23,12 @@
|
|||
<script type="text/javascript" src="../storage.js" data-cover></script>
|
||||
<script type="text/javascript" src="../protocol_wrapper.js" data-cover></script>
|
||||
|
||||
<script type="text/javascript" src="../event_target.js" data-cover></script>
|
||||
<script type="text/javascript" src="../websocket-resources.js" data-cover></script>
|
||||
<script type="text/javascript" src="../helpers.js" data-cover></script>
|
||||
<script type="text/javascript" src="../stringview.js" data-cover></script>
|
||||
<script type="text/javascript" src="../api.js"></script>
|
||||
<script type="text/javascript" src="../sendmessage.js" data-cover></script>
|
||||
<script type="text/javascript" src="../event_target.js" data-cover></script>
|
||||
<script type="text/javascript" src="../account_manager.js" data-cover></script>
|
||||
<script type="text/javascript" src="../contacts_parser.js" data-cover></script>
|
||||
<script type="text/javascript" src="../task_with_timeout.js" data-cover></script>
|
||||
|
@ -42,5 +42,14 @@
|
|||
<script type="text/javascript" src="generate_keys_test.js"></script>
|
||||
<script type="text/javascript" src="websocket-resources_test.js"></script>
|
||||
<script type="text/javascript" src="task_with_timeout_test.js"></script>
|
||||
<script type="text/javascript" src="account_manager_test.js"></script>
|
||||
|
||||
<!-- Comment out to turn off code coverage. Useful for getting real callstacks. -->
|
||||
<script type="text/javascript" src="blanket_mocha.js"></script>
|
||||
|
||||
<!-- Uncomment to start tests without code coverage enabled -->
|
||||
<!-- <script type="text/javascript">
|
||||
mocha.run();
|
||||
</script> -->
|
||||
</body>
|
||||
</html>
|
||||
|
|
|
@ -1 +0,0 @@
|
|||
../../protos/
|
|
@ -22054,6 +22054,7 @@ Library.prototype.test = function(obj, type) {
|
|||
});
|
||||
mocha.setup("bdd");
|
||||
window.assert = chai.assert;
|
||||
window.PROTO_ROOT = '../../protos';
|
||||
|
||||
(function() {
|
||||
var OriginalReporter = mocha._reporter;
|
||||
|
@ -22106,3 +22107,5 @@ function hexToArrayBuffer(str) {
|
|||
array[i] = parseInt(str.substr(i*2, 2), 16);
|
||||
return ret;
|
||||
};
|
||||
|
||||
window.MockSocket.prototype.addEventListener = function() {};
|
||||
|
|
|
@ -18,7 +18,8 @@
|
|||
assert.strictEqual(message.response.status, 200);
|
||||
assert.strictEqual(message.response.id.toString(), request_id);
|
||||
done();
|
||||
}
|
||||
},
|
||||
addEventListener: function() {},
|
||||
};
|
||||
|
||||
// actual test
|
||||
|
@ -58,7 +59,8 @@
|
|||
assert.strictEqual(message.request.path, '/some/path');
|
||||
assertEqualArrayBuffers(message.request.body.toArrayBuffer(), new Uint8Array([1,2,3]).buffer);
|
||||
request_id = message.request.id;
|
||||
}
|
||||
},
|
||||
addEventListener: function() {},
|
||||
};
|
||||
|
||||
// actual test
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue