|
|
|
const NodeIngress = artifacts.require('NodeIngress.sol');
|
|
|
|
const NodeRules = artifacts.require('NodeRules.sol');
|
|
|
|
const RulesStorage = artifacts.require('NodeStorage.sol');
|
|
|
|
const Admin = artifacts.require('Admin.sol');
|
|
|
|
|
|
|
|
// Contract keys
|
|
|
|
const RULES_NAME = "0x72756c6573000000000000000000000000000000000000000000000000000000";
|
|
|
|
const ADMIN_NAME = "0x61646d696e697374726174696f6e000000000000000000000000000000000000";
|
|
|
|
|
|
|
|
const enode1 = "9bd359fdc3a2ed5df436c3d8914b1532740128929892092b7fcb320c1b62f375"
|
|
|
|
+ "2e1092b7fcb320c1b62f3759bd359fdc3a2ed5df436c3d8914b1532740128929";
|
|
|
|
const node1Host = "127.0.0.1";
|
|
|
|
const node1Port = 30303;
|
|
|
|
|
|
|
|
const enode2 = "892092b7fcb320c1b62f3759bd359fdc3a2ed5df436c3d8914b1532740128929"
|
|
|
|
+ "cb320c1b62f37892092b7f59bd359fdc3a2ed5df436c3d8914b1532740128929";
|
|
|
|
const node2Host = "139.86.1.2";
|
|
|
|
const node2Port = 30304;
|
|
|
|
|
|
|
|
const enode3 = "765092b7fcb320c1b62f3759bd359fdc3a2ed5df436c3d8914b1532740128929"
|
|
|
|
+ "920982b7fcb320c1b62f3759bd359fdc3a2ed5df436c3d8914b1532740128929";
|
|
|
|
const node3Host = "localhost";
|
|
|
|
const node3Port = 30305;
|
|
|
|
|
|
|
|
const newAdmin = "f17f52151EbEF6C7334FAD080c5704D77216b732";
|
|
|
|
|
|
|
|
contract("NodeRules (Permissioning)", (accounts) => {
|
|
|
|
let nodeIngressContract;
|
|
|
|
let nodeRulesContract;
|
|
|
|
let adminContract;
|
|
|
|
let storageContract;
|
|
|
|
|
|
|
|
before(async () => {
|
|
|
|
nodeIngressContract = await NodeIngress.new();
|
|
|
|
|
|
|
|
adminContract = await Admin.new();
|
|
|
|
await nodeIngressContract.setContractAddress(ADMIN_NAME, adminContract.address);
|
|
|
|
|
|
|
|
// set the storage
|
|
|
|
storageContract = await RulesStorage.new(nodeIngressContract.address);
|
|
|
|
console.log(" >>> Storage contract deployed with address = " + storageContract.address);
|
|
|
|
|
|
|
|
nodeRulesContract = await NodeRules.new(nodeIngressContract.address, storageContract.address);
|
|
|
|
await nodeIngressContract.setContractAddress(RULES_NAME, nodeRulesContract.address);
|
|
|
|
|
|
|
|
// set rules as the storage owner
|
|
|
|
await storageContract.upgradeVersion(nodeRulesContract.address);
|
|
|
|
console.log(" >>> Set storage owner to Rules.address");
|
|
|
|
});
|
|
|
|
|
|
|
|
it('should NOT permit node when list is empty', async () => {
|
|
|
|
let size = await nodeRulesContract.getSize();
|
|
|
|
assert.equal(size, 0, "expected empty list");
|
|
|
|
|
|
|
|
let permitted = await nodeRulesContract.enodePermitted(enode1, node1Host, node1Port);
|
|
|
|
assert.notOk(permitted, 'expected node NOT permitted');
|
|
|
|
});
|
|
|
|
|
|
|
|
it('Should NOT fail when removing enode from empty list', async () => {
|
|
|
|
let size = await nodeRulesContract.getSize();
|
|
|
|
assert.equal(size, 0, "expected empty list");
|
|
|
|
|
|
|
|
let tx = await nodeRulesContract.removeEnode(enode1, node1Host, node1Port);
|
|
|
|
assert.ok(tx.receipt.status);
|
|
|
|
});
|
|
|
|
|
|
|
|
it('should add multiple nodes to list', async () => {
|
|
|
|
await nodeRulesContract.addEnode(enode1, node1Host, node1Port);
|
|
|
|
await nodeRulesContract.addEnode(enode2, node2Host, node2Port);
|
|
|
|
await nodeRulesContract.addEnode(enode3, node3Host, node3Port);
|
|
|
|
|
|
|
|
permitted = await nodeRulesContract.enodePermitted(enode1, node1Host, node1Port);
|
|
|
|
assert.ok(permitted, 'expected node 1 added to be in list');
|
|
|
|
|
|
|
|
permitted = await nodeRulesContract.enodePermitted(enode2, node2Host, node2Port);
|
|
|
|
assert.ok(permitted, 'expected node 2 added to be in list');
|
|
|
|
|
|
|
|
permitted = await nodeRulesContract.enodePermitted(enode3, node3Host, node3Port);
|
|
|
|
assert.ok(permitted, 'expected node 3 added to be in list');
|
|
|
|
});
|
|
|
|
|
|
|
|
it('should allow a connection between nodes added to the list', async () => {
|
|
|
|
let permitted = await nodeRulesContract.connectionAllowed(enode1, node1Host, node1Port);
|
|
|
|
assert.equal(permitted, true, 'expected permitted node1');
|
|
|
|
|
|
|
|
permitted = await nodeRulesContract.connectionAllowed(enode2, node2Host, node2Port);
|
|
|
|
assert.equal(permitted, true, 'expected permitted node2');
|
|
|
|
|
|
|
|
permitted = await nodeRulesContract.connectionAllowed(enode3, node3Host, node3Port);
|
|
|
|
assert.equal(permitted, true, 'expected permitted node3');
|
|
|
|
});
|
|
|
|
|
|
|
|
it('should NOT allow connection with node removed from list', async () => {
|
|
|
|
await nodeRulesContract.removeEnode(enode3, node3Host, node3Port);
|
|
|
|
let permitted = await nodeRulesContract.enodePermitted(enode3, node3Host, node3Port);
|
|
|
|
assert.notOk(permitted, 'expected removed node NOT permitted');
|
|
|
|
|
|
|
|
permitted = await nodeRulesContract.connectionAllowed(enode3, node3Host, node3Port);
|
|
|
|
assert.equal(permitted, false, 'expected source disallowed since it was removed');
|
|
|
|
|
|
|
|
let result = await nodeRulesContract.getSize();
|
|
|
|
assert.equal(result, 2, "expected number of nodes");
|
|
|
|
});
|
|
|
|
|
|
|
|
it('should permit a node added back to the list', async () => {
|
|
|
|
let permitted = await nodeRulesContract.enodePermitted(enode3, node3Host, node3Port);
|
|
|
|
assert.notOk(permitted, 'expected removed node NOT permitted');
|
|
|
|
|
|
|
|
await nodeRulesContract.addEnode(enode3, node3Host, node3Port);
|
|
|
|
permitted = await nodeRulesContract.enodePermitted(enode3, node3Host, node3Port);
|
|
|
|
assert.ok(permitted, 'expected added node permitted');
|
|
|
|
|
|
|
|
permitted = await nodeRulesContract.connectionAllowed(enode3, node3Host, node3Port,);
|
|
|
|
assert.equal(permitted, true, 'expected connection allowed since node was added back to list');
|
|
|
|
});
|
|
|
|
|
|
|
|
it('should not allow non-admin account to add node to list', async () => {
|
|
|
|
try {
|
|
|
|
await nodeRulesContract.addEnode(enode1, node1Host, node1Port, { from: accounts[1] });
|
|
|
|
expect.fail(null, null, "Modifier was not enforced")
|
|
|
|
} catch(err) {
|
|
|
|
expect(err.reason).to.contain('Sender not authorized');
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
it('should not allow non-admin account to remove node from list', async () => {
|
|
|
|
try {
|
|
|
|
await nodeRulesContract.addEnode(enode1, node1Host, node1Port, { from: accounts[1] });
|
|
|
|
expect.fail(null, null, "Modifier was not enforced")
|
|
|
|
} catch(err) {
|
|
|
|
expect(err.reason).to.contain('Sender not authorized');
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
it('should allow new admin account to remove node from list', async () => {
|
|
|
|
await adminContract.addAdmin(accounts[1]);
|
|
|
|
|
|
|
|
await nodeRulesContract.removeEnode(enode1, node1Host, node1Port, { from: accounts[1] });
|
|
|
|
|
|
|
|
let permitted = await nodeRulesContract.enodePermitted(enode1, node1Host, node1Port);
|
|
|
|
assert.notOk(permitted, 'expected added node NOT permitted');
|
|
|
|
});
|
|
|
|
|
|
|
|
it('should allow new admin account to add node to list', async () => {
|
|
|
|
await adminContract.addAdmin(accounts[2]);
|
|
|
|
|
|
|
|
await nodeRulesContract.addEnode(enode1, node1Host, node1Port, { from: accounts[2] });
|
|
|
|
|
|
|
|
let permitted = await nodeRulesContract.enodePermitted(enode1, node1Host, node1Port);
|
|
|
|
assert.ok(permitted, 'expected added node permitted');
|
|
|
|
});
|
|
|
|
});
|