|
|
|
const NodeIngress = artifacts.require('NodeIngress.sol');
|
|
|
|
const NodeRules = artifacts.require('NodeRules.sol');
|
|
|
|
const Admin = artifacts.require('Admin.sol');
|
|
|
|
const RulesStorage = artifacts.require('NodeStorage.sol');
|
|
|
|
|
|
|
|
const RULES='0x72756c6573000000000000000000000000000000000000000000000000000000';
|
|
|
|
const ADMIN='0x61646d696e697374726174696f6e000000000000000000000000000000000000';
|
|
|
|
|
|
|
|
var enode1 = "9bd359fdc3a2ed5df436c3d8914b1532740128929892092b7fcb320c1b62f375"
|
|
|
|
+ "2e1092b7fcb320c1b62f3759bd359fdc3a2ed5df436c3d8914b1532740128929";
|
|
|
|
var node1Host = "127.0.0.1";
|
|
|
|
var node1Port = 1;
|
|
|
|
|
|
|
|
contract ('NodeIngress (proxying permissioning check to rules contract)', () => {
|
|
|
|
|
|
|
|
let nodeIngressContract;
|
|
|
|
let nodeRulesContract;
|
|
|
|
let adminContract;
|
|
|
|
let storageContract;
|
|
|
|
|
|
|
|
beforeEach(async () => {
|
|
|
|
nodeIngressContract = await NodeIngress.new();
|
|
|
|
adminContract = await Admin.new();
|
|
|
|
|
|
|
|
// set the storage
|
|
|
|
storageContract = await RulesStorage.new(nodeIngressContract.address);
|
|
|
|
console.log(" >>> Storage contract deployed with address = " + storageContract.address);
|
|
|
|
|
|
|
|
await nodeIngressContract.setContractAddress(ADMIN, adminContract.address);
|
|
|
|
nodeRulesContract = await NodeRules.new(nodeIngressContract.address, storageContract.address);
|
|
|
|
|
|
|
|
// set rules as the storage owner
|
|
|
|
await storageContract.upgradeVersion(nodeRulesContract.address);
|
|
|
|
console.log(" >>> Set storage owner to Rules.address");
|
|
|
|
|
|
|
|
result = await nodeIngressContract.getContractAddress(ADMIN);
|
|
|
|
assert.equal(result, adminContract.address, 'Admin contract should be reg');
|
|
|
|
});
|
|
|
|
|
|
|
|
it('Should execute proxied call correctly', async () => {
|
|
|
|
let result;
|
|
|
|
let result2;
|
|
|
|
|
|
|
|
await nodeIngressContract.setContractAddress(RULES, nodeRulesContract.address);
|
|
|
|
|
|
|
|
result = await nodeIngressContract.getContractAddress(ADMIN);
|
|
|
|
assert.equal(result, adminContract.address, 'Admin contract should be reg');
|
|
|
|
|
|
|
|
// Verify that the NodeRules contract has been registered
|
|
|
|
result = await nodeIngressContract.getContractAddress(RULES);
|
|
|
|
assert.equal(result, nodeRulesContract.address, 'NodeRules contract should be reg');
|
|
|
|
|
|
|
|
// Verify that the nodes are not permitted to talk
|
|
|
|
result2 = await nodeRulesContract.connectionAllowed(enode1, node1Host, node1Port);
|
|
|
|
result = await nodeIngressContract.connectionAllowed(enode1, node1Host, node1Port);
|
|
|
|
assert.equal(result, false, "Connection should NOT be allowed before Enodes have been registered");
|
|
|
|
assert.equal(result, result2, "Call and proxy call did NOT return the same value");
|
|
|
|
|
|
|
|
// Add the Enode to the NodeRules register
|
|
|
|
result = await nodeRulesContract.addEnode(enode1, node1Host, node1Port);
|
|
|
|
|
|
|
|
// Verify that the nodes are now able to talk
|
|
|
|
result = await nodeIngressContract.connectionAllowed(enode1, node1Host, node1Port);
|
|
|
|
result2 = await nodeRulesContract.connectionAllowed(enode1, node1Host, node1Port);
|
|
|
|
assert.equal(result, true, "Connection SHOULD be allowed after Enodes have been registered");
|
|
|
|
assert.equal(result, result2, "Call and proxy call did NOT return the same value");
|
|
|
|
});
|
|
|
|
|
|
|
|
it('Should permit changing active NodeRules contract addresses WHILE keeping existing storage', async () => {
|
|
|
|
let result;
|
|
|
|
|
|
|
|
// Verify that the NodeRules contract has not been registered
|
|
|
|
result = await nodeIngressContract.getContractAddress(RULES);
|
|
|
|
assert.equal(result, "0x0000000000000000000000000000000000000000", 'NodeRules contract should NOT already be registered');
|
|
|
|
|
|
|
|
// Register the initial NodeRules contract
|
|
|
|
await nodeIngressContract.setContractAddress(RULES, nodeRulesContract.address);
|
|
|
|
// Verify the initial rules contract has been registered
|
|
|
|
result = await nodeIngressContract.getContractAddress(RULES);
|
|
|
|
assert.equal(result, nodeRulesContract.address, 'Initial contract has NOT been registered correctly');
|
|
|
|
|
|
|
|
// Add the Enode to the NodeRules register
|
|
|
|
result = await nodeRulesContract.addEnode(enode1, node1Host, node1Port);
|
|
|
|
|
|
|
|
// Verify that the node is permitted
|
|
|
|
result = await nodeIngressContract.connectionAllowed(enode1, node1Host, node1Port);
|
|
|
|
assert.equal(result, true, "Connection SHOULD be allowed after Enodes have been registered");
|
|
|
|
|
|
|
|
// create a NEW Rules contract
|
|
|
|
const rcProxy1 = await NodeRules.new(nodeIngressContract.address, storageContract.address);
|
|
|
|
// existing rules calls upgrade to change storage owner to the new one
|
|
|
|
storageContract.upgradeVersion(rcProxy1.address);
|
|
|
|
|
|
|
|
// Register the NEW NodeRules contract
|
|
|
|
await nodeIngressContract.setContractAddress(RULES, rcProxy1.address);
|
|
|
|
|
|
|
|
// Verify the NEW rules contract has been registered
|
|
|
|
result = await nodeIngressContract.getContractAddress(RULES);
|
|
|
|
assert.equal(result, rcProxy1.address, 'NEW Rules contract has NOT been registered correctly');
|
|
|
|
|
|
|
|
// Verify that the newly registered contract is the correct version
|
|
|
|
let contract = await NodeRules.at(result);
|
|
|
|
result = await contract.getContractVersion();
|
|
|
|
assert.equal(web3.utils.toDecimal(result), 3000000, 'Rules contract is NOT the correct version');
|
|
|
|
|
|
|
|
// Verify that the node is permitted
|
|
|
|
result = await nodeIngressContract.connectionAllowed(enode1, node1Host, node1Port);
|
|
|
|
assert.equal(result, true, "Connection SHOULD be allowed after Enodes have been registered");
|
|
|
|
|
|
|
|
});
|
|
|
|
});
|