From 9c5521b0b83be790d7fafe3c4120c367e66101b9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89tienne=20T=C3=A9treault-Pinard?= Date: Tue, 1 Mar 2016 17:09:26 -0500 Subject: [PATCH 1/2] add export test: - make requests to the testbed container for 'svg', 'pdf' and 'eps' image formats. - test that those request return non-empty images --- test/image/export_test.js | 105 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 105 insertions(+) create mode 100644 test/image/export_test.js diff --git a/test/image/export_test.js b/test/image/export_test.js new file mode 100644 index 00000000000..ed398f3698d --- /dev/null +++ b/test/image/export_test.js @@ -0,0 +1,105 @@ +var fs = require('fs'); +var path = require('path'); + +var request = require('request'); +var test = require('tape'); + +var constants = require('../../tasks/util/constants'); +var getOptions = require('../../tasks/util/get_image_request_options'); + +var userFileName = process.argv[2]; + +/** + * Image formats to test + * + * N.B. 'png' is tested in `compare_pixels_test.js` + * + * TODO figure why 'jpeg' and 'webp' lead to errors + * + */ +var FORMATS = ['svg', 'pdf', 'eps']; + +/** + * The tests below determine whether the images are properly + * exported by (only) checking the file size of the generated images. + * + * MIN_SIZE is the minimum satisfactory file size. + */ +var MIN_SIZE = 100; + + +// make artifact folder +if(!fs.existsSync(constants.pathToTestImages)) { + fs.mkdirSync(constants.pathToTestImages); +} + +if(!userFileName) runAll(); +else { + + if(path.extname(userFileName) !== '.json') { + throw new Error('user-specified mock must end with \'.json\''); + } + + runSingle(userFileName); +} + +function runAll() { + test('testing export formats', function(t) { + + // non-exhaustive list of mocks to test + var fileNames = [ + '0.json', + 'geo_first.json', + 'gl3d_z-range.json' + ]; + + t.plan(fileNames.length * FORMATS.length); + + fileNames.forEach(function(fileName) { + testExports(fileName, t); + }); + }); +} + +function runSingle(userFileName) { + test('testing export for: ' + userFileName, function(t) { + t.plan(FORMATS.length); + + testExports(userFileName, t); + }); +} + +function testExports(fileName, t) { + FORMATS.forEach(function(format) { + testExport(fileName, format, t); + }); +} + +function testExport(fileName, format, t) { + var figure = require(path.join(constants.pathToTestImageMocks, fileName)); + var bodyMock = { + figure: figure, + format: format, + scale: 1 + }; + + var imageFileName = fileName.split('.')[0] + '.' + format; + var savedImagePath = path.join(constants.pathToTestImages, imageFileName); + var savedImageStream = fs.createWriteStream(savedImagePath); + + var options = getOptions(bodyMock, 'http://localhost:9010/'); + + function checkExport(err) { + if(err) throw err; + + fs.stat(savedImagePath, function(err, stats) { + var didExport = stats.size > MIN_SIZE; + + t.ok(didExport, imageFileName + ' should be properly exported'); + }); + } + + request(options) + .pipe(savedImageStream) + .on('close', checkExport); +} From 2d150699bb5335ae0e40d97fa995a8ad0e081096 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89tienne=20T=C3=A9treault-Pinard?= Date: Tue, 1 Mar 2016 17:09:50 -0500 Subject: [PATCH 2/2] add export test runners --- circle.yml | 1 + package.json | 1 + tasks/test_export.sh | 20 ++++++++++++++++++++ 3 files changed, 22 insertions(+) create mode 100755 tasks/test_export.sh diff --git a/circle.yml b/circle.yml index 6b186f08cc6..66cddce9c4a 100644 --- a/circle.yml +++ b/circle.yml @@ -20,6 +20,7 @@ dependencies: test: override: - sudo lxc-attach -n "$(docker inspect --format '{{.Id}}' mytestbed)" -- bash -c "cd /var/www/streambed/image_server/plotly.js && node test/image/compare_pixels_test.js" + - sudo lxc-attach -n "$(docker inspect --format '{{.Id}}' mytestbed)" -- bash -c "cd /var/www/streambed/image_server/plotly.js && node test/image/export_test.js" - npm run citest-jasmine - npm run test-bundle - npm run test-syntax diff --git a/package.json b/package.json index 2b6e7b783b5..1f6b9838da6 100644 --- a/package.json +++ b/package.json @@ -31,6 +31,7 @@ "test-jasmine": "karma start test/jasmine/karma.conf.js", "citest-jasmine": "karma start test/jasmine/karma.ciconf.js", "test-image": "./tasks/test_image.sh", + "test-export": "./tasks/test_export.sh", "test-syntax": "node test/syntax_test.js", "test-bundle": "node tasks/test_bundle.js", "test": "npm run citest-jasmine && npm run test-image && npm run test-syntax && npm run test-bundle", diff --git a/tasks/test_export.sh b/tasks/test_export.sh new file mode 100755 index 00000000000..6ba0c09c5c3 --- /dev/null +++ b/tasks/test_export.sh @@ -0,0 +1,20 @@ +#! /bin/bash +# +# TODO adapt this for Windows +# +# =============================================================================== + +CONTAINER_NAME="imagetest" # same as in docker-compose.yml + +# create/run/start docker container with: +# $ docker-compose up -d + +CMD=( + "cd /var/www/streambed/image_server/plotly.js &&" + "cp -f test/image/index.html ../server_app/index.html &&" + "supervisorctl restart nw1 && " + "wget --server-response --spider --tries=8 --retry-connrefused http://localhost:9010/ping &&" + "node test/image/export_test.js $1" +) + +docker exec -i $CONTAINER_NAME /bin/bash -c "${CMD[*]}"