From 1f1e47c67631110563751d6f6e63ae85b19da6da Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89tienne=20T=C3=A9treault-Pinard?= Date: Mon, 9 Jul 2018 12:43:28 -0400 Subject: [PATCH 1/8] undo 'typeofs' compress for min bundles that include mapbox-gl ... and run full compress otherwise. --- tasks/util/browserify_wrapper.js | 25 +++++++++++++++++++++---- tasks/util/constants.js | 13 ------------- tasks/util/wrap_locale.js | 15 ++++++++++++--- 3 files changed, 33 insertions(+), 20 deletions(-) diff --git a/tasks/util/browserify_wrapper.js b/tasks/util/browserify_wrapper.js index 6a69c5cf42c..3ed2a7eb0a6 100644 --- a/tasks/util/browserify_wrapper.js +++ b/tasks/util/browserify_wrapper.js @@ -4,7 +4,6 @@ var path = require('path'); var browserify = require('browserify'); var minify = require('minify-stream'); -var constants = require('./constants'); var compressAttributes = require('./compress_attributes'); var strictD3 = require('./strict_d3'); @@ -45,7 +44,7 @@ module.exports = function _bundle(pathToIndex, pathToBundle, opts, cb) { } var b = browserify(pathToIndex, browserifyOpts); - var pending = opts.pathToMinBundle ? 2 : 1; + var pending = pathToMinBundle ? 2 : 1; function done() { if(cb && --pending === 0) cb(null); @@ -58,9 +57,27 @@ module.exports = function _bundle(pathToIndex, pathToBundle, opts, cb) { } }); - if(opts.pathToMinBundle) { + if(pathToMinBundle) { + var uglifyOptions = { + ecma: 5, + mangle: true, + compress: true, + output: { + beautify: false, + ascii_only: true + }, + sourceMap: false + }; + + // need this to make mapbox-gl work in minified bundles + // see https://github.com/plotly/plotly.js/issues/2787 + var fname = path.basename(pathToMinBundle); + if(fname === 'plotly.min.js' || fname === 'plotly-mapbox.min.js') { + uglifyOptions.compress = {typeofs: false}; + } + bundleStream - .pipe(minify(constants.uglifyOptions)) + .pipe(minify(uglifyOptions)) .pipe(fs.createWriteStream(pathToMinBundle)) .on('finish', function() { logger(pathToMinBundle); diff --git a/tasks/util/constants.js b/tasks/util/constants.js index e7c97906bb4..c7bb2592a3f 100644 --- a/tasks/util/constants.js +++ b/tasks/util/constants.js @@ -84,19 +84,6 @@ module.exports = { testContainerUrl: 'http://localhost:9010/', testContainerHome: '/var/www/streambed/image_server/plotly.js', - uglifyOptions: { - mangle: true, - // the compress flag break mapbox-gl, - // TODO find a way to only skip compression on mapbox-gl files - compress: false, - output: { - beautify: false, - ascii_only: true - }, - - sourceMap: false - }, - licenseDist: [ '/**', '* plotly.js v' + pkg.version, diff --git a/tasks/util/wrap_locale.js b/tasks/util/wrap_locale.js index cfd86612fc7..27cea09c3c9 100644 --- a/tasks/util/wrap_locale.js +++ b/tasks/util/wrap_locale.js @@ -4,8 +4,6 @@ var path = require('path'); var minify = require('minify-stream'); var intoStream = require('into-stream'); -var constants = require('./constants'); - var prefix = 'Plotly.register('; var suffix = ');'; @@ -25,8 +23,19 @@ module.exports = function wrap_locale(pathToInput, pathToOutput) { var rawOut = prefix + data.substr(moduleStart, moduleEnd - moduleStart) + suffix; + var uglifyOptions = { + ecma: 5, + mangle: true, + compress: true, + output: { + beautify: false, + ascii_only: true + }, + sourceMap: false + }; + intoStream(rawOut) - .pipe(minify(constants.uglifyOptions)) + .pipe(minify(uglifyOptions)) .pipe(fs.createWriteStream(pathToOutput)) .on('finish', function() { logger(pathToOutput); From 7171bc4294ef7a4884e53e5f2c803134ca82b4bf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89tienne=20T=C3=A9treault-Pinard?= Date: Mon, 9 Jul 2018 12:43:57 -0400 Subject: [PATCH 2/8] add minified bundle test --- .../bundle_tests/minified_bundle_test.js | 32 +++++++++++++++++++ test/jasmine/karma.conf.js | 6 ++++ 2 files changed, 38 insertions(+) create mode 100644 test/jasmine/bundle_tests/minified_bundle_test.js diff --git a/test/jasmine/bundle_tests/minified_bundle_test.js b/test/jasmine/bundle_tests/minified_bundle_test.js new file mode 100644 index 00000000000..dc2ce377f4b --- /dev/null +++ b/test/jasmine/bundle_tests/minified_bundle_test.js @@ -0,0 +1,32 @@ +/* global Plotly:false */ + +describe('Test plotly.min.js', function() { + 'use strict'; + + // Note: this test doesn't have access to custom_matchers.js + // so you can only use standard jasmine matchers here. + + it('should expose Plotly global', function() { + expect(window.Plotly).toBeDefined(); + }); + + it('should be able to plot a mapbox plot', function(done) { + var gd = document.createElement('div'); + document.body.appendChild(gd); + + Plotly.plot(gd, [{ + type: 'scattermapbox', + lon: [10, 20, 30], + lat: [10, 30, 20] + }], {}, { + mapboxAccessToken: 'pk.eyJ1IjoiZXRwaW5hcmQiLCJhIjoiY2luMHIzdHE0MGFxNXVubTRxczZ2YmUxaCJ9.hwWZful0U2CQxit4ItNsiQ' + }) + .catch(function() { + fail('mapbox plot failed'); + }) + .then(function() { + document.body.removeChild(gd); + done(); + }); + }); +}); diff --git a/test/jasmine/karma.conf.js b/test/jasmine/karma.conf.js index 468eb11b498..5cb826563ae 100644 --- a/test/jasmine/karma.conf.js +++ b/test/jasmine/karma.conf.js @@ -255,6 +255,12 @@ if(isFullSuite) { ]; delete func.defaultConfig.preprocessors[pathToCustomMatchers]; break; + case 'minified_bundle': + // browserified custom_matchers doesn't work with this route + // so clear them out of the files and preprocessors + func.defaultConfig.files = [constants.pathToPlotlyDistMin]; + delete func.defaultConfig.preprocessors[pathToCustomMatchers]; + break; case 'ie9': // load ie9_mock.js before plotly.js+test bundle // to catch reference errors that could occur From 2a3afe7ebd607ad01e050890ef7d9e2e0a907aa7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89tienne=20T=C3=A9treault-Pinard?= Date: Mon, 9 Jul 2018 16:54:53 -0400 Subject: [PATCH 3/8] turn off 'typeof' compress options for all minify steps - for consistency and maintainability, this does lead to a few extra bytes though. --- tasks/util/browserify_wrapper.js | 21 ++------------------- tasks/util/constants.js | 20 ++++++++++++++++++++ tasks/util/wrap_locale.js | 15 +++------------ 3 files changed, 25 insertions(+), 31 deletions(-) diff --git a/tasks/util/browserify_wrapper.js b/tasks/util/browserify_wrapper.js index 3ed2a7eb0a6..79ede49b94c 100644 --- a/tasks/util/browserify_wrapper.js +++ b/tasks/util/browserify_wrapper.js @@ -4,6 +4,7 @@ var path = require('path'); var browserify = require('browserify'); var minify = require('minify-stream'); +var constants = require('./constants'); var compressAttributes = require('./compress_attributes'); var strictD3 = require('./strict_d3'); @@ -58,26 +59,8 @@ module.exports = function _bundle(pathToIndex, pathToBundle, opts, cb) { }); if(pathToMinBundle) { - var uglifyOptions = { - ecma: 5, - mangle: true, - compress: true, - output: { - beautify: false, - ascii_only: true - }, - sourceMap: false - }; - - // need this to make mapbox-gl work in minified bundles - // see https://github.com/plotly/plotly.js/issues/2787 - var fname = path.basename(pathToMinBundle); - if(fname === 'plotly.min.js' || fname === 'plotly-mapbox.min.js') { - uglifyOptions.compress = {typeofs: false}; - } - bundleStream - .pipe(minify(uglifyOptions)) + .pipe(minify(constants.uglifyOptions)) .pipe(fs.createWriteStream(pathToMinBundle)) .on('finish', function() { logger(pathToMinBundle); diff --git a/tasks/util/constants.js b/tasks/util/constants.js index c7bb2592a3f..265e4edb132 100644 --- a/tasks/util/constants.js +++ b/tasks/util/constants.js @@ -84,6 +84,26 @@ module.exports = { testContainerUrl: 'http://localhost:9010/', testContainerHome: '/var/www/streambed/image_server/plotly.js', + uglifyOptions: { + ecma: 5, + mangle: true, + compress: { + // see full list of compress option + // https://github.com/fabiosantoscode/terser#compress-options + // + // need to turn off 'typeofs' to make mapbox-gl work in + // minified bundles, for more info see: + // https://github.com/plotly/plotly.js/issues/2787 + typeofs: false + }, + output: { + beautify: false, + ascii_only: true + }, + + sourceMap: false + }, + licenseDist: [ '/**', '* plotly.js v' + pkg.version, diff --git a/tasks/util/wrap_locale.js b/tasks/util/wrap_locale.js index 27cea09c3c9..cfd86612fc7 100644 --- a/tasks/util/wrap_locale.js +++ b/tasks/util/wrap_locale.js @@ -4,6 +4,8 @@ var path = require('path'); var minify = require('minify-stream'); var intoStream = require('into-stream'); +var constants = require('./constants'); + var prefix = 'Plotly.register('; var suffix = ');'; @@ -23,19 +25,8 @@ module.exports = function wrap_locale(pathToInput, pathToOutput) { var rawOut = prefix + data.substr(moduleStart, moduleEnd - moduleStart) + suffix; - var uglifyOptions = { - ecma: 5, - mangle: true, - compress: true, - output: { - beautify: false, - ascii_only: true - }, - sourceMap: false - }; - intoStream(rawOut) - .pipe(minify(uglifyOptions)) + .pipe(minify(constants.uglifyOptions)) .pipe(fs.createWriteStream(pathToOutput)) .on('finish', function() { logger(pathToOutput); From dd8bf6caa9d0b49a029fb6fa191db8b150712fd3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89tienne=20T=C3=A9treault-Pinard?= Date: Mon, 9 Jul 2018 16:55:26 -0400 Subject: [PATCH 4/8] extract all mock lists from plot_api suites --- test/jasmine/assets/mock_lists.js | 69 +++++++++++++++++++++++++++ test/jasmine/tests/plot_api_test.js | 73 ++++------------------------- 2 files changed, 78 insertions(+), 64 deletions(-) create mode 100644 test/jasmine/assets/mock_lists.js diff --git a/test/jasmine/assets/mock_lists.js b/test/jasmine/assets/mock_lists.js new file mode 100644 index 00000000000..8f7f3efc505 --- /dev/null +++ b/test/jasmine/assets/mock_lists.js @@ -0,0 +1,69 @@ +// list of mocks that should include *all* plotly.js trace modules + +var svgMockList = [ + ['1', require('@mocks/1.json')], + ['4', require('@mocks/4.json')], + ['5', require('@mocks/5.json')], + ['10', require('@mocks/10.json')], + ['11', require('@mocks/11.json')], + ['17', require('@mocks/17.json')], + ['21', require('@mocks/21.json')], + ['22', require('@mocks/22.json')], + ['airfoil', require('@mocks/airfoil.json')], + ['annotations-autorange', require('@mocks/annotations-autorange.json')], + ['axes_enumerated_ticks', require('@mocks/axes_enumerated_ticks.json')], + ['axes_visible-false', require('@mocks/axes_visible-false.json')], + ['bar_and_histogram', require('@mocks/bar_and_histogram.json')], + ['basic_error_bar', require('@mocks/basic_error_bar.json')], + ['binding', require('@mocks/binding.json')], + ['cheater_smooth', require('@mocks/cheater_smooth.json')], + ['finance_style', require('@mocks/finance_style.json')], + ['geo_first', require('@mocks/geo_first.json')], + ['layout_image', require('@mocks/layout_image.json')], + ['layout-colorway', require('@mocks/layout-colorway.json')], + ['polar_categories', require('@mocks/polar_categories.json')], + ['polar_direction', require('@mocks/polar_direction.json')], + ['range_selector_style', require('@mocks/range_selector_style.json')], + ['range_slider_multiple', require('@mocks/range_slider_multiple.json')], + ['sankey_energy', require('@mocks/sankey_energy.json')], + ['scattercarpet', require('@mocks/scattercarpet.json')], + ['shapes', require('@mocks/shapes.json')], + ['splom_iris', require('@mocks/splom_iris.json')], + ['table_wrapped_birds', require('@mocks/table_wrapped_birds.json')], + ['ternary_fill', require('@mocks/ternary_fill.json')], + ['text_chart_arrays', require('@mocks/text_chart_arrays.json')], + ['transforms', require('@mocks/transforms.json')], + ['updatemenus', require('@mocks/updatemenus.json')], + ['violin_side-by-side', require('@mocks/violin_side-by-side.json')], + ['world-cals', require('@mocks/world-cals.json')], + ['typed arrays', { + data: [{ + x: new Float32Array([1, 2, 3]), + y: new Float32Array([1, 2, 1]) + }] + }] +]; + +var glMockList = [ + ['gl2d_heatmapgl', require('@mocks/gl2d_heatmapgl.json')], + ['gl2d_line_dash', require('@mocks/gl2d_line_dash.json')], + ['gl2d_parcoords_2', require('@mocks/gl2d_parcoords_2.json')], + ['gl2d_pointcloud-basic', require('@mocks/gl2d_pointcloud-basic.json')], + ['gl3d_annotations', require('@mocks/gl3d_annotations.json')], + ['gl3d_set-ranges', require('@mocks/gl3d_set-ranges.json')], + ['gl3d_world-cals', require('@mocks/gl3d_world-cals.json')], + ['gl3d_cone-autorange', require('@mocks/gl3d_cone-autorange.json')], + ['gl3d_streamtube-simple', require('@mocks/gl3d_streamtube-simple.json')], + ['glpolar_style', require('@mocks/glpolar_style.json')], +]; + +var mapboxMockList = [ + ['scattermapbox', require('@mocks/mapbox_bubbles-text.json')] +]; + +module.exports = { + svg: svgMockList, + gl: glMockList, + mapbox: mapboxMockList, + all: svgMockList.concat(glMockList).concat(mapboxMockList) +}; diff --git a/test/jasmine/tests/plot_api_test.js b/test/jasmine/tests/plot_api_test.js index fc214524124..0a2b609e751 100644 --- a/test/jasmine/tests/plot_api_test.js +++ b/test/jasmine/tests/plot_api_test.js @@ -20,6 +20,7 @@ var destroyGraphDiv = require('../assets/destroy_graph_div'); var failTest = require('../assets/fail_test'); var checkTicks = require('../assets/custom_assertions').checkTicks; var supplyAllDefaults = require('../assets/supply_defaults'); +var mockLists = require('../assets/mock_lists'); describe('Test plot api', function() { 'use strict'; @@ -3230,63 +3231,6 @@ describe('Test plot api', function() { .then(done); }); - var svgMockList = [ - ['1', require('@mocks/1.json')], - ['4', require('@mocks/4.json')], - ['5', require('@mocks/5.json')], - ['10', require('@mocks/10.json')], - ['11', require('@mocks/11.json')], - ['17', require('@mocks/17.json')], - ['21', require('@mocks/21.json')], - ['22', require('@mocks/22.json')], - ['airfoil', require('@mocks/airfoil.json')], - ['annotations-autorange', require('@mocks/annotations-autorange.json')], - ['axes_enumerated_ticks', require('@mocks/axes_enumerated_ticks.json')], - ['axes_visible-false', require('@mocks/axes_visible-false.json')], - ['bar_and_histogram', require('@mocks/bar_and_histogram.json')], - ['basic_error_bar', require('@mocks/basic_error_bar.json')], - ['binding', require('@mocks/binding.json')], - ['cheater_smooth', require('@mocks/cheater_smooth.json')], - ['finance_style', require('@mocks/finance_style.json')], - ['geo_first', require('@mocks/geo_first.json')], - ['layout_image', require('@mocks/layout_image.json')], - ['layout-colorway', require('@mocks/layout-colorway.json')], - ['polar_categories', require('@mocks/polar_categories.json')], - ['polar_direction', require('@mocks/polar_direction.json')], - ['range_selector_style', require('@mocks/range_selector_style.json')], - ['range_slider_multiple', require('@mocks/range_slider_multiple.json')], - ['sankey_energy', require('@mocks/sankey_energy.json')], - ['scattercarpet', require('@mocks/scattercarpet.json')], - ['shapes', require('@mocks/shapes.json')], - ['splom_iris', require('@mocks/splom_iris.json')], - ['table_wrapped_birds', require('@mocks/table_wrapped_birds.json')], - ['ternary_fill', require('@mocks/ternary_fill.json')], - ['text_chart_arrays', require('@mocks/text_chart_arrays.json')], - ['transforms', require('@mocks/transforms.json')], - ['updatemenus', require('@mocks/updatemenus.json')], - ['violin_side-by-side', require('@mocks/violin_side-by-side.json')], - ['world-cals', require('@mocks/world-cals.json')], - ['typed arrays', { - data: [{ - x: new Float32Array([1, 2, 3]), - y: new Float32Array([1, 2, 1]) - }] - }] - ]; - - var glMockList = [ - ['gl2d_heatmapgl', require('@mocks/gl2d_heatmapgl.json')], - ['gl2d_line_dash', require('@mocks/gl2d_line_dash.json')], - ['gl2d_parcoords_2', require('@mocks/gl2d_parcoords_2.json')], - ['gl2d_pointcloud-basic', require('@mocks/gl2d_pointcloud-basic.json')], - ['gl3d_annotations', require('@mocks/gl3d_annotations.json')], - ['gl3d_set-ranges', require('@mocks/gl3d_set-ranges.json')], - ['gl3d_world-cals', require('@mocks/gl3d_world-cals.json')], - ['gl3d_cone-autorange', require('@mocks/gl3d_cone-autorange.json')], - ['gl3d_streamtube-simple', require('@mocks/gl3d_streamtube-simple.json')], - ['glpolar_style', require('@mocks/glpolar_style.json')], - ]; - // make sure we've included every trace type in this suite var typesTested = {}; var itemType; @@ -3385,24 +3329,25 @@ describe('Test plot api', function() { .then(done); } - svgMockList.forEach(function(mockSpec) { + mockLists.svg.forEach(function(mockSpec) { it('can redraw "' + mockSpec[0] + '" with no changes as a noop (svg mocks)', function(done) { _runReactMock(mockSpec, done); }); }); - glMockList.forEach(function(mockSpec) { + mockLists.gl.forEach(function(mockSpec) { it('can redraw "' + mockSpec[0] + '" with no changes as a noop (gl mocks)', function(done) { _runReactMock(mockSpec, done); }); }); - it('@noCI can redraw scattermapbox with no changes as a noop', function(done) { - Plotly.setPlotConfig({ - mapboxAccessToken: require('@build/credentials.json').MAPBOX_ACCESS_TOKEN + mockLists.mapbox.forEach(function(mockSpec) { + it('@noCI can redraw "' + mockSpec[0] + '" with no changes as a noop (mapbpox mocks)', function(done) { + Plotly.setPlotConfig({ + mapboxAccessToken: require('@build/credentials.json').MAPBOX_ACCESS_TOKEN + }); + _runReactMock(mockSpec, done); }); - - _runReactMock(['scattermapbox', require('@mocks/mapbox_bubbles-text.json')], done); }); // since CI breaks up gl/svg types, and drops scattermapbox, this test won't work there From 89d7aa835f40508a4fbfd9da2383c0436ec0f761 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89tienne=20T=C3=A9treault-Pinard?= Date: Mon, 9 Jul 2018 16:55:52 -0400 Subject: [PATCH 5/8] use mock list in minified bundle suite ... for better min.js test coverage --- .../bundle_tests/minified_bundle_test.js | 29 +++++++------------ test/jasmine/karma.conf.js | 6 ++-- 2 files changed, 13 insertions(+), 22 deletions(-) diff --git a/test/jasmine/bundle_tests/minified_bundle_test.js b/test/jasmine/bundle_tests/minified_bundle_test.js index dc2ce377f4b..f744d452180 100644 --- a/test/jasmine/bundle_tests/minified_bundle_test.js +++ b/test/jasmine/bundle_tests/minified_bundle_test.js @@ -1,32 +1,25 @@ /* global Plotly:false */ +var MAPBOX_ACCESS_TOKEN = require('@build/credentials.json').MAPBOX_ACCESS_TOKEN; +var mockLists = require('../assets/mock_lists'); + describe('Test plotly.min.js', function() { 'use strict'; - // Note: this test doesn't have access to custom_matchers.js - // so you can only use standard jasmine matchers here. + var gd = document.createElement('div'); + document.body.appendChild(gd); it('should expose Plotly global', function() { expect(window.Plotly).toBeDefined(); }); - it('should be able to plot a mapbox plot', function(done) { - var gd = document.createElement('div'); - document.body.appendChild(gd); + Plotly.setPlotConfig({ + mapboxAccessToken: MAPBOX_ACCESS_TOKEN + }); - Plotly.plot(gd, [{ - type: 'scattermapbox', - lon: [10, 20, 30], - lat: [10, 30, 20] - }], {}, { - mapboxAccessToken: 'pk.eyJ1IjoiZXRwaW5hcmQiLCJhIjoiY2luMHIzdHE0MGFxNXVubTRxczZ2YmUxaCJ9.hwWZful0U2CQxit4ItNsiQ' - }) - .catch(function() { - fail('mapbox plot failed'); - }) - .then(function() { - document.body.removeChild(gd); - done(); + mockLists.all.forEach(function(mockSpec) { + it('can plot "' + mockSpec[0] + '"', function(done) { + Plotly.newPlot(gd, mockSpec[1]).catch(fail).then(done); }); }); }); diff --git a/test/jasmine/karma.conf.js b/test/jasmine/karma.conf.js index 5cb826563ae..ac7a0088ceb 100644 --- a/test/jasmine/karma.conf.js +++ b/test/jasmine/karma.conf.js @@ -256,10 +256,8 @@ if(isFullSuite) { delete func.defaultConfig.preprocessors[pathToCustomMatchers]; break; case 'minified_bundle': - // browserified custom_matchers doesn't work with this route - // so clear them out of the files and preprocessors - func.defaultConfig.files = [constants.pathToPlotlyDistMin]; - delete func.defaultConfig.preprocessors[pathToCustomMatchers]; + func.defaultConfig.files.push(constants.pathToPlotlyDistMin); + func.defaultConfig.preprocessors[testFileGlob] = ['browserify']; break; case 'ie9': // load ie9_mock.js before plotly.js+test bundle From 9ba473df7d263a6e8d938d9d98fdfea1bea85e7e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89tienne=20T=C3=A9treault-Pinard?= Date: Tue, 10 Jul 2018 10:07:41 -0400 Subject: [PATCH 6/8] run test-bundle in series - to improve log readability - to keep cpu levels somewhat constant throughout run --- tasks/test_bundle.js | 44 +++++++++++++++++++++++++++++++++++++------- 1 file changed, 37 insertions(+), 7 deletions(-) diff --git a/tasks/test_bundle.js b/tasks/test_bundle.js index 9071ce96656..e561e05b3dd 100644 --- a/tasks/test_bundle.js +++ b/tasks/test_bundle.js @@ -1,16 +1,46 @@ var path = require('path'); +var exec = require('child_process').exec; var glob = require('glob'); +var runSeries = require('run-series'); var constants = require('./util/constants'); -var common = require('./util/common'); -var pathToJasmineBundleTests = path.join(constants.pathToJasmineBundleTests); - +var pathToJasmineBundleTests = constants.pathToJasmineBundleTests; +/** + * Run all jasmine 'bundle' test in series + * + * To run specific bundle tests, use + * + * $ npm run test-jasmine -- --bundleTest= + */ glob(pathToJasmineBundleTests + '/*.js', function(err, files) { - files.forEach(function(file) { - var baseName = path.basename(file); - var cmd = 'npm run test-jasmine -- --bundleTest=' + baseName; + var tasks = files.map(function(file) { + return function(cb) { + var cmd = [ + 'karma', 'start', + path.join(constants.pathToRoot, 'test', 'jasmine', 'karma.conf.js'), + '--bundleTest=' + path.basename(file), + '--nowatch' + ].join(' '); + + console.log('Running: ' + cmd); + + exec(cmd, function(err) { + cb(null, err); + }).stdout.pipe(process.stdout); + }; + }); + + runSeries(tasks, function(err, results) { + if(err) throw err; + + var failed = results.filter(function(r) { return r; }); - common.execCmd(cmd); + if(failed.length) { + console.log('\ntest-bundle summary:'); + failed.forEach(function(r) { console.warn('- ' + r.cmd + ' failed'); }); + console.log(''); + process.exit(1); + } }); }); From d1992b4c402b37412e21f44964dfb6c6b5e43667 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89tienne=20T=C3=A9treault-Pinard?= Date: Tue, 10 Jul 2018 10:28:43 -0400 Subject: [PATCH 7/8] try adding long timeout (for mapbox) --- test/jasmine/bundle_tests/minified_bundle_test.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/test/jasmine/bundle_tests/minified_bundle_test.js b/test/jasmine/bundle_tests/minified_bundle_test.js index f744d452180..7889b1990bd 100644 --- a/test/jasmine/bundle_tests/minified_bundle_test.js +++ b/test/jasmine/bundle_tests/minified_bundle_test.js @@ -3,6 +3,9 @@ var MAPBOX_ACCESS_TOKEN = require('@build/credentials.json').MAPBOX_ACCESS_TOKEN; var mockLists = require('../assets/mock_lists'); +// only needed for mapbox subplots +var LONG_TIMEOUT_INTERVAL = 5 * jasmine.DEFAULT_TIMEOUT_INTERVAL; + describe('Test plotly.min.js', function() { 'use strict'; @@ -20,6 +23,6 @@ describe('Test plotly.min.js', function() { mockLists.all.forEach(function(mockSpec) { it('can plot "' + mockSpec[0] + '"', function(done) { Plotly.newPlot(gd, mockSpec[1]).catch(fail).then(done); - }); + }, LONG_TIMEOUT_INTERVAL); }); }); From 810e91fcecde2664309502023661f363808a398e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89tienne=20T=C3=A9treault-Pinard?= Date: Tue, 10 Jul 2018 10:28:59 -0400 Subject: [PATCH 8/8] move test-bundle to jasmine test container --- .circleci/test.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.circleci/test.sh b/.circleci/test.sh index ea9b64140e4..67cd3db86d1 100755 --- a/.circleci/test.sh +++ b/.circleci/test.sh @@ -29,13 +29,13 @@ case $1 in jasmine) npm run test-jasmine -- --skip-tags=gl,noCI,flaky || EXIT_STATE=$? + npm run test-bundle || EXIT_STATE=$? exit $EXIT_STATE ;; jasmine2) retry npm run test-jasmine -- --tags=gl --skip-tags=noCI,flaky retry npm run test-jasmine -- --tags=flaky --skip-tags=noCI - npm run test-bundle || EXIT_STATE=$? exit $EXIT_STATE ;;