diff --git a/test/acceptance/user-database-timeout-limit.js b/test/acceptance/user-database-timeout-limit.js index 52ead026..6e5423e1 100644 --- a/test/acceptance/user-database-timeout-limit.js +++ b/test/acceptance/user-database-timeout-limit.js @@ -2,6 +2,7 @@ require('../support/test_helper'); const assert = require('../support/assert'); const TestClient = require('../support/test-client'); +const serverOptions = require('../../lib/cartodb/server_options'); const timeoutErrorTilePath = `${process.cwd()}/assets/render-timeout-fallback.png`; @@ -438,6 +439,77 @@ describe('user database timeout limit', function () { }); }); + + if (process.env.POSTGIS_VERSION === '2.4') { + describe('fetching vector tiles via PostGIS renderer', function() { + const usePostGIS = true; + const originalUsePostGIS = serverOptions.renderer.mvt.usePostGIS; + + beforeEach(function (done) { + serverOptions.renderer.mvt.usePostGIS = usePostGIS; + + const mapconfig = createMapConfig(); + this.testClient = new TestClient(mapconfig, 1234); + const expectedResponse = { + status: 200, + headers: { + 'Content-Type': 'application/json; charset=utf-8' + } + }; + + this.testClient.getLayergroup({ response: expectedResponse }, (err, res) => { + if (err) { + return done(err); + } + + this.layergroupid = res.layergroupid; + + done(); + }); + }); + + afterEach(function () { + serverOptions.renderer.mvt.usePostGIS = originalUsePostGIS; + }); + + describe('with user\'s timeout of 200 ms', function () { + beforeEach(function (done) { + this.testClient.setUserDatabaseTimeoutLimit(200, done); + }); + + afterEach(function (done) { + this.testClient.setUserDatabaseTimeoutLimit(0, done); + }); + + it('"mvt" fails due to statement timeout', function (done) { + const params = { + layergroupid: this.layergroupid, + format: 'mvt', + layers: [ 0 ], + response: { + status: 429, + headers: { + 'Content-Type': 'application/x-protobuf' + } + }, + cacheBuster: true + }; + + this.testClient.getTile(0, 0, 0, params, (err, res, tile) => { + assert.ifError(err); + + var tileJSON = tile.toJSON(); + assert.equal(Array.isArray(tileJSON), true); + assert.equal(tileJSON.length, 2); + assert.equal(tileJSON[0].name, 'errorTileSquareLayer'); + assert.equal(tileJSON[1].name, 'errorTileStripesLayer'); + + done(); + }); + }); + }); + }); + } }); }); diff --git a/test/acceptance/user-render-timeout-limit.js b/test/acceptance/user-render-timeout-limit.js index 93770080..79822c7b 100644 --- a/test/acceptance/user-render-timeout-limit.js +++ b/test/acceptance/user-render-timeout-limit.js @@ -139,7 +139,7 @@ describe('user render timeout limit', function () { }); it('layergroup creation works but tile request fails due to render timeout', function (done) { - this.testClient.getTile(0, 0, 0, {}, (err, res, tile) => { + this.testClient.getTile(0, 0, 0, { cacheBuster: true }, (err, res, tile) => { assert.ifError(err); assert.imageIsSimilarToFile(tile, timeoutErrorTilePath, 0.05, (err) => { @@ -180,7 +180,8 @@ describe('user render timeout limit', function () { headers: { 'Content-Type': 'application/json; charset=utf-8' } - } + }, + cacheBuster: true }; this.testClient.getTile(0, 0, 0, params, (err, res, timeoutError) => { @@ -201,56 +202,52 @@ describe('user render timeout limit', function () { }); }); - if (process.env.POSTGIS_VERSION === '2.4') { - describe('vector (PostGIS)', vector(true)); - } - - describe('vector (mapnik)', vector(false)); - function vector(usePostGIS) { + describe('vector tile via mapnik renderer', function () { + const usePostGIS = false; const originalUsePostGIS = serverOptions.renderer.mvt.usePostGIS; - return function () { - beforeEach(function (done) { - serverOptions.renderer.mvt.usePostGIS = usePostGIS; - const mapconfig = createMapConfig(); - this.testClient = new TestClient(mapconfig, 1234); - this.testClient.setUserDatabaseTimeoutLimit(50, done); - }); - afterEach(function (done) { - serverOptions.renderer.mvt.usePostGIS = originalUsePostGIS; - this.testClient.setUserDatabaseTimeoutLimit(0, (err) => { - if (err) { - return done(err); + beforeEach(function (done) { + serverOptions.renderer.mvt.usePostGIS = usePostGIS; + const mapconfig = createMapConfig(); + this.testClient = new TestClient(mapconfig, 1234); + this.testClient.setUserRenderTimeoutLimit('localhost', 50, done); + }); + + afterEach(function (done) { + serverOptions.renderer.mvt.usePostGIS = originalUsePostGIS; + this.testClient.setUserRenderTimeoutLimit('localhost', 0, (err) => { + if (err) { + return done(err); + } + this.testClient.drain(done); + }); + }); + + it('layergroup creation works but vector tile request fails due to render timeout', function (done) { + const params = { + format: 'mvt', + response: { + status: 429, + headers: { + 'Content-Type': 'application/x-protobuf' } - this.testClient.drain(done); - }); + }, + cacheBuster: true + }; + + this.testClient.getTile(0, 0, 0, params, (err, res, tile) => { + assert.ifError(err); + + var tileJSON = tile.toJSON(); + assert.equal(Array.isArray(tileJSON), true); + assert.equal(tileJSON.length, 2); + assert.equal(tileJSON[0].name, 'errorTileSquareLayer'); + assert.equal(tileJSON[1].name, 'errorTileStripesLayer'); + + done(); }); - - it('layergroup creation works but vector tile request fails due to render timeout', function (done) { - const params = { - format: 'mvt', - response: { - status: 429, - headers: { - 'Content-Type': 'application/x-protobuf' - } - } - }; - - this.testClient.getTile(0, 0, 0, params, (err, res, tile) => { - assert.ifError(err); - - var tileJSON = tile.toJSON(); - assert.equal(Array.isArray(tileJSON), true); - assert.equal(tileJSON.length, 2); - assert.equal(tileJSON[0].name, 'errorTileSquareLayer'); - assert.equal(tileJSON[1].name, 'errorTileStripesLayer'); - - done(); - }); - }); - }; - } + }); + }); describe('interativity', function () { beforeEach(function (done) { @@ -277,7 +274,8 @@ describe('user render timeout limit', function () { headers: { 'Content-Type': 'application/json; charset=utf-8' } - } + }, + cacheBuster: true }; this.testClient.getTile(0, 0, 0, params, (err, res, tile) => { @@ -365,7 +363,7 @@ describe('user render timeout limit', function () { }); }); - it('layergroup creation works and render tile fails', function (done) { + it('layergroup creation works and render static center tile fails', function (done) { const params = { zoom: 0, lat: 0, @@ -378,7 +376,8 @@ describe('user render timeout limit', function () { headers: { 'Content-Type': 'application/json; charset=utf-8' } - } + }, + cacheBuster: true }; this.testClient.getStaticCenter(params, function (err, res, timeoutError) { diff --git a/test/support/test-client.js b/test/support/test-client.js index 5e08394a..2a5840f5 100644 --- a/test/support/test-client.js +++ b/test/support/test-client.js @@ -125,6 +125,14 @@ function resErr2errRes(callback) { }; } +function layergroupidTemplate (layergroupId, params) { + const { token, signer, cacheBuster } = LayergroupToken.parse(layergroupId); + + // {user}@{token}:{cache_buster} + // {token}:{cache_buster} + return `${signer ? signer + '@' : ''}${token}:${params.cacheBuster ? Date.now() : cacheBuster }`; +} + TestClient.prototype.getWidget = function(widgetName, params, callback) { var self = this; @@ -726,7 +734,7 @@ TestClient.prototype.getTile = function(z, x, y, params, callback) { self.keysToDelete['map_cfg|' + LayergroupToken.parse(layergroupId).token] = 0; self.keysToDelete['user:localhost:mapviews:global'] = 5; - url = '/api/v1/map/' + layergroupId + '/'; + url = `/api/v1/map/${layergroupidTemplate(layergroupId, params)}/`; var layers = params.layers; @@ -769,7 +777,6 @@ TestClient.prototype.getTile = function(z, x, y, params, callback) { } }, params.response); - var isPng = format.match(/png$/); if (isPng) { @@ -954,7 +961,9 @@ TestClient.prototype.getStaticCenter = function (params, callback) { self.keysToDelete['map_cfg|' + LayergroupToken.parse(layergroupId).token] = 0; self.keysToDelete['user:localhost:mapviews:global'] = 5; - url = `/api/v1/map/static/center/${layergroupId}/${zoom}/${lat}/${lng}/${width}/${height}.${format}`; + const layergroupid = layergroupidTemplate(layergroupId, params); + + url = `/api/v1/map/static/center/${layergroupid}/${zoom}/${lat}/${lng}/${width}/${height}.${format}`; if (self.apiKey) { url += '?' + qs.stringify({api_key: self.apiKey});