mirror of
https://github.com/openstf/stf
synced 2025-10-05 19:42:01 +02:00
First attempt at running shell commands with potentially streaming output. Still missing: multiple device support, command cancellation.
This commit is contained in:
parent
51ebf42dd3
commit
242f6f17de
5 changed files with 153 additions and 30 deletions
|
@ -9,6 +9,7 @@ var wire = require('../wire')
|
|||
var wireutil = require('../util/wireutil')(wire)
|
||||
var devutil = require('../util/devutil')
|
||||
var ChannelManager = require('../wire/channelmanager')
|
||||
var streamutil = require('../util/streamutil')
|
||||
|
||||
module.exports = function(options) {
|
||||
var log = logger.createLogger('device')
|
||||
|
@ -67,6 +68,56 @@ module.exports = function(options) {
|
|||
wireutil.makeDevicePropertiesMessage(options.serial, properties)])
|
||||
})
|
||||
break
|
||||
case wire.MessageType.SHELL_COMMAND:
|
||||
var message = wire.ShellCommandMessage.decode(wrapper.message)
|
||||
adb.shellAsync(options.serial, message.command)
|
||||
.then(function(stream) {
|
||||
var resolver = Promise.defer()
|
||||
, seq = 0
|
||||
|
||||
function dataListener(chunk) {
|
||||
push.send([message.channel,
|
||||
wireutil.makeDeviceDataMessage(
|
||||
options.serial
|
||||
, seq++
|
||||
, chunk
|
||||
)])
|
||||
}
|
||||
|
||||
function endListener() {
|
||||
push.send([message.channel,
|
||||
wireutil.makeDeviceDoneMessage(options.serial)])
|
||||
resolver.resolve()
|
||||
}
|
||||
|
||||
function errorListener(err) {
|
||||
log.error('Shell command "%s" failed due to "%s"'
|
||||
, message.command.join(' '), err.message)
|
||||
resolver.reject(err)
|
||||
push.send([message.channel,
|
||||
wireutil.makeDeviceFailMessage(
|
||||
options.serial
|
||||
, err.message
|
||||
)])
|
||||
}
|
||||
|
||||
stream.on('data', dataListener)
|
||||
stream.on('end', endListener)
|
||||
stream.on('error', errorListener)
|
||||
|
||||
return resolver.promise.finally(function() {
|
||||
stream.removeListener('data', dataListener)
|
||||
stream.removeListener('end', endListener)
|
||||
stream.removeListener('error', errorListener)
|
||||
})
|
||||
})
|
||||
.error(function(err) {
|
||||
log.error('Shell command "%s" failed due to "%s"'
|
||||
, message.command.join(' '), err.message)
|
||||
push.send([message.channel,
|
||||
wire.makeShellCommandFailMessage(options.serial, err.message)])
|
||||
})
|
||||
break
|
||||
}
|
||||
})
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue