Windshaft-cartodb/test/support/test-helper.js

212 lines
6.3 KiB
JavaScript
Raw Permalink Normal View History

'use strict';
var assert = require('assert');
2015-09-26 01:56:28 +08:00
var fs = require('fs');
2019-10-22 01:07:24 +08:00
var LZMA = require('lzma').LZMA;
2014-08-15 01:54:45 +08:00
var lzmaWorker = new LZMA();
2011-09-05 07:00:41 +08:00
2015-09-17 21:10:23 +08:00
var redis = require('redis');
const setICUEnvVariable = require('../../lib/utils/icu-data-env-setter');
2015-09-17 21:10:23 +08:00
2011-09-05 07:00:41 +08:00
// set environment specific variables
2020-12-16 23:32:32 +08:00
let configFileName = process.env.NODE_ENV;
if (process.env.CARTO_WINDSHAFT_ENV_BASED_CONF) {
// we override the file with the one with env vars
configFileName = 'config';
}
global.environment = require(`../../config/environments/${configFileName}.js`);
2014-02-28 23:14:44 +08:00
process.env.NODE_ENV = 'test';
2011-09-05 07:00:41 +08:00
setICUEnvVariable();
2011-09-05 07:00:41 +08:00
// Utility function to compress & encode LZMA
2019-11-06 23:44:17 +08:00
function lzmaCompressToBase64 (payload, mode, callback) {
2019-10-22 01:07:24 +08:00
lzmaWorker.compress(payload, mode,
function (ints) {
ints = ints.map(function (c) { return String.fromCharCode(c + 128); }).join('');
var base64 = Buffer.from(ints, 'binary').toString('base64');
2019-10-22 01:07:24 +08:00
callback(null, base64);
},
function (/* percent */) {
// console.log("Compressing: " + percent + "%");
}
);
}
// Check that the response headers do not request caching
// Throws on failure
2019-10-22 01:07:24 +08:00
function checkNoCache (res) {
assert.ok(!Object.prototype.hasOwnProperty.call(res.headers, 'x-cache-channel'));
assert.ok(!Object.prototype.hasOwnProperty.call(res.headers, 'surrogate-key'));
assert.ok(!Object.prototype.hasOwnProperty.call(res.headers, 'cache-control')); // is this correct ?
assert.ok(!Object.prototype.hasOwnProperty.call(res.headers, 'last-modified')); // is this correct ?
}
/**
* Check that the response headers do not request caching
* @see checkNoCache
* @param res
*/
2019-10-22 01:07:24 +08:00
function checkCache (res) {
assert.ok(Object.prototype.hasOwnProperty.call(res.headers, 'x-cache-channel'));
assert.ok(Object.prototype.hasOwnProperty.call(res.headers, 'cache-control'));
assert.ok(Object.prototype.hasOwnProperty.call(res.headers, 'last-modified'));
}
2019-10-22 01:07:24 +08:00
function checkSurrogateKey (res, expectedKey) {
assert.ok(Object.prototype.hasOwnProperty.call(res.headers, 'surrogate-key'));
2019-10-22 01:07:24 +08:00
function createSet (keys, key) {
keys[key] = true;
return keys;
}
var keys = res.headers['surrogate-key'].split(' ').reduce(createSet, {});
var expectedKeys = expectedKey.split(' ').reduce(createSet, {});
assert.deepStrictEqual(keys, expectedKeys);
}
var uncaughtExceptions = [];
2019-10-22 01:07:24 +08:00
process.on('uncaughtException', function (err) {
uncaughtExceptions.push(err);
});
2019-10-22 01:07:24 +08:00
beforeEach(function () {
uncaughtExceptions = [];
});
2019-10-22 01:07:24 +08:00
// global afterEach to capture uncaught exceptions
afterEach(function () {
assert.strictEqual(
uncaughtExceptions.length,
0,
'uncaughtException:\n\n' + uncaughtExceptions.map(err => err.stack).join('\n\n'));
});
var redisClient;
2019-10-22 01:07:24 +08:00
beforeEach(function () {
if (!redisClient) {
2020-12-16 23:32:32 +08:00
redisClient = redis.createClient(
{
port: global.environment.redis.port,
host: global.environment.redis.host
});
}
});
2019-10-22 01:07:24 +08:00
// global afterEach to capture test suites that leave keys in redis
afterEach(function (done) {
var expectedKeys = {
'rails:test_windshaft_cartodb_user_1_db:test_table_private_1': true,
'rails:test_windshaft_cartodb_user_1_db:my_table': true,
'rails:users:localhost:map_key': true,
'rails:users:cartodb250user': true,
'rails:users:localhost': true,
'api_keys:localhost:1234': true,
2018-02-08 18:13:21 +08:00
'api_keys:localhost:default_public': true,
'api_keys:cartodb250user:4321': true,
2018-02-08 19:34:24 +08:00
'api_keys:cartodb250user:default_public': true,
2018-02-08 20:07:25 +08:00
'api_keys:localhost:regular1': true,
2019-10-22 01:07:24 +08:00
'api_keys:localhost:regular2': true
};
2019-10-22 01:07:24 +08:00
var databasesTasks = { 0: 'users', 5: 'meta' };
var keysFound = [];
2019-10-22 01:07:24 +08:00
function taskDone (err, db, keys) {
if (err) {
return done(err);
}
delete databasesTasks[db];
2019-10-22 01:07:24 +08:00
keys.forEach(function (k) {
if (!expectedKeys[k]) {
2019-10-22 01:07:24 +08:00
keysFound.push('[db=' + db + ']' + k);
}
});
if (Object.keys(databasesTasks).length === 0) {
assert.strictEqual(keysFound.length, 0, 'Unexpected keys found in redis: ' + keysFound.join(', '));
done();
}
}
2019-10-22 01:07:24 +08:00
Object.keys(databasesTasks).forEach(function (db) {
redisClient.select(db, function () {
// Check that we start with an empty redis db
2019-10-22 01:07:24 +08:00
redisClient.keys('*', function (err, keys) {
return taskDone(err, db, keys);
});
});
});
});
2019-10-22 01:07:24 +08:00
function deleteRedisKeys (keysToDelete, callback) {
2015-09-25 20:09:14 +08:00
if (Object.keys(keysToDelete).length === 0) {
return callback();
}
2019-10-22 01:07:24 +08:00
function taskDone (k) {
delete keysToDelete[k];
if (Object.keys(keysToDelete).length === 0) {
callback();
}
}
2019-10-22 01:07:24 +08:00
Object.keys(keysToDelete).forEach(function (k) {
2020-12-16 23:32:32 +08:00
var redisClient = redis.createClient(
{
port: global.environment.redis.port,
host: global.environment.redis.host
});
2019-10-22 01:07:24 +08:00
redisClient.select(keysToDelete[k], function () {
redisClient.del(k, function (err, deletedKeysCount) {
2019-10-25 00:38:37 +08:00
assert.ifError(err);
redisClient.quit();
assert.notStrictEqual(deletedKeysCount, 0, 'No KEYS deleted for: [db=' + keysToDelete[k] + ']' + k);
taskDone(k);
});
});
});
}
2019-10-22 01:07:24 +08:00
function rmdirRecursiveSync (dirname) {
2015-09-26 01:56:28 +08:00
var files = fs.readdirSync(dirname);
2019-10-22 01:07:24 +08:00
for (var i = 0; i < files.length; ++i) {
var f = dirname + '/' + files[i];
2015-09-26 01:56:28 +08:00
var s = fs.lstatSync(f);
2019-10-22 01:07:24 +08:00
if (s.isFile()) {
2015-09-26 01:56:28 +08:00
fs.unlinkSync(f);
2019-10-22 01:07:24 +08:00
} else {
2015-09-26 01:56:28 +08:00
rmdirRecursiveSync(f);
}
}
}
2019-10-22 01:07:24 +08:00
function configureMetadata (action, params, callback) {
redisClient.SELECT(5, function (err) {
if (err) {
return callback(err);
}
redisClient[action](params, function (err) {
if (err) {
return callback(err);
}
return callback();
});
});
}
module.exports = {
2019-10-22 01:07:24 +08:00
deleteRedisKeys: deleteRedisKeys,
2019-11-06 23:44:17 +08:00
lzma_compress_to_base64: lzmaCompressToBase64,
2019-10-22 01:07:24 +08:00
checkNoCache: checkNoCache,
checkSurrogateKey: checkSurrogateKey,
checkCache: checkCache,
rmdirRecursiveSync: rmdirRecursiveSync,
configureMetadata
};