From d52b65470e701976514d9e727013cd9e3db13192 Mon Sep 17 00:00:00 2001 From: Raul Ochoa Date: Tue, 7 Jul 2015 23:46:58 +0200 Subject: [PATCH] Ports acceptance tests from windshaft --- Makefile | 7 +- lib/cartodb/models/layergroup_token.js | 29 + test/acceptance/ported/attributes.js | 311 + test/acceptance/ported/blend.js | 92 + test/acceptance/ported/blend_filtering.js | 158 + test/acceptance/ported/blend_http_fallback.js | 140 + test/acceptance/ported/blend_http_timeout.js | 82 + test/acceptance/ported/external_resources.js | 132 + ...t_table_0_0_0_multilayer1.layer0.grid.json | 1 + ...t_table_0_0_0_multilayer1.layer1.grid.json | 1 + .../fixtures/test_table_0_0_0_multilayer1.png | Bin 0 -> 1294 bytes test/acceptance/ported/limits.js | 89 + test/acceptance/ported/multilayer.js | 1461 ++++ .../ported/multilayer_error_cases.js | 445 + .../ported/multilayer_interactivity.js | 373 + test/acceptance/ported/raster.js | 159 + test/acceptance/ported/regressions.js | 159 + test/acceptance/ported/retina.js | 126 + test/acceptance/ported/server.js | 197 + test/acceptance/ported/server_gettile.js | 295 + test/acceptance/ported/server_png8_format.js | 175 + test/acceptance/ported/static_maps.js | 146 + .../ported/support/ported_server_options.js | 77 + test/acceptance/ported/support/test_client.js | 467 ++ test/acceptance/ported/torque.js | 434 + test/acceptance/ported/torque_boundaries.js | 446 + test/acceptance/ported/torque_png.js | 142 + test/acceptance/ported/torque_zero_zero.js | 84 + test/acceptance/ported/wrap.js | 118 + .../blend-filtering-layers-0.1-zxy-1.0.0.png | Bin 0 -> 15100 bytes .../blend-filtering-layers-0.2-zxy-1.0.0.png | Bin 0 -> 22124 bytes .../blend-filtering-layers-0.3-zxy-1.0.0.png | Bin 0 -> 16641 bytes .../blend-filtering-layers-1.2-zxy-1.0.0.png | Bin 0 -> 34042 bytes ...end-filtering-layers-1.2.3.4-zxy-1.0.0.png | Bin 0 -> 15100 bytes ...blend-filtering-layers-1.2.5-zxy-1.0.0.png | Bin 0 -> 31845 bytes .../blend-filtering-layers-1.3-zxy-1.0.0.png | Bin 0 -> 25379 bytes .../blend-filtering-layers-2.1-zxy-1.0.0.png | Bin 0 -> 34042 bytes .../blend-filtering-layers-2.2-zxy-1.0.0.png | Bin 0 -> 20689 bytes .../blend/blend-plain-torque-2.1.1.png | Bin 0 -> 16930 bytes .../blend/blend-plain-torque-2.2.1.png | Bin 0 -> 32520 bytes .../blend-layers-0.3-zxy-1.0.0.png | Bin 0 -> 857 bytes .../blend-layers-0.4-zxy-1.0.0.png | Bin 0 -> 22124 bytes .../blend-layers-1.2-zxy-1.0.0.png | Bin 0 -> 11126 bytes .../blend-layers-1.3-zxy-1.0.0.png | Bin 0 -> 15100 bytes .../blend-layers-2.3-zxy-1.0.0.png | Bin 0 -> 11126 bytes .../blend-layers-3.4-zxy-1.0.0.png | Bin 0 -> 20690 bytes .../blend-layers-all-zxy-1.0.0.png | Bin 0 -> 24959 bytes test/fixtures/http/basemap.png | Bin 0 -> 10618 bytes test/fixtures/http/dark_nolabels-1-0-0.png | Bin 0 -> 7281 bytes test/fixtures/http/light_nolabels-1-0-0.png | Bin 0 -> 9864 bytes test/fixtures/limits/fallback.png | Bin 0 -> 10177 bytes test/fixtures/markers/circle.svg | 5 + test/fixtures/markers/square.svg | 5 + test/fixtures/raster_gray_rect.png | Bin 0 -> 176 bytes test/fixtures/test_bigpoint_red.png | Bin 0 -> 2243 bytes test/fixtures/test_default_mapnik_point.png | Bin 0 -> 348 bytes .../fixtures/test_table_0_0_0_multilayer2.png | Bin 0 -> 1085 bytes .../fixtures/test_table_0_0_0_multilayer3.png | Bin 0 -> 582 bytes .../fixtures/test_table_0_0_0_multilayer4.png | Bin 0 -> 895 bytes .../test_table_13_4011_3088.grid.json | 1 + test/fixtures/test_table_13_4011_3088.png | Bin 0 -> 3275 bytes .../test_table_13_4011_3088_empty.grid.json | 2 + .../test_table_13_4011_3088_limit_2.grid.json | 1 + .../test_table_13_4011_3088_limit_2.png | Bin 0 -> 1672 bytes .../test_table_13_4011_3088_styled.png | Bin 0 -> 1563 bytes .../fixtures/test_table_13_4011_3088_svg1.png | Bin 0 -> 1957 bytes .../fixtures/test_table_13_4011_3088_svg2.png | Bin 0 -> 759 bytes .../populated_places_simple_reduced-2.1.1.png | Bin 0 -> 19256 bytes .../populated_places_simple_reduced-2.2.1.png | Bin 0 -> 38749 bytes test/support/prepare_db.sh | 13 + .../populated_places_simple_reduced.sql | 7385 +++++++++++++++++ test/support/sql/windshaft.test.sql | 21 + 72 files changed, 13778 insertions(+), 1 deletion(-) create mode 100644 lib/cartodb/models/layergroup_token.js create mode 100644 test/acceptance/ported/attributes.js create mode 100644 test/acceptance/ported/blend.js create mode 100644 test/acceptance/ported/blend_filtering.js create mode 100644 test/acceptance/ported/blend_http_fallback.js create mode 100644 test/acceptance/ported/blend_http_timeout.js create mode 100644 test/acceptance/ported/external_resources.js create mode 100644 test/acceptance/ported/fixtures/test_table_0_0_0_multilayer1.layer0.grid.json create mode 100644 test/acceptance/ported/fixtures/test_table_0_0_0_multilayer1.layer1.grid.json create mode 100644 test/acceptance/ported/fixtures/test_table_0_0_0_multilayer1.png create mode 100644 test/acceptance/ported/limits.js create mode 100644 test/acceptance/ported/multilayer.js create mode 100644 test/acceptance/ported/multilayer_error_cases.js create mode 100644 test/acceptance/ported/multilayer_interactivity.js create mode 100644 test/acceptance/ported/raster.js create mode 100644 test/acceptance/ported/regressions.js create mode 100644 test/acceptance/ported/retina.js create mode 100644 test/acceptance/ported/server.js create mode 100644 test/acceptance/ported/server_gettile.js create mode 100644 test/acceptance/ported/server_png8_format.js create mode 100644 test/acceptance/ported/static_maps.js create mode 100644 test/acceptance/ported/support/ported_server_options.js create mode 100644 test/acceptance/ported/support/test_client.js create mode 100644 test/acceptance/ported/torque.js create mode 100644 test/acceptance/ported/torque_boundaries.js create mode 100644 test/acceptance/ported/torque_png.js create mode 100644 test/acceptance/ported/torque_zero_zero.js create mode 100644 test/acceptance/ported/wrap.js create mode 100644 test/fixtures/blend/blend-filtering-layers-0.1-zxy-1.0.0.png create mode 100644 test/fixtures/blend/blend-filtering-layers-0.2-zxy-1.0.0.png create mode 100644 test/fixtures/blend/blend-filtering-layers-0.3-zxy-1.0.0.png create mode 100644 test/fixtures/blend/blend-filtering-layers-1.2-zxy-1.0.0.png create mode 100644 test/fixtures/blend/blend-filtering-layers-1.2.3.4-zxy-1.0.0.png create mode 100644 test/fixtures/blend/blend-filtering-layers-1.2.5-zxy-1.0.0.png create mode 100644 test/fixtures/blend/blend-filtering-layers-1.3-zxy-1.0.0.png create mode 100644 test/fixtures/blend/blend-filtering-layers-2.1-zxy-1.0.0.png create mode 100644 test/fixtures/blend/blend-filtering-layers-2.2-zxy-1.0.0.png create mode 100644 test/fixtures/blend/blend-plain-torque-2.1.1.png create mode 100644 test/fixtures/blend/blend-plain-torque-2.2.1.png create mode 100644 test/fixtures/blend/http_fallback/blend-layers-0.3-zxy-1.0.0.png create mode 100644 test/fixtures/blend/http_fallback/blend-layers-0.4-zxy-1.0.0.png create mode 100644 test/fixtures/blend/http_fallback/blend-layers-1.2-zxy-1.0.0.png create mode 100644 test/fixtures/blend/http_fallback/blend-layers-1.3-zxy-1.0.0.png create mode 100644 test/fixtures/blend/http_fallback/blend-layers-2.3-zxy-1.0.0.png create mode 100644 test/fixtures/blend/http_fallback/blend-layers-3.4-zxy-1.0.0.png create mode 100644 test/fixtures/blend/http_fallback/blend-layers-all-zxy-1.0.0.png create mode 100644 test/fixtures/http/basemap.png create mode 100644 test/fixtures/http/dark_nolabels-1-0-0.png create mode 100644 test/fixtures/http/light_nolabels-1-0-0.png create mode 100644 test/fixtures/limits/fallback.png create mode 100644 test/fixtures/markers/circle.svg create mode 100644 test/fixtures/markers/square.svg create mode 100644 test/fixtures/raster_gray_rect.png create mode 100644 test/fixtures/test_bigpoint_red.png create mode 100644 test/fixtures/test_default_mapnik_point.png create mode 100644 test/fixtures/test_table_0_0_0_multilayer2.png create mode 100644 test/fixtures/test_table_0_0_0_multilayer3.png create mode 100644 test/fixtures/test_table_0_0_0_multilayer4.png create mode 100644 test/fixtures/test_table_13_4011_3088.grid.json create mode 100644 test/fixtures/test_table_13_4011_3088.png create mode 100644 test/fixtures/test_table_13_4011_3088_empty.grid.json create mode 100644 test/fixtures/test_table_13_4011_3088_limit_2.grid.json create mode 100644 test/fixtures/test_table_13_4011_3088_limit_2.png create mode 100644 test/fixtures/test_table_13_4011_3088_styled.png create mode 100644 test/fixtures/test_table_13_4011_3088_svg1.png create mode 100644 test/fixtures/test_table_13_4011_3088_svg2.png create mode 100644 test/fixtures/torque/populated_places_simple_reduced-2.1.1.png create mode 100644 test/fixtures/torque/populated_places_simple_reduced-2.2.1.png create mode 100644 test/support/sql/ported/populated_places_simple_reduced.sql diff --git a/Makefile b/Makefile index 2aa59a6a..f8c485c7 100644 --- a/Makefile +++ b/Makefile @@ -27,6 +27,11 @@ test: config/environments/test.js test/acceptance/*.js \ test/acceptance/cache/*.js +test-ported: config/environments/test.js + @echo "***tests ported***" + @$(SHELL) ./run_tests.sh ${RUNTESTFLAGS} \ + test/acceptance/ported/*.js + test-unit: config/environments/test.js @echo "***tests***" @$(SHELL) ./run_tests.sh ${RUNTESTFLAGS} \ @@ -48,7 +53,7 @@ jshint: @echo "***jshint***" @./node_modules/.bin/jshint lib/ test/ app.js -test-all: jshint test +test-all: jshint test test-ported coverage: @RUNTESTFLAGS=--with-coverage make test diff --git a/lib/cartodb/models/layergroup_token.js b/lib/cartodb/models/layergroup_token.js new file mode 100644 index 00000000..67691bf6 --- /dev/null +++ b/lib/cartodb/models/layergroup_token.js @@ -0,0 +1,29 @@ +/** + * @param {String} token might match the following pattern: {user}@{tpl_id}@{token}:{cache_buster} + */ +function parse(token) { + var signer, cacheBuster; + + var tokenSplit = token.split(':'); + + token = tokenSplit[0]; + if (tokenSplit.length > 1) { + cacheBuster = tokenSplit[1]; + } + + tokenSplit = token.split('@'); + if ( tokenSplit.length > 1 ) { + signer = tokenSplit.shift(); + if ( tokenSplit.length > 1 ) { + /*var template_hash = */tokenSplit.shift(); // unused + } + token = tokenSplit.shift(); + } + + return { + token: token, + signer: signer, + cacheBuster: cacheBuster + }; +} +module.exports.parse = parse; diff --git a/test/acceptance/ported/attributes.js b/test/acceptance/ported/attributes.js new file mode 100644 index 00000000..6c9f9c1c --- /dev/null +++ b/test/acceptance/ported/attributes.js @@ -0,0 +1,311 @@ +require('../../support/test_helper'); + +var assert = require('../../support/assert'); +var redis = require('redis'); +var step = require('step'); +var cartodbServer = require('../../../lib/cartodb/server'); +var PortedServerOptions = require('./support/ported_server_options'); + +describe('attributes', function() { + + var server = cartodbServer(PortedServerOptions); + server.req2params = PortedServerOptions.req2params; + server.setMaxListeners(0); + var redis_client = redis.createClient(PortedServerOptions.redis.port); + + var test_mapconfig_1 = { + version: '1.1.0', + layers: [ + { type: 'mapnik', options: { + sql: "select 1 as id, 'SRID=4326;POINT(0 0)'::geometry as the_geom", + cartocss: '#style { }', + cartocss_version: '2.0.1' + } }, + { type: 'mapnik', options: { + sql: "select 1 as i, 6 as n, 'SRID=4326;POINT(0 0)'::geometry as the_geom", + attributes: { id:'i', columns: ['n'] }, + cartocss: '#style { }', + cartocss_version: '2.0.1' + } } + ] + }; + + function checkCORSHeaders(res) { + assert.equal( + res.headers['access-control-allow-headers'], + 'X-Requested-With, X-Prototype-Version, X-CSRF-Token' + ); + assert.equal(res.headers['access-control-allow-origin'], '*'); + } + + it("can only be fetched from layer having an attributes spec", function(done) { + + var expected_token; + step( + function do_post() + { + var next = this; + assert.response(server, { + url: '/database/windshaft_test/layergroup', + method: 'POST', + headers: {'Content-Type': 'application/json' }, + data: JSON.stringify(test_mapconfig_1) + }, {}, function(res, err) { next(err, res); }); + }, + function checkPost(err, res) { + assert.ifError(err); + assert.equal(res.statusCode, 200, res.statusCode + ': ' + res.body); + // CORS headers should be sent with response + // from layergroup creation via POST + checkCORSHeaders(res); + var parsedBody = JSON.parse(res.body); + if ( expected_token ) { + assert.deepEqual(parsedBody, {layergroupid: expected_token, layercount: 2}); + } else { + expected_token = parsedBody.layergroupid; + } + return null; + }, + function do_get_attr_0(err) + { + assert.ifError(err); + var next = this; + assert.response(server, { + url: '/database/windshaft_test/layergroup/' + expected_token + '/0/attributes/1', + method: 'GET' + }, {}, function(res, err) { next(err, res); }); + }, + function check_error_0(err, res) { + assert.ifError(err); + assert.equal( + res.statusCode, + 400, + res.statusCode + ( res.statusCode !== 200 ? (': ' + res.body) : '' ) + ); + var parsed = JSON.parse(res.body); + assert.equal(parsed.errors[0], "Layer 0 has no exposed attributes"); + return null; + }, + function do_get_attr_1(err) + { + assert.ifError(err); + var next = this; + assert.response(server, { + url: '/database/windshaft_test/layergroup/' + expected_token + '/1/attributes/1', + method: 'GET' + }, {}, function(res, err) { next(err, res); }); + }, + function check_attr_1(err, res) { + assert.ifError(err); + assert.equal(res.statusCode, 200, res.statusCode + ': ' + res.body); + var parsed = JSON.parse(res.body); + assert.deepEqual(parsed, {"n":6}); + return null; + }, + function do_get_attr_1_404(err) + { + assert.ifError(err); + var next = this; + assert.response(server, { + url: '/database/windshaft_test/layergroup/' + expected_token + '/1/attributes/-666', + method: 'GET' + }, {}, function(res, err) { next(err, res); }); + }, + function check_attr_1_404(err, res) { + assert.ifError(err); + assert.equal(res.statusCode, 404, res.statusCode + ': ' + res.body); + var parsed = JSON.parse(res.body); + assert.ok(parsed.errors); + var msg = parsed.errors[0]; + assert.ok(msg.match(/0 features.*identified by fid -666/), msg); + return null; + }, + function finish(err) { + var errors = []; + if ( err ) { + errors.push(''+err); + } + redis_client.exists("map_cfg|" + expected_token, function(err/*, exists*/) { + if ( err ) { + errors.push(err.message); + } + //assert.ok(exists, "Missing expected token " + expected_token + " from redis"); + redis_client.del("map_cfg|" + expected_token, function(err) { + if ( err ) { + errors.push(err.message); + } + if ( errors.length ) { + done(new Error(errors)); + } else { + done(null); + } + }); + }); + } + ); + }); + + // See https://github.com/CartoDB/Windshaft/issues/131 + it("are checked at map creation time", function(done) { + + // clone the mapconfig test + var mapconfig = JSON.parse(JSON.stringify(test_mapconfig_1)); + // append unexistant attribute name + mapconfig.layers[1].options.sql = 'SELECT * FROM test_table'; + mapconfig.layers[1].options.attributes.id = 'unexistant'; + mapconfig.layers[1].options.attributes.columns = ['cartodb_id']; + + step( + function do_post() + { + var next = this; + assert.response(server, { + url: '/database/windshaft_test/layergroup', + method: 'POST', + headers: {'Content-Type': 'application/json' }, + data: JSON.stringify(mapconfig) + }, {}, function(res, err) { next(err, res); }); + }, + function checkPost(err, res) { + assert.ifError(err); + assert.equal(res.statusCode, 404, res.statusCode + ': ' + (res.statusCode===200?'...':res.body)); + var parsed = JSON.parse(res.body); + assert.ok(parsed.errors); + assert.equal(parsed.errors.length, 1); + var msg = parsed.errors[0]; + assert.equal(msg, 'column "unexistant" does not exist'); + return null; + }, + function finish(err) { + done(err); + } + ); + }); + + it("can be used with jsonp", function(done) { + + var expected_token; + step( + function do_post() + { + var next = this; + assert.response(server, { + url: '/database/windshaft_test/layergroup', + method: 'POST', + headers: {'Content-Type': 'application/json' }, + data: JSON.stringify(test_mapconfig_1) + }, {}, function(res, err) { next(err, res); }); + }, + function checkPost(err, res) { + assert.ifError(err); + assert.equal(res.statusCode, 200, res.statusCode + ': ' + res.body); + // CORS headers should be sent with response + // from layergroup creation via POST + checkCORSHeaders(res); + var parsedBody = JSON.parse(res.body); + if ( expected_token ) { + assert.deepEqual(parsedBody, {layergroupid: expected_token, layercount: 2}); + } else { + expected_token = parsedBody.layergroupid; + } + return null; + }, + function do_get_attr_0(err) + { + assert.ifError(err); + var next = this; + assert.response(server, { + url: '/database/windshaft_test/layergroup/' + expected_token + + '/0/attributes/1?callback=test', + method: 'GET' + }, {}, function(res, err) { next(err, res); }); + }, + function check_error_0(err, res) { + assert.ifError(err); + // jsonp errors should be returned with HTTP status 200 + assert.equal(res.statusCode, 200, res.statusCode + ': ' + res.body); + assert.equal(res.body, 'test({"errors":["Layer 0 has no exposed attributes"]});'); + return null; + }, + function do_get_attr_1(err) + { + assert.ifError(err); + var next = this; + assert.response(server, { + url: '/database/windshaft_test/layergroup/' + expected_token + '/1/attributes/1', + method: 'GET' + }, {}, function(res, err) { next(err, res); }); + }, + function check_attr_1(err, res) { + assert.ifError(err); + assert.equal(res.statusCode, 200, res.statusCode + ': ' + res.body); + var parsed = JSON.parse(res.body); + assert.deepEqual(parsed, {"n":6}); + return null; + }, + function finish(err) { + var errors = []; + if ( err ) { + errors.push(''+err); + } + redis_client.exists("map_cfg|" + expected_token, function(err/*, exists*/) { + if ( err ) { + errors.push(err.message); + } + //assert.ok(exists, "Missing expected token " + expected_token + " from redis"); + redis_client.del("map_cfg|" + expected_token, function(err) { + if ( err ) { + errors.push(err.message); + } + if ( errors.length ) { + done(new Error(errors)); + } else { + done(null); + } + }); + }); + } + ); + }); + + // Test that you cannot write to the database from an attributes tile request + // + // Test for http://github.com/CartoDB/Windshaft/issues/130 + // + it("database access is read-only", function(done) { + + // clone the mapconfig test + var mapconfig = JSON.parse(JSON.stringify(test_mapconfig_1)); + mapconfig.layers[1].options.sql += + ", test_table_inserter(st_setsrid(st_point(0,0),4326),'write') as w"; + mapconfig.layers[1].options.attributes.columns.push('w'); + + step( + function do_post() + { + var next = this; + assert.response(server, { + url: '/database/windshaft_test/layergroup', + method: 'POST', + headers: {'Content-Type': 'application/json' }, + data: JSON.stringify(mapconfig) + }, {}, function(res, err) { next(err, res); }); + }, + function checkPost(err, res) { + assert.ifError(err); + // TODO: should be 403 Forbidden + assert.equal(res.statusCode, 400, res.statusCode + ': ' + (res.statusCode===200?'...':res.body)); + var parsed = JSON.parse(res.body); + assert.ok(parsed.errors); + assert.equal(parsed.errors.length, 1); + var msg = parsed.errors[0]; + assert.equal(msg, "cannot execute INSERT in a read-only transaction"); + return null; + }, + function finish(err) { + done(err); + } + ); + }); + +}); diff --git a/test/acceptance/ported/blend.js b/test/acceptance/ported/blend.js new file mode 100644 index 00000000..11f971bb --- /dev/null +++ b/test/acceptance/ported/blend.js @@ -0,0 +1,92 @@ +require('../../support/test_helper'); + +var assert = require('../../support/assert'); +var testClient = require('./support/test_client'); + +describe('blend png renderer', function() { + + var IMAGE_TOLERANCE_PER_MIL = 20; + + function plainTorqueMapConfig(plainColor) { + return { + version: '1.2.0', + layers: [ + { + type: 'plain', + options: { + color: plainColor + } + }, + { + type: 'torque', + options: { + sql: "SELECT * FROM populated_places_simple_reduced " + + "where the_geom && ST_MakeEnvelope(-90, 0, 90, 65)", + cartocss: [ + 'Map {', + ' buffer-size:0;', + ' -torque-frame-count:1;', + ' -torque-animation-duration:30;', + ' -torque-time-attribute:"cartodb_id";', + ' -torque-aggregation-function:"count(cartodb_id)";', + ' -torque-resolution:1;', + ' -torque-data-aggregation:linear;', + '}', + '#populated_places_simple_reduced{', + ' comp-op: multiply;', + ' marker-fill-opacity: 1;', + ' marker-line-color: #FFF;', + ' marker-line-width: 0;', + ' marker-line-opacity: 1;', + ' marker-type: rectangle;', + ' marker-width: 3;', + ' marker-fill: #FFCC00;', + '}' + ].join(' '), + cartocss_version: '2.3.0' + } + } + ] + }; + } + + var testScenarios = [ + { + tile: { + z: 2, + x: 2, + y: 1, + layer: 'all', + format: 'png' + }, + plainColor: 'white' + }, + { + tile: { + z: 2, + x: 1, + y: 1, + layer: 'all', + format: 'png' + }, + plainColor: '#339900' + } + ]; + + function blendPngFixture(zxy) { + return './test/fixtures/blend/blend-plain-torque-' + zxy.join('.') + '.png'; + } + + testScenarios.forEach(function(testScenario) { + var tileRequest = testScenario.tile; + 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(); + }); + }); + }); + }); +}); diff --git a/test/acceptance/ported/blend_filtering.js b/test/acceptance/ported/blend_filtering.js new file mode 100644 index 00000000..46e35699 --- /dev/null +++ b/test/acceptance/ported/blend_filtering.js @@ -0,0 +1,158 @@ +require('../../support/test_helper'); + +var assert = require('../../support/assert'); +var testClient = require('./support/test_client'); +var fs = require('fs'); +var http = require('http'); + +describe('blend layer filtering', function() { + + var IMG_TOLERANCE_PER_MIL = 20; + + var httpRendererResourcesServer; + + before(function(done) { + // Start a server to test external resources + httpRendererResourcesServer = http.createServer( function(request, response) { + var filename = __dirname + '/../../fixtures/http/light_nolabels-1-0-0.png'; + fs.readFile(filename, {encoding: 'binary'}, function(err, file) { + response.writeHead(200); + response.write(file, "binary"); + response.end(); + }); + }); + httpRendererResourcesServer.listen(8033, done); + }); + + after(function(done) { + httpRendererResourcesServer.close(done); + }); + + var mapConfig = { + version: '1.2.0', + layers: [ + { + type: 'plain', + options: { + color: '#fabada' + } + }, + { + type: 'http', + options: { + urlTemplate: 'http://127.0.0.1:8033/{s}/{z}/{x}/{y}.png', + subdomains: ['abcd'] + } + }, + { + type: 'mapnik', + options: { + sql: 'SELECT * FROM populated_places_simple_reduced', + cartocss: '#layer { marker-fill:red; } #layer { marker-width: 2; }', + cartocss_version: '2.3.0', + geom_column: 'the_geom' + } + }, + { + type: 'torque', + options: { + sql: "SELECT * FROM populated_places_simple_reduced", + cartocss: [ + 'Map {', + ' buffer-size:0;', + ' -torque-frame-count:1;', + ' -torque-animation-duration:30;', + ' -torque-time-attribute:"cartodb_id";', + ' -torque-aggregation-function:"count(cartodb_id)";', + ' -torque-resolution:1;', + ' -torque-data-aggregation:linear;', + '}', + '#populated_places_simple_reduced{', + ' comp-op: multiply;', + ' marker-fill-opacity: 1;', + ' marker-line-color: #FFF;', + ' marker-line-width: 0;', + ' marker-line-opacity: 1;', + ' marker-type: rectangle;', + ' marker-width: 3;', + ' marker-fill: #FFCC00;', + '}' + ].join(' '), + cartocss_version: '2.3.0' + } + }, + { + type: 'http', + options: { + urlTemplate: 'http://127.0.0.1:8033/{s}/{z}/{x}/{y}.png', + subdomains: ['abcd'] + } + }, + { + type: 'torque', + options: { + sql: "SELECT * FROM populated_places_simple_reduced " + + "where the_geom && ST_MakeEnvelope(-90, 0, 90, 65)", + cartocss: [ + 'Map {', + ' buffer-size:0;', + ' -torque-frame-count:1;', + ' -torque-animation-duration:30;', + ' -torque-time-attribute:"cartodb_id";', + ' -torque-aggregation-function:"count(cartodb_id)";', + ' -torque-resolution:1;', + ' -torque-data-aggregation:linear;', + '}', + '#populated_places_simple_reduced{', + ' comp-op: multiply;', + ' marker-fill-opacity: 1;', + ' marker-line-color: #FFF;', + ' marker-line-width: 0;', + ' marker-line-opacity: 1;', + ' marker-type: rectangle;', + ' marker-width: 3;', + ' marker-fill: #FFCC00;', + '}' + ].join(' '), + cartocss_version: '2.3.0' + } + } + ] + }; + + var filteredLayersSuite = [ + [2, 2], + [0, 1], + [0, 2], + [1, 2], + [2, 1], // ordering doesn't matter + [0, 3], + [1, 3], + [1, 2, 5], + [1, 2, 3, 4] + ]; + + function blendPngFixture(layers) { + return './test/fixtures/blend/blend-filtering-layers-' + layers.join('.') + '-zxy-1.0.0.png'; + } + + filteredLayersSuite.forEach(function(filteredLayers) { + var layerFilter = filteredLayers.join(','); + var tileRequest = { + z: 1, + x: 0, + y: 0, + layer: layerFilter, + format: 'png' + }; + + 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(); + }); + }); + }); + }); +}); diff --git a/test/acceptance/ported/blend_http_fallback.js b/test/acceptance/ported/blend_http_fallback.js new file mode 100644 index 00000000..60fd5555 --- /dev/null +++ b/test/acceptance/ported/blend_http_fallback.js @@ -0,0 +1,140 @@ +require('../../support/test_helper'); + +var assert = require('../../support/assert'); +var testClient = require('./support/test_client'); +var fs = require('fs'); +var http = require('http'); + +describe('blend http fallback', function() { + + var IMG_TOLERANCE_PER_MIL = 20; + + var httpRendererResourcesServer; + + before(function(done) { + // Start a server to test external resources + httpRendererResourcesServer = http.createServer( function(request, response) { + if (request.url.match(/^\/error404\//)) { + response.writeHead(404); + response.end(); + } else { + var filename = __dirname + '/../../fixtures/http/light_nolabels-1-0-0.png'; + if (request.url.match(/^\/dark\//)) { + filename = __dirname + '/../../fixtures/http/dark_nolabels-1-0-0.png'; + } + fs.readFile(filename, {encoding: 'binary'}, function(err, file) { + response.writeHead(200); + response.write(file, "binary"); + response.end(); + }); + } + }); + httpRendererResourcesServer.listen(8033, done); + }); + + after(function(done) { + httpRendererResourcesServer.close(done); + }); + + var mapConfig = { + version: '1.2.0', + layers: [ + { + type: 'plain', // <- 0 + options: { + color: '#fabada' + } + }, + { + type: 'http', // <- 1 + options: { + urlTemplate: 'http://127.0.0.1:8033/{s}/{z}/{x}/{y}.png', + subdomains: ['light'] + } + }, + { + type: 'http', // <- 2 + options: { + urlTemplate: 'http://127.0.0.1:8033/{s}/{z}/{x}/{y}.png', + subdomains: ['dark'] + } + }, + { + type: 'http', // <- 3 + options: { + urlTemplate: 'http://127.0.0.1:8033/{s}/{z}/{x}/{y}.png', + subdomains: ['error404'] + } + }, + { + type: 'mapnik', // <- 4 + options: { + sql: 'SELECT * FROM populated_places_simple_reduced', + cartocss: '#layer { marker-fill:red; } #layer { marker-width: 2; }', + cartocss_version: '2.3.0', + geom_column: 'the_geom' + } + } + ] + }; + + var filteredLayersSuite = [ + ['all'], // layers displayed: 2 + 4, skipping 3 as it fails + [0, 4], + [0, 3], // skips layer 3 as it fails + [1, 2], + [1, 3], + [2, 3], + [3, 4] + ]; + + function blendPngFixture(layers) { + return './test/fixtures/blend/http_fallback/blend-layers-' + layers.join('.') + '-zxy-1.0.0.png'; + } + + filteredLayersSuite.forEach(function(filteredLayers) { + var layerFilter = filteredLayers.join(','); + var tileRequest = { + z: 1, + x: 0, + y: 0, + layer: layerFilter, + format: 'png' + }; + + 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(); + }); + }); + }); + }); + + it('should keep failing when http layer is requested individually', function(done) { + var tileRequest = { + z: 1, + x: 0, + y: 0, + layer: 3, + format: 'png' + }; + var expectedResponse = { + status: 400, + headers: { + 'Content-Type': 'application/json; charset=utf-8' + } + }; + testClient.getTileLayer(mapConfig, tileRequest, expectedResponse, function(err, res) { + assert.ok(!err); + var parsedBody = JSON.parse(res.body); + assert.deepEqual(parsedBody, { + errors: [ + "Unable to fetch http tile: http://127.0.0.1:8033/error404/1/0/0.png [404]" + ] + }); + done(); + }); + }); +}); diff --git a/test/acceptance/ported/blend_http_timeout.js b/test/acceptance/ported/blend_http_timeout.js new file mode 100644 index 00000000..53c917e3 --- /dev/null +++ b/test/acceptance/ported/blend_http_timeout.js @@ -0,0 +1,82 @@ +require('../../support/test_helper'); + +var assert = require('../../support/assert'); +var testClient = require('./support/test_client'); +var serverOptions = require('./support/ported_server_options'); +var fs = require('fs'); +var http = require('http'); + +describe.skip('blend http client timeout', function() { + + var mapConfig = { + version: '1.3.0', + layers: [ + { + type: 'http', + options: { + urlTemplate: 'http://127.0.0.1:8033/{s}/{z}/{x}/{y}.png', + subdomains: ['light'] + } + }, + { + type: 'mapnik', + options: { + sql: 'SELECT * FROM populated_places_simple_reduced', + cartocss: '#layer { marker-fill:red; } #layer { marker-width: 2; }', + cartocss_version: '2.3.0', + geom_column: 'the_geom' + } + } + ] + }; + + var oldHttpRendererTimeout; + var httpRendererTimeout = 100; + + var slowHttpRendererResourcesServer; + + before(function(done) { + oldHttpRendererTimeout = serverOptions.renderer.http.timeout; + serverOptions.renderer.http.timeout = httpRendererTimeout; + + // Start a server to test external resources + slowHttpRendererResourcesServer = http.createServer( function(request, response) { + setTimeout(function() { + var filename = __dirname + '/../fixtures/http/light_nolabels-1-0-0.png'; + fs.readFile(filename, {encoding: 'binary'}, function(err, file) { + response.writeHead(200); + response.write(file, "binary"); + response.end(); + }); + }, httpRendererTimeout * 2); + }); + slowHttpRendererResourcesServer.listen(8033, done); + }); + + after(function(done) { + serverOptions.renderer.http.timeout = oldHttpRendererTimeout; + slowHttpRendererResourcesServer.close(done); + }); + + it('should fail to render when http layer times out', function(done) { + var options = { + statusCode: 400, + contentType: 'application/json; charset=utf-8', + serverOptions: serverOptions + }; + testClient.withLayergroup(mapConfig, options, function(err, requestTile, finish) { + var tileUrl = '/all/0/0/0.png'; + requestTile(tileUrl, options, function(err, res) { + assert.ok(!err); + var parsedBody = JSON.parse(res.body); + assert.ok(parsedBody.errors); + assert.ok(parsedBody.errors.length); + assert.equal(parsedBody.errors[0], 'Unable to fetch http tile: http://127.0.0.1:8033/light/0/0/0.png'); + finish(function(finishErr) { + done(err || finishErr); + }); + }); + }); + }); + +}); diff --git a/test/acceptance/ported/external_resources.js b/test/acceptance/ported/external_resources.js new file mode 100644 index 00000000..378d7f2d --- /dev/null +++ b/test/acceptance/ported/external_resources.js @@ -0,0 +1,132 @@ +require('../../support/test_helper'); + + +var assert = require('../../support/assert'); +var fs = require('fs'); +var PortedServerOptions = require('./support/ported_server_options'); +var http = require('http'); +var testClient = require('./support/test_client'); + +function rmdir_recursive_sync(dirname) { + var files = fs.readdirSync(dirname); + for (var i=0; iU(E1Aw(!4C=E}SDNicN{5NMD`cT>D>E^LNK1-G4L=u+ zUSFl6Q#!_D+pSggUlJceEmdO6u>#Vsbtq`-p7z@tKg>J{%k}5y)#5b%fUAP7`FnAn z#_H3QYB=W}l$n}2tDFhfoTox*dg(rFa$w%{zEhnjaC%f58)7LM%p+x@=hgMu29N6B zsoZgu>W<}rQ6913;l!&po5_adltXo{OROA%>T0x(;;d9L!0v`g7&`He2-amR%30eE zCQR|?SMIf$Z;W;GFY;G2Axep$v%|Q>3{6AFH;VHr+QMHy4d*bHg@^CVi$w~`)N=oe z)iu|dXW8mVUTS!Pr#IwK;+YK_7#T;?nt+30~394rMO!*>3E$S_*k*TyHX=J4-^6 zM~jwIJu@5R+1i3$fm}b@zamzg2|FYZl+)e2!)B^^0%5s;a-&wqOWk2dYX)T{b1yD2 zd%o(dQDXL48WBGtfKkB|i&a({n0}n^O49M+B@ldwIcg9P;{|paG4G4r71*;r7bdGoFhsqfshB~*}6DE zMg}RkU-uC(^ZRxQnAhNWB{@Di_Y&M^Pt$N)-fqXVRRZHD#}utG8R<6kHuXxg3&&a= zZ7ocPSK`8^;HIp2!Xv}EX<&h_x(yGO8o4W!IZTG))bzQp!Ju-$un~~&P5Wt6uUFdT z>CQdjJa6ZKkXNYwE<)W?7tjQYxDqv_lY2LBY7%#v;Oj;LhM{d&GqnGFl7M0(W87eU zitA7F11t^9V7Rv*tnF@P6MHW2zZG)}tH7XDuen|624PSd9Sy^!2Nu~5KiBA22 t3mh)fNn}4WK%S-#eEUv6{l8(m7I%uTI_jh~!l<__%;$Ji_pzL+{{R}CFZKWc literal 0 HcmV?d00001 diff --git a/test/acceptance/ported/limits.js b/test/acceptance/ported/limits.js new file mode 100644 index 00000000..0a16ea6d --- /dev/null +++ b/test/acceptance/ported/limits.js @@ -0,0 +1,89 @@ +require('../../support/test_helper'); + +var fs = require('fs'); + +var assert = require('../../support/assert'); +var testClient = require('./support/test_client'); +var serverOptions = require('./support/ported_server_options'); + +describe.skip('render limits', function() { + + var IMAGE_EQUALS_TOLERANCE_PER_MIL = 25; + + var limitsConfig; + var onTileErrorStrategy; + before(function() { + limitsConfig = serverOptions.renderer.mapnik.limits; + serverOptions.renderer.mapnik.limits = { + render: 50, + cacheOnTimeout: false + }; + onTileErrorStrategy = serverOptions.renderer.onTileErrorStrategy; + serverOptions.renderer.onTileErrorStrategy = function(err, tile, headers, stats, format, callback) { + callback(err, tile, headers, stats); + }; + }); + + after(function() { + serverOptions.renderer.mapnik.limits = limitsConfig; + serverOptions.renderer.onTileErrorStrategy = onTileErrorStrategy; + }); + + var slowQuery = 'select pg_sleep(1), * from test_table limit 2'; + var slowQueryMapConfig = testClient.singleLayerMapConfig(slowQuery); + + it('slow query/render returns with 400 status', function(done) { + var options = { + statusCode: 400, + serverOptions: serverOptions + }; + testClient.createLayergroup(slowQueryMapConfig, options, function(err, res) { + assert.deepEqual(JSON.parse(res.body), { errors: ["Render timed out"] }); + done(); + }); + }); + + it('uses onTileErrorStrategy to handle error and modify response', function(done) { + serverOptions.renderer.onTileErrorStrategy = function(err, tile, headers, stats, format, callback) { + var fixture = __dirname + '/../../fixtures/limits/fallback.png'; + fs.readFile(fixture, {encoding: 'binary'}, function(err, img) { + callback(null, img, {'Content-Type': 'image/png'}, {}); + }); + }; + var options = { + statusCode: 200, + contentType: 'image/png', + serverOptions: serverOptions + }; + testClient.createLayergroup(slowQueryMapConfig, options, function(err, res) { + var parsed = JSON.parse(res.body); + assert.ok(parsed.layergroupid); + done(); + }); + }); + + it('returns a fallback tile that was modified via onTileErrorStrategy', function(done) { + var fixtureImage = './test/fixtures/limits/fallback.png'; + serverOptions.renderer.onTileErrorStrategy = function(err, tile, headers, stats, format, callback) { + fs.readFile(fixtureImage, {encoding: null}, function(err, img) { + callback(null, img, {'Content-Type': 'image/png'}, {}); + }); + }; + var options = { + statusCode: 200, + contentType: 'image/png', + serverOptions: serverOptions + }; + 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); + }); + }); + }); + }); + }); + +}); diff --git a/test/acceptance/ported/multilayer.js b/test/acceptance/ported/multilayer.js new file mode 100644 index 00000000..a4064b9e --- /dev/null +++ b/test/acceptance/ported/multilayer.js @@ -0,0 +1,1461 @@ +require('../../support/test_helper'); + +var assert = require('../../support/assert'); +var _ = require('underscore'); +var querystring = require('querystring'); +var fs = require('fs'); +var redis = require('redis'); +var step = require('step'); +var mapnik = require('windshaft').mapnik; +var cartodbServer = require('../../../lib/cartodb/server'); +var ServerOptions = require('./support/ported_server_options'); +var http = require('http'); +var LayergroupToken = require('../../../lib/cartodb/models/layergroup_token'); + +describe.skip('multilayer', function() { + + var server = cartodbServer(ServerOptions); + server.req2params = ServerOptions.req2params; + server.setMaxListeners(0); + var redis_client = redis.createClient(ServerOptions.redis.port); + var res_serv; // resources server + var res_serv_port = 8033; // FIXME: make configurable ? + mapnik.register_system_fonts(); + var available_system_fonts = _.keys(mapnik.fontFiles()); + + var IMAGE_EQUALS_TOLERANCE_PER_MIL = 20; + + function checkCORSHeaders(res) { + assert.equal(res.headers['access-control-allow-headers'], 'X-Requested-With, X-Prototype-Version, X-CSRF-Token'); + assert.equal(res.headers['access-control-allow-origin'], '*'); + } + + before(function(done) { + // Start a server to test external resources + res_serv = http.createServer( function(request, response) { + var filename = __dirname + '/../fixtures/markers' + request.url; + fs.readFile(filename, "binary", function(err, file) { + if ( err ) { + response.writeHead(404, {'Content-Type': 'text/plain'}); + console.log("File '" + filename + "' not found"); + response.write("404 Not Found\n"); + } else { + response.writeHead(200); + response.write(file, "binary"); + } + response.end(); + }); + }); + res_serv.listen(res_serv_port, done); + }); + + after(function(done) { + // Close the resources server + res_serv.close(done); + }); + + // See https://github.com/Vizzuality/Windshaft/issues/70 + it("post layergroup with encoding in content-type", function(done) { + var layergroup = { + version: '1.0.1', + layers: [ + { options: { + sql: 'select the_geom from test_table limit 1', + cartocss: '#layer { marker-fill:red }', + cartocss_version: '2.0.1', + geom_column: 'the_geom' + } } + ] + }; + var expected_token; + step( + function do_post() + { + var next = this; + assert.response(server, { + url: '/database/windshaft_test/layergroup', + method: 'POST', + headers: {'Content-Type': 'application/json; charset=utf-8' }, + data: JSON.stringify(layergroup) + }, {}, function(res) { + assert.equal(res.statusCode, 200, res.body); + var parsedBody = JSON.parse(res.body); + expected_token = LayergroupToken.parse(parsedBody.layergroupid).token; + next(); + }); + }, + function finish(err) { + var errors = []; + if ( err ) { + errors.push(err.message); + } + redis_client.exists("map_cfg|" + expected_token, function(err, exists) { + if ( err ) { + errors.push(err.message); + } + assert.ok(exists, "Missing expected token " + expected_token + " from redis"); + redis_client.del("map_cfg|" + expected_token, function(err) { + if ( err ) { + errors.push(err.message); + } + if ( errors.length ) { + done(new Error(errors)); + } else { + done(null); + } + }); + }); + } + ); + }); + + // See https://github.com/Vizzuality/Windshaft/issues/71 + it("single layer with multiple css sections", function(done) { + var layergroup = { + version: '1.0.1', + layers: [ + { options: { + sql: 'select st_setsrid(st_makepoint(0, 0), 4326) as the_geom', + cartocss: '#layer { marker-fill:red; } #layer { marker-width:100; }', + cartocss_version: '2.0.1', + geom_column: 'the_geom' + } } + ] + }; + var expected_token; + step( + function do_post() + { + var next = this; + assert.response(server, { + url: '/database/windshaft_test/layergroup', + method: 'POST', + headers: {'Content-Type': 'application/json' }, + data: JSON.stringify(layergroup) + }, {}, function(res) { + assert.equal(res.statusCode, 200, res.body); + var parsedBody = JSON.parse(res.body); + expected_token = LayergroupToken.parse(parsedBody.layergroupid).token; + next(); + }); + }, + function do_get_tile(err) + { + assert.ifError(err); + var next = this; + assert.response(server, { + url: '/database/windshaft_test/layergroup/' + expected_token + '/0/0/0.png', + method: 'GET', + encoding: 'binary' + }, {}, function(res) { + 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, + function(err) { + next(err); + }); + }); + }, + function finish(err) { + var errors = []; + if ( err ) { + errors.push(err.message); + } + redis_client.exists("map_cfg|" + expected_token, function(err, exists) { + if ( err ) { + errors.push(err.message); + } + assert.ok(exists, "Missing expected token " + expected_token + " from redis"); + redis_client.del("map_cfg|" + expected_token, function(err) { + if ( err ) { + errors.push(err.message); + } + if ( errors.length ) { + done(new Error(errors)); + } else { + done(null); + } + }); + }); + } + ); + }); + + it("layergroup with 2 layers, each with its style", function(done) { + + var layergroup = { + version: '1.0.1', + layers: [ + { options: { + sql: 'select cartodb_id, ST_Translate(the_geom, 50, 0) as the_geom from test_table limit 2', + cartocss: '#layer { marker-fill:red; marker-width:32; marker-allow-overlap:true; }', + cartocss_version: '2.0.1', + interactivity: [ 'cartodb_id' ], + geom_column: 'the_geom' + } }, + { options: { + sql: 'select cartodb_id, ST_Translate(the_geom, -50, 0) as the_geom from test_table limit 2 offset 2', + cartocss: '#layer { marker-fill:blue; marker-allow-overlap:true; }', + cartocss_version: '2.0.2', + interactivity: [ 'cartodb_id' ], + geom_column: 'the_geom' + } } + ] + }; + + var expected_token; + step( + function do_post() + { + var next = this; + assert.response(server, { + url: '/database/windshaft_test/layergroup', + method: 'POST', + headers: {'Content-Type': 'application/json' }, + data: JSON.stringify(layergroup) + }, {}, function(res) { + assert.equal(res.statusCode, 200, res.statusCode + ': ' + res.body); + // CORS headers should be sent with response + // from layergroup creation via POST + checkCORSHeaders(res); + var parsedBody = JSON.parse(res.body); + if ( expected_token ) { + assert.deepEqual(parsedBody, {layergroupid: expected_token, layercount: 2}); + } else { + expected_token = LayergroupToken.parse(parsedBody.layergroupid).token; + } + next(null, res); + }); + }, + function do_get_tile(err) + { + assert.ifError(err); + var next = this; + assert.response(server, { + url: '/database/windshaft_test/layergroup/' + expected_token + '/0/0/0.png', + method: 'GET', + encoding: 'binary' + }, {}, 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', + IMAGE_EQUALS_TOLERANCE_PER_MIL, function(err) { + next(err); + }); + }); + }, + function do_get_grid0(err) + { + assert.ifError(err); + var next = this; + assert.response(server, { + url: '/database/windshaft_test/layergroup/' + expected_token + '/0/0/0/0.grid.json', + method: 'GET' + }, {}, function(res) { + assert.equal(res.statusCode, 200, res.body); + assert.equal(res.headers['content-type'], "application/json; charset=utf-8"); + assert.utfgridEqualsFile( + res.body, './test/acceptance/ported/fixtures/test_table_0_0_0_multilayer1.layer0.grid.json', 2, + function(err/*, similarity*/) { + next(err); + }); + }); + }, + function do_get_grid1(err) + { + assert.ifError(err); + var next = this; + assert.response(server, { + url: '/database/windshaft_test/layergroup/' + expected_token + + '/1/0/0/0.grid.json?interactivity=cartodb_id', + method: 'GET' + }, {}, function(res) { + assert.equal(res.statusCode, 200, res.body); + assert.equal(res.headers['content-type'], "application/json; charset=utf-8"); + assert.utfgridEqualsFile( + res.body, './test/acceptance/ported/fixtures/test_table_0_0_0_multilayer1.layer1.grid.json', 2, + function(err/*, similarity*/) { + next(err); + }); + }); + }, + function finish(err) { + var errors = []; + if ( err ) { + errors.push(err.message); + } + redis_client.exists("map_cfg|" + expected_token, function(err, exists) { + if ( err ) { + errors.push(err.message); + } + assert.ok(exists, "Missing expected token " + expected_token + " from redis"); + redis_client.del("map_cfg|" + expected_token, function(err) { + if ( err ) { + errors.push(err.message); + } + if ( errors.length ) { + done(new Error(errors)); + } else { + done(null); + } + }); + }); + } + ); + }); + + it("layergroup with 2 layers, each with its style, GET method", function(done) { + + var layergroup = { + version: '1.0.1', + layers: [ + { options: { + sql: 'select cartodb_id, ST_Translate(the_geom, 50, 0) as the_geom from test_table limit 2', + cartocss: '#layer { marker-fill:red; marker-width:32; marker-allow-overlap:true; }', + cartocss_version: '2.0.1', + interactivity: [ 'cartodb_id' ], + geom_column: 'the_geom' + } }, + { options: { + sql: 'select cartodb_id, ST_Translate(the_geom, -50, 0) as the_geom from test_table limit 2 offset 2', + cartocss: '#layer { marker-fill:blue; marker-allow-overlap:true; }', + cartocss_version: '2.0.2', + interactivity: [ 'cartodb_id' ], + geom_column: 'the_geom' + } } + ] + }; + + var expected_token; + step( + function do_get() + { + var next = this; + assert.response(server, { + url: '/database/windshaft_test/layergroup?' + querystring.stringify({ + config: JSON.stringify(layergroup) + }), + method: 'GET', + headers: {'Content-Type': 'application/json' } + }, {}, function(res) { + assert.equal(res.statusCode, 200, res.body); + // CORS headers should be sent with response + // from layergroup creation via GET + // see https://github.com/CartoDB/Windshaft/issues/92 + checkCORSHeaders(res); + var parsedBody = JSON.parse(res.body); + if ( expected_token ) { + assert.deepEqual(parsedBody, {layergroupid: expected_token, layercount: 2}); + } else { + expected_token = LayergroupToken.parse(parsedBody.layergroupid).token; + } + next(null, res); + }); + }, + function do_get_tile(err) + { + assert.ifError(err); + var next = this; + assert.response(server, { + url: '/database/windshaft_test/layergroup/' + expected_token + '/0/0/0.png', + method: 'GET', + encoding: 'binary' + }, {}, 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', + IMAGE_EQUALS_TOLERANCE_PER_MIL, function(err) { + next(err); + }); + }); + }, + function do_get_grid0(err) + { + assert.ifError(err); + var next = this; + assert.response(server, { + url: '/database/windshaft_test/layergroup/' + expected_token + + '/0/0/0/0.grid.json?interactivity=cartodb_id', + method: 'GET' + }, {}, function(res) { + assert.equal(res.statusCode, 200, res.body); + assert.equal(res.headers['content-type'], "application/json; charset=utf-8"); + assert.utfgridEqualsFile( + res.body, './test/acceptance/ported/fixtures/test_table_0_0_0_multilayer1.layer0.grid.json', 2, + function(err/*, similarity*/) { + next(err); + }); + }); + }, + function do_get_grid1(err) + { + assert.ifError(err); + var next = this; + assert.response(server, { + url: '/database/windshaft_test/layergroup/' + expected_token + + '/1/0/0/0.grid.json?interactivity=cartodb_id', + method: 'GET' + }, {}, function(res) { + assert.equal(res.statusCode, 200, res.body); + assert.equal(res.headers['content-type'], "application/json; charset=utf-8"); + assert.utfgridEqualsFile( + res.body, './test/acceptance/ported/fixtures/test_table_0_0_0_multilayer1.layer1.grid.json', 2, + function(err/*, similarity*/) { + next(err); + }); + }); + }, + function finish(err) { + var errors = []; + if ( err ) { + errors.push(err.message); + } + redis_client.exists("map_cfg|" + expected_token, function(err, exists) { + if ( err ) { + errors.push(err.message); + } + assert.ok(exists, "Missing expected token " + expected_token + " from redis"); + redis_client.del("map_cfg|" + expected_token, function(err) { + if ( err ) { + errors.push(err.message); + } + if ( errors.length ) { + done(new Error(errors)); + } else { + done(null); + } + }); + }); + } + ); + }); + + it("layergroup with 2 layers, GET method, JSONP", function(done) { + + var layergroup = { + version: '1.0.1', + layers: [ + { options: { + sql: 'select cartodb_id, ST_Translate(the_geom, 50, 0) as the_geom from test_table limit 2', + cartocss: '#layer { marker-fill:red; marker-width:32; marker-allow-overlap:true; }', + cartocss_version: '2.0.1', + interactivity: [ 'cartodb_id' ], + geom_column: 'the_geom' + } }, + { options: { + sql: 'select cartodb_id, ST_Translate(the_geom, -50, 0) as the_geom from test_table limit 2 offset 2', + cartocss: '#layer { marker-fill:blue; marker-allow-overlap:true; }', + cartocss_version: '2.0.2', + interactivity: [ 'cartodb_id' ], + geom_column: 'the_geom' + } } + ] + }; + + var expected_token = "cb0a407726cc8cb47711e90a30dd9422"; + step( + function do_get_token() + { + var next = this; + assert.response(server, { + url: '/database/windshaft_test/layergroup?' + querystring.stringify({ + config: JSON.stringify(layergroup), + callback: 'jsonp_test' + }), + method: 'GET', + headers: {'Content-Type': 'application/json' } + }, {}, function(res, err) { next(err, res); }); + }, + function do_check_token(err, res) { + assert.ifError(err); + assert.equal(res.statusCode, 200, res.body); + assert.equal(res.body, 'jsonp_test(' + JSON.stringify({ + layergroupid: expected_token, + metadata: { + layers: [ + { type: "mapnik", "meta":{} }, + { type: "mapnik", "meta":{} } + ] + }, + layercount: 2 + }) + ');'); + + // TODO: check caching headers ! + return null; + }, + function do_get_tile(err) + { + assert.ifError(err); + var next = this; + assert.response(server, { + url: '/database/windshaft_test/layergroup/' + expected_token + '/0/0/0.png', + method: 'GET', + encoding: 'binary' + }, {}, function(res) { + assert.equal(res.statusCode, 200, res.body); + assert.equal(res.headers['content-type'], "image/png"); + assert.imageEqualsFile(res.body, './test/fixtures/test_table_0_0_0_multilayer1.png', + IMAGE_EQUALS_TOLERANCE_PER_MIL, function(err) { + next(err); + }); + }); + }, + function do_get_grid0(err) + { + assert.ifError(err); + var next = this; + assert.response(server, { + url: '/database/windshaft_test/layergroup/' + expected_token + + '/0/0/0/0.grid.json?interactivity=cartodb_id', + method: 'GET' + }, {}, function(res) { + assert.equal(res.statusCode, 200, res.body); + assert.equal(res.headers['content-type'], "application/json; charset=utf-8"); + assert.utfgridEqualsFile( + res.body, './test/acceptance/ported/fixtures/test_table_0_0_0_multilayer1.layer0.grid.json', 2, + function(err/*, similarity*/) { + next(err); + }); + }); + }, + function do_get_grid1(err) + { + assert.ifError(err); + var next = this; + assert.response(server, { + url: '/database/windshaft_test/layergroup/' + expected_token + + '/1/0/0/0.grid.json?interactivity=cartodb_id', + method: 'GET' + }, {}, function(res) { + assert.equal(res.statusCode, 200, res.body); + assert.equal(res.headers['content-type'], "application/json; charset=utf-8"); + assert.utfgridEqualsFile( + res.body, './test/acceptance/ported/fixtures/test_table_0_0_0_multilayer1.layer1.grid.json', 2, + function(err/*, similarity*/) { + next(err); + }); + }); + }, + function finish(err) { + var errors = []; + if ( err ) { + errors.push(err.message); + } + redis_client.exists("map_cfg|" + expected_token, function(err, exists) { + if ( err ) { + errors.push(err.message); + } + assert.ok(exists, "Missing expected token " + expected_token + " from redis"); + redis_client.del("map_cfg|" + expected_token, function(err) { + if ( err ) { + errors.push(err.message); + } + if ( errors.length ) { + done(new Error(errors)); + } else { + done(null); + } + }); + }); + } + ); + }); + + it("layergroup with 3 mixed layers, mapnik torque and attributes", function(done) { + + var layergroup = { + version: '1.1.0', + layers: [ + { options: { + sql: 'select cartodb_id, ST_Translate(the_geom, 50, 0) as the_geom from test_table limit 2', + cartocss: '#layer { marker-fill:red; marker-width:32; marker-allow-overlap:true; }', + cartocss_version: '2.0.1', + interactivity: [ 'cartodb_id' ], + geom_column: 'the_geom' + } }, + { options: { + sql: 'select cartodb_id, cartodb_id*10 as n, ST_Translate(the_geom, -50, 0) as the_geom' + + ' from test_table ORDER BY cartodb_id limit 2 offset 2', + cartocss: '#layer { marker-fill:blue; marker-allow-overlap:true; }', + cartocss_version: '2.0.2', + interactivity: [ 'cartodb_id' ], + attributes: { id: 'cartodb_id', columns: ['n'] }, + geom_column: 'the_geom' + } }, + { type: 'torque', options: { + sql: "select cartodb_id, '1970-01-01'::date as d," + + " ST_SnapToGrid(the_geom_webmercator,1e10) as the_geom_webmercator " + + "from test_table WHERE cartodb_id = 4", + cartocss: 'Map { -torque-frame-count:1; -torque-resolution:1; -torque-time-attribute:d; ' + + '-torque-aggregation-function:"count(*)"; } #layer { marker-fill:blue; marker-allow-overlap:true; }' + } } + ] + }; + + var expected_token; + step( + function do_get() + { + var next = this; + assert.response(server, { + url: '/database/windshaft_test/layergroup', + method: 'POST', + headers: {'Content-Type': 'application/json' }, + data: JSON.stringify(layergroup) + }, {}, function(res, err) { + next(err, res); + }); + }, + function check_create(err, res) { + assert.ifError(err); + assert.equal(res.statusCode, 200, res.body); + var parsed = JSON.parse(res.body); + expected_token = LayergroupToken.parse(parsed.layergroupid).token; + return null; + }, + function do_get_tile(err) + { + assert.ifError(err); + var next = this; + assert.response(server, { + url: '/database/windshaft_test/layergroup/' + expected_token + '/0/0/0.png', + method: 'GET', + encoding: 'binary' + }, {}, function(res) { + assert.equal(res.statusCode, 200, res.body); + assert.equal(res.headers['content-type'], "image/png"); + assert.imageEqualsFile(res.body, './test/fixtures/test_table_0_0_0_multilayer1.png', + IMAGE_EQUALS_TOLERANCE_PER_MIL, function(err) { + next(err); + }); + }); + }, + function do_get_grid0(err) + { + assert.ifError(err); + var next = this; + assert.response(server, { + url: '/database/windshaft_test/layergroup/' + expected_token + + '/0/0/0/0.grid.json?interactivity=cartodb_id', + method: 'GET' + }, {}, function(res) { + assert.equal(res.statusCode, 200, res.body); + assert.equal(res.headers['content-type'], "application/json; charset=utf-8"); + assert.utfgridEqualsFile(res.body, './test/fixtures/test_table_0_0_0_multilayer1.layer0.grid.json', 2, + function(err/*, similarity*/) { + next(err); + }); + }); + }, + function do_get_grid1(err) + { + assert.ifError(err); + var next = this; + assert.response(server, { + url: '/database/windshaft_test/layergroup/' + expected_token + + '/1/0/0/0.grid.json?interactivity=cartodb_id', + method: 'GET' + }, {}, function(res) { + assert.equal(res.statusCode, 200, res.body); + assert.equal(res.headers['content-type'], "application/json; charset=utf-8"); + assert.utfgridEqualsFile(res.body, './test/fixtures/test_table_0_0_0_multilayer1.layer1.grid.json', 2, + function(err/*, similarity*/) { + next(err); + }); + }); + }, + function do_get_attr1(err) + { + assert.ifError(err); + var next = this; + assert.response(server, { + url: '/database/windshaft_test/layergroup/' + expected_token + '/1/attributes/4', + method: 'GET' + }, {}, function(res, err) { + next(err, res); + }); + }, + function do_check_attr1(err, res) { + assert.ifError(err); + assert.equal(res.statusCode, 200, res.body); + assert.equal(res.headers['content-type'], "application/json; charset=utf-8"); + var parsed = JSON.parse(res.body); + assert.deepEqual(parsed, {n:40}); + return null; + }, + function do_get_torque2(err) + { + assert.ifError(err); + var next = this; + assert.response(server, { + url: '/database/windshaft_test/layergroup/' + expected_token + '/2/0/0/0.json.torque', + method: 'GET' + }, {}, function(res, err) { next(err, res); }); + }, + function do_check_torque2(err, res) { + assert.ifError(err); + assert.equal(res.statusCode, 200, res.body); + assert.equal(res.headers['content-type'], "application/json; charset=utf-8"); + var parsed = JSON.parse(res.body); + assert.deepEqual(parsed[0].vals__uint8, [1]); + assert.deepEqual(parsed[0].dates__uint16, [0]); + assert.equal(parsed[0].x__uint8, 128); + assert.equal(parsed[0].y__uint8, 128); + return null; + }, + function do_get_torque1(err) + { +// Layer 1 is not a torque layer... +// See https://github.com/CartoDB/Windshaft/issues/136 + assert.ifError(err); + var next = this; + assert.response(server, { + url: '/database/windshaft_test/layergroup/' + expected_token + '/1/0/0/0.json.torque', + method: 'GET' + }, {}, function(res, err) { next(err, res); }); + }, + function do_check_torque1(err, res) { + assert.ifError(err); + assert.equal(res.statusCode, 400, res.statusCode + ': ' + res.body); + var parsed = JSON.parse(res.body); + assert.ok(parsed.errors, res.body); + assert.equal(parsed.errors.length, 1); + var msg = parsed.errors[0]; + assert.ok(msg.match(/Unsupported format json.torque/i), msg); + return null; + }, + function finish(err) { +//if ( err ) console.log(err.stack); + var errors = []; + if ( err ) { + errors.push(''+err); + } + redis_client.exists("map_cfg|" + expected_token, function(err, exists) { + if ( err ) { + errors.push(''+err); + } + assert.ok(exists, "Missing expected token " + expected_token + " from redis"); + redis_client.del("map_cfg|" + expected_token, function(err) { + if ( err ) { + errors.push(err.message); + } + if ( errors.length ) { + done(new Error(errors.join(','))); + } else { + done(null); + } + }); + }); + } + ); + }); + + it("check that distinct maps result in distinct tiles", function(done) { + + var layergroup1 = { + version: '1.0.0', + layers: [ + { options: { + sql: 'select cartodb_id, ST_Translate(the_geom, 50, 0) as the_geom from test_table limit 2', + cartocss: '#layer { marker-fill:red; marker-width:32; marker-allow-overlap:true; }', + cartocss_version: '2.0.1', + interactivity: 'cartodb_id', + geom_column: 'the_geom' + } } + ] + }; + + var layergroup2 = { + version: '1.0.0', + layers: [ + { options: { + sql: 'select cartodb_id, ST_Translate(the_geom, -50, 0) as the_geom from test_table limit 2 offset 2', + cartocss: '#layer { marker-fill:blue; marker-allow-overlap:true; }', + cartocss_version: '2.0.2', + interactivity: 'cartodb_id', + geom_column: 'the_geom' + } } + ] + }; + + var token1, token2; + step( + function do_post1() + { + var next = this; + assert.response(server, { + url: '/database/windshaft_test/layergroup', + method: 'POST', + headers: {'Content-Type': 'application/json' }, + data: JSON.stringify(layergroup1) + }, {}, function(res) { + assert.equal(res.statusCode, 200, res.body); + var parsedBody = JSON.parse(res.body); + token1 = parsedBody.layergroupid; + assert.ok(token1, res.body); + next(null); + }); + }, + function do_post2() + { + var next = this; + assert.response(server, { + url: '/database/windshaft_test/layergroup', + method: 'POST', + headers: {'Content-Type': 'application/json' }, + data: JSON.stringify(layergroup2) + }, {}, function(res) { + assert.equal(res.statusCode, 200, res.body); + var parsedBody = JSON.parse(res.body); + token2 = parsedBody.layergroupid; + assert.ok(token2); + next(null); + }); + }, + function do_get_tile1(err) + { + assert.ifError(err); + var next = this; + assert.response(server, { + url: '/database/windshaft_test/layergroup/' + token1 + '/0/0/0.png', + method: 'GET', + encoding: 'binary' + }, {}, function(res) { + assert.equal(res.statusCode, 200, res.body); + assert.equal(res.headers['content-type'], "image/png"); + assert.imageEqualsFile(res.body, './test/fixtures/test_table_0_0_0_multilayer2.png', + IMAGE_EQUALS_TOLERANCE_PER_MIL, function(err) { + next(err); + }); + }); + }, + function do_get_grid1(err) + { + assert.ifError(err); + var next = this; + assert.response(server, { + url: '/database/windshaft_test/layergroup/' + token1 + '/0/0/0/0.grid.json?interactivity=cartodb_id', + method: 'GET' + }, {}, function(res) { + assert.equal(res.statusCode, 200, res.body); + assert.equal(res.headers['content-type'], "application/json; charset=utf-8"); + assert.utfgridEqualsFile(res.body, './test/fixtures/test_table_0_0_0_multilayer1.layer0.grid.json', 2, + function(err/*, similarity*/) { + next(err); + }); + }); + }, + function do_get_tile2(err) + { + assert.ifError(err); + var next = this; + assert.response(server, { + url: '/database/windshaft_test/layergroup/' + token2 + '/0/0/0.png', + method: 'GET', + encoding: 'binary' + }, {}, function(res) { + assert.equal(res.statusCode, 200, res.body); + assert.equal(res.headers['content-type'], "image/png"); + assert.imageEqualsFile(res.body, './test/fixtures/test_table_0_0_0_multilayer3.png', + IMAGE_EQUALS_TOLERANCE_PER_MIL, function(err) { + next(err); + }); + }); + }, + function do_get_grid_layer2(err) + { + assert.ifError(err); + var next = this; + assert.response(server, { + url: '/database/windshaft_test/layergroup/' + token2 + '/0/0/0/0.grid.json?interactivity=cartodb_id', + method: 'GET' + }, {}, function(res) { + assert.equal(res.statusCode, 200, res.body); + assert.equal(res.headers['content-type'], "application/json; charset=utf-8"); + assert.utfgridEqualsFile(res.body, './test/fixtures/test_table_0_0_0_multilayer1.layer1.grid.json', 2, + function(err/*, similarity*/) { + next(err); + }); + }); + }, + function finish(err) { + var errors = []; + if ( err ) { + errors.push(err.message); + } + redis_client.keys('map_cfg|*', function(err, matches) { + if ( err ) { + errors.push(err.message); + } + assert.equal(matches.length, 2); + assert.ok(_.indexOf(matches, 'map_cfg|'+token1) > -1, + "Missing expected token " + token1 + " from redis"); + assert.ok(_.indexOf(matches, 'map_cfg|'+token2) > -1, + "Missing expected token " + token2 + " from redis"); + var cb = function(err/*, deleted*/) { + if ( err ) { + errors.push(err.message); + } + if ( errors.length ) { + done(new Error(errors)); + } else { + done(null); + } + }; + redis_client.del(matches, cb); + }); + } + ); + }); + + it("layers are rendered in definition order", function(done) { + + var layergroup = { + version: '1.0.1', + layers: [ + { options: { + sql: "select st_setsrid('LINESTRING(-60 -60,-60 60)'::geometry, 4326) as the_geom", + cartocss_version: '2.0.2', + cartocss: '#layer { line-width:16; line-color:#ff0000; }' + } }, + { options: { + sql: "select st_setsrid('LINESTRING(-100 0,100 0)'::geometry, 4326) as the_geom", + cartocss_version: '2.0.2', + cartocss: '#layer { line-width:16; line-color:#00ff00; }' + } }, + { options: { + sql: "select st_setsrid('LINESTRING(60 -60,60 60)'::geometry, 4326) as the_geom", + cartocss_version: '2.0.2', + cartocss: '#layer { line-width:16; line-color:#0000ff; }' + } } + ] + }; + + var expected_token; // = "32994445c0a4525432fcd7013bf6524c"; + step( + function do_post() + { + var next = this; + assert.response(server, { + url: '/database/windshaft_test/layergroup', + method: 'POST', + headers: {'Content-Type': 'application/json' }, + data: JSON.stringify(layergroup) + }, {}, function(res) { + try { + assert.equal(res.statusCode, 200, res.body); + var parsedBody = JSON.parse(res.body); + if ( expected_token ) { + assert.deepEqual(parsedBody, {layergroupid: expected_token, layercount: 3}); + } else { + expected_token = LayergroupToken.parse(parsedBody.layergroupid).token; + } + next(null, res); + } catch (err) { next(err); } + }); + }, + function do_get_tile(err) + { + assert.ifError(err); + var next = this; + assert.response(server, { + url: '/database/windshaft_test/layergroup/' + expected_token + '/0/0/0.png', + method: 'GET', + encoding: 'binary' + }, {}, function(res) { + assert.equal(res.statusCode, 200, res.body); + assert.equal(res.headers['content-type'], "image/png"); + assert.imageEqualsFile(res.body, './test/fixtures/test_table_0_0_0_multilayer4.png', + IMAGE_EQUALS_TOLERANCE_PER_MIL, function(err) { + next(err); + }); + }); + }, + function finish(err) { + var errors = []; + if ( err ) { + errors.push(err.message); + } + redis_client.exists("map_cfg|" + expected_token, function(err, exists) { + if ( err ) { + errors.push(err.message); + } + assert.ok(exists, "Missing expected token " + expected_token + " from redis"); + redis_client.del("map_cfg|" + expected_token, function(err) { + if ( err ) { + errors.push(err.message); + } + if ( errors.length ) { + done(new Error(errors)); + } else { + done(null); + } + }); + }); + } + ); + }); + + it("quotes in CartoCSS", function(done) { + + var layergroup = { + version: '1.0.1', + layers: [ + { options: { + sql: "select 'single''quote' as n, 'SRID=4326;POINT(0 0)'::geometry as the_geom", + cartocss: '#s [n="single\'quote" ] { marker-fill:red; }', + cartocss_version: '2.1.0' + } }, + { options: { + sql: "select 'double\"quote' as n, 'SRID=4326;POINT(2 0)'::geometry as the_geom", + cartocss: '#s [n="double\\"quote" ] { marker-fill:red; }', + cartocss_version: '2.1.0' + } } + ] + }; + + assert.response(server, { + url: '/database/windshaft_test/layergroup', + method: 'POST', + headers: {host: 'localhost', 'Content-Type': 'application/json' }, + data: JSON.stringify(layergroup) + }, {}, function(res) { + assert.equal(res.statusCode, 200, res.statusCode + ': ' + res.body); + var parsed = JSON.parse(res.body); + var expected_token = LayergroupToken.parse(parsed.layergroupid).token; + redis_client.del("map_cfg|" + expected_token, function(/*err*/) { + done(); + }); + }); + }); + + // See https://github.com/CartoDB/Windshaft/issues/90 + it("exponential notation in CartoCSS filter", function(done) { + + var layergroup = { + version: '1.0.1', + layers: [ + { options: { + sql: "select 1.0 as n, 'SRID=4326;POINT(0 0)'::geometry as the_geom", + cartocss: '#s [n=1e-4 ] { marker-fill:red; }', + cartocss_version: '2.1.0' + } } + ] + }; + assert.response(server, { + url: '/database/windshaft_test/layergroup', + method: 'POST', + headers: {host: 'localhost', 'Content-Type': 'application/json' }, + data: JSON.stringify(layergroup) + }, {}, function(res) { + assert.equal(res.statusCode, 200, res.statusCode + ': ' + res.body); + var parsed = JSON.parse(res.body); + var expected_token = LayergroupToken.parse(parsed.layergroupid).token; + redis_client.del("map_cfg|" + expected_token, function(/*err*/) { + done(); + }); + }); + }); + + // See https://github.com/CartoDB/Windshaft/issues/94 + it("unknown text-face-name", function(done) { + + var layergroup = { + version: '1.0.1', + layers: [ + { options: { + sql: "select 1.0 as n, 'SRID=4326;POINT(0 0)'::geometry as the_geom", + cartocss: '#s { text-name: [n]; text-face-name: "<%= font %>"; }', + cartocss_version: '2.1.0' + } } + ] + }; + + var tpl = JSON.stringify(layergroup); + + step( + function doBadPost() { + var next = this; + assert.response(server, { + url: '/database/windshaft_test/layergroup', + method: 'POST', + headers: {host: 'localhost', 'Content-Type': 'application/json' }, + data: _.template(tpl, {font:'bogus'}) + }, function(res) { next(null, res); }); + }, + function checkBadFont(err, res) { + assert.ifError(err); + assert.equal(res.statusCode, 400, res.statusCode + ': ' + res.body); + var parsedBody = JSON.parse(res.body); + assert.equal(parsedBody.errors.length, 1); + var errmsg = parsedBody.errors[0]; + assert.ok(errmsg.match(/text-face-name.*bogus/), parsedBody.errors.toString()); + //, {"errors":["style0: Failed to find font face 'bogus'"]}); + return null; + }, + function doGoodPost(err) { + assert.ifError(err); + var next = this; + assert.response(server, { + url: '/database/windshaft_test/layergroup', + method: 'POST', + headers: {host: 'localhost', 'Content-Type': 'application/json' }, + data: _.template(tpl, {font:available_system_fonts[0]}) + }, function(res) { next(null, res); }); + }, + function checkGoodFont(err, res) { + assert.ifError(err); + assert.equal(res.statusCode, 200, res.statusCode + ': ' + res.body); + var next = this; + var parsed = JSON.parse(res.body); + var expected_token = LayergroupToken.parse(parsed.layergroupid).token; + redis_client.del("map_cfg|" + expected_token, next); + }, + function finish(err) { + done(err); + } + ); + + }); + + //////////////////////////////////////////////////////////////////// + // + // OPTIONS LAYERGROUP + // + //////////////////////////////////////////////////////////////////// + + it("get'ing options on layergroup should return CORS headers", function(done){ + assert.response(server, { + url: '/database/windshaft_test/layergroup', + method: 'OPTIONS' + },{ + status: 200, + // TODO: use checkCORSHeaders() function + headers: { + 'Access-Control-Allow-Headers': 'X-Requested-With, X-Prototype-Version, X-CSRF-Token, Content-Type', + 'Access-Control-Allow-Origin': '*' + } + }, function() { done(); }); + }); + + // See: + // - https://github.com/CartoDB/Windshaft/issues/103 + // - https://github.com/mapnik/mapnik/issues/2121 + // - https://github.com/mapnik/mapnik/issues/764 + it.skip("layergroup with datetime interactivity", function(done) { + + var layergroup = { + version: '1.0.1', + layers: [ + { options: { + sql: 'select 1 as i, 2::int2 as n, now() as t, ST_SetSRID(ST_MakePoint(0,0),3857) as the_geom', + cartocss: '#layer { marker-fill:red; }', + cartocss_version: '2.1.1', + interactivity: [ 'i', 't', 'n' ] + } } + ] + }; + + var expected_token; + step( + function do_post() + { + var next = this; + assert.response(server, { + url: '/database/windshaft_test/layergroup', + method: 'POST', + headers: {'Content-Type': 'application/json' }, + data: JSON.stringify(layergroup) + }, {}, function(res) { + try { + assert.equal(res.statusCode, 200, res.body); + var parsedBody = JSON.parse(res.body); + if ( expected_token ) { + assert.deepEqual(parsedBody, {layergroupid: expected_token, layercount: 3}); + } else { + expected_token = LayergroupToken.parse(parsedBody.layergroupid).token; + } + next(null, res); + } catch (err) { next(err); } + }); + }, + function do_get_grid0(err) + { + assert.ifError(err); + var next = this; + assert.response(server, { + url: '/database/windshaft_test/layergroup/' + expected_token + '/0/0/0/0.grid.json', + method: 'GET' + }, {}, function(res) { + next(null, res); + }); + }, + function do_check_grid(err, res) + { + assert.ifError(err); + var next = this; + assert.equal(res.statusCode, 200, res.body); + assert.equal(res.headers['content-type'], "application/json; charset=utf-8"); + var grid = JSON.parse(res.body); + assert.ok(grid); + assert.ok(grid.hasOwnProperty('data')); + assert.ok(grid.data.hasOwnProperty('1')); + var data = grid.data[1]; + assert.ok(data.hasOwnProperty('n'), "Missing 'n' from grid data keys: " + _.keys(data)); + assert.ok(data.hasOwnProperty('i'), "Missing 'i' from grid data keys: " + _.keys(data)); + assert.ok(data.hasOwnProperty('t'), "Missing 't' from grid data keys: " + _.keys(data)); + next(); + }, + function finish(err) { + var errors = []; + if ( err ) { + errors.push(err.message); + } + redis_client.del("map_cfg|" + expected_token, function(err) { + if ( err ) { + errors.push(err.message); + } + if ( errors.length ) { + done(new Error(errors)); + } else { + done(null); + } + }); + } + ); + }); + + // See http://github.com/CartoDB/Windshaft/issues/157 + it("req2params is called only once for a multilayer post", + function(done) { + + var layergroup = { + version: '1.0.1', + layers: [ + { options: { + sql: 'select cartodb_id, ST_Translate(the_geom, 50, 0) as the_geom from test_table limit 2', + cartocss: '#layer { marker-fill:red; marker-width:32; marker-allow-overlap:true; }', + cartocss_version: '2.0.1', + interactivity: [ 'cartodb_id' ] + } }, + { options: { + sql: 'select cartodb_id, ST_Translate(the_geom, -50, 0) as the_geom from test_table limit 2 offset 2', + cartocss: '#layer { marker-fill:blue; marker-allow-overlap:true; }', + cartocss_version: '2.0.2', + interactivity: [ 'cartodb_id' ] + } } + ] + }; + + var expected_token; + step( + function do_post() + { + server.req2params_calls = 0; + var next = this; + assert.response(server, { + url: '/database/windshaft_test/layergroup', + method: 'POST', + headers: {'Content-Type': 'application/json' }, + data: JSON.stringify(layergroup) + }, {}, function(res, err) { next(err,res); }); + }, + function check_post(err, res) { + assert.ifError(err); + assert.equal(res.statusCode, 200, res.statusCode + ': ' + res.body); + var parsedBody = JSON.parse(res.body); + expected_token = LayergroupToken.parse(parsedBody.layergroupid).token; + assert.equal(server.req2params_calls, 1); + return null; + }, + function finish(err) { + var errors = []; + if ( err ) { + errors.push('' + err); + } + redis_client.exists("map_cfg|" + expected_token, function(err, exists) { + if ( err ) { + errors.push(err.message); + } + assert.ok(exists, "Missing expected token " + expected_token + " from redis"); + redis_client.del("map_cfg|" + expected_token, function(err) { + if ( err ) { + errors.push(err.message); + } + if ( errors.length ) { + done(new Error(errors)); + } else { + done(null); + } + }); + }); + } + ); + }); + + // See https://github.com/CartoDB/Windshaft/issues/163 + it("has different token for different database", + function(done) { + var layergroup = { + version: '1.0.1', + layers: [ + { options: { + sql: 'select 1 as i, 2::int2 as n, now() as t, ST_SetSRID(ST_MakePoint(0,0),3857) as the_geom', + cartocss: '#layer { marker-fill:red; marker-width:32; marker-allow-overlap:true; }', + cartocss_version: '2.0.1' + } } + ] + }; + var token1, token2; + step( + function do_post_1() + { + var next = this; + assert.response(server, { + url: '/database/windshaft_test/layergroup', + method: 'POST', + headers: {'Content-Type': 'application/json' }, + data: JSON.stringify(layergroup) + }, {}, function(res, err) { next(err,res); }); + }, + function check_post_1(err, res) { + assert.ifError(err); + assert.equal(res.statusCode, 200, res.statusCode + ': ' + res.body); + var parsedBody = JSON.parse(res.body); + token1 = parsedBody.layergroupid; + return null; + }, + function do_post_2() + { + var next = this; + assert.response(server, { + url: '/database/windshaft_test2/layergroup', + method: 'POST', + headers: {'Content-Type': 'application/json' }, + data: JSON.stringify(layergroup) + }, {}, function(res, err) { next(err,res); }); + }, + function check_post_2(err, res) { + assert.ifError(err); + assert.equal(res.statusCode, 200, res.statusCode + ': ' + res.body); + var parsedBody = JSON.parse(res.body); + token2 = parsedBody.layergroupid; + assert.ok(token1 !== token2); + return null; + }, + function finish(err) { + var errors = []; + if ( err ) { + errors.push('' + err); + } + redis_client.keys('map_cfg|*', function(err, matches) { + if ( err ) { + errors.push(err.message); + } + assert.equal(matches.length, 2); + assert.ok(_.indexOf(matches, 'map_cfg|'+token1) > -1, + "Missing expected token " + token1 + " from redis"); + assert.ok(_.indexOf(matches, 'map_cfg|'+token2) > -1, + "Missing expected token " + token2 + " from redis"); + var cb = function(err/*, deleted*/) { + if ( err ) { + errors.push(err.message); + } + if ( errors.length ) { + done(new Error(errors)); + } else { + done(null); + } + }; + redis_client.del(matches, cb); + }); + } + ); + }); + + // See http://github.com/CartoDB/Windshaft/issues/191 + it("mapnik layer with custom geom_column", + function(done) { + var layergroup = { + version: '1.0.1', + layers: [ + { options: { + sql: 'select 1 as i, ST_SetSRID(ST_MakePoint(0,0),4326) as g', + cartocss: '#layer { marker-fill:red; marker-width:100; }', + cartocss_version: '2.0.1', + geom_column: 'g' + } } + ] + }; + var token1; + step( + function do_post_1() + { + var next = this; + assert.response(server, { + url: '/database/windshaft_test/layergroup', + method: 'POST', + headers: {'Content-Type': 'application/json' }, + data: JSON.stringify(layergroup) + }, {}, function(res, err) { next(err,res); }); + }, + function check_post_1(err, res) { + assert.ifError(err); + assert.equal(res.statusCode, 200, res.statusCode + ': ' + res.body); + var parsedBody = JSON.parse(res.body); + token1 = parsedBody.layergroupid; + return null; + }, + function do_get_tile(err) + { + assert.ifError(err); + var next = this; + assert.response(server, { + url: '/database/windshaft_test/layergroup/' + token1 + '/0/0/0.png', + method: 'GET', + encoding: 'binary' + }, {}, function(res) { + 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, function(err) { + next(err); + }); + }); + }, + function finish(err) { + var errors = []; + if ( err ) { + errors.push('' + err); + } + redis_client.keys('map_cfg|*', function(err, matches) { + if ( err ) { + errors.push(err.message); + } + try { + assert.equal(matches.length, 1); + assert.ok(_.indexOf(matches, 'map_cfg|'+token1) > -1, + "Missing expected token " + token1 + " from redis"); + } catch (e) { + errors.push('' + e); + } + var cb = function(err/*, deleted*/) { + if ( err ) { + errors.push(err.message); + } + if ( errors.length ) { + done(new Error(errors)); + } else { + done(null); + } + }; + redis_client.del(matches, cb); + }); + } + ); + }); + +}); + diff --git a/test/acceptance/ported/multilayer_error_cases.js b/test/acceptance/ported/multilayer_error_cases.js new file mode 100644 index 00000000..65aed40f --- /dev/null +++ b/test/acceptance/ported/multilayer_error_cases.js @@ -0,0 +1,445 @@ +require('../../support/test_helper'); + +var assert = require('../../support/assert'); +var step = require('step'); +var cartodbServer = require('../../../lib/cartodb/server'); +var ServerOptions = require('./support/ported_server_options'); +var testClient = require('./support/test_client'); + +describe('multilayer error cases', function() { + + var server = cartodbServer(ServerOptions); + server.req2params = ServerOptions.req2params; + server.setMaxListeners(0); + + it("post layergroup with wrong Content-Type", function(done) { + assert.response(server, { + url: '/database/windshaft_test/layergroup', + method: 'POST', + headers: {'Content-Type': 'application/x-www-form-urlencoded' } + }, {}, function(res) { + assert.equal(res.statusCode, 400, res.body); + var parsedBody = JSON.parse(res.body); + assert.deepEqual(parsedBody, {"errors":["layergroup POST data must be of type application/json"]}); + done(); + }); + }); + + it("post layergroup with no layers", function(done) { + assert.response(server, { + url: '/database/windshaft_test/layergroup', + method: 'POST', + headers: {'Content-Type': 'application/json' } + }, {}, function(res) { + assert.equal(res.statusCode, 400, res.body); + var parsedBody = JSON.parse(res.body); + assert.deepEqual(parsedBody, {"errors":["Missing layers array from layergroup config"]}); + done(); + }); + }); + + it("post layergroup jsonp errors are returned with 200 status", function(done) { + assert.response(server, { + url: '/database/windshaft_test/layergroup?callback=test', + method: 'POST', + headers: {'Content-Type': 'application/json' } + }, {}, function(res) { + assert.equal(res.statusCode, 200); + assert.equal(res.body, 'test({"errors":["Missing layers array from layergroup config"]});'); + done(); + }); + }); + + // See https://github.com/CartoDB/Windshaft/issues/154 + it("mapnik tokens cannot be used with attributes service", function(done) { + var layergroup = { + version: '1.1.0', + layers: [ + { options: { + sql: 'select cartodb_id, 1 as n, the_geom, !bbox! as b from test_table limit 1', + cartocss: '#layer { marker-fill:red }', + cartocss_version: '2.0.1', + attributes: { id:'cartodb_id', columns:['n'] }, + geom_column: 'the_geom' + } } + ] + }; + step( + function do_post() + { + var next = this; + assert.response(server, { + url: '/database/windshaft_test/layergroup', + method: 'POST', + headers: {'Content-Type': 'application/json; charset=utf-8' }, + data: JSON.stringify(layergroup) + }, {}, function(res, err) { next(err, res); }); + }, + function do_check(err, res) { + assert.equal(res.statusCode, 400, res.body); + var parsed = JSON.parse(res.body); + assert.ok(parsed.errors); + assert.equal(parsed.errors.length, 1); + var msg = parsed.errors[0]; + assert.ok(msg.match(/Attribute service cannot be activated/), msg); + return null; + }, + function finish(err) { + done(err); + } + ); + }); + + it("layergroup with no cartocss_version", function(done) { + var layergroup = { + version: '1.0.0', + layers: [ + { options: { + sql: 'select cartodb_id, ST_Translate(the_geom, 50, 0) as the_geom from test_table limit 2', + cartocss: '#layer { marker-fill:red; marker-width:32; marker-allow-overlap:true; }', + geom_column: 'the_geom' + } } + ] + }; + assert.response(server, { + url: '/database/windshaft_test/layergroup', + method: 'POST', + headers: {'Content-Type': 'application/json' }, + data: JSON.stringify(layergroup) + }, {}, function(res) { + assert.equal(res.statusCode, 400, res.body); + var parsedBody = JSON.parse(res.body); + assert.deepEqual(parsedBody, {errors:["Missing cartocss_version for layer 0 options"]}); + done(); + }); + }); + + it("sql/cartocss combination errors", function(done) { + var layergroup = { + version: '1.0.1', + layers: [{ options: { + sql: "select 1 as i, 'LINESTRING(0 0, 1 0)'::geometry as the_geom", + cartocss_version: '2.0.2', + cartocss: '#layer [missing=1] { line-width:16; }', + geom_column: 'the_geom' + }}] + }; + ServerOptions.afterLayergroupCreateCalls = 0; + assert.response(server, { + url: '/database/windshaft_test/layergroup', + method: 'POST', + headers: {'Content-Type': 'application/json' }, + data: JSON.stringify(layergroup) + }, {}, function(res) { + try { + assert.equal(res.statusCode, 400, res.statusCode + ': ' + res.body); + // See http://github.com/CartoDB/Windshaft/issues/159 + assert.equal(ServerOptions.afterLayergroupCreateCalls, 0); + var parsed = JSON.parse(res.body); + assert.ok(parsed); + assert.equal(parsed.errors.length, 1); + var error = parsed.errors[0]; + assert.ok(error.match(/column "missing" does not exist/m), error); + // cannot check for error starting with style0 until a new enough mapnik + // is used: https://github.com/mapnik/mapnik/issues/1924 + //assert.ok(error.match(/^style0/), "Error doesn't start with style0: " + error); + // TODO: check which layer introduced the problem ? + done(); + } catch (err) { done(err); } + }); + }); + + it("sql/interactivity combination error", function(done) { + var layergroup = { + version: '1.0.1', + layers: [ + { options: { + sql: "select 1 as i, st_setsrid('LINESTRING(0 0, 1 0)'::geometry, 4326) as the_geom", + cartocss_version: '2.0.2', + cartocss: '#layer { line-width:16; }', + interactivity: 'i', + geom_column: 'the_geom' + }}, + { options: { + sql: "select 1 as i, st_setsrid('LINESTRING(0 0, 1 0)'::geometry, 4326) as the_geom", + cartocss_version: '2.0.2', + cartocss: '#layer { line-width:16; }', + geom_column: 'the_geom' + }}, + { options: { + sql: "select 1 as i, st_setsrid('LINESTRING(0 0, 1 0)'::geometry, 4326) as the_geom", + cartocss_version: '2.0.2', + cartocss: '#layer { line-width:16; }', + interactivity: 'missing', + geom_column: 'the_geom' + }} + ] + }; + ServerOptions.afterLayergroupCreateCalls = 0; + assert.response(server, { + url: '/database/windshaft_test/layergroup', + method: 'POST', + headers: {'Content-Type': 'application/json' }, + data: JSON.stringify(layergroup) + }, {}, function(res) { + try { + assert.equal(res.statusCode, 400, res.statusCode + ': ' + res.body); + // See http://github.com/CartoDB/Windshaft/issues/159 + assert.equal(ServerOptions.afterLayergroupCreateCalls, 0); + var parsed = JSON.parse(res.body); + assert.ok(parsed); + assert.equal(parsed.errors.length, 1); + var error = parsed.errors[0]; + assert.ok(error.match(/column "missing" does not exist/m), error); + // TODO: check which layer introduced the problem ? + done(); + } catch (err) { done(err); } + }); + }); + + it("blank CartoCSS error", function(done) { + var layergroup = { + version: '1.0.1', + layers: [ + { options: { + sql: "select 1 as i, 'LINESTRING(0 0, 1 0)'::geometry as the_geom", + cartocss_version: '2.0.2', + cartocss: '#style { line-width:16 }', + interactivity: 'i', + geom_column: 'the_geom' + }}, + { options: { + sql: "select 1 as i, 'LINESTRING(0 0, 1 0)'::geometry as the_geom", + cartocss_version: '2.0.2', + cartocss: '', + interactivity: 'i', + geom_column: 'the_geom' + }} + ] + }; + assert.response(server, { + url: '/database/windshaft_test/layergroup', + method: 'POST', + headers: {'Content-Type': 'application/json' }, + data: JSON.stringify(layergroup) + }, {}, function(res) { + try { + assert.equal(res.statusCode, 400, res.statusCode + ': ' + res.body); + var parsed = JSON.parse(res.body); + assert.ok(parsed); + assert.equal(parsed.errors.length, 1); + var error = parsed.errors[0]; + assert.ok(error.match(/^style1: CartoCSS is empty/), error); + done(); + } catch (err) { done(err); } + }); + }); + + it("Invalid mapnik-geometry-type CartoCSS error", function(done) { + var layergroup = { + version: '1.0.1', + layers: [ + { options: { + sql: "select 1 as i, 'LINESTRING(0 0, 1 0)'::geometry as the_geom", + cartocss_version: '2.0.2', + cartocss: '#style [mapnik-geometry-type=bogus] { line-width:16 }', + geom_column: 'the_geom' + }}, + { options: { + sql: "select 1 as i, 'LINESTRING(0 0, 1 0)'::geometry as the_geom", + cartocss_version: '2.0.2', + cartocss: '#style [mapnik-geometry-type=bogus] { line-width:16 }', + geom_column: 'the_geom' + }} + ] + }; + assert.response(server, { + url: '/database/windshaft_test/layergroup', + method: 'POST', + headers: {'Content-Type': 'application/json' }, + data: JSON.stringify(layergroup) + }, {}, function(res) { + try { + assert.equal(res.statusCode, 400, res.statusCode + ': ' + res.body); + var parsed = JSON.parse(res.body); + assert.ok(parsed); + assert.equal(parsed.errors.length, 1); + var error = parsed.errors[0]; + // carto-0.9.3 used to say "Failed to parse expression", + // carto-0.9.5 says "not a valid keyword" + assert.ok(error.match(/^style0:.*(Failed|not a valid)/), error); + // TODO: check which layer introduced the problem ? + done(); + } catch (err) { done(err); } + }); + }); + + it("post'ing style with non existent column in filter returns 400 with error", function(done) { + var layergroup = { + version: '1.0.1', + layers: [ + { options: { + sql: 'select * from test_table limit 1', + cartocss: '#test_table::outline[address="one"], [address="two"] { marker-fill: red; }', + cartocss_version: '2.0.2', + interactivity: [ 'cartodb_id' ], + geom_column: 'the_geom' + } }, + { options: { + sql: 'select * from test_big_poly limit 1', + cartocss: '#test_big_poly { marker-fill:blue }', + cartocss_version: '2.0.2', + interactivity: [ 'cartodb_id' ], + geom_column: 'the_geom' + } } + ] + }; + + assert.response(server, { + url: '/database/windshaft_test/layergroup', + method: 'POST', + headers: {'Content-Type': 'application/json' }, + data: JSON.stringify(layergroup) + }, {}, function(res) { + assert.equal(res.statusCode, 400, res.body); + var parsed = JSON.parse(res.body); + assert.equal(parsed.errors.length, 1); + var error = parsed.errors[0]; + assert.ok(error.match(/column "address" does not exist/m), error); + done(); + }); + }); + + // See https://github.com/Vizzuality/Windshaft/issues/31 + it('bogus sql raises 400 status code', function(done) { + var bogusSqlMapConfig = testClient.singleLayerMapConfig('BOGUS FROM test_table'); + testClient.createLayergroup(bogusSqlMapConfig, { statusCode: 400 }, function(err, res) { + assert.ok(/syntax error/.test(res.body), "Unexpected error: " + res.body); + done(); + }); + }); + + it('bogus sql raises 200 status code for jsonp', function(done) { + var bogusSqlMapConfig = testClient.singleLayerMapConfig('bogus'); + var options = { + method: 'GET', + callbackName: 'test', + headers: { + 'Content-Type': 'text/javascript; charset=utf-8' + } + }; + testClient.createLayergroup(bogusSqlMapConfig, options, function(err, res) { + assert.ok(/^test\(/.test(res.body), "Body start expected callback name: " + res.body); + assert.ok(/syntax error/.test(res.body), "Unexpected error: " + res.body); + done(); + }); + }); + + it('query not selecting the_geom raises 200 status code for jsonp instead of 404', function(done) { + var noGeomMapConfig = testClient.singleLayerMapConfig('select null::geometry the_geom_wadus'); + var options = { + method: 'GET', + callbackName: 'test', + headers: { + 'Content-Type': 'text/javascript; charset=utf-8' + } + }; + testClient.createLayergroup(noGeomMapConfig, options, function(err, res) { + assert.ok(/^test\(/.test(res.body), "Body start expected callback name: " + res.body); + assert.ok(/column.*does not exist/.test(res.body), "Unexpected error: " + res.body); + done(); + }); + }); + + it("query with no geometry field returns 400 status", function(done){ + var noGeometrySqlMapConfig = testClient.singleLayerMapConfig('SELECT 1'); + testClient.createLayergroup(noGeometrySqlMapConfig, { statusCode: 400 }, function(err, res) { + assert.ok(/column.*does not exist/.test(res.body), "Unexpected error: " + res.body); + done(); + }); + }); + + it("bogus style should raise 400 status", function(done){ + var bogusStyleMapConfig = testClient.defaultTableMapConfig('test_table', '#test_table{xxxxx;}'); + testClient.createLayergroup(bogusStyleMapConfig, { method: 'GET', statusCode: 400 }, done); + }); + + var defaultErrorExpectedResponse = { + status: 400, + headers: { + 'Content-Type': 'application/json; charset=utf-8' + } + }; + + it('should raise 400 error for out of bounds layer index', function(done){ + var mapConfig = testClient.singleLayerMapConfig('select * from test_table', null, null, 'name'); + + testClient.getGrid(mapConfig, 1, 13, 4011, 3088, defaultErrorExpectedResponse, function(err, res) { + assert.deepEqual(JSON.parse(res.body), { errors: ["Layer '1' not found in layergroup"] }); + done(); + }); + }); + + //////////////////////////////////////////////////////////////////// + // + // OPTIONS LAYERGROUP + // + //////////////////////////////////////////////////////////////////// + + it("nonexistent layergroup token error", function(done) { + step( + function do_get_tile(err) + { + assert.ifError(err); + var next = this; + assert.response(server, { + url: '/database/windshaft_test/layergroup/deadbeef/0/0/0/0.grid.json', + method: 'GET', + encoding: 'binary' + }, {}, function(res, err) { next(err, res); }); + }, + function checkResponse(err, res) { + assert.ifError(err); + // FIXME: should be 404 + assert.equal(res.statusCode, 400, res.statusCode + ':' + res.body); + var parsed = JSON.parse(res.body); + assert.deepEqual(parsed, {"errors": ["Invalid or nonexistent map configuration token 'deadbeef'"]}); + return null; + }, + function finish(err) { + done(err); + } + ); + }); + + it('error 400 on json syntax error', function(done) { + var layergroup = { + version: '1.0.1', + layers: [ + { + options: { + sql: 'select the_geom from test_table limit 1', + cartocss: '#layer { marker-fill:red }' + } + } + ] + }; + assert.response(server, + { + url: '/database/windshaft_test/layergroup', + method: 'POST', + headers: {'Content-Type': 'application/json; charset=utf-8' }, + data: '{' + JSON.stringify(layergroup) + }, + { + status: 400 + }, + function(res) { + var parsedBody = JSON.parse(res.body); + assert.deepEqual(parsedBody, { errors: ['SyntaxError: Unexpected token {'] }); + done(); + } + ); + }); + +}); diff --git a/test/acceptance/ported/multilayer_interactivity.js b/test/acceptance/ported/multilayer_interactivity.js new file mode 100644 index 00000000..bc82dc1d --- /dev/null +++ b/test/acceptance/ported/multilayer_interactivity.js @@ -0,0 +1,373 @@ +require('../../support/test_helper'); + +var assert = require('../../support/assert'); +var _ = require('underscore'); +var redis = require('redis'); +var cartodbServer = require('../../../lib/cartodb/server'); +var getLayerTypeFn = require('windshaft').model.MapConfig.prototype.getType; +var PortedServerOptions = require('./support/ported_server_options'); +var LayergroupToken = require('../../../lib/cartodb/models/layergroup_token'); + +describe('multilayer interactivity and layers order', function() { + + var server = cartodbServer(PortedServerOptions); + server.req2params = PortedServerOptions.req2params; + server.setMaxListeners(0); + var redisClient = redis.createClient(PortedServerOptions.redis.port); + + function layerType(layer) { + return layer.type || 'undefined'; + } + + function testInteractivityLayersOrderScenario(testScenario) { + it(testScenario.desc, function(done) { + var layergroup = { + version: '1.3.0', + layers: testScenario.layers + }; + + PortedServerOptions.afterLayergroupCreateCalls = 0; + + assert.response(server, + { + url: '/database/windshaft_test/layergroup', + method: 'POST', + headers: { + 'Content-Type': 'application/json' + }, + data: JSON.stringify(layergroup) + }, + { + //status: 200, don't use status here to have a more meaningful error message + headers: { + 'content-type': 'application/json; charset=utf-8' + } + }, + function(response) { + assert.equal( + response.statusCode, + 200, + 'Expected status code 200, got ' + response.statusCode + + '\n\tResponse body: ' + response.body + + '\n\tLayer types: ' + layergroup.layers.map(layerType).join(', ') + ); + +// assert.equal(PortedServerOptions.afterLayergroupCreateCalls, 1); + + var layergroupResponse = JSON.parse(response.body); + assert.ok(layergroupResponse); + + var layergroupId = layergroupResponse.layergroupid; + assert.ok(layergroupId); + assert.equal(layergroupResponse.metadata.layers.length, layergroup.layers.length); + + // check layers metadata at least match in number + var layersMetadata = layergroupResponse.metadata.layers; + assert.equal(layersMetadata.length, layergroup.layers.length); + for (var i = 0, len = layersMetadata.length; i < len; i++) { + assert.equal( + getLayerTypeFn(layersMetadata[i].type), + getLayerTypeFn(layergroup.layers[i].type) + ); + } + // check torque metadata at least match in number + var torqueLayers = layergroup.layers.filter(function(layer) { return layer.type === 'torque'; }); + if (torqueLayers.length) { + assert.equal(Object.keys(layergroupResponse.metadata.torque).length, torqueLayers.length); + } + + var token = LayergroupToken.parse(layergroupId).token; + + redisClient.exists("map_cfg|" + token, function(err, exists) { + if (err) { + return done(err); + } + assert.ok(exists, "Missing expected token " + token + " from redis"); + redisClient.del("map_cfg|" + token, function(err) { + done(err); + }); + }); + } + ); + }); + } + + var cartocssVersion = '2.3.0'; + var cartocss = '#layer { line-width:16; }'; + var sql = "select 1 as i, st_setsrid('LINESTRING(0 0, 1 0)'::geometry, 4326) as the_geom"; + var sqlWadus = "select 1 as wadus, st_setsrid('LINESTRING(0 0, 1 0)'::geometry, 4326) as the_geom"; + + var httpLayer = { + type: 'http', + options: { + urlTemplate: 'http://{s}.basemaps.cartocdn.com/dark_nolabels/{z}/{x}/{y}.png', + subdomains: ['a','b','c'] + } + }; + + var torqueLayer = { + type: 'torque', + options: { + sql: "select 1 id, '1970-01-02'::date d, 'POINT(0 0)'::geometry the_geom_webmercator", + cartocss: [ + "Map {", + "-torque-frame-count:2;", + "-torque-resolution:3;", + "-torque-time-attribute:d;", + "-torque-aggregation-function:'count(id)';", + "}" + ].join(' '), + cartocss_version: '2.0.1' + } + }; + + var mapnikLayer = { + type: 'mapnik', + options: { + sql: sql, + cartocss_version: cartocssVersion, + cartocss: cartocss, + geom_column: 'the_geom' + } + }; + + var mapnikInteractivityLayer = { + type: 'mapnik', + options: { + sql: sql, + cartocss_version: cartocssVersion, + cartocss: cartocss, + interactivity: 'i', + geom_column: 'the_geom' + } + }; + + var cartodbLayer = { + type: 'cartodb', + options: { + sql: sql, + cartocss_version: cartocssVersion, + cartocss: cartocss, + geom_column: 'the_geom' + } + }; + + var cartodbInteractivityLayer = { + type: 'cartodb', + options: { + sql: sql, + cartocss_version: cartocssVersion, + cartocss: cartocss, + interactivity: 'i', + geom_column: 'the_geom' + } + }; + + var cartodbWadusInteractivityLayer = { + type: 'cartodb', + options: { + sql: sqlWadus, + cartocss_version: cartocssVersion, + cartocss: cartocss, + interactivity: 'wadus', + geom_column: 'the_geom' + } + }; + + var noTypeLayer = { + options: { + sql: sql, + cartocss_version: cartocssVersion, + cartocss: cartocss, + geom_column: 'the_geom' + } + }; + + var noTypeInteractivityLayer = { + options: { + sql: sql, + cartocss_version: cartocssVersion, + cartocss: cartocss, + interactivity: 'i', + geom_column: 'the_geom' + } + }; + + var allLayers = [ + httpLayer, + torqueLayer, + mapnikLayer, + mapnikInteractivityLayer, + cartodbLayer, + cartodbInteractivityLayer, + cartodbWadusInteractivityLayer, + noTypeLayer, + noTypeInteractivityLayer + ]; + + var testScenarios = [ + { + desc: 'one layer, no interactivity', + layers: [cartodbLayer] + }, + { + desc: 'one layer with interactivity', + layers: [cartodbInteractivityLayer] + }, + { + desc: 'two layers, interactivity mix', + layers: [ + cartodbLayer, + cartodbInteractivityLayer + ] + }, + { + desc: 'two layers, different interactivity columns', + layers: [ + cartodbWadusInteractivityLayer, + cartodbInteractivityLayer + ] + }, + { + desc: 'mix of no interactivity with interactivity', + layers: [ + cartodbInteractivityLayer, + cartodbLayer, + cartodbWadusInteractivityLayer + ] + }, + { + desc: 'interactivity layers + torque', + layers: [ + cartodbWadusInteractivityLayer, + cartodbInteractivityLayer, + torqueLayer + ] + }, + { + desc: 'torque + interactivity layers', + layers: [ + torqueLayer, + cartodbWadusInteractivityLayer, + cartodbInteractivityLayer + ] + }, + { + desc: 'interactivity + torque + interactivity', + layers: [ + cartodbInteractivityLayer, + torqueLayer, + cartodbInteractivityLayer + ] + }, + { + desc: 'http + mix of [no] interactivity layers', + layers: [ + httpLayer, + cartodbInteractivityLayer, + cartodbLayer, + cartodbInteractivityLayer + ] + }, + { + desc: 'http + interactivity + torque + interactivity', + layers: [ + httpLayer, + cartodbInteractivityLayer, + torqueLayer, + cartodbInteractivityLayer + ] + }, + { + desc: 'http + interactivity + torque + no interactivity + torque + interactivity', + layers: [ + httpLayer, + cartodbInteractivityLayer, + torqueLayer, + cartodbLayer, + torqueLayer, + cartodbWadusInteractivityLayer + ] + }, + { + desc: 'mapnik type – two layers, interactivity mix', + layers: [ + mapnikLayer, + mapnikInteractivityLayer + ] + }, + { + desc: 'mapnik type – mix of no interactivity with interactivity', + layers: [ + cartodbInteractivityLayer, + cartodbLayer, + mapnikInteractivityLayer + ] + }, + { + desc: 'mapnik type – interactivity layers + torque', + layers: [ + mapnikInteractivityLayer, + cartodbInteractivityLayer, + torqueLayer + ] + }, + { + desc: 'mapnik type – http + interactivity + torque + interactivity', + layers: [ + httpLayer, + mapnikInteractivityLayer, + torqueLayer, + cartodbInteractivityLayer + ] + }, + { + desc: 'no type – two layers, interactivity mix', + layers: [ + noTypeLayer, + noTypeInteractivityLayer + ] + }, + { + desc: 'no type – mix of no interactivity with interactivity', + layers: [ + noTypeInteractivityLayer, + noTypeLayer, + mapnikInteractivityLayer + ] + }, + { + desc: 'no type – interactivity layers + torque', + layers: [ + noTypeLayer, + noTypeInteractivityLayer, + torqueLayer + ] + }, + { + desc: 'no type – http + interactivity + torque + interactivity', + layers: [ + httpLayer, + noTypeInteractivityLayer, + torqueLayer, + noTypeInteractivityLayer + ] + } + ]; + + var chaosScenariosSize = 25; + var chaosScenarios = []; + for (var i = 0; i < chaosScenariosSize; i++) { + // Underscore.js' sample method uses Fisher-Yates shuffle internally, see http://bost.ocks.org/mike/shuffle/ + var randomLayers = _.sample(allLayers, _.random(1, allLayers.length)); + chaosScenarios.push({ + desc: 'chaos scenario – layer types: ' + randomLayers.map(layerType).join(', '), + layers: randomLayers + }); + } + + testScenarios.forEach(testInteractivityLayersOrderScenario); + chaosScenarios.forEach(testInteractivityLayersOrderScenario); + +}); + diff --git a/test/acceptance/ported/raster.js b/test/acceptance/ported/raster.js new file mode 100644 index 00000000..fae25ba1 --- /dev/null +++ b/test/acceptance/ported/raster.js @@ -0,0 +1,159 @@ +require('../../support/test_helper'); + +var assert = require('../../support/assert'); +var redis = require('redis'); +var step = require('step'); +var cartodbServer = require('../../../lib/cartodb/server'); +var ServerOptions = require('./support/ported_server_options'); + +describe('raster', function() { + + var server = cartodbServer(ServerOptions); + server.req2params = ServerOptions.req2params; + server.setMaxListeners(0); + var redis_client = redis.createClient(ServerOptions.redis.port); + + function checkCORSHeaders(res) { + assert.equal(res.headers['access-control-allow-headers'], 'X-Requested-With, X-Prototype-Version, X-CSRF-Token'); + assert.equal(res.headers['access-control-allow-origin'], '*'); + } + + var IMAGE_EQUALS_TOLERANCE_PER_MIL = 2; + + it("can render raster for valid mapconfig", function(done) { + + var mapconfig = { + version: '1.2.0', + layers: [ + { type: 'mapnik', options: { + sql: "select ST_AsRaster(" + + " ST_MakeEnvelope(-100,-40, 100, 40, 4326), " + + " 1.0, -1.0, '8BUI', 127) as rst", + geom_column: 'rst', + geom_type: 'raster', + cartocss: '#layer { raster-opacity:1.0 }', + cartocss_version: '2.0.1' + } } + ] + }; + var expected_token; + step( + function do_post() + { + var next = this; + assert.response(server, { + url: '/database/windshaft_test/layergroup', + method: 'POST', + headers: {'Content-Type': 'application/json' }, + data: JSON.stringify(mapconfig) + }, {}, function(res, err) { next(err, res); }); + }, + function checkPost(err, res) { + assert.ifError(err); + assert.equal(res.statusCode, 200, res.statusCode + ': ' + res.body); + // CORS headers should be sent with response + // from layergroup creation via POST + checkCORSHeaders(res); + var parsedBody = JSON.parse(res.body); + if ( expected_token ) { + assert.deepEqual(parsedBody, {layergroupid: expected_token, layercount: 2}); + } else { + expected_token = parsedBody.layergroupid; + } + return null; + }, + function do_get_tile(err) + { + assert.ifError(err); + var next = this; + assert.response(server, { + url: '/database/windshaft_test/layergroup/' + expected_token + '/0/0/0.png', + method: 'GET', + encoding: 'binary' + }, {}, function(res, err) { next(err, res); }); + }, + function check_response(err, res) { + assert.ifError(err); + assert.equal(res.statusCode, 200, res.body); + assert.deepEqual(res.headers['content-type'], "image/png"); + var next = this; + assert.imageEqualsFile(res.body, + './test/fixtures/raster_gray_rect.png', + IMAGE_EQUALS_TOLERANCE_PER_MIL, function(err) { + try { + assert.ifError(err); + next(); + } catch (err) { next(err); } + }); + }, + function finish(err) { + var errors = []; + if ( err ) { + errors.push(''+err); + } + redis_client.exists("map_cfg|" + expected_token, function(err/*, exists*/) { + if ( err ) { + errors.push(err.message); + } + //assert.ok(exists, "Missing expected token " + expected_token + " from redis"); + redis_client.del("map_cfg|" + expected_token, function(err) { + if ( err ) { + errors.push(err.message); + } + if ( errors.length ) { + done(new Error(errors)); + } else { + done(null); + } + }); + }); + } + ); + }); + + it("raster geom type does not allow interactivity", function(done) { + + var mapconfig = { + version: '1.2.0', + layers: [ + { + type: 'cartodb', + options: { + sql: [ + "select 1 id,", + "ST_AsRaster(ST_MakeEnvelope(-100, -40, 100, 40, 4326), 1.0, -1.0, '8BUI', 127) as rst" + ].join(' '), + geom_column: 'rst', + geom_type: 'raster', + cartocss: '#layer { raster-opacity: 1.0 }', + cartocss_version: '2.0.1', + interactivity: 'id' + } + } + ] + }; + + assert.response(server, + { + url: '/database/windshaft_test/layergroup', + method: 'POST', + headers: { + 'Content-Type': 'application/json' + }, + data: JSON.stringify(mapconfig) + }, + { + status: 400 + }, + function(res, err) { + assert.ok(!err); + checkCORSHeaders(res); + var parsedBody = JSON.parse(res.body); + assert.deepEqual(parsedBody, { errors: [ 'Mapnik raster layers do not support interactivity' ] }); + done(); + } + ); + }); + +}); + diff --git a/test/acceptance/ported/regressions.js b/test/acceptance/ported/regressions.js new file mode 100644 index 00000000..d1d177df --- /dev/null +++ b/test/acceptance/ported/regressions.js @@ -0,0 +1,159 @@ +require('../../support/test_helper'); + +var assert = require('../../support/assert'); +var _ = require('underscore'); +var fs = require('fs'); +var http = require('http'); +var cartodbServer = require('../../../lib/cartodb/server'); +var ServerOptions = require('./support/ported_server_options'); +var testClient = require('./support/test_client'); + +function rmdir_recursive_sync(dirname) { + var files = fs.readdirSync(dirname); + for (var i=0; i 0); + lastXwc = xwc; + + requestTile(tileUrl, function (err, res) { + var xwc = res.headers['x-windshaft-cache']; + assert.ok(xwc); + assert.ok(xwc > 0); + assert.ok(xwc >= lastXwc); + + requestTile(tileUrl + '?cache_buster=wadus', function (err, res) { + var xwc = res.headers['x-windshaft-cache']; + assert.ok(!xwc); + + finish(done); + }); + }); + }); + }); + }); + + it("should not choke when queries end with a semicolon", function(done){ + testClient.getTile(testClient.singleLayerMapConfig('SELECT * FROM test_table limit 2;'), 0, 0, 0, done); + }); + + it("should not choke when sql ends with a semicolon and some blanks", function(done){ + testClient.getTile(testClient.singleLayerMapConfig('SELECT * FROM test_table limit 2; \t\n'), 0, 0, 0, done); + }); + + it("should not strip quoted semicolons within an sql query", function(done){ + testClient.getTile( + testClient.singleLayerMapConfig("SELECT * FROM test_table where name != ';\n'"), 0, 0, 0, done + ); + }); + + it("getting two tiles with same configuration uses renderer cache", function(done) { + + var imageFixture = './test/fixtures/test_table_13_4011_3088_styled.png'; + var tileUrl = '/13/4011/3088.png'; + var mapConfig = testClient.defaultTableMapConfig( + 'test_table', + '#test_table{marker-fill: blue;marker-line-color: black;}' + ); + + function validateLayergroup(res) { + // cache is hit because we create a renderer to validate the map config + assert.ok(!res.headers.hasOwnProperty('x-windshaft-cache'), "Did hit renderer cache on first time"); + } + + testClient.withLayergroup(mapConfig, validateLayergroup, function(err, requestTile, finish) { + + requestTile(tileUrl, function(err, res) { + 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); + }); + }); + }); + }); + }); + + var test_style_black_200 = "#test_table{marker-fill:black;marker-line-color:black;marker-width:5}"; + var test_style_black_210 = "#test_table{marker-fill:black;marker-line-color:black;marker-width:10}"; + + it("get'ing a tile with url specified 2.0.0 style should return an expected tile", function(done){ + testClient.getTile(testClient.defaultTableMapConfig('test_table', test_style_black_200, '2.0.0'), + 13, 4011, 3088, imageCompareFn('test_table_13_4011_3088_styled_black.png', done)); + }); + + it("get'ing a tile with url specified 2.1.0 style should return an expected tile", function(done){ + testClient.getTile(testClient.defaultTableMapConfig('test_table', test_style_black_210, '2.1.0'), + 13, 4011, 3088, imageCompareFn('test_table_13_4011_3088_styled_black.png', done)); + }); + + // See http://github.com/CartoDB/Windshaft/issues/99 + it("unused directives are tolerated", function(done){ + var style = "#test_table{point-transform: 'scale(100)';}"; + var sql = "SELECT 1 as cartodb_id, 'SRID=4326;POINT(0 0)'::geometry as the_geom"; + testClient.getTile(testClient.singleLayerMapConfig(sql, style), 0, 0, 0, + imageCompareFn('test_default_mapnik_point.png', done)); + }); + + // See http://github.com/CartoDB/Windshaft/issues/100 + var test_strictness = function(done) { + var nonStrictMapConfig = testClient.singleLayerMapConfig( + "SELECT 1 as cartodb_id, 'SRID=3857;POINT(666 666)'::geometry as the_geom", + "#test_table{point-transform: 'scale(100)';}" + ); + testClient.withLayergroup(nonStrictMapConfig, function(err, requestTile, finish) { + var options = { + statusCode: 400, + contentType: 'application/json; charset=utf-8' + }; + requestTile('/0/0/0.png?strict=1', options, function() { + finish(done); + }); + }); + }; + var test_strict_lbl = "unused directives are not tolerated if strict"; + if ( semver.satisfies(mapnik.versions.mapnik, '2.3.x') ) { + // Strictness handling changed in 2.3.x, possibly a bug: + // see http://github.com/mapnik/mapnik/issues/2301 + console.warn("Strictness test skipped due to http://github.com/mapnik/mapnik/issues/2301"); + it.skip(test_strict_lbl, test_strictness); + } + else { + it(test_strict_lbl, test_strictness); + } + + it('high cpu regression with mapnik <2.3.x', function(done) { + var sql = [ + "SELECT 'my polygon name here' AS name,", + "st_envelope(st_buffer(st_transform(", + "st_setsrid(st_makepoint(-26.6592894004,49.7990296995),4326),3857),10000000)) AS the_geom", + "FROM generate_series(-6,6) x", + "UNION ALL", + "SELECT 'my marker name here' AS name,", + " st_transform(st_setsrid(st_makepoint(49.6042060319,-49.0522997372),4326),3857) AS the_geom", + "FROM generate_series(-6,6) x" + ].join(' '); + + var style = [ + '#test_table {marker-fill:#ff7;', + ' marker-max-error:0.447492761618;', + ' marker-line-opacity:0.659371340628;', + ' marker-allow-overlap:true;', + ' polygon-fill:green;', + ' marker-spacing:0.0;', + ' marker-width:4.0;', + ' marker-height:18.0;', + ' marker-opacity:0.942312062822;', + ' line-color:green;', + ' line-gamma:0.945973211092;', + ' line-cap:square;', + ' polygon-opacity:0.12576055992;', + ' marker-type:arrow;', + ' polygon-gamma:0.46354913107;', + ' line-dasharray:33,23;', + ' line-join:bevel;', + ' marker-placement:line;', + ' line-width:1.0;', + ' marker-line-color:#ff7;', + ' line-opacity:0.39403752154;', + ' marker-line-width:3.0;', + '}' + ].join(''); + + testClient.getTile(testClient.singleLayerMapConfig(sql, style), 13, 4011, 3088, done); + }); + + // https://github.com/CartoDB/Windshaft-cartodb/issues/316 + it('should return errors with better formatting', function(done) { + var mapConfig = { + "version": "1.0.1", + "minzoom": 0, + "maxzoom": 20, + "layers": [ + { + "type": 'mapnik', + "options": { + "cartocss_version": '2.1.1', + "sql": "SELECT null::geometry AS the_geom", + "cartocss": [ + '@water: #cdd2d4;', + 'Map {', + '\tbackground-color: @water;', + '\tbufferz-size: 256;', + '}', + '@landmass_fill: lighten(#e3e3dc, 8%);' + ].join('\n') + } + }, + { + "type": 'mapnik', + "options": { + "cartocss_version": '2.1.1', + "sql": "SELECT the_geom FROM false_background_zoomed('!scale_denominator!', !bbox!) AS _", + "cartocss": [ + '#false_background {', + '\tpolygon-fill: @landmass_fill;', + '}' + ].join('\n') + } + } + ] + }; + + var options = { + statusCode: 400 + }; + + testClient.createLayergroup(mapConfig, options, function(err, res, parsedBody) { + assert.ok(parsedBody.errors); + // more assertions when errors is populated with better format + done(); + }); + }); + +}); diff --git a/test/acceptance/ported/server_png8_format.js b/test/acceptance/ported/server_png8_format.js new file mode 100644 index 00000000..086af362 --- /dev/null +++ b/test/acceptance/ported/server_png8_format.js @@ -0,0 +1,175 @@ +require('../../support/test_helper'); + +var assert = require('../../support/assert'); +var _ = require('underscore'); +var fs = require('fs'); +var redis = require('redis'); +var cartodbServer = require('../../../lib/cartodb/server'); +var ServerOptions = require('./support/ported_server_options'); + +var IMAGE_EQUALS_TOLERANCE_PER_MIL = 85; + +describe('server_png8_format', function() { + + var serverOptionsPng32 = ServerOptions; + serverOptionsPng32.grainstore = _.clone(ServerOptions.grainstore); + serverOptionsPng32.grainstore.mapnik_tile_format = 'png32'; + var serverPng32 = new cartodbServer(serverOptionsPng32); + serverPng32.req2params = ServerOptions.req2params; + serverPng32.setMaxListeners(0); + + var serverOptionsPng8 = ServerOptions; + serverOptionsPng8.grainstore = _.clone(ServerOptions.grainstore); + serverOptionsPng8.grainstore.mapnik_tile_format = 'png8:m=h'; + var serverPng8 = new cartodbServer(serverOptionsPng8); + serverPng8.req2params = ServerOptions.req2params; + serverPng8.setMaxListeners(0); + + + var redisClient = redis.createClient(ServerOptions.redis.port); + + var layergroupId; + + before(function(done) { + var testPngFilesDir = __dirname + '/../../results/png'; + fs.readdirSync(testPngFilesDir) + .filter(function(fileName) { + return /.*\.png$/.test(fileName); + }) + .map(function(fileName) { + return testPngFilesDir + '/' + fileName; + }) + .forEach(fs.unlinkSync); + + done(); + }); + + function testOutputForPng32AndPng8(desc, tile, callback) { + + var bufferPng32, + bufferPng8; + + it(desc + '; tile: ' + JSON.stringify(tile), function(done){ + assert.response( + serverPng32, + { + url: '/database/windshaft_test/layergroup', + method: 'POST', + headers: { + 'Content-Type': 'application/json' + }, + data: JSON.stringify(layergroup) + }, + { + status: 200 + }, + function(res, err) { + if (err) { + return done(err); + } + + layergroupId = JSON.parse(res.body).layergroupid; + + var tilePartialUrl = _.template('/<%= z %>/<%= x %>/<%= y %>.png', tile); + + var requestPayload = { + url: '/database/windshaft_test/layergroup/' + layergroupId + tilePartialUrl, + method: 'GET', + encoding: 'binary' + }; + + var requestHeaders = { + status: 200, + headers: { + 'Content-Type': 'image/png' + } + }; + + assert.response(serverPng32, requestPayload, requestHeaders, function(responsePng32) { + assert.equal(responsePng32.headers['content-type'], "image/png"); + bufferPng32 = responsePng32.body; + assert.response(serverPng8, requestPayload, requestHeaders, function(responsePng8) { + 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, + function(err, imagePaths, similarity) { + redisClient.del('map_cfg|' + layergroupId, function() { + callback(err, imagePaths, similarity, done); + }); + } + ); + }); + }); + } + ); + }); + } + + + var currentLevel = 3, + allLevelTiles = [], + maxLevelTile = Math.pow(2, currentLevel); + + for (var i = 0; i < maxLevelTile; i++) { + for (var j = 0; j < maxLevelTile; j++) { + allLevelTiles.push({ + z: currentLevel, + x: i, + y: j + }); + } + } + + + var layergroup = { + version: '1.3.0', + layers: [ + { + options: { + sql: 'SELECT * FROM populated_places_simple_reduced', + cartocss: [ + '#populated_places_simple_reduced {', + 'marker-fill: #FFCC00;', + 'marker-width: 10;', + 'marker-line-color: #FFF;', + 'marker-line-width: 1.5;', + 'marker-line-opacity: 1;', + 'marker-fill-opacity: 0.9;', + 'marker-comp-op: multiply;', + 'marker-type: ellipse;', + 'marker-placement: point;', + 'marker-allow-overlap: true;', + 'marker-clip: false;', + '}' + ].join(' '), + cartocss_version: '2.0.1' + } + } + ] + }; + + var allImagePaths = [], + similarities = []; + allLevelTiles.forEach(function(tile) { + testOutputForPng32AndPng8('intensity visualization', tile, function(err, imagePaths, similarity, done) { + allImagePaths.push(imagePaths); + similarities.push(similarity); + var transformPaths = []; + for (var i = 0, len = allImagePaths.length; i < len; i++) { + if (similarities[i] > 0.075) { + transformPaths.push({ + passive: allImagePaths[i][0], + active: allImagePaths[i][1], + similarity: similarities[i] + }); + } + } + var output = 'handleResults(' + JSON.stringify(transformPaths) + ');'; + fs.writeFileSync('test/results/png/results.js', output); + assert.ifError(err); + done(); + }); + }); +}); + diff --git a/test/acceptance/ported/static_maps.js b/test/acceptance/ported/static_maps.js new file mode 100644 index 00000000..1002cdd5 --- /dev/null +++ b/test/acceptance/ported/static_maps.js @@ -0,0 +1,146 @@ +require('../../support/test_helper'); + +var assert = require('../../support/assert'); +var testClient = require('./support/test_client'); +var http = require('http'); +var fs = require('fs'); + +describe('static_maps', function() { + + var validUrlTemplate = 'http://127.0.0.1:8033/{s}/{z}/{x}/{y}.png'; + var invalidUrlTemplate = 'http://127.0.0.1:8033/INVALID/{z}/{x}/{y}.png'; + + var httpRendererResourcesServer; + + before(function(done) { + // Start a server to test external resources + httpRendererResourcesServer = http.createServer( function(request, response) { + var filename = __dirname + '/../../fixtures/http/basemap.png'; + fs.readFile(filename, {encoding: 'binary'}, function(err, file) { + response.writeHead(200); + response.write(file, "binary"); + response.end(); + }); + }); + httpRendererResourcesServer.listen(8033, done); + }); + + after(function(done) { + httpRendererResourcesServer.close(done); + }); + + function staticMapConfig(urlTemplate, cartocss) { + return { + version: '1.2.0', + layers: [ + { + type: 'http', + options: { + urlTemplate: urlTemplate, + subdomains: ['abcd'] + } + }, + { + type: 'mapnik', + options: { + sql: 'SELECT * FROM populated_places_simple_reduced', + cartocss: cartocss || '#layer { marker-fill:red; } #layer { marker-width: 2; }', + cartocss_version: '2.3.0' + } + } + ] + }; + } + + var zoom = 3, + lat = 0, + lon = 0, + width = 400, + height = 300; + + it('center image', function (done) { + var mapConfig = staticMapConfig(validUrlTemplate); + testClient.getStaticCenter(mapConfig, zoom, lat, lon, width, height, function(err, res, image) { + if (err) { + return done(err); + } + + assert.equal(image.width(), width); + assert.equal(image.height(), height); + + done(); + }); + }); + + it('center image with invalid basemap', function (done) { + var mapConfig = staticMapConfig(invalidUrlTemplate); + testClient.getStaticCenter(mapConfig, zoom, lat, lon, width, height, function(err, res, image) { + if (err) { + return done(err); + } + + assert.equal(image.width(), width); + assert.equal(image.height(), height); + + done(); + }); + }); + + var west = -90, + south = -45, + east = 90, + north = 45, + bbWidth = 640, + bbHeight = 480; + + it('bbox', function (done) { + var mapConfig = staticMapConfig(validUrlTemplate); + testClient.getStaticBbox(mapConfig, west, south, east, north, bbWidth, bbHeight, function(err, res, image) { + if (err) { + return done(err); + } + + assert.equal(image.width(), bbWidth); + assert.equal(image.height(), bbHeight); + + done(); + }); + }); + + + it('should not fail for coordinates out of range', function (done) { + var outOfRangeHeight = 3000; + var mapConfig = staticMapConfig(validUrlTemplate); + testClient.getStaticCenter(mapConfig, 1, lat, lon, width, outOfRangeHeight, function(err, res, image) { + if (err) { + return done(err); + } + + assert.equal(image.width(), width); + assert.equal(image.height(), outOfRangeHeight); + + done(); + }); + }); + + + it('should keep failing for other errors', function (done) { + var invalidStyleForZoom = '#layer { marker-fill:red; } #layer[zoom='+zoom+'] { marker-width: [wadus] * 2; }'; + var mapConfig = staticMapConfig(validUrlTemplate, invalidStyleForZoom); + var expectedResponse = { + statusCode: 400, + headers: { + 'Content-Type': 'application/json; charset=utf-8' + } + }; + testClient.getStaticCenter(mapConfig, zoom, lat, lon, width, height, expectedResponse, function(err, res) { + assert.ok(!err); + var parsedBody = JSON.parse(res.body); + assert.ok(parsedBody.errors); + assert.ok(parsedBody.errors.length); + assert.ok(parsedBody.errors[0].match(/column \"wadus\" does not exist/)); + done(); + }); + }); + +}); diff --git a/test/acceptance/ported/support/ported_server_options.js b/test/acceptance/ported/support/ported_server_options.js new file mode 100644 index 00000000..2e328473 --- /dev/null +++ b/test/acceptance/ported/support/ported_server_options.js @@ -0,0 +1,77 @@ +var _ = require('underscore'); +var serverOptions = require('../../../../lib/cartodb/server_options'); +var LayergroupToken = require('../../../../lib/cartodb/models/layergroup_token'); +var mapnik = require('windshaft').mapnik; + +module.exports = _.extend({}, serverOptions, { + base_url: '/database/:dbname/table/:table', + base_url_mapconfig: '/database/:dbname/layergroup', + grainstore: { + datasource: { + geometry_field: 'the_geom', + srid: 4326 + }, + cachedir: global.environment.millstone.cache_basedir, + mapnik_version: global.environment.mapnik_version || mapnik.versions.mapnik, + gc_prob: 0 // run the garbage collector at each invocation + }, + renderer: { + mapnik: { + poolSize: 4,//require('os').cpus().length, + metatile: 1, + bufferSize: 64, + snapToGrid: false, + clipByBox2d: false, // this requires postgis >=2.2 and geos >=3.5 + scale_factors: [1, 2], + limits: { + render: 0, + cacheOnTimeout: true + } + }, + http: { + timeout: 5000, + whitelist: ['http://127.0.0.1:8033/{s}/{z}/{x}/{y}.png'], + fallbackImage: { + type: 'fs', + src: __dirname + '/../../test/fixtures/http/basemap.png' + } + } + }, + redis: global.environment.redis, + enable_cors: global.environment.enable_cors, + unbuffered_logging: true, // for smoother teardown from tests + log_format: null, // do not log anything + afterLayergroupCreateCalls: 0, + useProfiler: true, + req2params: function(req, callback){ + + if ( req.query.testUnexpectedError ) { + return callback('test unexpected error'); + } + + // this is in case you want to test sql parameters eg ...png?sql=select * from my_table limit 10 + req.params = _.extend({}, req.params); + if (req.params.token) { + req.params.token = LayergroupToken.parse(req.params.token).token; + } + + _.extend(req.params, req.query); + req.params.user = 'localhost'; + req.params.dbuser = 'test_windshaft_publicuser'; + req.params.dbname = 'test_windshaft_cartodb_user_1_db'; + + + // increment number of calls counter + // NOTE: "this" would likely point to the server instance + this.req2params_calls = this.req2params_calls ? this.req2params_calls + 1 : 1; + + // send the finished req object on + callback(null,req); + }, + afterLayergroupCreate: function(req, cfg, res, callback) { + res.layercount = cfg.layers.length; +// config.afterLayergroupCreateCalls++; + callback(null); + } + +}); diff --git a/test/acceptance/ported/support/test_client.js b/test/acceptance/ported/support/test_client.js new file mode 100644 index 00000000..6563c043 --- /dev/null +++ b/test/acceptance/ported/support/test_client.js @@ -0,0 +1,467 @@ +require('../../../support/test_helper'); +var step = require('step'); +var assert = require('../../../support/assert'); +var redis = require('redis'); +var _ = require('underscore'); +var querystring = require('querystring'); +var mapnik = require('windshaft').mapnik; +var CartodbServer = require('../../../../lib/cartodb/server'); +var PortedServerOptions = require('./ported_server_options'); + +var DEFAULT_POINT_STYLE = [ + '#layer {', + ' marker-fill: #FF6600;', + ' marker-opacity: 1;', + ' marker-width: 16;', + ' marker-line-color: white;', + ' marker-line-width: 3;', + ' marker-line-opacity: 0.9;', + ' marker-placement: point;', + ' marker-type: ellipse;', + ' marker-allow-overlap: true;', + '}' +].join(''); + +module.exports = { + createLayergroup: createLayergroup, + withLayergroup: withLayergroup, + + singleLayerMapConfig: singleLayerMapConfig, + defaultTableMapConfig: defaultTableMapConfig, + + getStaticBbox: getStaticBbox, + getStaticCenter: getStaticCenter, + getGrid: getGrid, + getGridJsonp: getGridJsonp, + getTorque: getTorque, + getTile: getTile, + getTileLayer: getTileLayer +}; + + +var server = new CartodbServer(PortedServerOptions); +server.req2params = PortedServerOptions.req2params; +server.setMaxListeners(0); +var redisClient = redis.createClient(global.environment.redis.port); + +var jsonContentType = 'application/json; charset=utf-8'; +var pngContentType = 'image/png'; + +function createLayergroup(layergroupConfig, options, callback) { + if (!callback) { + callback = options; + options = { + method: 'POST', + statusCode: 200 + }; + } + + var expectedResponse = { + status: options.statusCode || 200, + headers: options.headers || { + 'Content-Type': 'application/json; charset=utf-8' + } + }; + + step( + function requestLayergroup() { + var next = this; + var request = layergroupRequest(layergroupConfig, options.method, options.callbackName, options.params); + assert.response(serverInstance(options), request, expectedResponse, function (res, err) { + next(err, res); + }); + }, + function validateLayergroup(err, res) { + assert.ok(!err, 'Failed to request layergroup'); + + var parsedBody; + var layergroupid; + if (!options.callbackName) { + parsedBody = JSON.parse(res.body); + layergroupid = parsedBody.layergroupid; + } + + if (layergroupid) { + var redisKey = 'map_cfg|' + layergroupid; + redisClient.del(redisKey, function (/*delErr*/) { + return callback(err, res, parsedBody); + }); + } else { + return callback(err, res, parsedBody); + } + } + ); +} + +function serverInstance(options) { + if (options.server) { + return options.server; + } + + if (options.serverOptions) { + var otherServer = new CartodbServer(options.serverOptions); + otherServer.req2params = options.serverOptions.req2params; + otherServer.setMaxListeners(0); + return otherServer; + } + + return server; +} + +function layergroupRequest(layergroupConfig, method, callbackName, extraParams) { + method = method || 'POST'; + + var request = { + url: '/database/windshaft_test/layergroup', + headers: { + 'Content-Type': 'application/json' + } + }; + + var urlParams = _.extend({}, extraParams); + if (callbackName) { + urlParams.callback = callbackName; + } + + if (method.toUpperCase() === 'GET') { + request.method = 'GET'; + urlParams.config = JSON.stringify(layergroupConfig); + } else { + request.method = 'POST'; + request.data = JSON.stringify(layergroupConfig); + } + + if (Object.keys(urlParams).length) { + request.url += '?' + querystring.stringify(urlParams); + } + + return request; +} + +function singleLayerMapConfig(sql, cartocss, cartocssVersion, interactivity) { + return { + version: '1.3.0', + layers: [ + { + type: 'mapnik', + options: { + sql: sql, + cartocss: cartocss || DEFAULT_POINT_STYLE, + cartocss_version: cartocssVersion || '2.3.0', + interactivity: interactivity, + geom_column: 'the_geom' + } + } + ] + }; +} + +function defaultTableMapConfig(tableName, cartocss, cartocssVersion, interactivity) { + return singleLayerMapConfig(defaultTableQuery(tableName), cartocss, cartocssVersion, interactivity); +} + +function defaultTableQuery(tableName) { + return _.template('SELECT * FROM <%= tableName %>', {tableName: tableName}); +} + +function getStaticBbox(layergroupConfig, west, south, east, north, width, height, expectedResponse, callback) { + if (!callback) { + callback = expectedResponse; + expectedResponse = pngContentType; + } + + var url = [ + 'static', + 'bbox', + '<%= layergroupid %>', + [west, south, east, north].join(','), + width, + height + ].join('/') + '.png'; + return getGeneric(layergroupConfig, url, expectedResponse, callback); +} + +function getStaticCenter(layergroupConfig, zoom, lat, lon, width, height, expectedResponse, callback) { + if (!callback) { + callback = expectedResponse; + expectedResponse = pngContentType; + } + + var url = [ + 'static', + 'center', + '<%= layergroupid %>', + zoom, + lat, + lon, + width, + height + ].join('/') + '.png'; + return getGeneric(layergroupConfig, url, expectedResponse, callback); +} + +function getGrid(layergroupConfig, layer, z, x, y, expectedResponse, callback) { + if (!callback) { + callback = expectedResponse; + expectedResponse = jsonContentType; + } + + var options = { + layer: layer, + z: z, + x: x, + y: y, + format: 'grid.json' + }; + return getLayer(layergroupConfig, options, expectedResponse, callback); +} + +function getGridJsonp(layergroupConfig, layer, z, x, y, jsonpCallbackName, expectedResponse, callback) { + if (!callback) { + callback = expectedResponse; + expectedResponse = jsonContentType; + } + + var options = { + layer: layer, + z: z, + x: x, + y: y, + format: 'grid.json', + jsonpCallbackName: jsonpCallbackName + }; + return getLayer(layergroupConfig, options, expectedResponse, callback); +} + +function getTorque(layergroupConfig, layer, z, x, y, expectedResponse, callback) { + if (!callback) { + callback = expectedResponse; + expectedResponse = jsonContentType; + } + + var options = { + layer: layer, + z: z, + x: x, + y: y, + format: 'torque.json' + }; + return getLayer(layergroupConfig, options, expectedResponse, callback); +} + +function getTile(layergroupConfig, z, x, y, expectedResponse, callback) { + if (!callback) { + callback = expectedResponse; + expectedResponse = pngContentType; + } + + var options = { + z: z, + x: x, + y: y, + format: 'png' + }; + return getLayer(layergroupConfig, options, expectedResponse, callback); +} + +function getTileLayer(layergroupConfig, options, expectedResponse, callback) { + if (!callback) { + callback = expectedResponse; + expectedResponse = pngContentType; + } + + return getLayer(layergroupConfig, options, expectedResponse, callback); +} + +function getLayer(layergroupConfig, options, expectedResponse, callback) { + return getGeneric(layergroupConfig, tileUrlStrategy(options), expectedResponse, callback); +} + +function tileUrlStrategy(options) { + var urlLayerPattern = [ + '<%= layer %>', + '<%= z %>', + '<%= x %>', + '<%= y %>' + ].join('/') + '.<%= format %>'; + + if (options.jsonpCallbackName) { + urlLayerPattern += '?callback=<%= jsonpCallbackName %>'; + } + + var urlNoLayerPattern = [ + '<%= z %>', + '<%= x %>', + '<%= y %>' + ].join('/') + '.<%= format %>'; + + var urlTemplate = _.template((options.layer === undefined) ? urlNoLayerPattern : urlLayerPattern); + + options.format = options.format || 'png'; + + return '<%= layergroupid %>/' + urlTemplate(_.defaults(options, { z: 0, x: 0, y: 0, layer: 0 })); +} + +function getGeneric(layergroupConfig, url, expectedResponse, callback) { + if (_.isString(expectedResponse)) { + expectedResponse = { + status: 200, + headers: { + 'Content-Type': expectedResponse + } + }; + } + var contentType = expectedResponse.headers['Content-Type']; + + var layergroupid = null; + + step( + function requestLayergroup() { + var next = this; + var request = { + url: '/database/windshaft_test/layergroup', + method: 'POST', + headers: { + 'Content-Type': 'application/json' + }, + data: JSON.stringify(layergroupConfig) + }; + var expectedResponse = { + status: 200, + headers: { + 'Content-Type': 'application/json; charset=utf-8' + } + }; + assert.response(server, request, expectedResponse, function (res, err) { + next(err, res); + }); + }, + function validateLayergroup(err, res) { + assert.ok(!err, 'Failed to create layergroup'); + + var parsedBody = JSON.parse(res.body); + layergroupid = parsedBody.layergroupid; + + assert.ok(layergroupid); + + return res; + }, + function requestTile(err, res) { + assert.ok(!err, 'Invalid layergroup response: ' + res.body); + + var next = this; + + var finalUrl = '/database/windshaft_test/layergroup/' + _.template(url, { + layergroupid: layergroupid + }); + + var request = { + url: finalUrl, + method: 'GET' + }; + + if (contentType === pngContentType) { + request.encoding = 'binary'; + } + + assert.response(server, request, expectedResponse, function (res, err) { + next(err, res); + }); + }, + function validateTile(err, res) { + assert.ok(!err, 'Failed to get tile'); + var redisKey = 'map_cfg|' + layergroupid; + + var img; + if (contentType === pngContentType) { + img = new mapnik.Image.fromBytesSync(new Buffer(res.body, 'binary')); + } + + redisClient.del(redisKey, function (/*delErr*/) { + return callback(err, res, img); + }); + } + ); +} + +function withLayergroup(layergroupConfig, options, callback) { + var validationLayergroupFn = function() {}; + if (!callback) { + callback = options; + options = {}; + } + + if (_.isFunction(options)) { + validationLayergroupFn = options; + options = {}; + } + + var layergroupExpectedResponse = { + status: 200, + headers: { + 'Content-Type': 'application/json; charset=utf-8' + } + }; + + step( + function requestLayergroup() { + var next = this; + var request = layergroupRequest(layergroupConfig, 'POST'); + assert.response(serverInstance(options), request, layergroupExpectedResponse, function (res, err) { + next(err, res); + }); + }, + function validateLayergroup(err, res) { + assert.ok(!err, 'Failed to request layergroup'); + + var parsedBody = JSON.parse(res.body); + var layergroupid = parsedBody.layergroupid; + + assert.ok(layergroupid, 'No layergroup was created'); + + validationLayergroupFn(res); + + function requestTile(layergroupUrl, options, callback) { + if (!callback) { + callback = options; + options = { + statusCode: 200, + contentType: pngContentType + }; + } + + var baseUrlTpl = '/database/windshaft_test/layergroup/<%= layergroupid %>'; + var finalUrl = _.template(baseUrlTpl, { layergroupid: layergroupid }) + layergroupUrl; + + var request = { + url: finalUrl, + method: 'GET' + }; + + if (options.contentType === pngContentType) { + request.encoding = 'binary'; + } + + var tileExpectedResponse = { + status: options.statusCode || 200, + headers: { + 'Content-Type': options.contentType || pngContentType + } + }; + + assert.response(serverInstance(options), request, tileExpectedResponse, function (res, err) { + callback(err, res); + }); + } + + function finish(done) { + var redisKey = 'map_cfg|' + layergroupid; + redisClient.del(redisKey, function (delErr) { + return done(delErr); + }); + } + + return callback(err, requestTile, finish); + } + ); +} diff --git a/test/acceptance/ported/torque.js b/test/acceptance/ported/torque.js new file mode 100644 index 00000000..5b353642 --- /dev/null +++ b/test/acceptance/ported/torque.js @@ -0,0 +1,434 @@ +require('../../support/test_helper'); + +var assert = require('../../support/assert'); +var _ = require('underscore'); +var redis = require('redis'); +var step = require('step'); +var cartodbServer = require('../../../lib/cartodb/server'); +var ServerOptions = require('./support/ported_server_options'); + +describe('torque', function() { + + var server = cartodbServer(ServerOptions); + server.req2params = ServerOptions.req2params; + server.setMaxListeners(0); + var redis_client = redis.createClient(ServerOptions.redis.port); + + function checkCORSHeaders(res) { + assert.equal(res.headers['access-control-allow-headers'], 'X-Requested-With, X-Prototype-Version, X-CSRF-Token'); + assert.equal(res.headers['access-control-allow-origin'], '*'); + } + + it("missing required property from torque layer", function(done) { + + var layergroup = { + version: '1.1.0', + layers: [ + { type: 'torque', options: { + sql: 'select cartodb_id, the_geom from test_table', + geom_column: 'the_geom', + srid: 4326, + cartocss: 'Map { marker-fill:blue; }' + } } + ] + }; + + step( + function do_post1() + { + var next = this; + assert.response(server, { + url: '/database/windshaft_test/layergroup', + method: 'POST', + headers: {'Content-Type': 'application/json' }, + data: JSON.stringify(layergroup) + }, {}, function(res) { next(null, res); }); + }, + function checkResponse(err, res) { + assert.ifError(err); + assert.equal(res.statusCode, 400, res.statusCode + ': ' + res.body); + var parsed = JSON.parse(res.body); + assert.ok(parsed.errors, parsed); + var error = parsed.errors[0]; + assert.equal(error, + "Missing required property '-torque-frame-count' in torque layer CartoCSS"); + return null; + }, + function do_post2(err) + { + assert.ifError(err); + var next = this; + var css = 'Map { -torque-frame-count: 2; }'; + layergroup.layers[0].options.cartocss = css; + assert.response(server, { + url: '/database/windshaft_test/layergroup', + method: 'POST', + headers: {'Content-Type': 'application/json' }, + data: JSON.stringify(layergroup) + }, {}, function(res) { next(null, res); }); + }, + function checkResponse2(err, res) { + assert.ifError(err); + assert.equal(res.statusCode, 400, res.statusCode + ': ' + res.body); + var parsed = JSON.parse(res.body); + assert.ok(parsed.errors, parsed); + var error = parsed.errors[0]; + assert.equal(error, + "Missing required property '-torque-resolution' in torque layer CartoCSS"); + return null; + }, + function do_post3(err) + { + assert.ifError(err); + var next = this; + var css = 'Map { -torque-frame-count: 2; -torque-resolution: 3; }'; + layergroup.layers[0].options.cartocss = css; + assert.response(server, { + url: '/database/windshaft_test/layergroup', + method: 'POST', + headers: {'Content-Type': 'application/json' }, + data: JSON.stringify(layergroup) + }, {}, function(res) { next(null, res); }); + }, + function checkResponse3(err, res) { + assert.ifError(err); + assert.equal(res.statusCode, 400, res.statusCode + ': ' + res.body); + var parsed = JSON.parse(res.body); + assert.ok(parsed.errors, parsed); + var error = parsed.errors[0]; + assert.equal(error, + "Missing required property '-torque-aggregation-function' in torque layer CartoCSS"); + return null; + }, + function finish(err) { + done(err); + } + ); + }); + + // See http://github.com/CartoDB/Windshaft/issues/150 + it.skip("unquoted property in torque layer", function(done) { + + var layergroup = { + version: '1.1.0', + layers: [ + { type: 'torque', options: { + sql: 'select updated_at as d, cartodb_id as id, the_geom from test_table', + geom_column: 'the_geom', + srid: 4326, + cartocss: 'Map { -torque-frame-count:2; -torque-resolution:3; -torque-time-attribute:"d"; ' + + '-torque-aggregation-function:count(id); }' + } } + ] + }; + step( + function do_post1() + { + var next = this; + assert.response(server, { + url: '/database/windshaft_test/layergroup', + method: 'POST', + headers: {'Content-Type': 'application/json' }, + data: JSON.stringify(layergroup) + }, {}, function(res) { next(null, res); }); + }, + function checkResponse(err, res) { + assert.ifError(err); + assert.equal(res.statusCode, 400, res.statusCode + ': ' + res.body); + var parsed = JSON.parse(res.body); + assert.ok(parsed.errors, parsed); + var error = parsed.errors[0]; + assert.equal(error, "Something meaningful here"); + return null; + }, + function finish(err) { + done(err); + } + ); + }); + + it("can render tile for valid mapconfig", function(done) { + + var mapconfig = { + version: '1.1.0', + layers: [ + { type: 'torque', options: { + sql: "select 1 as id, '1970-01-02'::date as d, 'POINT(0 0)'::geometry as the_geom UNION select 2, " + + "'1970-01-01'::date, 'POINT(1 1)'::geometry", + geom_column: 'the_geom', + cartocss: 'Map { -torque-frame-count:2; -torque-resolution:3; -torque-time-attribute:d; ' + + '-torque-aggregation-function:\'count(id)\'; }', + cartocss_version: '2.0.1' + } } + ] + }; + + var expected_token; + step( + function do_post() + { + var next = this; + assert.response(server, { + url: '/database/windshaft_test/layergroup', + method: 'POST', + headers: {'Content-Type': 'application/json' }, + data: JSON.stringify(mapconfig) + }, {}, function(res, err) { next(err, res); }); + }, + function checkPost(err, res) { + assert.ifError(err); + assert.equal(res.statusCode, 200, res.statusCode + ': ' + res.body); + // CORS headers should be sent with response + // from layergroup creation via POST + checkCORSHeaders(res); + var parsedBody = JSON.parse(res.body); + if ( expected_token ) { + assert.deepEqual(parsedBody, {layergroupid: expected_token, layercount: 2}); + } else { + expected_token = parsedBody.layergroupid; + } + var meta = parsedBody.metadata; + assert.ok(!_.isUndefined(meta), + 'No metadata in torque MapConfig creation response: ' + res.body); + var tm = meta.torque; + assert.ok(tm, + 'No "torque" in metadata:' + JSON.stringify(meta)); + var tm0 = tm[0]; + assert.ok(tm0, + 'No layer 0 in "torque" in metadata:' + JSON.stringify(tm)); + var expectedTorqueMetadata = {"start":0,"end":86400000,"data_steps":2,"column_type":"date"}; + assert.deepEqual(tm0, expectedTorqueMetadata); + assert.deepEqual(meta.layers[0].meta, expectedTorqueMetadata); + return null; + }, + function do_get_tile(err) + { + assert.ifError(err); + var next = this; + assert.response(server, { + url: '/database/windshaft_test/layergroup/' + expected_token + '/0/0/0.png', + method: 'GET', + encoding: 'binary' + }, {}, function(res, err) { next(err, res); }); + }, + function check_mapnik_error_1(err, res) { + assert.ifError(err); + assert.equal(res.statusCode, 400, res.statusCode + ( res.statusCode !== 200 ? (': ' + res.body) : '' )); + var parsed = JSON.parse(res.body); + assert.equal(parsed.errors.length, 1); + assert.equal(parsed.errors[0], "No 'mapnik' layers in MapConfig"); + return null; + }, + function do_get_grid0(err) + { + assert.ifError(err); + var next = this; + assert.response(server, { + url: '/database/windshaft_test/layergroup/' + expected_token + '/0/0/0/0.grid.json', + method: 'GET' + }, {}, function(res, err) { next(err, res); }); + }, + function check_mapnik_error_2(err, res) { + assert.ifError(err); + assert.equal(res.statusCode, 400, res.statusCode + ( res.statusCode !== 200 ? (': ' + res.body) : '' )); + var parsed = JSON.parse(res.body); + assert.equal(parsed.errors.length, 1); + assert.equal(parsed.errors[0], "Unsupported format grid.json"); + return null; + }, + function do_get_torque0(err) + { + assert.ifError(err); + var next = this; + assert.response(server, { + url: '/database/windshaft_test/layergroup/' + expected_token + '/0/0/0/0.json.torque', + method: 'GET' + }, {}, function(res, err) { next(err, res); }); + }, + function check_torque0_response(err, res) { + assert.ifError(err); + assert.equal(res.statusCode, 200, res.body); + assert.equal(res.headers['content-type'], "application/json; charset=utf-8"); + var tile_content = [{"x__uint8":43,"y__uint8":43,"vals__uint8":[1,1],"dates__uint16":[0,1]}]; + var parsed = JSON.parse(res.body); + assert.deepEqual(tile_content, parsed); + return null; + }, + function do_get_torque0_1(err) + { + assert.ifError(err); + var next = this; + assert.response(server, { + url: '/database/windshaft_test/layergroup/' + expected_token + '/0/0/0/0.torque.json', + method: 'GET' + }, {}, function(res, err) { next(err, res); }); + }, + function check_torque0_response_1(err, res) { + assert.ifError(err); + assert.equal(res.statusCode, 200, res.body); + assert.equal(res.headers['content-type'], "application/json; charset=utf-8"); + var tile_content = [{"x__uint8":43,"y__uint8":43,"vals__uint8":[1,1],"dates__uint16":[0,1]}]; + var parsed = JSON.parse(res.body); + assert.deepEqual(tile_content, parsed); + return null; + }, + function finish(err) { + var errors = []; + if ( err ) { + errors.push(''+err); + } + redis_client.exists("map_cfg|" + expected_token, function(err/*, exists*/) { + if ( err ) { + errors.push(err.message); + } + //assert.ok(exists, "Missing expected token " + expected_token + " from redis"); + redis_client.del("map_cfg|" + expected_token, function(err) { + if ( err ) { + errors.push(err.message); + } + if ( errors.length ) { + done(new Error(errors)); + } else { + done(null); + } + }); + }); + } + ); + }); + + // Test that you cannot write to the database from a torque tile request + // + // Test for http://github.com/CartoDB/Windshaft/issues/130 + // + it("database access is read-only", function(done) { + var mapconfig = { + version: '1.1.0', + layers: [ + { type: 'torque', options: { + sql: "select 'SRID=3857;POINT(0 0)'::geometry as g, now() as d,* from " + + "test_table_inserter(st_setsrid(st_point(0,0),4326),'write')", + geom_column: 'g', + cartocss: 'Map { -torque-frame-count:2; -torque-resolution:3; -torque-time-attribute:d; ' + + '-torque-aggregation-function:\'count(*)\'; }', + cartocss_version: '2.0.1' + } } + ] + }; + step( + function do_post() + { + var next = this; + assert.response(server, { + url: '/database/windshaft_test/layergroup', + method: 'POST', + headers: {'Content-Type': 'application/json' }, + data: JSON.stringify(mapconfig) + }, {}, function(res, err) { next(err, res); }); + }, + function checkPost(err, res) { + assert.ifError(err); + // TODO: should be 403 Forbidden + assert.equal(res.statusCode, 400, res.statusCode + ': ' + (res.statusCode===200?'...':res.body)); + var parsed = JSON.parse(res.body); + assert.ok(parsed.errors); + assert.equal(parsed.errors.length, 1); + var msg = parsed.errors[0]; + assert.equal(msg, "TorqueRenderer: cannot execute INSERT in a read-only transaction"); + return null; + }, + function finish(err) { + done(err); + } + ); + + }); + + // See http://github.com/CartoDB/Windshaft/issues/164 + it("gives a 500 on database connection refused", function(done) { + + var mapconfig = { + version: '1.1.0', + layers: [ + { type: 'torque', options: { + sql: "select 1 as id, '1970-01-03'::date as d, 'POINT(0 0)'::geometry as the_geom UNION select 2, " + + "'1970-01-01'::date, 'POINT(1 1)'::geometry", + geom_column: 'the_geom', + cartocss: 'Map { -torque-frame-count:2; -torque-resolution:3; -torque-time-attribute:d; ' + + '-torque-aggregation-function:\'count(id)\'; }', + cartocss_version: '2.0.1' + } } + ] + }; + + step( + function do_post() + { + var next = this; + assert.response(server, { + url: '/database/windshaft_test/layergroup?dbport=1234567', + method: 'POST', + headers: {'Content-Type': 'application/json' }, + data: JSON.stringify(mapconfig) + }, {}, function(res, err) { next(err, res); }); + }, + function checkPost(err, res) { + assert.ifError(err); + assert.equal(res.statusCode, 500, res.statusCode + ': ' + res.body); + var parsed = JSON.parse(res.body); + assert.ok(parsed.errors, parsed); + var error = parsed.errors[0]; + assert.equal(error, "TorqueRenderer: cannot connect to the database"); + return null; + }, + function finish(err) { + done(err); + } + ); + }); + + it("checks types for torque-specific styles", function(done) { + var wrongStyle = ["Map {", + "-torque-frame-count:512;", + "-torque-animation-duration:30;", + "-torque-time-attribute:'cartodb_id';", + "-torque-aggregation-function:count(cartodb_id);", //unquoted aggregation function + "-torque-resolution:4;", + "-torque-data-aggregation:linear;", + "}"].join(" "); + var layergroup = { + version: '1.1.0', + layers: [ + { type: 'torque', options: { + sql: 'select cartodb_id, the_geom from test_table', + geom_column: 'the_geom', + srid: 4326, + cartocss: wrongStyle + } } + ] + }; + + step( + function request(){ + var next = this; + assert.response(server, { + url: '/database/windshaft_test/layergroup', + method: 'POST', + headers: {'Content-Type': 'application/json' }, + data: JSON.stringify(layergroup) + }, {}, function(res) { next(null, res); }); + }, + function checkResponse(err, res) { + assert.ifError(err); + assert.equal(res.statusCode, 400, res.statusCode + ': ' + res.body); + var parsed = JSON.parse(res.body); + assert.ok(parsed.errors, parsed); + var error = parsed.errors[0]; + assert.equal(error, + "Unexpected type for property '-torque-aggregation-function', expected string"); + done(); + return null; + } + ); + }); +}); diff --git a/test/acceptance/ported/torque_boundaries.js b/test/acceptance/ported/torque_boundaries.js new file mode 100644 index 00000000..19f49db8 --- /dev/null +++ b/test/acceptance/ported/torque_boundaries.js @@ -0,0 +1,446 @@ +require('../../support/test_helper'); + +var assert = require('../../support/assert'); +var redis = require('redis'); +var cartodbServer = require('../../../lib/cartodb/server'); +var ServerOptions = require('./support/ported_server_options'); + +describe('torque boundary points', function() { + + var layergroupIdToDelete = null; + + beforeEach(function() { + layergroupIdToDelete = null; + }); + + var server = cartodbServer(ServerOptions); + server.req2params = ServerOptions.req2params; + server.setMaxListeners(0); + var redis_client = redis.createClient(ServerOptions.redis.port); + + var boundaryPointsMapConfig = { + version: '1.1.0', + layers: [ + { type: 'torque', options: { + sql: "WITH p AS ( " + + " SELECT '1970-01-02'::date as d, " + + // r1 is pixel resolution at zoom level 1 + // s1 is tile size at zoom level 1 + " 1e-40 as o, 78271.517578125 as r1, 20037508.5 as s1 )" + + " SELECT 1 as i, d, ST_MakePoint(0,0) as ug FROM p" + + " UNION ALL " + + "SELECT 2, d, ST_MakePoint(-o,-o) FROM p" + + " UNION ALL " + + "SELECT 3, d, ST_MakePoint(-o,o) FROM p" + + " UNION ALL " + + "SELECT 4, d, ST_MakePoint(o,-o) FROM p" + + " UNION ALL " + + "SELECT 5, d, ST_MakePoint(o,o) FROM p" + + " UNION ALL " + + "SELECT 6, d, ST_MakePoint(-r1,r1) FROM p" + + " UNION ALL " + + "SELECT 7, d, ST_MakePoint(-r1/2,r1) FROM p" + + " UNION ALL " + + "SELECT 8, d, ST_MakePoint(-r1,-r1) FROM p" + + " UNION ALL " + + // this is discarded, being on the right boundary + "SELECT 9, d, ST_MakePoint(s1,0) FROM p" + + " UNION ALL " + + // this is discarded, being on the top boundary + "SELECT 10, d, ST_MakePoint(0,s1) FROM p" + + " UNION ALL " + + // this is discarded, rounding to the right boundary + "SELECT 11, d, ST_MakePoint(s1-r1/2,0) FROM p" + + " UNION ALL " + + // this is discarded, rounding to the top boundary + "SELECT 12, d, ST_MakePoint(0,s1-r1/2) FROM p", + geom_column: 'ug', + cartocss: 'Map { ' + + '-torque-frame-count:2; ' + + '-torque-resolution:1; ' + + '-torque-time-attribute:"d"; ' + + '-torque-data-aggregation:linear; ' + + '-torque-aggregation-function:"count(i)"; }', + cartocss_version: '1.0.1' + } } + ] + }; + + var tileRequests = [ + { + desc: '0/0/0', + repr: [ + ' ------', + '| |', + '| |', + ' ------' + ], + z: 0, + x: 0, + y: 0, + expects: [ + { + x__uint8: 255, + y__uint8: 128, + vals__uint8: [{ + v: 2, + d: 'i=9 and i=11' + }], + dates__uint16: [0] + }, + { + x__uint8: 128, + y__uint8: 128, + vals__uint8: [{ + v: 8, + d: 'i=[1..8]' + }], + dates__uint16: [0] + }, + { + x__uint8: 128, + y__uint8: 255, + vals__uint8: [{ + v: 2, + d: 'i=10 and i=12' + }], + dates__uint16: [0] + } + ] + }, + { + desc: '1/0/0', + repr: [ + '*00 | 10', + '----+----', + '01 | 11' + ], + z: 1, + x: 0, + y: 0, + expects: [ + { + x__uint8: 255, + y__uint8: 0, + vals__uint8: [{v: 2, d: 'i=6 (-r1,r1) and i=7(-r1/2,r1)'}], + dates__uint16: [0] + }, + { + x__uint8: 255, + y__uint8: 1, + vals__uint8: [{v: 2, d: 'i=1 and i=3'}], + dates__uint16: [0] + }, + { + x__uint8: 255, + y__uint8: 255, + vals__uint8: [{v: 2, d: 'i=10 and i=12'}], + dates__uint16: [0] + } + ] + }, + { + desc: '1/1/0', + repr: [ + '00 | 10*', + '----+----', + '01 | 11' + ], + z: 1, + x: 1, + y: 0, + expects: [ + { + x__uint8: 255, + y__uint8: 0, + vals__uint8: [{v: 2, d: 'i=9 and i=11'}], + dates__uint16: [0] + }, + { + x__uint8: 0, + y__uint8: 0, + vals__uint8: [{v: 2, d: 'i=1 and i=5'}], + dates__uint16: [0] + }, + { + x__uint8: 0, + y__uint8: 255, + vals__uint8: [{v: 2, d: 'i=10 and i=12'}], + dates__uint16: [0] + } + ] + }, + { + desc: '1/0/1', + repr: [ + '00 | 10', + '----+----', + '*01 | 11' + ], + z: 1, + x: 0, + y: 1, + expects: [ + { + x__uint8: 255, + y__uint8: 255, + vals__uint8: [{v: 3, d: 'i=1, i=2 and i=8'}], + dates__uint16: [0] + } + ] + }, + { + desc: '1/1/1', + repr: [ + '00 | 10', + '----+----', + '01 | 11*' + ], + z: 1, + x: 1, + y: 1, + expects: [ + { + x__uint8: 255, + y__uint8: 255, + vals__uint8: [{ + v: 2, + d: 'i=9 and i=11' + }], + dates__uint16: [0] + }, + { + x__uint8: 0, + y__uint8: 255, + vals__uint8: [{ + v: 2, + d: 'i=1 and i=4' + }], + dates__uint16: [0] + } + ] + } + ]; + + tileRequests.forEach(function(tileRequest) { + // See https://github.com/CartoDB/Windshaft/issues/186 + var desc = 'handles ' + tileRequest.desc + '.json.torque\n\n\t' + tileRequest.repr.join('\n\t') + '\n\n'; + it(desc, function (done) { + + assert.response(server, { + url: '/database/windshaft_test/layergroup', + method: 'POST', + headers: {'Content-Type': 'application/json' }, + data: JSON.stringify(boundaryPointsMapConfig) + }, {}, function (res, err) { + + assert.ok(!err, 'Failed to create layergroup'); + + var parsedBody = JSON.parse(res.body); + var expected_token = parsedBody.layergroupid; + layergroupIdToDelete = expected_token; + + var partialUrl = tileRequest.z + '/' + tileRequest.x + '/' + tileRequest.y; + assert.response(server, { + url: '/database/windshaft_test/layergroup/' + expected_token + '/0/' + partialUrl + '.json.torque', + method: 'GET' + }, {}, function (res, err) { + assert.ok(!err, 'Failed to get json'); + + assert.equal(res.statusCode, 200, res.body); + assert.equal(res.headers['content-type'], "application/json; charset=utf-8"); + var parsed = JSON.parse(res.body); + + var i = 0; + tileRequest.expects.forEach(function(expected) { + assert.equal( + parsed[i].x__uint8, + expected.x__uint8, + parsed[i].x__uint8 + ' == ' + expected.x__uint8 + + '\nRESULT\n------' + + '\n' + JSON.stringify(parsed, null, 4) + + '\nEXPECTED\n--------' + + '\n' + JSON.stringify(tileRequest.expects, null, 4) + ); + assert.equal( + parsed[i].y__uint8, + expected.y__uint8, + parsed[i].y__uint8 + ' == ' + expected.y__uint8 + + '\nRESULT\n------' + + '\n' + JSON.stringify(parsed, null, 4) + + '\nEXPECTED\n--------' + + '\n' + JSON.stringify(tileRequest.expects, null, 4) + ); + + var j = 0; + expected.vals__uint8.forEach(function(val) { + assert.equal( + parsed[i].vals__uint8[j], + val.v, + 'desc: ' + val.d + + 'Number of points got=' + parsed.length + '; ' + + 'expected=' + tileRequest.expects.length + + '\n\tindex=' + i + + '\n\tvals__uint8 index=' + j + + '\n\tgot=' + parsed[i].vals__uint8[j] + + '\n\texpected=' + val.v + + '\nRESULT\n------' + + '\n' + JSON.stringify(parsed, null, 4) + + '\nEXPECTED\n--------' + + '\n' + JSON.stringify(tileRequest.expects, null, 4)); + + j++; + }); + + i++; + }); + + assert.equal( + parsed.length, + tileRequest.expects.length, + 'Number of points did not match ' + + 'got=' + parsed.length + '; ' + + 'expected=' + tileRequest.expects.length + + '\nRESULT\n------' + + '\n' + JSON.stringify(parsed, null, 4) + + '\nEXPECTED\n--------' + + '\n' + JSON.stringify(tileRequest.expects, null, 4)); + + done(); + }); + }); + }); + }); + + it('regression london point', function(done) { + var londonPointMapConfig = { + version: '1.1.0', + layers: [ + { type: 'torque', options: { + sql: "SELECT " + + "1 as i, " + + "'1970-01-02'::date as d, " + + "ST_MakePoint(-11309.9155492599,6715342.44989312) g", + geom_column: 'g', + cartocss: 'Map { ' + + '-torque-frame-count:2; ' + + '-torque-resolution:1; ' + + '-torque-time-attribute:"d"; ' + + '-torque-data-aggregation:linear; ' + + '-torque-aggregation-function:"count(i)"; }', + cartocss_version: '1.0.1' + } } + ] + }; + + assert.response(server, { + url: '/database/windshaft_test/layergroup', + method: 'POST', + headers: {'Content-Type': 'application/json' }, + data: JSON.stringify(londonPointMapConfig) + }, {}, function (res, err) { + assert.ok(!err, 'Failed to create layergroup'); + + var parsedBody = JSON.parse(res.body); + var layergroupId = parsedBody.layergroupid; + layergroupIdToDelete = layergroupId; + + + assert.response(server, { + url: '/database/windshaft_test/layergroup/' + layergroupId + '/0/2/1/1.json.torque', + method: 'GET' + }, {}, function (res, err) { + assert.ok(!err, 'Failed to request torque.json'); + + var parsed = JSON.parse(res.body); + + assert.deepEqual(parsed, [{ + x__uint8: 255, + y__uint8: 172, + vals__uint8: [1], + dates__uint16: [0] + }]); + + done(); + }); + }); + }); + + it('should consider resolution for least value in query', function(done) { + var londonPointMapConfig = { + version: '1.1.0', + layers: [ + { type: 'torque', options: { + sql: "" + + "SELECT " + + "0 as i, " + + "st_transform('0101000020E6100000FABD3AB4B5031C400581A80ECC2F4940'::geometry, 3857) as g " + + "UNION ALL " + + "SELECT " + + "2 as i, " + + "st_transform('0101000020E61000006739E30EAE031C406625C0C3C72F4940'::geometry, 3857) as g " + + "UNION ALL " + + "SELECT " + + "3 as i, " + + "st_transform('0101000020E6100000E26DB8A2A7031C40C8BAA5C2C52F4940'::geometry, 3857) as g", + geom_column: 'g', + cartocss: 'Map { ' + + '-torque-frame-count:1; ' + + '-torque-animation-duration:30;' + + '-torque-time-attribute:"i"; ' + + '-torque-aggregation-function:"count(i)"; ' + + '-torque-resolution:2; ' + + '-torque-data-aggregation: cumulative; }', + cartocss_version: '1.0.1' + } } + ] + }; + + assert.response(server, { + url: '/database/windshaft_test/layergroup', + method: 'POST', + headers: {'Content-Type': 'application/json' }, + data: JSON.stringify(londonPointMapConfig) + }, {}, function (res, err) { + assert.ok(!err, 'Failed to create layergroup'); + + var parsedBody = JSON.parse(res.body); + var layergroupId = parsedBody.layergroupid; + layergroupIdToDelete = layergroupId; + + + assert.response(server, { + url: '/database/windshaft_test/layergroup/' + layergroupId + '/0/13/4255/2765.json.torque', + method: 'GET' + }, {}, function (res, err) { + assert.ok(!err, 'Failed to request torque.json'); + + var parsed = JSON.parse(res.body); + + assert.deepEqual(parsed, [ + { + x__uint8: 47, + y__uint8: 127, + vals__uint8: [2], + dates__uint16: [0] + }, + { + x__uint8: 48, + y__uint8: 127, + vals__uint8: [1], + dates__uint16: [0] + } + ]); + + done(); + }); + }); + }); + + afterEach(function(done) { + var redisKey = 'map_cfg|' + layergroupIdToDelete; + redis_client.del(redisKey, function () { + done(); + }); + }); +}); diff --git a/test/acceptance/ported/torque_png.js b/test/acceptance/ported/torque_png.js new file mode 100644 index 00000000..68404dea --- /dev/null +++ b/test/acceptance/ported/torque_png.js @@ -0,0 +1,142 @@ +require('../../support/test_helper'); + +var assert = require('../../support/assert'); +var testClient = require('./support/test_client'); + +describe('torque png renderer', function() { + + var IMAGE_TOLERANCE_PER_MIL = 20; + + var torquePngPointsMapConfig = { + version: '1.2.0', + layers: [ + { + type: 'torque', + options: { + sql: "SELECT * FROM populated_places_simple_reduced where the_geom" + + " && ST_MakeEnvelope(-90, 0, 90, 65)", + cartocss: [ + 'Map {', + ' buffer-size:0;', + ' -torque-frame-count:1;', + ' -torque-animation-duration:30;', + ' -torque-time-attribute:"cartodb_id";', + ' -torque-aggregation-function:"count(cartodb_id)";', + ' -torque-resolution:1;', + ' -torque-data-aggregation:linear;', + '}', + '#populated_places_simple_reduced{', + ' comp-op: multiply;', + ' marker-fill-opacity: 1;', + ' marker-line-color: #FFF;', + ' marker-line-width: 0;', + ' marker-line-opacity: 1;', + ' marker-type: rectangle;', + ' marker-width: 3;', + ' marker-fill: #FFCC00;', + '}' + ].join(' '), + cartocss_version: '2.3.0' + } + } + ] + }; + + var tileRequests = [ + { + z: 2, + x: 2, + y: 1, + layer: 0, + format: 'torque.png' + }, + { + z: 2, + x: 1, + y: 1, + layer: 0, + format: 'torque.png' + } + ]; + + function torquePngFixture(zxy) { + return './test/fixtures/torque/populated_places_simple_reduced-' + zxy.join('.') + '.png'; + } + + tileRequests.forEach(function(tileRequest) { + var z = tileRequest.z, + x = tileRequest.x, + y = tileRequest.y; + 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(); + }); + }); + }); + }); + + + var mapConfigTorqueOffset = { + version: '1.3.0', + layers: [ + { + type: 'torque', + options: { + sql: "SELECT * FROM populated_places_simple_reduced", + cartocss: [ + 'Map {', + 'buffer-size:0;', + '-torque-frame-count:1;', + '-torque-animation-duration:30;', + '-torque-time-attribute:"cartodb_id";', + '-torque-aggregation-function:"count(cartodb_id)";', + '-torque-resolution:2;', + '-torque-data-aggregation:linear;', + '}', + '', + '#populated_places_simple_reduced{', + ' comp-op: lighter;', + ' marker-fill-opacity: 0.9;', + ' marker-line-color: #2167AB;', + ' marker-line-width: 5;', + ' marker-line-opacity: 1;', + ' marker-type: ellipse;', + ' marker-width: 6;', + ' marker-fill: #FF9900;', + '}', + '#populated_places_simple_reduced[frame-offset=1] {', + ' marker-width:8;', + ' marker-fill-opacity:0.45; ', + '}', + '#populated_places_simple_reduced[frame-offset=2] {', + ' marker-width:10;', + ' marker-fill-opacity:0.225; ', + '}' + ].join(' '), + cartocss_version: '2.3.0' + } + } + ] + }; + + it('torque static map with offset', function(done) { + var w = 600, + h = 400; + + testClient.getStaticBbox(mapConfigTorqueOffset, -170, -87, 170, 87, w, h, function(err, res, img) { + if (err) { + return done(err); + } + + assert.equal(img.width(), w); + assert.equal(img.height(), h); + + done(); + }); + + }); + +}); diff --git a/test/acceptance/ported/torque_zero_zero.js b/test/acceptance/ported/torque_zero_zero.js new file mode 100644 index 00000000..717606a3 --- /dev/null +++ b/test/acceptance/ported/torque_zero_zero.js @@ -0,0 +1,84 @@ +require('../../support/test_helper'); + +var assert = require('../../support/assert'); +var testClient = require('./support/test_client'); + +describe('torque tiles at 0,0 point', function() { + +/* + Tiles are represented as in: + + --------- + | TL | TR | + |--(0,0)--| + | BL | BR | + --------- +*/ + + var tiles = [ + { + what: 'tl', + x: 3, + y: 3, + expects: [] + }, + { + what: 'tr', + x: 4, + y: 3, + expects: [] + }, + { + what: 'bl', + x: 3, + y: 4, + expects: [{"x__uint8":1,"y__uint8":1,"vals__uint8":[1],"dates__uint16":[0]}] + }, + { + what: 'br', + x: 4, + y: 4, + expects: [{"x__uint8":0,"y__uint8":1,"vals__uint8":[1],"dates__uint16":[0]}] + } + ]; + + tiles.forEach(function(tile) { + it(tile.what, function(done) { + + var query = 'select 1 cartodb_id,' + + ' ST_Transform(ST_SetSRID(ST_MakePoint(0, 0), 4326), 3857) the_geom_webmercator'; + var mapConfig = { + version: '1.3.0', + layers: [ + { + type: 'torque', + options: { + sql: query, + cartocss: [ + 'Map {', + ' -torque-time-attribute: "cartodb_id";', + ' -torque-aggregation-function: "count(cartodb_id)";', + ' -torque-frame-count: 1;', + ' -torque-animation-duration: 15;', + ' -torque-resolution: 128', + '}', + '#layer {', + ' marker-fill: #fff;', + ' marker-fill-opacity: 0.4;', + ' marker-width: 1;', + '}' + ].join(' '), + cartocss_version: '2.3.0' + } + } + ] + }; + + testClient.getTorque(mapConfig, 0, 3, tile.x, tile.y, function(err, res) { + assert.deepEqual(JSON.parse(res.body), tile.expects); + done(); + }); + }); + }); + +}); diff --git a/test/acceptance/ported/wrap.js b/test/acceptance/ported/wrap.js new file mode 100644 index 00000000..4ca9e38b --- /dev/null +++ b/test/acceptance/ported/wrap.js @@ -0,0 +1,118 @@ +require('../../support/test_helper'); + +var assert = require('../../support/assert'); +var testClient = require('./support/test_client'); + +describe('wrap x coordinate', function() { + + describe('renders correct tile', function() { + var IMG_TOLERANCE_PER_MIL = 20; + + function plainTorqueMapConfig(plainColor) { + return { + version: '1.2.0', + layers: [ + { + type: 'plain', + options: { + color: plainColor + } + }, + { + type: 'torque', + options: { + sql: "SELECT * FROM populated_places_simple_reduced " + + "where the_geom && ST_MakeEnvelope(-90, 0, 90, 65)", + cartocss: [ + 'Map {', + ' buffer-size:0;', + ' -torque-frame-count:1;', + ' -torque-animation-duration:30;', + ' -torque-time-attribute:"cartodb_id";', + ' -torque-aggregation-function:"count(cartodb_id)";', + ' -torque-resolution:1;', + ' -torque-data-aggregation:linear;', + '}', + '#populated_places_simple_reduced{', + ' comp-op: multiply;', + ' marker-fill-opacity: 1;', + ' marker-line-color: #FFF;', + ' marker-line-width: 0;', + ' marker-line-opacity: 1;', + ' marker-type: rectangle;', + ' marker-width: 3;', + ' marker-fill: #FFCC00;', + '}' + ].join(' '), + cartocss_version: '2.3.0' + } + } + ] + }; + } + + var testScenarios = [ + { + tile: { + z: 2, + x: -2, + y: 1, + layer: 'all', + format: 'png' + }, + fixture: { + z: 2, + x: 2, + y: 1 + }, + plainColor: 'white' + }, + { + tile: { + z: 2, + x: -3, + y: 1, + layer: 'all', + format: 'png' + }, + fixture: { + z: 2, + x: 1, + y: 1 + }, + plainColor: '#339900' + } + ]; + + function blendPngFixture(zxy) { + return './test/fixtures/blend/blend-plain-torque-' + zxy.join('.') + '.png'; + } + + testScenarios.forEach(function(testScenario) { + var tileRequest = testScenario.tile; + var zxy = [tileRequest.z, tileRequest.x, tileRequest.y]; + 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(); + }); + }); + }); + }); + }); + + describe('mapnik', function() { + it("can get a tile with negative x coordinate", function(done){ + testClient.getTile(testClient.defaultTableMapConfig('test_table'), 2, -2, 1, function(err, res, img) { + assert.ok(!err); + assert.ok(img); + assert.equal(img.width(), 256); + assert.equal(img.height(), 256); + done(); + }); + }); + }); + +}); diff --git a/test/fixtures/blend/blend-filtering-layers-0.1-zxy-1.0.0.png b/test/fixtures/blend/blend-filtering-layers-0.1-zxy-1.0.0.png new file mode 100644 index 0000000000000000000000000000000000000000..88815896e447ee05ba60a6a8432e51b1f880bdb6 GIT binary patch literal 15100 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 BqdNcq literal 0 HcmV?d00001 diff --git a/test/fixtures/blend/blend-filtering-layers-0.2-zxy-1.0.0.png b/test/fixtures/blend/blend-filtering-layers-0.2-zxy-1.0.0.png new file mode 100644 index 0000000000000000000000000000000000000000..67cb3af26203b1f227fc75ee77e48c9491f2a49a GIT binary patch literal 22124 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 bx{Uu1{inmMK}F<}00000NkvXXu0mjf1GMnF literal 0 HcmV?d00001 diff --git a/test/fixtures/blend/blend-filtering-layers-0.3-zxy-1.0.0.png b/test/fixtures/blend/blend-filtering-layers-0.3-zxy-1.0.0.png new file mode 100644 index 0000000000000000000000000000000000000000..1a8077abfda2eb55a3594e423cd204742e908831 GIT binary patch literal 16641 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 Zf8;@65i3Q<-Kz}%H6?Au8l-jj{{X?$<>~+c literal 0 HcmV?d00001 diff --git a/test/fixtures/blend/blend-filtering-layers-1.2-zxy-1.0.0.png b/test/fixtures/blend/blend-filtering-layers-1.2-zxy-1.0.0.png new file mode 100644 index 0000000000000000000000000000000000000000..978117cb63fea7693297d3e3a3cc20cfecf47a03 GIT binary patch literal 34042 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 BqdNcq literal 0 HcmV?d00001 diff --git a/test/fixtures/blend/blend-filtering-layers-1.2.5-zxy-1.0.0.png b/test/fixtures/blend/blend-filtering-layers-1.2.5-zxy-1.0.0.png new file mode 100644 index 0000000000000000000000000000000000000000..7816b1bd9c2e1cbbdecb58505b9cfce546528385 GIT binary patch literal 31845 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

wj`}W@+u5tw0BI#w=$GK25ZW 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%0AAU41ucax)sb0b%3jXm?O2L$kpn@v>paVmi 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

=r$NEh;iv6Jz{_FKE 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 IM6N<$f>r&UJpcdz literal 0 HcmV?d00001 diff --git a/test/fixtures/blend/blend-plain-torque-2.1.1.png b/test/fixtures/blend/blend-plain-torque-2.1.1.png new file mode 100644 index 0000000000000000000000000000000000000000..efba5f22b7694eab36f789999d3f9effc8bca45e GIT binary patch literal 16930 zcmW(+1yoee+rGOjuyl8K#}8?c?(S3pr8}gQSXyb21}OpQPDu$@a*+n9MMCLr*pL5r z?m73)ojEh-%sbD_dEWPV=cAsEDjqg9HUI#4>S{^`004R_f&eJS)8~bExjg{L|5I0z zHwwr*2tN4q;=*_ProF{-(e+@C-78gF^rUuPomNq+FN0|TV~&ti^M{a2H0(8NJPa=t z9FLnSn37D)Qt`UP98NzRNhY-PGsEFUlxhyakDMt?1H&y1N`7yoI9;7=R^75edD{7v!WtC|bnCVc6&y#{vQ1NR&N zBM|xN9f@jKyI4fT&+`$3J^ELk?F;>Eck5#W4m(#^;4H$yZmRz77jDP^9Jqz}Qh!Gt zR1UY>+4R%x-54%N>l^m-3LIBj{pC@bLPn{-UUREA&$EJi_bqhZolp#s-U&7x%)z=kURd8diJdS{LWxcuPS z=t>UKbjgAVJ`j|G5K4v2XKm4W&DEDe2w$O2l$JXezh@B34L-n0ypDbl3@q`&GXT-| z-y1%}oOQZhbc}Ojn742K*9xg$R2Jv)+ZU{T2DQFVR&L;*{iTach0hT8Ra;YDaUDKf zGeH^2Z4g)WYi}lEFNM{!G{AqGC&PhnipyUY`;3U?I0pL@??~0MG&rm|BB__?-m$^j z>pp#~z(vDQ=@nFX0}X(H#-K{1%KB-7ilud7lHq_oWN4y}ol=2eTmU>B!3d+0CzLD1 zk_YgzR8-CXS2WZFa)~ya-lmbwH@mYjz;0QzggVegRipy5EWiu#gt{UitzRPOqNqDe z5bkx;pI9eh7w`%T)cVJh*?vD^4E+B)b8&O)=i54i zBOM`;XMw;I>YbE3TUOF;OxYryQ1bx{DI+_8GCso;T{yRoe!{(zf|y?@Vc&-k*d!o~oUn|Ynk=BNn1eK(}jqb^?I3grnSZ2TVZDgawX8Y~`ht6LXE-C(i6)I}sJ zcM?i)mN%VGhuW=Ft-bZLK*nGgxo0HG>ZcX_o2%rH43fU){gP>Ky0Bq+8;qY2@wtAc z*I|Q`MO08i2;n>t<(s!t$-jyFaQO1vZ5B`U);j|OJdw_|r5c7q|FueE*QbX+`|0wu zNVsU9=Zuk<$NE6PgKi2i(TPe*;pE0sXq6_g=0SHzUZaB$QnEHn@NqWmQ2U?zpY>{L zb{sp@@k}FB(fQlqIIJ-At0m{hoBv;>tfEb1%p^mRGl~=?qixe;%XOm4)q4O1;Nlw0 z;v+k?Ng$A`9jSG)!tYVR=nuFM$s*D}F@=XNHeyBMvPMBA*N?&+pv?z|4wMl3swOJ^Zp$S?!7*2R&syjH;R2?~PM@mY>s9F>5&T)7nL=VR5r|Iadx zz)QLUznr5PVru!qSYi;bftkPIHG{j26sq7Wd%fc@0T8pUad;7$uAW@l#l&!1-oVdl|(S+<|dh27rb~`jlJ@UQG^}# zInjn0{=!|UNbBG{zTqU(eSs@dMkZvEsE?82wQRriL?DpM1`AoE$kMjmQ^a~c1(0)1 zit(CWAkU@XFY~Fv&JUV!*luW^ZPwxW5d4)(_0%nyBmN)joiu&Sww!wO4J8}Ixq)etyL4si3Jae zb;0qT19*VXFEWOu}CnDI5IqyxpZ*u3% z$%9j=ia24Xn2~Tk1R4}f`5+NL(1Q5`Q)G5+XD^O$A_WkoyuwQpjx}~Bgwk4l)ovB~%2erf$ppBWaX^S5EIP7lYdIrUH7($?4HuNS9F zBioSmmbx8q0nzA#FxD$75a{h^HZeQMPzo&D zsC|bf*BiXec|9Q4yatnkFOc|}QoMQp?8haXlq`X z$lMaFr-T%4iJj*~utQYzafRb5Lw@h!gQ3mxVgoW#HF3rxPg79&mA5-8xYpg9fi zdMuKtPka;KbypP^3_Wj8{PuDuiV7JMDXrbYfG?*6BD`C(3*_%ZlVH*!1;tOPhVA_B zZhffXzo%X;J1fn3f-wkfkJRNTR{C+L{FGsM_C6khuXnxU+Pu~GM+f+vxOmv&cSBsd zlMA)(c7=DpWkdZ6>a+(SO|x;_f<5K#T2ZYZ9aB@I$kj1EFj~{~+EmzGyA$_k6A|_? z=DNqH0%>(t`%5~Xk79wjX@{;!F-dp(FQ7F`#Cwy@#bl4U*Z?YHZ zRRueaxRtY^+8MqE@Ie_T(L~dv+7d;VN^roAduD$pyX^-^{;@?==rS#&5y(GG2gR~^ z;M2ZEcadal`}UHw@SjxN2=9VT4JuBf&PBRxM6&ak3IdiB$hlGxa&{wFk{4fU9ovlt zxVca4f7`l^ME;f2Q`YuHKiIBrQ}m*>+AJF8@9K>boqThuYAxFEPa8oZr%m{B*T$(& zPLa$29#O^SRr+4N$UUy3ee{)ir7r)$wtd<}(Ez`NW?R?r**C`oh~EA(S#xgF>Y*z4 zx28VOm)hEp=IL?KN{c5Rf#WKiQmJ4295fR-k5g|n6B}Huy!gxY*jznd$z=IIuOMH+ zZWHp=9%v!g<)K?qrM5u$-VeWB(`V)_q#^qFeorJ+&hdqq46?eB%S7bx5~BB9kA|%0 z+i1p5xxnF`lrRfg)7cH5xpKSnw`f07fJ!v_nOWcepp5l_@%ca{qQy(jmiz6{8J_LM zFmt302~4W(b)ux2Ix@B8g>v1yBTS-V9+^6yZ$DkCMSWioJS|_63d!|1ORM?MUB7HFkI=${ z@$&rKVrsIlCHHs{%V9L*3H-HH1$wU5tqn||pYUi@=CX^}DI#m_;M+gLH8;+hZ$4zJ z$8-M)eWiqL$7Jp)n7jGU@JV9pb(Rkj8XfPO;cX*SCdOa&r&)F%ga3r7;F)EIigBGY z!<0GRSFr-LC7DBON6dU1$exyysI=6Dq{@{;mA5k{OPiv&jmqY|wgy49l5{HipB$;k z|H6Lwe$__!W9_N|G`1xbmu5=}txcm1ChFEF3V}ma4E)@a{0(LE-2E!P9m7_?*xPKH z_PBt^cgLSxi}%8{Qa6S7(cWPQG2%XqiN>kB^q&LzgR9?-o2pK>^lpg2 zmTDZ~h;zeROT(t_cfI)&bs4_pn+5bxYoiF+r|p;fJ=(%E!qp=Ys7$QQwJYKY+zPd? z(9LE62-Qr>REFC0;`PHnDf-OJYEX4xh*g&ikw(59&|v>yn?6Kufppd?P^)dP5X=~Z&93F(^3I)WCrT|?&dGHR?B>K z+G~w&eRGHn96S^Mx;Da3^LO6gT&bPanp5Zfjp5_pM!W}eI#E1!@!0FY-~amK{xX+l zT`{NO4D+^6#if!Iy}g)RVM)8FQ4`&lsk#T+2j8HfjeaRXadMqgN(+W|7WlTtg%XI6 z02AFtn}0qt&re^?XoLkP`4Sgv^yGvkttClp&q*Z%LpGf|%KKBeOy8l6JN+0RkiAtFnWFuB)nMo71 z3mQHgNjs>&7kBqHEEf7!VO2zTbqEg|R=k27XKXdxp!4W*1+Phr1Z6p=)VT~A8zyub zkW{sRbkv+V$_I7%+fb({1$;qO|Rho z`HlUylNw=6y6m&)qLe6dhPqd=jnim*N@8~ zGHFCobo`t(d?D^KOtUh)?Y|^%L!+3L!RZ=DnjdYG!F(%A7MwL^+fGyiQQ=ZS&TWp`TsmRae5$mgj=}j{7nC z%z$y#_Yj$_4?sUb=liJR&d<57md1P3l*kk$dD8tSmN@xJSJfIzB>TEz4QMYlRgJaZub)GZ-Ps-tlibO!vy6qX$z#ncG-2c zWQMh=@z+lieUnly4qO}&y$JMo6}V>x4ptv&gZ!9=%f&f-|D>!lJn?MVKN5K?CtU+) z4>XS#$VqJ@9t^PM$4f}Pvr|m;`VlL>IH=p+?yg|<6uph)cBNjgw;Q7#K4r$7GRB0x zdJ=2x48P>Qa%NN75h0G|_Ii%vZNhKqjk~e*s@XzuB3!W6(%@vaWD|-dhm@u0c_I_8 zWbg1u{53Edi}iMR{deFzkmI(DgU4*`kQEU1_dp(1z`d+2J8Bw%~?n(ab{;xWs z;$d2ppz`~qWWaO(?wTU}GG~jsH!o2MPMf~VhTC5MQi%jHJgLE1Sd!~l2Yms zC!?5Z_j$d&ug}mG&anuN2U}`f$U~TZp&`5DWe&oCtV>|RBYAePC3bqLF)E3Us1+6J zhQ!~PAg3?$%x_8~{Q}7ryIC4F!KdOEH5DKqV zkL%~N->0dQeBPm$agXc6CvDTQ?e(FK2hsO+@g3$`V|w>Zf07zythL(cf=x$8Kh3l| zrU&=GgyUD%JbIO8#;YS8_YDe&Z1$iou&m{qkNv&5-WU??F({t%SA;MHyZTI<%qQ17 zsm-%)>r&G1z{9Y7=LSVW`Wh7Mar)1SMO}LI$Y}LDGnU+TKb69l zc&~g@9th*XpZC%e1JVR9_E%WLNGfK;AQFOyKm7t^wN!GK^);PCL`ZA%$dq@F(P`k1b zKg`v2jE-$)Z=Q@si?u&z0rw;!m*|=uV#&jXtg#~VZ%(oZFWV3>kV)$WciB7Tq&a&B3H@dpF%xOJ_%Qp- z>%StM-W4M`QdsEc)>thZ#HYgrNP+ z2v*=w@KN5D)WcU^2{I2SB+LDKsRAiV2w@g2qq~(-|79nhNp?NO>3BU0==#vI=8b($ zOS7j~O66Z@8rDCdDD2KhRl39VGw#hrm*F2VD-YtjGgSu^%b7JN3*H9T?95MOMvdAa zQa*olB|`}8RXaueIOctzWHXwS(jJmj;wg)`Gs*&Tvr$MMc1UIFGd2X!W{gQ&xWCr8}4pLTIzDo{?a_PYkDJ^|OouL|M z%FpuHl1jX>2ko8NLZjeB+!XEF;~KCHT1ONu;6&?X}rk@lpZ{x2wXPhoyDWww#wqfK9RphRu3kk zoUnT$LkrkiUnD^C`!);p(O_kFX{E*Dj{QA?PrgEnJc0j%pW9JQJ)+m;#{H2O{X!jk z+9#vy5^;ROMErd(;~uoyaK)0(2{~bmx^&kpi=?G(bV}^pd0S0#Kam+&9l;9Z>bF z)O1M@oGu{DoPQ6A+SOMu-&16f+D5sag5=0cQ;r(bo<*oFiC}lpT$}IN{kt_5#>*Z* z14!RzDiVNYbc@mo3%1`#++3ap-|?ki<$E8&vGO+e2uEVn0jv5=#d2a;V%>h}SFRb% zo0qz0;sNe4rORm2ZNCjFS*9ad-U|qRo#~ikSdXaF z_gMv&(a0xLtYu!8E_n4K(BwoyBf#HsI|U)fJfuG)h+~Y%Q$92%drqBBd9;V~28GyplC&GSvep^dT&ZT!KZdW3rP`>KTfUH)QuOb|>tGh+$dhA5~mV zy3RMliR4-)%e4T#XGYJj5=%!U7f-Aj(}GyO8Fp?F`r#U4(H~)Sp>}^NI>Y)(7^i_Qb7_Z;Pj_KLpye0bN1KZ~bFPZu za&l_(lwh#}{Cun$Nn~ELx6TP|RN#aGS%Hxs^eoQgiptRu{^jsSm2VdO_nI*_=BFQO z+`9$S`H_N7LK^P#2EA~b(EWmd0*VXH#wbi#U08qYAE5>|9jt0kZV_b0;j^_bdDL}c zr$VzaGL3LIc`kKMj{F0_*y>#h@@t3{bB-?yy~XIeeP5t`MfZ_7J4~-aS5nv3Md(oy z^k{ZJ)nvj|8Cns1L0z9%g{&M}DN z7mVQYjJ`_Qf>fLtsnB0ULmy*3kGA+jCk=)e^51_qD3SYb49CR1B{+v7_G)AmB;ycR zPOytm%$O;dHmP)2-DThte8*IA>Fv0CBKXn5hJBDHL-;gMv+S5&bLo^mHFD4JSM5hN zzI#(Pm@}5^FI`>NaIxE-AV;E0x5MSNV!6uF%>C2eRwIGqGB#iPUj{9y79ka1`)K_G z9Ra-uRAdrE+G1V_u;aW+bp}vk zK^r|>^NyH}BTN`rqdcSa_k|u(wSDS!bE02MWg}C;lT9+;9g3l3FUDzK7gM9vO$A8# z7QXjl@=36U(R_Mf!Ng!>oz?>8^Y+IqHO36_VIE-!T9~tdTpb?S!C`aJ=nfojr7}K+ zjOBjDptfP=ZRDOUdtPhW#SRUzWB*}JsXfLn*0s)I2k(-9jag2^SNQ@03v4p%N&Z#M z64Kxsdm0+zzIVZ&wMHzsF2H*3@ys5lMF+?qRkd?6S5`K11z6YlrAV>Ue{}0>KC_Fk zTiDTbZ=Zm)gOexRe}vb-MV)mT+5Y}zQhM!QRkzQLY1e1fY}D+GEqDDYRj2Rq_7+tG&mSf6rYkNRyKF10C@$M2jmhAqPa{vX>h0!@9SmL(oc4jp}zlg3nhVEO6&nM?uszwp? znki^&IC^$N0WXnq$=^}+%SP)!Dq~omiayNGuI`f@@U15tVl7$FFcYs@c3qslhnj^b zsRu80wfu7)qUl8D#zu*!R*<>RzcR;F26 z$Bnw!NS$P0#zJd{%s4oVf3o81qe+3K?)-X-JcVtudoE?$#fqt+`kmX(do$3BUH1yS$X# zu46YTEOz7M1{4;L7Ug?f2*b3Qwlr!xT9M}%|jH!J3owi{uR!xqa z`y7c)#(!<_ny8Np`x;Br7ef79)PXCleQj#S+L1ns;X1Ok1gb-u!^%zoxs_K1U-OHp zw;&CNs>gN*+++M708-|fXw{kw#jX*7Nu`wc&@7NEA~>ohN>dq=F~%bqAa(CkXBwg~ zj}S1Z-{D;5cGt54IZ@SFa^qe4Jdj5K;HI!8Kris5L83|z>WwD5xH5>ZDFI&o7pz*y ztYGjl(d=Jb+JDWiTt*xu)=6Z+Lz$HcnEaIl@4p=nI{R7(6gdHhEukUqyUN0xsLJS9nzF1L}bsGq^*Y3 zT~AdXx<*6lNYp1Cb;rdMO*X=VWq*^s@v!Sy`SKNAaN(uw>xzQ)SI!uWAfx-0Q3UdR zp;K47{jGMTm>3}?DRysPW9iu99iPbH&~}iB|K$8VrZ;nCv}*1?dJFoMGNg+1a4ysS zPX|-H!%zB5-f=F==Hgd{O297fxd^uO#trl)c*WpIE*UaKv*l>CT|oPxnmRt@F-$H| z>%pot{<%Yi24UkRw;j<+y9Z&2MKW}~nyu+Gb*o6?q4RCM^uto=4qwZuNn?^E+NfqZ0EHZmB#UDCqIWW{xi)G#T9}vp)QvCzoe`Vl4DLSgPC1?W`Taz#?chjb3BvI zH`B~O7CN@XPxj1M0VykF&p?Jy`mujfsZ5yT{t00V4Bjz~>R{U`h6nNt@%;}|@u_?S zMKar>CJB%EP0MMQkag*YQWKY zw+bBIrTd^%ERb4C-yr-vpttljvjppmZr`kTOgBT8vg3{b@u3MDT2RMaLC`?yhgY1qY}@PL6nzr*;( zG&G#!Yr~7LD|f+P3sm{+?vcK%BJICao?>C_pn+O3M^@nG_x&XOnuFnUkbCP<&a4sV ztQLTc{yHW!-72Wxz~y*{^So0Xs59%>*L#MpV@^#i$eFFfsBq6N|-ba5*=e> zOzXTtCL=L>%+O?jmS0*r(`RZU+gsIU`PB`p&>sAvK25MNvLI0NnJf*rl@Mp!M1J(uJ3EZMH(+6ftbu&B`84R_Yke5H5oE-6yfRU9U8%*Q5)>oejte#>} z4*iQ6FsBJ8e9ibO${7#;J$>tk+l%kQ3%cJ!K9@Wl?fkON=S6Q!Hj@7E>ODD0I+T(i z&S2BUR_@qN{iBb+{=IOfR&H_nJ6@J32fvA$T>^|T4w*N9nSRmTg3vZ@iUlMfMt}D@ zD&KqM89nMh^o9NFo5bqFaT}_#dPw}?WA5KA@i0**4eapplE88T1RvW=Rzm=zn;kyw z`!ETZ=b$cB0ySaA%@#83%ss~X_Tovoc-vo}H;Bdpc72J}RyQ@SzdPIuDzaU!2ZvCWL#^F}A~}nJFnu(aQTV?&T$#)7l=PsVzZl6v7@}4P z&I1Ng-_@mA9nDPlf$=b-JmdxxF6jM;v6-+TyX9Dob%=k3QKD`prTen7S6@;&lI_45 z)bG`PB21uicHiIgrk`#6HwNTg`>SDd@Lgb}CCN#QJlRT)#hI_q=tt+ARe9H@R&@!= zB*~_9?o~)^9S1-L;>z<653M?yT{!xaK}}u^{fpj%a!$L(02|wa_uN7p?ylYlU2P0- z`$N7>0#+&kwWpyM-40Ipa%gfylb`vP9RisMF@vMY3888KIfDNV#Tc^#3)ry_qo5-9 z62fCP9{5GN(K=5?Ay*+bVNIWm4h-U#OliVCKtu_3#aO|%DSCXby-Wtjvoxt5)`8`` z%KeYOvn0XLMjok9ejDl>*c86T?%ve3HE()~h@m3P!gx!3>OOn?`l{EA2{!vHa;%0% zq{xuJfuGyO9D)bZkv&J%C>n{ZG8^a-G(pjG6)bZ@O~TV-%BpG{Fx@? zm0sM5b67{CV3`csQ4A`j_^T60ETm7~)V$jVtuP7eQm6}chGjM;lOa@Q3{ zMelC_EbD*p3@LzV9g14{)gRipjCHNAInn3fT@2-86#Vx$77(4nUm}#d%(t1R!A%7k zb3jIDhfJWL)XvA9Yf9?xXhC#JM1OkFND>nv_4zJC${KYHUSG>TlbwC%c(7%^U?q|h z74Tdo0=xm4A^2bG*!uNP83rFR2XLWUqN3i36o~iUdTj@@w+`QG&ep~x2oeCHvVn<2 zT)Dw}S;hP8Et#+bR?Kre>u!19Q{5~`n7UGD>arGlP#qrrl)ib8VdiQgoYn#S^At#C z`taX+&iNUq|6QFW^;M1Ek4cCL#(S@@K9fQ>`9y|MHpgr2A$c?3+jM(hTs@U&a&%4= ziq8$gx}J5V#2XHLWHfXoqMjm8c^{uSiG#ke!g8iPR-8k^Y#fKtSYXVhUc)1J%DwW_ zg&KhF|B_WG+@9UrqUt>406N>($q(EZDu84Ik7hbfw0YqpkfX(YU>(@(N&$_>rUD6T zZ4T#ciR~f;UL52D82=b3IYB@+*SY|{PV&4H>h1^2D(0l!S%jRm!K98_Q)EZ3uPs8C z59H`rzR%c7Yf5TuhMy#7T{Wqr?Lo12Gz7`w1y5@Etl52-)fqvfH2KLwNGaBAxz}Ct zm?#38(a}jv-m`ms?1lJW>WnoD<_hE7tu2up1%A&{MM*LDF->+;gxTI3I`r~VWziA| z{IhUyn0~STpM&*D`nDFCYiStS(*0McbWcuj^%ftz@Sl=oGPc$N6a<9i~{IwxO&&3UbRM{Yy3N5Hj?!(Dg`l$KL ztkvM?j4`~gr07YGousvO-1)WT?-~ol3OpqO)EQY}p$@V2xITy?eS#RgA+=j#oFfrv zpQ7FKRzELA;2lV-XaL;r^d#!bpr%owwNdXa+Sg7Eke`E4G$va3OYyP7?)Vvf=U;L~ z#9}#3*C6Z9(q@Re{-F{n*uml|WL94W@Y~_qkopLOOMLqj>-=4(JdqA=Jj;(9Ka957GfOv@-%@Bhwen-g@Q)|4--|^w| zcoxl!rK|MW?ziN<55Wm==Pd??Sgp_3Qk z_x72f($RNx3OwRcvOK@FC>;gFCzu@JUj`U{zaYVc1=s7z!{R4>Z9t{Y#dUeU#Liiq z{nFJ1*=r`#g|>QQNJ9df9HkXLvf_MK_L2ol4JR_dCF-?0dYa+ZKhC-72ln$;Ol>KjINiJoFT8aG=r5y|~) z8j%V5e00-lS2iH~z=)6w`lq1;21k5X0k62Y^_dI^*~F+mPG=AtU6Wz~zISJ&yz}3i zf13r1S%ih^w!Y^{TKCE~!~}DWBo@i%F?qRuy#x|e++t&6>vJ$YqZP+Z}-=auo_H6_Af!u!)Ev?bCPUftgC zfx6EDFto|tQdAG^jap;NUeSFm-go7P)WU@<743Mh5fRJDCd%=A%jnUNk0_KoFpWT5 zjhJh%9OeZtYJ4-FlnmnjFOoq5W7Ndf+>Tmt&xb0EsrtHsT*mc=^|cn;Bcb~GCswc{ zk)!UaB&u5cA3Wk}5Ch!eyOvD#!FPTJu$}ZlePg2Gq4k2^ecn7I2(w&2?44t<^z{+K zPGOuw9VYqYJ``Bip?ce{A8M{_A7iQpJ7zqQ8&XL=s)*Yq)kSANfncTj&PD>`jv2tR5&cad)obC;uwDB;H~^B|?Jz!N zgzO;iaqJkumj!53Ja)o!@EDA}r`S@_gvqn8>Tg0ng`?^$uQU1XaULI(WiVe~6J$t9 z$x{jjP8^G0hiuXFn*C~(7>n#v`3wIiW&+U*BFsO}?5M*2>Lc(@R?21`;`uoette*t zh-JCKW6LKX!53T_`Q=F?!C=HIzw4druWLR&`aFqhoW{+8T8D+#Wo)TdQ?8J@jXX)~ z%@gw-MK#-dEib1KW<-Dv@1FW&S$fl%^?Qa1fs%qx|GudeTY=lNNQ}xP`fwM1AQVWh z`BKAveA>&(G6~{H>g+`W{k&ha4l*QEEM$Ef671)hmqZ4#<;K}}+T2)kb1LVE+_bI* z;a+TCXae5k{YLWT1c`D{LSD2=;KTKnWn?~FgnO$)70hWNCN>sCz)UF+Un$g_0@Oyq2ZrYn;<(#{X(8 zXkZr!J5~Li4>hYFs^L#4UYC9y!wOyL~U=c6=%8)`E!wQSzuh~(iX0_8-ZYnD-QcE305t<)? z`x#Ty21<**0P6)vp>I>6pk)2vXB44-$o-14f@gY-Y0eLrF_xUgw(p+BZ{DpbBbhH( znb19AC@>b8Oq2KK_lLWHsfFNQ9M-=M{1$HJcIi)@8pFhB_eddvmz1I)TevBY^zaYn zE#+O5)5xzLFZQQ!QAP74ATtj433?@R8`9u1f{2$G(AYxEU$gMoe7s`2rB1|DQ2=HW z*2U)sBs4!YY+1fr#9lMV@QFaI)*E$WYg=xex+I!~Y(Rfx=W6d&%YtDmam()=L3*b2 zCC39cm#JGTLCRn_H$?EuME#Hd{>~&~nDbFBEPKps3Q!Na#`e#duq=PkkvT>M_V^{( z0$l?;0>?L+?kg|6;Sz`WvJ;5FaOB-nlA0Jq?+TPxTpv1j>Pe*$L4*zy1ypHcBj{Ti zpAF2fAQ(ZwBKSB_ZbPHsqhT2GH6gXUI@%yR)Hrn2EmiNPu1xY%s-lj0H3gqUb|zF> zCFidA_ttMG;C{c~AbUCX$kL~v*G8n^`I0mcP?DI_LQVg0u0jjV9ETZSrzj`$^W=a{oNuO+S+HI(rl zc=NG{5IEIId)D-c)sxjJtmS7a#d=&ukeZp85ZB8dIj++uS$y~TUYhEB(?HCl^L)2S zhVdwb7K}QwxMmyubtc>(wg=U_87yHK0%V*Lw<~;Jahix zHa*OP=Cd_pd7naJ3l+(`e6I$C5YJ2Z>Tca%KZ>atsj3kMJcwxGKYU>X#II$XZ`=vw zQFxCJgbXNlR6iH=J*EuWEqKsK1Wfr|ct-zzorX#C-}z;)cduzUP(~D@ZP#$W!+ES$ z9FZMAexB5h<;a|I>+HRb*E}#}7ZM_o`9-U}!M^K3!16(8K1~RxV8=_>pnP@+C;TDx z&MG3{ea}Vrq&juI4T?v6y8Yg;lx z*ll2VORkgBIZc(+&yeT#oOi60)h+^c?v`>nsQdDZ~@MWf?&W$l(Yk2>VRm zeSXNuB!>gzf*r5J)xg)`1)DmtWg}%ax{3#pIUWjrdP4(CM>nLK%o*evHBfX6ke1lQ z&!7bV=CRWwO1;g-d2$>XbT+1iCQD$LfA6d5c6xHFj@_=u1`8&=kBB__SM(Qh z8X)YVSbEa7xnobbu0;o$B!yIC(AZC$DlsO5n$h0Q$-iA6kOs19iheu2`TH6gKB+z= zAXH3RY?Lt@o?dw`stp)RxwqWpLqJ*#LgQE5QSKAo95)_BZ3Zfgu2<&NiFe}YmnEh9 z@I_CHJ%*d$@2o2k#b#w7U5tEdp=p`PieIE0)RUg^0$* zvCC_6-P5x!!FrmRyfwrk%iU`$3PC0C-_k1!K3y8I9j8}uhE1Z91$c4c+#e~XqA^n3 zsVO~3|E<@+v%3>MlP~=zI{I4;V2pZ6s#UQ`_|t)oE3YvPvwmNc&zN}PWTEq#YBryf z=1OuHC;`g?W4Ku~lh}`WYv|wr*baKrE1DZORv5R2#1PK?X%ZoW?!LZrK5`e0Jg4&W zEi0_`3^Q28Xy}K)DG9llDxkbnqFeXE?z#@|#`U5fHy&TvCV_fauI9(#EoK@?7Fde& zUJunqQrV&Jp;0~RL%L}^G9{s@(~FiNeYgA4Yc*wvDs|u~i%tUds$oWmAXglUz1@}f z&^sRu+$&9wN%vvBhW8Gn;(1XBU{m-n7|egt+>+i3@$WBQwZJ0q&f~S9mOnfzqX;xK z%1wZC_e~nTuIGDw;R+5n*>uKv<+g6deO*Bw#B1(+XQbX8zY^l7=Sn!57IDW(Ln!Q; z>Iv;fUe=d(WJ;-Hhbm-;s{=>fsqZuRDlQ#5?2TV?GK7hikkxAM-*J>EbZ+i#N9~|Xo>3@i*UT1I3lj+S_c-Dg~ZcwmeWhet9r7@8z*RrueV=epW1|E zR@Mm{>?fC2m%qudc!un*pY2OVoJDv4xZ<=e)*E+rUNjPaeZF#c-TMvW#ujJWRF(R8 zzmOD9QkyEQGC_}#7FJn$LyUfYmX`Vch7viT+Ad1qrA^mh#n?ys?C^=$iVs~KAqj+4*Cl&?GT;nemXi(XWY75w7(BnCzgmgmHTL4O zs5uv!f;kW@vVYV@#+TlZUs>+fwyYSm6C&2ML0zBg4z_R8E9;W*W8yMCG9_FQo|mkV#Ce@NXQl62|& zWW>r`nn^r}L9Ms-_Xq?LE$8T(HvobDU(~`wl1NknX6Ly~$YFfCW~iz6*RITLUa8}+ z87|w6S1tcdm_n@?)Yrwgw$;P!6-*&|-};(JHTJLD%%*_WlMac|SxVCdy?|}w4x&F z{E-HoGs*?rt-0*3tdrEf zS3OmH7buF^t~`IDNwK)2TRWZXu&E)WW)BjgC{-y`u+6&`#Z-VIp>@ zR*ZWTHG)BQiApo&BYyW1xGAdGbTClUzGRMk?i`0yuG*M&^?__Yo%=3-llqQFvjxJx zk*543s5p1Jj3R^j8_|tkN9ybhN&S2r2@&tdEzdASGA^UhY0yTvRaxN+zy8W%NT5`b zS?u^3>obl#TF>9S^TIO7$V))>%%8M>I^*`X0Ew4j0ok5COgIY~PMwBy-p>aP?C=_& zcRN>Pz0S7{fAdh0ZrnC~?^P?}Z}m~Ba8bzyzuYZLYdWyaJ)}=0q`yYM3H$08h4#Y3 z+tqOL*-bK64LxlwK@7p4OoQ`u>1HZ$`O6a5d__{`yn7u@=P{7x^Xa!Kztth!PNX2t z8#QDbT%8j(7ALW)Mz;3%$2*7hkPy@>&4&5s8MM3}mP_5eqwtvO7inH|sVvIQi(jNM z6Ue3Pl}~ivT&1fK=9mlTbUj_~X((OgNvCwdd1Q~mY?x^Nulr|$3Ot2c0B^|&So)AN zXH!Im8xA;A1jdIyCFh~{|MQGR9Q|>T;#J1sKk4_B&-;==x5u3%hM;){M}$NmDq?q= z*)B9XFXjW@=n^7MLT6NbeyaZ{%$K-edD*0-G}8XfRoxQQ5Hv&tbFFi6gTkn_wW#u+ zlhTyTwS2qE+xnJH9;>aBTYT!8=5!bMT426YR6-d0p`x^eiLJNBTtC)I+t4)H-IsT< z3|d%%ejP8dCi9~6bUH(UIKI>&`~!}Z)s3{@-`=f+aJ>O!^vl~Lb#CGpWPHz6!qN^N zE7M)db$7sg^1Qz0`jsA~)6QNb!E3#rGVZ}=|D-(W62|ohTlHy$KRLc22>GnYZqytR z$ry!;JPNnkef8KI;i7v3S`tvOi36`9=vvR(ix-v0O z{-3BDZkdYv*WX!42P=m`>AT8RfvUlshwerfKd2$e2pP=?dRkDL+5l=jMM%2IaR%Bz zUh8d`+9Bx>_zEV3PIPIqK*iNH8BWG+qzgEfp51pTgqjt|j=^`y_=YDem#j^9KgEh^ z19F|L1?YII(w0PO&}%#j#5tXBqQRtTULTJt_3kwRR6@5NmWPU&OBoe!6T8ObOhpY>Hb9>pHR5>vlY0NyYBHPhAMvp>R zrhfgPYmg67DWBWAp)qPjBC$BBTq_miT592>AnZ}E+ zd0A-g504EjAmzzdOjNXfh>BrMnTQWz*hwW4oHOO`C}$~Xk?(%HD3kB0K?~_5C5e1D zoC7xpJk`dHr_mQQ3;ql#*7Tp)p0(4XziO{SBkmmkAZ{bfz z1FNLoG!T&Mj9(Wcfah_nuE*FC9Q4XAN9sDKnEFY{q^o>ED*lN<%pj42f^FP1%9YR{ zD(gg++uUZSYH@<<@v-joh~&ky-RnDt43FgZfwXKr-EPBUgI2RY#jL&QQ~jPQeUOGgIW1|v)sgl89>jlq;#;!V8BpQ?C-i|wuq)l=Uwk5H%|K3}f~ zWE{BmPB>9ATHx!{Qry9)?{8mXyFS;rVV6n5!1p{@_TD~dA)PvN8zORh2RDe++TOSs z`A@*C^u$D6gX5zu_iI6~J_EW7jBXT8W5v^jto_|e zb3I2u=Aiwh(nfSCglOGu6;tr$O@<`%^Y08N@6ImJ*-2Uw)FoI)Dql7mMeUxUJle1B z^dtxVnWnjX*$Hkd+Iyq$gq{D2d1aweuAx!lq3^Cs#Op3qNfs&b)8o?pI*>_S5i9tlHAM?R6HOkh>Am*(y369y?c)#{>Y!X;^5<*vOj@RNAISB`bo3+<6rk*WDv@IS;7(7iP0G{rtuc<)-l7*t$3bV zA2z-=s(p|Sh|(%7y^;OD0Br%1{(w&B)|fEmzbhPqfj%&D0>DBpssI5^L4i%X;ubb` zd&N2x<5X)270D*omvTDGR`l_S`*!xI+QHm@ae(K@( zjHO587-mkvhTl7a>kCXjMnV9kozfRTK)}%iK{0++{3#PoSx>$p z;;NOrR+CL)1; zur&m5*iyF>2)(lXd{6XqR%Foi>QEb%V2&b8vsKp?m<^1c0N^P=l)p6Fk2 z1R!T$AB%gMg=CtqEiihFjsO~*Wm(@pR6VJ@5jH=Pf8NX|4{em@*bZBE0D(c` Z{{x|zc~;=d!2tjO002ovPDHLkV1j=5Ap-ya literal 0 HcmV?d00001 diff --git a/test/fixtures/blend/blend-plain-torque-2.2.1.png b/test/fixtures/blend/blend-plain-torque-2.2.1.png new file mode 100644 index 0000000000000000000000000000000000000000..74497a48262a1b8f0dfb5ad5b3e4683e692ce9bb GIT binary patch literal 32520 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 literal 0 HcmV?d00001 diff --git a/test/fixtures/blend/http_fallback/blend-layers-0.3-zxy-1.0.0.png b/test/fixtures/blend/http_fallback/blend-layers-0.3-zxy-1.0.0.png new file mode 100644 index 0000000000000000000000000000000000000000..6234c3d9221bb5835a6afda698a0d85358cc1eaf GIT binary patch literal 857 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 bx{Uu1{inmMK}F<}00000NkvXXu0mjf1GMnF literal 0 HcmV?d00001 diff --git a/test/fixtures/blend/http_fallback/blend-layers-1.2-zxy-1.0.0.png b/test/fixtures/blend/http_fallback/blend-layers-1.2-zxy-1.0.0.png new file mode 100644 index 0000000000000000000000000000000000000000..824bded24ad0fa7fb43a82f621b36db0c67d11ba GIT binary patch literal 11126 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

*uW*F;m?oY8MW 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 BqdNcq literal 0 HcmV?d00001 diff --git a/test/fixtures/blend/http_fallback/blend-layers-2.3-zxy-1.0.0.png b/test/fixtures/blend/http_fallback/blend-layers-2.3-zxy-1.0.0.png new file mode 100644 index 0000000000000000000000000000000000000000..824bded24ad0fa7fb43a82f621b36db0c67d11ba GIT binary patch literal 11126 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

*uW*F;m?oY8MW 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