Skip to content

Commit

Permalink
[FABN-1235] Block event checkpointer fix
Browse files Browse the repository at this point in the history
- Fixed issue where blockNumber in _onEvent:blockeventlistener.js is always
  NaN when receiving unfiltered block events

Change-Id: I9088648c0b73cd7df61b4f7d49efe9c76e87b330
Signed-off-by: Liam Grace <liamgrace.896@gmail.com>
  • Loading branch information
liam-grace committed May 16, 2019
1 parent d268065 commit 302503e
Show file tree
Hide file tree
Showing 2 changed files with 25 additions and 8 deletions.
7 changes: 6 additions & 1 deletion fabric-network/lib/impl/event/blockeventlistener.js
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,12 @@ class BlockEventListener extends AbstractEventListener {
* @private
*/
async _onEvent(block) {
const blockNumber = Number(block.number);
let blockNumber;
if (!this._filtered) {
blockNumber = Number(block.header.number);
} else {
blockNumber = Number(block.number);
}

try {
await this.eventCallback(null, block);
Expand Down
26 changes: 19 additions & 7 deletions fabric-network/test/impl/event/blockeventlistener.js
Original file line number Diff line number Diff line change
Expand Up @@ -96,31 +96,31 @@ describe('BlockEventListener', () => {
});

it('should call the event callback', async () => {
const block = {number: '10'};
const block = {header: {number: '10'}};
await blockEventListener._onEvent(block);
sinon.assert.calledWith(blockEventListener.eventCallback, null, block);
sinon.assert.notCalled(checkpointerStub.save);
sinon.assert.notCalled(blockEventListener.unregister);
});

it('should save a checkpoint', async () => {
const block = {number: '10'};
const block = {header: {number: '10'}};
checkpointerStub.load.returns({});
blockEventListener.checkpointer = checkpointerStub;
await blockEventListener._onEvent(block);
sinon.assert.calledWith(checkpointerStub.save, null, 10);
});

it('should unregister if registration.unregister is set', async () => {
const block = {number: '10'};
const block = {header: {number: '10'}};
blockEventListener._registration.unregister = true;
await blockEventListener._onEvent(block);
sinon.assert.calledWith(blockEventListener.eventCallback, null, block);
sinon.assert.called(blockEventListener.unregister);
});

it ('should not save a checkpoint if the callback fails', async () => {
const block = {number: '10'};
const block = {header: {number: '10'}};
blockEventListener.eventCallback.throws(new Error());
blockEventListener.checkpointer = checkpointerStub;
await blockEventListener._onEvent(block);
Expand Down Expand Up @@ -234,14 +234,14 @@ describe('BlockEventListener', () => {
blockEventListener.eventHub = eventHubStub;
eventHubStub.registerBlockEvent.returns({});
await blockEventListener.register();
await blockEventListener._onEvent({number: 1});
await blockEventListener._onEvent({header: {number: 1}});
const checkpoint = await checkpointer.load();
expect(checkpoint.blockNumber).to.equal(1);
});

it('should update with a new block number', async () => {
it('should update with a new block number (filtered)', async () => {
checkpointer = new InMemoryCheckpointer();
blockEventListener = new BlockEventListener(networkStub, 'listener', (block) => {}, {replay: true, checkpointer: {factory: () => checkpointer}});
blockEventListener = new BlockEventListener(networkStub, 'listener', (block) => {}, {filtered: true, replay: true, checkpointer: {factory: () => checkpointer}});
blockEventListener.eventHub = eventHubStub;
eventHubStub.registerBlockEvent.returns({});
await blockEventListener.register();
Expand All @@ -251,6 +251,18 @@ describe('BlockEventListener', () => {
expect(checkpoint.blockNumber).to.equal(2);
});

it('should update with a new block number (unfiltered)', async () => {
checkpointer = new InMemoryCheckpointer();
blockEventListener = new BlockEventListener(networkStub, 'listener', (block) => {}, {replay: true, checkpointer: {factory: () => checkpointer}});
blockEventListener.eventHub = eventHubStub;
eventHubStub.registerBlockEvent.returns({});
await blockEventListener.register();
await blockEventListener._onEvent({header: {number: 2}});
await blockEventListener._onEvent({header: {number: 1}});
const checkpoint = await checkpointer.load();
expect(checkpoint.blockNumber).to.equal(2);
});

it('should set the start block', async() => {
channelStub.queryInfo.resolves({height: '3'});
checkpointer = new InMemoryCheckpointer();
Expand Down

0 comments on commit 302503e

Please sign in to comment.