407 lines
14 KiB
JavaScript
407 lines
14 KiB
JavaScript
(function() {
|
|
|
|
function Tests(ASSERT, UTIL) {
|
|
// custom assertion to test array-like objects
|
|
function assertArrayEqual(actual, expected) {
|
|
ASSERT.equal(actual.length, expected.length);
|
|
for (var idx = 0; idx < expected.length; idx++) {
|
|
ASSERT.equal(actual[idx], expected[idx]);
|
|
}
|
|
}
|
|
|
|
describe('util', function() {
|
|
it('should put bytes into a buffer', function() {
|
|
var b = UTIL.createBuffer();
|
|
b.putByte(1);
|
|
b.putByte(2);
|
|
b.putByte(3);
|
|
b.putByte(4);
|
|
b.putInt32(4);
|
|
b.putByte(1);
|
|
b.putByte(2);
|
|
b.putByte(3);
|
|
b.putInt32(4294967295);
|
|
var hex = b.toHex();
|
|
ASSERT.equal(hex, '0102030400000004010203ffffffff');
|
|
|
|
var bytes = [];
|
|
while(b.length() > 0) {
|
|
bytes.push(b.getByte());
|
|
}
|
|
ASSERT.deepEqual(
|
|
bytes, [1, 2, 3, 4, 0, 0, 0, 4, 1, 2, 3, 255, 255, 255, 255]);
|
|
});
|
|
|
|
it('should put bytes from an Uint8Array into a buffer', function() {
|
|
if(typeof Uint8Array === 'undefined') {
|
|
return;
|
|
}
|
|
var data = [1, 2, 3, 4, 0, 0, 0, 4, 1, 2, 3, 255, 255, 255, 255];
|
|
var ab = new Uint8Array(data);
|
|
var b = UTIL.createBuffer(ab);
|
|
var hex = b.toHex();
|
|
ASSERT.equal(hex, '0102030400000004010203ffffffff');
|
|
|
|
var bytes = [];
|
|
while(b.length() > 0) {
|
|
bytes.push(b.getByte());
|
|
}
|
|
ASSERT.deepEqual(bytes, data);
|
|
});
|
|
|
|
it('should convert bytes from hex', function() {
|
|
var hex = '0102030400000004010203ffffffff';
|
|
var b = UTIL.createBuffer();
|
|
b.putBytes(UTIL.hexToBytes(hex));
|
|
ASSERT.equal(b.toHex(), hex);
|
|
});
|
|
|
|
it('should put 0 into a buffer using two\'s complement', function() {
|
|
var b = UTIL.createBuffer();
|
|
b.putSignedInt(0, 8);
|
|
ASSERT.equal(b.toHex(), '00');
|
|
});
|
|
|
|
it('should put 0 into a buffer using two\'s complement w/2 bytes', function() {
|
|
var b = UTIL.createBuffer();
|
|
b.putSignedInt(0, 16);
|
|
ASSERT.equal(b.toHex(), '0000');
|
|
});
|
|
|
|
it('should put 127 into a buffer using two\'s complement', function() {
|
|
var b = UTIL.createBuffer();
|
|
b.putSignedInt(127, 8);
|
|
ASSERT.equal(b.toHex(), '7f');
|
|
});
|
|
|
|
it('should put 127 into a buffer using two\'s complement w/2 bytes', function() {
|
|
var b = UTIL.createBuffer();
|
|
b.putSignedInt(127, 16);
|
|
ASSERT.equal(b.toHex(), '007f');
|
|
});
|
|
|
|
it('should put 128 into a buffer using two\'s complement', function() {
|
|
var b = UTIL.createBuffer();
|
|
b.putSignedInt(128, 16);
|
|
ASSERT.equal(b.toHex(), '0080');
|
|
});
|
|
|
|
it('should put 256 into a buffer using two\'s complement', function() {
|
|
var b = UTIL.createBuffer();
|
|
b.putSignedInt(256, 16);
|
|
ASSERT.equal(b.toHex(), '0100');
|
|
});
|
|
|
|
it('should put -128 into a buffer using two\'s complement', function() {
|
|
var b = UTIL.createBuffer();
|
|
b.putSignedInt(-128, 8);
|
|
ASSERT.equal(b.toHex(), '80');
|
|
});
|
|
|
|
it('should put -129 into a buffer using two\'s complement', function() {
|
|
var b = UTIL.createBuffer();
|
|
b.putSignedInt(-129, 16);
|
|
ASSERT.equal(b.toHex(), 'ff7f');
|
|
});
|
|
|
|
it('should get 0 from a buffer using two\'s complement', function() {
|
|
var x = 0;
|
|
var n = 8;
|
|
var b = UTIL.createBuffer();
|
|
b.putSignedInt(x, n);
|
|
ASSERT.equal(b.getSignedInt(x, n), x);
|
|
});
|
|
|
|
it('should get 127 from a buffer using two\'s complement', function() {
|
|
var x = 127;
|
|
var n = 8;
|
|
var b = UTIL.createBuffer();
|
|
b.putSignedInt(x, n);
|
|
ASSERT.equal(b.getSignedInt(n), x);
|
|
});
|
|
|
|
it('should get 128 from a buffer using two\'s complement', function() {
|
|
var x = 128;
|
|
var n = 16;
|
|
var b = UTIL.createBuffer();
|
|
b.putSignedInt(x, n);
|
|
ASSERT.equal(b.getSignedInt(n), x);
|
|
});
|
|
|
|
it('should get 256 from a buffer using two\'s complement', function() {
|
|
var x = 256;
|
|
var n = 16;
|
|
var b = UTIL.createBuffer();
|
|
b.putSignedInt(x, n);
|
|
ASSERT.equal(b.getSignedInt(n), x);
|
|
});
|
|
|
|
it('should get -128 from a buffer using two\'s complement', function() {
|
|
var x = -128;
|
|
var n = 8;
|
|
var b = UTIL.createBuffer();
|
|
b.putSignedInt(x, n);
|
|
ASSERT.equal(b.getSignedInt(n), x);
|
|
});
|
|
|
|
it('should get -129 from a buffer using two\'s complement', function() {
|
|
var x = -129;
|
|
var n = 16;
|
|
var b = UTIL.createBuffer();
|
|
b.putSignedInt(x, n);
|
|
ASSERT.equal(b.getSignedInt(n), x);
|
|
});
|
|
|
|
it('should base64 encode some bytes', function() {
|
|
var s1 = '00010203050607080A0B0C0D0F1011121415161719';
|
|
var s2 = 'MDAwMTAyMDMwNTA2MDcwODBBMEIwQzBEMEYxMDExMTIxNDE1MTYxNzE5';
|
|
ASSERT.equal(UTIL.encode64(s1), s2);
|
|
});
|
|
|
|
it('should base64 decode some bytes', function() {
|
|
var s1 = '00010203050607080A0B0C0D0F1011121415161719';
|
|
var s2 = 'MDAwMTAyMDMwNTA2MDcwODBBMEIwQzBEMEYxMDExMTIxNDE1MTYxNzE5';
|
|
ASSERT.equal(UTIL.decode64(s2), s1);
|
|
});
|
|
|
|
it('should base64 encode some bytes using util.binary.base64', function() {
|
|
var s1 = new Uint8Array([
|
|
0x30, 0x30, 0x30, 0x31, 0x30, 0x32, 0x30, 0x33, 0x30,
|
|
0x35, 0x30, 0x36, 0x30, 0x37, 0x30, 0x38, 0x30, 0x41,
|
|
0x30, 0x42, 0x30, 0x43, 0x30, 0x44, 0x30, 0x46, 0x31,
|
|
0x30, 0x31, 0x31, 0x31, 0x32, 0x31, 0x34, 0x31, 0x35,
|
|
0x31, 0x36, 0x31, 0x37, 0x31, 0x39]);
|
|
var s2 = 'MDAwMTAyMDMwNTA2MDcwODBBMEIwQzBEMEYxMDExMTIxNDE1MTYxNzE5';
|
|
ASSERT.equal(UTIL.binary.base64.encode(s1), s2);
|
|
});
|
|
|
|
it('should base64 encode some odd-length bytes using util.binary.base64', function() {
|
|
var s1 = new Uint8Array([
|
|
0x30, 0x30, 0x30, 0x31, 0x30, 0x32, 0x30, 0x33, 0x30,
|
|
0x35, 0x30, 0x36, 0x30, 0x37, 0x30, 0x38, 0x30, 0x41,
|
|
0x30, 0x42, 0x30, 0x43, 0x30, 0x44, 0x30, 0x46, 0x31,
|
|
0x30, 0x31, 0x31, 0x31, 0x32, 0x31, 0x34, 0x31, 0x35,
|
|
0x31, 0x36, 0x31, 0x37, 0x31, 0x39, 0x31, 0x41, 0x31,
|
|
0x42]);
|
|
var s2 = 'MDAwMTAyMDMwNTA2MDcwODBBMEIwQzBEMEYxMDExMTIxNDE1MTYxNzE5MUExQg==';
|
|
ASSERT.equal(UTIL.binary.base64.encode(s1), s2);
|
|
});
|
|
|
|
it('should base64 decode some bytes using util.binary.base64', function() {
|
|
var s1 = new Uint8Array([
|
|
0x30, 0x30, 0x30, 0x31, 0x30, 0x32, 0x30, 0x33, 0x30,
|
|
0x35, 0x30, 0x36, 0x30, 0x37, 0x30, 0x38, 0x30, 0x41,
|
|
0x30, 0x42, 0x30, 0x43, 0x30, 0x44, 0x30, 0x46, 0x31,
|
|
0x30, 0x31, 0x31, 0x31, 0x32, 0x31, 0x34, 0x31, 0x35,
|
|
0x31, 0x36, 0x31, 0x37, 0x31, 0x39]);
|
|
var s2 = 'MDAwMTAyMDMwNTA2MDcwODBBMEIwQzBEMEYxMDExMTIxNDE1MTYxNzE5';
|
|
ASSERT.deepEqual(UTIL.binary.base64.decode(s2), s1);
|
|
});
|
|
|
|
it('should base64 decode some odd-length bytes using util.binary.base64', function() {
|
|
var s1 = new Uint8Array([
|
|
0x30, 0x30, 0x30, 0x31, 0x30, 0x32, 0x30, 0x33, 0x30,
|
|
0x35, 0x30, 0x36, 0x30, 0x37, 0x30, 0x38, 0x30, 0x41,
|
|
0x30, 0x42, 0x30, 0x43, 0x30, 0x44, 0x30, 0x46, 0x31,
|
|
0x30, 0x31, 0x31, 0x31, 0x32, 0x31, 0x34, 0x31, 0x35,
|
|
0x31, 0x36, 0x31, 0x37, 0x31, 0x39, 0x31, 0x41, 0x31,
|
|
0x42]);
|
|
var s2 = 'MDAwMTAyMDMwNTA2MDcwODBBMEIwQzBEMEYxMDExMTIxNDE1MTYxNzE5MUExQg==';
|
|
assertArrayEqual(UTIL.binary.base64.decode(s2), s1);
|
|
});
|
|
|
|
it('should convert IPv4 0.0.0.0 textual address to 4-byte address', function() {
|
|
var bytes = UTIL.bytesFromIP('0.0.0.0');
|
|
var b = UTIL.createBuffer().fillWithByte(0, 4);
|
|
ASSERT.equal(bytes, b.getBytes());
|
|
});
|
|
|
|
it('should convert IPv4 127.0.0.1 textual address to 4-byte address', function() {
|
|
var bytes = UTIL.bytesFromIP('127.0.0.1');
|
|
var b = UTIL.createBuffer();
|
|
b.putByte(127);
|
|
b.putByte(0);
|
|
b.putByte(0);
|
|
b.putByte(1);
|
|
ASSERT.equal(bytes, b.getBytes());
|
|
});
|
|
|
|
it('should convert IPv6 :: textual address to 16-byte address', function() {
|
|
var bytes = UTIL.bytesFromIP('::');
|
|
var b = UTIL.createBuffer().fillWithByte(0, 16);
|
|
ASSERT.equal(bytes, b.getBytes());
|
|
});
|
|
|
|
it('should convert IPv6 ::0 textual address to 16-byte address', function() {
|
|
var bytes = UTIL.bytesFromIP('::0');
|
|
var b = UTIL.createBuffer().fillWithByte(0, 16);
|
|
ASSERT.equal(bytes, b.getBytes());
|
|
});
|
|
|
|
it('should convert IPv6 0:: textual address to 16-byte address', function() {
|
|
var bytes = UTIL.bytesFromIP('0::');
|
|
var b = UTIL.createBuffer().fillWithByte(0, 16);
|
|
ASSERT.equal(bytes, b.getBytes());
|
|
});
|
|
|
|
it('should convert IPv6 ::1 textual address to 16-byte address', function() {
|
|
var bytes = UTIL.bytesFromIP('::1');
|
|
var b = UTIL.createBuffer().fillWithByte(0, 14);
|
|
b.putBytes(UTIL.hexToBytes('0001'));
|
|
ASSERT.equal(bytes, b.getBytes());
|
|
});
|
|
|
|
it('should convert IPv6 1:: textual address to 16-byte address', function() {
|
|
var bytes = UTIL.bytesFromIP('1::');
|
|
var b = UTIL.createBuffer();
|
|
b.putBytes(UTIL.hexToBytes('0001'));
|
|
b.fillWithByte(0, 14);
|
|
ASSERT.equal(bytes, b.getBytes());
|
|
});
|
|
|
|
it('should convert IPv6 1::1 textual address to 16-byte address', function() {
|
|
var bytes = UTIL.bytesFromIP('1::1');
|
|
var b = UTIL.createBuffer();
|
|
b.putBytes(UTIL.hexToBytes('0001'));
|
|
b.fillWithByte(0, 12);
|
|
b.putBytes(UTIL.hexToBytes('0001'));
|
|
ASSERT.equal(bytes, b.getBytes());
|
|
});
|
|
|
|
it('should convert IPv6 1::1:0 textual address to 16-byte address', function() {
|
|
var bytes = UTIL.bytesFromIP('1::1:0');
|
|
var b = UTIL.createBuffer();
|
|
b.putBytes(UTIL.hexToBytes('0001'));
|
|
b.fillWithByte(0, 10);
|
|
b.putBytes(UTIL.hexToBytes('0001'));
|
|
b.putBytes(UTIL.hexToBytes('0000'));
|
|
ASSERT.equal(bytes, b.getBytes());
|
|
});
|
|
|
|
it('should convert IPv6 2001:db8:0:1:1:1:1:1 textual address to 16-byte address', function() {
|
|
var bytes = UTIL.bytesFromIP('2001:db8:0:1:1:1:1:1');
|
|
var b = UTIL.createBuffer();
|
|
b.putBytes(UTIL.hexToBytes('2001'));
|
|
b.putBytes(UTIL.hexToBytes('0db8'));
|
|
b.putBytes(UTIL.hexToBytes('0000'));
|
|
b.putBytes(UTIL.hexToBytes('0001'));
|
|
b.putBytes(UTIL.hexToBytes('0001'));
|
|
b.putBytes(UTIL.hexToBytes('0001'));
|
|
b.putBytes(UTIL.hexToBytes('0001'));
|
|
b.putBytes(UTIL.hexToBytes('0001'));
|
|
ASSERT.equal(bytes, b.getBytes());
|
|
});
|
|
|
|
it('should convert IPv4 0.0.0.0 byte address to textual representation', function() {
|
|
var addr = '0.0.0.0';
|
|
var bytes = UTIL.createBuffer().fillWithByte(0, 4).getBytes();
|
|
var addr = UTIL.bytesToIP(bytes);
|
|
ASSERT.equal(addr, '0.0.0.0');
|
|
});
|
|
|
|
it('should convert IPv4 0.0.0.0 byte address to textual representation', function() {
|
|
var addr = '127.0.0.1';
|
|
var bytes = UTIL.bytesFromIP(addr);
|
|
var addr = UTIL.bytesToIP(bytes);
|
|
ASSERT.equal(addr, '127.0.0.1');
|
|
});
|
|
|
|
it('should convert IPv6 :: byte address to canonical textual representation (RFC 5952)', function() {
|
|
var addr = '::';
|
|
var bytes = UTIL.createBuffer().fillWithByte(0, 16).getBytes();
|
|
var addr = UTIL.bytesToIP(bytes);
|
|
ASSERT.equal(addr, '::');
|
|
});
|
|
|
|
it('should convert IPv6 ::1 byte address to canonical textual representation (RFC 5952)', function() {
|
|
var addr = '::1';
|
|
var bytes = UTIL.bytesFromIP(addr);
|
|
var addr = UTIL.bytesToIP(bytes);
|
|
ASSERT.equal(addr, '::1');
|
|
});
|
|
|
|
it('should convert IPv6 1:: byte address to canonical textual representation (RFC 5952)', function() {
|
|
var addr = '1::';
|
|
var bytes = UTIL.bytesFromIP(addr);
|
|
var addr = UTIL.bytesToIP(bytes);
|
|
ASSERT.equal(addr, '1::');
|
|
});
|
|
|
|
it('should convert IPv6 0:0:0:0:0:0:0:1 byte address to canonical textual representation (RFC 5952)', function() {
|
|
var addr = '0:0:0:0:0:0:0:1';
|
|
var bytes = UTIL.bytesFromIP(addr);
|
|
var addr = UTIL.bytesToIP(bytes);
|
|
ASSERT.equal(addr, '::1');
|
|
});
|
|
|
|
it('should convert IPv6 1:0:0:0:0:0:0:0 byte address to canonical textual representation (RFC 5952)', function() {
|
|
var addr = '1:0:0:0:0:0:0:0';
|
|
var bytes = UTIL.bytesFromIP(addr);
|
|
var addr = UTIL.bytesToIP(bytes);
|
|
ASSERT.equal(addr, '1::');
|
|
});
|
|
|
|
it('should convert IPv6 1::1 byte address to canonical textual representation (RFC 5952)', function() {
|
|
var addr = '1::1';
|
|
var bytes = UTIL.bytesFromIP(addr);
|
|
var addr = UTIL.bytesToIP(bytes);
|
|
ASSERT.equal(addr, '1::1');
|
|
});
|
|
|
|
it('should convert IPv6 1:0:0:0:0:0:0:1 byte address to canonical textual representation (RFC 5952)', function() {
|
|
var addr = '1:0:0:0:0:0:0:1';
|
|
var bytes = UTIL.bytesFromIP(addr);
|
|
var addr = UTIL.bytesToIP(bytes);
|
|
ASSERT.equal(addr, '1::1');
|
|
});
|
|
|
|
it('should convert IPv6 1:0000:0000:0000:0000:0000:0000:1 byte address to canonical textual representation (RFC 5952)', function() {
|
|
var addr = '1:0000:0000:0000:0000:0000:0000:1';
|
|
var bytes = UTIL.bytesFromIP(addr);
|
|
var addr = UTIL.bytesToIP(bytes);
|
|
ASSERT.equal(addr, '1::1');
|
|
});
|
|
|
|
it('should convert IPv6 1:0:0:1:1:1:0:1 byte address to canonical textual representation (RFC 5952)', function() {
|
|
var addr = '1:0:0:1:1:1:0:1';
|
|
var bytes = UTIL.bytesFromIP(addr);
|
|
var addr = UTIL.bytesToIP(bytes);
|
|
ASSERT.equal(addr, '1::1:1:1:0:1');
|
|
});
|
|
|
|
it('should convert IPv6 1:0:1:1:1:0:0:1 byte address to canonical textual representation (RFC 5952)', function() {
|
|
var addr = '1:0:1:1:1:0:0:1';
|
|
var bytes = UTIL.bytesFromIP(addr);
|
|
var addr = UTIL.bytesToIP(bytes);
|
|
ASSERT.equal(addr, '1:0:1:1:1::1');
|
|
});
|
|
|
|
it('should convert IPv6 2001:db8:0:1:1:1:1:1 byte address to canonical textual representation (RFC 5952)', function() {
|
|
var addr = '2001:db8:0:1:1:1:1:1';
|
|
var bytes = UTIL.bytesFromIP(addr);
|
|
var addr = UTIL.bytesToIP(bytes);
|
|
ASSERT.equal(addr, '2001:db8:0:1:1:1:1:1');
|
|
});
|
|
});
|
|
}
|
|
|
|
// check for AMD
|
|
if(typeof define === 'function') {
|
|
define([
|
|
'forge/util'
|
|
], function(UTIL) {
|
|
Tests(
|
|
// Global provided by test harness
|
|
ASSERT,
|
|
UTIL()
|
|
);
|
|
});
|
|
} else if(typeof module === 'object' && module.exports) {
|
|
// assume NodeJS
|
|
Tests(
|
|
require('assert'),
|
|
require('../../js/util')());
|
|
}
|
|
|
|
})();
|