kong/spec/03-plugins/31-proxy-cache/04-invalidations_spec.lua (245 lines of code) (raw):

local helpers = require "spec.helpers" local POLL_INTERVAL = 0.3 for _, strategy in helpers.each_strategy() do describe("proxy-cache invalidations via: " .. strategy, function() local client_1 local client_2 local admin_client_1 local admin_client_2 local route1 local route2 local plugin1 local plugin2 local bp setup(function() bp = helpers.get_db_utils(strategy, nil, {"proxy-cache"}) route1 = assert(bp.routes:insert { hosts = { "route-1.com" }, }) route2 = assert(bp.routes:insert { hosts = { "route-2.com" }, }) plugin1 = assert(bp.plugins:insert { name = "proxy-cache", route = { id = route1.id }, config = { strategy = "memory", content_type = { "text/plain", "application/json" }, memory = { dictionary_name = "kong", }, }, }) plugin2 = assert(bp.plugins:insert { name = "proxy-cache", route = { id = route2.id }, config = { strategy = "memory", content_type = { "text/plain", "application/json" }, memory = { dictionary_name = "kong", }, }, }) local db_update_propagation = strategy == "cassandra" and 3 or 0 assert(helpers.start_kong { log_level = "debug", prefix = "servroot1", database = strategy, proxy_listen = "0.0.0.0:8000", proxy_listen_ssl = "0.0.0.0:8443", admin_listen = "0.0.0.0:8001", admin_gui_listen = "0.0.0.0:8002", admin_ssl = false, admin_gui_ssl = false, db_update_frequency = POLL_INTERVAL, db_update_propagation = db_update_propagation, plugins = "proxy-cache", nginx_conf = "spec/fixtures/custom_nginx.template", }) assert(helpers.start_kong { log_level = "debug", prefix = "servroot2", database = strategy, proxy_listen = "0.0.0.0:9000", proxy_listen_ssl = "0.0.0.0:9443", admin_listen = "0.0.0.0:9001", admin_gui_listen = "0.0.0.0:9002", admin_ssl = false, admin_gui_ssl = false, db_update_frequency = POLL_INTERVAL, db_update_propagation = db_update_propagation, plugins = "proxy-cache", }) client_1 = helpers.http_client("127.0.0.1", 8000) client_2 = helpers.http_client("127.0.0.1", 9000) admin_client_1 = helpers.http_client("127.0.0.1", 8001) admin_client_2 = helpers.http_client("127.0.0.1", 9001) end) teardown(function() helpers.stop_kong("servroot1", true) helpers.stop_kong("servroot2", true) end) before_each(function() client_1 = helpers.http_client("127.0.0.1", 8000) client_2 = helpers.http_client("127.0.0.1", 9000) admin_client_1 = helpers.http_client("127.0.0.1", 8001) admin_client_2 = helpers.http_client("127.0.0.1", 9001) end) after_each(function() client_1:close() client_2:close() admin_client_1:close() admin_client_2:close() end) describe("cache purge", function() local cache_key, cache_key2 setup(function() -- prime cache entries on both instances local res_1 = assert(client_1:send { method = "GET", path = "/get", headers = { Host = "route-1.com", }, }) assert.res_status(200, res_1) assert.same("Miss", res_1.headers["X-Cache-Status"]) cache_key = res_1.headers["X-Cache-Key"] local res_2 = assert(client_2:send { method = "GET", path = "/get", headers = { host = "route-1.com", }, }) assert.res_status(200, res_2) assert.same("Miss", res_2.headers["X-Cache-Status"]) assert.same(cache_key, res_2.headers["X-Cache-Key"]) res_1 = assert(client_1:send { method = "GET", path = "/get", headers = { host = "route-2.com", }, }) assert.res_status(200, res_1) assert.same("Miss", res_1.headers["X-Cache-Status"]) cache_key2 = res_1.headers["X-Cache-Key"] assert.not_same(cache_key, cache_key2) res_2 = assert(client_2:send { method = "GET", path = "/get", headers = { host = "route-2.com", }, }) assert.res_status(200, res_2) assert.same("Miss", res_2.headers["X-Cache-Status"]) end) it("propagates purges via cluster events mechanism", function() local res_1 = assert(client_1:send { method = "GET", path = "/get", headers = { host = "route-1.com", }, }) assert.res_status(200, res_1) assert.same("Hit", res_1.headers["X-Cache-Status"]) local res_2 = assert(client_2:send { method = "GET", path = "/get", headers = { host = "route-1.com", }, }) assert.res_status(200, res_2) assert.same("Hit", res_2.headers["X-Cache-Status"]) -- now purge the entry local res = assert(admin_client_1:send { method = "DELETE", path = "/proxy-cache/" .. plugin1.id .. "/caches/" .. cache_key, }) assert.res_status(204, res) helpers.wait_until(function() -- assert that the entity was purged from the second instance res = assert(admin_client_2:send { method = "GET", path = "/proxy-cache/" .. plugin1.id .. "/caches/" .. cache_key, }) res:read_body() return res.status == 404 end, 10) -- refresh and purge with our second endpoint res_1 = assert(client_1:send { method = "GET", path = "/get", headers = { Host = "route-1.com", }, }) assert.res_status(200, res_1) assert.same("Miss", res_1.headers["X-Cache-Status"]) res_2 = assert(client_2:send { method = "GET", path = "/get", headers = { host = "route-1.com", }, }) assert.res_status(200, res_2) assert.same("Miss", res_2.headers["X-Cache-Status"]) assert.same(cache_key, res_2.headers["X-Cache-Key"]) -- now purge the entry res = assert(admin_client_1:send { method = "DELETE", path = "/proxy-cache/" .. cache_key, }) assert.res_status(204, res) admin_client_2:close() admin_client_2 = helpers.http_client("127.0.0.1", 9001) helpers.wait_until(function() -- assert that the entity was purged from the second instance res = assert(admin_client_2:send { method = "GET", path = "/proxy-cache/" .. cache_key, }) res:read_body() return res.status == 404 end, 10) end) it("does not affect cache entries under other plugin instances", function() local res = assert(admin_client_1:send { method = "GET", path = "/proxy-cache/" .. plugin2.id .. "/caches/" .. cache_key2, }) assert.res_status(200, res) res = assert(admin_client_2:send { method = "GET", path = "/proxy-cache/" .. plugin2.id .. "/caches/" .. cache_key2, }) assert.res_status(200, res) end) it("propagates global purges", function() do local res = assert(admin_client_1:send { method = "DELETE", path = "/proxy-cache/", }) assert.res_status(204, res) end helpers.wait_until(function() local res = assert(admin_client_1:send { method = "GET", path = "/proxy-cache/" .. plugin2.id .. "/caches/" .. cache_key2, }) res:read_body() return res.status == 404 end, 10) helpers.wait_until(function() local res = assert(admin_client_2:send { method = "GET", path = "/proxy-cache/" .. plugin2.id .. "/caches/" .. cache_key2, }) res:read_body() return res.status == 404 end, 10) end) end) end) end