提交 988dce8c 编写于 作者: Huan (李卓桓)'s avatar Huan (李卓桓)

more strict check for browser & driver

上级 0aaa07b4
......@@ -237,11 +237,23 @@ export class BrowserDriver {
const session = await driver.getSession()
if (!session) {
log.verbose('PuppetWebBrowserDriver', 'valid() found an invalid driver')
} else {
log.silly('PuppetWebBrowserDriver', 'valid() driver ok')
return false
}
let two
try {
two = await this.executeScript('return 1+1')
} catch (e) {
two = e
log.warn('BrowserDriver', 'valid() fail: %s', e.message)
}
if (two !== 2) {
return false
}
return !!session
log.silly('PuppetWebBrowserDriver', 'valid() driver ok')
return true
}
// public driver1(): WebDriver
......@@ -286,8 +298,8 @@ export class BrowserDriver {
// }
public close() { return this.driver.close() }
public executeAsyncScript() { return this.driver.executeAsyncScript.apply(this.driver, arguments) }
public executeScript() { return this.driver.executeScript.apply(this.driver, arguments) }
public executeAsyncScript(script: string|Function, ...args: any[]) { return this.driver.executeAsyncScript.apply(this.driver, arguments) }
public executeScript (script: string|Function, ...args: any[]) { return this.driver.executeScript.apply(this.driver, arguments) }
public get(url: string) { return this.driver.get(url) }
public getSession() { return this.driver.getSession() }
public manage() { return this.driver.manage() }
......
......@@ -133,10 +133,16 @@ export class Browser extends EventEmitter {
public async quit(): Promise<void> {
log.verbose('PuppetWebBrowser', 'quit()')
if (this.state.current() === 'close' && this.state.inprocess()) {
const e = new Error('quit() be called when state.current() is close with inprocess()?')
log.warn('PuppetWebBrowser', e.message)
throw e
if (this.state.current() === 'close') {
if (this.state.inprocess()) {
const e = new Error('quit() on a browser with state.current():`close` and inprocess():`true` ?')
log.warn('PuppetWebBrowser', e.message)
throw e
} else { // stable
const e = new Error('quit() on a already quit-ed browser')
log.warn('PuppetWebBrowser', e.message)
throw e
}
}
this.state.current('close', false)
......
......@@ -135,39 +135,37 @@ export class PuppetWeb extends Puppet {
try {
if (this.bridge) { // TODO use StateMonitor
await this.bridge.quit()
.catch(e => { // fail safe
log.warn('PuppetWeb', 'quit() bridge.quit() exception: %s', e.message)
})
log.verbose('PuppetWeb', 'quit() bridge.quit() this.bridge = null')
// this.bridge = null
} else { log.warn('PuppetWeb', 'quit() without a bridge') }
if (this.server) { // TODO use StateMonitor
await this.server.quit()
// this.server = null
log.verbose('PuppetWeb', 'quit() server.quit() this.server = null')
} else { log.verbose('PuppetWeb', 'quit() without a server') }
if (this.browser) { // TODO use StateMonitor
await this.browser.quit()
.catch(e => { // fail safe
log.warn('PuppetWeb', 'quit() browser.quit() exception: %s', e.message)
})
log.verbose('PuppetWeb', 'quit() server.quit() this.browser = null')
// this.browser = null
} else { log.warn('PuppetWeb', 'quit() without a browser') }
await this.bridge.quit()
.catch(e => { // fail safe
log.warn('PuppetWeb', 'quit() bridge.quit() exception: %s', e.message)
})
// log.verbose('PuppetWeb', 'quit() bridge.quit() this.bridge = null')
// this.bridge = null
await this.server.quit()
.catch(e => { // fail safe
log.warn('PuppetWeb', 'quit() server.quit() exception: %s', e.message)
})
// this.server = null
// log.verbose('PuppetWeb', 'quit() server.quit() this.server = null')
await this.browser.quit()
.catch(e => { // fail safe
log.warn('PuppetWeb', 'quit() browser.quit() exception: %s', e.message)
})
// log.verbose('PuppetWeb', 'quit() server.quit() this.browser = null')
// this.browser = null
this.state.current('dead')
log.silly('PuppetWeb', 'quit() done')
return
} catch (e) {
log.error('PuppetWeb', 'quit() exception: %s', e.message)
this.state.current('dead')
throw e
}
log.silly('PuppetWeb', 'quit() done')
this.state.current('dead')
}
public createBrowser() {
......
......@@ -14,7 +14,7 @@ import { EventEmitter } from 'events'
import {
Sayable
} from './config'
} from './config'
import { Contact } from './contact'
import { Message } from './message'
import { StateMonitor } from './state-monitor'
......
......@@ -6,6 +6,7 @@
*
*/
import { test } from 'ava'
import * as sinon from 'sinon'
/* tslint:disable:no-var-requires */
const retryPromise = require('retry-promise').default
......@@ -21,7 +22,7 @@ import {
const PROFILE = 'unit-test-session.wechaty.json'
test('Puppet Web watchdog timer', async t => {
test('timer', async t => {
const pw = new PuppetWeb({profile: PROFILE})
t.truthy(pw, 'should instantiate a PuppetWeb')
......@@ -31,7 +32,7 @@ test('Puppet Web watchdog timer', async t => {
Watchdog.onFeed.call(pw, { data: 'initing directly' })
t.pass('should ok with default food type')
const origLogLevel = log.level()
const savedLevel = log.level()
if (log.level() === 'info') {
log.level('silent')
t.pass('set log.level = silent to mute log when watchDog reset wechaty temporary')
......@@ -43,19 +44,20 @@ test('Puppet Web watchdog timer', async t => {
{
pw.removeListener('error', failOnUnexpectedErrorEvent)
let errorCounter = 0
pw.once('error', e => errorCounter++)
// let errorCounter = 0
const spy = sinon.spy()
pw.once('error', spy)
pw.emit('watchdog', {
data: 'active_for_timeout_1ms'
, timeout: 1
})
await new Promise(resolve => setTimeout(resolve, 10)) // wait untill reset
t.is(errorCounter, 1, 'should get event[error] after watchdog timeout')
await new Promise(resolve => setTimeout(resolve, 10)) // wait until reset
t.truthy(spy.calledOnce, 'should get event[error] after watchdog timeout')
pw.addListener('error', failOnUnexpectedErrorEvent)
}
// pw.once('error', e => t.fail('waitDing() triggered watchDogReset()'))
pw.once('error', e => t.fail('waitDing() triggered watchDogReset()'))
const EXPECTED_DING_DATA = 'dingdong'
pw.emit('watchdog', { data: 'feed to extend the dog life', timeout: 120000 })
......@@ -63,7 +65,7 @@ test('Puppet Web watchdog timer', async t => {
const dong = await waitDing(EXPECTED_DING_DATA)
t.is(dong, EXPECTED_DING_DATA, 'should get EXPECTED_DING_DATA from ding after watchdog reset, and restored log level')
log.level(origLogLevel)
log.level(savedLevel)
await pw.quit()
return
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册