PageRenderTime 43ms CodeModel.GetById 13ms RepoModel.GetById 1ms app.codeStats 0ms

/test/peer.js

https://gitlab.com/braydon/bitcore-p2p
JavaScript | 243 lines | 218 code | 24 blank | 1 comment | 7 complexity | de447e4e20249bde9e15100d88f85fbd MD5 | raw file
  1. 'use strict';
  2. var chai = require('chai');
  3. var Net = require('net');
  4. var Socks5Client = require('socks5-client');
  5. /* jshint unused: false */
  6. var should = chai.should();
  7. var expect = chai.expect;
  8. var sinon = require('sinon');
  9. var fs = require('fs');
  10. var bitcore = require('bitcore');
  11. var _ = bitcore.deps._;
  12. var P2P = require('../');
  13. var Peer = P2P.Peer;
  14. var EventEmitter = require('events').EventEmitter;
  15. var Messages = P2P.Messages;
  16. var messages = new Messages();
  17. var Networks = bitcore.Networks;
  18. describe('Peer', function() {
  19. describe('Integration test', function() {
  20. it('parses this stream of data from a connection', function(callback) {
  21. var peer = new Peer('');
  22. var stub = sinon.stub();
  23. var dataCallback;
  24. var connectCallback;
  25. var expected = {
  26. version: 1,
  27. verack: 1,
  28. inv: 18,
  29. addr: 4
  30. };
  31. var received = {
  32. version: 0,
  33. verack: 0,
  34. inv: 0,
  35. addr: 0
  36. };
  37. stub.on = function() {
  38. if (arguments[0] === 'data') {
  39. dataCallback = arguments[1];
  40. }
  41. if (arguments[0] === 'connect') {
  42. connectCallback = arguments[1];
  43. }
  44. };
  45. stub.write = function() {};
  46. stub.connect = function() {
  47. connectCallback();
  48. };
  49. peer._getSocket = function() {
  50. return stub;
  51. };
  52. peer.on('connect', function() {
  53. dataCallback(fs.readFileSync('./test/data/connection.log'));
  54. });
  55. var check = function(message) {
  56. received[message.command]++;
  57. if (_.isEqual(received, expected)) {
  58. callback();
  59. }
  60. };
  61. peer.on('version', check);
  62. peer.on('verack', check);
  63. peer.on('addr', check);
  64. peer.on('inv', check);
  65. peer.connect();
  66. });
  67. });
  68. it('create instance', function() {
  69. var peer = new Peer('localhost');
  70. peer.host.should.equal('localhost');
  71. peer.network.should.equal(Networks.livenet);
  72. peer.port.should.equal(Networks.livenet.port);
  73. });
  74. it('create instance setting a port', function() {
  75. var peer = new Peer({host: 'localhost', port: 8111});
  76. peer.host.should.equal('localhost');
  77. peer.network.should.equal(Networks.livenet);
  78. peer.port.should.equal(8111);
  79. });
  80. it('create instance setting a network', function() {
  81. var peer = new Peer({host: 'localhost', network: Networks.testnet});
  82. peer.host.should.equal('localhost');
  83. peer.network.should.equal(Networks.testnet);
  84. peer.port.should.equal(Networks.testnet.port);
  85. });
  86. it('create instance setting port and network', function() {
  87. var peer = new Peer({host: 'localhost', port: 8111, network: Networks.testnet});
  88. peer.host.should.equal('localhost');
  89. peer.network.should.equal(Networks.testnet);
  90. peer.port.should.equal(8111);
  91. });
  92. it('create instance without new', function() {
  93. var peer = Peer({host: 'localhost', port: 8111, network: Networks.testnet});
  94. peer.host.should.equal('localhost');
  95. peer.network.should.equal(Networks.testnet);
  96. peer.port.should.equal(8111);
  97. });
  98. it('set a proxy', function() {
  99. var peer, peer2, socket;
  100. peer = new Peer('localhost');
  101. expect(peer.proxy).to.be.undefined();
  102. socket = peer._getSocket();
  103. socket.should.be.instanceof(Net.Socket);
  104. peer2 = peer.setProxy('127.0.0.1', 9050);
  105. peer2.proxy.host.should.equal('127.0.0.1');
  106. peer2.proxy.port.should.equal(9050);
  107. socket = peer2._getSocket();
  108. socket.should.be.instanceof(Socks5Client);
  109. peer.should.equal(peer2);
  110. });
  111. it('send pong on ping', function(done) {
  112. var peer = new Peer({host: 'localhost'});
  113. var pingMessage = messages.Ping();
  114. peer.sendMessage = function(message) {
  115. message.command.should.equal('pong');
  116. message.nonce.should.equal(pingMessage.nonce);
  117. done();
  118. };
  119. peer.emit('ping', pingMessage);
  120. });
  121. it('relay error from socket', function(done) {
  122. var peer = new Peer({host: 'localhost'});
  123. var socket = new EventEmitter();
  124. socket.connect = sinon.spy();
  125. socket.destroy = sinon.spy();
  126. peer._getSocket = function() {
  127. return socket;
  128. };
  129. var error = new Error('error');
  130. peer.on('error', function(err) {
  131. err.should.equal(error);
  132. done();
  133. });
  134. peer.connect();
  135. peer.socket.emit('error', error);
  136. });
  137. it('will not disconnect twice on disconnect and error', function(done) {
  138. var peer = new Peer({host: 'localhost'});
  139. var socket = new EventEmitter();
  140. socket.connect = sinon.stub();
  141. socket.destroy = sinon.stub();
  142. peer._getSocket = function() {
  143. return socket;
  144. };
  145. peer.on('error', sinon.stub());
  146. peer.connect();
  147. var called = 0;
  148. peer.on('disconnect', function() {
  149. called++;
  150. called.should.not.be.above(1);
  151. done();
  152. });
  153. peer.disconnect();
  154. peer.socket.emit('error', new Error('fake error'));
  155. });
  156. it('disconnect with max buffer length', function(done) {
  157. var peer = new Peer({host: 'localhost'});
  158. var socket = new EventEmitter();
  159. socket.connect = sinon.spy();
  160. peer._getSocket = function() {
  161. return socket;
  162. };
  163. peer.disconnect = function() {
  164. done();
  165. };
  166. peer.connect();
  167. var buffer = new Buffer(Array(Peer.MAX_RECEIVE_BUFFER + 1));
  168. peer.socket.emit('data', buffer);
  169. });
  170. it('should send version on version if not already sent', function(done) {
  171. var peer = new Peer({host:'localhost'});
  172. var commands = {};
  173. peer.sendMessage = function(message) {
  174. commands[message.command] = true;
  175. if (commands.verack && commands.version) {
  176. done();
  177. }
  178. };
  179. peer.socket = {};
  180. peer.emit('version', {
  181. version: 'version',
  182. subversion: 'subversion',
  183. startHeight: 'startHeight'
  184. });
  185. });
  186. it('should not send version on version if already sent', function(done) {
  187. var peer = new Peer({host:'localhost'});
  188. peer.versionSent = true;
  189. var commands = {};
  190. peer.sendMessage = function(message) {
  191. message.command.should.not.equal('version');
  192. done();
  193. };
  194. peer.socket = {};
  195. peer.emit('version', {
  196. version: 'version',
  197. subversion: 'subversion',
  198. startHeight: 'startHeight'
  199. });
  200. });
  201. it('relay set properly', function() {
  202. var peer = new Peer({host: 'localhost'});
  203. peer.relay.should.equal(true);
  204. var peer2 = new Peer({host: 'localhost', relay: false});
  205. peer2.relay.should.equal(false);
  206. var peer3 = new Peer({host: 'localhost', relay: true});
  207. peer3.relay.should.equal(true);
  208. });
  209. it('relay setting respected', function() {
  210. [true,false].forEach(function(relay) {
  211. var peer = new Peer({host: 'localhost', relay: relay});
  212. var peerSendMessageStub = sinon.stub(Peer.prototype, 'sendMessage', function(message) {
  213. message.relay.should.equal(relay);
  214. });
  215. peer._sendVersion();
  216. peerSendMessageStub.restore();
  217. });
  218. });
  219. });