From 9c27447b17e73b38d9c43ec4842d2ca0c5163531 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20Mart=C3=ADn?= Date: Fri, 2 Mar 2018 20:52:06 +0100 Subject: [PATCH] refactoring rate limit tests --- test/acceptance/rate-limit.test.js | 447 +++++------------------------ 1 file changed, 65 insertions(+), 382 deletions(-) diff --git a/test/acceptance/rate-limit.test.js b/test/acceptance/rate-limit.test.js index edfc5fcc..afcf8952 100644 --- a/test/acceptance/rate-limit.test.js +++ b/test/acceptance/rate-limit.test.js @@ -98,6 +98,50 @@ function getReqAndRes() { }; } +function assertGetLayergroupRequest (status, limit, remaining, reset, retry, done = null) { + const response = { + status, + headers: { + 'Content-Type': 'application/json; charset=utf-8', + 'X-Rate-Limit-Limit': limit, + 'X-Rate-Limit-Remaining': remaining, + 'X-Rate-Limit-Reset': reset, + 'X-Rate-Limit-Retry-After': retry + } + }; + + testClient.getLayergroup({ response }, err => { + assert.ifError(err); + if (done) { + setTimeout(done, 1000); + } + }); +} + +function assertRateLimitRequest (status, limit, remaining, reset, retry, done = null) { + const { req, res } = getReqAndRes(); + rateLimit(req, res, function (err) { + assert.deepEqual(res.headers, { + "X-Rate-Limit-Limit": limit, + "X-Rate-Limit-Remaining": remaining, + "X-Rate-Limit-Reset": reset, + "X-Rate-Limit-Retry-After": retry + }); + + if(status === 200) { + assert.ifError(err); + } else { + assert.ok(err); + assert.equal(err.message, 'You are over the limits.'); + assert.equal(err.http_status, 429); + } + + if (done) { + setTimeout(done, 1000); + } + }); +} + describe('rate limit', function() { before(function() { global.environment.enabledFeatures.rateLimitsEnabled = true; @@ -133,21 +177,7 @@ describe('rate limit', function() { const burst = 1; setLimit(count, period, burst); - let response = { - status: 200, - headers: { - 'Content-Type': 'application/json; charset=utf-8', - 'X-Rate-Limit-Limit': '2', - 'X-Rate-Limit-Remaining': '1', - 'X-Rate-Limit-Reset': '1', - 'X-Rate-Limit-Retry-After': '-1' - } - }; - - testClient.getLayergroup({ response }, err => { - assert.ifError(err); - setTimeout(done, period * 1000); - }); + assertGetLayergroupRequest(200, '2', '1', '1', '-1', done); }); it("1 req/sec: 2 req/seg should be limited", function(done) { @@ -156,121 +186,12 @@ describe('rate limit', function() { const burst = 1; setLimit(count, period, burst); - let response = { - status: 200, - headers: { - 'Content-Type': 'application/json; charset=utf-8', - 'X-Rate-Limit-Limit': '2', - 'X-Rate-Limit-Remaining': '1', - 'X-Rate-Limit-Reset': '1', - 'X-Rate-Limit-Retry-After': '-1' - } - }; - - testClient.getLayergroup({ response }, err => { - assert.ifError(err); - }); - - setTimeout( - function() { - let response = { - status: 200, - headers: { - 'Content-Type': 'application/json; charset=utf-8', - 'X-Rate-Limit-Limit': '2', - 'X-Rate-Limit-Remaining': '0', - 'X-Rate-Limit-Reset': '1', - 'X-Rate-Limit-Retry-After': '-1' - } - }; - - testClient.getLayergroup({ response }, err => { - assert.ifError(err); - }); - }, - 250 - ); - - setTimeout( - function() { - let response = { - status: 429, - headers: { - 'Content-Type': 'application/json; charset=utf-8', - 'X-Rate-Limit-Limit': '2', - 'X-Rate-Limit-Remaining': '0', - 'X-Rate-Limit-Reset': '1', - 'X-Rate-Limit-Retry-After': '0' - } - }; - - testClient.getLayergroup({ response }, err => { - assert.ifError(err); - }); - }, - 500 - ); - - setTimeout( - function() { - let response = { - status: 429, - headers: { - 'Content-Type': 'application/json; charset=utf-8', - 'X-Rate-Limit-Limit': '2', - 'X-Rate-Limit-Remaining': '0', - 'X-Rate-Limit-Reset': '1', - 'X-Rate-Limit-Retry-After': '0' - } - }; - - testClient.getLayergroup({ response }, err => { - assert.ifError(err); - }); - }, - 750 - ); - - setTimeout( - function() { - let response = { - status: 429, - headers: { - 'Content-Type': 'application/json; charset=utf-8', - 'X-Rate-Limit-Limit': '2', - 'X-Rate-Limit-Remaining': '0', - 'X-Rate-Limit-Reset': '1', - 'X-Rate-Limit-Retry-After': '0' - } - }; - - testClient.getLayergroup({ response }, err => { - assert.ifError(err); - }); - }, - 950 - ); - - setTimeout( - function() { - let response = { - status: 200, - headers: { - 'Content-Type': 'application/json; charset=utf-8', - 'X-Rate-Limit-Limit': '2', - 'X-Rate-Limit-Remaining': '0', - 'X-Rate-Limit-Reset': '1', - 'X-Rate-Limit-Retry-After': '-1' - } - }; - - testClient.getLayergroup({ response }, err => { - assert.ifError(err); - setTimeout(done, period * 2 * 1000); - }); - }, - 1050 - ); + assertGetLayergroupRequest(200, '2', '1', '1', '-1'); + setTimeout( () => assertGetLayergroupRequest(200, '2', '0', '1', '-1'), 250); + setTimeout( () => assertGetLayergroupRequest(429, '2', '0', '1', '0'), 500); + setTimeout( () => assertGetLayergroupRequest(429, '2', '0', '1', '0'), 750); + setTimeout( () => assertGetLayergroupRequest(429, '2', '0', '1', '0'), 950); + setTimeout( () => assertGetLayergroupRequest(200, '2', '0', '1', '-1', done), 1050); }); }); @@ -299,7 +220,7 @@ describe('rate limit middleware', function () { const burst = 0; setLimit(count, period, burst); - setTimeout(done, 10); + setTimeout(done, 1000); }); after(function () { @@ -311,266 +232,28 @@ describe('rate limit middleware', function () { }); }); - it("3 request (1 per second) should not be rate limited", function (done) { - let { req, res } = getReqAndRes(); - rateLimit(req, res, function (err) { - assert.ifError(err); - assert.deepEqual(res.headers, { - "X-Rate-Limit-Limit": 1, - "X-Rate-Limit-Remaining": 0, - "X-Rate-Limit-Reset": 1, - "X-Rate-Limit-Retry-After": -1 - }); - }); - - setTimeout( - function () { - let { req, res } = getReqAndRes(); - rateLimit(req, res, function (err) { - assert.ifError(err); - assert.deepEqual(res.headers, { - "X-Rate-Limit-Limit": 1, - "X-Rate-Limit-Remaining": 0, - "X-Rate-Limit-Reset": 1, - "X-Rate-Limit-Retry-After": -1 - }); - }); - }, - 1100 - ); - - setTimeout( - function () { - let { req, res } = getReqAndRes(); - rateLimit(req, res, function (err) { - assert.ifError(err); - assert.deepEqual(res.headers, { - "X-Rate-Limit-Limit": 1, - "X-Rate-Limit-Remaining": 0, - "X-Rate-Limit-Reset": 1, - "X-Rate-Limit-Retry-After": -1 - }); - - setTimeout(done, 1000); - }); - }, - 2 * 1100 - ); - }); - it("1 req/sec: 2 req/seg should be limited", function (done) { - let { req, res } = getReqAndRes(); - rateLimit(req, res, function (err) { - assert.ifError(err); - assert.deepEqual(res.headers, { - "X-Rate-Limit-Limit": 1, - "X-Rate-Limit-Remaining": 0, - "X-Rate-Limit-Reset": 1, - "X-Rate-Limit-Retry-After": -1 - }); - }); - - setTimeout( - function () { - let { req, res } = getReqAndRes(); - rateLimit(req, res, function (err) { - assert.ok(err); - assert.deepEqual(res.headers, { - "X-Rate-Limit-Limit": 1, - "X-Rate-Limit-Remaining": 0, - "X-Rate-Limit-Reset": 0, - "X-Rate-Limit-Retry-After": 0 - }); - assert.equal(err.message, 'You are over the limits.'); - assert.equal(err.http_status, 429); - }); - }, - 250 - ); - - setTimeout( - function () { - let { req, res } = getReqAndRes(); - rateLimit(req, res, function (err) { - assert.ok(err); - assert.deepEqual(res.headers, { - "X-Rate-Limit-Limit": 1, - "X-Rate-Limit-Remaining": 0, - "X-Rate-Limit-Reset": 0, - "X-Rate-Limit-Retry-After": 0 - }); - assert.equal(err.message, 'You are over the limits.'); - assert.equal(err.http_status, 429); - }); - }, - 500 - ); - - setTimeout( - function () { - let { req, res } = getReqAndRes(); - rateLimit(req, res, function (err) { - assert.ok(err); - assert.deepEqual(res.headers, { - "X-Rate-Limit-Limit": 1, - "X-Rate-Limit-Remaining": 0, - "X-Rate-Limit-Reset": 0, - "X-Rate-Limit-Retry-After": 0 - }); - assert.equal(err.message, 'You are over the limits.'); - assert.equal(err.http_status, 429); - }); - }, - 750 - ); - - setTimeout( - function () { - let { req, res } = getReqAndRes(); - rateLimit(req, res, function (err) { - assert.ok(err); - assert.deepEqual(res.headers, { - "X-Rate-Limit-Limit": 1, - "X-Rate-Limit-Remaining": 0, - "X-Rate-Limit-Reset": 0, - "X-Rate-Limit-Retry-After": 0 - }); - assert.equal(err.message, 'You are over the limits.'); - assert.equal(err.http_status, 429); - }); - }, - 950 - ); - - setTimeout( - function () { - let { req, res } = getReqAndRes(); - rateLimit(req, res, function (err) { - assert.ifError(err); - assert.deepEqual(res.headers, { - "X-Rate-Limit-Limit": 1, - "X-Rate-Limit-Remaining": 0, - "X-Rate-Limit-Reset": 1, - "X-Rate-Limit-Retry-After": -1 - }); - setTimeout(done, 1000); - }); - }, - 1050 - ); + assertRateLimitRequest(200, 1, 0, 1, -1); + setTimeout( () => assertRateLimitRequest(429, 1, 0, 0, 0), 250); + setTimeout( () => assertRateLimitRequest(429, 1, 0, 0, 0), 500); + setTimeout( () => assertRateLimitRequest(429, 1, 0, 0, 0), 750); + setTimeout( () => assertRateLimitRequest(429, 1, 0, 0, 0), 950); + setTimeout( () => assertRateLimitRequest(200, 1, 0, 1, -1, done), 1050); }); - it("1 req/sec: 2 req/seg should be limited, removing script SHA from Redis", function (done) { + it("1 req/sec: 2 req/seg should be limited, removing SHA script from Redis", function (done) { userLimitsApi.metadataBackend.redisCmd( 8, 'SCRIPT', ['FLUSH'], function () { - let { req, res } = getReqAndRes(); - rateLimit(req, res, function (err) { - assert.ifError(err); - assert.deepEqual(res.headers, { - "X-Rate-Limit-Limit": 1, - "X-Rate-Limit-Remaining": 0, - "X-Rate-Limit-Reset": 1, - "X-Rate-Limit-Retry-After": -1 - }); - }); - - setTimeout( - function () { - let { req, res } = getReqAndRes(); - rateLimit(req, res, function (err) { - assert.ok(err); - assert.deepEqual(res.headers, { - "X-Rate-Limit-Limit": 1, - "X-Rate-Limit-Remaining": 0, - "X-Rate-Limit-Reset": 0, - "X-Rate-Limit-Retry-After": 0 - }); - assert.equal(err.message, 'You are over the limits.'); - assert.equal(err.http_status, 429); - }); - }, - 250 - ); - - setTimeout( - function () { - let { req, res } = getReqAndRes(); - rateLimit(req, res, function (err) { - assert.ok(err); - assert.deepEqual(res.headers, { - "X-Rate-Limit-Limit": 1, - "X-Rate-Limit-Remaining": 0, - "X-Rate-Limit-Reset": 0, - "X-Rate-Limit-Retry-After": 0 - }); - assert.equal(err.message, 'You are over the limits.'); - assert.equal(err.http_status, 429); - }); - }, - 500 - ); - - setTimeout( - function () { - let { req, res } = getReqAndRes(); - rateLimit(req, res, function (err) { - assert.ok(err); - assert.deepEqual(res.headers, { - "X-Rate-Limit-Limit": 1, - "X-Rate-Limit-Remaining": 0, - "X-Rate-Limit-Reset": 0, - "X-Rate-Limit-Retry-After": 0 - }); - assert.equal(err.message, 'You are over the limits.'); - assert.equal(err.http_status, 429); - }); - }, - 750 - ); - - setTimeout( - function () { - let { req, res } = getReqAndRes(); - rateLimit(req, res, function (err) { - assert.ok(err); - assert.deepEqual(res.headers, { - "X-Rate-Limit-Limit": 1, - "X-Rate-Limit-Remaining": 0, - "X-Rate-Limit-Reset": 0, - "X-Rate-Limit-Retry-After": 0 - }); - assert.equal(err.message, 'You are over the limits.'); - assert.equal(err.http_status, 429); - }); - }, - 950 - ); - - setTimeout( - function () { - let { req, res } = getReqAndRes(); - rateLimit(req, res, function (err) { - assert.ifError(err); - assert.deepEqual(res.headers, { - "X-Rate-Limit-Limit": 1, - "X-Rate-Limit-Remaining": 0, - "X-Rate-Limit-Reset": 1, - "X-Rate-Limit-Retry-After": -1 - }); - }); - }, - 1050 - ); - - setTimeout( function() { - userLimitsApi.preprareRateLimit(); - setTimeout(done, 1000); - }, 1100); + assertRateLimitRequest(200, 1, 0, 1, -1); + setTimeout( () => assertRateLimitRequest(429, 1, 0, 0, 0), 500); + setTimeout( () => assertRateLimitRequest(429, 1, 0, 0, 0), 500); + setTimeout( () => assertRateLimitRequest(429, 1, 0, 0, 0), 750); + setTimeout( () => assertRateLimitRequest(429, 1, 0, 0, 0), 950); + setTimeout( () => assertRateLimitRequest(200, 1, 0, 1, -1, done), 1050); } ); - }); });