Windshaft-cartodb/test/acceptance/ported/server-png8-format-test.js

190 lines
6.6 KiB
JavaScript

'use strict';
var testHelper = require('../../support/test-helper');
var assert = require('../../support/assert');
var _ = require('underscore');
var fs = require('fs');
var path = require('path');
var cartodbServer = require('../../../lib/server');
var ServerOptions = require('./support/ported-server-options');
var LayergroupToken = require('../../../lib/models/layergroup-token');
var IMAGE_EQUALS_TOLERANCE_PER_MIL = 85;
describe('server_png8_format', function () {
var serverPng32;
var serverPng8;
before(function () {
var serverOptionsPng32 = ServerOptions;
serverOptionsPng32.grainstore = _.clone(ServerOptions.grainstore);
serverOptionsPng32.grainstore.mapnik_tile_format = 'png32';
serverPng32 = cartodbServer(serverOptionsPng32);
serverPng32.setMaxListeners(0);
var serverOptionsPng8 = ServerOptions;
serverOptionsPng8.grainstore = _.clone(ServerOptions.grainstore);
serverOptionsPng8.grainstore.mapnik_tile_format = 'png8:m=h';
serverPng8 = cartodbServer(serverOptionsPng8);
serverPng8.setMaxListeners(0);
});
var layergroupId;
before(function (done) {
var testPngFilesDir = path.join(__dirname, '/../../results/png');
fs.readdirSync(testPngFilesDir)
.filter(function (fileName) {
return /.*\.png$/.test(fileName);
})
.map(function (fileName) {
return testPngFilesDir + '/' + fileName;
})
.forEach(fs.unlinkSync);
done();
});
var keysToDelete;
beforeEach(function () {
keysToDelete = {
'user:localhost:mapviews:global': 5
};
});
afterEach(function (done) {
testHelper.deleteRedisKeys(keysToDelete, done);
});
function testOutputForPng32AndPng8 (desc, tile, callback) {
var bufferPng32,
bufferPng8;
it(desc + '; tile: ' + JSON.stringify(tile), function (done) {
assert.response(
serverPng32,
{
url: '/api/v1/map',
method: 'POST',
headers: {
host: 'localhost',
'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: '/api/v1/map/' + layergroupId + tilePartialUrl,
method: 'GET',
encoding: 'binary',
headers: {
host: 'localhost'
}
};
var requestHeaders = {
status: 200,
headers: {
'Content-Type': 'image/png'
}
};
assert.response(serverPng32, requestPayload, requestHeaders, function (responsePng32) {
assert.strictEqual(responsePng32.headers['content-type'], 'image/png');
bufferPng32 = responsePng32.body;
assert.response(serverPng8, requestPayload, requestHeaders, function (responsePng8) {
assert.strictEqual(responsePng8.headers['content-type'], 'image/png');
bufferPng8 = responsePng8.body;
assert.ok(bufferPng8.length < bufferPng32.length);
assert.imageBuffersAreSimilar(bufferPng32, bufferPng8, IMAGE_EQUALS_TOLERANCE_PER_MIL,
function (err, imagePaths, similarity) {
keysToDelete['map_cfg|' + LayergroupToken.parse(layergroupId).token] = 0;
callback(err, imagePaths, similarity, done);
}
);
});
});
}
);
});
}
var currentLevel = 3;
var allLevelTiles = [];
var 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 = [];
var 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();
});
});
});