File: lib/abstractClient.js
- // Copyright 2014, Yahoo! Inc.
- // Copyrights licensed under the Mit License. See the accompanying LICENSE file for terms.
-
- var Base = require('preceptor-core').Base;
- var utils = require('preceptor-core').utils;
- var ReportManager = require('preceptor-reporter');
- var _ = require('underscore');
- var Promise = require('promise');
-
- var defaultClient = require('./defaults/defaultClient');
-
- /**
- * @class AbstractClient
- * @extends Base
- *
- * @property {object} _options
- * @property {AbstractClientDecorator[]} decorators
- * @property {ReportManager} _reportManager
- * @property {EventReporter} _eventReporter
- */
- var AbstractClient = Base.extend(
-
- /**
- * Abstract client constructor
- *
- * @param {object[]} decorators
- * @param {object} decoratorPlugins
- * @param {object} options
- * @constructor
- */
- function (decorators, decoratorPlugins, options) {
- this.__super();
-
- this._reportManager = new ReportManager({ collect: false });
- this._eventReporter = this._reportManager.addReporter('Event');
- this._eventReporter.on('message', function (areaType, messageType, data) {
- // Make sure not to forward admin messages; this should stay in the client
- if (["admin"].indexOf(areaType) === -1) {
- this.emit('reportMessage', messageType, data);
- }
- }.bind(this));
-
- this._options = utils.deepExtend({}, [defaultClient, options || {}]);
- this.decorators = this._setupDecorators(this._eventReporter, decorators, decoratorPlugins);
-
- this.initialize();
- },
-
- {
- /**
- * Setup decorator plugins
- *
- * @method _setupDecorators
- * @param {EventReporter} eventReporter
- * @param {object[]} decorators
- * @param {object} decoratorPlugins
- * @return {AbstractClientDecorator[]}
- * @private
- */
- _setupDecorators: function (eventReporter, decorators, decoratorPlugins) {
-
- var decoratorList = [];
-
- _.each(decorators, function (currentDecorator) {
-
- var decoratorPlugin = decoratorPlugins[currentDecorator.type.toLowerCase()],
- DecoratorClass,
- decoratorInstance;
-
- if (!decoratorPlugin) {
- throw new Error('Unknown decorator: ' + currentDecorator.type);
- }
-
- DecoratorClass = require(decoratorPlugin);
- decoratorInstance = new DecoratorClass(eventReporter, currentDecorator);
- decoratorList.push(decoratorInstance);
-
- }, this);
-
- return decoratorList;
- },
-
-
- /**
- * Processes the begin of the testing environment
- *
- * @method processBefore
- * @return {Promise}
- */
- processBefore: function () {
-
- var promise = Promise.resolve();
-
- _.each(this.decorators, function (decorator) {
- promise = promise.then(function () {
- return decorator.processBefore();
- })
- }, this);
-
- return promise;
- },
-
- /**
- * Processes the end of the testing environment
- *
- * @method processAfter
- * @return {Promise}
- */
- processAfter: function () {
-
- var promise = Promise.resolve();
-
- _.each(this.decorators, function (decorator) {
- promise = promise.then(function () {
- return decorator.processAfter();
- })
- }, this);
-
- return promise;
- },
-
- /**
- * Processes the beginning of a test
- *
- * @method processBeforeTest
- * @return {Promise}
- */
- processBeforeTest: function () {
-
- var promise = Promise.resolve();
-
- _.each(this.decorators, function (decorator) {
- promise = promise.then(function () {
- return decorator.processBeforeTest();
- })
- }, this);
-
- return promise;
- },
-
- /**
- * Processes the ending of a test
- *
- * @method processAfterTest
- * @return {Promise}
- */
- processAfterTest: function () {
-
- var promise = Promise.resolve();
-
- _.each(this.decorators, function (decorator) {
- promise = promise.then(function () {
- return decorator.processAfterTest();
- })
- }, this);
-
- return promise;
- },
-
-
- /**
- * Gets the options
- *
- * @method getOptions
- * @return {object}
- */
- getOptions: function () {
- return this._options;
- },
-
- /**
- * Gets the decorator
- *
- * @method getDecorator
- * @return {AbstractClientDecorator[]}
- */
- getDecorator: function () {
- return this.decorators;
- },
-
-
- /**
- * Gets the report-manager
- *
- * @method getReportManager
- * @return {ReportManager}
- */
- getReportManager: function () {
- return this._reportManager;
- },
-
- /**
- * Gets the event-reporter
- *
- * @method getEventReporter
- * @return {EventReporter}
- */
- getEventReporter: function () {
- return this._eventReporter;
- },
-
-
- /**
- * Will be called when the client begins
- *
- * @method run
- * @return {Promise}
- */
- run: function () {
- throw new Error('Unimplemented method "run" in the client.');
- }
- },
-
- {
- /**
- * @property TYPE
- * @type {string}
- * @static
- */
- TYPE: 'AbstractClient'
- });
-
- module.exports = AbstractClient;
-
-