mirror of
https://github.com/appium/appium.git
synced 2026-02-14 05:50:00 -06:00
we use the selenium facility for getting log types and log entries. in this case, simply ask for logs of type 'logcat' and you'll get them
92 lines
2.2 KiB
JavaScript
92 lines
2.2 KiB
JavaScript
"use strict";
|
|
|
|
var spawn = require('win-spawn')
|
|
, through = require('through')
|
|
, _ = require('underscore')
|
|
, logger = require('../logger').get('appium');
|
|
|
|
var Logcat = function(opts) {
|
|
this.adbCmd = opts.adbCmd;
|
|
this.debug = opts.debug;
|
|
this.debugTrace = opts.debugTrace;
|
|
this.proc = null;
|
|
this.onLogcatStart = null;
|
|
this.logcatStarted = false;
|
|
this.calledBack = false;
|
|
this.logs = [];
|
|
};
|
|
|
|
Logcat.prototype.startCapture = function(cb) {
|
|
this.onLogcatStart = cb;
|
|
logger.info("Starting logcat capture");
|
|
this.proc = spawn(this.adbCmd, ['logcat']);
|
|
this.proc.stdout.setEncoding('utf8');
|
|
this.proc.stderr.setEncoding('utf8');
|
|
this.proc.on('error', function(err) {
|
|
logger.error('Logcat capture failed: ' + err.message);
|
|
if (!this.calledBack) {
|
|
this.calledBack = true;
|
|
cb(err);
|
|
}
|
|
}.bind(this));
|
|
this.proc.stdout.pipe(through(this.onStdout.bind(this)));
|
|
this.proc.stderr.pipe(through(this.onStderr.bind(this)));
|
|
};
|
|
|
|
Logcat.prototype.stopCapture = function() {
|
|
logger.info("Stopping logcat capture");
|
|
this.proc.kill();
|
|
this.proc = null;
|
|
};
|
|
|
|
Logcat.prototype.onStdout = function(data) {
|
|
this.onOutput(data, '');
|
|
};
|
|
|
|
Logcat.prototype.onStderr = function(data) {
|
|
if (/execvp\(\)/.test(data)) {
|
|
logger.error('Logcat process failed to start');
|
|
if (!this.calledBack) {
|
|
this.calledBack = true;
|
|
this.onLogcatStart(new Error("Logcat process failed to start"));
|
|
return;
|
|
}
|
|
}
|
|
this.onOutput(data, ' STDERR');
|
|
};
|
|
|
|
Logcat.prototype.onOutput = function(data, prefix) {
|
|
if (!this.logcatStarted) {
|
|
this.logcatStarted = true;
|
|
if (!this.calledBack) {
|
|
this.calledBack = true;
|
|
this.onLogcatStart();
|
|
}
|
|
}
|
|
data = data.trim();
|
|
data = data.replace(/\r\n/g, "\n");
|
|
var logs = data.split("\n");
|
|
_.each(logs, function(log) {
|
|
log = log.trim();
|
|
if (log) {
|
|
this.logs.push({
|
|
timestamp: Date.now()
|
|
, level: 'ALL'
|
|
, message: log
|
|
});
|
|
var isTrace = /W\/Trace/.test(data);
|
|
if (this.debug && (!isTrace || this.debugTrace)) {
|
|
logger.debug('[LOGCAT' + prefix + '] ' + log);
|
|
}
|
|
}
|
|
}.bind(this));
|
|
};
|
|
|
|
Logcat.prototype.getLogs = function() {
|
|
return this.logs;
|
|
};
|
|
|
|
module.exports = function(opts) {
|
|
return new Logcat(opts);
|
|
};
|