optimizely-server-sdk
Version:
Node SDK for Optimizely X Full Stack
510 lines (475 loc) • 18.9 kB
JavaScript
/**
* Copyright 2016, Optimizely
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
var bluebird = require('bluebird');
var chai = require('chai');
var assert = chai.assert;
var math = require('mathjs');
var Optimizely = require('../index');
module.exports = {
/**
* Instantiates the optimizely object with JSON schema validation and returns the time it took
* @param {Object} datafile
* @return {Number} ms to instantiate
*/
measureInstantiation: function(datafile) {
var start = module.exports.getTimestamp();
var optlyInstance = Optimizely.createInstance({
datafile: datafile,
eventDispatcher: {dispatchEvent: function() { return bluebird.resolve(null); }},
});
var end = module.exports.getTimestamp();
var time = end - start;
assert.isNotNull(optlyInstance);
return time;
},
/**
* Instantiates the optimizely object with logger and returns the time it took
* @param {Object} datafile
* @return {Number} ms to instantiate
*/
measureInstantiationWithLogger: function(datafile) {
var start = module.exports.getTimestamp();
var optlyInstance = Optimizely.createInstance({
datafile: datafile,
eventDispatcher: {dispatchEvent: function() { return bluebird.resolve(null); }},
logger: {log: function() {}},
});
var end = module.exports.getTimestamp();
var time = end - start;
assert.isNotNull(optlyInstance);
return time;
},
/**
* Instantiates the optimizely object with error handler and returns the time it took
* @param {Object} datafile
* @return {Number} ms to instantiate
*/
measureInstantiationWithErrorHandler: function(datafile) {
var start = module.exports.getTimestamp();
var optlyInstance = Optimizely.createInstance({
datafile: datafile,
eventDispatcher: {dispatchEvent: function() { return bluebird.resolve(null); }},
errorHandler: {handleError: function() {}},
});
var end = module.exports.getTimestamp();
var time = end - start;
assert.isNotNull(optlyInstance);
return time;
},
/**
* Instantiates the optimizely object with logger & error handler and returns the time it took
* @param {Object} datafile
* @return {Number} ms to instantiate
*/
measureInstantiationWithLoggerAndErrorHandler: function(datafile) {
var start = module.exports.getTimestamp();
var optlyInstance = Optimizely.createInstance({
datafile: datafile,
eventDispatcher: {dispatchEvent: function() { return bluebird.resolve(null); }},
logger: {log: function() {}},
errorHandler: {handleError: function() {}},
});
var end = module.exports.getTimestamp();
var time = end - start;
assert.isNotNull(optlyInstance);
return time;
},
/**
* Instantiates the optimizely object without JSON schema validation and returns the time it took
* @param {Object} datafile
* @return {Number} ms to instantiate
*/
measureInstantiationWithoutJSONValidation: function(datafile) {
var start = module.exports.getTimestamp();
var optlyInstance = Optimizely.createInstance({
datafile: datafile,
skipJSONValidation: true,
eventDispatcher: {dispatchEvent: function() { return bluebird.resolve(null); }},
});
var end = module.exports.getTimestamp();
var time = end - start;
assert.isNotNull(optlyInstance);
return time;
},
/**
* Instantiates the optimizely object without JSON schema validation & with logger and returns the time it took
* @param {Object} datafile
* @return {Number} ms to instantiate
*/
measureInstantiationWithoutJSONValidationAndWithLogger: function(datafile) {
var start = module.exports.getTimestamp();
var optlyInstance = Optimizely.createInstance({
datafile: datafile,
skipJSONValidation: true,
eventDispatcher: {dispatchEvent: function() { return bluebird.resolve(null); }},
logger: {log: function() {}},
});
var end = module.exports.getTimestamp();
var time = end - start;
assert.isNotNull(optlyInstance);
return time;
},
/**
* Instantiates the optimizely object without JSON schema validation & with error handler and returns the time it took
* @param {Object} datafile
* @return {Number} ms to instantiate
*/
measureInstantiationWithoutJSONValidationAndWithErrorHandler: function(datafile) {
var start = module.exports.getTimestamp();
var optlyInstance = Optimizely.createInstance({
datafile: datafile,
skipJSONValidation: true,
eventDispatcher: {dispatchEvent: function() { return bluebird.resolve(null); }},
errorHandler: {handleError: function() {}},
});
var end = module.exports.getTimestamp();
var time = end - start;
assert.isNotNull(optlyInstance);
return time;
},
/**
* Instantiates the optimizely object without JSON schema validation & with logger & error handler and returns the time it took
* @param {Object} datafile
* @return {Number} ms to instantiate
*/
measureInstantiationWithoutJSONValidationAndWithLoggerAndErrorHandler: function(datafile) {
var start = module.exports.getTimestamp();
var optlyInstance = Optimizely.createInstance({
datafile: datafile,
skipJSONValidation: true,
eventDispatcher: {dispatchEvent: function() { return bluebird.resolve(null); }},
logger: {log: function() {}},
errorHandler: {handleError: function() {}},
});
var end = module.exports.getTimestamp();
var time = end - start;
assert.isNotNull(optlyInstance);
return time;
},
/**
* Calls the activate method on the Optimizely object and measures how long it takes
* @param {Object} datafile
* @param {string} userId
* @return {Number}
*/
measureActivate: function(datafile, userId) {
var optlyInstance = module.exports.createOptimizelyInstance(datafile);
var start = module.exports.getTimestamp();
var variationKey = optlyInstance.activate('testExperiment2', userId);
var end = module.exports.getTimestamp();
var time = end - start;
assert.strictEqual(variationKey, 'control');
return time;
},
/**
* Calls the activate method on the Optimizely object with attributes and measures how long it takes
* @param {Object} datafile
* @param {string} userId
* @return {Number}
*/
measureActivateWithAttributes: function(datafile, userId) {
var optlyInstance = module.exports.createOptimizelyInstance(datafile);
var start = module.exports.getTimestamp();
var variationKey = optlyInstance.activate('testExperimentWithFirefoxAudience', userId, {'browser_type': 'firefox'});
var end = module.exports.getTimestamp();
var time = end - start;
assert.strictEqual(variationKey, 'variation');
return time;
},
/**
* Calls the activate method on the Optimizely object with a forced variation and measures how long it takes
* @param {Object} datafile
* @param {string} userId
* @return {Number}
*/
measureActivateWithForcedVariation: function(datafile, userId) {
var optlyInstance = module.exports.createOptimizelyInstance(datafile);
var start = module.exports.getTimestamp();
var variationKey = optlyInstance.activate('testExperiment2', userId);
var end = module.exports.getTimestamp();
var time = end - start;
assert.strictEqual(variationKey, 'variation');
return time;
},
/**
* Calls the activate method on the Optimizely object with a mutually exclusive grouped experiment and measures how long it takes
* @param {Object} datafile
* @param {string} userId
* @return {Number}
*/
measureActivateWithGroupedExperiment: function(datafile, userId) {
var optlyInstance = module.exports.createOptimizelyInstance(datafile);
var start = module.exports.getTimestamp();
var variationKey = optlyInstance.activate('mutex_exp2', userId);
var end = module.exports.getTimestamp();
var time = end - start;
assert.strictEqual(variationKey, 'b');
return time;
},
/**
* Calls the activate method on the Optimizely object with a mutually exclusive grouped experiment & attributes and measures how long it takes
* @param {Object} datafile
* @param {string} userId
* @return {Number}
*/
measureActivateWithGroupedExperimentAndAttributes: function(datafile, userId) {
var optlyInstance = module.exports.createOptimizelyInstance(datafile);
var start = module.exports.getTimestamp();
var variationKey = optlyInstance.activate('mutex_exp1', userId, {'browser_type': 'chrome'});
var end = module.exports.getTimestamp();
var time = end - start;
assert.strictEqual(variationKey, 'a');
return time;
},
/**
* Calls the get variation method on the Optimizely object and measures how long it takes
* @param {Object} datafile
* @param {string} userId
* @return {Number} ms to execute
*/
measureGetVariation: function(datafile, userId) {
var optlyInstance = module.exports.createOptimizelyInstance(datafile);
var start = module.exports.getTimestamp();
var variationKey = optlyInstance.getVariation('testExperiment2', userId);
var end = module.exports.getTimestamp();
var time = end - start;
assert.strictEqual(variationKey, 'control');
return time;
},
/**
* Calls the get variation method on the Optimizely object with attributes and measures how long it takes
* @param {Object} datafile
* @param {string} userId
* @return {Number} ms to execute
*/
measureGetVariationWithAttributes: function(datafile, userId) {
var optlyInstance = module.exports.createOptimizelyInstance(datafile);
var start = module.exports.getTimestamp();
var variationKey = optlyInstance.getVariation('testExperimentWithFirefoxAudience', userId, {'browser_type': 'firefox'});
var end = module.exports.getTimestamp();
var time = end - start;
assert.strictEqual(variationKey, 'variation');
return time;
},
/**
* Calls the get variation method on the Optimizely object with a forced variation and measures how long it takes
* @param {Object} datafile
* @param {string} userId
* @return {Number} ms to execute
*/
measureGetVariationWithForcedVariation: function(datafile, userId) {
var optlyInstance = module.exports.createOptimizelyInstance(datafile);
var start = module.exports.getTimestamp();
var variationKey = optlyInstance.getVariation('testExperiment2', userId);
var end = module.exports.getTimestamp();
var time = end - start;
assert.strictEqual(variationKey, 'variation');
return time;
},
/**
* Calls the get variation method on the Optimizely object with a mutually exclusive grouped experiment and measures how long it takes
* @param {Object} datafile
* @param {string} userId
* @return {Number} ms to execute
*/
measureGetVariationWithGroupedExperiment: function(datafile, userId) {
var optlyInstance = module.exports.createOptimizelyInstance(datafile);
var start = module.exports.getTimestamp();
var variationKey = optlyInstance.getVariation('mutex_exp2', userId);
var end = module.exports.getTimestamp();
var time = end - start;
assert.strictEqual(variationKey, 'b');
return time;
},
/**
* Calls the get variation method on the Optimizely object with a mutually exclusive grouped experiment & attributes and measures how long it takes
* @param {Object} datafile
* @param {string} userId
* @return {Number} ms to execute
*/
measureGetVariationWithGroupedExperimentAndAttributes: function(datafile, userId) {
var optlyInstance = module.exports.createOptimizelyInstance(datafile);
var start = module.exports.getTimestamp();
var variationKey = optlyInstance.getVariation('mutex_exp1', userId, {'browser_type': 'chrome'});
var end = module.exports.getTimestamp();
var time = end - start;
assert.strictEqual(variationKey, 'a');
return time;
},
/**
* Calls the track method on the Optimizely object and measures how long it takes
* @param {Object} datafile
* @param {string} userId
* @return {Number} ms to execute
*/
measureTrack: function(datafile, userId) {
var optlyInstance = module.exports.createOptimizelyInstance(datafile);
var start = module.exports.getTimestamp();
optlyInstance.track('testEvent', userId);
var end = module.exports.getTimestamp();
var time = end - start;
return time;
},
/**
* Calls the track method on the Optimizely object with attributes and measures how long it takes
* @param {Object} datafile
* @param {string} userId
* @return {Number} ms to execute
*/
measureTrackWithAttributes: function(datafile, userId) {
var optlyInstance = module.exports.createOptimizelyInstance(datafile);
var start = module.exports.getTimestamp();
optlyInstance.track('testEventWithAudiences', userId, {'browser_type': 'firefox'});
var end = module.exports.getTimestamp();
var time = end - start;
return time;
},
/**
* Calls the track method on the Optimizely object with revenue and measures how long it takes
* @param {Object} datafile
* @param {string} userId
* @return {Number} ms to execute
*/
measureTrackWithRevenue: function(datafile, userId) {
var optlyInstance = module.exports.createOptimizelyInstance(datafile);
var start = module.exports.getTimestamp();
optlyInstance.track('testEvent', userId, null, 666);
var end = module.exports.getTimestamp();
var time = end - start;
return time;
},
/**
* Calls the track method on the Optimizely object with attributes & revenue and measures how long it takes
* @param {Object} datafile
* @param {string} userId
* @return {Number} ms to execute
*/
measureTrackWithAttributesAndRevenue: function(datafile, userId) {
var optlyInstance = module.exports.createOptimizelyInstance(datafile);
var start = module.exports.getTimestamp();
optlyInstance.track('testEventWithAudiences', userId, {'browser_type': 'firefox'}, 666);
var end = module.exports.getTimestamp();
var time = end - start;
return time;
},
/**
* Calls the track method on the Optimizely object with a mutually exclusive grouped experiment and measures how long it takes
* @param {Object} datafile
* @param {string} userId
* @return {Number} ms to execute
*/
measureTrackWithGroupedExperiment: function(datafile, userId) {
var optlyInstance = module.exports.createOptimizelyInstance(datafile);
var start = module.exports.getTimestamp();
optlyInstance.track('testEventWithMultipleGroupedExperiments', userId);
var end = module.exports.getTimestamp();
var time = end - start;
return time;
},
/**
* Calls the track method on the Optimizely object with a mutually exclusive group & attributes and measures how long it takes
* @param {Object} datafile
* @param {string} userId
* @return {Number} ms to execute
*/
measureTrackWithGroupedExperimentAndAttributes: function(datafile, userId) {
var optlyInstance = module.exports.createOptimizelyInstance(datafile);
var start = module.exports.getTimestamp();
optlyInstance.track('testEventWithMultipleExperiments', userId, {'browser_type': 'chrome'});
var end = module.exports.getTimestamp();
var time = end - start;
return time;
},
/**
* Calls the track method on the Optimizely object with mutually exclusive group & revenue and measures how long it takes
* @param {Object} datafile
* @param {string} userId
* @return {Number} ms to execute
*/
measureTrackWithGroupedExperimentAndRevenue: function(datafile, userId) {
var optlyInstance = module.exports.createOptimizelyInstance(datafile);
var start = module.exports.getTimestamp();
optlyInstance.track('testEventWithMultipleGroupedExperiments', userId, null, 666);
var end = module.exports.getTimestamp();
var time = end - start;
return time;
},
/**
* Calls the track method on the Optimizely object with mutually exclusive group, attributes, & revenue and measures how long it takes
* @param {Object} datafile
* @param {string} userId
* @return {Number} ms to execute
*/
measureTrackWithGroupedExperimentAndAttributesAndRevenue: function(datafile, userId) {
var optlyInstance = module.exports.createOptimizelyInstance(datafile);
var start = module.exports.getTimestamp();
optlyInstance.track('testEventWithMultipleExperiments', userId, {'browser_type': 'chrome'}, 666);
var end = module.exports.getTimestamp();
var time = end - start;
return time;
},
/**
* Creates an Optimizely instance for all API method profiling
* @param {Object} datafile
* @return {Object} Optimizely instance
*/
createOptimizelyInstance: function(datafile) {
return Optimizely.createInstance({
datafile: datafile,
eventDispatcher: {dispatchEvent: function() { return bluebird.resolve(null); }},
logger: {log: function() {}},
errorHandler: {handleError: function() {}},
skipJSONValidation: true,
});
},
/**
* Returns Date.now(), how fun is that?
* @return {number} time
*/
getTimestamp: function() {
return Date.now();
},
/**
* Finds and logs medians, asserts if medians hit SLAs
* @param times
* @param slaTime
* @param numOfExperiments
*/
validateMedian: function(times, slaTime, numOfExperiments) {
var median = math.median(times);
console.log('Median time for ' + numOfExperiments + ' experiments is: ' + median);
assert.isBelow(median, slaTime);
},
/**
* Finds and logs averages, asserts if averages hit SLAs
* @param times
* @param slaTime
* @param numOfExperiments
*/
validateAverage: function(times, slaTime, numOfExperiments) {
var average = math.mean(times);
console.log('80% average time for ' + numOfExperiments + ' experiments is: ' + average);
assert.isBelow(average, slaTime);
},
/**
* Removes max and min times of 10-iteration sets for finding 80% average
* @param times
*/
removeMaxAndMin: function(times) {
times.splice(times.indexOf(Math.max.apply(null, times)), 1);
times.splice(times.indexOf(Math.min.apply(null, times)), 1);
},
};