Skip to content
This repository has been archived by the owner on Jul 11, 2019. It is now read-only.

Commit

Permalink
Merge pull request #152 from filiplazovic/regression-tests
Browse files Browse the repository at this point in the history
Added regression tests
  • Loading branch information
facuspagnuolo committed Jun 18, 2018
2 parents eef23ea + b454aa7 commit 0dccbfc
Show file tree
Hide file tree
Showing 2 changed files with 188 additions and 7 deletions.
63 changes: 63 additions & 0 deletions contracts/mocks/RegressionImplementation.sol
@@ -0,0 +1,63 @@
pragma solidity ^0.4.21;

import "../migrations/Initializable.sol";

contract Implementation1 is Initializable {
uint value;

function initialize() isInitializer() public {
}

function setValue(uint _number) public {
value = _number;
}
}

contract Implementation2 is Initializable {
uint value;

function initialize() isInitializer() public {
}

function setValue(uint _number) public {
value = _number;
}

function getValue() public view returns (uint) {
return value;
}
}

contract Implementation3 is Initializable {
uint value;

function initialize() isInitializer() public {
}

function setValue(uint _number) public {
value = _number;
}

function getValue(uint _number) public view returns (uint) {
return value + _number;
}
}

contract Implementation4 is Initializable {
uint value;

function initialize() isInitializer() public {
}

function setValue(uint _number) public {
value = _number;
}

function getValue() public view returns (uint) {
return value;
}

function() public {
value = 1;
}
}
132 changes: 125 additions & 7 deletions test/contracts/upgradeability/AdminUpgradeabilityProxy.test.js
Expand Up @@ -5,13 +5,22 @@ import Contracts from '../../../src/utils/Contracts'
import encodeCall from '../../../src/helpers/encodeCall'
import assertRevert from '../../../src/test/helpers/assertRevert'

const MigratableMockV1 = Contracts.getFromLocal('MigratableMockV1')
const MigratableMockV2 = Contracts.getFromLocal('MigratableMockV2')
const MigratableMockV3 = Contracts.getFromLocal('MigratableMockV3')
const MigratableMock = Contracts.getFromLocal('MigratableMock')
const DummyImplementation = Contracts.getFromLocal('DummyImplementation')
const ClashingImplementation = Contracts.getFromLocal('ClashingImplementation')
const AdminUpgradeabilityProxy = Contracts.getFromLocal('AdminUpgradeabilityProxy')
const Implementation1 = artifacts.require('Implementation1');
const Implementation2 = artifacts.require('Implementation2');
const Implementation3 = artifacts.require('Implementation3');
const Implementation4 = artifacts.require('Implementation4');
const MigratableMockV1 = artifacts.require('MigratableMockV1')
const MigratableMockV2 = artifacts.require('MigratableMockV2')
const MigratableMockV3 = artifacts.require('MigratableMockV3')
const MigratableMock = artifacts.require('MigratableMock')
const DummyImplementation = artifacts.require('DummyImplementation')
const ClashingImplementation = artifacts.require('ClashingImplementation')
const AdminUpgradeabilityProxy = artifacts.require('AdminUpgradeabilityProxy')

const sendTransaction = (target, method, args, values, opts) => {
const data = encodeCall(method, args, values);
return target.sendTransaction(Object.assign({ data }, opts));
};

contract('AdminUpgradeabilityProxy', ([_, admin, anotherAccount]) => {
before(async function () {
Expand Down Expand Up @@ -329,4 +338,113 @@ contract('AdminUpgradeabilityProxy', ([_, admin, anotherAccount]) => {
});
});
});

describe('regression', () => {
it('should add new function', async () => {
const instance1 = await Implementation1.new();

const proxy = await AdminUpgradeabilityProxy.new(instance1.address, {
from: admin
});

const proxyInstance1 = await Implementation1.at(proxy.address);
await proxyInstance1.setValue(42);

const instance2 = await Implementation2.new();
await proxy.upgradeTo(instance2.address, {
from: admin
});

const proxyInstance2 = Implementation2.at(proxy.address);
const res = await proxyInstance2.getValue();
assert.equal(res.toString(), "42");
});

it('should remove function', async () => {
const instance2 = await Implementation2.new();

const proxy = await AdminUpgradeabilityProxy.new(instance2.address, {
from: admin
});

const proxyInstance2 = await Implementation2.at(proxy.address);
await proxyInstance2.setValue(42);
const res = await proxyInstance2.getValue();
assert.equal(res.toString(), "42");

const instance1 = await Implementation1.new();

await proxy.upgradeTo(instance1.address, {
from: admin
});

const proxyInstance1 = await Implementation2.at(proxy.address);
assertRevert(proxyInstance1.getValue());
});

it('should change function signature', async () => {
const instance1 = await Implementation1.new();

const proxy = await AdminUpgradeabilityProxy.new(instance1.address, {
from: admin
});

const proxyInstance1 = await Implementation1.at(proxy.address);
await proxyInstance1.setValue(42);

const instance3 = await Implementation3.new();
await proxy.upgradeTo(instance3.address, {
from: admin
});

const proxyInstance3 = Implementation3.at(proxy.address);
const res = await proxyInstance3.getValue(8);
assert.equal(res.toString(), "50");
});

it('should add fallback function', async () => {
const instance1 = await Implementation1.new();

const proxy = await AdminUpgradeabilityProxy.new(instance1.address, {
from: admin
});
const proxyInstance1 = await Implementation1.at(proxy.address);

const instance4 = await Implementation4.new();
await proxy.upgradeTo(instance4.address, {
from: admin
});

const proxyInstance4 = await Implementation4.at(proxy.address);

await sendTransaction(proxy, '', [], [], {
from: anotherAccount
});

const res = await proxyInstance4.getValue();
assert.equal(res.toString(), "1");
});

it('should remove fallback function', async () => {
const instance4 = await Implementation4.new();
const proxy = await AdminUpgradeabilityProxy.new(instance4.address, {
from: admin
});
const proxyInstance4 = await Implementation4.at(proxy.address);

const instance2 = await Implementation2.new();
await proxy.upgradeTo(instance2.address, {
from: admin
});

await assertRevert(sendTransaction(proxy, '', [], [], {
from: anotherAccount
}));

const proxyInstance2 = Implementation2.at(proxy.address);

const res = await proxyInstance2.getValue();
assert.equal(res.toString(), "0");
});
});
})

0 comments on commit 0dccbfc

Please sign in to comment.