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 });