getaddr: fix framer. add addr to protocol-test.

Signed-off-by: Fedor Indutny <fedor@indutny.com>
This commit is contained in:
Christopher Jeffrey 2014-05-18 14:27:56 -05:00 committed by Fedor Indutny
parent 615292de46
commit 2aabef9a6d
2 changed files with 70 additions and 4 deletions

View File

@ -341,14 +341,15 @@ Framer.prototype.addr = function addr(peers) {
c += utils.writeU64(p, 1, c);
// ipv6
c += utils.writeU32BE(p, utils.readU32BE(peer.ipv6, 0), c);
c += utils.writeU16BE(p, utils.readU16BE(peer.ipv6, 4), c);
c += utils.writeU32BE(p, utils.readU32BE(peer.ipv6, 4), c);
c += utils.writeU32BE(p, utils.readU32BE(peer.ipv6, 8), c);
c += utils.writeU32BE(p, utils.readU32BE(peer.ipv6, 12), c);
// ipv4
c += utils.writeU32BE(p, utils.readU32BE(peer.ipv4, 0), c);
// port
c += utils.writeU16BE(peer.port, c);
c += utils.writeU16BE(p, peer.port, c);
}
return this.packet('addr', p);

View File

@ -11,7 +11,7 @@ describe('Protocol', function() {
function packetTest(command, payload, test) {
it('should encode/decode ' + command, function(cb) {
var ver = framer[command]();
var ver = framer[command](payload);
parser.once('packet', function(packet) {
assert.equal(packet.cmd, command);
test(packet.payload);
@ -28,4 +28,69 @@ describe('Protocol', function() {
packetTest('verack', {}, function(payload) {
});
var peers = [
{
ipv6: '0000:0000:0000:0000:0000:0000:0000:ffff',
ipv4: '127.0.0.1',
port: 8333
},
{
ipv6: '0000:0000:0000:0000:0000:7f00:0001:ffff',
ipv4: '10.0.0.1',
port: 18333
}
];
// Convert peers to framer payload format, backup strings.
peers.forEach(function(addr) {
addr._ipv4 = addr.ipv4;
addr.ipv4 = addr.ipv4.split('.').map(function(n) {
return +n;
});
addr._ipv6 = addr.ipv6;
addr.ipv6 = addr.ipv6.split(':').map(function(n) {
return [(parseInt(n, 16) >> 8) & 0xff, parseInt(n, 16) & 0xff];
}).reduce(function(out, val) {
return out.concat(val);
}, []);
addr._ipv6 = '::' + addr._ipv6.split(':').slice(2).join(':');
});
packetTest('addr', peers, function(payload) {
if (parser.parseAddr) {
payload = parser.parseAddr(payload);
} else {
// XXX Legacy
var addrs = [];
bcoin.peer.prototype._handleAddr.call({
emit: function(_, obj) {
addrs.push(obj);
}
}, payload);
payload = addrs;
payload.forEach(function(addr) {
addr.date = addr.date.getTime() / 1000 | 0;
delete addr.address;
delete addr.host;
delete addr.host6;
addr.ipv6 = '::' + addr.ipv6;
});
}
assert.equal(typeof payload.length, 'number');
assert.equal(payload.length, 2);
assert.equal(typeof payload[0].date, 'number');
assert.equal(payload[0].network, 1);
assert.equal(payload[0].ipv6, peers[0]._ipv6);
assert.equal(payload[0].ipv4, peers[0]._ipv4);
assert.equal(payload[0].port, peers[0].port);
assert.equal(typeof payload[1].date, 'number');
assert.equal(payload[1].network, 1);
assert.equal(payload[1].ipv6, peers[1]._ipv6);
assert.equal(payload[1].ipv4, peers[1]._ipv4);
assert.equal(payload[1].port, peers[1].port);
});
});