@yipsec/kdns
Version:
composable p2p networks
226 lines (185 loc) • 6.82 kB
JavaScript
;
const { expect } = require('chai');
const { stub } = require('sinon');
const utils = require('../lib/keys');
const constants = require('../lib/constants');
describe('@module keys', function() {
describe('@function getRandomKeyString', function() {
it('should return a random hex string', function() {
expect(utils.getRandomKeyString()).to.have.lengthOf(40);
expect(utils.getRandomKeyString()).to.not.equal(
utils.getRandomKeyString()
);
});
});
describe('@function getRandomKeyBuffer', function() {
it('should return a B bit random buffer', function() {
expect(utils.getRandomKeyBuffer()).to.have.lengthOf(constants.B / 8);
expect(utils.getRandomKeyBuffer()).to.not.equal(
utils.getRandomKeyBuffer()
);
});
});
describe('@function keyStringIsValid', function() {
it('should return true for valid key string', function() {
expect(utils.keyStringIsValid(
'765fa7f8bff0872d512a65beed2c2843a4bc7fb5'
)).to.equal(true);
});
it('should return false for valid key string', function() {
expect(utils.keyStringIsValid(
'jf;alksduf-0a9sfdaksjd;lfkajs;lkdfjas9df'
)).to.equal(false);
});
it('should return false for valid key string', function() {
expect(utils.keyStringIsValid('0')).to.equal(false);
});
});
describe('@function keyBufferIsValid', function() {
it('should return true for valid key buffer', function() {
expect(utils.keyBufferIsValid(
Buffer.from('765fa7f8bff0872d512a65beed2c2843a4bc7fb5', 'hex')
)).to.equal(true);
});
it('should return false for valid key string', function() {
expect(utils.keyBufferIsValid(
Buffer.from('kf;aslkdjf;alksdjf;aslksa;lkdjf;aslkdjf;', 'utf8')
)).to.equal(false);
});
});
describe('@function getDistance', function() {
it('should return the correct distance buffer', function() {
let keys = [
[
[
'ceb5136e0bf02772b6917543b4e03629bc23a1d8',
'63e7a67f3a1841c94a433be9c5071651b1923a0c'
],
'ad52b51131e866bbfcd24eaa71e720780db19bd4'
],
[
[
'cc0eb01763bcceda0550cc4407eabf5f42ba1673',
'a8e14ca6a42c1845112b89f24080f70f0dc6d421'
],
'64effcb1c790d69f147b45b6476a48504f7cc252'
],
[
[
'9a736bc23d17a8cee12027693e3c6256248ab58b',
'679ae587e365aeb05dd11fb97dfa1a94cbfb8afe'
],
'fde98e45de72067ebcf138d043c678c2ef713f75'
]
];
keys.forEach(([compare, result]) => {
expect(utils.getDistance(...compare).toString('hex')).to.equal(result);
});
});
it('should return the correct distance buffer', function() {
let keys = [
[
[
Buffer.from('ceb5136e0bf02772b6917543b4e03629bc23a1d8','hex'),
Buffer.from('63e7a67f3a1841c94a433be9c5071651b1923a0c', 'hex')
],
'ad52b51131e866bbfcd24eaa71e720780db19bd4'
],
[
[
Buffer.from('cc0eb01763bcceda0550cc4407eabf5f42ba1673', 'hex'),
Buffer.from('a8e14ca6a42c1845112b89f24080f70f0dc6d421', 'hex')
],
'64effcb1c790d69f147b45b6476a48504f7cc252'
],
[
[
Buffer.from('9a736bc23d17a8cee12027693e3c6256248ab58b', 'hex'),
Buffer.from('679ae587e365aeb05dd11fb97dfa1a94cbfb8afe', 'hex')
],
'fde98e45de72067ebcf138d043c678c2ef713f75'
]
];
keys.forEach(([compare, result]) => {
expect(utils.getDistance(...compare).toString('hex')).to.equal(result);
});
});
});
describe('@function compareKeyBuffers', function() {
let keys = [
Buffer.from('c8f53a8431f5412e4303acfb9409b61b56001ee1', 'hex'),
Buffer.from('4c380b21c28a42d1f64b363d03cd0851fa177cca', 'hex')
];
it('should return 1 for sort function', function() {
expect(utils.compareKeyBuffers(...keys)).to.equal(1);
});
it('should return -1 for sort function', function() {
expect(utils.compareKeyBuffers(...keys.reverse())).to.equal(-1);
});
it('should return 0 for sort function', function() {
expect(utils.compareKeyBuffers(keys[0], keys[0])).to.equal(0);
expect(utils.compareKeyBuffers(keys[1], keys[1])).to.equal(0);
});
});
describe('@function getBucketIndex', function() {
let reference = '6f8901bbfdc23790f02e4593268133c78771109a';
let testCases = [
['bd0fced1cb5692c8bd7cfb4def2112bc53cdbcfb', 159],
['28830cc8267086b4b80b2d579a5b48b893622b75', 158],
['6fc1c73fd70671c4d2b046ee91029c734959b0cb', 150],
['2015bc8a0faf52a5d673981ac119fc3c5e9db4d0', 158],
['64d2122805e25ccb4556475a7fcedaf16e0c6697', 155],
['6f8901bbec3df42cb187b60cfa0b9de838ce9d8f', 124],
[reference, 0]
];
it('should return the correct index based on distance', function() {
testCases.forEach(([foreign, result]) => {
expect(utils.getBucketIndex(reference, foreign)).to.equal(result);
});
});
});
describe('@function getPowerOfTwoBufferForIndex', function() {
let testCases = [
[
'65753df5f9e4faa6efc071e15d8f865b35b5677f',
50,
'65753df5f9e4faa6efc071e15d04865b35b5677f'
],
[
'b9eae665761df86d6d8655d0255be793f481c0ba',
100,
'b9eae665761df8106d8655d0255be793f481c0ba'
],
[
Buffer.from('e4c1000352253152453cc069ab9ae71a8bb4e8e8', 'hex'),
150,
'e440000352253152453cc069ab9ae71a8bb4e8e8'
]
];
it('should return a power of two version of the given key', function() {
testCases.forEach(([key, index, result]) => {
expect(
utils.getPowerOfTwoBufferForIndex(key, index).toString('hex')
).to.equal(result);
});
});
});
describe('@function getRandomBufferInBucketRange', function() {
let testCases = [
['54a1d84e56b0380b7878596cd094804154d8079a', 36],
['4cde832be44a98364ac81467521b7ae6e25953e3', 54],
['2fdd001069eeacad2881f49058c9e368e994ef51', 71],
['48b954272a4cae8e72c7fb5ab681fba7661eeeaf', 98],
['65663df335e47def178280607980abac6ced8948', 124],
['adde001ace4abe9e30b429914a4510f7226ea2da', 142],
['0b182a6f7f5a10641ff94473ff83df96a1493e3d', 158]
];
it('should return a reasonably close random key in range', function() {
testCases.forEach(([key, index]) => {
let randomInRange = utils.getRandomBufferInBucketRange(key, index);
let bucketIndex = utils.getBucketIndex(key, randomInRange);
expect(Math.abs(index - bucketIndex) <= 7).to.equal(true);
});
});
});
});