diff --git a/.circleci/config.yml b/.circleci/config.yml index 46f15113e8..659ff80155 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -7,7 +7,7 @@ jobs: remix-ide: docker: # specify the version you desire here - - image: circleci/node:9.11.2 + - image: circleci/node:9.11.2-browsers # Specify service dependencies here if necessary # CircleCI maintains a library of pre-built images @@ -32,7 +32,14 @@ jobs: key: dep-bundle-29-{{ checksum "package.json" }} paths: - ~/repo/node_modules - - run: npm run lint && npm run test && npm run make-mock-compiler && npm run build + - run: npm run lint && npm run test && npm run make-mock-compiler + - run: + name: Download Selenium + command: wget http://selenium-release.storage.googleapis.com/3.5/selenium-server-standalone-3.5.3.jar + - run: + name: Start Selenium + command: java -jar selenium-server-standalone-3.5.3.jar + background: true - run: ./ci/browser_tests.sh workflows: diff --git a/ci/browser_tests.sh b/ci/browser_tests.sh index f25dac4ac9..66e56c1d12 100755 --- a/ci/browser_tests.sh +++ b/ci/browser_tests.sh @@ -11,42 +11,22 @@ setupRemixd () { cd .. } -if test $(uname -s) = "Darwin" -then - OS="osx" - FILEFORMAT="zip" -else - OS="linux" - FILEFORMAT="tar.gz" -fi -SC_VERSION="4.5.1" -SAUCECONNECT_URL="https://saucelabs.com/downloads/sc-$SC_VERSION-$OS.$FILEFORMAT" -SAUCECONNECT_USERNAME="yanneth" -SAUCECONNECT_ACCESSKEY="1f5a4560-b02b-41aa-b52b-f033aad30870" BUILD_ID=${CIRCLE_BUILD_NUM:-${TRAVIS_JOB_NUMBER}} echo "$BUILD_ID" -SAUCECONNECT_JOBIDENTIFIER="browsersolidity_tests_${BUILD_ID}" -SAUCECONNECT_READYFILE="sc.ready" TEST_EXITCODE=0 npm run serve & - setupRemixd -wget "$SAUCECONNECT_URL" -tar -zxvf sc-"$SC_VERSION"-"$OS"."$FILEFORMAT" -./sc-"$SC_VERSION"-"$OS"/bin/sc -u "$SAUCECONNECT_USERNAME" -k "$SAUCECONNECT_ACCESSKEY" -i "$SAUCECONNECT_JOBIDENTIFIER" --no-ssl-bump-domains all --readyfile "$SAUCECONNECT_READYFILE" & -while [ ! -f "$SAUCECONNECT_READYFILE" ]; do - sleep .5 -done +sleep 5 npm run nightwatch_remote_chrome || TEST_EXITCODE=1 -npm run nightwatch_remote_firefox || TEST_EXITCODE=1 +# npm run nightwatch_remote_firefox || TEST_EXITCODE=1 # npm run nightwatch_remote_safari || TEST_EXITCODE=1 # npm run nightwatch_remote_ie || TEST_EXITCODE=1 # npm run nightwatch_remote_parallel || TEST_EXITCODE=1 -node ci/sauceDisconnect.js "$SAUCECONNECT_USERNAME" "$SAUCECONNECT_ACCESSKEY" "$SAUCECONNECT_JOBIDENTIFIER" +# node ci/sauceDisconnect.js "$SAUCECONNECT_USERNAME" "$SAUCECONNECT_ACCESSKEY" "$SAUCECONNECT_JOBIDENTIFIER" echo "$TEST_EXITCODE" if [ "$TEST_EXITCODE" -eq 1 ] diff --git a/nightwatch.js b/nightwatch.js index 046dfa2c28..560e55763a 100644 --- a/nightwatch.js +++ b/nightwatch.js @@ -1,7 +1,5 @@ 'use strict' -var buildId = process.env.CIRCLE_BUILD_NUM || process.env.TRAVIS_JOB_NUMBER - module.exports = { 'src_folders': ['test-browser/tests'], 'output_folder': 'reports', @@ -12,13 +10,8 @@ module.exports = { 'test_settings': { 'default': { - 'launch_url': 'http://ondemand.saucelabs.com:80', - 'selenium_host': 'ondemand.saucelabs.com', - 'selenium_port': 80, - 'silent': true, - 'username': 'yanneth', - 'access_key': '1f5a4560-b02b-41aa-b52b-f033aad30870', - 'use_ssl': false, + 'selenium_port': 4444, + 'selenium_host': 'localhost', 'globals': { 'waitForConditionTimeout': 10000, 'asyncHookTimeout': 100000 @@ -30,9 +23,7 @@ module.exports = { 'desiredCapabilities': { 'browserName': 'firefox', 'javascriptEnabled': true, - 'acceptSslCerts': true, - 'build': 'build-' + buildId, - 'tunnel-identifier': 'browsersolidity_tests_' + buildId + 'acceptSslCerts': true } }, @@ -41,8 +32,6 @@ module.exports = { 'browserName': 'chrome', 'javascriptEnabled': true, 'acceptSslCerts': true, - 'build': 'build-' + buildId, - 'tunnel-identifier': 'browsersolidity_tests_' + buildId, 'chromeOptions': { 'args': ['window-size=2560,1440', 'start-fullscreen'] } @@ -53,11 +42,7 @@ module.exports = { 'desiredCapabilities': { 'browserName': 'safari', 'javascriptEnabled': true, - 'platform': 'macOS 10.13', - 'version': '11.0', - 'acceptSslCerts': true, - 'build': 'build-' + buildId, - 'tunnel-identifier': 'browsersolidity_tests_' + buildId + 'acceptSslCerts': true } }, @@ -65,18 +50,11 @@ module.exports = { 'desiredCapabilities': { 'browserName': 'internet explorer', 'javascriptEnabled': true, - 'platform': 'Windows 10', - 'acceptSslCerts': true, - 'version': '11.103', - 'build': 'build-' + buildId, - 'tunnel-identifier': 'browsersolidity_tests_' + buildId + 'acceptSslCerts': true } }, 'local': { - 'launch_url': 'http://localhost:8080', - 'selenium_port': 4444, - 'selenium_host': 'localhost', 'desiredCapabilities': { 'browserName': 'chrome', 'javascriptEnabled': true, diff --git a/package.json b/package.json index 379a057f22..5f0a27549b 100644 --- a/package.json +++ b/package.json @@ -173,6 +173,7 @@ "minify": "uglifyjs --in-source-map inline --source-map-inline -c warnings=false", "nightwatch_local": "nightwatch --config nightwatch.js --env local", "nightwatch_local_general": "nightwatch ./test-browser/tests/generalTests.js --config nightwatch.js --env local ", + "nightwatch_local_sharedFolderExplorer": "nightwatch ./test-browser/tests/sharedFolderExplorer.js --config nightwatch.js --env local ", "nightwatch_local_debugger": "nightwatch --config nightwatch_debugger.js --env local", "nightwatch_remote_chrome": "nightwatch --config nightwatch.js --env chrome", "nightwatch_remote_firefox": "nightwatch --config nightwatch.js --env default", diff --git a/test-browser/helpers/contracts.js b/test-browser/helpers/contracts.js index 417867e78f..db5fb568d9 100644 --- a/test-browser/helpers/contracts.js +++ b/test-browser/helpers/contracts.js @@ -116,6 +116,7 @@ function clickFunction (fnFullName, expectedInput) { } function verifyCallReturnValue (browser, address, checks, done) { + console.log('verifyCallReturnValue address', address) browser.execute(function (address) { var nodes = document.querySelectorAll('#instance' + address + ' div[class^="contractActionsContainer"] div[class^="value"]') var ret = [] @@ -125,6 +126,7 @@ function verifyCallReturnValue (browser, address, checks, done) { } return ret }, [address], function (result) { + console.log('verifyCallReturnValue', result) for (var k in checks) { browser.assert.equal(result.value[k], checks[k]) } diff --git a/test-browser/tests/generalTests.js b/test-browser/tests/generalTests.js index 046982e368..f0c17878ef 100644 --- a/test-browser/tests/generalTests.js +++ b/test-browser/tests/generalTests.js @@ -164,32 +164,30 @@ function checkDeployShouldSucceed (browser, address, callback) { function testSignature (browser, callback) { let hash, signature - browser.perform((client, done) => { - contractHelper.signMsg(browser, 'test message', (h, s) => { - hash = h - signature = s - browser.assert.ok(typeof hash.value === 'string', 'type of hash.value must be String') - browser.assert.ok(typeof signature.value === 'string', 'type of signature.value must be String') - contractHelper.addFile(browser, 'signMassage.sol', sources[6]['browser/signMassage.sol'], () => { - contractHelper.switchFile(browser, 'browser/signMassage.sol', () => { - contractHelper.selectContract(browser, 'ECVerify', () => { // deploy lib - contractHelper.createContract(browser, '', () => { - const instanceSelector = '.instance:nth-of-type(4)' - browser.waitForElementPresent(instanceSelector) - .click(instanceSelector + ' > div > button') - .getAttribute(instanceSelector, 'id', (result) => { - // skip 'instance' part of e.g. 'instance0x692a70d2e424a56d2c6c27aa97d1a86395877b3a' - const address = result.value.slice('instance'.length) - browser.clickFunction('ecrecovery - call', {types: 'bytes32 hash, bytes sig', values: `"${hash.value}","${signature.value}"`}).perform( - () => { - contractHelper.verifyCallReturnValue( - browser, - address, - ['0: address: 0xCA35b7d915458EF540aDe6068dFe2F44E8fa733c'], - () => { callback(null, browser) } - ) - }) - }) + contractHelper.signMsg(browser, 'test message', (h, s) => { + hash = h + signature = s + browser.assert.ok(typeof hash.value === 'string', 'type of hash.value must be String') + browser.assert.ok(typeof signature.value === 'string', 'type of signature.value must be String') + contractHelper.addFile(browser, 'signMassage.sol', sources[6]['browser/signMassage.sol'], () => { + contractHelper.switchFile(browser, 'browser/signMassage.sol', () => { + contractHelper.selectContract(browser, 'ECVerify', () => { // deploy lib + contractHelper.createContract(browser, '', () => { + const instanceSelector = '.instance:nth-of-type(4)' + browser.waitForElementPresent(instanceSelector) + .click(instanceSelector + ' > div > button') + .getAttribute(instanceSelector, 'id', (result) => { + // skip 'instance' part of e.g. 'instance0x692a70d2e424a56d2c6c27aa97d1a86395877b3a' + const address = result.value.slice('instance'.length) + browser.clickFunction('ecrecovery - call', {types: 'bytes32 hash, bytes sig', values: `"${hash.value}","${signature.value}"`}).perform( + () => { + contractHelper.verifyCallReturnValue( + browser, + address, + ['0: address: 0xCA35b7d915458EF540aDe6068dFe2F44E8fa733c'], + () => { callback(null, browser) } + ) + }) }) }) }) diff --git a/test-browser/tests/sauce.js b/test-browser/tests/sauce.js index add631aacc..5294a9d403 100644 --- a/test-browser/tests/sauce.js +++ b/test-browser/tests/sauce.js @@ -1,17 +1,14 @@ -const https = require('https') +// const https = require('https') module.exports = function sauce (callback) { + return callback() + /* const currentTest = this.client.currentTest const username = this.client.options.username const sessionId = this.client.capabilities['webdriver.remote.sessionid'] const accessKey = this.client.options.accessKey - if (!this.client.launch_url.match(/saucelabs/)) { - console.log('Not saucelabs ...') - return callback() - } - if (!username || !accessKey || !sessionId) { console.log(this.client) console.log('No username, accessKey or sessionId') @@ -59,4 +56,5 @@ module.exports = function sauce (callback) { console.log('Error', error) callback() } + */ } diff --git a/test-browser/tests/sharedFolderExplorer.js b/test-browser/tests/sharedFolderExplorer.js index eb822f04e2..ab63f66b39 100644 --- a/test-browser/tests/sharedFolderExplorer.js +++ b/test-browser/tests/sharedFolderExplorer.js @@ -59,24 +59,19 @@ function runTests (browser, testData) { browser.end() return } - if (browserName === 'chrome') { - console.log('do not run remixd test for ' + browserName + ': TODO to reenable later') - browser.end() - return - } if (browserName === 'firefox') { console.log('do not run remixd test for ' + browserName + ': TODO to reenable later') browser.end() return } browser - .waitForElementVisible('#icon-panel', 10000) + .waitForElementVisible('#icon-panel', 2000) .clickLaunchIcon('fileExplorers') - .click('.websocketconn') - .waitForElementVisible('#modal-footer-ok', 10000) + .clickLaunchIcon('pluginManager') + .click('#pluginManager article[id="remixPluginManagerListItem_remixd"] button') + .waitForElementVisible('#modal-footer-ok', 2000) .click('#modal-footer-ok') - .waitForElementVisible('[data-path="localhost"]', 100000) - .click('[data-path="localhost"]') + .clickLaunchIcon('fileExplorers') .waitForElementVisible('[data-path="localhost/folder1"]') .click('[data-path="localhost/folder1"]') .waitForElementVisible('[data-path="localhost/contract1.sol"]') @@ -142,7 +137,8 @@ function runTests (browser, testData) { .waitForElementNotPresent('[data-path="localhost/folder1/contract_' + browserName + '.sol"]') // check if renamed (old) file is not present .waitForElementNotPresent('[data-path="localhost/folder1/contract_' + browserName + '_toremove.sol"]') // check if removed (old) file is not present .click('[data-path="localhost/folder1/renamed_contract_' + browserName + '.sol"]') - .click('.websocketconn') + .clickLaunchIcon('pluginManager') + .click('#pluginManager article[id="remixPluginManagerListItem_remixd"] button') .end() }) }