kong/spec/02-integration/05-proxy/27-unbuffered_spec.lua (221 lines of code) (raw):
local helpers = require "spec.helpers"
local random = require "resty.random"
local rstring = require "resty.string"
-- HTTP 1.1 Chunked Body (5 MB)
local function body()
local chunk = "2000" .."\r\n" .. rstring.to_hex(random.bytes(4096)) .. "\r\n"
local i = 0
return function()
i = i + 1
if i == 641 then
return "0\r\n\r\n"
end
if i == 642 then
return nil
end
return chunk
end
end
for _, strategy in helpers.each_strategy() do
describe("HTTP 1.1 Chunked [#" .. strategy .. "]", function()
local proxy_client
local warmup_client
lazy_setup(function()
local bp = helpers.get_db_utils(strategy, {
"routes",
"services"
})
local service = bp.services:insert()
bp.routes:insert({
protocols = { "http", "https" },
paths = { "/buffered" },
request_buffering = true,
response_buffering = true,
service = service,
})
bp.routes:insert({
protocols = { "http", "https" },
paths = { "/unbuffered" },
request_buffering = false,
response_buffering = false,
service = service,
})
bp.routes:insert({
protocols = { "http", "https" },
paths = { "/unbuffered-request" },
request_buffering = false,
response_buffering = true,
service = service,
})
bp.routes:insert({
protocols = { "http", "https" },
paths = { "/unbuffered-response" },
request_buffering = true,
response_buffering = false,
service = service,
})
assert(helpers.start_kong {
database = strategy,
nginx_conf = "spec/fixtures/custom_nginx.template",
})
end)
lazy_teardown(function()
helpers.stop_kong()
end)
before_each(function()
warmup_client = helpers.proxy_client()
proxy_client = helpers.proxy_client()
end)
after_each(function ()
warmup_client:close()
proxy_client:close()
end)
describe("request latency", function()
local buffered_latency
local unbuffered_latency
local unbuffered_request_latency
local unbuffered_response_latency
it("is calculated for buffered", function()
warmup_client:post("/buffered/post", { body = "warmup" })
local res = proxy_client:send({
method = "POST",
path = "/buffered/post",
body = body(),
headers = {
["Transfer-Encoding"] = "chunked",
["Content-Type"] = "application/octet-stream",
}
})
assert.equal(200, res.status)
buffered_latency = tonumber(res.headers["X-Kong-Proxy-Latency"])
assert.is_number(buffered_latency)
end)
it("is calculated for unbuffered", function()
warmup_client:post("/unbuffered/post", { body = "warmup" })
local res = proxy_client:send({
method = "POST",
path = "/unbuffered/post",
body = body(),
headers = {
["Transfer-Encoding"] = "chunked",
["Content-Type"] = "application/octet-stream",
}
})
assert.equal(200, res.status)
unbuffered_latency = tonumber(res.headers["X-Kong-Proxy-Latency"])
assert.is_number(unbuffered_latency)
end)
it("is calculated for unbuffered request", function()
warmup_client:post("/unbuffered-request/post", { body = "warmup" })
local res = proxy_client:send({
method = "POST",
path = "/unbuffered-request/post",
body = body(),
headers = {
["Transfer-Encoding"] = "chunked",
["Content-Type"] = "application/octet-stream",
}
})
assert.equal(200, res.status)
unbuffered_request_latency = tonumber(res.headers["X-Kong-Proxy-Latency"])
assert.is_number(unbuffered_request_latency)
end)
it("is calculated for unbuffered response", function()
warmup_client:post("/unbuffered-response/post", { body = "warmup" })
local res = proxy_client:send({
method = "POST",
path = "/unbuffered-response/post",
body = body(),
headers = {
["Transfer-Encoding"] = "chunked",
["Content-Type"] = "application/octet-stream",
}
})
assert.equal(200, res.status)
unbuffered_response_latency = tonumber(res.headers["X-Kong-Proxy-Latency"])
assert.is_number(unbuffered_response_latency)
end)
it("is greater for buffered than unbuffered", function()
assert.equal(true, buffered_latency > unbuffered_latency)
end)
it("is greater for buffered than unbuffered request", function()
assert.equal(true, buffered_latency > unbuffered_request_latency)
end)
it("is greater for unbuffered response than unbuffered", function()
assert.equal(true, unbuffered_response_latency > unbuffered_latency)
end)
it("is greater for unbuffered response than unbuffered request", function()
assert.equal(true, unbuffered_response_latency > unbuffered_request_latency)
end)
end)
describe("number of response chunks", function()
local buffered_chunks = 0
local unbuffered_chunks = 0
local unbuffered_request_chunks = 0
local unbuffered_response_chunks = 0
it("is calculated for buffered", function()
warmup_client:get("/buffered/stream/1")
local res = proxy_client:get("/buffered/stream/1000")
assert.equal(200, res.status)
local reader = res.body_reader
repeat
local chunk, err = reader(8192 * 640)
assert.equal(nil, err)
if chunk then
buffered_chunks = buffered_chunks + 1
end
until not chunk
end)
it("is calculated for unbuffered", function()
warmup_client:get("/unbuffered/stream/1")
local res = proxy_client:get("/unbuffered/stream/1000")
assert.equal(200, res.status)
local reader = res.body_reader
repeat
local chunk, err = reader(8192 * 640)
assert.equal(nil, err)
if chunk then
unbuffered_chunks = unbuffered_chunks + 1
end
until not chunk
end)
it("is calculated for unbuffered request", function()
warmup_client:get("/unbuffered-request/stream/1")
local res = proxy_client:get("/unbuffered-request/stream/1000")
assert.equal(200, res.status)
local reader = res.body_reader
repeat
local chunk, err = reader(8192 * 640)
assert.equal(nil, err)
if chunk then
unbuffered_request_chunks = unbuffered_request_chunks + 1
end
until not chunk
end)
it("is calculated for unbuffered response", function()
warmup_client:get("/unbuffered-response/stream/1")
local res = proxy_client:get("/unbuffered-response/stream/1000")
assert.equal(200, res.status)
local reader = res.body_reader
repeat
local chunk, err = reader(8192 * 640)
assert.equal(nil, err)
if chunk then
unbuffered_response_chunks = unbuffered_response_chunks + 1
end
until not chunk
end)
it("is greater for unbuffered than buffered", function()
assert.equal(true, unbuffered_chunks > buffered_chunks)
end)
it("is greater for unbuffered than unbuffered request", function()
assert.equal(true, unbuffered_chunks > unbuffered_request_chunks)
end)
it("is greater for unbuffered response than buffered", function()
assert.equal(true, unbuffered_response_chunks > buffered_chunks)
end)
it("is greater for unbuffered response than unbuffered request", function()
assert.equal(true, unbuffered_response_chunks > unbuffered_request_chunks)
end)
end)
end)
end