parent
cd6cdac491
commit
59b8f2340c
@ -0,0 +1,21 @@ |
|||||||
|
import { NightwatchBrowser } from 'nightwatch' |
||||||
|
import EventEmitter from "events" |
||||||
|
|
||||||
|
class sendLowLevelTx extends EventEmitter { |
||||||
|
command (this: NightwatchBrowser, address: string, value: string, callData: string): NightwatchBrowser { |
||||||
|
console.log('low level transact to ', address, value, callData) |
||||||
|
this.api.waitForElementVisible(`#instance${address} #deployAndRunLLTxSendTransaction`, 1000) |
||||||
|
.clearValue(`#instance${address} #deployAndRunLLTxCalldata`) |
||||||
|
.setValue(`#instance${address} #deployAndRunLLTxCalldata`, callData) |
||||||
|
.waitForElementVisible('#value') |
||||||
|
.clearValue('#value') |
||||||
|
.setValue('#value', value) |
||||||
|
.scrollAndClick(`#instance${address} #deployAndRunLLTxSendTransaction`) |
||||||
|
.perform(() => { |
||||||
|
this.emit('complete') |
||||||
|
}) |
||||||
|
return this |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
module.exports = sendLowLevelTx |
@ -0,0 +1,284 @@ |
|||||||
|
'use strict' |
||||||
|
import { NightwatchBrowser } from "nightwatch" |
||||||
|
import init from '../helpers/init' |
||||||
|
import sauce from './sauce' |
||||||
|
|
||||||
|
module.exports = { |
||||||
|
before: function (browser: NightwatchBrowser, done: VoidFunction) { |
||||||
|
// this test suite also contribute testing https://github.com/ethereum/remix/pull/1497 and https://github.com/ethereum/remix-ide/pull/2898
|
||||||
|
// quick explanation:
|
||||||
|
// the goal of https://github.com/ethereum/remix-ide/pull/2898 is to keep track of all the compiled contracts an not only the last one.
|
||||||
|
// this introduce an issue: if 2 compiled contracts have the same name, the second one override the first which is not wanted.
|
||||||
|
// fix's delivered by https://github.com/ethereum/remix/pull/1497: instead of getting contract by name,
|
||||||
|
// which result in name clashing we process the whole contract object (which contain bytecode, deployedbytecode, ...)
|
||||||
|
init(browser, done) |
||||||
|
}, |
||||||
|
|
||||||
|
'@sources': function () { |
||||||
|
return sources |
||||||
|
}, |
||||||
|
|
||||||
|
'Use special functions receive/fallback - both are declared, sending data': function (browser: NightwatchBrowser) { |
||||||
|
browser.waitForElementVisible('#icon-panel', 10000) |
||||||
|
.testContracts('receiveAndFallback.sol', sources[0]['browser/receiveAndFallback.sol'], ['CheckSpecials']) // compile
|
||||||
|
.clickLaunchIcon('udapp') |
||||||
|
.selectAccount('0xCA35b7d915458EF540aDe6068dFe2F44E8fa733c') // this account will be used for this test suite
|
||||||
|
.selectContract('CheckSpecials') |
||||||
|
.createContract('') // deploy
|
||||||
|
.clickInstance(0) |
||||||
|
.perform((done) => { |
||||||
|
browser.getAddressAtPosition(0, (address) => { |
||||||
|
browser.sendLowLevelTx(address, '0', '0xaa') |
||||||
|
.pause(1000) |
||||||
|
.journalLastChildIncludes('to: CheckSpecials.(fallback)') |
||||||
|
.journalLastChildIncludes('value: 0 wei') |
||||||
|
.journalLastChildIncludes('data: 0xaa') |
||||||
|
.perform(done) |
||||||
|
}) |
||||||
|
}) |
||||||
|
}, |
||||||
|
|
||||||
|
'Use special functions receive/fallback - both are declared, failing sending data < 1 byte': function (browser: NightwatchBrowser) { |
||||||
|
// don't need to redeploy it, same contract
|
||||||
|
browser.perform((done) => { |
||||||
|
browser.getAddressAtPosition(0, (address) => { |
||||||
|
browser.sendLowLevelTx(address, '0', '0xa') |
||||||
|
.pause(1000) |
||||||
|
.waitForElementVisible(`#instance${address} label[id="deployAndRunLLTxError"]`) |
||||||
|
.assert.containsText(`#instance${address} label[id="deployAndRunLLTxError"]`, `The calldata should be a valid hexadecimal value with size of at least one byte.`) |
||||||
|
.perform(done) |
||||||
|
}) |
||||||
|
}) |
||||||
|
}, |
||||||
|
'Use special functions receive/fallback - both are declared, failing sending data with odd number of digits': function (browser: NightwatchBrowser) { |
||||||
|
// don't need to redeploy it, same contract
|
||||||
|
browser.perform((done) => { |
||||||
|
browser.getAddressAtPosition(0, (address) => { |
||||||
|
browser.sendLowLevelTx(address, '0', '0x1aa') |
||||||
|
.pause(1000) |
||||||
|
.waitForElementVisible(`#instance${address} label[id="deployAndRunLLTxError"]`) |
||||||
|
.assert.containsText(`#instance${address} label[id="deployAndRunLLTxError"]`, `The calldata should be a valid hexadecimal value.`) |
||||||
|
.perform(done) |
||||||
|
}) |
||||||
|
}) |
||||||
|
}, |
||||||
|
'Use special functions receive/fallback - both are declared - receive called, sending wei': function (browser: NightwatchBrowser) { |
||||||
|
// don't need to redeploy it, same contract
|
||||||
|
browser.perform((done) => { |
||||||
|
browser.getAddressAtPosition(0, (address) => { |
||||||
|
browser.sendLowLevelTx(address, '1', '') |
||||||
|
.pause(1000) |
||||||
|
.journalLastChildIncludes('to: CheckSpecials.(receive)') |
||||||
|
.journalLastChildIncludes('value: 1 wei') |
||||||
|
.journalLastChildIncludes('data: 0x') |
||||||
|
.perform(done) |
||||||
|
}) |
||||||
|
}) |
||||||
|
}, |
||||||
|
'Use special functions receive/fallback - both are declared - fallback should fail cause not payable, sending data and wei': function (browser: NightwatchBrowser) { |
||||||
|
// don't need to redeploy it, same contract
|
||||||
|
browser.perform((done) => { |
||||||
|
browser.getAddressAtPosition(0, (address) => { |
||||||
|
browser.sendLowLevelTx(address, '10', '0xaa') |
||||||
|
.pause(1000) |
||||||
|
.journalLastChildIncludes('to CheckSpecials.(fallback) errored:') |
||||||
|
.journalLastChildIncludes('The called function should be payable if you send value') |
||||||
|
.perform(done) |
||||||
|
}) |
||||||
|
}) |
||||||
|
}, |
||||||
|
'Use special functions receive/fallback - only receive is declared, sending wei': function (browser: NightwatchBrowser) { |
||||||
|
browser.waitForElementVisible('#icon-panel', 10000) |
||||||
|
.testContracts('receiveOnly.sol', sources[1]['browser/receiveOnly.sol'], ['CheckSpecials']) |
||||||
|
.clickLaunchIcon('udapp') |
||||||
|
.selectContract('CheckSpecials') |
||||||
|
.createContract('') |
||||||
|
.clickInstance(1) |
||||||
|
.perform((done) => { |
||||||
|
browser.getAddressAtPosition(1, (address) => { |
||||||
|
browser.sendLowLevelTx(address, '1', '') |
||||||
|
.pause(1000) |
||||||
|
.journalLastChildIncludes('to: CheckSpecials.(receive)') |
||||||
|
.journalLastChildIncludes('value: 1 wei') |
||||||
|
.journalLastChildIncludes('data: 0x') |
||||||
|
.perform(done) |
||||||
|
}) |
||||||
|
}) |
||||||
|
}, |
||||||
|
'Use special functions receive/fallback - only receive is declared, failing, fallback is not declared, sending data': function (browser: NightwatchBrowser) { |
||||||
|
// don't need to redeploy it, same contract
|
||||||
|
browser.perform((done) => { |
||||||
|
browser.getAddressAtPosition(1, (address) => { |
||||||
|
browser.sendLowLevelTx(address, '0', '0xaa') |
||||||
|
.pause(1000) |
||||||
|
.waitForElementVisible(`#instance${address} label[id="deployAndRunLLTxError"]`) |
||||||
|
.assert.containsText(`#instance${address} label[id="deployAndRunLLTxError"]`, `'Fallback' function is not defined`) |
||||||
|
.perform(done) |
||||||
|
}) |
||||||
|
}) |
||||||
|
}, |
||||||
|
'Use special functions receive/fallback - only fallback declared and is payable, sending wei': function (browser: NightwatchBrowser) { |
||||||
|
browser.waitForElementVisible('#icon-panel', 10000) |
||||||
|
.testContracts('fallbackOnlyPayable.sol', sources[2]['browser/fallbackOnlyPayable.sol'], ['CheckSpecials']) |
||||||
|
.clickLaunchIcon('udapp') |
||||||
|
.selectContract('CheckSpecials') |
||||||
|
.createContract('') |
||||||
|
.clickInstance(2) |
||||||
|
.perform((done) => { |
||||||
|
browser.getAddressAtPosition(2, (address) => { |
||||||
|
browser.sendLowLevelTx(address, '1', '') |
||||||
|
.pause(1000) |
||||||
|
.journalLastChildIncludes('to: CheckSpecials.(fallback)') |
||||||
|
.journalLastChildIncludes('value: 1 wei') |
||||||
|
.journalLastChildIncludes('data: 0x') |
||||||
|
.perform(done) |
||||||
|
}) |
||||||
|
}) |
||||||
|
}, |
||||||
|
'Use special functions receive/fallback - only fallback is diclared and is payable, sending data and wei': function (browser: NightwatchBrowser) { |
||||||
|
// don't need to redeploy it, same contract
|
||||||
|
browser.perform((done) => { |
||||||
|
browser.getAddressAtPosition(2, (address) => { |
||||||
|
browser.sendLowLevelTx(address, '1', '0xaa') |
||||||
|
.pause(1000) |
||||||
|
.journalLastChildIncludes('to: CheckSpecials.(fallback)') |
||||||
|
.journalLastChildIncludes('value: 1 wei') |
||||||
|
.journalLastChildIncludes('data: 0xaa') |
||||||
|
.perform(done) |
||||||
|
}) |
||||||
|
}) |
||||||
|
}, |
||||||
|
'Use special functions receive/fallback - only fallback is declared, fallback should fail cause not payable, sending wei': function (browser: NightwatchBrowser) { |
||||||
|
browser.waitForElementVisible('#icon-panel', 10000) |
||||||
|
.testContracts('fallbackOnlyNotPayable.sol', sources[3]['browser/fallbackOnlyNotPayable.sol'], ['CheckSpecials']) |
||||||
|
.clickLaunchIcon('udapp') |
||||||
|
.selectContract('CheckSpecials') |
||||||
|
.createContract('') |
||||||
|
.clickInstance(3) |
||||||
|
.perform((done) => { |
||||||
|
browser.getAddressAtPosition(3, (address) => { |
||||||
|
browser.sendLowLevelTx(address, '1', '') |
||||||
|
.pause(1000) |
||||||
|
.waitForElementVisible(`#instance${address} label[id="deployAndRunLLTxError"]`) |
||||||
|
.assert.containsText(`#instance${address} label[id="deployAndRunLLTxError"]`, `should have either 'receive' or payable 'fallback'`) |
||||||
|
.perform(done) |
||||||
|
}) |
||||||
|
}) |
||||||
|
}, |
||||||
|
'Use special functions receive/fallback - receive and fallback are declared, sending data and wei': function (browser: NightwatchBrowser) { |
||||||
|
browser.waitForElementVisible('#icon-panel', 10000) |
||||||
|
.testContracts('receiveAndFallbackBothPayable.sol', sources[4]['browser/receiveAndFallbackBothPayable.sol'], ['CheckSpecials']) |
||||||
|
.clickLaunchIcon('udapp') |
||||||
|
.selectContract('CheckSpecials') |
||||||
|
.waitForElementVisible('#value') |
||||||
|
.clearValue('#value') |
||||||
|
.setValue('#value', '0') |
||||||
|
.createContract('') |
||||||
|
.clickInstance(4) |
||||||
|
.pause(1000) |
||||||
|
.perform((done) => { |
||||||
|
browser.getAddressAtPosition(4, (address) => { |
||||||
|
browser.sendLowLevelTx(address, '1', '0xaa') |
||||||
|
.pause(1000) |
||||||
|
.journalLastChildIncludes('to: CheckSpecials.(fallback)') |
||||||
|
.journalLastChildIncludes('value: 1 wei') |
||||||
|
.journalLastChildIncludes('data: 0xaa') |
||||||
|
.perform(done) |
||||||
|
}) |
||||||
|
}) |
||||||
|
}, |
||||||
|
'Use special functions receive/fallback - receive and fallback are declared and payable, sending wei': function (browser: NightwatchBrowser) { |
||||||
|
browser.perform((done) => { |
||||||
|
browser.getAddressAtPosition(4, (address) => { |
||||||
|
browser.sendLowLevelTx(address, '1', '') |
||||||
|
.pause(1000) |
||||||
|
.journalLastChildIncludes('to: CheckSpecials.(receive)') |
||||||
|
.journalLastChildIncludes('value: 1 wei') |
||||||
|
.journalLastChildIncludes('data: 0x') |
||||||
|
.perform(done) |
||||||
|
}) |
||||||
|
}) |
||||||
|
}, |
||||||
|
'Use special functions receive/fallback - receive and fallback are not declared, sending nothing': function (browser: NightwatchBrowser) { |
||||||
|
browser.waitForElementVisible('#icon-panel', 10000) |
||||||
|
.testContracts('notSpecial.sol', sources[5]['browser/notSpecial.sol'], ['CheckSpecials']) |
||||||
|
.clickLaunchIcon('udapp') |
||||||
|
.selectContract('CheckSpecials') |
||||||
|
.waitForElementVisible('#value') |
||||||
|
.clearValue('#value') |
||||||
|
.setValue('#value', '0') |
||||||
|
.createContract('') |
||||||
|
.clickInstance(5) |
||||||
|
.pause(1000) |
||||||
|
.perform((done) => { |
||||||
|
browser.getAddressAtPosition(5, (address) => { |
||||||
|
browser.sendLowLevelTx(address, '0', '') |
||||||
|
.pause(1000) |
||||||
|
.waitForElementVisible(`#instance${address} label[id="deployAndRunLLTxError"]`) |
||||||
|
.assert.containsText(`#instance${address} label[id="deployAndRunLLTxError"]`, `Both 'receive' and 'fallback' functions are not defined`) |
||||||
|
.perform(done) |
||||||
|
}) |
||||||
|
}) |
||||||
|
.end() |
||||||
|
}, |
||||||
|
tearDown: sauce |
||||||
|
} |
||||||
|
|
||||||
|
const sources = [ |
||||||
|
{ |
||||||
|
'browser/receiveAndFallback.sol': { |
||||||
|
content: ` |
||||||
|
contract CheckSpecials { |
||||||
|
receive() payable external{} |
||||||
|
fallback() external {} |
||||||
|
} |
||||||
|
` |
||||||
|
} |
||||||
|
}, |
||||||
|
{ |
||||||
|
'browser/receiveOnly.sol': { |
||||||
|
content: ` |
||||||
|
contract CheckSpecials { |
||||||
|
receive() payable external {} |
||||||
|
} |
||||||
|
` |
||||||
|
} |
||||||
|
}, |
||||||
|
{ |
||||||
|
'browser/fallbackOnlyPayable.sol': { |
||||||
|
content: ` |
||||||
|
contract CheckSpecials { |
||||||
|
fallback() payable external {} |
||||||
|
} |
||||||
|
` |
||||||
|
} |
||||||
|
}, |
||||||
|
{ |
||||||
|
'browser/fallbackOnlyNotPayable.sol': { |
||||||
|
content: ` |
||||||
|
contract CheckSpecials { |
||||||
|
fallback() external {} |
||||||
|
} |
||||||
|
` |
||||||
|
} |
||||||
|
}, |
||||||
|
{ |
||||||
|
'browser/receiveAndFallbackBothPayable.sol': { |
||||||
|
content: ` |
||||||
|
contract CheckSpecials { |
||||||
|
receive() payable external {} |
||||||
|
fallback() payable external {} |
||||||
|
} |
||||||
|
` |
||||||
|
} |
||||||
|
}, |
||||||
|
{ |
||||||
|
'browser/notSpecial.sol': { |
||||||
|
content: ` |
||||||
|
contract CheckSpecials { |
||||||
|
function otherFallback() payable external {} |
||||||
|
} |
||||||
|
` |
||||||
|
} |
||||||
|
} |
||||||
|
] |
Loading…
Reference in new issue