jsonrpc.js tests && jsonrpc response validation is more strict
This commit is contained in:
parent
45134de740
commit
e58e2f5ee4
11
dist/ethereum.js
vendored
11
dist/ethereum.js
vendored
@ -973,9 +973,13 @@ var toPayload = function (method, params) {
|
|||||||
};
|
};
|
||||||
|
|
||||||
/// Should be called to check if jsonrpc response is valid
|
/// Should be called to check if jsonrpc response is valid
|
||||||
/// @returns true if response doesn't have error field
|
/// @returns true if response is valid, otherwise false
|
||||||
var isValidResponse = function (response) {
|
var isValidResponse = function (response) {
|
||||||
return response && !response.error;
|
return !!response &&
|
||||||
|
!response.error &&
|
||||||
|
response.jsonrpc === '2.0' &&
|
||||||
|
typeof response.id === 'number' &&
|
||||||
|
(!!response.result || typeof response.result === 'boolean');
|
||||||
};
|
};
|
||||||
|
|
||||||
/// Should be called to create batch payload object
|
/// Should be called to create batch payload object
|
||||||
@ -1051,6 +1055,7 @@ var ProviderManager = function() {
|
|||||||
var result = results[index];
|
var result = results[index];
|
||||||
|
|
||||||
if (!jsonrpc.isValidResponse(result)) {
|
if (!jsonrpc.isValidResponse(result)) {
|
||||||
|
console.log(result);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1083,7 +1088,7 @@ ProviderManager.prototype.send = function(data) {
|
|||||||
var result = this.provider.send(payload);
|
var result = this.provider.send(payload);
|
||||||
|
|
||||||
if (!jsonrpc.isValidResponse(result)) {
|
if (!jsonrpc.isValidResponse(result)) {
|
||||||
console.log(result.error);
|
console.log(result);
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
6
dist/ethereum.js.map
vendored
6
dist/ethereum.js.map
vendored
File diff suppressed because one or more lines are too long
2
dist/ethereum.min.js
vendored
2
dist/ethereum.min.js
vendored
File diff suppressed because one or more lines are too long
@ -39,9 +39,13 @@ var toPayload = function (method, params) {
|
|||||||
};
|
};
|
||||||
|
|
||||||
/// Should be called to check if jsonrpc response is valid
|
/// Should be called to check if jsonrpc response is valid
|
||||||
/// @returns true if response doesn't have error field
|
/// @returns true if response is valid, otherwise false
|
||||||
var isValidResponse = function (response) {
|
var isValidResponse = function (response) {
|
||||||
return response && !response.error;
|
return !!response &&
|
||||||
|
!response.error &&
|
||||||
|
response.jsonrpc === '2.0' &&
|
||||||
|
typeof response.id === 'number' &&
|
||||||
|
(!!response.result || typeof response.result === 'boolean');
|
||||||
};
|
};
|
||||||
|
|
||||||
/// Should be called to create batch payload object
|
/// Should be called to create batch payload object
|
||||||
|
@ -54,6 +54,7 @@ var ProviderManager = function() {
|
|||||||
var result = results[index];
|
var result = results[index];
|
||||||
|
|
||||||
if (!jsonrpc.isValidResponse(result)) {
|
if (!jsonrpc.isValidResponse(result)) {
|
||||||
|
console.log(result);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -86,7 +87,7 @@ ProviderManager.prototype.send = function(data) {
|
|||||||
var result = this.provider.send(payload);
|
var result = this.provider.send(payload);
|
||||||
|
|
||||||
if (!jsonrpc.isValidResponse(result)) {
|
if (!jsonrpc.isValidResponse(result)) {
|
||||||
console.log(result.error);
|
console.log(result);
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
128
test/jsonrpc.isValidResponse.js
Normal file
128
test/jsonrpc.isValidResponse.js
Normal file
@ -0,0 +1,128 @@
|
|||||||
|
var assert = require('assert');
|
||||||
|
var jsonrpc = require('../lib/jsonrpc');
|
||||||
|
|
||||||
|
describe('jsonrpc', function () {
|
||||||
|
describe('isValidResponse', function () {
|
||||||
|
it('should validate basic jsonrpc response', function () {
|
||||||
|
|
||||||
|
// given
|
||||||
|
var response = {
|
||||||
|
jsonrpc: '2.0',
|
||||||
|
id: 1,
|
||||||
|
result: []
|
||||||
|
};
|
||||||
|
|
||||||
|
// when
|
||||||
|
var valid = jsonrpc.isValidResponse(response);
|
||||||
|
|
||||||
|
// then
|
||||||
|
assert.equal(valid, true);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should validate basic undefined response', function () {
|
||||||
|
|
||||||
|
// given
|
||||||
|
var response = undefined;
|
||||||
|
|
||||||
|
// when
|
||||||
|
var valid = jsonrpc.isValidResponse(response);
|
||||||
|
|
||||||
|
// then
|
||||||
|
assert.equal(valid, false);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should validate jsonrpc response without jsonrpc field', function () {
|
||||||
|
|
||||||
|
// given
|
||||||
|
var response = {
|
||||||
|
id: 1,
|
||||||
|
result: []
|
||||||
|
};
|
||||||
|
|
||||||
|
// when
|
||||||
|
var valid = jsonrpc.isValidResponse(response);
|
||||||
|
|
||||||
|
// then
|
||||||
|
assert.equal(valid, false);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should validate jsonrpc response with wrong jsonrpc version', function () {
|
||||||
|
|
||||||
|
// given
|
||||||
|
var response = {
|
||||||
|
jsonrpc: '1.0',
|
||||||
|
id: 1,
|
||||||
|
result: []
|
||||||
|
};
|
||||||
|
|
||||||
|
// when
|
||||||
|
var valid = jsonrpc.isValidResponse(response);
|
||||||
|
|
||||||
|
// then
|
||||||
|
assert.equal(valid, false);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should validate jsonrpc response without id number', function () {
|
||||||
|
|
||||||
|
// given
|
||||||
|
var response = {
|
||||||
|
jsonrpc: '2.0',
|
||||||
|
result: []
|
||||||
|
};
|
||||||
|
|
||||||
|
// when
|
||||||
|
var valid = jsonrpc.isValidResponse(response);
|
||||||
|
|
||||||
|
// then
|
||||||
|
assert.equal(valid, false);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should validate jsonrpc response with wrong id field', function () {
|
||||||
|
|
||||||
|
// given
|
||||||
|
var response = {
|
||||||
|
jsonrpc: '2.0',
|
||||||
|
id: 'x',
|
||||||
|
result: []
|
||||||
|
};
|
||||||
|
|
||||||
|
// when
|
||||||
|
var valid = jsonrpc.isValidResponse(response);
|
||||||
|
|
||||||
|
// then
|
||||||
|
assert.equal(valid, false);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should validate jsonrpc response without result field', function () {
|
||||||
|
|
||||||
|
// given
|
||||||
|
var response = {
|
||||||
|
jsonrpc: '2.0',
|
||||||
|
id: 1
|
||||||
|
};
|
||||||
|
|
||||||
|
// when
|
||||||
|
var valid = jsonrpc.isValidResponse(response);
|
||||||
|
|
||||||
|
// then
|
||||||
|
assert.equal(valid, false);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should validate jsonrpc response with result field === false', function () {
|
||||||
|
|
||||||
|
// given
|
||||||
|
var response = {
|
||||||
|
jsonrpc: '2.0',
|
||||||
|
id: 1,
|
||||||
|
result: false
|
||||||
|
};
|
||||||
|
|
||||||
|
// when
|
||||||
|
var valid = jsonrpc.isValidResponse(response);
|
||||||
|
|
||||||
|
// then
|
||||||
|
assert.equal(valid, true);
|
||||||
|
});
|
||||||
|
|
||||||
|
});
|
||||||
|
});
|
47
test/jsonrpc.toBatchPayload.js
Normal file
47
test/jsonrpc.toBatchPayload.js
Normal file
@ -0,0 +1,47 @@
|
|||||||
|
var assert = require('assert');
|
||||||
|
var jsonrpc = require('../lib/jsonrpc');
|
||||||
|
|
||||||
|
describe('jsonrpc', function () {
|
||||||
|
describe('toBatchPayload', function () {
|
||||||
|
it('should create basic batch payload', function () {
|
||||||
|
|
||||||
|
// given
|
||||||
|
var messages = [{
|
||||||
|
method: 'helloworld'
|
||||||
|
}, {
|
||||||
|
method: 'test2',
|
||||||
|
params: [1]
|
||||||
|
}];
|
||||||
|
|
||||||
|
// when
|
||||||
|
var payload = jsonrpc.toBatchPayload(messages);
|
||||||
|
|
||||||
|
// then
|
||||||
|
assert.equal(payload instanceof Array, true);
|
||||||
|
assert.equal(payload.length, 2);
|
||||||
|
assert.equal(payload[0].jsonrpc, '2.0');
|
||||||
|
assert.equal(payload[1].jsonrpc, '2.0');
|
||||||
|
assert.equal(payload[0].method, 'helloworld');
|
||||||
|
assert.equal(payload[1].method, 'test2');
|
||||||
|
assert.equal(payload[0].params instanceof Array, true);
|
||||||
|
assert.equal(payload[1].params.length, 1);
|
||||||
|
assert.equal(payload[1].params[0], 1);
|
||||||
|
assert.equal(typeof payload[0].id, 'number');
|
||||||
|
assert.equal(typeof payload[1].id, 'number');
|
||||||
|
assert.equal(payload[0].id + 1, payload[1].id);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should create batch payload for empty input array', function () {
|
||||||
|
|
||||||
|
// given
|
||||||
|
var messages = [];
|
||||||
|
|
||||||
|
// when
|
||||||
|
var payload = jsonrpc.toBatchPayload(messages);
|
||||||
|
|
||||||
|
// then
|
||||||
|
assert.equal(payload instanceof Array, true);
|
||||||
|
assert.equal(payload.length, 0);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
40
test/jsonrpc.toPayload.js
Normal file
40
test/jsonrpc.toPayload.js
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
var assert = require('assert');
|
||||||
|
var jsonrpc = require('../lib/jsonrpc');
|
||||||
|
|
||||||
|
describe('jsonrpc', function () {
|
||||||
|
describe('toPayload', function () {
|
||||||
|
it('should create basic payload', function () {
|
||||||
|
|
||||||
|
// given
|
||||||
|
var method = 'helloworld';
|
||||||
|
|
||||||
|
// when
|
||||||
|
var payload = jsonrpc.toPayload(method);
|
||||||
|
|
||||||
|
// then
|
||||||
|
assert.equal(payload.jsonrpc, '2.0');
|
||||||
|
assert.equal(payload.method, method);
|
||||||
|
assert.equal(payload.params instanceof Array, true);
|
||||||
|
assert.equal(payload.params.length, 0);
|
||||||
|
assert.equal(typeof payload.id, 'number');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should create payload with params', function () {
|
||||||
|
|
||||||
|
// given
|
||||||
|
var method = 'helloworld1';
|
||||||
|
var params = [123, 'test'];
|
||||||
|
|
||||||
|
// when
|
||||||
|
var payload = jsonrpc.toPayload(method, params);
|
||||||
|
|
||||||
|
// then
|
||||||
|
assert.equal(payload.jsonrpc, '2.0');
|
||||||
|
assert.equal(payload.method, method);
|
||||||
|
assert.equal(payload.params.length, 2);
|
||||||
|
assert.equal(payload.params[0], params[0]);
|
||||||
|
assert.equal(payload.params[1], params[1]);
|
||||||
|
assert.equal(typeof payload.id, 'number');
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
Loading…
Reference in New Issue
Block a user