Publish Vulpes Preview 15 sources for desktop, Android and Tundra
Share Gaia assets and adapters, keep private profiles and development documents local, and update both public READMEs.
This commit is contained in:
parent
93e3a48004
commit
b38dea0597
25901 changed files with 9982925 additions and 369 deletions
125
gaia/tests/jsmarionette/mocha/mocha-json-proxy/consumer.js
Executable file
125
gaia/tests/jsmarionette/mocha/mocha-json-proxy/consumer.js
Executable file
|
|
@ -0,0 +1,125 @@
|
|||
'use strict';
|
||||
var EventEmitter = require('events').EventEmitter;
|
||||
|
||||
var MESSAGE_PREFIX = 'mocha-proxy';
|
||||
|
||||
// runnable events which need a runnable wrapper
|
||||
var RUNNABLE_EVENTS = [
|
||||
'pending',
|
||||
'pass',
|
||||
'fail',
|
||||
'test',
|
||||
'test end',
|
||||
'suite',
|
||||
'suite end'
|
||||
];
|
||||
|
||||
function Runnable(event) {
|
||||
for (var key in event) {
|
||||
this[key] = event[key];
|
||||
}
|
||||
}
|
||||
|
||||
Runnable.prototype = {
|
||||
slow: function() {
|
||||
return this._slow;
|
||||
},
|
||||
|
||||
fullTitle: function() {
|
||||
var title = '';
|
||||
if (this.parent) {
|
||||
title = this.parent.fullTitle();
|
||||
if (title) {
|
||||
title += ' ';
|
||||
}
|
||||
}
|
||||
title += this.title;
|
||||
return title;
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* Consumer for a mocha runner process using the mocha-json-proxy reporter.
|
||||
*
|
||||
*
|
||||
* var consumer = new Consumer(
|
||||
* forkedMochaProcess // should use _mocha NOT mocha (which spawns another
|
||||
* process)
|
||||
* );
|
||||
*
|
||||
* // consumer is also an event emitter which emits standard mocha events.
|
||||
* consumer.on('start', function() {
|
||||
* });
|
||||
*
|
||||
* consumer.on('pass', function() {
|
||||
* });
|
||||
*
|
||||
* @param {ChildProcess} child to listen to messages on.
|
||||
*/
|
||||
function Consumer(child) {
|
||||
EventEmitter.call(this);
|
||||
|
||||
this._suiteStack = [];
|
||||
this._objects = {};
|
||||
|
||||
child.on('message', function(content) {
|
||||
if (Array.isArray(content) && content[0] === MESSAGE_PREFIX) {
|
||||
this.transformEvent(content[1]);
|
||||
}
|
||||
}.bind(this));
|
||||
}
|
||||
|
||||
Consumer.prototype = {
|
||||
__proto__: EventEmitter.prototype,
|
||||
|
||||
referenceObject: function(event, object) {
|
||||
// objects without the _id property don't need to be a single reference.
|
||||
if (!object || !object._id) {
|
||||
return object;
|
||||
}
|
||||
// find the original reference or create it.
|
||||
var ref = this._objects[object._id];
|
||||
|
||||
if (!ref) {
|
||||
// convert the object into an instanceof Runnable if its event is a suite
|
||||
// or test.
|
||||
if (RUNNABLE_EVENTS.indexOf(event) !== -1) {
|
||||
object = new Runnable(object);
|
||||
}
|
||||
// when no reference is found this is the correct object.
|
||||
ref = this._objects[object._id] = object;
|
||||
} else {
|
||||
// otherwise we need to update the reference
|
||||
Object.keys(object).forEach(function(key) {
|
||||
var value = object[key];
|
||||
ref[key] = value;
|
||||
});
|
||||
}
|
||||
|
||||
// Re-create the parent based on the referenced ID.
|
||||
if (ref._parentId) {
|
||||
ref.parent = this.referenceObject('suite', { _id: ref._parentId });
|
||||
delete ref._parentId;
|
||||
}
|
||||
|
||||
return ref;
|
||||
},
|
||||
|
||||
transformEvent: function(event) {
|
||||
var name = event[0];
|
||||
var runnable = event[1] = this.referenceObject(name, event[1]);
|
||||
|
||||
if (name === 'suite') {
|
||||
this._suiteStack.push(runnable);
|
||||
// add the root .suite
|
||||
if (!this.suite) {
|
||||
this.suite = runnable;
|
||||
}
|
||||
}
|
||||
|
||||
this.emit.apply(this, event);
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
module.exports = Consumer;
|
||||
Loading…
Reference in a new issue