From 981c6da9cf65bc0e0277d17dd5ac60c9ce0b48a8 Mon Sep 17 00:00:00 2001 From: Tanuj Soni Date: Mon, 18 Mar 2019 19:58:50 +0530 Subject: [PATCH 01/18] [SER-25_compatibilityWithRest] Configuration of babel --- .babelrc | 5 +++++ package.json | 18 ++++++++++++------ 2 files changed, 17 insertions(+), 6 deletions(-) create mode 100644 .babelrc diff --git a/.babelrc b/.babelrc new file mode 100644 index 0000000..cedf24f --- /dev/null +++ b/.babelrc @@ -0,0 +1,5 @@ +{ + "presets": [ + "@babel/preset-env" + ] +} \ No newline at end of file diff --git a/package.json b/package.json index 43608e3..91873c7 100644 --- a/package.json +++ b/package.json @@ -6,9 +6,10 @@ "scripts": { "test": "find . -type f -name '*.test.js' ! -path './node_modules/*' | xargs mocha ", "test:hashmap": "mocha collections/hashmap/test/hashmap.test.js --config config.yaml -b", - "test:permission": "mocha auth/permission-manager/test/ --config config.yaml -b --api-debug", + "test:permission": "mocha auth/permission/test/ --config config.yaml -b --api-debug --compilers js:@babel/register", "test:user": "mocha auth/user/test/ --config config.yaml -b ", - "test:solc": "find . -name '*.sol' -print | xargs solc --allow-paths '.' 2>&1" + "test:solc": "find . -name '*.sol' -print | xargs solc --allow-paths '.' 2>&1", + "test:abc": "mocha auth/user/test/abc.test.js --config config.yaml -b --compilers js:@babel/register " }, "repository": { "type": "git", @@ -21,15 +22,20 @@ }, "homepage": "https://github.com/blockapps/blockapps-sol#readme", "dependencies": { - "blockapps-rest": "git://github.com/blockapps/blockapps-rest.git", + "@babel/cli": "^7.2.3", + "@babel/core": "^7.3.4", + "@babel/node": "^7.2.2", + "@babel/preset-env": "^7.3.4", + "@babel/register": "^7.0.0", + "blockapps-rest": "^7.0.1", + "chai": "^4.0.2", + "co": "^4.6.0", + "co-mocha": "^1.2.0", "eslint": "^4.19.1", "eslint-config-airbnb": "^17.0.0", "eslint-plugin-import": "^2.13.0", "eslint-plugin-jsx-a11y": "^6.0.3", "eslint-plugin-react": "^7.10.0", - "chai": "^4.0.2", - "co": "^4.6.0", - "co-mocha": "^1.2.0", "mocha": "^3.4.2" } } From 293d80a1d45ae918263249b0664018bfe4a8baa8 Mon Sep 17 00:00:00 2001 From: Tanuj Soni Date: Tue, 19 Mar 2019 20:01:25 +0530 Subject: [PATCH 02/18] [SER-25_compatibilityWithRest] PermissionManager compatible with new rest --- auth/permission/contracts/EventLogType.sol | 9 ++ .../contracts/PermissionManager.sol | 11 +- auth/permission/permissionManager.js | 102 +++++++----- .../permission/test/permissionManager.test.js | 150 +++++++++++------- config.yaml | 7 +- package.json | 2 + util/config.js | 11 ++ 7 files changed, 187 insertions(+), 105 deletions(-) create mode 100644 auth/permission/contracts/EventLogType.sol create mode 100644 util/config.js diff --git a/auth/permission/contracts/EventLogType.sol b/auth/permission/contracts/EventLogType.sol new file mode 100644 index 0000000..aa3b225 --- /dev/null +++ b/auth/permission/contracts/EventLogType.sol @@ -0,0 +1,9 @@ +contract EventLogType { + // event log type + enum EventLogType { // TODO expose -LS + NULL, + GRANT, + REVOKE, + CHECK + } +} \ No newline at end of file diff --git a/auth/permission/contracts/PermissionManager.sol b/auth/permission/contracts/PermissionManager.sol index 8816497..f75f38b 100644 --- a/auth/permission/contracts/PermissionManager.sol +++ b/auth/permission/contracts/PermissionManager.sol @@ -1,9 +1,10 @@ import "../../../rest/contracts/RestStatus.sol"; +import "./EventLogType.sol"; /** * Permission Manager for all */ -contract PermissionManager is RestStatus { +contract PermissionManager is RestStatus, EventLogType { // master account address master; // owner account @@ -30,14 +31,6 @@ contract PermissionManager is RestStatus { uint result; } - // event log type - enum EventLogType { // TODO expose -LS - NULL, - GRANT, - REVOKE, - CHECK - } - // event log EventLogEntry[] eventLog; diff --git a/auth/permission/permissionManager.js b/auth/permission/permissionManager.js index 459cce2..c3aaf28 100644 --- a/auth/permission/permissionManager.js +++ b/auth/permission/permissionManager.js @@ -1,14 +1,16 @@ const ba = require('blockapps-rest'); -const util = ba.common.util; -const BigNumber = ba.common.BigNumber; -const config = ba.common.config; -const rest = ba[`rest${config.restVersion ? config.restVersion : ''}`]; +const { utils, importer } = ba; +const { getYamlFile } = require('../../util/config'); +const { createContract, getState, call } = ba.default; +const config = getYamlFile('config.yaml'); +const logger = console const contractName = 'PermissionManager'; -const contractFilename = `${config.libPath}/auth/permission/contracts/PermissionManager.sol`; -const RestStatus = rest.getFields(`${config.libPath}/rest/contracts/RestStatus.sol`); +const contractFilename = `./auth/permission/contracts/PermissionManager.sol`; +// TODO: do some research on getFields +// const RestStatus = rest.getFields(`./rest/contracts/RestStatus.sol`); -util.bitmaskToEnumString = function (bitmask, bitmaskEnum) { +utils.bitmaskToEnumString = function (bitmask, bitmaskEnum) { const strings = [] for (let i = 0; i < bitmaskEnum.MAX; i++) { const mask = (1 << i) @@ -23,11 +25,16 @@ util.bitmaskToEnumString = function (bitmask, bitmaskEnum) { function* uploadContract(admin, master) { // NOTE: in production, the contract is created and owned by the AdminInterface // for testing purposes the creator is the admin user - const args = { - owner: admin.address, - master: master.address, + const contractArgs = { + name: contractName, + source: yield importer.combine(contractFilename), + args: { + _master: master.address, + _owner: admin.address + } } - const contract = yield rest.uploadContract(admin, contractName, contractFilename, util.usc(args)); + + const contract = yield createContract(admin, contractArgs, { config, logger }) contract.src = 'removed'; return bind(admin, contract); } @@ -35,14 +42,14 @@ function* uploadContract(admin, master) { function* createPermissionsAdmin(admin, master, permissions) { const contract = yield uploadContract(admin, master); // add permission to create and modify contracts - const args = {address: admin.address, id: admin.name, permissions: permissions}; + const args = { address: admin.address, id: admin.name, permissions: permissions }; yield contract.grant(args); return contract; } function bind(admin, contract) { contract.getState = function* () { - return yield rest.getState(contract); + return yield getState(contract, { config }); } contract.grant = function* (args) { return yield grant(admin, contract, args); @@ -79,11 +86,15 @@ function bindAddress(admin, address) { // throws: ErrorCodes // returns: updated permissions function* grant(admin, contract, args) { - rest.verbose('grant', args); // function grant(address _address, uint _permissions) returns (ErrorCodes) { - const method = 'grant'; - const [restStatus, permissions] = yield rest.callMethod(admin, contract, method, util.usc(args)); - if (restStatus != RestStatus.OK) { + const callArgs = { + contract, + method: 'grant', + args: utils.usc(args) + } + + const [restStatus, permissions] = yield call(admin, callArgs, { config }); + if (restStatus != '200') { throw new Error(restStatus); } return permissions; @@ -92,12 +103,16 @@ function* grant(admin, contract, args) { // throws: ErrorCodes // returns: permissions function* getPermissions(admin, contract, args) { - rest.verbose('getPermissions', args); // function getPermissions(address _address) returns (ErrorCodes, uint) { - const method = 'getPermissions'; - const [restStatus, permissions] = yield rest.callMethod(admin, contract, method, util.usc(args)); - if (restStatus != RestStatus.OK) { - throw new rest.RestError(restStatus, method, args); + const callArgs = { + contract, + method: 'getPermissions', + args: utils.usc(args) + } + + const [restStatus, permissions] = yield call(admin, callArgs, { config }); + if (restStatus != '200') { + throw new utils.RestError(restStatus, callArgs.method, callArgs.args); } return permissions; } @@ -105,11 +120,15 @@ function* getPermissions(admin, contract, args) { // throws: ErrorCodes // returns: true if permitted function* check(admin, contract, args) { - rest.verbose('check', args); // function check(address _address, uint _permissions) returns (ErrorCodes) { - const method = 'check'; - const [restStatus] = yield rest.callMethod(admin, contract, method, util.usc(args)); - if (restStatus != RestStatus.OK) { + const callArgs = { + contract, + method: 'check', + args: utils.usc(args) + } + + const [restStatus] = yield call(admin, callArgs, { config }); + if (restStatus != '200') { return false; } return true; @@ -117,22 +136,31 @@ function* check(admin, contract, args) { // throws: ErrorCodes function* revoke(admin, contract, args) { - rest.verbose('revoke', args); // function revoke(address _address) returns (ErrorCodes) { - const method = 'revoke'; - const [restStatus] = yield rest.callMethod(admin, contract, method, util.usc(args)); - if (restStatus != RestStatus.OK) { - throw new rest.RestError(restStatus, method, args); + const callArgs = { + contract, + method: 'revoke', + args: utils.usc(args) } - return RestStatus.OK; + + const [restStatus] = yield call(admin, callArgs, { config }); + if (restStatus != '200') { + throw new utils.RestError(restStatus, callArgs.method, callArgs.args); + } + return '200'; } // transferOwnership function* transferOwnership(admin, contract, args) { - const method = "transferOwnership"; - const [restStatus] = yield rest.callMethod(admin, contract, method, util.usc(args)); + const callArgs = { + contract, + method: 'transferOwnership', + args: utils.usc(args) + } + + const [restStatus] = yield call(admin, callArgs, {}); if (restStatus != RestStatus.OK) { - throw new rest.RestError(restStatus, method, args); + throw new RestError(restStatus, method, args); } return RestStatus.OK; } @@ -142,7 +170,7 @@ function* listPermits(admin, contract, args) { const { permits } = yield contract.getState() const permitsJson = permits.map((permit) => { permit.permissionsHex = Number(permit.permissions).toString(16) - permit.strings = util.bitmaskToEnumString(permit.permissions, args.enum) + permit.strings = utils.bitmaskToEnumString(permit.permissions, args.enum) return permit }) return permitsJson @@ -152,7 +180,7 @@ function* listEvents(admin, contract, args) { const { eventLog } = yield contract.getState() const eventsJson = eventLog.map((event) => { event.permissionsHex = Number(event.permissions).toString(16) - event.strings = util.bitmaskToEnumString(event.permissions, args.enum) + event.strings = utils.bitmaskToEnumString(event.permissions, args.enum) return event }) return eventsJson diff --git a/auth/permission/test/permissionManager.test.js b/auth/permission/test/permissionManager.test.js index 56ba8a9..4e778da 100644 --- a/auth/permission/test/permissionManager.test.js +++ b/auth/permission/test/permissionManager.test.js @@ -1,30 +1,31 @@ require('co-mocha') +const { assert } = require('chai') const ba = require('blockapps-rest') - -const { config, util, assert, cwd } = ba.common -const rest = ba[`rest${config.restVersion ? config.restVersion : ''}`]; +const { getYamlFile } = require('../../../util/config'); +const config = getYamlFile('config.yaml'); +const { createUser, call } = ba.default; +const { utils, parse } = ba const permissionManagerJs = require('../permissionManager') -const RestStatus = rest.getFields(`${cwd}/rest/contracts/RestStatus.sol`) +// const RestStatus = rest.getFields(`${cwd}/rest/contracts/RestStatus.sol`) -const adminName = util.uid('Admin') +const adminName = utils.uid('Admin') const adminPassword = '1234' -const masterName = util.uid('Master') +const masterName = utils.uid('Master') const masterPassword = '5678' -const { EventLogType } = rest.getEnums(`${cwd}/auth/permission/contracts/PermissionManager.sol`); - -describe('PermissionManager tests', function() { - this.timeout(config.timeout) +describe('PermissionManager tests', function () { + this.timeout(config.timeout); - let admin, master + let admin, master, EventLogType; // get ready: admin-user and manager-contract before(function* () { + EventLogType = yield parse.parseEnumUsingFile(`${utils.cwd}/auth/permission/contracts/EventLogType.sol`); console.log('creating admin') - admin = yield rest.createUser(adminName, adminPassword) + admin = yield createUser({ username: adminName, password: adminPassword }, { config }) console.log('creating master') - master = yield rest.createUser(masterName, masterPassword) + master = yield createUser({ username: masterName, password: masterPassword }, { config }) }) it('upload', function* () { @@ -37,7 +38,7 @@ describe('PermissionManager tests', function() { it('Grant (address with permissions)', function* () { const contract = yield permissionManagerJs.uploadContract(admin, master) - const uid = util.uid() + const uid = utils.uid() const args = yield createPermitArgs(uid) const permissions = yield contract.grant(args) assert.equal(permissions, args.permissions, 'permissions added') @@ -51,7 +52,7 @@ describe('PermissionManager tests', function() { it('Grant Multiple Permissions', function* () { const contract = yield permissionManagerJs.uploadContract(admin, master) - const uid = util.uid() + const uid = utils.uid() const args = yield createPermitArgs(uid) // add permit { @@ -70,7 +71,7 @@ describe('PermissionManager tests', function() { it('Get permit', function* () { const contract = yield permissionManagerJs.uploadContract(admin, master) - const uid = util.uid() + const uid = utils.uid() const permitArgs = yield createPermitArgs(uid) yield contract.grant(permitArgs) const args = { address: permitArgs.address } @@ -89,15 +90,17 @@ describe('PermissionManager tests', function() { const contract = yield permissionManagerJs.uploadContract(admin, master) const args = { address: 1234 } - yield assert.shouldThrowRest(function* () { + try { const permissions = yield contract.getPermissions(args) - }, RestStatus.NOT_FOUND) + } catch (e) { + assert.equal(e.status, 404, 'should Throws 404 Not found') + } }) it.skip('Get permit - history', function* () { const contract = yield permissionManagerJs.uploadContract(admin, master) - const uid = util.uid() + const uid = utils.uid() const permitArgs = yield createPermitArgs(uid) yield contract.grant(permitArgs) // found @@ -122,7 +125,7 @@ describe('PermissionManager tests', function() { it('Check permissions', function* () { const contract = yield permissionManagerJs.uploadContract(admin, master) - const uid = util.uid() + const uid = utils.uid() const permitArgs = yield createPermitArgs(uid) yield contract.grant(permitArgs) // check @@ -139,7 +142,7 @@ describe('PermissionManager tests', function() { it('Revoke permissions', function* () { const contract = yield permissionManagerJs.uploadContract(admin, master) - const uid = util.uid() + const uid = utils.uid() const permitArgs = yield createPermitArgs(uid) yield contract.grant(permitArgs) // get permissions @@ -159,79 +162,115 @@ describe('PermissionManager tests', function() { } }) + // TODO: check this in last it('Revoke - 404', function* () { const contract = yield permissionManagerJs.uploadContract(admin, master) const args = { address: 1234 } - yield assert.shouldThrowRest(function* () { + // TODO: Add shouldThrowRest in util or blockapps-rest + // yield assert.shouldThrowRest(function* () { + // yield contract.revoke(args) + // }, RestStatus.BAD_REQUEST) + try { yield contract.revoke(args) - }, RestStatus.BAD_REQUEST) + } catch (e) { + assert.equal(e.status, '400', 'should throws 404 Not found') + } }) it('Transfer Ownership - AUTHORIZED', function* () { - const uid = util.uid() - const newOwner = yield rest.createUser('NewOwner_' + uid, '' + uid) + const uid = utils.uid() + const newOwner = yield createUser({username: `NewOwner_${uid}`, password: '1234'}, { config }) const contract = yield permissionManagerJs.uploadContract(admin, master) // transfer ownership to a new admin, by the master { - const args = { newOwner: newOwner.address } - const method = 'transferOwnership' - const [restStatus] = yield rest.callMethod(master, contract, method, util.usc(args)) - assert.equal(restStatus, RestStatus.OK, 'should succeed') + const callArgs = { + contract, + method: 'transferOwnership', + args: utils.usc({ newOwner: newOwner.address }) + } + + const [restStatus] = yield call(master, callArgs, { config }) + assert.equal(restStatus, 200, 'should succeed') } }) it('Transfer Ownership - positive case', function* () { - const uid = util.uid() - const newOwner = yield rest.createUser('NewOwner_' + uid, '' + uid) + const uid = utils.uid() + const newOwner = yield createUser({username: `NewOwner_${uid}`, password: '1234'}, { config }) const contract = yield permissionManagerJs.uploadContract(admin, master) // admin works const args = yield createPermitArgs(uid) yield contract.grant(args) // new admin unauthorized { - const method = 'grant' - const [restStatus, permissions] = yield rest.callMethod(newOwner, contract, method, util.usc(args)) - assert.equal(restStatus, RestStatus.UNAUTHORIZED, 'should fail') + const callArgs = { + contract, + method: 'grant', + args: utils.usc(args) + } + const [restStatus, permissions] = yield call(newOwner, callArgs, { config }) + assert.equal(restStatus, 401, 'should fail') } // transfer ownership - must be master { const args = { newOwner: newOwner.address } - const method = 'transferOwnership' - const [restStatus] = yield rest.callMethod(master, contract, method, util.usc(args)) - assert.equal(restStatus, RestStatus.OK, 'should succeed') + const callArgs = { + contract, + method: 'transferOwnership', + args: utils.usc(args) + } + + const [restStatus] = yield call(master, callArgs, { config }) + assert.equal(restStatus, '200', 'should succeed') } // old admin unauthorized { - const method = 'grant' - const [restStatus, permissions] = yield rest.callMethod(admin, contract, method, util.usc(args)) - assert.equal(restStatus, RestStatus.UNAUTHORIZED, 'should fail') + const callArgs = { + contract, + method: 'grant', + args: utils.usc(args) + } + + const [restStatus, permissions] = yield call(admin, callArgs, { config }) + assert.equal(restStatus, '401', 'should fail') } // new admin works { - const method = 'grant' - const [restStatus, permissions] = yield rest.callMethod(newOwner, contract, method, util.usc(args)) - assert.equal(restStatus, RestStatus.OK, 'should succeed') + const callArgs = { + contract, + method: 'grant', + args: utils.usc(args) + } + + const [restStatus, permissions] = yield call(newOwner, callArgs, { config }) + assert.equal(restStatus, '200', 'should succeed') } }) it('Transfer Ownership - UNAUTHORIZED', function* () { - const uid = util.uid() + const uid = utils.uid() const contract = yield permissionManagerJs.uploadContract(admin, master) // transfer ownership to attacker { - const attacker = yield rest.createUser('Attacker_' + uid, '' + uid) + const attacker = yield createUser({username: `Attacker_${uid}`, password: '1234'}, { config }) const args = { newOwner: attacker.address } - const method = 'transferOwnership' - const [restStatus, permissions] = yield rest.callMethod(attacker, contract, method, util.usc(args)) - assert.equal(restStatus, RestStatus.UNAUTHORIZED, 'should fail') + + const callArgs = { + contract, + method: 'transferOwnership', + args: utils.usc(args) + } + + const [restStatus, permissions] = yield call(attacker, callArgs, { config }) + assert.equal(restStatus, '401', 'should fail') } }) it('EventLog - Check permissions', function* () { const contract = yield permissionManagerJs.uploadContract(admin, master) - const uid = util.uid() + const uid = utils.uid() const permitArgs = yield createPermitArgs(uid) yield contract.grant(permitArgs) // check OK - should not be logged @@ -256,14 +295,14 @@ describe('PermissionManager tests', function() { assert.equal(eventLogEntry.id, '', 'id') assert.equal(eventLogEntry.adrs, args.address, 'address') assert.equal(eventLogEntry.permissions, args.permissions, 'permissions') - assert.equal(eventLogEntry.result, RestStatus.UNAUTHORIZED, 'result') + assert.equal(eventLogEntry.result, '401', 'result') } }) it('EventLog - Grant', function* () { const contract = yield permissionManagerJs.uploadContract(admin, master) - const uid = util.uid() + const uid = utils.uid() const args = yield createPermitArgs(uid) yield contract.grant(args) // event log @@ -276,13 +315,13 @@ describe('PermissionManager tests', function() { assert.equal(eventLogEntry.id, args.id, 'id') assert.equal(eventLogEntry.adrs, args.address, 'address') assert.equal(eventLogEntry.permissions, args.permissions, 'permissions') - assert.equal(eventLogEntry.result, RestStatus.OK, 'result') + assert.equal(eventLogEntry.result, '200', 'result') }) it('EventLog - Revoke', function* () { const contract = yield permissionManagerJs.uploadContract(admin, master) - const uid = util.uid() + const uid = utils.uid() const permitArgs = yield createPermitArgs(uid) yield contract.grant(permitArgs) // revoke @@ -300,13 +339,14 @@ describe('PermissionManager tests', function() { assert.equal(eventLogEntry.id, '', 'id') assert.equal(eventLogEntry.adrs, permitArgs.address, 'address') assert.equal(eventLogEntry.permissions, 0, 'permissions') - assert.equal(eventLogEntry.result, RestStatus.OK, 'result') + assert.equal(eventLogEntry.result, '200', 'result') }) }) function* createPermitArgs(uid) { - const user = yield rest.createUser(uid, uid) + // TODO: make it as a args + const user = yield createUser({ username: `username_${uid}`, password: adminPassword }, { config }) const permissions = 0x3 const args = { diff --git a/config.yaml b/config.yaml index 92561cc..4635868 100644 --- a/config.yaml +++ b/config.yaml @@ -8,7 +8,6 @@ restVersion: 5 # node 0 is the default url for all single node api calls nodes: - id: 0 - explorerUrl: 'http://localhost:9000' - stratoUrl: 'http://localhost/strato-api' - blocUrl: 'http://localhost/bloc/v2.2' - searchUrl: 'http://localhost/cirrus' + url: 'http://localhost' + publicKey: '6d8a80d14311c39f35f516fa664deaaaa13e85b2f7493f37f6144d86991ec012937307647bd3b9a82abe2974e1407241d54947bbb39763a4cac9f77166ad92a0' + port: 30303 diff --git a/package.json b/package.json index 91873c7..4ca9f6f 100644 --- a/package.json +++ b/package.json @@ -36,6 +36,8 @@ "eslint-plugin-import": "^2.13.0", "eslint-plugin-jsx-a11y": "^6.0.3", "eslint-plugin-react": "^7.10.0", + "fs": "^0.0.1-security", + "js-yaml": "^3.12.2", "mocha": "^3.4.2" } } diff --git a/util/config.js b/util/config.js new file mode 100644 index 0000000..5390048 --- /dev/null +++ b/util/config.js @@ -0,0 +1,11 @@ +const fs = require('fs'); +const yaml = require('js-yaml'); + +// read a yaml or die +function getYamlFile(yamlFilename) { + return yaml.safeLoad(fs.readFileSync(yamlFilename, 'utf8')); +} + +module.exports = { + getYamlFile +}; From 6c15b7f104ff517b589e1be677404e55693ef464 Mon Sep 17 00:00:00 2001 From: Tanuj Soni Date: Wed, 20 Mar 2019 11:23:09 +0530 Subject: [PATCH 03/18] [SER-25_compatibilityWithRest] PermissionManager compatibility with barf-develop --- auth/permission/permissionManager.js | 29 +++-- .../permission/test/permissionManager.test.js | 105 ++++++++++-------- package.json | 2 +- rest/contracts/RestStatus.sol | 6 +- util/config.js | 1 + 5 files changed, 77 insertions(+), 66 deletions(-) diff --git a/auth/permission/permissionManager.js b/auth/permission/permissionManager.js index c3aaf28..1b0abc3 100644 --- a/auth/permission/permissionManager.js +++ b/auth/permission/permissionManager.js @@ -1,16 +1,15 @@ -const ba = require('blockapps-rest'); -const { utils, importer } = ba; +const { rest, util, importer } = require('blockapps-rest'); const { getYamlFile } = require('../../util/config'); -const { createContract, getState, call } = ba.default; +const { createContract, getState, call, RestError } = rest; const config = getYamlFile('config.yaml'); -const logger = console +// const logger = console const contractName = 'PermissionManager'; const contractFilename = `./auth/permission/contracts/PermissionManager.sol`; // TODO: do some research on getFields // const RestStatus = rest.getFields(`./rest/contracts/RestStatus.sol`); -utils.bitmaskToEnumString = function (bitmask, bitmaskEnum) { +util.bitmaskToEnumString = function (bitmask, bitmaskEnum) { const strings = [] for (let i = 0; i < bitmaskEnum.MAX; i++) { const mask = (1 << i) @@ -34,7 +33,7 @@ function* uploadContract(admin, master) { } } - const contract = yield createContract(admin, contractArgs, { config, logger }) + const contract = yield createContract(admin, contractArgs, { config }) contract.src = 'removed'; return bind(admin, contract); } @@ -90,7 +89,7 @@ function* grant(admin, contract, args) { const callArgs = { contract, method: 'grant', - args: utils.usc(args) + args: util.usc(args) } const [restStatus, permissions] = yield call(admin, callArgs, { config }); @@ -107,12 +106,12 @@ function* getPermissions(admin, contract, args) { const callArgs = { contract, method: 'getPermissions', - args: utils.usc(args) + args: util.usc(args) } const [restStatus, permissions] = yield call(admin, callArgs, { config }); if (restStatus != '200') { - throw new utils.RestError(restStatus, callArgs.method, callArgs.args); + throw new RestError(restStatus, callArgs.method, callArgs.args); } return permissions; } @@ -124,7 +123,7 @@ function* check(admin, contract, args) { const callArgs = { contract, method: 'check', - args: utils.usc(args) + args: util.usc(args) } const [restStatus] = yield call(admin, callArgs, { config }); @@ -140,12 +139,12 @@ function* revoke(admin, contract, args) { const callArgs = { contract, method: 'revoke', - args: utils.usc(args) + args: util.usc(args) } const [restStatus] = yield call(admin, callArgs, { config }); if (restStatus != '200') { - throw new utils.RestError(restStatus, callArgs.method, callArgs.args); + throw new RestError(restStatus, callArgs.method, callArgs.args); } return '200'; } @@ -155,7 +154,7 @@ function* transferOwnership(admin, contract, args) { const callArgs = { contract, method: 'transferOwnership', - args: utils.usc(args) + args: util.usc(args) } const [restStatus] = yield call(admin, callArgs, {}); @@ -170,7 +169,7 @@ function* listPermits(admin, contract, args) { const { permits } = yield contract.getState() const permitsJson = permits.map((permit) => { permit.permissionsHex = Number(permit.permissions).toString(16) - permit.strings = utils.bitmaskToEnumString(permit.permissions, args.enum) + permit.strings = util.bitmaskToEnumString(permit.permissions, args.enum) return permit }) return permitsJson @@ -180,7 +179,7 @@ function* listEvents(admin, contract, args) { const { eventLog } = yield contract.getState() const eventsJson = eventLog.map((event) => { event.permissionsHex = Number(event.permissions).toString(16) - event.strings = utils.bitmaskToEnumString(event.permissions, args.enum) + event.strings = util.bitmaskToEnumString(event.permissions, args.enum) return event }) return eventsJson diff --git a/auth/permission/test/permissionManager.test.js b/auth/permission/test/permissionManager.test.js index 4e778da..5e0fe77 100644 --- a/auth/permission/test/permissionManager.test.js +++ b/auth/permission/test/permissionManager.test.js @@ -1,27 +1,32 @@ require('co-mocha') const { assert } = require('chai') -const ba = require('blockapps-rest') +const { rest, util, parser, fsUtil } = require('blockapps-rest'); const { getYamlFile } = require('../../../util/config'); +const { createUser, call } = rest; + const config = getYamlFile('config.yaml'); -const { createUser, call } = ba.default; -const { utils, parse } = ba const permissionManagerJs = require('../permissionManager') -// const RestStatus = rest.getFields(`${cwd}/rest/contracts/RestStatus.sol`) -const adminName = utils.uid('Admin') +const adminName = util.uid('Admin') const adminPassword = '1234' -const masterName = utils.uid('Master') +const masterName = util.uid('Master') const masterPassword = '5678' describe('PermissionManager tests', function () { this.timeout(config.timeout); - let admin, master, EventLogType; + let admin, master, EventLogType, RestStatus; // get ready: admin-user and manager-contract before(function* () { - EventLogType = yield parse.parseEnumUsingFile(`${utils.cwd}/auth/permission/contracts/EventLogType.sol`); + // parse Enums + const restStatusSource = fsUtil.get(`${util.cwd}/rest/contracts/RestStatus.sol`) + RestStatus = yield parser.parseFields(restStatusSource); + + const source = fsUtil.get(`${util.cwd}/auth/permission/contracts/EventLogType.sol`) + EventLogType = yield parser.parseEnum(source); + console.log('creating admin') admin = yield createUser({ username: adminName, password: adminPassword }, { config }) console.log('creating master') @@ -38,7 +43,7 @@ describe('PermissionManager tests', function () { it('Grant (address with permissions)', function* () { const contract = yield permissionManagerJs.uploadContract(admin, master) - const uid = utils.uid() + const uid = util.uid() const args = yield createPermitArgs(uid) const permissions = yield contract.grant(args) assert.equal(permissions, args.permissions, 'permissions added') @@ -52,7 +57,7 @@ describe('PermissionManager tests', function () { it('Grant Multiple Permissions', function* () { const contract = yield permissionManagerJs.uploadContract(admin, master) - const uid = utils.uid() + const uid = util.uid() const args = yield createPermitArgs(uid) // add permit { @@ -71,7 +76,7 @@ describe('PermissionManager tests', function () { it('Get permit', function* () { const contract = yield permissionManagerJs.uploadContract(admin, master) - const uid = utils.uid() + const uid = util.uid() const permitArgs = yield createPermitArgs(uid) yield contract.grant(permitArgs) const args = { address: permitArgs.address } @@ -91,16 +96,16 @@ describe('PermissionManager tests', function () { const args = { address: 1234 } try { - const permissions = yield contract.getPermissions(args) + yield contract.getPermissions(args) } catch (e) { - assert.equal(e.status, 404, 'should Throws 404 Not found') + assert.equal(e.response.status, '404', 'should Throws 404 Not found') } }) it.skip('Get permit - history', function* () { const contract = yield permissionManagerJs.uploadContract(admin, master) - const uid = utils.uid() + const uid = util.uid() const permitArgs = yield createPermitArgs(uid) yield contract.grant(permitArgs) // found @@ -125,7 +130,7 @@ describe('PermissionManager tests', function () { it('Check permissions', function* () { const contract = yield permissionManagerJs.uploadContract(admin, master) - const uid = utils.uid() + const uid = util.uid() const permitArgs = yield createPermitArgs(uid) yield contract.grant(permitArgs) // check @@ -142,7 +147,7 @@ describe('PermissionManager tests', function () { it('Revoke permissions', function* () { const contract = yield permissionManagerJs.uploadContract(admin, master) - const uid = utils.uid() + const uid = util.uid() const permitArgs = yield createPermitArgs(uid) yield contract.grant(permitArgs) // get permissions @@ -162,7 +167,6 @@ describe('PermissionManager tests', function () { } }) - // TODO: check this in last it('Revoke - 404', function* () { const contract = yield permissionManagerJs.uploadContract(admin, master) @@ -174,30 +178,30 @@ describe('PermissionManager tests', function () { try { yield contract.revoke(args) } catch (e) { - assert.equal(e.status, '400', 'should throws 404 Not found') + assert.equal(e.response.status, RestStatus.BAD_REQUEST, 'should throws 404 Not found') } }) it('Transfer Ownership - AUTHORIZED', function* () { - const uid = utils.uid() - const newOwner = yield createUser({username: `NewOwner_${uid}`, password: '1234'}, { config }) + const uid = util.uid() + const newOwner = yield createUser({ username: `NewOwner_${uid}`, password: '1234' }, { config }) const contract = yield permissionManagerJs.uploadContract(admin, master) // transfer ownership to a new admin, by the master { const callArgs = { contract, method: 'transferOwnership', - args: utils.usc({ newOwner: newOwner.address }) + args: util.usc({ newOwner: newOwner.address }) } const [restStatus] = yield call(master, callArgs, { config }) - assert.equal(restStatus, 200, 'should succeed') + assert.equal(restStatus, RestStatus.OK, 'should succeed') } }) it('Transfer Ownership - positive case', function* () { - const uid = utils.uid() - const newOwner = yield createUser({username: `NewOwner_${uid}`, password: '1234'}, { config }) + const uid = util.uid() + const newOwner = yield createUser({ username: `NewOwner_${uid}`, password: '1234' }, { config }) const contract = yield permissionManagerJs.uploadContract(admin, master) // admin works const args = yield createPermitArgs(uid) @@ -207,10 +211,10 @@ describe('PermissionManager tests', function () { const callArgs = { contract, method: 'grant', - args: utils.usc(args) + args: util.usc(args) } const [restStatus, permissions] = yield call(newOwner, callArgs, { config }) - assert.equal(restStatus, 401, 'should fail') + assert.equal(restStatus, RestStatus.UNAUTHORIZED, 'should fail') } // transfer ownership - must be master { @@ -218,59 +222,59 @@ describe('PermissionManager tests', function () { const callArgs = { contract, method: 'transferOwnership', - args: utils.usc(args) + args: util.usc(args) } const [restStatus] = yield call(master, callArgs, { config }) - assert.equal(restStatus, '200', 'should succeed') + assert.equal(restStatus, RestStatus.OK, 'should succeed') } // old admin unauthorized { const callArgs = { contract, method: 'grant', - args: utils.usc(args) + args: util.usc(args) } - const [restStatus, permissions] = yield call(admin, callArgs, { config }) - assert.equal(restStatus, '401', 'should fail') + const [restStatus] = yield call(admin, callArgs, { config }) + assert.equal(restStatus, RestStatus.UNAUTHORIZED, 'should fail') } // new admin works { const callArgs = { contract, method: 'grant', - args: utils.usc(args) + args: util.usc(args) } - const [restStatus, permissions] = yield call(newOwner, callArgs, { config }) - assert.equal(restStatus, '200', 'should succeed') + const [restStatus] = yield call(newOwner, callArgs, { config }) + assert.equal(restStatus, RestStatus.OK, 'should succeed') } }) it('Transfer Ownership - UNAUTHORIZED', function* () { - const uid = utils.uid() + const uid = util.uid() const contract = yield permissionManagerJs.uploadContract(admin, master) // transfer ownership to attacker { - const attacker = yield createUser({username: `Attacker_${uid}`, password: '1234'}, { config }) + const attacker = yield createUser({ username: `Attacker_${uid}`, password: '1234' }, { config }) const args = { newOwner: attacker.address } - + const callArgs = { contract, method: 'transferOwnership', - args: utils.usc(args) + args: util.usc(args) } - const [restStatus, permissions] = yield call(attacker, callArgs, { config }) - assert.equal(restStatus, '401', 'should fail') + const [restStatus] = yield call(attacker, callArgs, { config }) + assert.equal(restStatus, RestStatus.UNAUTHORIZED, 'should fail') } }) it('EventLog - Check permissions', function* () { const contract = yield permissionManagerJs.uploadContract(admin, master) - const uid = utils.uid() + const uid = util.uid() const permitArgs = yield createPermitArgs(uid) yield contract.grant(permitArgs) // check OK - should not be logged @@ -295,14 +299,14 @@ describe('PermissionManager tests', function () { assert.equal(eventLogEntry.id, '', 'id') assert.equal(eventLogEntry.adrs, args.address, 'address') assert.equal(eventLogEntry.permissions, args.permissions, 'permissions') - assert.equal(eventLogEntry.result, '401', 'result') + assert.equal(eventLogEntry.result, RestStatus.UNAUTHORIZED, 'result') } }) it('EventLog - Grant', function* () { const contract = yield permissionManagerJs.uploadContract(admin, master) - const uid = utils.uid() + const uid = util.uid() const args = yield createPermitArgs(uid) yield contract.grant(args) // event log @@ -315,13 +319,13 @@ describe('PermissionManager tests', function () { assert.equal(eventLogEntry.id, args.id, 'id') assert.equal(eventLogEntry.adrs, args.address, 'address') assert.equal(eventLogEntry.permissions, args.permissions, 'permissions') - assert.equal(eventLogEntry.result, '200', 'result') + assert.equal(eventLogEntry.result, RestStatus.OK, 'result') }) it('EventLog - Revoke', function* () { const contract = yield permissionManagerJs.uploadContract(admin, master) - const uid = utils.uid() + const uid = util.uid() const permitArgs = yield createPermitArgs(uid) yield contract.grant(permitArgs) // revoke @@ -339,14 +343,19 @@ describe('PermissionManager tests', function () { assert.equal(eventLogEntry.id, '', 'id') assert.equal(eventLogEntry.adrs, permitArgs.address, 'address') assert.equal(eventLogEntry.permissions, 0, 'permissions') - assert.equal(eventLogEntry.result, '200', 'result') + assert.equal(eventLogEntry.result, RestStatus.OK, 'result') }) }) function* createPermitArgs(uid) { - // TODO: make it as a args - const user = yield createUser({ username: `username_${uid}`, password: adminPassword }, { config }) + // TODO: + const userArgs = { + username: `username_${uid}`, + password: adminPassword + }; + + const user = yield createUser(userArgs, { config }) const permissions = 0x3 const args = { diff --git a/package.json b/package.json index 4ca9f6f..23a25c5 100644 --- a/package.json +++ b/package.json @@ -27,7 +27,7 @@ "@babel/node": "^7.2.2", "@babel/preset-env": "^7.3.4", "@babel/register": "^7.0.0", - "blockapps-rest": "^7.0.1", + "blockapps-rest": "git://github.com/blockapps/blockapps-rest#barf-develop", "chai": "^4.0.2", "co": "^4.6.0", "co-mocha": "^1.2.0", diff --git a/rest/contracts/RestStatus.sol b/rest/contracts/RestStatus.sol index 1bd148f..b546900 100644 --- a/rest/contracts/RestStatus.sol +++ b/rest/contracts/RestStatus.sol @@ -6,13 +6,15 @@ contract RestStatus { uint constant OK = 200; uint constant CREATED = 201; uint constant ACCEPTED = 202; - uint constant CLIENT_ERROR = 400; // 4xx + // TODO: Geting: Duplicate expressions value. var:INTERNAL_SERVER_ERROR value:500 (that's why commented out) + // uint constant CLIENT_ERROR = 400; // 4xx uint constant BAD_REQUEST = 400; uint constant UNAUTHORIZED = 401; uint constant FORBIDDEN = 403; uint constant NOT_FOUND = 404; uint constant CONFLICT = 409; - uint constant SERVER_ERROR = 500; // 5xx + // TODO: Geting: Duplicate expressions value. var:INTERNAL_SERVER_ERROR value:500 (that's why commented out) + // uint constant SERVER_ERROR = 500; // 5xx uint constant INTERNAL_SERVER_ERROR = 500; uint constant BAD_GATEWAY = 502; uint constant GATEWAY_TIMEOUT = 504; diff --git a/util/config.js b/util/config.js index 5390048..0956dfb 100644 --- a/util/config.js +++ b/util/config.js @@ -1,3 +1,4 @@ +// QUEST: is this function is good to be here or we can move to rest ? const fs = require('fs'); const yaml = require('js-yaml'); From 4a72fd5f95ff42c728ff27fffd472df624a39767 Mon Sep 17 00:00:00 2001 From: Tanuj Soni Date: Wed, 20 Mar 2019 12:27:14 +0530 Subject: [PATCH 04/18] [SER-25_compatibilityWithRest] PermissionedHashmap compatible with new rest --- auth/permission/permissionManager.js | 15 ++-- auth/permission/permissionedHashmap.js | 74 +++++++++++++------ .../test/permissionedHashmap.test.js | 74 ++++++++++++------- 3 files changed, 104 insertions(+), 59 deletions(-) diff --git a/auth/permission/permissionManager.js b/auth/permission/permissionManager.js index 1b0abc3..0d949ee 100644 --- a/auth/permission/permissionManager.js +++ b/auth/permission/permissionManager.js @@ -2,12 +2,10 @@ const { rest, util, importer } = require('blockapps-rest'); const { getYamlFile } = require('../../util/config'); const { createContract, getState, call, RestError } = rest; const config = getYamlFile('config.yaml'); -// const logger = console +// TODO: const logger = console const contractName = 'PermissionManager'; const contractFilename = `./auth/permission/contracts/PermissionManager.sol`; -// TODO: do some research on getFields -// const RestStatus = rest.getFields(`./rest/contracts/RestStatus.sol`); util.bitmaskToEnumString = function (bitmask, bitmaskEnum) { const strings = [] @@ -24,13 +22,11 @@ util.bitmaskToEnumString = function (bitmask, bitmaskEnum) { function* uploadContract(admin, master) { // NOTE: in production, the contract is created and owned by the AdminInterface // for testing purposes the creator is the admin user + const args = { master: master.address, owner: admin.address }; const contractArgs = { name: contractName, source: yield importer.combine(contractFilename), - args: { - _master: master.address, - _owner: admin.address - } + args: util.usc(args) } const contract = yield createContract(admin, contractArgs, { config }) @@ -143,6 +139,7 @@ function* revoke(admin, contract, args) { } const [restStatus] = yield call(admin, callArgs, { config }); + // TODO: reststatus if (restStatus != '200') { throw new RestError(restStatus, callArgs.method, callArgs.args); } @@ -158,10 +155,10 @@ function* transferOwnership(admin, contract, args) { } const [restStatus] = yield call(admin, callArgs, {}); - if (restStatus != RestStatus.OK) { + if (restStatus != '200') { throw new RestError(restStatus, method, args); } - return RestStatus.OK; + return '200'; } // list diff --git a/auth/permission/permissionedHashmap.js b/auth/permission/permissionedHashmap.js index 9c06b78..4b53f06 100644 --- a/auth/permission/permissionedHashmap.js +++ b/auth/permission/permissionedHashmap.js @@ -1,15 +1,23 @@ require('co-mocha') -const ba = require('blockapps-rest') -const { config, util } = ba.common -const rest = ba[`rest${config.restVersion ? config.restVersion : ''}`]; +const { rest, util, importer } = require('blockapps-rest'); +const { getYamlFile } = require('../../util/config'); +const { createContract, getState, call } = rest; +const config = getYamlFile('config.yaml'); const contractName = 'PermissionedHashmap' const contractFilename = `${config.libPath}/auth/permission/contracts/PermissionedHashmap.sol` function* uploadContract(admin, permissionManager) { const args = { permissionManager: permissionManager.address } - const contract = yield rest.uploadContract(admin, contractName, contractFilename, util.usc(args)) + + const contractArgs = { + name: contractName, + source: yield importer.combine(contractFilename), + args: util.usc(args) + } + + const contract = yield createContract(admin, contractArgs, { config }) contract.src = 'removed' return bind(admin, contract) } @@ -17,11 +25,12 @@ function* uploadContract(admin, permissionManager) { function bind(admin, _contract) { const contract = _contract contract.getState = function* () { - return yield rest.getState(contract) - } - contract.getStateVar = function* (args) { - return yield rest.getStateVar(contract, args.name, args.count, args.offset, args.length) + return yield getState(contract, { config }) } + // TODO: Why we are using this function which is not in use + // contract.getStateVar = function* (args) { + // return yield rest.getStateVar(contract, args.name, args.count, args.offset, args.length) + // } contract.put = function* (args) { return yield put(admin, contract, args) } @@ -50,37 +59,56 @@ function bindAddress(admin, address) { } function* put(admin, contract, args) { - rest.verbose('put', args) - const method = 'put' - const result = yield rest.callMethod(admin, contract, method, util.usc(args)) + const callArgs = { + contract, + method: 'put', + args: util.usc(args) + } + + const result = yield call(admin, callArgs, { config }) return result } function* get(admin, contract, args) { - rest.verbose('get', args) - const method = 'get' - const result = yield rest.callMethod(admin, contract, method, util.usc(args)) + const callArgs = { + contract, + method: 'get', + args: util.usc(args) + } + + const result = yield call(admin, callArgs, { config }) return result[0] } function* contains(admin, contract, args) { - rest.verbose('contains', args) - const method = 'contains' - const result = yield rest.callMethod(admin, contract, method, util.usc(args)) + const callArgs = { + contract, + method: 'contains', + args: util.usc(args) + } + + const result = yield call(admin, callArgs, { config }) return result[0] == true } function* size(admin, contract, args) { - rest.verbose('size', args) - const method = 'size' - const result = yield rest.callMethod(admin, contract, method, util.usc(args)) + const callArgs = { + contract, + method: 'size', + args: util.usc(args) + } + const result = yield call(admin, callArgs, { config }) return parseInt(result[0], 10) } function* remove(admin, contract, args) { - rest.verbose('remove', args) - const method = 'remove' - yield rest.callMethod(admin, contract, method, util.usc(args)) + const callArgs = { + contract, + method: 'remove', + args: util.usc(args) + } + + yield call(admin, callArgs, { config }) } module.exports = { diff --git a/auth/permission/test/permissionedHashmap.test.js b/auth/permission/test/permissionedHashmap.test.js index a3a80ee..667d0c8 100644 --- a/auth/permission/test/permissionedHashmap.test.js +++ b/auth/permission/test/permissionedHashmap.test.js @@ -1,11 +1,14 @@ require('co-mocha') -const ba = require('blockapps-rest') -const { config, util, assert, cwd } = ba.common -const rest = ba[`rest${config.restVersion ? config.restVersion : ''}`]; +const { assert } = require('chai') +const { rest, util, importer } = require('blockapps-rest'); +const { getYamlFile } = require('../../../util/config'); +const { createUser, call, createContract } = rest; const permissionedHashmapJs = require('../permissionedHashmap') +const config = getYamlFile('config.yaml'); + const adminName = util.uid('Admin') const adminPassword = '1234' const masterName = util.uid('Master') @@ -13,7 +16,7 @@ const masterPassword = '5678' const attackerName = util.uid('Attacker') const attackerPassword = '9090' -describe('PermissionedHashmap tests', function() { +describe('PermissionedHashmap tests', function () { this.timeout(config.timeout) let admin, master, attacker, hashmapPermissionManager @@ -21,16 +24,16 @@ describe('PermissionedHashmap tests', function() { // get ready: admin-user and manager-contract before(function* () { console.log('creating admin') - admin = yield rest.createUser(adminName, adminPassword) + admin = yield createUser({ username: adminName, password: adminPassword }, { config }) console.log('creating master') - master = yield rest.createUser(masterName, masterPassword) + master = yield createUser({ username: masterName, password: masterPassword }, { config }) console.log('creating attacker') - attacker = yield rest.createUser(attackerName, attackerPassword) + attacker = yield createUser({ username: attackerName, password: attackerPassword }, { config }) // pm hashmapPermissionManager = yield createHashmapPermissionManager(admin, master) }) - it('put', function*() { + it('put', function* () { const contract = yield permissionedHashmapJs.uploadContract(admin, hashmapPermissionManager) const iuid = util.iuid(); const args = factory.createEntity(iuid); @@ -40,64 +43,70 @@ describe('PermissionedHashmap tests', function() { assert.equal(parseInt(state.values[1]), parseInt(args.value), 'value'); }); - it('put - unauthorized', function*() { + it('put - unauthorized', function* () { const contract = yield permissionedHashmapJs.uploadContract(admin, hashmapPermissionManager) const iuid = util.iuid(); const args = factory.createEntity(iuid); - const method = 'put' - const result = yield rest.callMethod(attacker, contract, method, util.usc(args)) + + const callArgs = { + contract, + method: 'put', + args: util.usc(args) + } + + const result = yield call(attacker, callArgs, { config }) const state = yield contract.getState(); assert.equal(state.values.length, 1, 'length 1 - did not put'); assert.equal(parseInt(state.values[0]), 0, 'empty'); }); - it('get', function*() { + it('get', function* () { const contract = yield permissionedHashmapJs.uploadContract(admin, hashmapPermissionManager) const iuid = util.iuid(); const args = factory.createEntity(iuid); // put yield contract.put(args); // get - const value = yield contract.get({key: args.key}); + const value = yield contract.get({ key: args.key }); assert.equal(parseInt(value), parseInt(args.value), 'value'); - const notFound = yield contract.get({key: '666'}); + const notFound = yield contract.get({ key: '666' }); assert.equal(parseInt(notFound), 0, 'not found'); }); - it('contains', function*() { + it('contains', function* () { const contract = yield permissionedHashmapJs.uploadContract(admin, hashmapPermissionManager) const iuid = util.iuid(); const args = factory.createEntity(iuid); //put yield contract.put(args); // contains - const result = yield contract.contains({key: args.key}); + const result = yield contract.contains({ key: args.key }); assert.equal(result, true, 'contains: true'); - const notFound = yield contract.contains({key: '666'}); + const notFound = yield contract.contains({ key: '666' }); assert.equal(notFound, false, 'contains: false'); }); - it('size', function*() { + it('size', function* () { const contract = yield permissionedHashmapJs.uploadContract(admin, hashmapPermissionManager) const iuid = util.iuid(); const args = factory.createEntity(iuid); yield contract.put(args); - const size1 = yield contract.size(); + const size1 = yield contract.size({}); assert.equal(size1, 1, 'size: 1'); args.key += 'x'; yield contract.put(args); - const size2 = yield contract.size(); + const size2 = yield contract.size({}); assert.equal(size2, 2, 'size: 2'); }); - it('remove', function*() { + it('remove', function* () { const contract = yield permissionedHashmapJs.uploadContract(admin, hashmapPermissionManager) const iuid = util.iuid(); const putArgs = factory.createEntity(iuid); // put yield contract.put(putArgs); - const args = {key: putArgs.key} + const args = { key: putArgs.key } // contains { const result = yield contract.contains(args); @@ -113,21 +122,25 @@ describe('PermissionedHashmap tests', function() { } }); - it('remove - unauthorized', function*() { + it('remove - unauthorized', function* () { const contract = yield permissionedHashmapJs.uploadContract(admin, hashmapPermissionManager) const iuid = util.iuid(); const putArgs = factory.createEntity(iuid); // put yield contract.put(putArgs); - const args = {key: putArgs.key} + const args = { key: putArgs.key } // contains { const result = yield contract.contains(args); assert.equal(result, true, 'contains: true'); } // remove - const method = 'remove' - const result = yield rest.callMethod(attacker, contract, method, util.usc(args)) + const callArgs = { + contract, + method: 'remove', + args: util.usc(args) + } + const result = yield call(attacker, callArgs, { config }) yield contract.getState() // still contained - was not removed @@ -153,7 +166,14 @@ function* createHashmapPermissionManager(admin, master) { owner: admin.address, master: master.address, } - const hashmapPermissionManager = yield rest.uploadContract(admin, contractName, contractFilename, util.usc(args)); + + const contractArgs = { + name: contractName, + source: yield importer.combine(contractFilename), + args: util.usc(args) + } + + const hashmapPermissionManager = yield createContract(admin, contractArgs, { config }); return hashmapPermissionManager } From bead33a11482269b0c0e17619d0f479f8d528480 Mon Sep 17 00:00:00 2001 From: Tanuj Soni Date: Wed, 20 Mar 2019 13:45:09 +0530 Subject: [PATCH 05/18] [SER-25_compatibilityWithRest][WIP] User and UserManager --- .../permission/test/permissionManager.test.js | 5 +- auth/user/test/user.factory.js | 3 - auth/user/test/userManager.test.js | 66 +++++++------- auth/user/user.js | 41 +++++---- auth/user/userManager.js | 86 +++++++++++-------- 5 files changed, 111 insertions(+), 90 deletions(-) diff --git a/auth/permission/test/permissionManager.test.js b/auth/permission/test/permissionManager.test.js index 5e0fe77..b8d1426 100644 --- a/auth/permission/test/permissionManager.test.js +++ b/auth/permission/test/permissionManager.test.js @@ -20,10 +20,11 @@ describe('PermissionManager tests', function () { // get ready: admin-user and manager-contract before(function* () { - // parse Enums + // Parse fields const restStatusSource = fsUtil.get(`${util.cwd}/rest/contracts/RestStatus.sol`) RestStatus = yield parser.parseFields(restStatusSource); - + + // parse Enums const source = fsUtil.get(`${util.cwd}/auth/permission/contracts/EventLogType.sol`) EventLogType = yield parser.parseEnum(source); diff --git a/auth/user/test/user.factory.js b/auth/user/test/user.factory.js index e974b9e..bb87046 100644 --- a/auth/user/test/user.factory.js +++ b/auth/user/test/user.factory.js @@ -1,6 +1,3 @@ -const ba = require('blockapps-rest'); -const util = ba.common.util; - const createUserArgs = function(accountAddress, uid, role=1) { const username = `User_${uid}` diff --git a/auth/user/test/userManager.test.js b/auth/user/test/userManager.test.js index 1bdc944..b7b8e57 100644 --- a/auth/user/test/userManager.test.js +++ b/auth/user/test/userManager.test.js @@ -1,17 +1,10 @@ require('co-mocha'); -const ba = require('blockapps-rest'); -const common = ba.common; -const config = common.config; -const rest = ba[`rest${config.restVersion ? config.restVersion : ''}`]; -const util = common.util; -const should = common.should; -const assert = common.assert; -const constants = common.constants; -const BigNumber = common.BigNumber; -const Promise = common.Promise; - -const RestStatus = rest.getFields(`${config.libPath}/rest/contracts/RestStatus.sol`); -const UserRole = rest.getEnums(`${config.libPath}/auth/user/contracts/UserRole.sol`).UserRole; +const { assert } = require('chai') +const { rest, util, parser, fsUtil } = require('blockapps-rest'); +const { getYamlFile } = require('../../../util/config'); +const { createUser, call } = rest; + +const config = getYamlFile('config.yaml'); const adminName = util.uid('Admin'); const adminPassword = '1234'; @@ -20,22 +13,27 @@ const blocPassword = '4567'; const userManagerJs = require('../userManager'); const factory = require('./user.factory'); -describe('UserManager tests', function() { +describe('UserManager tests', function () { this.timeout(config.timeout); let admin; let contract; let account; + let RestStatus; // get ready: admin-user and manager-contract before(function* () { - admin = yield rest.createUser(adminName, adminPassword); + // Parse fields + const restStatusSource = fsUtil.get(`${util.cwd}/rest/contracts/RestStatus.sol`) + RestStatus = yield parser.parseFields(restStatusSource); + + admin = yield createUser({ username: adminName, password: adminPassword }, { config }); contract = yield userManagerJs.uploadContract(admin); // bloc account must be created separately - account = yield rest.createUser(blocName, blocPassword); + account = yield createUser({ username: blocName, password: blocPassword }, { config }); }); - it('Create User', function* () { + xit('Create User', function* () { const uid = util.uid(); // create user with the bloc account const args = factory.createUserArgs(account.address, uid); @@ -45,10 +43,10 @@ describe('UserManager tests', function() { assert.equal(user.role, args.role, 'role'); }); - it('Create User - UNAUTHORIZED', function*() { + xit('Create User - UNAUTHORIZED', function* () { const uid = util.uid(); const args = factory.createUserArgs(account.address, uid); - const attacker = yield rest.createUser('Attacker_'+uid, ''+uid); + const attacker = yield rest.createUser('Attacker_' + uid, '' + uid); // create user UNAUTHORIZED const method = 'createUser'; @@ -56,16 +54,16 @@ describe('UserManager tests', function() { assert.equal(restStatus, RestStatus.UNAUTHORIZED, 'should fail'); }); - it('Create User - illegal name', function* () { + xit('Create User - illegal name', function* () { const uid = util.uid(); const args = factory.createUserArgs(account.address, uid); args.username = '123456789012345678901234567890123'; // 33 chars - yield assert.shouldThrowRest(function*() { + yield assert.shouldThrowRest(function* () { return yield contract.createUser(args); }, RestStatus.BAD_REQUEST); }); - it('Test exists()', function* () { + xit('Test exists()', function* () { const uid = util.uid(); const args = factory.createUserArgs(account.address, uid); @@ -81,7 +79,7 @@ describe('UserManager tests', function() { assert.equal(exists, true, 'should exist') }); - it('Test exists() with special characters', function* () { + xit('Test exists() with special characters', function* () { const uid = util.uid(); const args = factory.createUserArgs(account.address, uid); args.username += ' ?#%!@*'; @@ -98,23 +96,23 @@ describe('UserManager tests', function() { assert.equal(exists, true, 'should exist') }); - it('Create Duplicate User', function* () { + xit('Create Duplicate User', function* () { const uid = util.uid(); const args = factory.createUserArgs(account.address, uid); // create user const user = yield contract.createUser(args); - yield assert.shouldThrowRest(function*() { + yield assert.shouldThrowRest(function* () { const user = yield contract.createUser(args); }, RestStatus.BAD_REQUEST); }); - it('Get User', function *() { + xit('Get User', function* () { const uid = util.uid(); const args = factory.createUserArgs(account.address, uid); // get non-existing user - yield assert.shouldThrowRest(function*() { + yield assert.shouldThrowRest(function* () { const user = yield contract.getUser(args.username); }, RestStatus.NOT_FOUND); // create user @@ -124,14 +122,14 @@ describe('UserManager tests', function() { assert.equal(user.username, args.username, 'username should be found'); }); - it('Get Users', function* () { + xit('Get Users', function* () { const uid = util.uid(); const args = factory.createUserArgs(account.address, uid); // get users - should not exist { const users = yield contract.getUsers(); - const found = users.filter(function(user) { + const found = users.filter(function (user) { return user.username === args.username; }); assert.equal(found.length, 0, 'user list should NOT contain ' + args.username); @@ -141,20 +139,20 @@ describe('UserManager tests', function() { // get user - should exist { const users = yield contract.getUsers(admin, contract); - const found = users.filter(function(user) { + const found = users.filter(function (user) { return user.username === args.username; }); assert.equal(found.length, 1, 'user list should contain ' + args.username); } }); - it.skip('User address leading zeros - load test - skipped', function *() { - this.timeout(60*60*1000); + it.skip('User address leading zeros - load test - skipped', function* () { + this.timeout(60 * 60 * 1000); const uid = util.uid(); const args = factory.createUserArgs(account.address, uid); const username = args.username; - const count = 16*4; // leading 0 once every 16 + const count = 16 * 4; // leading 0 once every 16 const users = []; // create users for (let i = 0; i < count; i++) { @@ -170,7 +168,7 @@ describe('UserManager tests', function() { // get all users const resultUsers = yield contract.getUsers(admin, contract); - const comparator = function(a, b) { return a.username == b.username; }; + const comparator = function (a, b) { return a.username == b.username; }; const notFound = util.filter.isContained(users, resultUsers, comparator, true); assert.equal(notFound.length, 0, JSON.stringify(notFound)); }); diff --git a/auth/user/user.js b/auth/user/user.js index 0f149a6..26cd9be 100644 --- a/auth/user/user.js +++ b/auth/user/user.js @@ -1,24 +1,31 @@ -const ba = require('blockapps-rest'); -const util = ba.common.util; -const config = ba.common.config; -const rest = ba[`rest${config.restVersion ? config.restVersion : ''}`]; +const { rest, util, importer } = require('blockapps-rest'); +const { getYamlFile } = require('../../util/config'); +const { createContract, getState, call, search } = rest; +const config = getYamlFile('config.yaml'); const contractName = 'User'; -const contractFilename = `${ba.common.cwd}/${config.libPath}/auth/user/contracts/User.sol`; +const contractFilename = `${util.cwd}/${config.libPath}/auth/user/contracts/User.sol`; -const RestStatus = rest.getFields(`${config.libPath}/rest/contracts/RestStatus.sol`); -const UserRole = rest.getEnums(`${config.libPath}/auth/user/contracts/UserRole.sol`).UserRole; +// const RestStatus = rest.getFields(`${config.libPath}/rest/contracts/RestStatus.sol`); +// const UserRole = rest.getEnums(`${config.libPath}/auth/user/contracts/UserRole.sol`).UserRole; function* uploadContract(admin, args) { - const contract = yield rest.uploadContract(admin, contractName, contractFilename, util.usc(args)); - yield compileSearch(contract); + const contractArgs = { + name: contractName, + source: yield importer.combine(contractFilename), + args: util.usc(args) + } + + const contract = yield createContract(admin, contractArgs, { config }); + // TODO: Please confirm that it is needed + // yield compileSearch(contract); contract.src = 'removed'; return bind(admin, contract); } function bind(admin, contract) { contract.getState = function* () { - return yield rest.getState(contract); + return yield getState(contract, { config }); } contract.authenticate = function* (pwHash) { return yield authenticate(admin, contract, pwHash); @@ -26,9 +33,8 @@ function bind(admin, contract) { return contract; } +// TODO: remove if not in use function* compileSearch(contract) { - rest.verbose('compileSearch', contractName); - if (yield rest.isSearchable(contract.codeHash)) { return; } @@ -51,13 +57,16 @@ function* getUserByAddress(address) { } function* authenticate(admin, contract, pwHash) { - rest.verbose('authenticate', pwHash); // function authenticate(bytes32 _pwHash) return (bool) { - const method = 'authenticate'; const args = { - _pwHash: pwHash, + pwHash: pwHash, }; - const result = yield rest.callMethod(admin, contract, method, args); + const callArgs = { + contract, + method: 'authenticate', + args: util.usc(args) + } + const result = yield call(admin, callArgs, { config }); const isAuthenticated = (result[0] === true); return isAuthenticated; } diff --git a/auth/user/userManager.js b/auth/user/userManager.js index 31a168a..abb0574 100644 --- a/auth/user/userManager.js +++ b/auth/user/userManager.js @@ -1,30 +1,35 @@ -const ba = require('blockapps-rest'); -const util = ba.common.util; -const BigNumber = ba.common.BigNumber; -const config = ba.common.config; -const rest = ba[`rest${config.restVersion ? config.restVersion : ''}`]; -const cwd = ba.common.cwd; +const { rest, util, importer } = require('blockapps-rest'); +const { getYamlFile } = require('../../util/config'); +const { createContract, getState, call } = rest; +const config = getYamlFile('config.yaml'); const contractName = 'UserManager'; -const contractFilename = `${cwd}/${config.libPath}/auth/user/contracts/UserManager.sol`; +const contractFilename = `${util.cwd}/${config.libPath}/auth/user/contracts/UserManager.sol`; -const RestStatus = rest.getFields(`${config.libPath}/rest/contracts/RestStatus.sol`); -const UserRole = rest.getEnums(`${config.libPath}/auth/user/contracts/UserRole.sol`).UserRole; -const userJs = require(`${cwd}/${config.libPath}/auth/user/user`); +const logger = console; + +// TODO: (remove if not in use) const RestStatus = rest.getFields(`${config.libPath}/rest/contracts/RestStatus.sol`); +const userJs = require(`${util.cwd}/${config.libPath}/auth/user/user`); function* uploadContract(admin) { // NOTE: in production, the contract is created and owned by the AdminInterface // for testing purposes the creator is the admin user - const args = { _owner: admin.address }; - const contract = yield rest.uploadContract(admin, contractName, contractFilename, args); - yield compileSearch(contract); + const args = { owner: admin.address }; + const contractArgs = { + name: contractName, + source: yield importer.combine(contractFilename), + args: util.usc(args) + } + const contract = yield createContract(admin, contractArgs, { config, logger }); + // TODO: Please confirm that it is needed + // yield compileSearch(contract); contract.src = 'removed'; return bind(admin, contract); } function bind(admin, contract) { contract.getState = function* () { - return yield rest.getState(contract); + return yield getState(contract, { config }); } contract.createUser = function* (args) { return yield createUser(admin, contract, args); @@ -44,8 +49,8 @@ function bind(admin, contract) { return contract; } +// TODO: remove if not in use function* compileSearch(contract) { - rest.verbose('compileSearch', contractName); if (yield rest.isSearchable(contract.codeHash)) { return; } @@ -58,14 +63,17 @@ function* compileSearch(contract) { // throws: RestStatus // returns: user record from search function* createUser(admin, contract, args) { - rest.verbose('createUser', args); - // function createUser(address account, string username, bytes32 pwHash, uint role) returns (ErrorCodes) { - const method = 'createUser'; + const callArgs = { + contract, + method: 'createUser', + args: util.usc(args) + } // create the user, with the eth account - const [restStatus, address] = yield rest.callMethod(admin, contract, method, util.usc(args)); - if (restStatus != RestStatus.CREATED) { + const [restStatus] = yield call(admin, callArgs, { config }); + // TODO: add RestStatus api call. No magic numbers + if (restStatus != '201') { throw new rest.RestError(restStatus, method, args); } // block until the user shows up in search @@ -74,48 +82,56 @@ function* createUser(admin, contract, args) { } function* exists(admin, contract, username) { - rest.verbose('exists', username); // function exists(string username) returns (bool) { - const method = 'exists'; + const callArgs = { + contract, + method: 'exists', + args: util.usc(args) + } + const args = { username: username, }; - const result = yield rest.callMethod(admin, contract, method, util.usc(args)); + const result = yield call(admin, callArgs, { config }); const exist = (result[0] === true); return exist; } function* getUser(admin, contract, username) { - rest.verbose('getUser', username); // function getUser(string username) returns (address) { - const method = 'getUser'; const args = { username: username, }; + const callArgs = { + contract, + method: 'getUser', + args: util.usc(args) + } // get the use address - const [address] = yield rest.callMethod(admin, contract, method, util.usc(args)); + const [address] = yield call(admin, callArgs, { config }); if (address == 0) { - throw new rest.RestError(RestStatus.NOT_FOUND, method, args); + throw new rest.RestError('404', method, args); } // found - query for the full user record - return yield userJs.getUserByAddress(address); + return yield userJs.getUserByAddress(contract, address); } function* getUsers(admin, contract) { - rest.verbose('getUsers'); - const {users: usersHashmap} = yield rest.getState(contract); - const {values} = yield rest.getState({name: 'Hashmap', address:usersHashmap}); + const { users: usersHashmap } = yield rest.getState(contract, { config }); + const { values } = yield getState({ name: 'Hashmap', address: usersHashmap }, { config }); const addresses = values.slice(1); return yield userJs.getUsers(addresses); } function* authenticate(admin, contract, args) { - rest.verbose('authenticate', args); - // function authenticate(string _username, bytes32 _pwHash) returns (bool) { - const method = 'authenticate'; - const [result] = yield rest.callMethod(admin, contract, method, util.usc(args)); + const callArgs = { + contract, + method: 'authenticate', + args: util.usc(args) + } + const [result] = yield call(admin, callArgs, { config }); const isOK = (result == true); return isOK; } From c4dbb9aedc7d20632bac9bf758dd32f0c7a95e67 Mon Sep 17 00:00:00 2001 From: Tanuj Soni Date: Wed, 20 Mar 2019 15:39:48 +0530 Subject: [PATCH 06/18] [SER-25_compatibilityWithRest] HashMap Compatible with new rest --- collections/hashmap/hashmap.js | 86 +++++++++++++------ collections/hashmap/test/hashmap.test.js | 85 +++++++++--------- .../hashmap/test/unsafeHashmap.test.js | 15 ++-- collections/hashmap/unsafeHashmap.js | 75 +++++++++++----- 4 files changed, 163 insertions(+), 98 deletions(-) diff --git a/collections/hashmap/hashmap.js b/collections/hashmap/hashmap.js index 383f803..85c2794 100644 --- a/collections/hashmap/hashmap.js +++ b/collections/hashmap/hashmap.js @@ -1,25 +1,33 @@ -const ba = require('blockapps-rest'); -const util = ba.common.util; -const config = ba.common.config; -const rest = ba[`rest${config.restVersion ? config.restVersion : ''}`]; +const { rest, util, importer } = require('blockapps-rest'); +const { getYamlFile } = require('../../util/config'); +const { createContract, getState, call } = rest; +const config = getYamlFile('config.yaml'); const contractName = 'Hashmap'; const contractFilename = `${config.libPath}/collections/hashmap/contracts/Hashmap.sol`; function* uploadContract(admin) { const args = {}; - const contract = yield rest.uploadContract(admin, contractName, contractFilename, util.usc(args)); + + const contractArgs = { + name: contractName, + source: yield importer.combine(contractFilename), + args: util.usc(args) + } + + const contract = yield createContract(admin, contractArgs, { config }); contract.src = 'removed'; return bind(admin, contract); } function bind(admin, contract) { contract.getState = function* () { - return yield rest.getState(contract); - } - contract.getStateVar = function* (args) { - return yield rest.getStateVar(contract, args.name, args.count, args.offset, args.length); + return yield getState(contract, { config }); } + // TODO: Why we are using this function which is not in use + // contract.getStateVar = function* (args) { + // return yield rest.getStateVar(contract, args.name, args.count, args.offset, args.length); + // } contract.put = function* (args) { return yield put(admin, contract, args); } @@ -43,44 +51,68 @@ function bind(admin, contract) { } function* put(admin, contract, args) { - rest.verbose('put', args); - const method = 'put'; - const result = yield rest.callMethod(admin, contract, method, util.usc(args)); + const callArgs = { + contract, + method: 'put', + args: util.usc(args) + } + + const result = yield call(admin, callArgs, { config }); return result; } function* get(admin, contract, args) { - rest.verbose('get', args); - const method = 'get'; - const result = yield rest.callMethod(admin, contract, method, util.usc(args)); + const callArgs = { + contract, + method: 'get', + args: util.usc(args) + } + + const result = yield call(admin, callArgs, { config }); return result[0]; } function* contains(admin, contract, args) { - rest.verbose('contains', args); - const method = 'contains'; - const result = yield rest.callMethod(admin, contract, method, util.usc(args)); + const callArgs = { + contract, + method: 'contains', + args: util.usc(args) + } + + const result = yield call(admin, callArgs, { config }); return result[0] == true; } function* size(admin, contract, args) { - rest.verbose('size', args); - const method = 'size'; - const result = yield rest.callMethod(admin, contract, method, util.usc(args)); + const callArgs = { + contract, + method: 'size', + args: util.usc(args) + } + + const result = yield call(admin, callArgs, { config }); return parseInt(result[0]); } function* transferOwnership(admin, contract, args) { - rest.verbose('transferOwnership', args); - const method = 'transferOwnership'; - const result = yield rest.callMethod(admin, contract, method, util.usc(args)); + const callArgs = { + contract, + method: 'transferOwnership', + args: util.usc(args) + } + + const result = yield call(admin, callArgs, { config }); return result[0] == true; } function* getOwner(admin, contract, args) { - rest.verbose('getOwner', args); - const method = 'getOwner'; - const result = yield rest.callMethod(admin, contract, method, util.usc(args)); + const callArgs = { + contract, + method: 'getOwner', + args: util.usc(args) + } + + const result = yield call(admin, callArgs, { config }); return result[0]; } diff --git a/collections/hashmap/test/hashmap.test.js b/collections/hashmap/test/hashmap.test.js index 9c10ade..104fc50 100644 --- a/collections/hashmap/test/hashmap.test.js +++ b/collections/hashmap/test/hashmap.test.js @@ -1,10 +1,9 @@ require('co-mocha'); -const ba = require('blockapps-rest'); -const common = ba.common; -const config = common.config; -const rest = ba[`rest${config.restVersion ? config.restVersion : ''}`]; -const util = common.util; -const assert = common.assert; +const { assert } = require('chai') +const { rest, util } = require('blockapps-rest'); +const { getYamlFile } = require('../../../util/config'); +const { createUser } = rest; +const config = getYamlFile('config.yaml'); const hashmapJs = require('../hashmap'); @@ -14,24 +13,26 @@ const adminPassword = '1234'; const otherAdminName = util.uid('OtherAdmin'); const otherAdminPassword = '5678'; -describe('Hashmap', function() { +describe('Hashmap', function () { this.timeout(config.timeout); let admin; let otherAdmin; - before(function*() { - admin = yield rest.createUser(adminName, adminPassword); - otherAdmin = yield rest.createUser(otherAdminName, otherAdminPassword); + before(function* () { + console.log('creating admin') + admin = yield createUser({ username: adminName, password: adminPassword }, { config }); + console.log('creating user') + otherAdmin = yield createUser({ username: otherAdminName, password: otherAdminPassword }, { config }); }); - it('getOwner', function*() { + it('getOwner', function* () { const hashmap = yield hashmapJs.uploadContract(admin); - const owner = yield hashmap.getOwner(); + const owner = yield hashmap.getOwner({}); assert.equal(owner.toString(), admin.address); }); - it('put', function*() { + it('put', function* () { const hashmap = yield hashmapJs.uploadContract(admin); const iuid = util.iuid(); const args = factory.createEntity(iuid); @@ -41,102 +42,102 @@ describe('Hashmap', function() { assert.equal(parseInt(state.values[1]), parseInt(args.value), 'value'); }); - it('get', function*() { + it('get', function* () { const hashmap = yield hashmapJs.uploadContract(admin); const iuid = util.iuid(); const args = factory.createEntity(iuid); yield hashmap.put(args); - const value = yield hashmap.get({key: args.key}); + const value = yield hashmap.get({ key: args.key }); assert.equal(parseInt(value), parseInt(args.value), 'value'); - const notFound = yield hashmap.get({key: '666'}); + const notFound = yield hashmap.get({ key: '666' }); assert.equal(parseInt(notFound), 0, 'not found'); }); - it('contains', function*() { + it('contains', function* () { const hashmap = yield hashmapJs.uploadContract(admin); const iuid = util.iuid(); const args = factory.createEntity(iuid); yield hashmap.put(args); - const result = yield hashmap.contains({key: args.key}); + const result = yield hashmap.contains({ key: args.key }); assert.equal(result, true, 'contains: true'); - const notFound = yield hashmap.contains({key: '666'}); + const notFound = yield hashmap.contains({ key: '666' }); assert.equal(notFound, false, 'contains: false'); }); - it('size', function*() { + it('size', function* () { const hashmap = yield hashmapJs.uploadContract(admin); const iuid = util.iuid(); const args = factory.createEntity(iuid); yield hashmap.put(args); - const size1 = yield hashmap.size(); + const size1 = yield hashmap.size({}); assert.equal(size1, 1, 'size: 1'); args.key += 'x'; yield hashmap.put(args); - const size2 = yield hashmap.size(); + const size2 = yield hashmap.size({}); assert.equal(size2, 2, 'size: 2'); }); - it('transferOwnership to otherAdmin', function*() { + it('transferOwnership to otherAdmin', function* () { const hashmap = yield hashmapJs.uploadContract(admin); - yield hashmap.transferOwnership({newOwner: otherAdmin.address}); - const owner = yield hashmap.getOwner(); + yield hashmap.transferOwnership({ newOwner: otherAdmin.address }); + const owner = yield hashmap.getOwner({}); assert.notEqual(owner.toString(), admin.address); assert.equal(owner.toString(), otherAdmin.address); }); - it('reject get from original admin', function*() { + it('reject get from original admin', function* () { const hashmap = yield hashmapJs.uploadContract(admin); const iuid = util.iuid(); const args = factory.createEntity(iuid); yield hashmap.put(args); - yield hashmap.transferOwnership({newOwner: otherAdmin.address}); + yield hashmap.transferOwnership({ newOwner: otherAdmin.address }); - const result = yield hashmap.get({key: args.key}); + const result = yield hashmap.get({ key: args.key }); assert.equal(result.toString(), "0000000000000000000000000000000000000000"); }); - it('reject put from original admin', function*() { + it('reject put from original admin', function* () { const hashmap = yield hashmapJs.uploadContract(admin); - yield hashmap.transferOwnership({newOwner: otherAdmin.address}); + yield hashmap.transferOwnership({ newOwner: otherAdmin.address }); const iuid = util.iuid(); const args = factory.createEntity(iuid); yield hashmap.put(args); - const result = yield hashmapJs.get(otherAdmin, hashmap, {key: args.key}) + const result = yield hashmapJs.get(otherAdmin, hashmap, { key: args.key }) assert.equal(result.toString(), "0000000000000000000000000000000000000000"); - const result2 = yield hashmapJs.size(otherAdmin, hashmap, {key: args.key}) + const result2 = yield hashmapJs.size(otherAdmin, hashmap, { key: args.key }) assert.equal(result2, 0); }); - it('reject contains from original admin', function*() { + it('reject contains from original admin', function* () { const hashmap = yield hashmapJs.uploadContract(admin); const iuid = util.iuid(); const args = factory.createEntity(iuid); yield hashmap.put(args); - yield hashmap.transferOwnership({newOwner: otherAdmin.address}); + yield hashmap.transferOwnership({ newOwner: otherAdmin.address }); - const result = yield hashmap.contains({key: args.key}); + const result = yield hashmap.contains({ key: args.key }); assert.equal(result, false); }); - it('reject size from original admin', function*() { + it('reject size from original admin', function* () { const hashmap = yield hashmapJs.uploadContract(admin); const iuid = util.iuid(); const args = factory.createEntity(iuid); yield hashmap.put(args); - yield hashmap.transferOwnership({newOwner: otherAdmin.address}); + yield hashmap.transferOwnership({ newOwner: otherAdmin.address }); - const result = yield hashmap.size(); + const result = yield hashmap.size({}); assert.equal(result, 0) }); - it('reject transferOwnership from original admin', function*() { - const newAdmin = yield rest.createUser(util.uid('newAdmin'), '4321'); + it('reject transferOwnership from original admin', function* () { + const newAdmin = yield createUser({ username: util.uid('newAdmin'), password: '4321' }, { config }); const hashmap = yield hashmapJs.uploadContract(admin); - yield hashmap.transferOwnership({newOwner: otherAdmin.address}); + yield hashmap.transferOwnership({ newOwner: otherAdmin.address }); - const result = yield hashmap.transferOwnership({newOwner: newAdmin.address}); + const result = yield hashmap.transferOwnership({ newOwner: newAdmin.address }); assert.equal(result, false); }); }); diff --git a/collections/hashmap/test/unsafeHashmap.test.js b/collections/hashmap/test/unsafeHashmap.test.js index 2d61120..04b1a86 100644 --- a/collections/hashmap/test/unsafeHashmap.test.js +++ b/collections/hashmap/test/unsafeHashmap.test.js @@ -1,8 +1,10 @@ require('co-mocha') -const ba = require('blockapps-rest') -const { config, util, assert } = ba.common -const rest = ba[`rest${config.restVersion ? config.restVersion : ''}`]; +const { assert } = require('chai') +const { rest, util } = require('blockapps-rest'); +const { getYamlFile } = require('../../../util/config'); +const { createUser } = rest; +const config = getYamlFile('config.yaml'); const unsafeHashmapJs = require('../unsafeHashmap') @@ -15,7 +17,8 @@ describe('UnsafeHashmap', function () { let admin before(function* () { - admin = yield rest.createUser(adminName, adminPassword) + console.log('creating admin') + admin = yield createUser({username: adminName, password: adminPassword}, { config }) }) it('put', function* () { @@ -55,11 +58,11 @@ describe('UnsafeHashmap', function () { const iuid = util.iuid() const args = factory.createEntity(iuid) yield hashmap.put(args) - const size1 = yield hashmap.size() + const size1 = yield hashmap.size({}) assert.equal(size1, 1, 'size: 1') args.key += 'x' yield hashmap.put(args) - const size2 = yield hashmap.size() + const size2 = yield hashmap.size({}) assert.equal(size2, 2, 'size: 2') }) diff --git a/collections/hashmap/unsafeHashmap.js b/collections/hashmap/unsafeHashmap.js index cb77542..a256a5e 100644 --- a/collections/hashmap/unsafeHashmap.js +++ b/collections/hashmap/unsafeHashmap.js @@ -1,14 +1,22 @@ -const ba = require('blockapps-rest') +const { rest, util, importer } = require('blockapps-rest'); +const { getYamlFile } = require('../../util/config'); +const { createContract, getState, call } = rest; -const { config, util } = ba.common -const rest = ba[`rest${config.restVersion ? config.restVersion : ''}`]; +const config = getYamlFile('config.yaml'); const contractName = 'UnsafeHashmap' const contractFilename = `${config.libPath}/collections/hashmap/contracts/UnsafeHashmap.sol` function* uploadContract(admin) { const args = {} - const contract = yield rest.uploadContract(admin, contractName, contractFilename, util.usc(args)) + + const contractArgs = { + name: contractName, + source: yield importer.combine(contractFilename), + args: util.usc(args) + } + + const contract = yield createContract(admin, contractArgs, { config }) contract.src = 'removed' return bind(admin, contract) } @@ -16,11 +24,12 @@ function* uploadContract(admin) { function bind(admin, _contract) { const contract = _contract contract.getState = function* () { - return yield rest.getState(contract) - } - contract.getStateVar = function* (args) { - return yield rest.getStateVar(contract, args.name, args.count, args.offset, args.length) + return yield getState(contract, { config }) } + // TODO: Why we are using this function which is not in use + // contract.getStateVar = function* (args) { + // return yield rest.getStateVar(contract, args.name, args.count, args.offset, args.length) + // } contract.put = function* (args) { return yield put(admin, contract, args) } @@ -40,37 +49,57 @@ function bind(admin, _contract) { } function* put(admin, contract, args) { - rest.verbose('put', args) - const method = 'put' - const result = yield rest.callMethod(admin, contract, method, util.usc(args)) + const callArgs = { + contract, + method: 'put', + args: util.usc(args) + } + + const result = yield call(admin, callArgs, { config }) return result } function* get(admin, contract, args) { - rest.verbose('get', args) - const method = 'get' - const result = yield rest.callMethod(admin, contract, method, util.usc(args)) + const callArgs = { + contract, + method: 'get', + args: util.usc(args) + } + + const result = yield call(admin, callArgs, { config }) return result[0] } function* contains(admin, contract, args) { - rest.verbose('contains', args) - const method = 'contains' - const result = yield rest.callMethod(admin, contract, method, util.usc(args)) + const callArgs = { + contract, + method: 'contains', + args: util.usc(args) + } + + const result = yield call(admin, callArgs, { config }) return result[0] == true } function* size(admin, contract, args) { - rest.verbose('size', args) - const method = 'size' - const result = yield rest.callMethod(admin, contract, method, util.usc(args)) + const callArgs = { + contract, + method: 'size', + args: util.usc(args) + } + + const result = yield call(admin, callArgs, { config }) return parseInt(result[0]) } function* remove(admin, contract, args) { - rest.verbose('remove', args) - const method = 'remove' - yield rest.callMethod(admin, contract, method, util.usc(args)) + const callArgs = { + contract, + method: 'remove', + args: util.usc(args) + } + + yield call(admin, callArgs, { config }) } module.exports = { From 87729385a1ff2d1dad6068560f0dcb0a4c0a29a9 Mon Sep 17 00:00:00 2001 From: Tanuj Soni Date: Wed, 20 Mar 2019 16:13:46 +0530 Subject: [PATCH 07/18] [SER-25_compatibilityWithRest] collections are now using async/await --- .babelrc | 9 +- collections/hashmap/hashmap.js | 83 ++++++------ collections/hashmap/test/hashmap.test.js | 125 +++++++++--------- .../hashmap/test/unsafeHashmap.test.js | 72 +++++----- collections/hashmap/unsafeHashmap.js | 61 ++++----- package.json | 10 +- util/config.js | 8 +- 7 files changed, 187 insertions(+), 181 deletions(-) diff --git a/.babelrc b/.babelrc index cedf24f..0bddca3 100644 --- a/.babelrc +++ b/.babelrc @@ -1,5 +1,12 @@ { "presets": [ - "@babel/preset-env" + [ + "@babel/preset-env", + { + "targets": { + "node": true + } + } + ] ] } \ No newline at end of file diff --git a/collections/hashmap/hashmap.js b/collections/hashmap/hashmap.js index 85c2794..d901e1a 100644 --- a/collections/hashmap/hashmap.js +++ b/collections/hashmap/hashmap.js @@ -1,128 +1,129 @@ -const { rest, util, importer } = require('blockapps-rest'); -const { getYamlFile } = require('../../util/config'); +import { rest, util, importer } from 'blockapps-rest'; const { createContract, getState, call } = rest; + +import { getYamlFile } from '../../util/config'; const config = getYamlFile('config.yaml'); const contractName = 'Hashmap'; const contractFilename = `${config.libPath}/collections/hashmap/contracts/Hashmap.sol`; -function* uploadContract(admin) { +async function uploadContract(admin) { const args = {}; const contractArgs = { name: contractName, - source: yield importer.combine(contractFilename), + source: await importer.combine(contractFilename), args: util.usc(args) } - const contract = yield createContract(admin, contractArgs, { config }); + const contract = await createContract(admin, contractArgs, { config }); contract.src = 'removed'; return bind(admin, contract); } function bind(admin, contract) { - contract.getState = function* () { - return yield getState(contract, { config }); + contract.getState = async function() { + return await getState(contract, { config }); } // TODO: Why we are using this function which is not in use // contract.getStateVar = function* (args) { - // return yield rest.getStateVar(contract, args.name, args.count, args.offset, args.length); + // return await rest.getStateVar(contract, args.name, args.count, args.offset, args.length); // } - contract.put = function* (args) { - return yield put(admin, contract, args); + contract.put = async function (args) { + return await put(admin, contract, args); } - contract.get = function* (args) { - return yield get(admin, contract, args); + contract.get = async function (args) { + return await get(admin, contract, args); } - contract.contains = function* (args) { - return yield contains(admin, contract, args); + contract.contains = async function (args) { + return await contains(admin, contract, args); } - contract.size = function* (args) { - return yield size(admin, contract, args); + contract.size = async function (args) { + return await size(admin, contract, args); } - contract.transferOwnership = function* (args) { - return yield transferOwnership(admin, contract, args); + contract.transferOwnership = async function (args) { + return await transferOwnership(admin, contract, args); } - contract.getOwner = function* (args) { - return yield getOwner(admin, contract, args); + contract.getOwner = async function (args) { + return await getOwner(admin, contract, args); } return contract; } -function* put(admin, contract, args) { +async function put(admin, contract, args) { const callArgs = { contract, method: 'put', args: util.usc(args) } - const result = yield call(admin, callArgs, { config }); + const result = await call(admin, callArgs, { config }); return result; } -function* get(admin, contract, args) { +async function get(admin, contract, args) { const callArgs = { contract, method: 'get', args: util.usc(args) } - const result = yield call(admin, callArgs, { config }); + const result = await call(admin, callArgs, { config }); return result[0]; } -function* contains(admin, contract, args) { +async function contains(admin, contract, args) { const callArgs = { contract, method: 'contains', args: util.usc(args) } - const result = yield call(admin, callArgs, { config }); + const result = await call(admin, callArgs, { config }); return result[0] == true; } -function* size(admin, contract, args) { +async function size(admin, contract, args) { const callArgs = { contract, method: 'size', args: util.usc(args) } - const result = yield call(admin, callArgs, { config }); + const result = await call(admin, callArgs, { config }); return parseInt(result[0]); } -function* transferOwnership(admin, contract, args) { +async function transferOwnership(admin, contract, args) { const callArgs = { contract, method: 'transferOwnership', args: util.usc(args) } - const result = yield call(admin, callArgs, { config }); + const result = await call(admin, callArgs, { config }); return result[0] == true; } -function* getOwner(admin, contract, args) { +async function getOwner(admin, contract, args) { const callArgs = { contract, method: 'getOwner', args: util.usc(args) } - const result = yield call(admin, callArgs, { config }); + const result = await call(admin, callArgs, { config }); return result[0]; } -module.exports = { - bind: bind, - uploadContract: uploadContract, - put: put, - get: get, - contains: contains, - size: size, - transferOwnership: transferOwnership, - getOwner: getOwner, +export { + bind, + uploadContract, + put, + get, + contains, + size, + transferOwnership, + getOwner, }; diff --git a/collections/hashmap/test/hashmap.test.js b/collections/hashmap/test/hashmap.test.js index 104fc50..dab321c 100644 --- a/collections/hashmap/test/hashmap.test.js +++ b/collections/hashmap/test/hashmap.test.js @@ -1,143 +1,142 @@ -require('co-mocha'); -const { assert } = require('chai') -const { rest, util } = require('blockapps-rest'); -const { getYamlFile } = require('../../../util/config'); +import { assert } from 'chai'; +import { rest, util } from 'blockapps-rest'; +import { getYamlFile } from '../../../util/config'; +import * as hashmapJs from '../hashmap'; + const { createUser } = rest; const config = getYamlFile('config.yaml'); -const hashmapJs = require('../hashmap'); - const adminName = util.uid('Admin'); const adminPassword = '1234'; const otherAdminName = util.uid('OtherAdmin'); const otherAdminPassword = '5678'; -describe('Hashmap', function () { +describe('Hashmap', function() { this.timeout(config.timeout); let admin; let otherAdmin; - before(function* () { + before(async function () { console.log('creating admin') - admin = yield createUser({ username: adminName, password: adminPassword }, { config }); + admin = await createUser({ username: adminName, password: adminPassword }, { config }); console.log('creating user') - otherAdmin = yield createUser({ username: otherAdminName, password: otherAdminPassword }, { config }); + otherAdmin = await createUser({ username: otherAdminName, password: otherAdminPassword }, { config }); }); - it('getOwner', function* () { - const hashmap = yield hashmapJs.uploadContract(admin); - const owner = yield hashmap.getOwner({}); + it('getOwner', async function () { + const hashmap = await hashmapJs.uploadContract(admin); + const owner = await hashmap.getOwner({}); assert.equal(owner.toString(), admin.address); }); - it('put', function* () { - const hashmap = yield hashmapJs.uploadContract(admin); + it('put', async function () { + const hashmap = await hashmapJs.uploadContract(admin); const iuid = util.iuid(); const args = factory.createEntity(iuid); - yield hashmap.put(args); - const state = yield hashmap.getState(); + await hashmap.put(args); + const state = await hashmap.getState(); assert.equal(state.values.length, 2, 'length 2'); assert.equal(parseInt(state.values[1]), parseInt(args.value), 'value'); }); - it('get', function* () { - const hashmap = yield hashmapJs.uploadContract(admin); + it('get', async function () { + const hashmap = await hashmapJs.uploadContract(admin); const iuid = util.iuid(); const args = factory.createEntity(iuid); - yield hashmap.put(args); - const value = yield hashmap.get({ key: args.key }); + await hashmap.put(args); + const value = await hashmap.get({ key: args.key }); assert.equal(parseInt(value), parseInt(args.value), 'value'); - const notFound = yield hashmap.get({ key: '666' }); + const notFound = await hashmap.get({ key: '666' }); assert.equal(parseInt(notFound), 0, 'not found'); }); - it('contains', function* () { - const hashmap = yield hashmapJs.uploadContract(admin); + it('contains', async function () { + const hashmap = await hashmapJs.uploadContract(admin); const iuid = util.iuid(); const args = factory.createEntity(iuid); - yield hashmap.put(args); - const result = yield hashmap.contains({ key: args.key }); + await hashmap.put(args); + const result = await hashmap.contains({ key: args.key }); assert.equal(result, true, 'contains: true'); - const notFound = yield hashmap.contains({ key: '666' }); + const notFound = await hashmap.contains({ key: '666' }); assert.equal(notFound, false, 'contains: false'); }); - it('size', function* () { - const hashmap = yield hashmapJs.uploadContract(admin); + it('size', async function () { + const hashmap = await hashmapJs.uploadContract(admin); const iuid = util.iuid(); const args = factory.createEntity(iuid); - yield hashmap.put(args); - const size1 = yield hashmap.size({}); + await hashmap.put(args); + const size1 = await hashmap.size({}); assert.equal(size1, 1, 'size: 1'); args.key += 'x'; - yield hashmap.put(args); - const size2 = yield hashmap.size({}); + await hashmap.put(args); + const size2 = await hashmap.size({}); assert.equal(size2, 2, 'size: 2'); }); - it('transferOwnership to otherAdmin', function* () { - const hashmap = yield hashmapJs.uploadContract(admin); - yield hashmap.transferOwnership({ newOwner: otherAdmin.address }); - const owner = yield hashmap.getOwner({}); + it('transferOwnership to otherAdmin', async function () { + const hashmap = await hashmapJs.uploadContract(admin); + await hashmap.transferOwnership({ newOwner: otherAdmin.address }); + const owner = await hashmap.getOwner({}); assert.notEqual(owner.toString(), admin.address); assert.equal(owner.toString(), otherAdmin.address); }); - it('reject get from original admin', function* () { - const hashmap = yield hashmapJs.uploadContract(admin); + it('reject get from original admin', async function () { + const hashmap = await hashmapJs.uploadContract(admin); const iuid = util.iuid(); const args = factory.createEntity(iuid); - yield hashmap.put(args); - yield hashmap.transferOwnership({ newOwner: otherAdmin.address }); + await hashmap.put(args); + await hashmap.transferOwnership({ newOwner: otherAdmin.address }); - const result = yield hashmap.get({ key: args.key }); + const result = await hashmap.get({ key: args.key }); assert.equal(result.toString(), "0000000000000000000000000000000000000000"); }); - it('reject put from original admin', function* () { - const hashmap = yield hashmapJs.uploadContract(admin); - yield hashmap.transferOwnership({ newOwner: otherAdmin.address }); + it('reject put from original admin', async function () { + const hashmap = await hashmapJs.uploadContract(admin); + await hashmap.transferOwnership({ newOwner: otherAdmin.address }); const iuid = util.iuid(); const args = factory.createEntity(iuid); - yield hashmap.put(args); - const result = yield hashmapJs.get(otherAdmin, hashmap, { key: args.key }) + await hashmap.put(args); + const result = await hashmapJs.get(otherAdmin, hashmap, { key: args.key }) assert.equal(result.toString(), "0000000000000000000000000000000000000000"); - const result2 = yield hashmapJs.size(otherAdmin, hashmap, { key: args.key }) + const result2 = await hashmapJs.size(otherAdmin, hashmap, { key: args.key }) assert.equal(result2, 0); }); - it('reject contains from original admin', function* () { - const hashmap = yield hashmapJs.uploadContract(admin); + it('reject contains from original admin', async function () { + const hashmap = await hashmapJs.uploadContract(admin); const iuid = util.iuid(); const args = factory.createEntity(iuid); - yield hashmap.put(args); - yield hashmap.transferOwnership({ newOwner: otherAdmin.address }); + await hashmap.put(args); + await hashmap.transferOwnership({ newOwner: otherAdmin.address }); - const result = yield hashmap.contains({ key: args.key }); + const result = await hashmap.contains({ key: args.key }); assert.equal(result, false); }); - it('reject size from original admin', function* () { - const hashmap = yield hashmapJs.uploadContract(admin); + it('reject size from original admin', async function () { + const hashmap = await hashmapJs.uploadContract(admin); const iuid = util.iuid(); const args = factory.createEntity(iuid); - yield hashmap.put(args); - yield hashmap.transferOwnership({ newOwner: otherAdmin.address }); + await hashmap.put(args); + await hashmap.transferOwnership({ newOwner: otherAdmin.address }); - const result = yield hashmap.size({}); + const result = await hashmap.size({}); assert.equal(result, 0) }); - it('reject transferOwnership from original admin', function* () { - const newAdmin = yield createUser({ username: util.uid('newAdmin'), password: '4321' }, { config }); - const hashmap = yield hashmapJs.uploadContract(admin); - yield hashmap.transferOwnership({ newOwner: otherAdmin.address }); + it('reject transferOwnership from original admin', async function () { + const newAdmin = await createUser({ username: util.uid('newAdmin'), password: '4321' }, { config }); + const hashmap = await hashmapJs.uploadContract(admin); + await hashmap.transferOwnership({ newOwner: otherAdmin.address }); - const result = yield hashmap.transferOwnership({ newOwner: newAdmin.address }); + const result = await hashmap.transferOwnership({ newOwner: newAdmin.address }); assert.equal(result, false); }); }); diff --git a/collections/hashmap/test/unsafeHashmap.test.js b/collections/hashmap/test/unsafeHashmap.test.js index 04b1a86..2a11be6 100644 --- a/collections/hashmap/test/unsafeHashmap.test.js +++ b/collections/hashmap/test/unsafeHashmap.test.js @@ -1,13 +1,11 @@ -require('co-mocha') +import { assert } from 'chai'; +import { rest, util } from 'blockapps-rest'; +import { getYamlFile } from '../../../util/config'; +import * as unsafeHashmapJs from '../unsafeHashmap'; -const { assert } = require('chai') -const { rest, util } = require('blockapps-rest'); -const { getYamlFile } = require('../../../util/config'); const { createUser } = rest; const config = getYamlFile('config.yaml'); -const unsafeHashmapJs = require('../unsafeHashmap') - const adminName = util.uid('Admin') const adminPassword = '1234' @@ -16,78 +14,78 @@ describe('UnsafeHashmap', function () { let admin - before(function* () { + before(async function () { console.log('creating admin') - admin = yield createUser({username: adminName, password: adminPassword}, { config }) + admin = await createUser({ username: adminName, password: adminPassword }, { config }) }) - it('put', function* () { - const hashmap = yield unsafeHashmapJs.uploadContract(admin) + it('put', async function () { + const hashmap = await unsafeHashmapJs.uploadContract(admin) const iuid = util.iuid() const args = factory.createEntity(iuid) - yield hashmap.put(args) - const state = yield hashmap.getState() + await hashmap.put(args) + const state = await hashmap.getState() assert.equal(state.values.length, 2, 'length 2') assert.equal(parseInt(state.values[1]), parseInt(args.value), 'value') }) - it('get', function* () { - const hashmap = yield unsafeHashmapJs.uploadContract(admin) + it('get', async function () { + const hashmap = await unsafeHashmapJs.uploadContract(admin) const iuid = util.iuid() const args = factory.createEntity(iuid) - yield hashmap.put(args) - const value = yield hashmap.get({ key: args.key }) + await hashmap.put(args) + const value = await hashmap.get({ key: args.key }) assert.equal(parseInt(value), parseInt(args.value), 'value') - const notFound = yield hashmap.get({ key: '666' }) + const notFound = await hashmap.get({ key: '666' }) assert.equal(parseInt(notFound), 0, 'not found') }) - it('contains', function* () { - const hashmap = yield unsafeHashmapJs.uploadContract(admin) + it('contains', async function () { + const hashmap = await unsafeHashmapJs.uploadContract(admin) const iuid = util.iuid() const args = factory.createEntity(iuid) - yield hashmap.put(args) - const result = yield hashmap.contains({ key: args.key }) + await hashmap.put(args) + const result = await hashmap.contains({ key: args.key }) assert.equal(result, true, 'contains: true') - const notFound = yield hashmap.contains({ key: '666' }) + const notFound = await hashmap.contains({ key: '666' }) assert.equal(notFound, false, 'contains: false') }) - it('size', function* () { - const hashmap = yield unsafeHashmapJs.uploadContract(admin) + it('size', async function () { + const hashmap = await unsafeHashmapJs.uploadContract(admin) const iuid = util.iuid() const args = factory.createEntity(iuid) - yield hashmap.put(args) - const size1 = yield hashmap.size({}) + await hashmap.put(args) + const size1 = await hashmap.size({}) assert.equal(size1, 1, 'size: 1') args.key += 'x' - yield hashmap.put(args) - const size2 = yield hashmap.size({}) + await hashmap.put(args) + const size2 = await hashmap.size({}) assert.equal(size2, 2, 'size: 2') }) - it('remove', function* () { - const hashmap = yield unsafeHashmapJs.uploadContract(admin) + it('remove', async function () { + const hashmap = await unsafeHashmapJs.uploadContract(admin) const iuid = util.iuid() const count = 5; for (let i = 0; i < count; i++) { const args = factory.createEntity(iuid * 10 + i) - yield hashmap.put(args) + await hashmap.put(args) } - const { values } = yield hashmap.getState() + const { values } = await hashmap.getState() assert.equal(values.length, count + 1, 'length') // remove { const target = 2; const args = factory.createEntity(iuid * 10 + target) - yield hashmap.remove({ key: args.key }) - const { values } = yield hashmap.getState() - assert.equal(parseInt(values[target+1]), 0, 'zero now') + await hashmap.remove({ key: args.key }) + const { values } = await hashmap.getState() + assert.equal(parseInt(values[target + 1]), 0, 'zero now') // get removed element - const value = yield hashmap.get({ key: args.key }) + const value = await hashmap.get({ key: args.key }) assert.equal(parseInt(value), 0, 'zero') // contains removed element - const contains = yield hashmap.contains({ key: args.key }) + const contains = await hashmap.contains({ key: args.key }) assert.equal(contains, false, 'not contained') } }) diff --git a/collections/hashmap/unsafeHashmap.js b/collections/hashmap/unsafeHashmap.js index a256a5e..56290d8 100644 --- a/collections/hashmap/unsafeHashmap.js +++ b/collections/hashmap/unsafeHashmap.js @@ -1,108 +1,109 @@ -const { rest, util, importer } = require('blockapps-rest'); -const { getYamlFile } = require('../../util/config'); + +import { rest, util, importer } from 'blockapps-rest'; const { createContract, getState, call } = rest; +import { getYamlFile } from '../../util/config'; const config = getYamlFile('config.yaml'); const contractName = 'UnsafeHashmap' const contractFilename = `${config.libPath}/collections/hashmap/contracts/UnsafeHashmap.sol` -function* uploadContract(admin) { +async function uploadContract(admin) { const args = {} const contractArgs = { name: contractName, - source: yield importer.combine(contractFilename), + source: await importer.combine(contractFilename), args: util.usc(args) } - const contract = yield createContract(admin, contractArgs, { config }) + const contract = await createContract(admin, contractArgs, { config }) contract.src = 'removed' return bind(admin, contract) } function bind(admin, _contract) { const contract = _contract - contract.getState = function* () { - return yield getState(contract, { config }) + contract.getState = async function () { + return await getState(contract, { config }) } // TODO: Why we are using this function which is not in use - // contract.getStateVar = function* (args) { - // return yield rest.getStateVar(contract, args.name, args.count, args.offset, args.length) + // contract.getStateVar = async function (args) { + // return await rest.getStateVar(contract, args.name, args.count, args.offset, args.length) // } - contract.put = function* (args) { - return yield put(admin, contract, args) + contract.put = async function (args) { + return await put(admin, contract, args) } - contract.get = function* (args) { - return yield get(admin, contract, args) + contract.get = async function (args) { + return await get(admin, contract, args) } - contract.contains = function* (args) { - return yield contains(admin, contract, args) + contract.contains = async function (args) { + return await contains(admin, contract, args) } - contract.size = function* (args) { - return yield size(admin, contract, args) + contract.size = async function (args) { + return await size(admin, contract, args) } - contract.remove = function* (args) { - return yield remove(admin, contract, args) + contract.remove = async function (args) { + return await remove(admin, contract, args) } return contract } -function* put(admin, contract, args) { +async function put(admin, contract, args) { const callArgs = { contract, method: 'put', args: util.usc(args) } - const result = yield call(admin, callArgs, { config }) + const result = await call(admin, callArgs, { config }) return result } -function* get(admin, contract, args) { +async function get(admin, contract, args) { const callArgs = { contract, method: 'get', args: util.usc(args) } - const result = yield call(admin, callArgs, { config }) + const result = await call(admin, callArgs, { config }) return result[0] } -function* contains(admin, contract, args) { +async function contains(admin, contract, args) { const callArgs = { contract, method: 'contains', args: util.usc(args) } - const result = yield call(admin, callArgs, { config }) + const result = await call(admin, callArgs, { config }) return result[0] == true } -function* size(admin, contract, args) { +async function size(admin, contract, args) { const callArgs = { contract, method: 'size', args: util.usc(args) } - const result = yield call(admin, callArgs, { config }) + const result = await call(admin, callArgs, { config }) return parseInt(result[0]) } -function* remove(admin, contract, args) { +async function remove(admin, contract, args) { const callArgs = { contract, method: 'remove', args: util.usc(args) } - yield call(admin, callArgs, { config }) + await call(admin, callArgs, { config }) } -module.exports = { +export { bind, uploadContract, } diff --git a/package.json b/package.json index 23a25c5..621b7b6 100644 --- a/package.json +++ b/package.json @@ -4,12 +4,12 @@ "description": "BlockApps Solidity Lib", "main": "", "scripts": { + "mocha-babel": "node_modules/.bin/mocha --require @babel/register", "test": "find . -type f -name '*.test.js' ! -path './node_modules/*' | xargs mocha ", - "test:hashmap": "mocha collections/hashmap/test/hashmap.test.js --config config.yaml -b", - "test:permission": "mocha auth/permission/test/ --config config.yaml -b --api-debug --compilers js:@babel/register", - "test:user": "mocha auth/user/test/ --config config.yaml -b ", - "test:solc": "find . -name '*.sol' -print | xargs solc --allow-paths '.' 2>&1", - "test:abc": "mocha auth/user/test/abc.test.js --config config.yaml -b --compilers js:@babel/register " + "test:hashmap": "yarn mocha-babel collections/hashmap/test/hashmap.test.js --config config.yaml -b", + "test:permission": "yarn mocha-babel auth/permission/test/ --config config.yaml -b --api-debug", + "test:user": "auth/user/test/ --config config.yaml -b ", + "test:solc": "find . -name '*.sol' -print | xargs solc --allow-paths '.' 2>&1" }, "repository": { "type": "git", diff --git a/util/config.js b/util/config.js index 0956dfb..33f2f96 100644 --- a/util/config.js +++ b/util/config.js @@ -1,12 +1,12 @@ // QUEST: is this function is good to be here or we can move to rest ? -const fs = require('fs'); -const yaml = require('js-yaml'); +import fs from 'fs'; +import yaml from 'js-yaml'; // read a yaml or die function getYamlFile(yamlFilename) { - return yaml.safeLoad(fs.readFileSync(yamlFilename, 'utf8')); + return yaml.safeLoad(fs.readFileSync(yamlFilename, 'utf8')); } -module.exports = { +export { getYamlFile }; From bbd4643501a05871b05f481a12d765b2fa4c6f1c Mon Sep 17 00:00:00 2001 From: Tanuj Soni Date: Wed, 20 Mar 2019 16:15:25 +0530 Subject: [PATCH 08/18] [SER-25_compatibilityWithRest] Minor fixes --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 621b7b6..304e283 100644 --- a/package.json +++ b/package.json @@ -6,7 +6,7 @@ "scripts": { "mocha-babel": "node_modules/.bin/mocha --require @babel/register", "test": "find . -type f -name '*.test.js' ! -path './node_modules/*' | xargs mocha ", - "test:hashmap": "yarn mocha-babel collections/hashmap/test/hashmap.test.js --config config.yaml -b", + "test:hashmap": "yarn mocha-babel collections/hashmap/test/ --config config.yaml -b", "test:permission": "yarn mocha-babel auth/permission/test/ --config config.yaml -b --api-debug", "test:user": "auth/user/test/ --config config.yaml -b ", "test:solc": "find . -name '*.sol' -print | xargs solc --allow-paths '.' 2>&1" From fb9575f2e50341f7d303d8103032938768b0e642 Mon Sep 17 00:00:00 2001 From: Tanuj Soni Date: Wed, 20 Mar 2019 17:49:36 +0530 Subject: [PATCH 09/18] [SER-25_compatibilityWithRest] PermissionManager are now using async/await --- auth/permission/permissionManager.js | 82 ++++---- auth/permission/permissionedHashmap.js | 65 +++--- .../permission/test/permissionManager.test.js | 198 +++++++++--------- .../test/permissionedHashmap.test.js | 103 +++++---- 4 files changed, 222 insertions(+), 226 deletions(-) diff --git a/auth/permission/permissionManager.js b/auth/permission/permissionManager.js index 0d949ee..cf3e35e 100644 --- a/auth/permission/permissionManager.js +++ b/auth/permission/permissionManager.js @@ -1,8 +1,8 @@ -const { rest, util, importer } = require('blockapps-rest'); -const { getYamlFile } = require('../../util/config'); +import { rest, util, importer } from 'blockapps-rest'; const { createContract, getState, call, RestError } = rest; + +import { getYamlFile } from '../../util/config'; const config = getYamlFile('config.yaml'); -// TODO: const logger = console const contractName = 'PermissionManager'; const contractFilename = `./auth/permission/contracts/PermissionManager.sol`; @@ -19,53 +19,53 @@ util.bitmaskToEnumString = function (bitmask, bitmaskEnum) { } -function* uploadContract(admin, master) { +async function uploadContract(admin, master) { // NOTE: in production, the contract is created and owned by the AdminInterface // for testing purposes the creator is the admin user const args = { master: master.address, owner: admin.address }; const contractArgs = { name: contractName, - source: yield importer.combine(contractFilename), + source: await importer.combine(contractFilename), args: util.usc(args) } - const contract = yield createContract(admin, contractArgs, { config }) + const contract = await createContract(admin, contractArgs, { config }) contract.src = 'removed'; return bind(admin, contract); } -function* createPermissionsAdmin(admin, master, permissions) { - const contract = yield uploadContract(admin, master); +async function createPermissionsAdmin(admin, master, permissions) { + const contract = await uploadContract(admin, master); // add permission to create and modify contracts const args = { address: admin.address, id: admin.name, permissions: permissions }; - yield contract.grant(args); + await contract.grant(args); return contract; } function bind(admin, contract) { - contract.getState = function* () { - return yield getState(contract, { config }); + contract.getState = async function () { + return await getState(contract, { config }); } - contract.grant = function* (args) { - return yield grant(admin, contract, args); + contract.grant = async function (args) { + return await grant(admin, contract, args); } - contract.getPermissions = function* (args) { - return yield getPermissions(admin, contract, args); + contract.getPermissions = async function (args) { + return await getPermissions(admin, contract, args); } - contract.revoke = function* (args) { - return yield revoke(admin, contract, args); + contract.revoke = async function (args) { + return await revoke(admin, contract, args); } - contract.check = function* (args) { - return yield check(admin, contract, args); + contract.check = async function (args) { + return await check(admin, contract, args); } - contract.listPermits = function* (args) { - return yield listPermits(admin, contract, args); + contract.listPermits = async function (args) { + return await listPermits(admin, contract, args); } - contract.listEvents = function* (args) { - return yield listEvents(admin, contract, args); + contract.listEvents = async function (args) { + return await listEvents(admin, contract, args); } - contract.transferOwnership = function* (args) { - return yield transferOwnership(admin, contract, args); + contract.transferOwnership = async function (args) { + return await transferOwnership(admin, contract, args); } return contract; } @@ -80,7 +80,7 @@ function bindAddress(admin, address) { // throws: ErrorCodes // returns: updated permissions -function* grant(admin, contract, args) { +async function grant(admin, contract, args) { // function grant(address _address, uint _permissions) returns (ErrorCodes) { const callArgs = { contract, @@ -88,7 +88,7 @@ function* grant(admin, contract, args) { args: util.usc(args) } - const [restStatus, permissions] = yield call(admin, callArgs, { config }); + const [restStatus, permissions] = await call(admin, callArgs, { config }); if (restStatus != '200') { throw new Error(restStatus); } @@ -97,7 +97,7 @@ function* grant(admin, contract, args) { // throws: ErrorCodes // returns: permissions -function* getPermissions(admin, contract, args) { +async function getPermissions(admin, contract, args) { // function getPermissions(address _address) returns (ErrorCodes, uint) { const callArgs = { contract, @@ -105,7 +105,7 @@ function* getPermissions(admin, contract, args) { args: util.usc(args) } - const [restStatus, permissions] = yield call(admin, callArgs, { config }); + const [restStatus, permissions] = await call(admin, callArgs, { config }); if (restStatus != '200') { throw new RestError(restStatus, callArgs.method, callArgs.args); } @@ -114,7 +114,7 @@ function* getPermissions(admin, contract, args) { // throws: ErrorCodes // returns: true if permitted -function* check(admin, contract, args) { +async function check(admin, contract, args) { // function check(address _address, uint _permissions) returns (ErrorCodes) { const callArgs = { contract, @@ -122,7 +122,7 @@ function* check(admin, contract, args) { args: util.usc(args) } - const [restStatus] = yield call(admin, callArgs, { config }); + const [restStatus] = await call(admin, callArgs, { config }); if (restStatus != '200') { return false; } @@ -130,7 +130,7 @@ function* check(admin, contract, args) { } // throws: ErrorCodes -function* revoke(admin, contract, args) { +async function revoke(admin, contract, args) { // function revoke(address _address) returns (ErrorCodes) { const callArgs = { contract, @@ -138,7 +138,7 @@ function* revoke(admin, contract, args) { args: util.usc(args) } - const [restStatus] = yield call(admin, callArgs, { config }); + const [restStatus] = await call(admin, callArgs, { config }); // TODO: reststatus if (restStatus != '200') { throw new RestError(restStatus, callArgs.method, callArgs.args); @@ -147,14 +147,14 @@ function* revoke(admin, contract, args) { } // transferOwnership -function* transferOwnership(admin, contract, args) { +async function transferOwnership(admin, contract, args) { const callArgs = { contract, method: 'transferOwnership', args: util.usc(args) } - - const [restStatus] = yield call(admin, callArgs, {}); + + const [restStatus] = await call(admin, callArgs, {}); if (restStatus != '200') { throw new RestError(restStatus, method, args); } @@ -162,8 +162,8 @@ function* transferOwnership(admin, contract, args) { } // list -function* listPermits(admin, contract, args) { - const { permits } = yield contract.getState() +async function listPermits(admin, contract, args) { + const { permits } = await contract.getState() const permitsJson = permits.map((permit) => { permit.permissionsHex = Number(permit.permissions).toString(16) permit.strings = util.bitmaskToEnumString(permit.permissions, args.enum) @@ -172,8 +172,8 @@ function* listPermits(admin, contract, args) { return permitsJson } -function* listEvents(admin, contract, args) { - const { eventLog } = yield contract.getState() +async function listEvents(admin, contract, args) { + const { eventLog } = await contract.getState() const eventsJson = eventLog.map((event) => { event.permissionsHex = Number(event.permissions).toString(16) event.strings = util.bitmaskToEnumString(event.permissions, args.enum) @@ -182,7 +182,7 @@ function* listEvents(admin, contract, args) { return eventsJson } -module.exports = { +export { bind, bindAddress, uploadContract, diff --git a/auth/permission/permissionedHashmap.js b/auth/permission/permissionedHashmap.js index 4b53f06..e4621b2 100644 --- a/auth/permission/permissionedHashmap.js +++ b/auth/permission/permissionedHashmap.js @@ -1,50 +1,49 @@ -require('co-mocha') - -const { rest, util, importer } = require('blockapps-rest'); -const { getYamlFile } = require('../../util/config'); +import { rest, util, importer } from 'blockapps-rest'; const { createContract, getState, call } = rest; + +import { getYamlFile } from '../../util/config'; const config = getYamlFile('config.yaml'); const contractName = 'PermissionedHashmap' const contractFilename = `${config.libPath}/auth/permission/contracts/PermissionedHashmap.sol` -function* uploadContract(admin, permissionManager) { +async function uploadContract(admin, permissionManager) { const args = { permissionManager: permissionManager.address } const contractArgs = { name: contractName, - source: yield importer.combine(contractFilename), + source: await importer.combine(contractFilename), args: util.usc(args) } - const contract = yield createContract(admin, contractArgs, { config }) + const contract = await createContract(admin, contractArgs, { config }) contract.src = 'removed' return bind(admin, contract) } function bind(admin, _contract) { const contract = _contract - contract.getState = function* () { - return yield getState(contract, { config }) + contract.getState = async function () { + return await getState(contract, { config }) } - // TODO: Why we are using this function which is not in use - // contract.getStateVar = function* (args) { - // return yield rest.getStateVar(contract, args.name, args.count, args.offset, args.length) + // TODO: it is not in new rest (do we have the same with diffrent name ?) + // contract.getStateVar = async function(args) { + // return await rest.getStateVar(contract, args.name, args.count, args.offset, args.length) // } - contract.put = function* (args) { - return yield put(admin, contract, args) + contract.put = async function (args) { + return await put(admin, contract, args) } - contract.get = function* (args) { - return yield get(admin, contract, args) + contract.get = async function (args) { + return await get(admin, contract, args) } - contract.contains = function* (args) { - return yield contains(admin, contract, args) + contract.contains = async function (args) { + return await contains(admin, contract, args) } - contract.size = function* (args) { - return yield size(admin, contract, args) + contract.size = async function (args) { + return await size(admin, contract, args) } - contract.remove = function* (args) { - return yield remove(admin, contract, args) + contract.remove = async function (args) { + return await remove(admin, contract, args) } return contract @@ -58,60 +57,60 @@ function bindAddress(admin, address) { return bind(admin, contract) } -function* put(admin, contract, args) { +async function put(admin, contract, args) { const callArgs = { contract, method: 'put', args: util.usc(args) } - const result = yield call(admin, callArgs, { config }) + const result = await call(admin, callArgs, { config }) return result } -function* get(admin, contract, args) { +async function get(admin, contract, args) { const callArgs = { contract, method: 'get', args: util.usc(args) } - const result = yield call(admin, callArgs, { config }) + const result = await call(admin, callArgs, { config }) return result[0] } -function* contains(admin, contract, args) { +async function contains(admin, contract, args) { const callArgs = { contract, method: 'contains', args: util.usc(args) } - const result = yield call(admin, callArgs, { config }) + const result = await call(admin, callArgs, { config }) return result[0] == true } -function* size(admin, contract, args) { +async function size(admin, contract, args) { const callArgs = { contract, method: 'size', args: util.usc(args) } - const result = yield call(admin, callArgs, { config }) + const result = await call(admin, callArgs, { config }) return parseInt(result[0], 10) } -function* remove(admin, contract, args) { +async function remove(admin, contract, args) { const callArgs = { contract, method: 'remove', args: util.usc(args) } - yield call(admin, callArgs, { config }) + await call(admin, callArgs, { config }) } -module.exports = { +export { bind, bindAddress, uploadContract, diff --git a/auth/permission/test/permissionManager.test.js b/auth/permission/test/permissionManager.test.js index b8d1426..0e6df24 100644 --- a/auth/permission/test/permissionManager.test.js +++ b/auth/permission/test/permissionManager.test.js @@ -1,12 +1,11 @@ -require('co-mocha') -const { assert } = require('chai') -const { rest, util, parser, fsUtil } = require('blockapps-rest'); -const { getYamlFile } = require('../../../util/config'); +import { assert } from 'chai'; +import { rest, util, fsUtil, parser } from 'blockapps-rest'; const { createUser, call } = rest; -const config = getYamlFile('config.yaml'); +import { getYamlFile } from '../../../util/config'; +import * as permissionManagerJs from '../permissionManager'; -const permissionManagerJs = require('../permissionManager') +const config = getYamlFile('config.yaml'); const adminName = util.uid('Admin') const adminPassword = '1234' @@ -19,174 +18,174 @@ describe('PermissionManager tests', function () { let admin, master, EventLogType, RestStatus; // get ready: admin-user and manager-contract - before(function* () { + before(async function () { // Parse fields const restStatusSource = fsUtil.get(`${util.cwd}/rest/contracts/RestStatus.sol`) - RestStatus = yield parser.parseFields(restStatusSource); - + RestStatus = await parser.parseFields(restStatusSource); + // parse Enums const source = fsUtil.get(`${util.cwd}/auth/permission/contracts/EventLogType.sol`) - EventLogType = yield parser.parseEnum(source); + EventLogType = await parser.parseEnum(source); console.log('creating admin') - admin = yield createUser({ username: adminName, password: adminPassword }, { config }) + admin = await createUser({ username: adminName, password: adminPassword }, { config }) console.log('creating master') - master = yield createUser({ username: masterName, password: masterPassword }, { config }) + master = await createUser({ username: masterName, password: masterPassword }, { config }) }) - it('upload', function* () { - const contract = yield permissionManagerJs.uploadContract(admin, master) - const { eventLog } = yield contract.getState() + it('upload', async function () { + const contract = await permissionManagerJs.uploadContract(admin, master) + const { eventLog } = await contract.getState() assert.isDefined(eventLog, 'eventLog') assert.equal(eventLog.length, 0, 'empty') }) - it('Grant (address with permissions)', function* () { - const contract = yield permissionManagerJs.uploadContract(admin, master) + it('Grant (address with permissions)', async function () { + const contract = await permissionManagerJs.uploadContract(admin, master) const uid = util.uid() - const args = yield createPermitArgs(uid) - const permissions = yield contract.grant(args) + const args = await createPermitArgs(uid) + const permissions = await contract.grant(args) assert.equal(permissions, args.permissions, 'permissions added') - const state = yield contract.getState() + const state = await contract.getState() const permit = state.permits[1] assert.equal(permit.adrs, args.address, ' address in array') assert.equal(permit.permissions, args.permissions, ' permissions in array') assert.equal(permit.id, args.id, 'id in array') }) - it('Grant Multiple Permissions', function* () { - const contract = yield permissionManagerJs.uploadContract(admin, master) + it('Grant Multiple Permissions', async function () { + const contract = await permissionManagerJs.uploadContract(admin, master) const uid = util.uid() - const args = yield createPermitArgs(uid) + const args = await createPermitArgs(uid) // add permit { - const permissions = yield contract.grant(args) + const permissions = await contract.grant(args) assert.equal(permissions, args.permissions, 'permissions added') } // add different permission { args.permissions = 0x30 - const permissions = yield contract.grant(args) + const permissions = await contract.grant(args) const expected = 0x30 | 0x03 assert.equal(permissions, expected, 'permissions added') } }) - it('Get permit', function* () { - const contract = yield permissionManagerJs.uploadContract(admin, master) + it('Get permit', async function () { + const contract = await permissionManagerJs.uploadContract(admin, master) const uid = util.uid() - const permitArgs = yield createPermitArgs(uid) - yield contract.grant(permitArgs) + const permitArgs = await createPermitArgs(uid) + await contract.grant(permitArgs) const args = { address: permitArgs.address } - const permissions = yield contract.getPermissions(args) + const permissions = await contract.getPermissions(args) assert.equal(permissions, permitArgs.permissions, 'permissions') { permitArgs.permissions = 0x30 - yield contract.grant(permitArgs) - const permissions2 = yield contract.getPermissions(args) + await contract.grant(permitArgs) + const permissions2 = await contract.getPermissions(args) const expected = 0x03 | 0x30 assert.equal(permissions2, expected, 'new permissions') } }) - it('Get permit 404', function* () { - const contract = yield permissionManagerJs.uploadContract(admin, master) + it('Get permit 404', async function () { + const contract = await permissionManagerJs.uploadContract(admin, master) const args = { address: 1234 } try { - yield contract.getPermissions(args) + await contract.getPermissions(args) } catch (e) { assert.equal(e.response.status, '404', 'should Throws 404 Not found') } }) - it.skip('Get permit - history', function* () { - const contract = yield permissionManagerJs.uploadContract(admin, master) + it.skip('Get permit - history', async function () { + const contract = await permissionManagerJs.uploadContract(admin, master) const uid = util.uid() - const permitArgs = yield createPermitArgs(uid) - yield contract.grant(permitArgs) + const permitArgs = await createPermitArgs(uid) + await contract.grant(permitArgs) // found { const args = { address: permitArgs.address } - const permissions = yield contract.getPermissions(args) + const permissions = await contract.getPermissions(args) assert.equal(permissions, permitArgs.permissions, 'permissions') } // not found { const args = { address: uid } - yield assert.shouldThrowRest(function* () { - const permissions = yield contract.getPermissions(args) + await assert.shouldThrowRest(async function () { + const permissions = await contract.getPermissions(args) }, RestStatus.NOT_FOUND) } // check the history - const { history } = yield contract.getState() + const { history } = await contract.getState() assert.equal(history[0], permitArgs.address, 'valid call') assert.equal(history[1], uid, 'valid call') }) - it('Check permissions', function* () { - const contract = yield permissionManagerJs.uploadContract(admin, master) + it('Check permissions', async function () { + const contract = await permissionManagerJs.uploadContract(admin, master) const uid = util.uid() - const permitArgs = yield createPermitArgs(uid) - yield contract.grant(permitArgs) + const permitArgs = await createPermitArgs(uid) + await contract.grant(permitArgs) // check const args = { address: permitArgs.address, permissions: permitArgs.permissions } - const isPermitted = yield contract.check(args) + const isPermitted = await contract.check(args) assert.equal(isPermitted, true, 'permitted') { const args = { address: permitArgs.address, permissions: 0xFF } - const isPermitted = yield contract.check(args) + const isPermitted = await contract.check(args) assert.equal(isPermitted, false, 'NOT permitted') } }) - it('Revoke permissions', function* () { - const contract = yield permissionManagerJs.uploadContract(admin, master) + it('Revoke permissions', async function () { + const contract = await permissionManagerJs.uploadContract(admin, master) const uid = util.uid() - const permitArgs = yield createPermitArgs(uid) - yield contract.grant(permitArgs) + const permitArgs = await createPermitArgs(uid) + await contract.grant(permitArgs) // get permissions const args = { address: permitArgs.address } - const permissions = yield contract.getPermissions(args) + const permissions = await contract.getPermissions(args) assert.equal(permissions, permitArgs.permissions, 'permissions') // revoke { const args = { address: permitArgs.address } - yield contract.revoke(args) + await contract.revoke(args) } // get permissions { const args = { address: permitArgs.address } - const permissions = yield contract.getPermissions(args) + const permissions = await contract.getPermissions(args) assert.equal(permissions, 0, 'no permissions') } }) - it('Revoke - 404', function* () { - const contract = yield permissionManagerJs.uploadContract(admin, master) + it('Revoke - 404', async function () { + const contract = await permissionManagerJs.uploadContract(admin, master) const args = { address: 1234 } // TODO: Add shouldThrowRest in util or blockapps-rest - // yield assert.shouldThrowRest(function* () { - // yield contract.revoke(args) + // await assert.shouldThrowRest(async function () { + // await contract.revoke(args) // }, RestStatus.BAD_REQUEST) try { - yield contract.revoke(args) + await contract.revoke(args) } catch (e) { assert.equal(e.response.status, RestStatus.BAD_REQUEST, 'should throws 404 Not found') } }) - it('Transfer Ownership - AUTHORIZED', function* () { + it('Transfer Ownership - AUTHORIZED', async function () { const uid = util.uid() - const newOwner = yield createUser({ username: `NewOwner_${uid}`, password: '1234' }, { config }) - const contract = yield permissionManagerJs.uploadContract(admin, master) + const newOwner = await createUser({ username: `NewOwner_${uid}`, password: '1234' }, { config }) + const contract = await permissionManagerJs.uploadContract(admin, master) // transfer ownership to a new admin, by the master { const callArgs = { @@ -195,18 +194,18 @@ describe('PermissionManager tests', function () { args: util.usc({ newOwner: newOwner.address }) } - const [restStatus] = yield call(master, callArgs, { config }) + const [restStatus] = await call(master, callArgs, { config }) assert.equal(restStatus, RestStatus.OK, 'should succeed') } }) - it('Transfer Ownership - positive case', function* () { + it('Transfer Ownership - positive case', async function () { const uid = util.uid() - const newOwner = yield createUser({ username: `NewOwner_${uid}`, password: '1234' }, { config }) - const contract = yield permissionManagerJs.uploadContract(admin, master) + const newOwner = await createUser({ username: `NewOwner_${uid}`, password: '1234' }, { config }) + const contract = await permissionManagerJs.uploadContract(admin, master) // admin works - const args = yield createPermitArgs(uid) - yield contract.grant(args) + const args = await createPermitArgs(uid) + await contract.grant(args) // new admin unauthorized { const callArgs = { @@ -214,7 +213,7 @@ describe('PermissionManager tests', function () { method: 'grant', args: util.usc(args) } - const [restStatus, permissions] = yield call(newOwner, callArgs, { config }) + const [restStatus, permissions] = await call(newOwner, callArgs, { config }) assert.equal(restStatus, RestStatus.UNAUTHORIZED, 'should fail') } // transfer ownership - must be master @@ -226,7 +225,7 @@ describe('PermissionManager tests', function () { args: util.usc(args) } - const [restStatus] = yield call(master, callArgs, { config }) + const [restStatus] = await call(master, callArgs, { config }) assert.equal(restStatus, RestStatus.OK, 'should succeed') } // old admin unauthorized @@ -237,7 +236,7 @@ describe('PermissionManager tests', function () { args: util.usc(args) } - const [restStatus] = yield call(admin, callArgs, { config }) + const [restStatus] = await call(admin, callArgs, { config }) assert.equal(restStatus, RestStatus.UNAUTHORIZED, 'should fail') } // new admin works @@ -248,17 +247,17 @@ describe('PermissionManager tests', function () { args: util.usc(args) } - const [restStatus] = yield call(newOwner, callArgs, { config }) + const [restStatus] = await call(newOwner, callArgs, { config }) assert.equal(restStatus, RestStatus.OK, 'should succeed') } }) - it('Transfer Ownership - UNAUTHORIZED', function* () { + it('Transfer Ownership - UNAUTHORIZED', async function () { const uid = util.uid() - const contract = yield permissionManagerJs.uploadContract(admin, master) + const contract = await permissionManagerJs.uploadContract(admin, master) // transfer ownership to attacker { - const attacker = yield createUser({ username: `Attacker_${uid}`, password: '1234' }, { config }) + const attacker = await createUser({ username: `Attacker_${uid}`, password: '1234' }, { config }) const args = { newOwner: attacker.address } const callArgs = { @@ -267,31 +266,31 @@ describe('PermissionManager tests', function () { args: util.usc(args) } - const [restStatus] = yield call(attacker, callArgs, { config }) + const [restStatus] = await call(attacker, callArgs, { config }) assert.equal(restStatus, RestStatus.UNAUTHORIZED, 'should fail') } }) - it('EventLog - Check permissions', function* () { - const contract = yield permissionManagerJs.uploadContract(admin, master) + it('EventLog - Check permissions', async function () { + const contract = await permissionManagerJs.uploadContract(admin, master) const uid = util.uid() - const permitArgs = yield createPermitArgs(uid) - yield contract.grant(permitArgs) + const permitArgs = await createPermitArgs(uid) + await contract.grant(permitArgs) // check OK - should not be logged { const args = { address: permitArgs.address, permissions: permitArgs.permissions } - yield contract.check(args) + await contract.check(args) // event log - const { eventLog } = yield contract.getState() + const { eventLog } = await contract.getState() assert.equal(eventLog.length, 1, 'not logged') } // check unauthorized { const args = { address: permitArgs.address, permissions: 0x8 } - yield contract.check(args) + await contract.check(args) // event log - const { eventLog } = yield contract.getState() + const { eventLog } = await contract.getState() assert.equal(eventLog.length, 2, 'one entry') const eventLogEntry = eventLog[1]; assert.equal(eventLogEntry.msgSender, admin.address, 'msg sender') @@ -304,14 +303,14 @@ describe('PermissionManager tests', function () { } }) - it('EventLog - Grant', function* () { - const contract = yield permissionManagerJs.uploadContract(admin, master) + it('EventLog - Grant', async function () { + const contract = await permissionManagerJs.uploadContract(admin, master) const uid = util.uid() - const args = yield createPermitArgs(uid) - yield contract.grant(args) + const args = await createPermitArgs(uid) + await contract.grant(args) // event log - const { eventLog } = yield contract.getState() + const { eventLog } = await contract.getState() assert.equal(eventLog.length, 1, 'one entry') const eventLogEntry = eventLog[0]; assert.equal(eventLogEntry.msgSender, admin.address, 'msg sender') @@ -323,19 +322,19 @@ describe('PermissionManager tests', function () { assert.equal(eventLogEntry.result, RestStatus.OK, 'result') }) - it('EventLog - Revoke', function* () { - const contract = yield permissionManagerJs.uploadContract(admin, master) + it('EventLog - Revoke', async function () { + const contract = await permissionManagerJs.uploadContract(admin, master) const uid = util.uid() - const permitArgs = yield createPermitArgs(uid) - yield contract.grant(permitArgs) + const permitArgs = await createPermitArgs(uid) + await contract.grant(permitArgs) // revoke { const args = { address: permitArgs.address } - yield contract.revoke(args) + await contract.revoke(args) } // event log - const { eventLog } = yield contract.getState() + const { eventLog } = await contract.getState() assert.equal(eventLog.length, 2, 'two entries') const eventLogEntry = eventLog[1]; assert.equal(eventLogEntry.msgSender, admin.address, 'msg sender') @@ -349,14 +348,13 @@ describe('PermissionManager tests', function () { }) -function* createPermitArgs(uid) { - // TODO: +async function createPermitArgs(uid) { const userArgs = { username: `username_${uid}`, password: adminPassword }; - const user = yield createUser(userArgs, { config }) + const user = await createUser(userArgs, { config }) const permissions = 0x3 const args = { diff --git a/auth/permission/test/permissionedHashmap.test.js b/auth/permission/test/permissionedHashmap.test.js index 667d0c8..4b31e2c 100644 --- a/auth/permission/test/permissionedHashmap.test.js +++ b/auth/permission/test/permissionedHashmap.test.js @@ -1,11 +1,10 @@ -require('co-mocha') - -const { assert } = require('chai') -const { rest, util, importer } = require('blockapps-rest'); -const { getYamlFile } = require('../../../util/config'); +import { assert } from 'chai'; +import { rest, util, importer } from 'blockapps-rest'; const { createUser, call, createContract } = rest; -const permissionedHashmapJs = require('../permissionedHashmap') +import { getYamlFile } from '../../../util/config'; +import * as permissionedHashmapJs from '../permissionedHashmap'; + const config = getYamlFile('config.yaml'); @@ -22,29 +21,29 @@ describe('PermissionedHashmap tests', function () { let admin, master, attacker, hashmapPermissionManager // get ready: admin-user and manager-contract - before(function* () { + before(async function () { console.log('creating admin') - admin = yield createUser({ username: adminName, password: adminPassword }, { config }) + admin = await createUser({ username: adminName, password: adminPassword }, { config }) console.log('creating master') - master = yield createUser({ username: masterName, password: masterPassword }, { config }) + master = await createUser({ username: masterName, password: masterPassword }, { config }) console.log('creating attacker') - attacker = yield createUser({ username: attackerName, password: attackerPassword }, { config }) + attacker = await createUser({ username: attackerName, password: attackerPassword }, { config }) // pm - hashmapPermissionManager = yield createHashmapPermissionManager(admin, master) + hashmapPermissionManager = await createHashmapPermissionManager(admin, master) }) - it('put', function* () { - const contract = yield permissionedHashmapJs.uploadContract(admin, hashmapPermissionManager) + it('put', async function () { + const contract = await permissionedHashmapJs.uploadContract(admin, hashmapPermissionManager) const iuid = util.iuid(); const args = factory.createEntity(iuid); - yield contract.put(args); - const state = yield contract.getState(); + await contract.put(args); + const state = await contract.getState(); assert.equal(state.values.length, 2, 'length 2'); assert.equal(parseInt(state.values[1]), parseInt(args.value), 'value'); }); - it('put - unauthorized', function* () { - const contract = yield permissionedHashmapJs.uploadContract(admin, hashmapPermissionManager) + it('put - unauthorized', async function () { + const contract = await permissionedHashmapJs.uploadContract(admin, hashmapPermissionManager) const iuid = util.iuid(); const args = factory.createEntity(iuid); @@ -54,84 +53,84 @@ describe('PermissionedHashmap tests', function () { args: util.usc(args) } - const result = yield call(attacker, callArgs, { config }) + const result = await call(attacker, callArgs, { config }) - const state = yield contract.getState(); + const state = await contract.getState(); assert.equal(state.values.length, 1, 'length 1 - did not put'); assert.equal(parseInt(state.values[0]), 0, 'empty'); }); - it('get', function* () { - const contract = yield permissionedHashmapJs.uploadContract(admin, hashmapPermissionManager) + it('get', async function () { + const contract = await permissionedHashmapJs.uploadContract(admin, hashmapPermissionManager) const iuid = util.iuid(); const args = factory.createEntity(iuid); // put - yield contract.put(args); + await contract.put(args); // get - const value = yield contract.get({ key: args.key }); + const value = await contract.get({ key: args.key }); assert.equal(parseInt(value), parseInt(args.value), 'value'); - const notFound = yield contract.get({ key: '666' }); + const notFound = await contract.get({ key: '666' }); assert.equal(parseInt(notFound), 0, 'not found'); }); - it('contains', function* () { - const contract = yield permissionedHashmapJs.uploadContract(admin, hashmapPermissionManager) + it('contains', async function () { + const contract = await permissionedHashmapJs.uploadContract(admin, hashmapPermissionManager) const iuid = util.iuid(); const args = factory.createEntity(iuid); //put - yield contract.put(args); + await contract.put(args); // contains - const result = yield contract.contains({ key: args.key }); + const result = await contract.contains({ key: args.key }); assert.equal(result, true, 'contains: true'); - const notFound = yield contract.contains({ key: '666' }); + const notFound = await contract.contains({ key: '666' }); assert.equal(notFound, false, 'contains: false'); }); - it('size', function* () { - const contract = yield permissionedHashmapJs.uploadContract(admin, hashmapPermissionManager) + it('size', async function () { + const contract = await permissionedHashmapJs.uploadContract(admin, hashmapPermissionManager) const iuid = util.iuid(); const args = factory.createEntity(iuid); - yield contract.put(args); - const size1 = yield contract.size({}); + await contract.put(args); + const size1 = await contract.size({}); assert.equal(size1, 1, 'size: 1'); args.key += 'x'; - yield contract.put(args); - const size2 = yield contract.size({}); + await contract.put(args); + const size2 = await contract.size({}); assert.equal(size2, 2, 'size: 2'); }); - it('remove', function* () { - const contract = yield permissionedHashmapJs.uploadContract(admin, hashmapPermissionManager) + it('remove', async function () { + const contract = await permissionedHashmapJs.uploadContract(admin, hashmapPermissionManager) const iuid = util.iuid(); const putArgs = factory.createEntity(iuid); // put - yield contract.put(putArgs); + await contract.put(putArgs); const args = { key: putArgs.key } // contains { - const result = yield contract.contains(args); + const result = await contract.contains(args); assert.equal(result, true, 'contains: true'); } // remove - yield contract.remove(args); - yield contract.getState() + await contract.remove(args); + await contract.getState() // contains not { - const result = yield contract.contains(args); + const result = await contract.contains(args); assert.equal(result, false, 'contains: not'); } }); - it('remove - unauthorized', function* () { - const contract = yield permissionedHashmapJs.uploadContract(admin, hashmapPermissionManager) + it('remove - unauthorized', async function () { + const contract = await permissionedHashmapJs.uploadContract(admin, hashmapPermissionManager) const iuid = util.iuid(); const putArgs = factory.createEntity(iuid); // put - yield contract.put(putArgs); + await contract.put(putArgs); const args = { key: putArgs.key } // contains { - const result = yield contract.contains(args); + const result = await contract.contains(args); assert.equal(result, true, 'contains: true'); } // remove @@ -140,12 +139,12 @@ describe('PermissionedHashmap tests', function () { method: 'remove', args: util.usc(args) } - const result = yield call(attacker, callArgs, { config }) + const result = await call(attacker, callArgs, { config }) - yield contract.getState() + await contract.getState() // still contained - was not removed { - const result = yield contract.contains(args); + const result = await contract.contains(args); assert.equal(result, true, 'contains: true'); } }); @@ -159,7 +158,7 @@ describe('PermissionedHashmap tests', function () { * @returns {object} the contract */ -function* createHashmapPermissionManager(admin, master) { +async function createHashmapPermissionManager(admin, master) { const contractName = 'HashmapPermissionManager'; const contractFilename = `${config.libPath}/auth/permission/test/fixtures/HashmapPermissionManager.sol`; const args = { @@ -169,11 +168,11 @@ function* createHashmapPermissionManager(admin, master) { const contractArgs = { name: contractName, - source: yield importer.combine(contractFilename), + source: await importer.combine(contractFilename), args: util.usc(args) } - const hashmapPermissionManager = yield createContract(admin, contractArgs, { config }); + const hashmapPermissionManager = await createContract(admin, contractArgs, { config }); return hashmapPermissionManager } From 36e2aaee881cca71dd46654db3c7a4e6614509eb Mon Sep 17 00:00:00 2001 From: Tanuj Soni Date: Wed, 20 Mar 2019 18:19:28 +0530 Subject: [PATCH 10/18] [SER-25_compatibilityWithRest] user and userManager is now using async/await --- auth/user/user.js | 66 ++++++++++++++++---------------- auth/user/userManager.js | 81 ++++++++++++++++++++-------------------- 2 files changed, 73 insertions(+), 74 deletions(-) diff --git a/auth/user/user.js b/auth/user/user.js index 26cd9be..921ca72 100644 --- a/auth/user/user.js +++ b/auth/user/user.js @@ -1,62 +1,60 @@ -const { rest, util, importer } = require('blockapps-rest'); -const { getYamlFile } = require('../../util/config'); -const { createContract, getState, call, search } = rest; +import { rest, util, importer } from 'blockapps-rest'; +const { createContract, getState, call } = rest; + +import { getYamlFile } from '../../util/config'; const config = getYamlFile('config.yaml'); const contractName = 'User'; const contractFilename = `${util.cwd}/${config.libPath}/auth/user/contracts/User.sol`; -// const RestStatus = rest.getFields(`${config.libPath}/rest/contracts/RestStatus.sol`); -// const UserRole = rest.getEnums(`${config.libPath}/auth/user/contracts/UserRole.sol`).UserRole; - -function* uploadContract(admin, args) { +async function uploadContract(admin, args) { const contractArgs = { name: contractName, - source: yield importer.combine(contractFilename), + source: await importer.combine(contractFilename), args: util.usc(args) } - const contract = yield createContract(admin, contractArgs, { config }); + const contract = await createContract(admin, contractArgs, { config }); // TODO: Please confirm that it is needed - // yield compileSearch(contract); + // await compileSearch(contract); contract.src = 'removed'; return bind(admin, contract); } function bind(admin, contract) { - contract.getState = function* () { - return yield getState(contract, { config }); + contract.getState = async function () { + return await getState(contract, { config }); } - contract.authenticate = function* (pwHash) { - return yield authenticate(admin, contract, pwHash); + contract.authenticate = async function (pwHash) { + return await authenticate(admin, contract, pwHash); } return contract; } // TODO: remove if not in use -function* compileSearch(contract) { - if (yield rest.isSearchable(contract.codeHash)) { +async function compileSearch(contract) { + if (await rest.isSearchable(contract.codeHash)) { return; } const searchable = [contractName]; - yield rest.compileSearch(searchable, contractName, contractFilename); + await rest.compileSearch(searchable, contractName, contractFilename); } -function* getUsers(addresses) { // FIXME must break to batches of 50 addresses +async function getUsers(addresses) { // FIXME must break to batches of 50 addresses const csv = util.toCsv(addresses); // generate csv string - const results = yield rest.query(`${contractName}?address=in.${csv}`); + const results = await rest.query(`${contractName}?address=in.${csv}`); return results; } -function* getUser(username) { - return (yield rest.waitQuery(`${contractName}?username=eq.${username}`, 1))[0]; +async function getUser(username) { + return (await rest.waitQuery(`${contractName}?username=eq.${username}`, 1))[0]; } -function* getUserByAddress(address) { - return (yield rest.waitQuery(`${contractName}?address=eq.${address}`, 1))[0]; +async function getUserByAddress(address) { + return (await rest.waitQuery(`${contractName}?address=eq.${address}`, 1))[0]; } -function* authenticate(admin, contract, pwHash) { +async function authenticate(admin, contract, pwHash) { // function authenticate(bytes32 _pwHash) return (bool) { const args = { pwHash: pwHash, @@ -66,23 +64,23 @@ function* authenticate(admin, contract, pwHash) { method: 'authenticate', args: util.usc(args) } - const result = yield call(admin, callArgs, { config }); + const result = await call(admin, callArgs, { config }); const isAuthenticated = (result[0] === true); return isAuthenticated; } -module.exports = { - uploadContract: uploadContract, - bind: bind, - compileSearch: compileSearch, +export { + uploadContract, + bind, + compileSearch, // constants - contractName: contractName, + contractName, // business logic - authenticate: authenticate, - getUserByAddress: getUserByAddress, - getUsers: getUsers, - getUser: getUser, + authenticate, + getUserByAddress, + getUsers, + getUser }; diff --git a/auth/user/userManager.js b/auth/user/userManager.js index abb0574..cd2ea84 100644 --- a/auth/user/userManager.js +++ b/auth/user/userManager.js @@ -1,6 +1,7 @@ -const { rest, util, importer } = require('blockapps-rest'); -const { getYamlFile } = require('../../util/config'); +import { rest, util, importer } from 'blockapps-rest'; const { createContract, getState, call } = rest; + +import { getYamlFile } from '../../util/config'; const config = getYamlFile('config.yaml'); const contractName = 'UserManager'; @@ -11,58 +12,58 @@ const logger = console; // TODO: (remove if not in use) const RestStatus = rest.getFields(`${config.libPath}/rest/contracts/RestStatus.sol`); const userJs = require(`${util.cwd}/${config.libPath}/auth/user/user`); -function* uploadContract(admin) { +async function uploadContract(admin) { // NOTE: in production, the contract is created and owned by the AdminInterface // for testing purposes the creator is the admin user const args = { owner: admin.address }; const contractArgs = { name: contractName, - source: yield importer.combine(contractFilename), + source: await importer.combine(contractFilename), args: util.usc(args) } - const contract = yield createContract(admin, contractArgs, { config, logger }); + const contract = await createContract(admin, contractArgs, { config, logger }); // TODO: Please confirm that it is needed - // yield compileSearch(contract); + // await compileSearch(contract); contract.src = 'removed'; return bind(admin, contract); } function bind(admin, contract) { - contract.getState = function* () { - return yield getState(contract, { config }); + contract.getState = async function () { + return await getState(contract, { config }); } - contract.createUser = function* (args) { - return yield createUser(admin, contract, args); + contract.createUser = async function (args) { + return await createUser(admin, contract, args); } - contract.exists = function* (username) { - return yield exists(admin, contract, username); + contract.exists = async function (username) { + return await exists(admin, contract, username); } - contract.getUser = function* (username) { - return yield getUser(admin, contract, username); + contract.getUser = async function (username) { + return await getUser(admin, contract, username); } - contract.getUsers = function* () { - return yield getUsers(admin, contract); + contract.getUsers = async function () { + return await getUsers(admin, contract); } - contract.authenticate = function* (args) { - return yield authenticate(admin, contract, args); + contract.authenticate = async function (args) { + return await authenticate(admin, contract, args); } return contract; } // TODO: remove if not in use -function* compileSearch(contract) { - if (yield rest.isSearchable(contract.codeHash)) { +async function compileSearch(contract) { + if (await rest.isSearchable(contract.codeHash)) { return; } // compile + dependencies const searchable = [userJs.contractName, contractName]; - yield rest.compileSearch(searchable, contractName, contractFilename); + await rest.compileSearch(searchable, contractName, contractFilename); } // throws: RestStatus // returns: user record from search -function* createUser(admin, contract, args) { +async function createUser(admin, contract, args) { // function createUser(address account, string username, bytes32 pwHash, uint role) returns (ErrorCodes) { const callArgs = { contract, @@ -71,17 +72,17 @@ function* createUser(admin, contract, args) { } // create the user, with the eth account - const [restStatus] = yield call(admin, callArgs, { config }); + const [restStatus] = await call(admin, callArgs, { config }); // TODO: add RestStatus api call. No magic numbers if (restStatus != '201') { throw new rest.RestError(restStatus, method, args); } // block until the user shows up in search - const user = yield getUser(admin, contract, args.username); + const user = await getUser(admin, contract, args.username); return user; } -function* exists(admin, contract, username) { +async function exists(admin, contract, username) { // function exists(string username) returns (bool) { const callArgs = { contract, @@ -92,12 +93,12 @@ function* exists(admin, contract, username) { const args = { username: username, }; - const result = yield call(admin, callArgs, { config }); + const result = await call(admin, callArgs, { config }); const exist = (result[0] === true); return exist; } -function* getUser(admin, contract, username) { +async function getUser(admin, contract, username) { // function getUser(string username) returns (address) { const args = { username: username, @@ -109,36 +110,36 @@ function* getUser(admin, contract, username) { } // get the use address - const [address] = yield call(admin, callArgs, { config }); + const [address] = await call(admin, callArgs, { config }); if (address == 0) { throw new rest.RestError('404', method, args); } // found - query for the full user record - return yield userJs.getUserByAddress(contract, address); + return await userJs.getUserByAddress(contract, address); } -function* getUsers(admin, contract) { - const { users: usersHashmap } = yield rest.getState(contract, { config }); - const { values } = yield getState({ name: 'Hashmap', address: usersHashmap }, { config }); +async function getUsers(admin, contract) { + const { users: usersHashmap } = await rest.getState(contract, { config }); + const { values } = await getState({ name: 'Hashmap', address: usersHashmap }, { config }); const addresses = values.slice(1); - return yield userJs.getUsers(addresses); + return await userJs.getUsers(addresses); } -function* authenticate(admin, contract, args) { +async function authenticate(admin, contract, args) { // function authenticate(string _username, bytes32 _pwHash) returns (bool) { const callArgs = { contract, method: 'authenticate', args: util.usc(args) } - const [result] = yield call(admin, callArgs, { config }); + const [result] = await call(admin, callArgs, { config }); const isOK = (result == true); return isOK; } -module.exports = { - uploadContract: uploadContract, - compileSearch: compileSearch, - contractName: contractName, - bind: bind, +export { + uploadContract, + compileSearch, + contractName, + bind }; From 82ddde7b028894af800d6abe86438e74ef992edc Mon Sep 17 00:00:00 2001 From: Tanuj Soni Date: Wed, 20 Mar 2019 19:24:53 +0530 Subject: [PATCH 11/18] [SER-25_compatibilityWithRest] user and userManager test now using asyn/await --- auth/user/test/user.factory.js | 4 +- auth/user/test/user.test.js | 40 +++++------ auth/user/test/userManager-load.test.js | 44 +++++-------- auth/user/test/userManager.test.js | 88 ++++++++++++------------- package.json | 4 +- 5 files changed, 83 insertions(+), 97 deletions(-) diff --git a/auth/user/test/user.factory.js b/auth/user/test/user.factory.js index bb87046..d8b89f7 100644 --- a/auth/user/test/user.factory.js +++ b/auth/user/test/user.factory.js @@ -10,6 +10,6 @@ const createUserArgs = function(accountAddress, uid, role=1) { return args; } -module.exports = { - createUserArgs: createUserArgs, +export { + createUserArgs } diff --git a/auth/user/test/user.test.js b/auth/user/test/user.test.js index 2ad036e..56327a7 100644 --- a/auth/user/test/user.test.js +++ b/auth/user/test/user.test.js @@ -1,47 +1,43 @@ -require('co-mocha'); -const ba = require('blockapps-rest'); -const common = ba.common; -const api = common.api; -const config = common.config; -const rest = ba[`rest${config.restVersion ? config.restVersion : ''}`]; -const util = common.util; -const should = common.should; -const assert = common.assert; -const Promise = common.Promise; - -const userJs = require('../user'); -const factory = require('./user.factory'); +import { assert } from 'chai'; +import { rest, util } from 'blockapps-rest'; +const { createUser, call } = rest; + +import { getYamlFile } from '../../../util/config'; +const config = getYamlFile('config.yaml'); + +import * as userJs from '../user'; +import * as factory from './user.factory'; const adminName = util.uid('Admin'); const adminPassword = '1234'; -describe('User tests', function() { +describe('User tests', function () { this.timeout(config.timeout); let admin; - before(function*() { - admin = yield rest.createUser(adminName, adminPassword); + before(async function () { + admin = await createUser({ username: adminName, password: adminPassword }, { config }); }); - it('Create Contract', function* () { + it('Create Contract', async function () { const uid = util.uid(); // create the user with constructor args const args = factory.createUserArgs(admin.address, uid); - const contract = yield userJs.uploadContract(admin, args); - const user = yield contract.getState(); + const contract = await userJs.uploadContract(admin, args); + const user = await contract.getState(); assert.equal(user.account, args.account, 'account'); assert.equal(user.username, args.username, 'username'); assert.equal(user.role, args.role, 'role'); }); - it('Search Contract', function* () { + it('Search Contract', async function () { const uid = util.uid(); // create the user with constructor args const args = factory.createUserArgs(admin.address, uid); - const contract = yield userJs.uploadContract(admin, args); + const contract = await userJs.uploadContract(admin, args); // search - const user = yield userJs.getUser(args.username); + const user = await userJs.getUser(args.username); assert.equal(user.account, args.account, 'account'); assert.equal(user.username, args.username, 'username'); assert.equal(user.role, args.role, 'role'); diff --git a/auth/user/test/userManager-load.test.js b/auth/user/test/userManager-load.test.js index dd02994..49287cd 100644 --- a/auth/user/test/userManager-load.test.js +++ b/auth/user/test/userManager-load.test.js @@ -1,25 +1,17 @@ -require('co-mocha'); -const ba = require('blockapps-rest'); -const common = ba.common; -const config = common.config; -const rest = ba[`rest${config.restVersion ? config.restVersion : ''}`]; -const util = common.util; -const should = common.should; -const assert = common.assert; -const constants = common.constants; -const BigNumber = common.BigNumber; -const Promise = common.Promise; - -const ErrorCodes = rest.getEnums(`${config.libPath}/error/ErrorCodes.sol`).ErrorCodes; -const RestStatus = rest.getFields(`${config.libPath}/rest/contracts/RestStatus.sol`); -const UserRole = rest.getEnums(`${config.libPath}/auth/user/contracts/UserRole.sol`).UserRole; +import { assert } from 'chai'; +import { rest, util } from 'blockapps-rest'; +const { createUser, call } = rest; + +import { getYamlFile } from '../../../util/config'; +const config = getYamlFile('config.yaml'); + const adminName = util.uid('Admin'); const adminPassword = '1234'; const userManagerJs = require('../userManager'); const factory = require('./user.factory'); -describe('UserManager LOAD tests', function() { +describe('UserManager LOAD tests', function () { this.timeout(config.timeout); const count = util.getArgInt('--count', 4); @@ -28,32 +20,32 @@ describe('UserManager LOAD tests', function() { let contract; // get ready: admin-user and manager-contract - before(function* () { - admin = yield rest.createUser(adminName, adminPassword); - contract = yield userManagerJs.uploadContract(admin); + before(async function () { + admin = await createUser({ username: adminName, password: adminPassword }, { config }); + contract = await userManagerJs.uploadContract(admin); }); - it('User address leading zeros - load test - count:' + count, function *() { - this.timeout(60*60*1000); + it('User address leading zeros - load test - count:' + count, async function () { + this.timeout(60 * 60 * 1000); const users = []; const uid = util.uid() * 100; const accountAddress = 1234500; // create users for (let i = 0; i < count; i++) { - const args = factory.createUserArgs(accountAddress+i, uid+i); - const user = yield contract.createUser(args); + const args = factory.createUserArgs(accountAddress + i, uid + i); + const user = await contract.createUser(args); users.push(user); } // get single user for (let user of users) { - const resultUser = yield contract.getUser(user.username); + const resultUser = await contract.getUser(user.username); } // get all users - const resultUsers = yield contract.getUsers(admin, contract); - const comparator = function(a, b) { return a.username == b.username; }; + const resultUsers = await contract.getUsers(admin, contract); + const comparator = function (a, b) { return a.username == b.username; }; const notFound = util.filter.isContained(users, resultUsers, comparator, true); assert.equal(notFound.length, 0, JSON.stringify(notFound)); }); diff --git a/auth/user/test/userManager.test.js b/auth/user/test/userManager.test.js index b7b8e57..051a6b1 100644 --- a/auth/user/test/userManager.test.js +++ b/auth/user/test/userManager.test.js @@ -1,17 +1,17 @@ -require('co-mocha'); -const { assert } = require('chai') -const { rest, util, parser, fsUtil } = require('blockapps-rest'); -const { getYamlFile } = require('../../../util/config'); +import { assert } from 'chai'; +import { rest, util, fsUtil, parser } from 'blockapps-rest'; const { createUser, call } = rest; +import { getYamlFile } from '../../../util/config'; const config = getYamlFile('config.yaml'); +import * as userManagerJs from '../userManager'; +import * as factory from './user.factory'; + const adminName = util.uid('Admin'); const adminPassword = '1234'; const blocName = util.uid('Bloc'); const blocPassword = '4567'; -const userManagerJs = require('../userManager'); -const factory = require('./user.factory'); describe('UserManager tests', function () { this.timeout(config.timeout); @@ -22,123 +22,123 @@ describe('UserManager tests', function () { let RestStatus; // get ready: admin-user and manager-contract - before(function* () { + before(async function () { // Parse fields const restStatusSource = fsUtil.get(`${util.cwd}/rest/contracts/RestStatus.sol`) - RestStatus = yield parser.parseFields(restStatusSource); + RestStatus = await parser.parseFields(restStatusSource); - admin = yield createUser({ username: adminName, password: adminPassword }, { config }); - contract = yield userManagerJs.uploadContract(admin); + admin = await createUser({ username: adminName, password: adminPassword }, { config }); + contract = await userManagerJs.uploadContract(admin); // bloc account must be created separately - account = yield createUser({ username: blocName, password: blocPassword }, { config }); + account = await createUser({ username: blocName, password: blocPassword }, { config }); }); - xit('Create User', function* () { + it('Create User', async function () { const uid = util.uid(); // create user with the bloc account const args = factory.createUserArgs(account.address, uid); - const user = yield contract.createUser(args); + const user = await contract.createUser(args); assert.equal(user.account, args.account, 'account'); assert.equal(user.username, args.username, 'username'); assert.equal(user.role, args.role, 'role'); }); - xit('Create User - UNAUTHORIZED', function* () { + xit('Create User - UNAUTHORIZED', async function () { const uid = util.uid(); const args = factory.createUserArgs(account.address, uid); - const attacker = yield rest.createUser('Attacker_' + uid, '' + uid); + const attacker = await rest.createUser('Attacker_' + uid, '' + uid); // create user UNAUTHORIZED const method = 'createUser'; - const [restStatus, address] = yield rest.callMethod(attacker, contract, method, util.usc(args)); + const [restStatus, address] = await rest.callMethod(attacker, contract, method, util.usc(args)); assert.equal(restStatus, RestStatus.UNAUTHORIZED, 'should fail'); }); - xit('Create User - illegal name', function* () { + xit('Create User - illegal name', async function () { const uid = util.uid(); const args = factory.createUserArgs(account.address, uid); args.username = '123456789012345678901234567890123'; // 33 chars - yield assert.shouldThrowRest(function* () { - return yield contract.createUser(args); + await assert.shouldThrowRest(async function () { + return await contract.createUser(args); }, RestStatus.BAD_REQUEST); }); - xit('Test exists()', function* () { + xit('Test exists()', async function () { const uid = util.uid(); const args = factory.createUserArgs(account.address, uid); let exists; // should not exist - exists = yield contract.exists(args.username); + exists = await contract.exists(args.username); assert.isDefined(exists, 'should be defined'); assert.isNotOk(exists, 'should not exist'); // create user - const user = yield contract.createUser(args); + const user = await contract.createUser(args); // should exist - exists = yield contract.exists(args.username); + exists = await contract.exists(args.username); assert.equal(exists, true, 'should exist') }); - xit('Test exists() with special characters', function* () { + xit('Test exists() with special characters', async function () { const uid = util.uid(); const args = factory.createUserArgs(account.address, uid); args.username += ' ?#%!@*'; let exists; // should not exist - exists = yield contract.exists(args.username); + exists = await contract.exists(args.username); assert.isDefined(exists, 'should be defined'); assert.isNotOk(exists, 'should not exist'); // create user - const user = yield contract.createUser(args); + const user = await contract.createUser(args); // should exist - exists = yield contract.exists(args.username); + exists = await contract.exists(args.username); assert.equal(exists, true, 'should exist') }); - xit('Create Duplicate User', function* () { + xit('Create Duplicate User', async function () { const uid = util.uid(); const args = factory.createUserArgs(account.address, uid); // create user - const user = yield contract.createUser(args); - yield assert.shouldThrowRest(function* () { - const user = yield contract.createUser(args); + const user = await contract.createUser(args); + await assert.shouldThrowRest(async function () { + const user = await contract.createUser(args); }, RestStatus.BAD_REQUEST); }); - xit('Get User', function* () { + xit('Get User', async function () { const uid = util.uid(); const args = factory.createUserArgs(account.address, uid); // get non-existing user - yield assert.shouldThrowRest(function* () { - const user = yield contract.getUser(args.username); + await assert.shouldThrowRest(async function () { + const user = await contract.getUser(args.username); }, RestStatus.NOT_FOUND); // create user - yield contract.createUser(args); + await contract.createUser(args); // get user - should exist - const user = yield contract.getUser(args.username); + const user = await contract.getUser(args.username); assert.equal(user.username, args.username, 'username should be found'); }); - xit('Get Users', function* () { + xit('Get Users', async function () { const uid = util.uid(); const args = factory.createUserArgs(account.address, uid); // get users - should not exist { - const users = yield contract.getUsers(); + const users = await contract.getUsers(); const found = users.filter(function (user) { return user.username === args.username; }); assert.equal(found.length, 0, 'user list should NOT contain ' + args.username); } // create user - const user = yield contract.createUser(args); + const user = await contract.createUser(args); // get user - should exist { - const users = yield contract.getUsers(admin, contract); + const users = await contract.getUsers(admin, contract); const found = users.filter(function (user) { return user.username === args.username; }); @@ -146,7 +146,7 @@ describe('UserManager tests', function () { } }); - it.skip('User address leading zeros - load test - skipped', function* () { + it.skip('User address leading zeros - load test - skipped', async function () { this.timeout(60 * 60 * 1000); const uid = util.uid(); const args = factory.createUserArgs(account.address, uid); @@ -157,17 +157,17 @@ describe('UserManager tests', function () { // create users for (let i = 0; i < count; i++) { args.username = username + '_' + i; - const user = yield contract.createUser(args); + const user = await contract.createUser(args); users.push(user); } // get single user for (let user of users) { - const resultUser = yield contract.getUser(user.username); + const resultUser = await contract.getUser(user.username); } // get all users - const resultUsers = yield contract.getUsers(admin, contract); + const resultUsers = await contract.getUsers(admin, contract); const comparator = function (a, b) { return a.username == b.username; }; const notFound = util.filter.isContained(users, resultUsers, comparator, true); assert.equal(notFound.length, 0, JSON.stringify(notFound)); diff --git a/package.json b/package.json index 304e283..b35b057 100644 --- a/package.json +++ b/package.json @@ -8,7 +8,7 @@ "test": "find . -type f -name '*.test.js' ! -path './node_modules/*' | xargs mocha ", "test:hashmap": "yarn mocha-babel collections/hashmap/test/ --config config.yaml -b", "test:permission": "yarn mocha-babel auth/permission/test/ --config config.yaml -b --api-debug", - "test:user": "auth/user/test/ --config config.yaml -b ", + "test:user": "yarn mocha-babel auth/user/test/ --config config.yaml -b ", "test:solc": "find . -name '*.sol' -print | xargs solc --allow-paths '.' 2>&1" }, "repository": { @@ -29,8 +29,6 @@ "@babel/register": "^7.0.0", "blockapps-rest": "git://github.com/blockapps/blockapps-rest#barf-develop", "chai": "^4.0.2", - "co": "^4.6.0", - "co-mocha": "^1.2.0", "eslint": "^4.19.1", "eslint-config-airbnb": "^17.0.0", "eslint-plugin-import": "^2.13.0", From 32f323c6e54821c0828c172420e28e875b90cdb8 Mon Sep 17 00:00:00 2001 From: Tanuj Soni Date: Wed, 20 Mar 2019 21:36:21 +0530 Subject: [PATCH 12/18] [SER-25_compatibilityWithRest] remove compileSearch --- auth/user/user.js | 28 +++++++++++++--------------- auth/user/userManager.js | 16 +--------------- 2 files changed, 14 insertions(+), 30 deletions(-) diff --git a/auth/user/user.js b/auth/user/user.js index 921ca72..63fc8d6 100644 --- a/auth/user/user.js +++ b/auth/user/user.js @@ -1,9 +1,12 @@ import { rest, util, importer } from 'blockapps-rest'; -const { createContract, getState, call } = rest; +const { createContract, getState, call, searchUntil } = rest; import { getYamlFile } from '../../util/config'; const config = getYamlFile('config.yaml'); +const logger = console +const options = { config, logger } + const contractName = 'User'; const contractFilename = `${util.cwd}/${config.libPath}/auth/user/contracts/User.sol`; @@ -15,8 +18,6 @@ async function uploadContract(admin, args) { } const contract = await createContract(admin, contractArgs, { config }); - // TODO: Please confirm that it is needed - // await compileSearch(contract); contract.src = 'removed'; return bind(admin, contract); } @@ -31,15 +32,6 @@ function bind(admin, contract) { return contract; } -// TODO: remove if not in use -async function compileSearch(contract) { - if (await rest.isSearchable(contract.codeHash)) { - return; - } - const searchable = [contractName]; - await rest.compileSearch(searchable, contractName, contractFilename); -} - async function getUsers(addresses) { // FIXME must break to batches of 50 addresses const csv = util.toCsv(addresses); // generate csv string const results = await rest.query(`${contractName}?address=in.${csv}`); @@ -51,7 +43,15 @@ async function getUser(username) { } async function getUserByAddress(address) { - return (await rest.waitQuery(`${contractName}?address=eq.${address}`, 1))[0]; + // TODO: + // RESUME: after fixing work from rest side. Please continue from here + function predicate(r) { console.log("running -----------", r); r.length >= 1} + + const contract = { name: contractName, address } + const response = await searchUntil(contract, predicate, { config, logger, isAsync: true, query: { address: `eq.${address}`} }) + console.log("-------------------------------", response) + return response + // return (await rest.waitQuery(`${contractName}?address=eq.${address}`, 1))[0]; } async function authenticate(admin, contract, pwHash) { @@ -73,8 +73,6 @@ async function authenticate(admin, contract, pwHash) { export { uploadContract, bind, - compileSearch, - // constants contractName, diff --git a/auth/user/userManager.js b/auth/user/userManager.js index cd2ea84..576eb98 100644 --- a/auth/user/userManager.js +++ b/auth/user/userManager.js @@ -22,8 +22,6 @@ async function uploadContract(admin) { args: util.usc(args) } const contract = await createContract(admin, contractArgs, { config, logger }); - // TODO: Please confirm that it is needed - // await compileSearch(contract); contract.src = 'removed'; return bind(admin, contract); } @@ -50,17 +48,6 @@ function bind(admin, contract) { return contract; } -// TODO: remove if not in use -async function compileSearch(contract) { - if (await rest.isSearchable(contract.codeHash)) { - return; - } - // compile + dependencies - const searchable = [userJs.contractName, contractName]; - await rest.compileSearch(searchable, contractName, contractFilename); - -} - // throws: RestStatus // returns: user record from search async function createUser(admin, contract, args) { @@ -115,7 +102,7 @@ async function getUser(admin, contract, username) { throw new rest.RestError('404', method, args); } // found - query for the full user record - return await userJs.getUserByAddress(contract, address); + return await userJs.getUserByAddress(address); } async function getUsers(admin, contract) { @@ -139,7 +126,6 @@ async function authenticate(admin, contract, args) { export { uploadContract, - compileSearch, contractName, bind }; From db95c110d00270c7ebc367f9768267e4e8172921 Mon Sep 17 00:00:00 2001 From: Tanuj Soni Date: Fri, 22 Mar 2019 14:03:13 +0530 Subject: [PATCH 13/18] [SER-25_compatibilityWithRest] Fix: user and userManager testcases --- auth/user/test/user.factory.js | 2 +- auth/user/test/user.test.js | 23 ++++--- auth/user/test/userManager-load.test.js | 34 ++++++--- auth/user/test/userManager.test.js | 91 ++++++++++++++----------- auth/user/user.js | 52 +++++++++----- auth/user/userManager.js | 32 +++++---- util/util.js | 12 ++++ 7 files changed, 154 insertions(+), 92 deletions(-) create mode 100644 util/util.js diff --git a/auth/user/test/user.factory.js b/auth/user/test/user.factory.js index d8b89f7..7c7eb2a 100644 --- a/auth/user/test/user.factory.js +++ b/auth/user/test/user.factory.js @@ -1,4 +1,4 @@ -const createUserArgs = function(accountAddress, uid, role=1) { +const createUserArgs = function (accountAddress, uid, role = 1) { const username = `User_${uid}` // function User(address _account, string _username, uint _role) diff --git a/auth/user/test/user.test.js b/auth/user/test/user.test.js index 56327a7..a5bfe63 100644 --- a/auth/user/test/user.test.js +++ b/auth/user/test/user.test.js @@ -1,30 +1,31 @@ import { assert } from 'chai'; import { rest, util } from 'blockapps-rest'; -const { createUser, call } = rest; +const { createUser } = rest; import { getYamlFile } from '../../../util/config'; const config = getYamlFile('config.yaml'); -import * as userJs from '../user'; -import * as factory from './user.factory'; +import { uploadContract, getUser } from '../user'; +import { createUserArgs } from './user.factory'; +import { getCredentialArgs } from '../../../util/util'; -const adminName = util.uid('Admin'); -const adminPassword = '1234'; +const adminArgs = getCredentialArgs(util.uid(), 'Admin', '1234'); describe('User tests', function () { this.timeout(config.timeout); + const options = { config } let admin; before(async function () { - admin = await createUser({ username: adminName, password: adminPassword }, { config }); + admin = await createUser(adminArgs, options); }); it('Create Contract', async function () { const uid = util.uid(); // create the user with constructor args - const args = factory.createUserArgs(admin.address, uid); - const contract = await userJs.uploadContract(admin, args); + const args = createUserArgs(admin.address, uid); + const contract = await uploadContract(admin, args); const user = await contract.getState(); assert.equal(user.account, args.account, 'account'); assert.equal(user.username, args.username, 'username'); @@ -34,10 +35,10 @@ describe('User tests', function () { it('Search Contract', async function () { const uid = util.uid(); // create the user with constructor args - const args = factory.createUserArgs(admin.address, uid); - const contract = await userJs.uploadContract(admin, args); + const args = createUserArgs(admin.address, uid); + const contract = await uploadContract(admin, args); // search - const user = await userJs.getUser(args.username); + const user = await getUser(args.username); assert.equal(user.account, args.account, 'account'); assert.equal(user.username, args.username, 'username'); assert.equal(user.role, args.role, 'role'); diff --git a/auth/user/test/userManager-load.test.js b/auth/user/test/userManager-load.test.js index 49287cd..7f1d63a 100644 --- a/auth/user/test/userManager-load.test.js +++ b/auth/user/test/userManager-load.test.js @@ -1,28 +1,28 @@ import { assert } from 'chai'; import { rest, util } from 'blockapps-rest'; -const { createUser, call } = rest; +const { createUser } = rest; import { getYamlFile } from '../../../util/config'; const config = getYamlFile('config.yaml'); +import { uploadContract } from '../userManager'; +import { createUserArgs } from './user.factory'; +import { getCredentialArgs } from '../../../util/util'; - -const adminName = util.uid('Admin'); -const adminPassword = '1234'; -const userManagerJs = require('../userManager'); -const factory = require('./user.factory'); +const adminArgs = getCredentialArgs(util.uid(), 'Admin', '1234'); describe('UserManager LOAD tests', function () { this.timeout(config.timeout); const count = util.getArgInt('--count', 4); + const options = { config } let admin; let contract; // get ready: admin-user and manager-contract before(async function () { - admin = await createUser({ username: adminName, password: adminPassword }, { config }); - contract = await userManagerJs.uploadContract(admin); + admin = await createUser(adminArgs, options); + contract = await uploadContract(admin); }); it('User address leading zeros - load test - count:' + count, async function () { @@ -33,7 +33,7 @@ describe('UserManager LOAD tests', function () { const accountAddress = 1234500; // create users for (let i = 0; i < count; i++) { - const args = factory.createUserArgs(accountAddress + i, uid + i); + const args = createUserArgs(accountAddress + i, uid + i); const user = await contract.createUser(args); users.push(user); } @@ -46,7 +46,21 @@ describe('UserManager LOAD tests', function () { // get all users const resultUsers = await contract.getUsers(admin, contract); const comparator = function (a, b) { return a.username == b.username; }; - const notFound = util.filter.isContained(users, resultUsers, comparator, true); + const notFound = filter_isContained(users, resultUsers, comparator); assert.equal(notFound.length, 0, JSON.stringify(notFound)); }); }); + +// TODO: move to blockapps-rest. if the function using multiple places +function filter_isContained(setA, setB, comparator, isDebug) { + if (isDebug) { + console.log('setA', setA); + console.log('setB', setB); + } + return setA.filter(function (memberA) { + return !setB.filter(function (memberB) { + // compare + return comparator(memberA, memberB); + }).length > 0; // some items were found in setA that are not included in setB + }); +} \ No newline at end of file diff --git a/auth/user/test/userManager.test.js b/auth/user/test/userManager.test.js index 051a6b1..4f1bb82 100644 --- a/auth/user/test/userManager.test.js +++ b/auth/user/test/userManager.test.js @@ -5,17 +5,18 @@ const { createUser, call } = rest; import { getYamlFile } from '../../../util/config'; const config = getYamlFile('config.yaml'); -import * as userManagerJs from '../userManager'; -import * as factory from './user.factory'; +import { uploadContract } from '../userManager'; +import { createUserArgs } from './user.factory'; +import { getCredentialArgs } from '../../../util/util'; -const adminName = util.uid('Admin'); -const adminPassword = '1234'; -const blocName = util.uid('Bloc'); -const blocPassword = '4567'; +const adminArgs = getCredentialArgs(util.uid(), 'Admin', '1234'); +const blocArgs = getCredentialArgs(util.uid(), 'Bloc', '4567'); describe('UserManager tests', function () { this.timeout(config.timeout); + const options = { config } + let admin; let contract; let account; @@ -27,45 +28,54 @@ describe('UserManager tests', function () { const restStatusSource = fsUtil.get(`${util.cwd}/rest/contracts/RestStatus.sol`) RestStatus = await parser.parseFields(restStatusSource); - admin = await createUser({ username: adminName, password: adminPassword }, { config }); - contract = await userManagerJs.uploadContract(admin); + admin = await createUser(adminArgs, options); + contract = await uploadContract(admin); // bloc account must be created separately - account = await createUser({ username: blocName, password: blocPassword }, { config }); + account = await createUser(blocArgs, options); }); it('Create User', async function () { const uid = util.uid(); // create user with the bloc account - const args = factory.createUserArgs(account.address, uid); + const args = createUserArgs(account.address, uid); const user = await contract.createUser(args); assert.equal(user.account, args.account, 'account'); assert.equal(user.username, args.username, 'username'); assert.equal(user.role, args.role, 'role'); }); - xit('Create User - UNAUTHORIZED', async function () { + it('Create User - UNAUTHORIZED', async function () { const uid = util.uid(); - const args = factory.createUserArgs(account.address, uid); - const attacker = await rest.createUser('Attacker_' + uid, '' + uid); + const args = createUserArgs(account.address, uid); + const attackerArgs = getCredentialArgs(uid, 'Attacker', '1234'); + const attacker = await rest.createUser(attackerArgs, options); + + const callArgs = { + contract, + method: 'createUser', + args: util.usc(args) + } // create user UNAUTHORIZED - const method = 'createUser'; - const [restStatus, address] = await rest.callMethod(attacker, contract, method, util.usc(args)); + const [restStatus] = await call(attacker, callArgs, options); assert.equal(restStatus, RestStatus.UNAUTHORIZED, 'should fail'); }); - xit('Create User - illegal name', async function () { + it('Create User - illegal name', async function () { const uid = util.uid(); - const args = factory.createUserArgs(account.address, uid); + const args = createUserArgs(account.address, uid); args.username = '123456789012345678901234567890123'; // 33 chars - await assert.shouldThrowRest(async function () { - return await contract.createUser(args); - }, RestStatus.BAD_REQUEST); + + try { + await contract.createUser(args); + } catch (e) { + assert.equal(e.response.status, '400', 'should Throws 404 Not found') + } }); - xit('Test exists()', async function () { + it('Test exists()', async function () { const uid = util.uid(); - const args = factory.createUserArgs(account.address, uid); + const args = createUserArgs(account.address, uid); let exists; // should not exist @@ -79,9 +89,9 @@ describe('UserManager tests', function () { assert.equal(exists, true, 'should exist') }); - xit('Test exists() with special characters', async function () { + it('Test exists() with special characters', async function () { const uid = util.uid(); - const args = factory.createUserArgs(account.address, uid); + const args = createUserArgs(account.address, uid); args.username += ' ?#%!@*'; let exists; @@ -96,25 +106,27 @@ describe('UserManager tests', function () { assert.equal(exists, true, 'should exist') }); - xit('Create Duplicate User', async function () { + it('Create Duplicate User', async function () { const uid = util.uid(); - const args = factory.createUserArgs(account.address, uid); + const args = createUserArgs(account.address, uid); - // create user - const user = await contract.createUser(args); - await assert.shouldThrowRest(async function () { - const user = await contract.createUser(args); - }, RestStatus.BAD_REQUEST); + try { + await contract.createUser(args); + } catch (e) { + assert.equal(e.response.status, RestStatus.BAD_REQUEST, 'should Throws 404 Not found') + } }); - xit('Get User', async function () { + it('Get User', async function () { const uid = util.uid(); - const args = factory.createUserArgs(account.address, uid); + const args = createUserArgs(account.address, uid); // get non-existing user - await assert.shouldThrowRest(async function () { - const user = await contract.getUser(args.username); - }, RestStatus.NOT_FOUND); + try { + await contract.getUser(args.username); + } catch (e) { + assert.equal(e.response.status, RestStatus.NOT_FOUND, 'should Throws 404 Not found') + } // create user await contract.createUser(args); // get user - should exist @@ -122,9 +134,9 @@ describe('UserManager tests', function () { assert.equal(user.username, args.username, 'username should be found'); }); - xit('Get Users', async function () { + it('Get Users', async function () { const uid = util.uid(); - const args = factory.createUserArgs(account.address, uid); + const args = createUserArgs(account.address, uid); // get users - should not exist { @@ -146,10 +158,11 @@ describe('UserManager tests', function () { } }); + // TODO: we can remove this as we are checking the same in userManager-load.test.js. @lior please confirm it.skip('User address leading zeros - load test - skipped', async function () { this.timeout(60 * 60 * 1000); const uid = util.uid(); - const args = factory.createUserArgs(account.address, uid); + const args = createUserArgs(account.address, uid); const username = args.username; const count = 16 * 4; // leading 0 once every 16 diff --git a/auth/user/user.js b/auth/user/user.js index 63fc8d6..e87a29a 100644 --- a/auth/user/user.js +++ b/auth/user/user.js @@ -4,8 +4,7 @@ const { createContract, getState, call, searchUntil } = rest; import { getYamlFile } from '../../util/config'; const config = getYamlFile('config.yaml'); -const logger = console -const options = { config, logger } +const options = { config }; const contractName = 'User'; const contractFilename = `${util.cwd}/${config.libPath}/auth/user/contracts/User.sol`; @@ -17,14 +16,14 @@ async function uploadContract(admin, args) { args: util.usc(args) } - const contract = await createContract(admin, contractArgs, { config }); + const contract = await createContract(admin, contractArgs, options); contract.src = 'removed'; return bind(admin, contract); } function bind(admin, contract) { contract.getState = async function () { - return await getState(contract, { config }); + return await getState(contract, options); } contract.authenticate = async function (pwHash) { return await authenticate(admin, contract, pwHash); @@ -34,24 +33,45 @@ function bind(admin, contract) { async function getUsers(addresses) { // FIXME must break to batches of 50 addresses const csv = util.toCsv(addresses); // generate csv string - const results = await rest.query(`${contractName}?address=in.${csv}`); + + function predicate(response) { + return response; + } + + const contract = { + name: contractName + } + const results = await searchUntil(contract, predicate, { config, query: { address: `in.${csv}` } }); return results; } async function getUser(username) { - return (await rest.waitQuery(`${contractName}?username=eq.${username}`, 1))[0]; + function predicate(response) { + if (response.length >= 1) { + return response; + } + } + + const contract = { + name: contractName + } + + const response = (await searchUntil(contract, predicate, { config, query: { username: `eq.${username}` } }))[0]; + return response; } async function getUserByAddress(address) { - // TODO: - // RESUME: after fixing work from rest side. Please continue from here - function predicate(r) { console.log("running -----------", r); r.length >= 1} - - const contract = { name: contractName, address } - const response = await searchUntil(contract, predicate, { config, logger, isAsync: true, query: { address: `eq.${address}`} }) - console.log("-------------------------------", response) - return response - // return (await rest.waitQuery(`${contractName}?address=eq.${address}`, 1))[0]; + function predicate(response) { + if (response.length >= 1) { + return response; + } + } + + const contract = { + name: contractName, address + } + const response = (await searchUntil(contract, predicate, { config, query: { address: `eq.${address}` } }))[0]; + return response; } async function authenticate(admin, contract, pwHash) { @@ -64,7 +84,7 @@ async function authenticate(admin, contract, pwHash) { method: 'authenticate', args: util.usc(args) } - const result = await call(admin, callArgs, { config }); + const result = await call(admin, callArgs, options); const isAuthenticated = (result[0] === true); return isAuthenticated; } diff --git a/auth/user/userManager.js b/auth/user/userManager.js index 576eb98..79c458b 100644 --- a/auth/user/userManager.js +++ b/auth/user/userManager.js @@ -1,5 +1,5 @@ import { rest, util, importer } from 'blockapps-rest'; -const { createContract, getState, call } = rest; +const { createContract, getState, call, RestError } = rest; import { getYamlFile } from '../../util/config'; const config = getYamlFile('config.yaml'); @@ -7,7 +7,7 @@ const config = getYamlFile('config.yaml'); const contractName = 'UserManager'; const contractFilename = `${util.cwd}/${config.libPath}/auth/user/contracts/UserManager.sol`; -const logger = console; +const options = { config }; // TODO: (remove if not in use) const RestStatus = rest.getFields(`${config.libPath}/rest/contracts/RestStatus.sol`); const userJs = require(`${util.cwd}/${config.libPath}/auth/user/user`); @@ -21,14 +21,14 @@ async function uploadContract(admin) { source: await importer.combine(contractFilename), args: util.usc(args) } - const contract = await createContract(admin, contractArgs, { config, logger }); + const contract = await createContract(admin, contractArgs, options); contract.src = 'removed'; return bind(admin, contract); } function bind(admin, contract) { contract.getState = async function () { - return await getState(contract, { config }); + return await getState(contract, options); } contract.createUser = async function (args) { return await createUser(admin, contract, args); @@ -59,10 +59,10 @@ async function createUser(admin, contract, args) { } // create the user, with the eth account - const [restStatus] = await call(admin, callArgs, { config }); + const [restStatus] = await call(admin, callArgs, options); // TODO: add RestStatus api call. No magic numbers if (restStatus != '201') { - throw new rest.RestError(restStatus, method, args); + throw new RestError(restStatus, callArgs.method, callArgs.args); } // block until the user shows up in search const user = await getUser(admin, contract, args.username); @@ -71,16 +71,17 @@ async function createUser(admin, contract, args) { async function exists(admin, contract, username) { // function exists(string username) returns (bool) { + const args = { + username: username, + }; + const callArgs = { contract, method: 'exists', args: util.usc(args) } - const args = { - username: username, - }; - const result = await call(admin, callArgs, { config }); + const result = await call(admin, callArgs, options); const exist = (result[0] === true); return exist; } @@ -90,6 +91,7 @@ async function getUser(admin, contract, username) { const args = { username: username, }; + const callArgs = { contract, method: 'getUser', @@ -97,17 +99,17 @@ async function getUser(admin, contract, username) { } // get the use address - const [address] = await call(admin, callArgs, { config }); + const [address] = await call(admin, callArgs, options); if (address == 0) { - throw new rest.RestError('404', method, args); + throw new RestError('404', callArgs.method, args); } // found - query for the full user record return await userJs.getUserByAddress(address); } async function getUsers(admin, contract) { - const { users: usersHashmap } = await rest.getState(contract, { config }); - const { values } = await getState({ name: 'Hashmap', address: usersHashmap }, { config }); + const { users: usersHashmap } = await rest.getState(contract, options); + const { values } = await getState({ name: 'Hashmap', address: usersHashmap }, options); const addresses = values.slice(1); return await userJs.getUsers(addresses); } @@ -119,7 +121,7 @@ async function authenticate(admin, contract, args) { method: 'authenticate', args: util.usc(args) } - const [result] = await call(admin, callArgs, { config }); + const [result] = await call(admin, callArgs, options); const isOK = (result == true); return isOK; } diff --git a/util/util.js b/util/util.js new file mode 100644 index 0000000..30173e9 --- /dev/null +++ b/util/util.js @@ -0,0 +1,12 @@ +const getCredentialArgs = function (uid, name, password) { + const username = `${name}_${uid}`; + + return { + username, + password + }; +} + +export { + getCredentialArgs +} From 5bc28a29ba0d0059b15ac4375d5f92a1d4e26f78 Mon Sep 17 00:00:00 2001 From: Tanuj Soni Date: Fri, 22 Mar 2019 14:07:21 +0530 Subject: [PATCH 14/18] [SER-25_compatibilityWithRest] Minor fix --- auth/user/userManager.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/auth/user/userManager.js b/auth/user/userManager.js index 79c458b..5ddb39f 100644 --- a/auth/user/userManager.js +++ b/auth/user/userManager.js @@ -10,7 +10,7 @@ const contractFilename = `${util.cwd}/${config.libPath}/auth/user/contracts/User const options = { config }; // TODO: (remove if not in use) const RestStatus = rest.getFields(`${config.libPath}/rest/contracts/RestStatus.sol`); -const userJs = require(`${util.cwd}/${config.libPath}/auth/user/user`); +import * as userJs from './user'; async function uploadContract(admin) { // NOTE: in production, the contract is created and owned by the AdminInterface From 081b1fc9f7c320f0bb65f8008cf67dd1eb5d6fd9 Mon Sep 17 00:00:00 2001 From: Tanuj Soni Date: Fri, 22 Mar 2019 17:37:49 +0530 Subject: [PATCH 15/18] [SER-25_compatibilityWithRest] Fix: permission and permission manager --- auth/permission/permissionManager.js | 13 ++++---- auth/permission/permissionedHashmap.js | 15 +++++---- .../permission/test/permissionManager.test.js | 33 ++++++++++--------- .../test/permissionedHashmap.test.js | 22 ++++++------- 4 files changed, 42 insertions(+), 41 deletions(-) diff --git a/auth/permission/permissionManager.js b/auth/permission/permissionManager.js index cf3e35e..56a0e1d 100644 --- a/auth/permission/permissionManager.js +++ b/auth/permission/permissionManager.js @@ -6,6 +6,7 @@ const config = getYamlFile('config.yaml'); const contractName = 'PermissionManager'; const contractFilename = `./auth/permission/contracts/PermissionManager.sol`; +const options = { config } util.bitmaskToEnumString = function (bitmask, bitmaskEnum) { const strings = [] @@ -29,7 +30,7 @@ async function uploadContract(admin, master) { args: util.usc(args) } - const contract = await createContract(admin, contractArgs, { config }) + const contract = await createContract(admin, contractArgs, options) contract.src = 'removed'; return bind(admin, contract); } @@ -44,7 +45,7 @@ async function createPermissionsAdmin(admin, master, permissions) { function bind(admin, contract) { contract.getState = async function () { - return await getState(contract, { config }); + return await getState(contract, options); } contract.grant = async function (args) { return await grant(admin, contract, args); @@ -88,7 +89,7 @@ async function grant(admin, contract, args) { args: util.usc(args) } - const [restStatus, permissions] = await call(admin, callArgs, { config }); + const [restStatus, permissions] = await call(admin, callArgs, options); if (restStatus != '200') { throw new Error(restStatus); } @@ -105,7 +106,7 @@ async function getPermissions(admin, contract, args) { args: util.usc(args) } - const [restStatus, permissions] = await call(admin, callArgs, { config }); + const [restStatus, permissions] = await call(admin, callArgs, options); if (restStatus != '200') { throw new RestError(restStatus, callArgs.method, callArgs.args); } @@ -122,7 +123,7 @@ async function check(admin, contract, args) { args: util.usc(args) } - const [restStatus] = await call(admin, callArgs, { config }); + const [restStatus] = await call(admin, callArgs, options); if (restStatus != '200') { return false; } @@ -138,7 +139,7 @@ async function revoke(admin, contract, args) { args: util.usc(args) } - const [restStatus] = await call(admin, callArgs, { config }); + const [restStatus] = await call(admin, callArgs, options); // TODO: reststatus if (restStatus != '200') { throw new RestError(restStatus, callArgs.method, callArgs.args); diff --git a/auth/permission/permissionedHashmap.js b/auth/permission/permissionedHashmap.js index e4621b2..03b4d9b 100644 --- a/auth/permission/permissionedHashmap.js +++ b/auth/permission/permissionedHashmap.js @@ -6,6 +6,7 @@ const config = getYamlFile('config.yaml'); const contractName = 'PermissionedHashmap' const contractFilename = `${config.libPath}/auth/permission/contracts/PermissionedHashmap.sol` +const options = { config } async function uploadContract(admin, permissionManager) { const args = { permissionManager: permissionManager.address } @@ -16,7 +17,7 @@ async function uploadContract(admin, permissionManager) { args: util.usc(args) } - const contract = await createContract(admin, contractArgs, { config }) + const contract = await createContract(admin, contractArgs, options) contract.src = 'removed' return bind(admin, contract) } @@ -24,7 +25,7 @@ async function uploadContract(admin, permissionManager) { function bind(admin, _contract) { const contract = _contract contract.getState = async function () { - return await getState(contract, { config }) + return await getState(contract, options) } // TODO: it is not in new rest (do we have the same with diffrent name ?) // contract.getStateVar = async function(args) { @@ -64,7 +65,7 @@ async function put(admin, contract, args) { args: util.usc(args) } - const result = await call(admin, callArgs, { config }) + const result = await call(admin, callArgs, options) return result } @@ -75,7 +76,7 @@ async function get(admin, contract, args) { args: util.usc(args) } - const result = await call(admin, callArgs, { config }) + const result = await call(admin, callArgs, options) return result[0] } @@ -86,7 +87,7 @@ async function contains(admin, contract, args) { args: util.usc(args) } - const result = await call(admin, callArgs, { config }) + const result = await call(admin, callArgs, options) return result[0] == true } @@ -96,7 +97,7 @@ async function size(admin, contract, args) { method: 'size', args: util.usc(args) } - const result = await call(admin, callArgs, { config }) + const result = await call(admin, callArgs, options) return parseInt(result[0], 10) } @@ -107,7 +108,7 @@ async function remove(admin, contract, args) { args: util.usc(args) } - await call(admin, callArgs, { config }) + await call(admin, callArgs, options) } export { diff --git a/auth/permission/test/permissionManager.test.js b/auth/permission/test/permissionManager.test.js index 0e6df24..6966d83 100644 --- a/auth/permission/test/permissionManager.test.js +++ b/auth/permission/test/permissionManager.test.js @@ -4,16 +4,17 @@ const { createUser, call } = rest; import { getYamlFile } from '../../../util/config'; import * as permissionManagerJs from '../permissionManager'; +import { getCredentialArgs } from '../../../util/util'; const config = getYamlFile('config.yaml'); -const adminName = util.uid('Admin') -const adminPassword = '1234' -const masterName = util.uid('Master') -const masterPassword = '5678' +const adminArgs = getCredentialArgs(util.uid(), 'Admin', '1234'); +const masterArgs = getCredentialArgs(util.uid(), 'Master', '5678'); describe('PermissionManager tests', function () { this.timeout(config.timeout); + + const options = { config } let admin, master, EventLogType, RestStatus; @@ -28,9 +29,9 @@ describe('PermissionManager tests', function () { EventLogType = await parser.parseEnum(source); console.log('creating admin') - admin = await createUser({ username: adminName, password: adminPassword }, { config }) + admin = await createUser(adminArgs, options) console.log('creating master') - master = await createUser({ username: masterName, password: masterPassword }, { config }) + master = await createUser(masterArgs, options) }) it('upload', async function () { @@ -184,7 +185,7 @@ describe('PermissionManager tests', function () { it('Transfer Ownership - AUTHORIZED', async function () { const uid = util.uid() - const newOwner = await createUser({ username: `NewOwner_${uid}`, password: '1234' }, { config }) + const newOwner = await createUser({ username: `NewOwner_${uid}`, password: '1234' }, options) const contract = await permissionManagerJs.uploadContract(admin, master) // transfer ownership to a new admin, by the master { @@ -194,14 +195,14 @@ describe('PermissionManager tests', function () { args: util.usc({ newOwner: newOwner.address }) } - const [restStatus] = await call(master, callArgs, { config }) + const [restStatus] = await call(master, callArgs, options) assert.equal(restStatus, RestStatus.OK, 'should succeed') } }) it('Transfer Ownership - positive case', async function () { const uid = util.uid() - const newOwner = await createUser({ username: `NewOwner_${uid}`, password: '1234' }, { config }) + const newOwner = await createUser({ username: `NewOwner_${uid}`, password: '1234' }, options) const contract = await permissionManagerJs.uploadContract(admin, master) // admin works const args = await createPermitArgs(uid) @@ -213,7 +214,7 @@ describe('PermissionManager tests', function () { method: 'grant', args: util.usc(args) } - const [restStatus, permissions] = await call(newOwner, callArgs, { config }) + const [restStatus, permissions] = await call(newOwner, callArgs, options) assert.equal(restStatus, RestStatus.UNAUTHORIZED, 'should fail') } // transfer ownership - must be master @@ -225,7 +226,7 @@ describe('PermissionManager tests', function () { args: util.usc(args) } - const [restStatus] = await call(master, callArgs, { config }) + const [restStatus] = await call(master, callArgs, options) assert.equal(restStatus, RestStatus.OK, 'should succeed') } // old admin unauthorized @@ -236,7 +237,7 @@ describe('PermissionManager tests', function () { args: util.usc(args) } - const [restStatus] = await call(admin, callArgs, { config }) + const [restStatus] = await call(admin, callArgs, options) assert.equal(restStatus, RestStatus.UNAUTHORIZED, 'should fail') } // new admin works @@ -247,7 +248,7 @@ describe('PermissionManager tests', function () { args: util.usc(args) } - const [restStatus] = await call(newOwner, callArgs, { config }) + const [restStatus] = await call(newOwner, callArgs, options) assert.equal(restStatus, RestStatus.OK, 'should succeed') } }) @@ -257,7 +258,7 @@ describe('PermissionManager tests', function () { const contract = await permissionManagerJs.uploadContract(admin, master) // transfer ownership to attacker { - const attacker = await createUser({ username: `Attacker_${uid}`, password: '1234' }, { config }) + const attacker = await createUser({ username: `Attacker_${uid}`, password: '1234' }, options) const args = { newOwner: attacker.address } const callArgs = { @@ -266,7 +267,7 @@ describe('PermissionManager tests', function () { args: util.usc(args) } - const [restStatus] = await call(attacker, callArgs, { config }) + const [restStatus] = await call(attacker, callArgs, options) assert.equal(restStatus, RestStatus.UNAUTHORIZED, 'should fail') } }) @@ -351,7 +352,7 @@ describe('PermissionManager tests', function () { async function createPermitArgs(uid) { const userArgs = { username: `username_${uid}`, - password: adminPassword + password: '1234' }; const user = await createUser(userArgs, { config }) diff --git a/auth/permission/test/permissionedHashmap.test.js b/auth/permission/test/permissionedHashmap.test.js index 4b31e2c..48796fe 100644 --- a/auth/permission/test/permissionedHashmap.test.js +++ b/auth/permission/test/permissionedHashmap.test.js @@ -4,30 +4,28 @@ const { createUser, call, createContract } = rest; import { getYamlFile } from '../../../util/config'; import * as permissionedHashmapJs from '../permissionedHashmap'; - +import { getCredentialArgs } from '../../../util/util'; const config = getYamlFile('config.yaml'); -const adminName = util.uid('Admin') -const adminPassword = '1234' -const masterName = util.uid('Master') -const masterPassword = '5678' -const attackerName = util.uid('Attacker') -const attackerPassword = '9090' +const adminArgs = getCredentialArgs(util.uid(), 'Admin', '1234'); +const masterArgs = getCredentialArgs(util.uid(), 'Master', '5678'); +const attackerArgs = getCredentialArgs(util.uid(), 'Attacker', '9090'); describe('PermissionedHashmap tests', function () { this.timeout(config.timeout) + const options = { config } let admin, master, attacker, hashmapPermissionManager // get ready: admin-user and manager-contract before(async function () { console.log('creating admin') - admin = await createUser({ username: adminName, password: adminPassword }, { config }) + admin = await createUser(adminArgs, options) console.log('creating master') - master = await createUser({ username: masterName, password: masterPassword }, { config }) + master = await createUser(masterArgs, options) console.log('creating attacker') - attacker = await createUser({ username: attackerName, password: attackerPassword }, { config }) + attacker = await createUser(attackerArgs, options) // pm hashmapPermissionManager = await createHashmapPermissionManager(admin, master) }) @@ -53,7 +51,7 @@ describe('PermissionedHashmap tests', function () { args: util.usc(args) } - const result = await call(attacker, callArgs, { config }) + const result = await call(attacker, callArgs, options) const state = await contract.getState(); assert.equal(state.values.length, 1, 'length 1 - did not put'); @@ -139,7 +137,7 @@ describe('PermissionedHashmap tests', function () { method: 'remove', args: util.usc(args) } - const result = await call(attacker, callArgs, { config }) + const result = await call(attacker, callArgs, options) await contract.getState() // still contained - was not removed From b98176eb1ebfa4d5d66ffc4fea38b1f0b304ad7f Mon Sep 17 00:00:00 2001 From: Tanuj Soni Date: Fri, 22 Mar 2019 18:04:55 +0530 Subject: [PATCH 16/18] [SER-25_compatibilityWithRest] Fix: hashmap and unsafeHashmap --- collections/hashmap/hashmap.js | 20 ++++++++++--------- collections/hashmap/test/hashmap.test.js | 17 ++++++++-------- .../hashmap/test/unsafeHashmap.test.js | 7 ++++--- collections/hashmap/unsafeHashmap.js | 15 +++++++------- 4 files changed, 31 insertions(+), 28 deletions(-) diff --git a/collections/hashmap/hashmap.js b/collections/hashmap/hashmap.js index d901e1a..3ff4fbe 100644 --- a/collections/hashmap/hashmap.js +++ b/collections/hashmap/hashmap.js @@ -7,6 +7,8 @@ const config = getYamlFile('config.yaml'); const contractName = 'Hashmap'; const contractFilename = `${config.libPath}/collections/hashmap/contracts/Hashmap.sol`; +const options = { config }; + async function uploadContract(admin) { const args = {}; @@ -16,14 +18,14 @@ async function uploadContract(admin) { args: util.usc(args) } - const contract = await createContract(admin, contractArgs, { config }); + const contract = await createContract(admin, contractArgs, options); contract.src = 'removed'; return bind(admin, contract); } function bind(admin, contract) { - contract.getState = async function() { - return await getState(contract, { config }); + contract.getState = async function () { + return await getState(contract, options); } // TODO: Why we are using this function which is not in use // contract.getStateVar = function* (args) { @@ -58,7 +60,7 @@ async function put(admin, contract, args) { args: util.usc(args) } - const result = await call(admin, callArgs, { config }); + const result = await call(admin, callArgs, options); return result; } @@ -69,7 +71,7 @@ async function get(admin, contract, args) { args: util.usc(args) } - const result = await call(admin, callArgs, { config }); + const result = await call(admin, callArgs, options); return result[0]; } @@ -80,7 +82,7 @@ async function contains(admin, contract, args) { args: util.usc(args) } - const result = await call(admin, callArgs, { config }); + const result = await call(admin, callArgs, options); return result[0] == true; } @@ -91,7 +93,7 @@ async function size(admin, contract, args) { args: util.usc(args) } - const result = await call(admin, callArgs, { config }); + const result = await call(admin, callArgs, options); return parseInt(result[0]); } @@ -102,7 +104,7 @@ async function transferOwnership(admin, contract, args) { args: util.usc(args) } - const result = await call(admin, callArgs, { config }); + const result = await call(admin, callArgs, options); return result[0] == true; } @@ -113,7 +115,7 @@ async function getOwner(admin, contract, args) { args: util.usc(args) } - const result = await call(admin, callArgs, { config }); + const result = await call(admin, callArgs, options); return result[0]; } diff --git a/collections/hashmap/test/hashmap.test.js b/collections/hashmap/test/hashmap.test.js index dab321c..1fcfefa 100644 --- a/collections/hashmap/test/hashmap.test.js +++ b/collections/hashmap/test/hashmap.test.js @@ -2,27 +2,26 @@ import { assert } from 'chai'; import { rest, util } from 'blockapps-rest'; import { getYamlFile } from '../../../util/config'; import * as hashmapJs from '../hashmap'; +import { getCredentialArgs } from '../../../util/util'; const { createUser } = rest; const config = getYamlFile('config.yaml'); -const adminName = util.uid('Admin'); -const adminPassword = '1234'; +const adminArgs = getCredentialArgs(util.uid(), 'Admin', '1234'); +const otherAdminArgs = getCredentialArgs(util.uid(), 'OtherAdmin', '5678'); -const otherAdminName = util.uid('OtherAdmin'); -const otherAdminPassword = '5678'; - -describe('Hashmap', function() { +describe('Hashmap', function () { this.timeout(config.timeout); + const options = { config }; let admin; let otherAdmin; before(async function () { console.log('creating admin') - admin = await createUser({ username: adminName, password: adminPassword }, { config }); + admin = await createUser(adminArgs, options); console.log('creating user') - otherAdmin = await createUser({ username: otherAdminName, password: otherAdminPassword }, { config }); + otherAdmin = await createUser(otherAdminArgs, options); }); it('getOwner', async function () { @@ -132,7 +131,7 @@ describe('Hashmap', function() { }); it('reject transferOwnership from original admin', async function () { - const newAdmin = await createUser({ username: util.uid('newAdmin'), password: '4321' }, { config }); + const newAdmin = await createUser({ username: util.uid('newAdmin'), password: '4321' }, options); const hashmap = await hashmapJs.uploadContract(admin); await hashmap.transferOwnership({ newOwner: otherAdmin.address }); diff --git a/collections/hashmap/test/unsafeHashmap.test.js b/collections/hashmap/test/unsafeHashmap.test.js index 2a11be6..44f653e 100644 --- a/collections/hashmap/test/unsafeHashmap.test.js +++ b/collections/hashmap/test/unsafeHashmap.test.js @@ -2,21 +2,22 @@ import { assert } from 'chai'; import { rest, util } from 'blockapps-rest'; import { getYamlFile } from '../../../util/config'; import * as unsafeHashmapJs from '../unsafeHashmap'; +import { getCredentialArgs } from '../../../util/util'; const { createUser } = rest; const config = getYamlFile('config.yaml'); -const adminName = util.uid('Admin') -const adminPassword = '1234' +const adminArgs = getCredentialArgs(util.uid(), 'Admin', '1234'); describe('UnsafeHashmap', function () { this.timeout(config.timeout) + const options = { config }; let admin before(async function () { console.log('creating admin') - admin = await createUser({ username: adminName, password: adminPassword }, { config }) + admin = await createUser(adminArgs, options) }) it('put', async function () { diff --git a/collections/hashmap/unsafeHashmap.js b/collections/hashmap/unsafeHashmap.js index 56290d8..d01d67f 100644 --- a/collections/hashmap/unsafeHashmap.js +++ b/collections/hashmap/unsafeHashmap.js @@ -7,6 +7,7 @@ const config = getYamlFile('config.yaml'); const contractName = 'UnsafeHashmap' const contractFilename = `${config.libPath}/collections/hashmap/contracts/UnsafeHashmap.sol` +const options = { config } async function uploadContract(admin) { const args = {} @@ -17,7 +18,7 @@ async function uploadContract(admin) { args: util.usc(args) } - const contract = await createContract(admin, contractArgs, { config }) + const contract = await createContract(admin, contractArgs, options) contract.src = 'removed' return bind(admin, contract) } @@ -25,7 +26,7 @@ async function uploadContract(admin) { function bind(admin, _contract) { const contract = _contract contract.getState = async function () { - return await getState(contract, { config }) + return await getState(contract, options) } // TODO: Why we are using this function which is not in use // contract.getStateVar = async function (args) { @@ -56,7 +57,7 @@ async function put(admin, contract, args) { args: util.usc(args) } - const result = await call(admin, callArgs, { config }) + const result = await call(admin, callArgs, options) return result } @@ -67,7 +68,7 @@ async function get(admin, contract, args) { args: util.usc(args) } - const result = await call(admin, callArgs, { config }) + const result = await call(admin, callArgs, options) return result[0] } @@ -78,7 +79,7 @@ async function contains(admin, contract, args) { args: util.usc(args) } - const result = await call(admin, callArgs, { config }) + const result = await call(admin, callArgs, options) return result[0] == true } @@ -89,7 +90,7 @@ async function size(admin, contract, args) { args: util.usc(args) } - const result = await call(admin, callArgs, { config }) + const result = await call(admin, callArgs, options) return parseInt(result[0]) } @@ -100,7 +101,7 @@ async function remove(admin, contract, args) { args: util.usc(args) } - await call(admin, callArgs, { config }) + await call(admin, callArgs, options) } export { From c2ea71eb7c89566fd67656d9a2a384af9f2e173b Mon Sep 17 00:00:00 2001 From: Tanuj Soni Date: Fri, 22 Mar 2019 19:13:40 +0530 Subject: [PATCH 17/18] [SER-25_compatibilityWithRest] Add: rest status --- auth/permission/permissionManager.js | 15 ++++++++------- auth/permission/test/permissionManager.test.js | 7 ++----- auth/user/test/userManager.test.js | 2 +- package.json | 1 + 4 files changed, 12 insertions(+), 13 deletions(-) diff --git a/auth/permission/permissionManager.js b/auth/permission/permissionManager.js index 56a0e1d..d9b0c3c 100644 --- a/auth/permission/permissionManager.js +++ b/auth/permission/permissionManager.js @@ -1,3 +1,4 @@ +import RestStatus from 'http-status-codes'; import { rest, util, importer } from 'blockapps-rest'; const { createContract, getState, call, RestError } = rest; @@ -90,7 +91,7 @@ async function grant(admin, contract, args) { } const [restStatus, permissions] = await call(admin, callArgs, options); - if (restStatus != '200') { + if (restStatus != RestStatus.OK) { throw new Error(restStatus); } return permissions; @@ -107,7 +108,7 @@ async function getPermissions(admin, contract, args) { } const [restStatus, permissions] = await call(admin, callArgs, options); - if (restStatus != '200') { + if (restStatus != RestStatus.OK) { throw new RestError(restStatus, callArgs.method, callArgs.args); } return permissions; @@ -124,7 +125,7 @@ async function check(admin, contract, args) { } const [restStatus] = await call(admin, callArgs, options); - if (restStatus != '200') { + if (restStatus != RestStatus.OK) { return false; } return true; @@ -141,10 +142,10 @@ async function revoke(admin, contract, args) { const [restStatus] = await call(admin, callArgs, options); // TODO: reststatus - if (restStatus != '200') { + if (restStatus != RestStatus.OK) { throw new RestError(restStatus, callArgs.method, callArgs.args); } - return '200'; + return RestStatus.OK; } // transferOwnership @@ -156,10 +157,10 @@ async function transferOwnership(admin, contract, args) { } const [restStatus] = await call(admin, callArgs, {}); - if (restStatus != '200') { + if (restStatus != RestStatus.OK) { throw new RestError(restStatus, method, args); } - return '200'; + return RestStatus.OK; } // list diff --git a/auth/permission/test/permissionManager.test.js b/auth/permission/test/permissionManager.test.js index 6966d83..6d311ed 100644 --- a/auth/permission/test/permissionManager.test.js +++ b/auth/permission/test/permissionManager.test.js @@ -99,7 +99,7 @@ describe('PermissionManager tests', function () { try { await contract.getPermissions(args) } catch (e) { - assert.equal(e.response.status, '404', 'should Throws 404 Not found') + assert.equal(e.response.status, RestStatus.NOT_FOUND, 'should Throws 404 Not found') } }) @@ -172,10 +172,7 @@ describe('PermissionManager tests', function () { const contract = await permissionManagerJs.uploadContract(admin, master) const args = { address: 1234 } - // TODO: Add shouldThrowRest in util or blockapps-rest - // await assert.shouldThrowRest(async function () { - // await contract.revoke(args) - // }, RestStatus.BAD_REQUEST) + try { await contract.revoke(args) } catch (e) { diff --git a/auth/user/test/userManager.test.js b/auth/user/test/userManager.test.js index 4f1bb82..1b9f0c9 100644 --- a/auth/user/test/userManager.test.js +++ b/auth/user/test/userManager.test.js @@ -69,7 +69,7 @@ describe('UserManager tests', function () { try { await contract.createUser(args); } catch (e) { - assert.equal(e.response.status, '400', 'should Throws 404 Not found') + assert.equal(e.response.status, RestStatus.BAD_REQUEST, 'should Throws 404 Not found') } }); diff --git a/package.json b/package.json index b35b057..a1d0ab5 100644 --- a/package.json +++ b/package.json @@ -35,6 +35,7 @@ "eslint-plugin-jsx-a11y": "^6.0.3", "eslint-plugin-react": "^7.10.0", "fs": "^0.0.1-security", + "http-status-codes": "^1.3.2", "js-yaml": "^3.12.2", "mocha": "^3.4.2" } From 0bc666cc6d48c8daa93de5049d55b48db08d594f Mon Sep 17 00:00:00 2001 From: Tanuj Soni Date: Wed, 10 Apr 2019 19:42:19 +0530 Subject: [PATCH 18/18] [test-branch] Temp commit --- auth/permission/permissionManager.js | 3 +-- auth/user/test/userManager-load.test.js | 1 - auth/user/userManager.js | 9 ++++----- collections/hashmap/hashmap.js | 7 +++---- collections/hashmap/unsafeHashmap.js | 7 +++---- package.json | 4 ++-- 6 files changed, 13 insertions(+), 18 deletions(-) diff --git a/auth/permission/permissionManager.js b/auth/permission/permissionManager.js index d9b0c3c..a5f649b 100644 --- a/auth/permission/permissionManager.js +++ b/auth/permission/permissionManager.js @@ -92,7 +92,7 @@ async function grant(admin, contract, args) { const [restStatus, permissions] = await call(admin, callArgs, options); if (restStatus != RestStatus.OK) { - throw new Error(restStatus); + throw new RestError(restStatus, callArgs.method, callArgs.args); } return permissions; } @@ -141,7 +141,6 @@ async function revoke(admin, contract, args) { } const [restStatus] = await call(admin, callArgs, options); - // TODO: reststatus if (restStatus != RestStatus.OK) { throw new RestError(restStatus, callArgs.method, callArgs.args); } diff --git a/auth/user/test/userManager-load.test.js b/auth/user/test/userManager-load.test.js index 7f1d63a..cc1cea6 100644 --- a/auth/user/test/userManager-load.test.js +++ b/auth/user/test/userManager-load.test.js @@ -51,7 +51,6 @@ describe('UserManager LOAD tests', function () { }); }); -// TODO: move to blockapps-rest. if the function using multiple places function filter_isContained(setA, setB, comparator, isDebug) { if (isDebug) { console.log('setA', setA); diff --git a/auth/user/userManager.js b/auth/user/userManager.js index 5ddb39f..f1fcb23 100644 --- a/auth/user/userManager.js +++ b/auth/user/userManager.js @@ -1,3 +1,4 @@ +import RestStatus from 'http-status-codes'; import { rest, util, importer } from 'blockapps-rest'; const { createContract, getState, call, RestError } = rest; @@ -9,7 +10,6 @@ const contractFilename = `${util.cwd}/${config.libPath}/auth/user/contracts/User const options = { config }; -// TODO: (remove if not in use) const RestStatus = rest.getFields(`${config.libPath}/rest/contracts/RestStatus.sol`); import * as userJs from './user'; async function uploadContract(admin) { @@ -60,8 +60,7 @@ async function createUser(admin, contract, args) { // create the user, with the eth account const [restStatus] = await call(admin, callArgs, options); - // TODO: add RestStatus api call. No magic numbers - if (restStatus != '201') { + if (restStatus != RestStatus.CREATED) { throw new RestError(restStatus, callArgs.method, callArgs.args); } // block until the user shows up in search @@ -101,7 +100,7 @@ async function getUser(admin, contract, username) { // get the use address const [address] = await call(admin, callArgs, options); if (address == 0) { - throw new RestError('404', callArgs.method, args); + throw new RestError(RestStatus.NOT_FOUND, callArgs.method, args); } // found - query for the full user record return await userJs.getUserByAddress(address); @@ -126,7 +125,7 @@ async function authenticate(admin, contract, args) { return isOK; } -export { +export default { uploadContract, contractName, bind diff --git a/collections/hashmap/hashmap.js b/collections/hashmap/hashmap.js index 3ff4fbe..92f631b 100644 --- a/collections/hashmap/hashmap.js +++ b/collections/hashmap/hashmap.js @@ -27,10 +27,9 @@ function bind(admin, contract) { contract.getState = async function () { return await getState(contract, options); } - // TODO: Why we are using this function which is not in use - // contract.getStateVar = function* (args) { - // return await rest.getStateVar(contract, args.name, args.count, args.offset, args.length); - // } + contract.getStateVar = async function (args) { + return await rest.getStateVar(contract, args.name, args.count, args.offset, args.length); + } contract.put = async function (args) { return await put(admin, contract, args); } diff --git a/collections/hashmap/unsafeHashmap.js b/collections/hashmap/unsafeHashmap.js index d01d67f..b68aacc 100644 --- a/collections/hashmap/unsafeHashmap.js +++ b/collections/hashmap/unsafeHashmap.js @@ -28,10 +28,9 @@ function bind(admin, _contract) { contract.getState = async function () { return await getState(contract, options) } - // TODO: Why we are using this function which is not in use - // contract.getStateVar = async function (args) { - // return await rest.getStateVar(contract, args.name, args.count, args.offset, args.length) - // } + contract.getStateVar = async function (args) { + return await rest.getStateVar(contract, args.name, args.count, args.offset, args.length) + } contract.put = async function (args) { return await put(admin, contract, args) } diff --git a/package.json b/package.json index a1d0ab5..db796ac 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,7 @@ "main": "", "scripts": { "mocha-babel": "node_modules/.bin/mocha --require @babel/register", - "test": "find . -type f -name '*.test.js' ! -path './node_modules/*' | xargs mocha ", + "test": "yarn test:hashmap && yarn test:permission && yarn test:user", "test:hashmap": "yarn mocha-babel collections/hashmap/test/ --config config.yaml -b", "test:permission": "yarn mocha-babel auth/permission/test/ --config config.yaml -b --api-debug", "test:user": "yarn mocha-babel auth/user/test/ --config config.yaml -b ", @@ -27,7 +27,7 @@ "@babel/node": "^7.2.2", "@babel/preset-env": "^7.3.4", "@babel/register": "^7.0.0", - "blockapps-rest": "git://github.com/blockapps/blockapps-rest#barf-develop", + "blockapps-rest": "alpha", "chai": "^4.0.2", "eslint": "^4.19.1", "eslint-config-airbnb": "^17.0.0",