2015-09-18 00:12:45 +08:00
|
|
|
var testHelper = require('../../support/test_helper');
|
2015-07-08 05:46:58 +08:00
|
|
|
|
|
|
|
|
|
|
|
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');
|
|
|
|
|
2015-09-18 00:12:45 +08:00
|
|
|
var nock = require('nock');
|
|
|
|
|
2015-09-17 00:09:39 +08:00
|
|
|
var BaseController = require('../../../lib/cartodb/controllers/base');
|
|
|
|
|
2015-07-08 05:46:58 +08:00
|
|
|
function rmdir_recursive_sync(dirname) {
|
|
|
|
var files = fs.readdirSync(dirname);
|
|
|
|
for (var i=0; i<files.length; ++i) {
|
|
|
|
var f = dirname + "/" + files[i];
|
|
|
|
var s = fs.lstatSync(f);
|
|
|
|
if ( s.isFile() ) {
|
|
|
|
fs.unlinkSync(f);
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
rmdir_recursive_sync(f);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2015-09-17 23:36:23 +08:00
|
|
|
describe('external resources', function() {
|
2015-07-08 05:46:58 +08:00
|
|
|
|
|
|
|
var res_serv; // resources server
|
|
|
|
var res_serv_status = { numrequests:0 }; // status of resources server
|
|
|
|
var res_serv_port = 8033; // FIXME: make configurable ?
|
|
|
|
|
|
|
|
var IMAGE_EQUALS_TOLERANCE_PER_MIL = 25;
|
|
|
|
|
2015-09-17 00:09:39 +08:00
|
|
|
var req2paramsFn;
|
2015-07-08 05:46:58 +08:00
|
|
|
before(function(done) {
|
2015-09-18 00:12:45 +08:00
|
|
|
nock.enableNetConnect('127.0.0.1');
|
|
|
|
|
2015-09-17 00:09:39 +08:00
|
|
|
req2paramsFn = BaseController.prototype.req2params;
|
|
|
|
BaseController.prototype.req2params = PortedServerOptions.req2params;
|
2015-07-08 05:46:58 +08:00
|
|
|
// Start a server to test external resources
|
|
|
|
res_serv = http.createServer( function(request, response) {
|
|
|
|
++res_serv_status.numrequests;
|
|
|
|
var filename = __dirname + '/../../fixtures/markers' + request.url;
|
|
|
|
fs.readFile(filename, "binary", function(err, file) {
|
|
|
|
if ( err ) {
|
|
|
|
response.writeHead(404, {'Content-Type': 'text/plain'});
|
|
|
|
response.write("404 Not Found\n");
|
|
|
|
} else {
|
|
|
|
response.writeHead(200);
|
|
|
|
response.write(file, "binary");
|
|
|
|
}
|
|
|
|
response.end();
|
|
|
|
});
|
|
|
|
});
|
|
|
|
res_serv.listen(res_serv_port, done);
|
|
|
|
});
|
|
|
|
|
2015-09-17 00:09:39 +08:00
|
|
|
after(function(done) {
|
|
|
|
BaseController.prototype.req2params = req2paramsFn;
|
|
|
|
|
|
|
|
rmdir_recursive_sync(global.environment.millstone.cache_basedir);
|
|
|
|
|
2015-09-18 00:12:45 +08:00
|
|
|
testHelper.deleteRedisKeys({
|
|
|
|
'user:localhost:mapviews:global': 5
|
|
|
|
}, function() {
|
|
|
|
// Close the resources server
|
|
|
|
res_serv.close(done);
|
|
|
|
});
|
|
|
|
|
2015-09-17 00:09:39 +08:00
|
|
|
});
|
|
|
|
|
2015-09-25 20:42:30 +08:00
|
|
|
afterEach(function(done) {
|
|
|
|
testHelper.deleteRedisKeys({'user:localhost:mapviews:global': 5}, done);
|
|
|
|
});
|
|
|
|
|
2015-07-08 05:46:58 +08:00
|
|
|
function imageCompareFn(fixture, done) {
|
|
|
|
return function(err, res) {
|
|
|
|
if (err) {
|
|
|
|
return done(err);
|
|
|
|
}
|
|
|
|
assert.imageEqualsFile(res.body, './test/fixtures/' + fixture, IMAGE_EQUALS_TOLERANCE_PER_MIL, done);
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
|
|
|
it("basic external resource", function(done) {
|
|
|
|
|
2015-09-17 23:51:34 +08:00
|
|
|
var circleStyle = "#test_table_3 { marker-file: url('http://127.0.0.1:" + res_serv_port +
|
2015-07-08 05:46:58 +08:00
|
|
|
"/circle.svg'); marker-transform:'scale(0.2)'; }";
|
|
|
|
|
|
|
|
testClient.getTile(testClient.defaultTableMapConfig('test_table_3', circleStyle), 13, 4011, 3088,
|
|
|
|
imageCompareFn('test_table_13_4011_3088_svg1.png', done));
|
|
|
|
});
|
|
|
|
|
|
|
|
it("different external resource", function(done) {
|
|
|
|
|
2015-09-17 23:51:34 +08:00
|
|
|
var squareStyle = "#test_table_3 { marker-file: url('http://127.0.0.1:" + res_serv_port +
|
2015-07-08 05:46:58 +08:00
|
|
|
"/square.svg'); marker-transform:'scale(0.2)'; }";
|
|
|
|
|
|
|
|
testClient.getTile(testClient.defaultTableMapConfig('test_table_3', squareStyle), 13, 4011, 3088,
|
|
|
|
imageCompareFn('test_table_13_4011_3088_svg2.png', done));
|
|
|
|
});
|
|
|
|
|
|
|
|
// See http://github.com/CartoDB/Windshaft/issues/107
|
|
|
|
it("external resources get localized on renderer creation if not locally cached", function(done) {
|
|
|
|
|
|
|
|
var options = {
|
|
|
|
serverOptions: PortedServerOptions
|
|
|
|
};
|
|
|
|
|
2015-09-17 23:36:23 +08:00
|
|
|
var externalResourceStyle = "#test_table_3{marker-file: url('http://127.0.0.1:" + res_serv_port +
|
2015-07-08 05:46:58 +08:00
|
|
|
"/square.svg'); marker-transform:'scale(0.2)'; }";
|
|
|
|
|
|
|
|
var externalResourceMapConfig = testClient.defaultTableMapConfig('test_table_3', externalResourceStyle);
|
|
|
|
|
|
|
|
testClient.createLayergroup(externalResourceMapConfig, options, function() {
|
|
|
|
var externalResourceRequestsCount = res_serv_status.numrequests;
|
|
|
|
|
|
|
|
testClient.createLayergroup(externalResourceMapConfig, options, function() {
|
|
|
|
assert.equal(res_serv_status.numrequests, externalResourceRequestsCount);
|
|
|
|
|
|
|
|
// reset resources cache
|
|
|
|
rmdir_recursive_sync(global.environment.millstone.cache_basedir);
|
|
|
|
|
|
|
|
externalResourceMapConfig = testClient.defaultTableMapConfig('test_table_3 ', externalResourceStyle);
|
|
|
|
|
|
|
|
testClient.createLayergroup(externalResourceMapConfig, options, function() {
|
|
|
|
assert.equal(res_serv_status.numrequests, externalResourceRequestsCount + 1);
|
|
|
|
|
|
|
|
done();
|
|
|
|
});
|
|
|
|
});
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
it("referencing unexistant external resources returns an error", function(done) {
|
2015-09-17 23:36:23 +08:00
|
|
|
var url = "http://127.0.0.1:" + res_serv_port + "/notfound.png";
|
2015-07-08 05:46:58 +08:00
|
|
|
var style = "#test_table_3{marker-file: url('" + url + "'); marker-transform:'scale(0.2)'; }";
|
|
|
|
|
|
|
|
var mapConfig = testClient.defaultTableMapConfig('test_table_3', style);
|
|
|
|
|
|
|
|
testClient.createLayergroup(mapConfig, { statusCode: 400 }, function(err, res) {
|
|
|
|
assert.deepEqual(JSON.parse(res.body), {
|
|
|
|
errors: ["Unable to download '" + url + "' for 'style0' (server returned 404)"]
|
|
|
|
});
|
|
|
|
done();
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
});
|
|
|
|
|