kong/spec/01-unit/10-log_serializer_spec.lua (274 lines of code) (raw):

require("spec.helpers") local LOG_PHASE = require("kong.pdk.private.phases").phases.log describe("kong.log.serialize", function() describe("#http", function() before_each(function() _G.ngx = { config = { subsystem = "http", }, ctx = { balancer_data = { tries = { { ip = "127.0.0.1", port = 8000, }, }, }, }, var = { request_uri = "/request_uri", upstream_uri = "/upstream_uri", scheme = "http", host = "test.com", server_port = "80", request_length = "200", bytes_sent = "99", request_time = "2", remote_addr = "1.1.1.1" }, update_time = ngx.update_time, sleep = ngx.sleep, time = ngx.time, req = { get_uri_args = function() return {"arg1", "arg2"} end, get_method = function() return "POST" end, get_headers = function() return {header1 = "header1", header2 = "header2", authorization = "authorization"} end, start_time = function() return 3 end }, resp = { get_headers = function() return {header1 = "respheader1", header2 = "respheader2", ["set-cookie"] = "delicious=delicacy"} end }, } package.loaded["kong.pdk.request"] = nil local pdk_request = require "kong.pdk.request" kong.request = pdk_request.new(kong) ngx.ctx.KONG_PHASE = LOG_PHASE end) describe("Basic", function() it("serializes without API, Consumer or Authenticated entity", function() local res = kong.log.serialize({ngx = ngx, kong = kong, }) assert.is_table(res) -- Simple properties assert.equals("1.1.1.1", res.client_ip) assert.equals(3000, res.started_at) -- Latencies assert.is_table(res.latencies) assert.equal(0, res.latencies.kong) assert.equal(-1, res.latencies.proxy) assert.equal(2000, res.latencies.request) -- Request assert.is_table(res.request) assert.same({header1 = "header1", header2 = "header2", authorization = "REDACTED"}, res.request.headers) assert.equal("POST", res.request.method) assert.same({"arg1", "arg2"}, res.request.querystring) assert.equal("http://test.com:80/request_uri", res.request.url) assert.equal("/upstream_uri", res.upstream_uri) assert.equal(200, res.request.size) assert.equal("/request_uri", res.request.uri) -- Response assert.is_table(res.response) assert.same({header1 = "respheader1", header2 = "respheader2", ["set-cookie"] = "delicious=delicacy"}, res.response.headers) assert.equal(99, res.response.size) assert.is_nil(res.api) assert.is_nil(res.consumer) assert.is_nil(res.authenticated_entity) -- Tries assert.is_table(res.tries) end) it("uses port map (ngx.ctx.host_port) for request url ", function() ngx.ctx.host_port = 5000 local res = kong.log.serialize({ngx = ngx, kong = kong, }) assert.is_table(res) assert.is_table(res.request) assert.equal("http://test.com:5000/request_uri", res.request.url) end) it("serializes the matching Route and Services", function() ngx.ctx.route = { id = "my_route" } ngx.ctx.service = { id = "my_service" } local res = kong.log.serialize({ngx = ngx, kong = kong, }) assert.is_table(res) assert.equal("my_route", res.route.id) assert.equal("my_service", res.service.id) assert.is_nil(res.consumer) assert.is_nil(res.authenticated_entity) end) it("serializes the Consumer object", function() ngx.ctx.authenticated_consumer = {id = "someconsumer"} local res = kong.log.serialize({ngx = ngx, kong = kong, }) assert.is_table(res) assert.equal("someconsumer", res.consumer.id) assert.is_nil(res.api) assert.is_nil(res.authenticated_entity) end) it("serializes the Authenticated Entity object", function() ngx.ctx.authenticated_credential = {id = "somecred", consumer_id = "user1"} local res = kong.log.serialize({ngx = ngx, kong = kong, }) assert.is_table(res) assert.same({id = "somecred", consumer_id = "user1"}, res.authenticated_entity) assert.is_nil(res.consumer) assert.is_nil(res.api) end) it("serializes the tries and failure information", function() ngx.ctx.balancer_data.tries = { { ip = "127.0.0.1", port = 1234, state = "next", code = 502 }, { ip = "127.0.0.1", port = 1234, state = "failed", code = nil }, { ip = "127.0.0.1", port = 1234 }, } local res = kong.log.serialize({ngx = ngx, kong = kong, }) assert.is_table(res) assert.same({ { code = 502, ip = '127.0.0.1', port = 1234, state = 'next', }, { ip = '127.0.0.1', port = 1234, state = 'failed', }, { ip = '127.0.0.1', port = 1234, }, }, res.tries) end) it("does not fail when the 'balancer_data' structure is missing", function() ngx.ctx.balancer_data = nil local res = kong.log.serialize({ngx = ngx, kong = kong, }) assert.is_table(res) assert.is_nil(res.tries) end) it("includes query args in upstream_uri when they are not found in " .. "var.upstream_uri and exist in var.args", function() local args = "arg1=foo&arg2=bar" ngx.var.is_args = "?" ngx.var.args = args local res = kong.log.serialize({ngx = ngx, kong = kong, }) assert.is_table(res) assert.equal("/upstream_uri" .. "?" .. args, res.upstream_uri) end) end) end) describe("#stream", function() before_each(function() _G.ngx = { config = { subsystem = "stream", }, ctx = { balancer_data = { tries = { { ip = "127.0.0.1", port = 8000, }, }, }, }, var = { bytes_received = "99", bytes_sent = "100", upstream_bytes_received = "200", upstream_bytes_sent = "300", session_time = "2.123", remote_addr = "1.1.1.1", server_port = "12345" }, update_time = ngx.update_time, sleep = ngx.sleep, time = ngx.time, req = { start_time = function() return 3 end }, status = 200, } package.loaded["kong.pdk.request"] = nil local pdk_request = require "kong.pdk.request" kong.request = pdk_request.new(kong) ngx.ctx.KONG_PHASE = LOG_PHASE -- reload log module, after ngx.config.subsystem has been patched -- to make sure the correct variant is used package.loaded["kong.pdk.log"] = nil local pdk_log = require "kong.pdk.log" kong.log = pdk_log.new(kong) end) describe("Basic", function() it("serializes without API, Consumer or Authenticated entity", function() local res = kong.log.serialize({ngx = ngx, kong = kong, }) assert.is_table(res) -- Simple properties assert.equals("1.1.1.1", res.client_ip) assert.equals(3000, res.started_at) -- Latencies assert.is_table(res.latencies) assert.equal(0, res.latencies.kong) assert.equal(2123, res.latencies.session) -- Session assert.is_table(res.session) assert.equal(99, res.session.received) assert.equal(100, res.session.sent) assert.equal(200, res.session.status) assert.equal(12345, res.session.server_port) -- Upstream assert.is_table(res.upstream) assert.equal(300, res.upstream.sent) assert.equal(200, res.upstream.received) assert.is_nil(res.api) assert.is_nil(res.consumer) assert.is_nil(res.authenticated_entity) -- Tries assert.is_table(res.tries) end) it("serializes the matching Route and Services", function() ngx.ctx.route = { id = "my_route" } ngx.ctx.service = { id = "my_service" } local res = kong.log.serialize({ngx = ngx, kong = kong, }) assert.is_table(res) assert.equal("my_route", res.route.id) assert.equal("my_service", res.service.id) assert.is_nil(res.consumer) assert.is_nil(res.authenticated_entity) end) it("serializes the Consumer object", function() ngx.ctx.authenticated_consumer = {id = "someconsumer"} local res = kong.log.serialize({ngx = ngx, kong = kong, }) assert.is_table(res) assert.equal("someconsumer", res.consumer.id) assert.is_nil(res.api) assert.is_nil(res.authenticated_entity) end) it("serializes the Authenticated Entity object", function() ngx.ctx.authenticated_credential = {id = "somecred", consumer_id = "user1"} local res = kong.log.serialize({ngx = ngx, kong = kong, }) assert.is_table(res) assert.same({id = "somecred", consumer_id = "user1"}, res.authenticated_entity) assert.is_nil(res.consumer) assert.is_nil(res.api) end) it("serializes the tries and failure information", function() ngx.ctx.balancer_data.tries = { { ip = "127.0.0.1", port = 1234, state = "next", code = 502 }, { ip = "127.0.0.1", port = 1234, state = "failed", code = nil }, { ip = "127.0.0.1", port = 1234 }, } local res = kong.log.serialize({ngx = ngx, kong = kong, }) assert.is_table(res) assert.same({ { code = 502, ip = '127.0.0.1', port = 1234, state = 'next', }, { ip = '127.0.0.1', port = 1234, state = 'failed', }, { ip = '127.0.0.1', port = 1234, }, }, res.tries) end) it("does not fail when the 'balancer_data' structure is missing", function() ngx.ctx.balancer_data = nil local res = kong.log.serialize({ngx = ngx, kong = kong, }) assert.is_table(res) assert.is_nil(res.tries) end) end) end) end)