github.com/igggame/nebulas-go@v2.1.0+incompatible/nebtestkit/cases/contract/contract.require.test.js (about)

     1  'use strict';
     2  var async = require('async');
     3  var sleep = require("system-sleep");
     4  var HttpRequest = require("../../node-request");
     5  var TestNetConfig = require("../testnet_config.js");
     6  
     7  var FS = require("fs");
     8  
     9  var expect = require('chai').expect;
    10  var BigNumber = require('bignumber.js');
    11  
    12  var Nebulas = require('nebulas');
    13  var Neb = Nebulas.Neb;
    14  var Account = Nebulas.Account;
    15  var Transaction = Nebulas.Transaction;
    16  var CryptoUtils = Nebulas.CryptoUtils;
    17  var Utils = Nebulas.Utils;
    18  
    19  
    20  var coinbase, coinState;
    21  var testCases = new Array();
    22  var caseIndex = 0;
    23  
    24  // mocha cases/contract/contract.nrc20.mult.event.test.js testneb2 -t 200000
    25  var args = process.argv.splice(2);
    26  var env = args[1];
    27  var testNetConfig = new TestNetConfig(env);
    28  
    29  
    30  var neb = new Neb();
    31  var source, deploy, from, fromState, contractAddr;
    32  var ChainID = testNetConfig.ChainId;
    33  var originSource = testNetConfig.sourceAccount;
    34  var coinbase = testNetConfig.coinbase;
    35  var apiEndPoint = testNetConfig.apiEndPoint;
    36  neb.setRequest(new HttpRequest(apiEndPoint));
    37  
    38  //require("\x00");
    39  
    40  var lastnonce = 0;
    41  
    42  function prepareSource(done) {
    43      neb.api.getAccountState(originSource.getAddressString()).then(function (resp) {
    44          console.log("prepare source account state:" + JSON.stringify(resp));
    45          var nonce = parseInt(resp.nonce);
    46  
    47          source = Account.NewAccount();
    48  
    49          var tx = new Transaction(ChainID, originSource, source, neb.nasToBasic(1000), nonce + 1, "1000000", "200000");
    50          tx.signTransaction();
    51  
    52          console.log("cliam source tx:", tx.toString());
    53  
    54          return neb.api.sendRawTransaction(tx.toProtoString());
    55      }).then(function (resp) {
    56          console.log("send Raw Tx:" + JSON.stringify(resp));
    57          expect(resp).to.be.have.property('txhash');
    58          checkTransaction(resp.txhash, function (receipt) {
    59              console.log("tx receipt : " + JSON.stringify(receipt));
    60              expect(receipt).to.be.have.property('status').equal(1);
    61  
    62              done();
    63          });
    64      }).catch(function (err) {
    65          done(err);
    66      });
    67  }
    68  
    69  function prepareContractCall(testCase, done) {
    70      neb.api.getAccountState(source.getAddressString()).then(function (resp) {
    71          console.log("source account state:" + JSON.stringify(resp));
    72          lastnonce = parseInt(resp.nonce);
    73  
    74          var accounts = new Array();
    75          var values = new Array();
    76          if (Utils.isNull(contractAddr)) {
    77              deploy = Account.NewAccount();
    78              accounts.push(deploy);
    79              values.push(neb.nasToBasic(1));
    80          }
    81  
    82          if (typeof testCase.testInput.from !== "undefined") {
    83              accounts.push(testCase.testInput.from);
    84              values.push(neb.nasToBasic(1));
    85          }
    86  
    87          if (typeof testCase.testInput.to !== "undefined") {
    88              accounts.push(testCase.testInput.to);
    89              values.push(neb.nasToBasic(1));
    90          }
    91  
    92          if (accounts.length > 0) {
    93              cliamTokens(accounts, values, function () {
    94                  if (Utils.isNull(contractAddr)) {
    95                      deployContract(done);
    96                  } else {
    97                      done();
    98                  }
    99              });
   100          } else {
   101              done();
   102          }
   103  
   104      });
   105  }
   106  
   107  function cliamTokens(accounts, values, done) {
   108      for (var i = 0; i < accounts.length; i++) {
   109          // console.log("acc:"+accounts[i].getAddressString()+"value:"+values[i]);
   110          sendTransaction(source, accounts[i], values[i], ++lastnonce);
   111          sleep(30);
   112      }
   113      checkCliamTokens(done);
   114  }
   115  
   116  function sendTransaction(from, address, value, nonce) {
   117      var transaction = new Transaction(ChainID, from, address, value, nonce, "1000000", "2000000");
   118      transaction.signTransaction();
   119      var rawTx = transaction.toProtoString();
   120      // console.log("send transaction:", transaction.toString());
   121      neb.api.sendRawTransaction(rawTx).then(function (resp) {
   122          console.log("send raw transaction resp:" + JSON.stringify(resp));
   123      });
   124  }
   125  
   126  function checkCliamTokens(done) {
   127      var intervalAccount = setInterval(function () {
   128          neb.api.getAccountState(source.getAddressString()).then(function (resp) {
   129              // console.log("master accountState resp:" + JSON.stringify(resp));
   130              var nonce = parseInt(resp.nonce);
   131              console.log("check cliam tokens nonce:", lastnonce);
   132  
   133              if (lastnonce <= nonce){
   134                  console.log("cliam tokens success");
   135                  clearInterval(intervalAccount);
   136  
   137                  done();
   138              }
   139          });
   140      }, 2000);
   141  }
   142  
   143  function deployContract(done){
   144  
   145      // create contract
   146      var source = FS.readFileSync("../nf/nvm/test/contract_require.js", "utf-8");
   147      var contract = {
   148          "source": source,
   149          "sourceType": "js",
   150          "args": "[\"StandardToken\", \"NRC\", 18, \"1000000000\"]"
   151      };
   152  
   153      var transaction = new Transaction(ChainID, deploy, deploy, "0", 1, "10000000", "2000000", contract);
   154      transaction.signTransaction();
   155      var rawTx = transaction.toProtoString();
   156  
   157      // console.log("contract:" + rawTx);
   158  
   159      neb.api.sendRawTransaction(rawTx).then(function (resp) {
   160          console.log("deploy contract:" + JSON.stringify(resp));
   161  
   162          checkTransaction(resp.txhash, done);
   163      });
   164  }
   165  
   166  function checkTransaction(txhash, done){
   167  
   168      var retry = 0;
   169      var maxRetry = 20;
   170  
   171      // contract status and get contract_address
   172      var interval = setInterval(function () {
   173          // console.log("getTransactionReceipt hash:"+txhash);
   174          neb.api.getTransactionReceipt(txhash).then(function (resp) {
   175              retry++;
   176  
   177              console.log("check transaction status:" + resp.status);
   178  
   179              if(resp.status && resp.status === 1) {
   180                  clearInterval(interval);
   181  
   182                  if (resp.contract_address) {
   183                      console.log("deploy private key:" + deploy.getPrivateKeyString());
   184                      console.log("deploy address:" + deploy.getAddressString());
   185                      console.log("deploy contract address:" + resp.contract_address);
   186                      // console.log("deploy receipt:" + JSON.stringify(resp));
   187  
   188                      contractAddr = resp.contract_address;
   189  
   190                      // checkNRCBalance(resp.from, resp.contract_address);
   191                  }
   192  
   193                  done(resp);
   194              } else if (resp.status && resp.status === 2) {
   195                  if (retry > maxRetry) {
   196                      console.log("check transaction time out");
   197                      clearInterval(interval);
   198                      done(resp);
   199                  }
   200              } else {
   201                  clearInterval(interval);
   202                  console.log("transaction execution failed");
   203                  done(resp);
   204              }
   205          }).catch(function (err) {
   206              retry++;
   207              console.log("check transaction not found retry");
   208              if (retry > maxRetry) {
   209                  console.log(JSON.stringify(err.error));
   210                  clearInterval(interval);
   211                  done(err);
   212              }
   213          });
   214  
   215      }, 2000);
   216  }
   217  
   218  
   219  function testTransferByAsync(testInput, testExpect, done) {
   220      var from = (Utils.isNull(testInput.from)) ? deploy : testInput.from;
   221  
   222      async.auto({
   223          executeContract: function(callback){
   224              var RR = requireTemplate(from.getAddressString(), testInput.function);
   225              RR.then(function(resp) {
   226                  console.log("resp:" + resp.result);
   227                  console.log("data:" + JSON.stringify(resp));
   228                  //data = JSON.parse(resp);
   229                  //console.log("to balance:", toBalance);
   230                  //expect(resp).to.be.have.property('status').equal(testExpect.status);
   231                  expect(resp).to.be.have.property('execute_err');
   232                  //console.log("--exce:" + testInput.testExpect.result);
   233                  //expect(resp).to.be.have.property('result').equal(testExpect.result);
   234                  callback(null, null);
   235              }).catch(function(err){
   236                  //console.log("getToBalance err:", err);
   237  
   238                  callback(err, null);
   239              })
   240          },
   241       }, function(err, results) {
   242          if (err) {
   243              console.log("async.auto hava break:", err);
   244              if (err == "checkTransaction execut contract failed!") {
   245                  done();
   246              } else {
   247                  done(err);
   248              }
   249          } else {
   250              console.log("end async.auto");
   251              done();
   252          }
   253       });
   254  }
   255  
   256  function requireTemplate(address, arg) {
   257      var contract = {
   258          "function": arg,
   259          "args": "[\"" + address + "\"]"
   260      };
   261      return neb.api.call(address, contractAddr, "0", 1, "1000000", "200000", contract)
   262  }
   263  
   264  function requireNULL(address) {
   265      var contract = {
   266          "function": "requireNULL",
   267          "args": "[\"" + address + "\"]"
   268      };
   269      return neb.api.call(address, contractAddr, "0", 1, "1000000", "200000", contract)
   270  }
   271  function requireNotExistPath(address) {
   272      var contract = {
   273          "function": "requireNotExistPath",
   274          "args": "[\"" + address + "\"]"
   275      };
   276      return neb.api.call(address, contractAddr, "0", 1, "1000000", "200000", contract)
   277  }
   278  function requireCurPath(address) {
   279      var contract = {
   280          "function": "requireCurPath",
   281          "args": "[\"" + address + "\"]"
   282      };
   283      return neb.api.call(address, contractAddr, "0", 1, "1000000", "200000", contract)
   284  }
   285  function requireNotExistFile(address) {
   286      var contract = {
   287          "function": "requireNotExistFile",
   288          "args": "[\"" + address + "\"]"
   289      };
   290      return neb.api.call(address, contractAddr, "0", 1, "1000000", "200000", contract)
   291  }
   292  
   293  var testCase = {
   294      "name": "1. require NULL",
   295      "testInput": {
   296          function: "requireNULL",
   297          args: ""
   298      },
   299      "testExpect": {
   300          status: 0,
   301          result: "Error: require path is not in lib"
   302      }
   303  };
   304      
   305  testCases.push(testCase);
   306  
   307  testCase = {
   308      "name": "2. requireNotExistPath",
   309      "testInput": {
   310          function: "requireNotExistPath",
   311          args: ""
   312      },
   313      "testExpect": {
   314          status: 0,
   315          result: "Error: require path is not in lib"
   316      }
   317  };
   318  testCases.push(testCase);
   319  
   320  testCase = {
   321      "name": "3. requireCurPath",
   322      "testInput": {
   323          function: "requireCurPath",
   324          args: ""
   325      },
   326      "testExpect": {
   327          status: 0,
   328          result: "Error: require path is not in lib"
   329      }
   330  };
   331  testCases.push(testCase);
   332  
   333  testCase = {
   334      "name": "4. requireNotExistFile",
   335      "testInput": {
   336          function: "requireNotExistFile",
   337          args: ""
   338      },
   339      "testExpect": {
   340          status: 0,
   341          result: "Error: require path is invalid absolutepath"
   342      }
   343  };
   344  testCases.push(testCase);
   345  
   346  
   347  describe('contract call test', function () {
   348      before(function (done) {
   349          prepareSource(done);
   350      });
   351  
   352      for (var i = 0; i < testCases.length; i++) {
   353          
   354          it(testCases[i].name, function (done) {
   355              var testCase = testCases[caseIndex];
   356              prepareContractCall(testCase, function (err) {
   357                  if (err instanceof Error) {
   358                      done(err);
   359                  } else {
   360                      //done();
   361                      testTransferByAsync(testCase.testInput, testCase.testExpect, done);
   362                  }
   363              });
   364          });
   365      }
   366  
   367      afterEach(function () {
   368          caseIndex++;
   369      });
   370  });