Browse Source

Swap target contract at test by using abstract interface

Makoto Inoue 9 years ago
parent
commit
e318d6d246

+ 3 - 6
contracts/bounties/SimpleTokenBounty.sol

@@ -9,9 +9,7 @@ import '../PullPayment.sol';
  */
 
 contract Target {
-  function checkInvarient() returns(bool){
-    return true;
-  }
+  function checkInvarient() returns(bool);
 }
 
 contract Bounty is PullPayment {
@@ -23,8 +21,8 @@ contract Bounty is PullPayment {
     if (claimed) throw;
   }
 
-  function createTarget() returns(Target) {
-    target = new Target();
+  function createTarget(address targetAddress) returns(Target) {
+    target = Target(targetAddress);
     researchers[target] = msg.sender;
     return target;
   }
@@ -37,7 +35,6 @@ contract Bounty is PullPayment {
     address researcher = researchers[target];
     if (researcher == 0) throw;
     // Check Target contract invariants
-    // Customize this to the specifics of your contract
     if (!target.checkInvarient()) {
       throw;
     }

+ 7 - 0
contracts/test-helpers/InsecureTargetMock.sol

@@ -0,0 +1,7 @@
+pragma solidity ^0.4.0;
+
+contract InsecureTargetMock {
+  function checkInvarient() returns(bool){
+    return false;
+  }
+}

+ 7 - 0
contracts/test-helpers/SecureTargetMock.sol

@@ -0,0 +1,7 @@
+pragma solidity ^0.4.0;
+
+contract SecureTargetMock {
+  function checkInvarient() returns(bool){
+    return true;
+  }
+}

+ 2 - 0
migrations/2_deploy_contracts.js

@@ -6,4 +6,6 @@ module.exports = function(deployer) {
   deployer.deploy(CrowdsaleTokenBounty);
   deployer.deploy(Ownable);
   deployer.deploy(LimitFunds);
+  deployer.deploy(SecureTargetMock);
+  deployer.deploy(InsecureTargetMock);
 };

+ 16 - 3
test/Bounty.js

@@ -1,8 +1,8 @@
 contract('Bounty', function(accounts) {
-  it.only("create target", function(done){
+  it.only("can call checkInvarient for InsecureTargetMock", function(done){
     var bounty = Bounty.deployed();
-
-    bounty.createTarget().
+    var target = SecureTargetMock.deployed();
+    bounty.createTarget(target.address).
       then(function() {
         return bounty.checkInvarient.call()
       }).
@@ -11,4 +11,17 @@ contract('Bounty', function(accounts) {
       }).
       then(done);
   })
+
+  it("can call checkInvarient for InsecureTargetMock", function(done){
+    var bounty = Bounty.deployed();
+    var target = InsecureTargetMock.deployed();
+    bounty.createTarget(target.address).
+      then(function() {
+        return bounty.checkInvarient.call()
+      }).
+      then(function(result) {
+        assert.isFalse(result);
+      }).
+      then(done);
+  })
 });