Skip to content

Commit

Permalink
Merge pull request #457 from cosmos/25-reenable-tape
Browse files Browse the repository at this point in the history
Reenable tape e2e tests
  • Loading branch information
faboweb authored Feb 13, 2018
2 parents c2a8114 + abc4a7e commit c195849
Show file tree
Hide file tree
Showing 9 changed files with 371 additions and 244 deletions.
7 changes: 6 additions & 1 deletion app/src/main/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -121,7 +121,7 @@ function createWindow () {
} else {
startVueApp()
}
if (DEV || process.env.COSMOS_DEVTOOLS) {
if (DEV || JSON.parse(process.env.COSMOS_DEVTOOLS || 'false')) {
mainWindow.webContents.openDevTools()
}

Expand Down Expand Up @@ -150,6 +150,9 @@ function createWindow () {

function startProcess (name, args, env) {
let binPath
if (process.env.BINARY_PATH) {
binPath = process.env.BINARY_PATH
} else
if (DEV || TEST) {
// in dev mode or tests, use binaries installed in GOPATH
let GOPATH = process.env.GOPATH
Expand Down Expand Up @@ -302,11 +305,13 @@ if (!TEST) {
process.on('exit', shutdown)
process.on('uncaughtException', async function (err) {
logError('[Uncaught Exception]', err)
console.error('[Uncaught Exception]', err)
await shutdown()
process.exit(1)
})
process.on('unhandledRejection', async function (err) {
logError('[Unhandled Promise Rejection]', err)
console.error('[Unhandled Promise Rejection]', err)
await shutdown()
process.exit(1)
})
Expand Down
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@
"pack:renderer": "cross-env NODE_ENV=production webpack --colors --config webpack.renderer.config.js",
"test": "npm run lint && npm run test:unit",
"test:unit": "cross-env LOGGING=false MOCK=false jest --maxWorkers=2",
"test:e2e": "tape \"test/e2e/!(main)*.js\"",
"test:e2e": "tape \"test/e2e/*.js\"",
"test:exe": "node tasks/test-build.js",
"test:coverage": "http-server test/unit/coverage/lcov-report",
"vue:route": "node tasks/vue/route.js",
Expand Down
57 changes: 48 additions & 9 deletions test/e2e/common.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,25 +6,64 @@ function sleep (ms) {
}

module.exports = {
navigate (t, client, linkText, titleText = linkText) {
t.test(`navigate to "${linkText}"`, async function (t) {
await client.$(`a*=${linkText}`).click()
await client.waitUntilTextExists('.ni-page-header-title', titleText)
t.pass(`navigated to "${linkText}"`)
t.end()
})
async openMenu (client) {
if (await client.isExisting('.app-menu')) {
return
}
// close notifications as they overlay the menu button
while (await client.isExisting(`.ni-notification`)) {
await client.$(`.ni-notification`).click()
}
await client.$('#app-menu-button').click()
await client.waitForExist('.app-menu', 1000)
},
async navigate (client, linkText, titleText = linkText) {
await module.exports.openMenu(client)
// click link
await client.$(`a*=${linkText}`).click()
await client.waitUntilTextExists('.ni-page-header-title', titleText)
console.log(`navigated to "${linkText}"`)
},
newTempDir () {
return join(tmpdir(), Math.random().toString(36).slice(2))
},
sleep,
async waitForText (el, text, timeout = 5000) {
async waitForText (elGetterFn, text, timeout = 5000) {
let start = Date.now()
while (await el().getText() !== text) {
while (await elGetterFn().getText() !== text) {
if (Date.now() - start >= timeout) {
throw Error('Timed out waiting for text')
}
await sleep(100)
}
},
async login (client, account = 'testkey') {
console.log('logging into ' + account)
let accountsSelect = '#sign-in-name select'

await selectOption(client, accountsSelect, account)

await client.$('#sign-in-password').setValue('1234567890')
await client.$('.ni-session-footer button').click()
await client.waitForExist('#app-content', 5000)

// checking if user is logged in
await module.exports.openMenu(client)
let activeUser = await client.$('.ni-li-user .ni-li-title').getText()
if (account !== activeUser) {
throw new Error('Incorrect user logged in')
}
},
async logout (client) {
console.log('logging out')
await module.exports.openMenu(client)

await client.$('.ni-li-user').click()
await client.$('.material-icons=exit_to_app').$('..').click()
}
}

async function selectOption (client, selectSelector, text) {
await client.$(selectSelector).click()
await client.keys(text.split())
}
166 changes: 124 additions & 42 deletions test/e2e/launch.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,55 +4,75 @@ let { Application } = require('spectron')
let test = require('tape-promise/tape')
let electron = require('electron')
let { join } = require('path')
let { newTempDir } = require('./common.js')

// re-use app instance
let app

module.exports = async function launch (t) {
if (app) return app

let home = newTempDir()
console.error(`ui home: ${home}`)

app = new Application({
path: electron,
args: [
join(__dirname, '../../app/dist/main.js'),
'--disable-gpu',
'--no-sandbox'
],
startTimeout: 10000,
waitTimeout: 10000,
env: {
COSMOS_TEST: 'true',
COSMOS_HOME: home,
COSMOS_NETWORK: join(__dirname, 'gaia-1')
}
})
let { spawn } = require('child_process')
let { newTempDir, login } = require('./common.js')

await app.start()
let app, home, cliHome, started
let binary = process.env.BINARY_PATH

t.test('launch app', function (t) {
t.ok(app.isRunning(), 'app is running')
t.end()
})
module.exports = function launch (t) {
if (!started) {
started = new Promise(async (resolve, reject) => {
console.log('using binary', binary)

// TODO cleanup
home = newTempDir()
cliHome = join(newTempDir(), 'baseserver')
console.error(`ui home: ${home}`)
console.error(`node home: ${cliHome}`)

await startLocalNode()

app = new Application({
path: electron,
args: [
join(__dirname, '../../app/dist/main.js'),
'--disable-gpu',
'--no-sandbox'
],
startTimeout: 10000,
waitTimeout: 10000,
env: {
// COSMOS_UI_ONLY: 'true',
// COSMOS_TEST: 'true',
COSMOS_NODE: 'localhost',
NODE_ENV: 'production',
PREVIEW: 'true',
COSMOS_DEVTOOLS: 0, // open devtools will cause issues with spectron, you can open them later manually
COSMOS_HOME: home,
COSMOS_NETWORK: 'test/e2e/localtestnet'
}
})

t.test('wait for app to load', async function (t) {
await app.client.waitForExist('.header-item-logo', 5000)
.then(() => t.pass('app loaded'))
.catch(e => {
printAppLog(app)
t.fail()
throw e
})
t.end()
})
await startApp(app)
t.ok(app.isRunning(), 'app is running')

console.log('stopping app to test consecutive run')
await app.stop()

return app
await createAccount('testkey', 'chair govern physical divorce tape movie slam field gloom process pen universe allow pyramid private ability')
await createAccount('testreceiver', 'crash ten rug mosquito cart south allow pluck shine island broom deputy hungry photo drift absorb')
console.log('restored test accounts')

await startApp(app)
t.ok(app.isRunning(), 'app is running')

await login(app.client, 'testkey')

resolve({app, home})
})
}

return started
}

test.onFinish(() => app ? app.stop() : null)
test.onFinish(async () => {
console.log('DONE: cleaning up')
await app ? app.stop() : null
// tape doesn't finish properly because of open processes like gaia
process.exit(0)
})

function printAppLog (app) {
app.client.getMainProcessLogs().then(function (logs) {
Expand All @@ -68,3 +88,65 @@ function printAppLog (app) {
})
})
}

async function startApp (app) {
await app.start()

await app.client.waitForExist('.ni-session', 5000)
.catch(e => {
printAppLog(app)
throw e
})
}

async function startLocalNode () {
await new Promise((resolve, reject) => {
let child = spawn(binary, [
'node', 'init',
'D0718DDFF62D301626B428A182F830CBB0AD21FC',
'--home', cliHome,
'--chain-id' , 'localtestnet'
])
child.once('exit', (code) => {
if (code === 0) resolve()
reject()
})
})
console.log('inited local node')

await new Promise((resolve, reject) => {
// TODO cleanup
let localnodeProcess = spawn(binary, [
'node', 'start',
'--home', cliHome
])
localnodeProcess.stderr.pipe(process.stderr)
localnodeProcess.stdout.once('data', data => {
let msg = data.toString()
if (!msg.includes('Failed') && !msg.includes('Error')) {
resolve()
}
reject()
})
localnodeProcess.once('exit', (code) => {
reject()
})
})
console.log('started local node')
}

async function createAccount (name, seed) {
await new Promise((resolve, reject) => {
let child = spawn(binary, [
'client', 'keys', 'recover', name,
'--home', join(home, 'baseserver')
])
child.stdin.write('1234567890\n')
child.stdin.write(seed + '\n')
child.stderr.pipe(process.stdout)
child.once('exit', (code) => {
if (code === 0) resolve()
reject()
})
})
}
36 changes: 15 additions & 21 deletions test/e2e/localtestnet/config.toml
Original file line number Diff line number Diff line change
Expand Up @@ -2,33 +2,27 @@
# For more information, see https://github.com/toml-lang/toml

proxy_app = "tcp://127.0.0.1:46658"
moniker = "local"
moniker = "localhost"
fast_sync = true
db_backend = "memdb"
#log_level = "mempool:error,*:debug"

db_backend = "leveldb"
log_level = "state:info,*:error"
#log_level = "*:debug"


[rpc]
laddr = "tcp://127.0.0.1:46657"
laddr = "tcp://0.0.0.0:46657"

#[mempool]
#recheck = false
#broadcast = false
#wal_dir = ""

[consensus]
#max_block_size_txs = 10000
#create_empty_blocks = false
#timeout_propose = 10000
#skip_timeout_commit = true
#timeout_commit = 1
#wal_light = true
#block_part_size = 262144
create_empty_blocks_interval = 1
create_empty_blocks_interval = 60

[tx_index]
index_all_tags = true


[p2p]
#max_msg_packet_payload_size=65536
#send_rate=51200000 # 50 MB/s
#recv_rate=51200000 # 50 MB/s
laddr = "tcp://127.0.0.1:46656"
seeds = ""
max_num_peers = 300
pex = true
laddr = "tcp://0.0.0.0:46656"
seeds = "localhost:46656"
1 change: 1 addition & 0 deletions test/e2e/localtestnet/gaiaversion.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
v0.5.0
39 changes: 0 additions & 39 deletions test/e2e/main.js

This file was deleted.

Loading

0 comments on commit c195849

Please sign in to comment.