From 36b73776621dbff23b8b6bc777711c00559a06d1 Mon Sep 17 00:00:00 2001 From: Raul Ochoa Date: Mon, 22 Feb 2016 15:00:06 +0100 Subject: [PATCH 01/16] URLs for widgets are broken in named maps --- test/acceptance/widgets/named-maps.js | 56 ++++++++++++++++++++++++--- 1 file changed, 51 insertions(+), 5 deletions(-) diff --git a/test/acceptance/widgets/named-maps.js b/test/acceptance/widgets/named-maps.js index 4af90245..18743b11 100644 --- a/test/acceptance/widgets/named-maps.js +++ b/test/acceptance/widgets/named-maps.js @@ -1,6 +1,9 @@ var assert = require('../../support/assert'); var step = require('step'); +var url = require('url'); +var queue = require('queue-async'); + var helper = require('../../support/test_helper'); var CartodbWindshaft = require('../../../lib/cartodb/server'); @@ -15,6 +18,7 @@ describe('named-maps widgets', function() { var widgetsTemplateName = 'widgets-template'; var layergroupid; + var layergroup; var keysToDelete; beforeEach(function(done) { @@ -105,12 +109,11 @@ describe('named-maps widgets', function() { function fetchTile(err, res) { assert.ifError(err); - var parsed = JSON.parse(res.body); - assert.ok( - parsed.hasOwnProperty('layergroupid'), "Missing 'layergroupid' from response body: " + res.body); - layergroupid = parsed.layergroupid; + layergroup = JSON.parse(res.body); + assert.ok(layergroup.hasOwnProperty('layergroupid'), "Missing 'layergroupid' from: " + res.body); + layergroupid = layergroup.layergroupid; - keysToDelete['map_cfg|' + LayergroupToken.parse(parsed.layergroupid).token] = 0; + keysToDelete['map_cfg|' + LayergroupToken.parse(layergroup.layergroupid).token] = 0; keysToDelete['user:localhost:mapviews:global'] = 5; return done(); @@ -171,6 +174,49 @@ describe('named-maps widgets', function() { ); } + it('should be able to retrieve widgets from all URLs', function(done) { + var widgetsPaths = layergroup.metadata.layers.reduce(function(paths, layer) { + var widgets = layer.widgets || {}; + Object.keys(widgets).forEach(function(widget) { + paths.push(url.parse(widgets[widget].url.http).path); + }); + + return paths; + }, []); + + var widgetsQueue = queue(widgetsPaths.length); + + widgetsPaths.forEach(function(path) { + widgetsQueue.defer(function(path, done) { + assert.response( + server, + { + url: path, + method: 'GET', + headers: { + host: username + } + }, + { + status: 200 + }, + function(res, err) { + if (err) { + return done(err); + } + var parsedBody = JSON.parse(res.body); + return done(null, parsedBody); + } + ); + }, path); + }); + + widgetsQueue.awaitAll(function(err, results) { + console.log(err, results); + done(); + }); + }); + it("should retrieve aggregation", function(done) { getWidget('country_places_count', function(err, response, aggregation) { From 877425267ed890f35c602535944f06f068f56038 Mon Sep 17 00:00:00 2001 From: Raul Ochoa Date: Mon, 22 Feb 2016 15:06:39 +0100 Subject: [PATCH 02/16] Correct URLs for widgets in named maps Fixes #381 --- NEWS.md | 2 ++ lib/cartodb/controllers/map.js | 7 ++++--- test/acceptance/widgets/named-maps.js | 11 +++++++++-- 3 files changed, 15 insertions(+), 5 deletions(-) diff --git a/NEWS.md b/NEWS.md index 3dd16c6f..baf2cf05 100644 --- a/NEWS.md +++ b/NEWS.md @@ -4,6 +4,8 @@ Released 2016-mm-dd +Bug fixes: + - Correct URLs for widgets in named maps #381 ## 2.25.1 diff --git a/lib/cartodb/controllers/map.js b/lib/cartodb/controllers/map.js index a5555a2f..035537d8 100644 --- a/lib/cartodb/controllers/map.js +++ b/lib/cartodb/controllers/map.js @@ -186,6 +186,8 @@ MapController.prototype.create = function(req, res, prepareConfigFn) { if (err) { self.sendError(req, res, err, 'ANONYMOUS LAYERGROUP'); } else { + addWidgetsUrl(req.context.user, layergroup); + res.set('X-Layergroup-Id', layergroup.layergroupid); self.send(req, res, layergroup, 200); } @@ -260,6 +262,8 @@ MapController.prototype.instantiateTemplate = function(req, res, prepareParamsFn var templateHash = self.templateMaps.fingerPrint(mapConfigProvider.template).substring(0, 8); layergroup.layergroupid = cdbuser + '@' + templateHash + '@' + layergroup.layergroupid; + addWidgetsUrl(req.context.user, layergroup); + res.set('X-Layergroup-Id', layergroup.layergroupid); self.surrogateKeysCache.tag(res, new NamedMapsCacheEntry(cdbuser, mapConfigProvider.getTemplateName())); @@ -343,9 +347,6 @@ MapController.prototype.afterLayergroupCreate = function(req, res, mapconfig, la layergroup.layergroupid = layergroup.layergroupid + ':' + result.lastUpdatedTime; layergroup.last_updated = new Date(result.lastUpdatedTime).toISOString(); - // TODO this should take into account several URL patterns - addWidgetsUrl(username, layergroup); - if (req.method === 'GET') { var tableCacheEntry = new TablesCacheEntry(dbName, result.affectedTables); var ttl = global.environment.varnish.layergroupTtl || 86400; diff --git a/test/acceptance/widgets/named-maps.js b/test/acceptance/widgets/named-maps.js index 18743b11..ee40d1ce 100644 --- a/test/acceptance/widgets/named-maps.js +++ b/test/acceptance/widgets/named-maps.js @@ -37,6 +37,13 @@ describe('named-maps widgets', function() { cartocss: '#layer { marker-fill: blue; }', cartocss_version: '2.3.0', widgets: { + pop_max_formula_sum: { + type: 'formula', + options: { + column: 'pop_max', + operation: 'sum' + } + }, country_places_count: { type: 'aggregation', options: { @@ -212,8 +219,8 @@ describe('named-maps widgets', function() { }); widgetsQueue.awaitAll(function(err, results) { - console.log(err, results); - done(); + assert.equal(results.length, 3); + done(err); }); }); From fb146f164c9102c33a7a3fb8eb3651c19b5aae0e Mon Sep 17 00:00:00 2001 From: Raul Ochoa Date: Mon, 22 Feb 2016 15:31:01 +0100 Subject: [PATCH 03/16] Use before/after to not alter global configuration --- test/acceptance/multilayer.js | 74 ++++++++++++++----------- test/acceptance/templates.js | 100 +++++++++++++++++++--------------- 2 files changed, 99 insertions(+), 75 deletions(-) diff --git a/test/acceptance/multilayer.js b/test/acceptance/multilayer.js index ededd1b7..acd13ddc 100644 --- a/test/acceptance/multilayer.js +++ b/test/acceptance/multilayer.js @@ -190,38 +190,50 @@ describe(suiteName, function() { }); - it("should include serverMedata in the response", function(done) { - global.environment.serverMetadata = { cdn_url : { http:'test', https: 'tests' } }; - var layergroup = { - version: '1.0.0', - layers: [ - { options: { - sql: 'select cartodb_id, ST_Translate(the_geom_webmercator, 5e6, 0) as the_geom_webmercator' + - ' from test_table limit 2', - cartocss: '#layer { marker-fill:red; marker-width:32; marker-allow-overlap:true; }', - cartocss_version: '2.0.1' - } } - ] - }; + describe('server-metadata', function() { + var serverMetadata; + beforeEach(function() { + serverMetadata = global.environment.serverMetadata; + global.environment.serverMetadata = { cdn_url : { http:'test', https: 'tests' } }; + }); + + afterEach(function() { + global.environment.serverMetadata = serverMetadata; + }); + + it("should include serverMedata in the response", function(done) { + var layergroup = { + version: '1.0.0', + layers: [ + { options: { + sql: 'select cartodb_id, ST_Translate(the_geom_webmercator, 5e6, 0) as the_geom_webmercator' + + ' from test_table limit 2', + cartocss: '#layer { marker-fill:red; marker-width:32; marker-allow-overlap:true; }', + cartocss_version: '2.0.1' + } } + ] + }; + + step( + function do_create_get() + { + var next = this; + assert.response(server, { + url: layergroup_url + '?config=' + encodeURIComponent(JSON.stringify(layergroup)), + method: 'GET', + headers: {host: 'localhost'} + }, {}, function(res, err) { next(err, res); }); + }, + function do_check_create(err, res) { + var parsed = JSON.parse(res.body); + keysToDelete['map_cfg|' + LayergroupToken.parse(parsed.layergroupid).token] = 0; + keysToDelete['user:localhost:mapviews:global'] = 5; + assert.ok(_.isEqual(parsed.cdn_url, global.environment.serverMetadata.cdn_url)); + done(); + } + ); + }); - step( - function do_create_get() - { - var next = this; - assert.response(server, { - url: layergroup_url + '?config=' + encodeURIComponent(JSON.stringify(layergroup)), - method: 'GET', - headers: {host: 'localhost'} - }, {}, function(res, err) { next(err, res); }); - }, - function do_check_create(err, res) { - var parsed = JSON.parse(res.body); - keysToDelete['map_cfg|' + LayergroupToken.parse(parsed.layergroupid).token] = 0; - keysToDelete['user:localhost:mapviews:global'] = 5; - assert.ok(_.isEqual(parsed.cdn_url, global.environment.serverMetadata.cdn_url)); - done(); - } - ); }); diff --git a/test/acceptance/templates.js b/test/acceptance/templates.js index d4eb304b..0e1bd644 100644 --- a/test/acceptance/templates.js +++ b/test/acceptance/templates.js @@ -313,51 +313,63 @@ describe('template_api', function() { }); }); - it("instance endpoint should return server metadata", function(done){ - global.environment.serverMetadata = { cdn_url : { http:'test', https: 'tests' } }; - var tmpl = _.clone(template_acceptance1); - tmpl.name = "rambotemplate2"; + describe('server-metadata', function() { + var serverMetadata; + beforeEach(function() { + serverMetadata = global.environment.serverMetadata; + global.environment.serverMetadata = { cdn_url : { http:'test', https: 'tests' } }; + }); - step(function postTemplate1() { - var next = this; - var post_request = { - url: '/api/v1/map/named?api_key=1234', - method: 'POST', - headers: {host: 'localhost', 'Content-Type': 'application/json' }, - data: JSON.stringify(tmpl) - }; - assert.response(server, post_request, {}, function(res) { - next(null, res); - }); - }, - function testCORS() { - var next = this; - assert.response(server, { - url: '/api/v1/map/named/' + tmpl.name, - method: 'POST', - headers: {host: 'localhost', 'Content-Type': 'application/json' } - },{ - status: 200 - }, function(res) { - var parsed = JSON.parse(res.body); - keysToDelete['map_cfg|' + LayergroupToken.parse(parsed.layergroupid).token] = 0; - keysToDelete['user:localhost:mapviews:global'] = 5; - assert.ok(_.isEqual(parsed.cdn_url, global.environment.serverMetadata.cdn_url)); - next(null); - }); - }, - function deleteTemplate(err) { - assert.ifError(err); - var del_request = { - url: '/api/v1/map/named/' + tmpl.name + '?api_key=1234', - method: 'DELETE', - headers: {host: 'localhost', 'Content-Type': 'application/json' } - }; - assert.response(server, del_request, {}, function() { - done(); - }); - } - ); + afterEach(function() { + global.environment.serverMetadata = serverMetadata; + }); + + + it("instance endpoint should return server metadata", function(done){ + var tmpl = _.clone(template_acceptance1); + tmpl.name = "rambotemplate2"; + + step(function postTemplate1() { + var next = this; + var post_request = { + url: '/api/v1/map/named?api_key=1234', + method: 'POST', + headers: {host: 'localhost', 'Content-Type': 'application/json' }, + data: JSON.stringify(tmpl) + }; + assert.response(server, post_request, {}, function(res) { + next(null, res); + }); + }, + function testCORS() { + var next = this; + assert.response(server, { + url: '/api/v1/map/named/' + tmpl.name, + method: 'POST', + headers: {host: 'localhost', 'Content-Type': 'application/json' } + },{ + status: 200 + }, function(res) { + var parsed = JSON.parse(res.body); + keysToDelete['map_cfg|' + LayergroupToken.parse(parsed.layergroupid).token] = 0; + keysToDelete['user:localhost:mapviews:global'] = 5; + assert.ok(_.isEqual(parsed.cdn_url, global.environment.serverMetadata.cdn_url)); + next(null); + }); + }, + function deleteTemplate(err) { + assert.ifError(err); + var del_request = { + url: '/api/v1/map/named/' + tmpl.name + '?api_key=1234', + method: 'DELETE', + headers: {host: 'localhost', 'Content-Type': 'application/json' } + }; + assert.response(server, del_request, {}, function() { + done(); + }); + } + ); + }); }); From 37ae6b4fa0f3487e1c3965c4574719ba236b4dfa Mon Sep 17 00:00:00 2001 From: Raul Ochoa Date: Mon, 22 Feb 2016 15:38:29 +0100 Subject: [PATCH 04/16] Rely on mapnik.Image instead of compare from imagemagick --- test/support/assert.js | 38 +++++++++----------------------------- 1 file changed, 9 insertions(+), 29 deletions(-) diff --git a/test/support/assert.js b/test/support/assert.js index 3e66265b..82021be1 100644 --- a/test/support/assert.js +++ b/test/support/assert.js @@ -1,7 +1,6 @@ // Cribbed from the ever prolific Konstantin Kaefer // https://github.com/mapbox/tilelive-mapnik/blob/master/test/support/assert.js -var exec = require('child_process').exec; var fs = require('fs'); var path = require('path'); var util = require('util'); @@ -51,37 +50,18 @@ function createImageFromBuffer(buffer, nameHint) { } function imageFilesAreEqual(testImageFilePath, referenceImageFilePath, tolerance, callback) { - var resultFilePath = path.resolve(util.format('/tmp/windshaft-result-%s-diff.png', Date.now())); - var imageMagickCmd = util.format( - 'compare -metric fuzz "%s" "%s" "%s"', - testImageFilePath, referenceImageFilePath, resultFilePath - ); + testImageFilePath = path.resolve(testImageFilePath); + referenceImageFilePath = path.resolve(referenceImageFilePath); - exec(imageMagickCmd, function(err, stdout, stderr) { + var testImage = mapnik.Image.fromBytes(fs.readFileSync(testImageFilePath, { encoding: null })); + var referenceImage = mapnik.Image.fromBytes(fs.readFileSync(referenceImageFilePath, { encoding: null })); + + assert.imagesAreSimilar(testImage, referenceImage, tolerance, function(err) { if (err) { - fs.unlinkSync(testImageFilePath); - callback(err); - } else { - stderr = stderr.trim(); - var metrics = stderr.match(/([0-9]*) \((.*)\)/); - if ( ! metrics ) { - callback(new Error("No match for " + stderr)); - return; - } - var similarity = parseFloat(metrics[2]), - tolerancePerMil = (tolerance / 1000); - if (similarity > tolerancePerMil) { - err = new Error(util.format( - 'Images %s and %s are not equal (got %d similarity, expected %d). Result %s', - testImageFilePath, referenceImageFilePath, similarity, tolerancePerMil, resultFilePath) - ); - err.similarity = similarity; - callback(err, similarity); - } else { - fs.unlinkSync(resultFilePath); - callback(null, similarity); - } + var testImageFilePath = randomImagePath(); + testImage.save(testImageFilePath); } + callback(err); }); } From 5301e748de325b04fdd632a962f4a10876315bdb Mon Sep 17 00:00:00 2001 From: Raul Ochoa Date: Mon, 22 Feb 2016 16:00:30 +0100 Subject: [PATCH 05/16] Do not create intermediate files when there is no need --- test/support/assert.js | 44 +++++++++--------------------------------- 1 file changed, 9 insertions(+), 35 deletions(-) diff --git a/test/support/assert.js b/test/support/assert.js index 82021be1..a360ae3d 100644 --- a/test/support/assert.js +++ b/test/support/assert.js @@ -23,48 +23,22 @@ var assert = module.exports = exports = require('assert'); */ assert.imageEqualsFile = function(buffer, referenceImageRelativeFilePath, tolerance, callback) { callback = callback || function(err) { assert.ifError(err); }; - var referenceImageFilePath = path.resolve(referenceImageRelativeFilePath), - testImageFilePath = createImageFromBuffer(buffer, 'test'); - imageFilesAreEqual(testImageFilePath, referenceImageFilePath, tolerance, function(err) { - fs.unlinkSync(testImageFilePath); - callback(err); - }); + var referenceImageFilePath = path.resolve(referenceImageRelativeFilePath); + + var testImage = mapnik.Image.fromBytes(Buffer.isBuffer(buffer) ? buffer : new Buffer(buffer, 'binary')); + var referenceImage = mapnik.Image.fromBytes(fs.readFileSync(referenceImageFilePath, { encoding: null })); + + assert.imagesAreSimilar(testImage, referenceImage, tolerance, callback); }; assert.imageBuffersAreEqual = function(bufferA, bufferB, tolerance, callback) { - var randStr = (Math.random() * 1e16).toString().substring(0, 8); - var imageFilePathA = createImageFromBuffer(bufferA, randStr + '-a'), - imageFilePathB = createImageFromBuffer(bufferB, randStr + '-b'); + var testImage = mapnik.Image.fromBytes(Buffer.isBuffer(bufferA) ? bufferA : new Buffer(bufferA, 'binary')); + var referenceImage = mapnik.Image.fromBytes(Buffer.isBuffer(bufferB) ? bufferB : new Buffer(bufferB, 'binary')); - imageFilesAreEqual(imageFilePathA, imageFilePathB, tolerance, function(err, similarity) { - callback(err, [imageFilePathA, imageFilePathB], similarity); - }); + assert.imagesAreSimilar(testImage, referenceImage, tolerance, callback); }; -function createImageFromBuffer(buffer, nameHint) { - var imageFilePath = path.resolve('test/results/png/image-' + nameHint + '-' + Date.now() + '.png'); - var err = fs.writeFileSync(imageFilePath, buffer, 'binary'); - assert.ifError(err); - return imageFilePath; -} - -function imageFilesAreEqual(testImageFilePath, referenceImageFilePath, tolerance, callback) { - testImageFilePath = path.resolve(testImageFilePath); - referenceImageFilePath = path.resolve(referenceImageFilePath); - - var testImage = mapnik.Image.fromBytes(fs.readFileSync(testImageFilePath, { encoding: null })); - var referenceImage = mapnik.Image.fromBytes(fs.readFileSync(referenceImageFilePath, { encoding: null })); - - assert.imagesAreSimilar(testImage, referenceImage, tolerance, function(err) { - if (err) { - var testImageFilePath = randomImagePath(); - testImage.save(testImageFilePath); - } - callback(err); - }); -} - assert.imagesAreSimilar = function(testImage, referenceImage, tolerance, callback) { if (testImage.width() !== referenceImage.width() || testImage.height() !== referenceImage.height()) { return callback(new Error('Images are not the same size')); From ae9daed43fdbffc96cd04acdb55c128714db7615 Mon Sep 17 00:00:00 2001 From: Raul Ochoa Date: Mon, 22 Feb 2016 16:02:15 +0100 Subject: [PATCH 06/16] Better naming for imageBuffersAreSimilar --- test/acceptance/ported/server_png8_format.js | 2 +- test/support/assert.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/test/acceptance/ported/server_png8_format.js b/test/acceptance/ported/server_png8_format.js index fdd5a131..39c89c66 100644 --- a/test/acceptance/ported/server_png8_format.js +++ b/test/acceptance/ported/server_png8_format.js @@ -108,7 +108,7 @@ describe('server_png8_format', function() { assert.equal(responsePng8.headers['content-type'], "image/png"); bufferPng8 = responsePng8.body; assert.ok(bufferPng8.length < bufferPng32.length); - assert.imageBuffersAreEqual(bufferPng32, bufferPng8, IMAGE_EQUALS_TOLERANCE_PER_MIL, + assert.imageBuffersAreSimilar(bufferPng32, bufferPng8, IMAGE_EQUALS_TOLERANCE_PER_MIL, function(err, imagePaths, similarity) { keysToDelete['map_cfg|' + LayergroupToken.parse(layergroupId).token] = 0; diff --git a/test/support/assert.js b/test/support/assert.js index a360ae3d..cf06e466 100644 --- a/test/support/assert.js +++ b/test/support/assert.js @@ -32,7 +32,7 @@ assert.imageEqualsFile = function(buffer, referenceImageRelativeFilePath, tolera assert.imagesAreSimilar(testImage, referenceImage, tolerance, callback); }; -assert.imageBuffersAreEqual = function(bufferA, bufferB, tolerance, callback) { +assert.imageBuffersAreSimilar = function(bufferA, bufferB, tolerance, callback) { var testImage = mapnik.Image.fromBytes(Buffer.isBuffer(bufferA) ? bufferA : new Buffer(bufferA, 'binary')); var referenceImage = mapnik.Image.fromBytes(Buffer.isBuffer(bufferB) ? bufferB : new Buffer(bufferB, 'binary')); From 0683f638ce8dc5dc4f37b4483fc90b388a5e5d52 Mon Sep 17 00:00:00 2001 From: Raul Ochoa Date: Mon, 22 Feb 2016 16:04:31 +0100 Subject: [PATCH 07/16] Do not take optional name hint --- test/support/assert.js | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/test/support/assert.js b/test/support/assert.js index cf06e466..9ed84142 100644 --- a/test/support/assert.js +++ b/test/support/assert.js @@ -75,9 +75,8 @@ assert.imageIsSimilarToFile = function(testImage, referenceImageRelativeFilePath }); }; -function randomImagePath(nameHint) { - nameHint = nameHint || 'test'; - return path.resolve('test/results/png/image-' + nameHint + '-' + Date.now() + '.png'); +function randomImagePath() { + return path.resolve('test/results/png/image-test-' + Date.now() + '.png'); } // jshint maxcomplexity:9 From 7c7bec6f3191eef9cebaa34478c09fd09f475cee Mon Sep 17 00:00:00 2001 From: Raul Ochoa Date: Mon, 22 Feb 2016 16:05:12 +0100 Subject: [PATCH 08/16] Remove imagemagick reference --- test/support/assert.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/support/assert.js b/test/support/assert.js index 9ed84142..8b93b977 100644 --- a/test/support/assert.js +++ b/test/support/assert.js @@ -12,7 +12,7 @@ var request = require('request'); var assert = module.exports = exports = require('assert'); /** - * Takes an image data as an input and an image path and compare them using ImageMagick fuzz algorithm, if case the + * Takes an image data as an input and an image path and compare them using mapnik.Image.compare mechanism, in case the * similarity is not within the tolerance limit it will callback with an error. * * @param buffer The image data to compare from From 3cadf7f2a28bc64b9c045198d4f1c62f2abd7013 Mon Sep 17 00:00:00 2001 From: Raul Ochoa Date: Mon, 22 Feb 2016 16:07:26 +0100 Subject: [PATCH 09/16] Make imagesAreSimilar private --- test/support/assert.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/test/support/assert.js b/test/support/assert.js index 8b93b977..f3e9cc20 100644 --- a/test/support/assert.js +++ b/test/support/assert.js @@ -29,17 +29,17 @@ assert.imageEqualsFile = function(buffer, referenceImageRelativeFilePath, tolera var testImage = mapnik.Image.fromBytes(Buffer.isBuffer(buffer) ? buffer : new Buffer(buffer, 'binary')); var referenceImage = mapnik.Image.fromBytes(fs.readFileSync(referenceImageFilePath, { encoding: null })); - assert.imagesAreSimilar(testImage, referenceImage, tolerance, callback); + imagesAreSimilar(testImage, referenceImage, tolerance, callback); }; assert.imageBuffersAreSimilar = function(bufferA, bufferB, tolerance, callback) { var testImage = mapnik.Image.fromBytes(Buffer.isBuffer(bufferA) ? bufferA : new Buffer(bufferA, 'binary')); var referenceImage = mapnik.Image.fromBytes(Buffer.isBuffer(bufferB) ? bufferB : new Buffer(bufferB, 'binary')); - assert.imagesAreSimilar(testImage, referenceImage, tolerance, callback); + imagesAreSimilar(testImage, referenceImage, tolerance, callback); }; -assert.imagesAreSimilar = function(testImage, referenceImage, tolerance, callback) { +function imagesAreSimilar(testImage, referenceImage, tolerance, callback) { if (testImage.width() !== referenceImage.width() || testImage.height() !== referenceImage.height()) { return callback(new Error('Images are not the same size')); } @@ -57,7 +57,7 @@ assert.imagesAreSimilar = function(testImage, referenceImage, tolerance, callbac } else { callback(null, similarity); } -}; +} assert.imageIsSimilarToFile = function(testImage, referenceImageRelativeFilePath, tolerance, callback) { callback = callback || function(err) { assert.ifError(err); }; @@ -66,7 +66,7 @@ assert.imageIsSimilarToFile = function(testImage, referenceImageRelativeFilePath var referenceImage = mapnik.Image.fromBytes(fs.readFileSync(referenceImageFilePath, { encoding: null })); - assert.imagesAreSimilar(testImage, referenceImage, tolerance, function(err) { + imagesAreSimilar(testImage, referenceImage, tolerance, function(err) { if (err) { var testImageFilePath = randomImagePath(); testImage.save(testImageFilePath); From da680ec2a88102dc87b1280f31e10b7b20cf8fa6 Mon Sep 17 00:00:00 2001 From: Raul Ochoa Date: Mon, 22 Feb 2016 16:07:55 +0100 Subject: [PATCH 10/16] Code re-org --- test/support/assert.js | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/test/support/assert.js b/test/support/assert.js index f3e9cc20..7cb363d1 100644 --- a/test/support/assert.js +++ b/test/support/assert.js @@ -39,6 +39,22 @@ assert.imageBuffersAreSimilar = function(bufferA, bufferB, tolerance, callback) imagesAreSimilar(testImage, referenceImage, tolerance, callback); }; +assert.imageIsSimilarToFile = function(testImage, referenceImageRelativeFilePath, tolerance, callback) { + callback = callback || function(err) { assert.ifError(err); }; + + var referenceImageFilePath = path.resolve(referenceImageRelativeFilePath); + + var referenceImage = mapnik.Image.fromBytes(fs.readFileSync(referenceImageFilePath, { encoding: null })); + + imagesAreSimilar(testImage, referenceImage, tolerance, function(err) { + if (err) { + var testImageFilePath = randomImagePath(); + testImage.save(testImageFilePath); + } + callback(err); + }); +}; + function imagesAreSimilar(testImage, referenceImage, tolerance, callback) { if (testImage.width() !== referenceImage.width() || testImage.height() !== referenceImage.height()) { return callback(new Error('Images are not the same size')); @@ -59,22 +75,6 @@ function imagesAreSimilar(testImage, referenceImage, tolerance, callback) { } } -assert.imageIsSimilarToFile = function(testImage, referenceImageRelativeFilePath, tolerance, callback) { - callback = callback || function(err) { assert.ifError(err); }; - - var referenceImageFilePath = path.resolve(referenceImageRelativeFilePath); - - var referenceImage = mapnik.Image.fromBytes(fs.readFileSync(referenceImageFilePath, { encoding: null })); - - imagesAreSimilar(testImage, referenceImage, tolerance, function(err) { - if (err) { - var testImageFilePath = randomImagePath(); - testImage.save(testImageFilePath); - } - callback(err); - }); -}; - function randomImagePath() { return path.resolve('test/results/png/image-test-' + Date.now() + '.png'); } From 495fdaf8ec1ab0614194c030a4317773db3d0059 Mon Sep 17 00:00:00 2001 From: Raul Ochoa Date: Mon, 22 Feb 2016 16:36:06 +0100 Subject: [PATCH 11/16] Rename assert.imageEqualsFile --- test/acceptance/limits.js | 3 ++- test/acceptance/multilayer.js | 10 ++++--- test/acceptance/overviews_queries.js | 3 ++- test/acceptance/ported/blend.js | 10 ++++--- test/acceptance/ported/blend_filtering.js | 10 ++++--- test/acceptance/ported/blend_http_fallback.js | 10 ++++--- test/acceptance/ported/external_resources.js | 3 ++- test/acceptance/ported/limits.js | 12 +++++---- test/acceptance/ported/multilayer.js | 26 ++++++++++++------- test/acceptance/ported/raster.js | 2 +- test/acceptance/ported/server_gettile.js | 17 +++++++----- test/acceptance/ported/torque_png.js | 10 ++++--- test/acceptance/ported/wrap.js | 10 ++++--- test/support/assert.js | 2 +- 14 files changed, 78 insertions(+), 50 deletions(-) diff --git a/test/acceptance/limits.js b/test/acceptance/limits.js index e7e4a305..ef91dac4 100644 --- a/test/acceptance/limits.js +++ b/test/acceptance/limits.js @@ -292,7 +292,8 @@ describe('render limits', function() { if (err) { done(err); } - assert.imageEqualsFile(res.body, './test/fixtures/render-timeout-fallback.png', 25, + var referenceImagePath = './test/fixtures/render-timeout-fallback.png'; + assert.imageBufferIsSimilarToFile(res.body, referenceImagePath, 25, function(imgErr/*, similarity*/) { done(imgErr); } diff --git a/test/acceptance/multilayer.js b/test/acceptance/multilayer.js index acd13ddc..5375fc87 100644 --- a/test/acceptance/multilayer.js +++ b/test/acceptance/multilayer.js @@ -122,7 +122,7 @@ describe(suiteName, function() { ' WHERE m.tabname = any ((SELECT tablenames from querytables)::regclass[])'); } - assert.imageEqualsFile(res.body, 'test/fixtures/test_table_0_0_0_multilayer1.png', + assert.imageBufferIsSimilarToFile(res.body, 'test/fixtures/test_table_0_0_0_multilayer1.png', IMAGE_EQUALS_HIGHER_TOLERANCE_PER_MIL, function(err/*, similarity*/) { next(err); } @@ -404,7 +404,8 @@ describe(suiteName, function() { ' WHERE m.tabname = any ((SELECT tablenames from querytables)::regclass[])'); } - assert.imageEqualsFile(res.body, 'test/fixtures/test_multilayer_bbox.png', IMAGE_EQUALS_TOLERANCE_PER_MIL, + var referenceImagePath = 'test/fixtures/test_multilayer_bbox.png'; + assert.imageBufferIsSimilarToFile(res.body, referenceImagePath, IMAGE_EQUALS_TOLERANCE_PER_MIL, function(err/*, similarity*/) { next(err); }); @@ -443,7 +444,8 @@ describe(suiteName, function() { ' WHERE m.tabname = any ((SELECT tablenames from querytables)::regclass[])'); } - assert.imageEqualsFile(res.body, 'test/fixtures/test_multilayer_bbox.png', IMAGE_EQUALS_TOLERANCE_PER_MIL, + var referenceImagePath = 'test/fixtures/test_multilayer_bbox.png'; + assert.imageBufferIsSimilarToFile(res.body, referenceImagePath, IMAGE_EQUALS_TOLERANCE_PER_MIL, function(err/*, similarity*/) { next(err); }); @@ -1019,7 +1021,7 @@ describe(suiteName, function() { }, {}, function(res) { assert.equal(res.statusCode, 200, res.body); assert.equal(res.headers['content-type'], "image/png"); - assert.imageEqualsFile(res.body, windshaft_fixtures + '/test_default_mapnik_point.png', + assert.imageBufferIsSimilarToFile(res.body, windshaft_fixtures + '/test_default_mapnik_point.png', IMAGE_EQUALS_TOLERANCE_PER_MIL, function(err/*, similarity*/) { next(err); } diff --git a/test/acceptance/overviews_queries.js b/test/acceptance/overviews_queries.js index 8024ba72..0434ebfc 100644 --- a/test/acceptance/overviews_queries.js +++ b/test/acceptance/overviews_queries.js @@ -30,7 +30,8 @@ describe('overviews_queries', function() { if (err) { return done(err); } - assert.imageEqualsFile(tile.body, './test/fixtures/' + fixture, IMAGE_EQUALS_TOLERANCE_PER_MIL, done); + var referenceImagePath = './test/fixtures/' + fixture; + assert.imageBufferIsSimilarToFile(tile.body, referenceImagePath, IMAGE_EQUALS_TOLERANCE_PER_MIL, done); }; } diff --git a/test/acceptance/ported/blend.js b/test/acceptance/ported/blend.js index eca436ae..1e844d80 100644 --- a/test/acceptance/ported/blend.js +++ b/test/acceptance/ported/blend.js @@ -95,10 +95,12 @@ describe('blend png renderer', function() { var zxy = [tileRequest.z, tileRequest.x, tileRequest.y]; it('tile all/' + zxy.join('/') + '.png', function (done) { testClient.getTileLayer(plainTorqueMapConfig(testScenario.plainColor), tileRequest, function(err, res) { - assert.imageEqualsFile(res.body, blendPngFixture(zxy), IMAGE_TOLERANCE_PER_MIL, function(err) { - assert.ok(!err); - done(); - }); + assert.imageBufferIsSimilarToFile(res.body, blendPngFixture(zxy), IMAGE_TOLERANCE_PER_MIL, + function(err) { + assert.ok(!err); + done(); + } + ); }); }); }); diff --git a/test/acceptance/ported/blend_filtering.js b/test/acceptance/ported/blend_filtering.js index c1b11933..dc8cd470 100644 --- a/test/acceptance/ported/blend_filtering.js +++ b/test/acceptance/ported/blend_filtering.js @@ -156,10 +156,12 @@ describe('blend layer filtering', function() { it('should filter on ' + layerFilter + '/1/0/0.png', function (done) { testClient.getTileLayer(mapConfig, tileRequest, function(err, res) { - assert.imageEqualsFile(res.body, blendPngFixture(filteredLayers), IMG_TOLERANCE_PER_MIL, function(err) { - assert.ok(!err); - done(); - }); + assert.imageBufferIsSimilarToFile(res.body, blendPngFixture(filteredLayers), IMG_TOLERANCE_PER_MIL, + function(err) { + assert.ok(!err); + done(); + } + ); }); }); }); diff --git a/test/acceptance/ported/blend_http_fallback.js b/test/acceptance/ported/blend_http_fallback.js index 3c35c5fc..91e832f6 100644 --- a/test/acceptance/ported/blend_http_fallback.js +++ b/test/acceptance/ported/blend_http_fallback.js @@ -111,10 +111,12 @@ describe('blend http fallback', function() { it('should fallback on http error while blending layers ' + layerFilter + '/1/0/0.png', function (done) { testClient.getTileLayer(mapConfig, tileRequest, function(err, res) { - assert.imageEqualsFile(res.body, blendPngFixture(filteredLayers), IMG_TOLERANCE_PER_MIL, function(err) { - assert.ok(!err, err); - done(); - }); + assert.imageBufferIsSimilarToFile(res.body, blendPngFixture(filteredLayers), IMG_TOLERANCE_PER_MIL, + function(err) { + assert.ok(!err, err); + done(); + } + ); }); }); }); diff --git a/test/acceptance/ported/external_resources.js b/test/acceptance/ported/external_resources.js index a0affa83..6f73b52e 100644 --- a/test/acceptance/ported/external_resources.js +++ b/test/acceptance/ported/external_resources.js @@ -57,7 +57,8 @@ describe('external resources', function() { if (err) { return done(err); } - assert.imageEqualsFile(res.body, './test/fixtures/' + fixture, IMAGE_EQUALS_TOLERANCE_PER_MIL, done); + var referenceImagePath = './test/fixtures/' + fixture; + assert.imageBufferIsSimilarToFile(res.body, referenceImagePath, IMAGE_EQUALS_TOLERANCE_PER_MIL, done); }; } diff --git a/test/acceptance/ported/limits.js b/test/acceptance/ported/limits.js index f032ff3f..c111c87c 100644 --- a/test/acceptance/ported/limits.js +++ b/test/acceptance/ported/limits.js @@ -84,11 +84,13 @@ describe.skip('render limits', function() { testClient.withLayergroup(slowQueryMapConfig, options, function(err, requestTile, finish) { var tileUrl = '/0/0/0.png'; requestTile(tileUrl, options, function(err, res) { - assert.imageEqualsFile(res.body, fixtureImage, IMAGE_EQUALS_TOLERANCE_PER_MIL, function(err) { - finish(function(finishErr) { - done(err || finishErr); - }); - }); + assert.imageBufferIsSimilarToFile(res.body, fixtureImage, IMAGE_EQUALS_TOLERANCE_PER_MIL, + function(err) { + finish(function(finishErr) { + done(err || finishErr); + }); + } + ); }); }); }); diff --git a/test/acceptance/ported/multilayer.js b/test/acceptance/ported/multilayer.js index 7e9b984c..eb337070 100644 --- a/test/acceptance/ported/multilayer.js +++ b/test/acceptance/ported/multilayer.js @@ -117,7 +117,8 @@ describe('multilayer', function() { assert.equal(res.statusCode, 200, res.body); assert.equal(res.headers['content-type'], "image/png"); checkCORSHeaders(res); - assert.imageEqualsFile(res.body, './test/fixtures/test_bigpoint_red.png', IMAGE_EQUALS_TOLERANCE_PER_MIL, + var referenceImagePath = './test/fixtures/test_bigpoint_red.png'; + assert.imageBufferIsSimilarToFile(res.body, referenceImagePath, IMAGE_EQUALS_TOLERANCE_PER_MIL, function(err) { next(err); }); @@ -191,7 +192,8 @@ describe('multilayer', function() { }, {}, function(res) { assert.equal(res.statusCode, 200, res.body); assert.equal(res.headers['content-type'], "image/png"); - assert.imageEqualsFile(res.body, './test/acceptance/ported/fixtures/test_table_0_0_0_multilayer1.png', + var referenceImagePath = './test/acceptance/ported/fixtures/test_table_0_0_0_multilayer1.png'; + assert.imageBufferIsSimilarToFile(res.body, referenceImagePath, IMAGE_EQUALS_TOLERANCE_PER_MIL, function(err) { next(err); }); @@ -302,7 +304,8 @@ describe('multilayer', function() { }, {}, function(res) { assert.equal(res.statusCode, 200, res.body); assert.equal(res.headers['content-type'], "image/png"); - assert.imageEqualsFile(res.body, './test/acceptance/ported/fixtures/test_table_0_0_0_multilayer1.png', + var referenceImagePath = './test/acceptance/ported/fixtures/test_table_0_0_0_multilayer1.png'; + assert.imageBufferIsSimilarToFile(res.body, referenceImagePath, IMAGE_EQUALS_TOLERANCE_PER_MIL, function(err) { next(err); }); @@ -425,7 +428,8 @@ describe('multilayer', function() { }, {}, function(res) { assert.equal(res.statusCode, 200, res.body); assert.equal(res.headers['content-type'], "image/png"); - assert.imageEqualsFile(res.body, './test/acceptance/ported/fixtures/test_table_0_0_0_multilayer1.png', + var referenceImagePath = './test/acceptance/ported/fixtures/test_table_0_0_0_multilayer1.png'; + assert.imageBufferIsSimilarToFile(res.body, referenceImagePath, IMAGE_EQUALS_TOLERANCE_PER_MIL, function(err) { next(err); }); @@ -541,7 +545,8 @@ describe('multilayer', function() { }, {}, function(res) { assert.equal(res.statusCode, 200, res.body); assert.equal(res.headers['content-type'], "image/png"); - assert.imageEqualsFile(res.body, './test/acceptance/ported/fixtures/test_table_0_0_0_multilayer1.png', + var referenceImagePath = './test/acceptance/ported/fixtures/test_table_0_0_0_multilayer1.png'; + assert.imageBufferIsSimilarToFile(res.body, referenceImagePath, IMAGE_EQUALS_TOLERANCE_PER_MIL, function(err) { next(err); }); @@ -727,7 +732,8 @@ describe('multilayer', function() { }, {}, function(res) { assert.equal(res.statusCode, 200, res.body); assert.equal(res.headers['content-type'], "image/png"); - assert.imageEqualsFile(res.body, './test/acceptance/ported/fixtures/test_table_0_0_0_multilayer2.png', + var referenceImagePath = './test/acceptance/ported/fixtures/test_table_0_0_0_multilayer2.png'; + assert.imageBufferIsSimilarToFile(res.body, referenceImagePath, IMAGE_EQUALS_TOLERANCE_PER_MIL, function(err) { next(err); }); @@ -761,7 +767,8 @@ describe('multilayer', function() { }, {}, function(res) { assert.equal(res.statusCode, 200, res.body); assert.equal(res.headers['content-type'], "image/png"); - assert.imageEqualsFile(res.body, './test/acceptance/ported/fixtures/test_table_0_0_0_multilayer3.png', + var referenceImagePath = './test/acceptance/ported/fixtures/test_table_0_0_0_multilayer3.png'; + assert.imageBufferIsSimilarToFile(res.body, referenceImagePath, IMAGE_EQUALS_TOLERANCE_PER_MIL, function(err) { next(err); }); @@ -856,7 +863,8 @@ describe('multilayer', function() { }, {}, function(res) { assert.equal(res.statusCode, 200, res.body); assert.equal(res.headers['content-type'], "image/png"); - assert.imageEqualsFile(res.body, './test/acceptance/ported/fixtures/test_table_0_0_0_multilayer4.png', + var referenceImagePath = './test/acceptance/ported/fixtures/test_table_0_0_0_multilayer4.png'; + assert.imageBufferIsSimilarToFile(res.body, referenceImagePath, IMAGE_EQUALS_TOLERANCE_PER_MIL, function(err) { next(err); }); @@ -1259,7 +1267,7 @@ describe('multilayer', function() { assert.equal(res.statusCode, 200, res.body); assert.equal(res.headers['content-type'], "image/png"); checkCORSHeaders(res); - assert.imageEqualsFile(res.body, './test/fixtures/test_bigpoint_red.png', + assert.imageBufferIsSimilarToFile(res.body, './test/fixtures/test_bigpoint_red.png', IMAGE_EQUALS_TOLERANCE_PER_MIL, function(err) { next(err); }); diff --git a/test/acceptance/ported/raster.js b/test/acceptance/ported/raster.js index 00d34509..cd3d43b9 100644 --- a/test/acceptance/ported/raster.js +++ b/test/acceptance/ported/raster.js @@ -87,7 +87,7 @@ describe('raster', function() { assert.equal(res.statusCode, 200, res.body); assert.deepEqual(res.headers['content-type'], "image/png"); var next = this; - assert.imageEqualsFile(res.body, + assert.imageBufferIsSimilarToFile(res.body, './test/fixtures/raster_gray_rect.png', IMAGE_EQUALS_TOLERANCE_PER_MIL, function(err) { try { diff --git a/test/acceptance/ported/server_gettile.js b/test/acceptance/ported/server_gettile.js index 7dad9aa3..580e8a61 100644 --- a/test/acceptance/ported/server_gettile.js +++ b/test/acceptance/ported/server_gettile.js @@ -34,7 +34,9 @@ describe('server_gettile', function() { if (err) { return done(err); } - assert.imageEqualsFile(res.body, './test/fixtures/' + fixture, IMAGE_EQUALS_TOLERANCE_PER_MIL, done); + assert.imageBufferIsSimilarToFile( + res.body, './test/fixtures/' + fixture, IMAGE_EQUALS_TOLERANCE_PER_MIL, done + ); }; } @@ -113,12 +115,13 @@ describe('server_gettile', function() { assert.ok(res.headers.hasOwnProperty('x-windshaft-cache'), "Did not hit renderer cache on second time"); assert.ok(res.headers['x-windshaft-cache'] >= 0); - assert.imageEqualsFile(res.body, imageFixture, IMAGE_EQUALS_TOLERANCE_PER_MIL, function(err) { - - finish(function(finishErr) { - done(err || finishErr); - }); - }); + assert.imageBufferIsSimilarToFile(res.body, imageFixture, IMAGE_EQUALS_TOLERANCE_PER_MIL, + function(err) { + finish(function(finishErr) { + done(err || finishErr); + }); + } + ); }); }); }); diff --git a/test/acceptance/ported/torque_png.js b/test/acceptance/ported/torque_png.js index fef2c621..69eaadab 100644 --- a/test/acceptance/ported/torque_png.js +++ b/test/acceptance/ported/torque_png.js @@ -83,10 +83,12 @@ describe('torque png renderer', function() { var zxy = [z, x, y]; it('tile ' + zxy.join('/') + '.torque.png', function (done) { testClient.getTileLayer(torquePngPointsMapConfig, tileRequest, function(err, res) { - assert.imageEqualsFile(res.body, torquePngFixture(zxy), IMAGE_TOLERANCE_PER_MIL, function(err) { - assert.ok(!err); - done(); - }); + assert.imageBufferIsSimilarToFile(res.body, torquePngFixture(zxy), IMAGE_TOLERANCE_PER_MIL, + function(err) { + assert.ok(!err); + done(); + } + ); }); }); }); diff --git a/test/acceptance/ported/wrap.js b/test/acceptance/ported/wrap.js index 1f46b5c3..64a8e2f4 100644 --- a/test/acceptance/ported/wrap.js +++ b/test/acceptance/ported/wrap.js @@ -107,10 +107,12 @@ describe('wrap x coordinate', function() { var fixtureZxy = [testScenario.fixture.z, testScenario.fixture.x, testScenario.fixture.y]; it('tile all/' + zxy.join('/') + '.png', function (done) { testClient.getTileLayer(plainTorqueMapConfig(testScenario.plainColor), tileRequest, function(err, res) { - assert.imageEqualsFile(res.body, blendPngFixture(fixtureZxy), IMG_TOLERANCE_PER_MIL, function(err) { - assert.ok(!err); - done(); - }); + assert.imageBufferIsSimilarToFile(res.body, blendPngFixture(fixtureZxy), IMG_TOLERANCE_PER_MIL, + function(err) { + assert.ok(!err); + done(); + } + ); }); }); }); diff --git a/test/support/assert.js b/test/support/assert.js index 7cb363d1..36203d16 100644 --- a/test/support/assert.js +++ b/test/support/assert.js @@ -21,7 +21,7 @@ var assert = module.exports = exports = require('assert'); * @param {function} callback Will call to home with null in case there is no error, otherwise with the error itself * @see FUZZY in http://www.imagemagick.org/script/command-line-options.php#metric */ -assert.imageEqualsFile = function(buffer, referenceImageRelativeFilePath, tolerance, callback) { +assert.imageBufferIsSimilarToFile = function(buffer, referenceImageRelativeFilePath, tolerance, callback) { callback = callback || function(err) { assert.ifError(err); }; var referenceImageFilePath = path.resolve(referenceImageRelativeFilePath); From 2393a611a80e35da8ef512fb73cc833fc95b5441 Mon Sep 17 00:00:00 2001 From: Raul Ochoa Date: Mon, 22 Feb 2016 16:41:55 +0100 Subject: [PATCH 12/16] dry --- test/support/assert.js | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/test/support/assert.js b/test/support/assert.js index 36203d16..a53d6fbf 100644 --- a/test/support/assert.js +++ b/test/support/assert.js @@ -25,11 +25,9 @@ assert.imageBufferIsSimilarToFile = function(buffer, referenceImageRelativeFileP callback = callback || function(err) { assert.ifError(err); }; var referenceImageFilePath = path.resolve(referenceImageRelativeFilePath); + var referenceImageBuffer = fs.readFileSync(referenceImageFilePath, { encoding: null }); - var testImage = mapnik.Image.fromBytes(Buffer.isBuffer(buffer) ? buffer : new Buffer(buffer, 'binary')); - var referenceImage = mapnik.Image.fromBytes(fs.readFileSync(referenceImageFilePath, { encoding: null })); - - imagesAreSimilar(testImage, referenceImage, tolerance, callback); + assert.imageBuffersAreSimilar(buffer, referenceImageBuffer, tolerance, callback); }; assert.imageBuffersAreSimilar = function(bufferA, bufferB, tolerance, callback) { From 4c06c9ade432b8661eacf0cdcac7dabf2420e93b Mon Sep 17 00:00:00 2001 From: Raul Ochoa Date: Mon, 22 Feb 2016 16:43:43 +0100 Subject: [PATCH 13/16] Remove imagemagick reference from install instructions --- INSTALL.md | 4 ---- 1 file changed, 4 deletions(-) diff --git a/INSTALL.md b/INSTALL.md index cfb6cfc4..751c5ef8 100644 --- a/INSTALL.md +++ b/INSTALL.md @@ -16,10 +16,6 @@ Make sure that you have the requirements needed. These are - CartoDB 0.9.5+ (for `CDB_QueryTables`) - Varnish (http://www.varnish-cache.org) -- For running the testsuite - - ImageMagick (http://www.imagemagick.org) - - On Ubuntu 14.04 the dependencies can be installed with ```shell From dd8340b400d29aacabcd10985e4c914ac03dcd4e Mon Sep 17 00:00:00 2001 From: Raul Ochoa Date: Mon, 22 Feb 2016 17:51:53 +0100 Subject: [PATCH 14/16] Do not leak redis connections Reuse redis client in afterEach and quit client in function --- test/support/test_helper.js | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/test/support/test_helper.js b/test/support/test_helper.js index e44916fd..e1e64cbc 100644 --- a/test/support/test_helper.js +++ b/test/support/test_helper.js @@ -66,6 +66,14 @@ function checkSurrogateKey(res, expectedKey) { assert.equal(res.headers['surrogate-key'], expectedKey); } +var redisClient; + +beforeEach(function() { + if (!redisClient) { + redisClient = redis.createClient(global.environment.redis.port); + } +}); + //global afterEach to capture test suites that leave keys in redis afterEach(function(done) { @@ -102,7 +110,6 @@ afterEach(function(done) { } Object.keys(databasesTasks).forEach(function(db) { - var redisClient = redis.createClient(global.environment.redis.port); redisClient.select(db, function() { // Check that we start with an empty redis db redisClient.keys("*", function(err, keys) { @@ -129,6 +136,7 @@ function deleteRedisKeys(keysToDelete, callback) { var redisClient = redis.createClient(global.environment.redis.port); redisClient.select(keysToDelete[k], function() { redisClient.del(k, function(err, deletedKeysCount) { + redisClient.quit(); assert.notStrictEqual(deletedKeysCount, 0, 'No KEYS deleted for: [db=' + keysToDelete[k] + ']' + k); taskDone(k); }); From ce8c21261f95fbfa7bce6af44b84bdbbc86074e9 Mon Sep 17 00:00:00 2001 From: Raul Ochoa Date: Mon, 22 Feb 2016 18:00:58 +0100 Subject: [PATCH 15/16] Release 2.25.2 --- NEWS.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/NEWS.md b/NEWS.md index baf2cf05..04e7bd44 100644 --- a/NEWS.md +++ b/NEWS.md @@ -2,7 +2,7 @@ ## 2.25.2 -Released 2016-mm-dd +Released 2016-02-22 Bug fixes: - Correct URLs for widgets in named maps #381 From 2ac297441411859a714ef192393d9d159cc5b900 Mon Sep 17 00:00:00 2001 From: Raul Ochoa Date: Mon, 22 Feb 2016 18:02:29 +0100 Subject: [PATCH 16/16] Stubs next version --- NEWS.md | 3 +++ npm-shrinkwrap.json | 2 +- package.json | 2 +- 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/NEWS.md b/NEWS.md index 04e7bd44..656b77ed 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,5 +1,8 @@ # Changelog +## 2.25.3 + + ## 2.25.2 Released 2016-02-22 diff --git a/npm-shrinkwrap.json b/npm-shrinkwrap.json index db22e40f..e52626d9 100644 --- a/npm-shrinkwrap.json +++ b/npm-shrinkwrap.json @@ -1,6 +1,6 @@ { "name": "windshaft-cartodb", - "version": "2.25.2", + "version": "2.25.3", "dependencies": { "body-parser": { "version": "1.14.2", diff --git a/package.json b/package.json index 02932538..93d2ba7a 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "private": true, "name": "windshaft-cartodb", - "version": "2.25.2", + "version": "2.25.3", "description": "A map tile server for CartoDB", "keywords": [ "cartodb"