From 57a8d6b75fe2fa9486c6f8684372f4da28cb25fa Mon Sep 17 00:00:00 2001 From: Micah Riggan Date: Fri, 30 Aug 2019 14:45:53 -0400 Subject: [PATCH 1/4] Making the websocket tests more stable --- .../test/integration/websocket.integration.ts | 51 +++++-------------- 1 file changed, 13 insertions(+), 38 deletions(-) diff --git a/packages/bitcore-node/test/integration/websocket.integration.ts b/packages/bitcore-node/test/integration/websocket.integration.ts index 92042a9ae01..7a4dc2380f9 100644 --- a/packages/bitcore-node/test/integration/websocket.integration.ts +++ b/packages/bitcore-node/test/integration/websocket.integration.ts @@ -25,32 +25,42 @@ function getSocket() { } let p2pWorker: P2pWorker; +let socket = getSocket(); describe('Websockets', function() { this.timeout(180000); + before(async () => { await resetDatabase(); + await Event.start(); + await Api.start(); }); - beforeEach(() => { + after(async () => { + await Event.stop(); + await Api.stop(); + }); + + beforeEach(async () => { + socket = getSocket(); p2pWorker = new P2pWorker({ chain, network, chainConfig }); + p2pWorker.start(); }); afterEach(async () => { try { await p2pWorker.stop(); + await socket.disconnect(); } catch (e) { console.log('Error stopping p2p worker'); } }); it('should get a new block when one is generated', async () => { - await p2pWorker.start(); - anAddress = await rpc.getnewaddress(''); await rpc.call('generatetoaddress', [5, anAddress]); await p2pWorker.syncDone(); @@ -72,18 +82,7 @@ describe('Websockets', function() { }); it('should get a websocket event when a block is added', async () => { - await Event.start(); - await Api.start(); - - p2pWorker = new P2pWorker({ - chain, - network, - chainConfig - }); - let hasSeenABlockEvent = false; - - const socket = getSocket(); let sawEvents = new Promise(resolve => { socket.on('connect', () => { socket.emit('room', '/BTC/regtest/inv'); @@ -94,22 +93,14 @@ describe('Websockets', function() { }); }); - await p2pWorker.start(); await rpc.call('generatetoaddress', [1, anAddress]); await sawEvents; - await p2pWorker.stop(); - await socket.disconnect(); - expect(hasSeenABlockEvent).to.be.eq(true); }); it('should get a mempool tx and coin when mempool event, senttoaddress, occurs', async () => { - p2pWorker = new P2pWorker({ chain, network, chainConfig }); - let hasSeenTxEvent = false; let hasSeenCoinEvent = false; - - const socket = getSocket(); let sawEvents = new Promise(resolve => { socket.on('connect', () => { socket.emit('room', '/BTC/regtest/inv'); @@ -127,23 +118,14 @@ describe('Websockets', function() { } }); }); - await p2pWorker.start(); await rpc.sendtoaddress('2MuYKLUaKCenkEpwPkWUwYpBoDBNA2dgY3t', 0.1); await sawEvents; - - await p2pWorker.stop(); - await socket.disconnect(); - expect([hasSeenTxEvent, hasSeenCoinEvent]).to.deep.eq([true, true]); }); it('should get a mempool event while syncing', async () => { - p2pWorker = new P2pWorker({ chain, network, chainConfig }); - let hasSeenTxEvent = false; let hasSeenCoinEvent = false; - - const socket = getSocket(); let sawEvents = new Promise(resolve => { socket.on('connect', () => { socket.emit('room', '/BTC/regtest/inv'); @@ -161,16 +143,9 @@ describe('Websockets', function() { } }); }); - await p2pWorker.start(); - await wait(3000); - p2pWorker.sync(); p2pWorker.isSyncing = true; await rpc.sendtoaddress('2MuYKLUaKCenkEpwPkWUwYpBoDBNA2dgY3t', 0.1); await sawEvents; - - await p2pWorker.stop(); - await socket.disconnect(); - expect([hasSeenTxEvent, hasSeenCoinEvent]).to.deep.eq([true, true]); }); }); From ec44972439ab0b70077ee9bc46df4bc83366b215 Mon Sep 17 00:00:00 2001 From: Micah Riggan Date: Fri, 30 Aug 2019 15:21:43 -0400 Subject: [PATCH 2/4] Adding logging. --- .../test/integration/websocket.integration.ts | 24 ++++++++++--------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/packages/bitcore-node/test/integration/websocket.integration.ts b/packages/bitcore-node/test/integration/websocket.integration.ts index 7a4dc2380f9..9207bd58591 100644 --- a/packages/bitcore-node/test/integration/websocket.integration.ts +++ b/packages/bitcore-node/test/integration/websocket.integration.ts @@ -43,12 +43,16 @@ describe('Websockets', function() { beforeEach(async () => { socket = getSocket(); + socket.on('connect', () => { + socket.emit('room', '/BTC/regtest/inv'); + }); p2pWorker = new P2pWorker({ chain, network, chainConfig }); p2pWorker.start(); + await p2pWorker.syncDone(); }); afterEach(async () => { @@ -84,11 +88,9 @@ describe('Websockets', function() { it('should get a websocket event when a block is added', async () => { let hasSeenABlockEvent = false; let sawEvents = new Promise(resolve => { - socket.on('connect', () => { - socket.emit('room', '/BTC/regtest/inv'); - }); socket.on('block', () => { hasSeenABlockEvent = true; + console.log('Block event received'); resolve(); }); }); @@ -101,24 +103,24 @@ describe('Websockets', function() { it('should get a mempool tx and coin when mempool event, senttoaddress, occurs', async () => { let hasSeenTxEvent = false; let hasSeenCoinEvent = false; + let sent: any; let sawEvents = new Promise(resolve => { - socket.on('connect', () => { - socket.emit('room', '/BTC/regtest/inv'); - }); socket.on('tx', () => { hasSeenTxEvent = true; + console.log('Transaction event received', sent); if (hasSeenTxEvent && hasSeenCoinEvent) { resolve(); } }); socket.on('coin', () => { hasSeenCoinEvent = true; + console.log('Coin event received', sent); if (hasSeenTxEvent && hasSeenCoinEvent) { resolve(); } }); }); - await rpc.sendtoaddress('2MuYKLUaKCenkEpwPkWUwYpBoDBNA2dgY3t', 0.1); + sent = await rpc.sendtoaddress('2MuYKLUaKCenkEpwPkWUwYpBoDBNA2dgY3t', 0.1); await sawEvents; expect([hasSeenTxEvent, hasSeenCoinEvent]).to.deep.eq([true, true]); }); @@ -126,25 +128,25 @@ describe('Websockets', function() { it('should get a mempool event while syncing', async () => { let hasSeenTxEvent = false; let hasSeenCoinEvent = false; + let sent: any; let sawEvents = new Promise(resolve => { - socket.on('connect', () => { - socket.emit('room', '/BTC/regtest/inv'); - }); socket.on('tx', () => { hasSeenTxEvent = true; + console.log('Transaction event received', sent); if (hasSeenTxEvent && hasSeenCoinEvent) { resolve(); } }); socket.on('coin', () => { hasSeenCoinEvent = true; + console.log('Coin event received', sent); if (hasSeenTxEvent && hasSeenCoinEvent) { resolve(); } }); }); p2pWorker.isSyncing = true; - await rpc.sendtoaddress('2MuYKLUaKCenkEpwPkWUwYpBoDBNA2dgY3t', 0.1); + sent = await rpc.sendtoaddress('2MuYKLUaKCenkEpwPkWUwYpBoDBNA2dgY3t', 0.1); await sawEvents; expect([hasSeenTxEvent, hasSeenCoinEvent]).to.deep.eq([true, true]); }); From 86236886888f53679ed5c3cdb8b09b8e86bb487f Mon Sep 17 00:00:00 2001 From: Micah Riggan Date: Fri, 30 Aug 2019 15:47:01 -0400 Subject: [PATCH 3/4] Logging block generation --- .../bitcore-node/test/integration/websocket.integration.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/packages/bitcore-node/test/integration/websocket.integration.ts b/packages/bitcore-node/test/integration/websocket.integration.ts index 9207bd58591..e83dc954e2c 100644 --- a/packages/bitcore-node/test/integration/websocket.integration.ts +++ b/packages/bitcore-node/test/integration/websocket.integration.ts @@ -67,14 +67,17 @@ describe('Websockets', function() { it('should get a new block when one is generated', async () => { anAddress = await rpc.getnewaddress(''); await rpc.call('generatetoaddress', [5, anAddress]); + console.log('Generating 5 blocks'); await p2pWorker.syncDone(); const beforeGenTip = await BlockStorage.getLocalTip({ chain, network }); expect(beforeGenTip).to.not.eq(null); if (beforeGenTip && beforeGenTip.height && beforeGenTip.height < 100) { await rpc.call('generatetoaddress', [100, anAddress]); + console.log('Generating 5 blocks'); } await rpc.call('generatetoaddress', [1, anAddress]); + console.log('Generating 1 block'); await p2pWorker.syncDone(); await wait(1000); const afterGenTip = await BlockStorage.getLocalTip({ chain, network }); From 621389ee323c4bc6bf2e431a434bb23ceb98bf6e Mon Sep 17 00:00:00 2001 From: Micah Riggan Date: Mon, 2 Sep 2019 11:58:28 -0400 Subject: [PATCH 4/4] Simplifying the tests. --- packages/bitcore-node/src/models/block.ts | 2 +- packages/bitcore-node/src/services/event.ts | 2 + .../test/integration/websocket.integration.ts | 101 +++++------------- 3 files changed, 29 insertions(+), 76 deletions(-) diff --git a/packages/bitcore-node/src/models/block.ts b/packages/bitcore-node/src/models/block.ts index 3f5f56e533f..465a59cb249 100644 --- a/packages/bitcore-node/src/models/block.ts +++ b/packages/bitcore-node/src/models/block.ts @@ -196,7 +196,7 @@ export class BlockModel extends BaseModel { const prevBlock = await this.collection.findOne({ chain, network, hash: header.prevHash }); if (prevBlock) { localTip = prevBlock; - this.updateCachedChainTip({chain, network, block: prevBlock}) + this.updateCachedChainTip({ chain, network, block: prevBlock }); } else { delete this.chainTips[chain][network]; logger.error(`Previous block isn't in the DB need to roll back until we have a block in common`); diff --git a/packages/bitcore-node/src/services/event.ts b/packages/bitcore-node/src/services/event.ts index cb583b16410..418059f552e 100644 --- a/packages/bitcore-node/src/services/event.ts +++ b/packages/bitcore-node/src/services/event.ts @@ -74,7 +74,9 @@ export class EventService { if (blockEvent) { const block = blockEvent.payload; this.blockEvent.emit('block', block); + console.log('EVENT::Emitting block'); lastBlockUpdate = new Date(); + console.log('Updated last block seen', lastBlockUpdate); } } if (!this.stopped) { diff --git a/packages/bitcore-node/test/integration/websocket.integration.ts b/packages/bitcore-node/test/integration/websocket.integration.ts index e83dc954e2c..f12beaf1938 100644 --- a/packages/bitcore-node/test/integration/websocket.integration.ts +++ b/packages/bitcore-node/test/integration/websocket.integration.ts @@ -1,20 +1,17 @@ +import { expect } from 'chai'; import { resetDatabase } from '../helpers'; import { AsyncRPC } from '../../src/rpc'; -import { BlockStorage } from '../../src/models/block'; -import { expect } from 'chai'; import io = require('socket.io-client'); import config from '../../src/config'; import { P2pWorker } from '../../src/services/p2p'; import { Event } from '../../src/services/event'; import { Api } from '../../src/services/api'; -const wait = time => new Promise(resolve => setTimeout(resolve, time)); const chain = 'BTC'; const network = 'regtest'; const chainConfig = config.chains[chain][network]; const creds = chainConfig.rpc; const rpc = new AsyncRPC(creds.username, creds.password, creds.host, creds.port); -let anAddress; function getSocket() { const socket = io.connect( @@ -44,6 +41,7 @@ describe('Websockets', function() { beforeEach(async () => { socket = getSocket(); socket.on('connect', () => { + console.log('Socket connected'); socket.emit('room', '/BTC/regtest/inv'); }); p2pWorker = new P2pWorker({ @@ -52,7 +50,9 @@ describe('Websockets', function() { chainConfig }); p2pWorker.start(); - await p2pWorker.syncDone(); + if (p2pWorker.isSyncing) { + await p2pWorker.syncDone(); + } }); afterEach(async () => { @@ -64,93 +64,44 @@ describe('Websockets', function() { } }); - it('should get a new block when one is generated', async () => { - anAddress = await rpc.getnewaddress(''); - await rpc.call('generatetoaddress', [5, anAddress]); - console.log('Generating 5 blocks'); - await p2pWorker.syncDone(); - const beforeGenTip = await BlockStorage.getLocalTip({ chain, network }); - expect(beforeGenTip).to.not.eq(null); - - if (beforeGenTip && beforeGenTip.height && beforeGenTip.height < 100) { - await rpc.call('generatetoaddress', [100, anAddress]); - console.log('Generating 5 blocks'); - } - await rpc.call('generatetoaddress', [1, anAddress]); - console.log('Generating 1 block'); - await p2pWorker.syncDone(); - await wait(1000); - const afterGenTip = await BlockStorage.getLocalTip({ chain, network }); - expect(afterGenTip).to.not.eq(null); - - if (beforeGenTip != null && afterGenTip != null) { - expect(beforeGenTip.height).to.be.lt(afterGenTip.height); - } - }); - - it('should get a websocket event when a block is added', async () => { - let hasSeenABlockEvent = false; - let sawEvents = new Promise(resolve => { - socket.on('block', () => { - hasSeenABlockEvent = true; - console.log('Block event received'); - resolve(); - }); - }); - - await rpc.call('generatetoaddress', [1, anAddress]); - await sawEvents; - expect(hasSeenABlockEvent).to.be.eq(true); - }); - - it('should get a mempool tx and coin when mempool event, senttoaddress, occurs', async () => { + it('should get websocket events', async () => { let hasSeenTxEvent = false; + let hasSeenBlockEvent = false; let hasSeenCoinEvent = false; - let sent: any; + const anAddress = await rpc.getnewaddress(''); let sawEvents = new Promise(resolve => { - socket.on('tx', () => { - hasSeenTxEvent = true; - console.log('Transaction event received', sent); - if (hasSeenTxEvent && hasSeenCoinEvent) { - resolve(); - } - }); - socket.on('coin', () => { - hasSeenCoinEvent = true; - console.log('Coin event received', sent); - if (hasSeenTxEvent && hasSeenCoinEvent) { + socket.on('block', () => { + hasSeenBlockEvent = true; + console.log('Block event received'); + if (hasSeenTxEvent && hasSeenCoinEvent && hasSeenBlockEvent) { resolve(); } }); - }); - sent = await rpc.sendtoaddress('2MuYKLUaKCenkEpwPkWUwYpBoDBNA2dgY3t', 0.1); - await sawEvents; - expect([hasSeenTxEvent, hasSeenCoinEvent]).to.deep.eq([true, true]); - }); - - it('should get a mempool event while syncing', async () => { - let hasSeenTxEvent = false; - let hasSeenCoinEvent = false; - let sent: any; - let sawEvents = new Promise(resolve => { socket.on('tx', () => { hasSeenTxEvent = true; - console.log('Transaction event received', sent); - if (hasSeenTxEvent && hasSeenCoinEvent) { + console.log('Transaction event received'); + if (hasSeenTxEvent && hasSeenCoinEvent && hasSeenBlockEvent) { resolve(); } }); socket.on('coin', () => { hasSeenCoinEvent = true; - console.log('Coin event received', sent); - if (hasSeenTxEvent && hasSeenCoinEvent) { + console.log('Coin event received'); + if (hasSeenTxEvent && hasSeenCoinEvent && hasSeenBlockEvent) { resolve(); } }); }); - p2pWorker.isSyncing = true; - sent = await rpc.sendtoaddress('2MuYKLUaKCenkEpwPkWUwYpBoDBNA2dgY3t', 0.1); + console.log('Generating 100 blocks'); + await rpc.call('generatetoaddress', [101, anAddress]); + await p2pWorker.syncDone(); + console.log('Sync done, generating new block'); + await rpc.call('generatetoaddress', [1, anAddress]); + console.log('Sending bitcoin'); + await rpc.sendtoaddress('2MuYKLUaKCenkEpwPkWUwYpBoDBNA2dgY3t', 0.1); await sawEvents; - expect([hasSeenTxEvent, hasSeenCoinEvent]).to.deep.eq([true, true]); + expect(hasSeenBlockEvent).to.equal(true); + expect(hasSeenTxEvent).to.equal(true); + expect(hasSeenCoinEvent).to.equal(true); }); });