Add specs to test success and fail case of claiming

pull/35/head
Makoto Inoue 8 years ago
parent e8262f7c4b
commit e35ba313a7
  1. 5
      contracts/bounties/SimpleTokenBounty.sol
  2. 98
      test/Bounty.js

@ -22,6 +22,8 @@ contract SimpleTokenBounty is PullPayment {
address public factoryAddress;
mapping(address => address) public researchers;
event TargetCreated(address createdAddress);
function() payable {
if (claimed) throw;
}
@ -33,6 +35,7 @@ contract SimpleTokenBounty is PullPayment {
function createTarget() returns(Target) {
target = Target(Factory(factoryAddress).deployContract());
researchers[target] = msg.sender;
TargetCreated(target);
return target;
}
@ -44,7 +47,7 @@ contract SimpleTokenBounty is PullPayment {
address researcher = researchers[target];
if (researcher == 0) throw;
// Check Target contract invariants
if (!target.checkInvariant()) {
if (target.checkInvariant()) {
throw;
}
asyncSend(researcher, this.balance);

@ -1,11 +1,15 @@
contract('Bounty', function(accounts) {
before(function(){
owner = accounts[0];
researcher = accounts[1];
var sendReward = function(sender, receiver, value){
web3.eth.sendTransaction({
from:sender,
to:receiver,
value: value
})
}
contract('Bounty', function(accounts) {
it("can create bounty contract with factory address", function(done){
var target = SecureTargetMock.deployed();
SimpleTokenBounty.new(target.address).
then(function(bounty){
return bounty.factoryAddress.call()
@ -18,26 +22,21 @@ contract('Bounty', function(accounts) {
it("sets reward", function(done){
var target = SecureTargetMock.deployed();
var owner = accounts[0];
var reward = web3.toWei(1, "ether");
var bounty;
SimpleTokenBounty.new(target.address).
then(function(bounty){
web3.eth.sendTransaction({
from:owner,
to:bounty.address,
value: reward
})
sendReward(owner, bounty.address, reward);
assert.equal(reward, web3.eth.getBalance(bounty.address).toNumber())
}).
then(done);
})
describe("SecureTargetMock", function(){
before(function(){
targetFactory = SecureTargetFactory.deployed();
})
it("checkInvariant returns true", function(done){
var targetFactory = SecureTargetFactory.deployed();
var bounty;
SimpleTokenBounty.new(targetFactory.address).
then(function(_bounty) {
bounty = _bounty;
@ -51,14 +50,46 @@ contract('Bounty', function(accounts) {
}).
then(done);
})
})
describe("InsecureTargetMock", function(){
before(function(){
targetFactory = InsecureTargetFactory.deployed();
it("cannot calim reward", function(done){
var targetFactory = SecureTargetFactory.deployed();
var owner = accounts[0];
var researcher = accounts[1];
var reward = web3.toWei(1, "ether");
SimpleTokenBounty.new(targetFactory.address).
then(function(bounty) {
var event = bounty.TargetCreated({});
event.watch(function(err, result) {
event.stopWatching();
if (err) { throw err }
var targetAddress = result.args.createdAddress;
sendReward(owner, bounty.address, reward);
assert.equal(reward, web3.eth.getBalance(bounty.address).toNumber())
bounty.claim(targetAddress, {from:researcher}).
then(function(){ throw("should not come here")}).
catch(function() {
return bounty.claimed.call();
}).
then(function(result) {
assert.isFalse(result);
bounty.withdrawPayments({from:researcher}).
then(function(){ throw("should not come here")}).
catch(function() {
assert.equal(reward, web3.eth.getBalance(bounty.address).toNumber())
done();
})
})
})
bounty.createTarget({from:researcher});
})
})
})
describe("InsecureTargetMock", function(){
it("checkInvariant returns false", function(done){
var targetFactory = InsecureTargetFactory.deployed();
var bounty;
SimpleTokenBounty.new(targetFactory.address).
then(function(_bounty) {
bounty = _bounty;
@ -72,5 +103,36 @@ contract('Bounty', function(accounts) {
}).
then(done);
})
it("calims reward", function(done){
var targetFactory = InsecureTargetFactory.deployed();
var owner = accounts[0];
var researcher = accounts[1];
var reward = web3.toWei(1, "ether");
SimpleTokenBounty.new(targetFactory.address).
then(function(bounty) {
var event = bounty.TargetCreated({});
event.watch(function(err, result) {
event.stopWatching();
if (err) { throw err }
var targetAddress = result.args.createdAddress;
sendReward(owner, bounty.address, reward);
assert.equal(reward, web3.eth.getBalance(bounty.address).toNumber())
bounty.claim(targetAddress, {from:researcher}).
then(function() {
return bounty.claimed.call();
}).
then(function(result) {
assert.isTrue(result);
return bounty.withdrawPayments({from:researcher})
}).
then(function() {
assert.equal(0, web3.eth.getBalance(bounty.address).toNumber())
}).then(done);
})
bounty.createTarget({from:researcher});
})
})
})
});

Loading…
Cancel
Save