2018-11-08 20:24:18 +01:00
|
|
|
--dofile"httptest.lua"
|
|
|
|
|
|
|
|
function assertEquals(a, b)
|
|
|
|
if a ~= b then
|
|
|
|
error(string.format("%q not equal to %q", tostring(a), tostring(b)), 2)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
-- Skipping test because my internet connection always resolves invalid DNS...
|
|
|
|
function SKIP_test_bad_dns()
|
|
|
|
do return end
|
|
|
|
|
|
|
|
local c = http.createConnection("http://nope.invalid")
|
|
|
|
local seenConnect, seenFinish
|
|
|
|
c:on("connect", function()
|
|
|
|
seenConnect = true
|
|
|
|
end)
|
|
|
|
c:on("complete", function(statusCode)
|
|
|
|
seenFinish = statusCode
|
|
|
|
end)
|
|
|
|
local status, connected = c:request()
|
|
|
|
assert(status < 0)
|
|
|
|
assertEquals(connected, false)
|
|
|
|
assertEquals(seenConnect, false)
|
|
|
|
assert(seenFinish < 0)
|
|
|
|
end
|
|
|
|
|
|
|
|
function test_simple()
|
|
|
|
local c = http.createConnection("http://httpbin.org/", { headers = { Connection = "close" } })
|
|
|
|
local seenConnect, seenHeaders, headersStatusCode
|
|
|
|
local dataBytes = 0
|
|
|
|
c:on("connect", function() seenConnect = true end)
|
|
|
|
c:on("headers", function(statusCode, headers)
|
|
|
|
headersStatusCode = statusCode
|
|
|
|
seenHeaders = headers
|
|
|
|
end)
|
|
|
|
c:on("data", function(statusCode, data)
|
|
|
|
assertEquals(statusCode, headersStatusCode)
|
|
|
|
dataBytes = dataBytes + #data
|
|
|
|
end)
|
|
|
|
|
|
|
|
local status, connected = c:request()
|
|
|
|
|
|
|
|
assertEquals(seenConnect, true)
|
|
|
|
assertEquals(headersStatusCode, 200)
|
|
|
|
assert(seenHeaders ~= nil)
|
|
|
|
assert(dataBytes > 0)
|
|
|
|
assertEquals(status, 200)
|
|
|
|
assertEquals(connected, false)
|
|
|
|
end
|
|
|
|
|
|
|
|
function test_keepalive()
|
|
|
|
local c = http.createConnection("http://httpbin.org/")
|
|
|
|
local seenConnect, seenHeaders, seenData, seenFinish
|
|
|
|
c:on("connect", function() seenConnect = true end)
|
|
|
|
c:on("headers", function(status, headers)
|
|
|
|
seenHeaders = headers
|
|
|
|
end)
|
|
|
|
c:on("data", function(status, data)
|
|
|
|
seenData = data
|
|
|
|
end)
|
|
|
|
c:on("complete", function(status)
|
|
|
|
seenFinish = status
|
|
|
|
end)
|
|
|
|
|
|
|
|
local status, connected = c:request()
|
|
|
|
assertEquals(seenConnect, true)
|
|
|
|
assertEquals(status, 200)
|
|
|
|
assertEquals(connected, true)
|
|
|
|
assert(seenHeaders)
|
|
|
|
assertEquals(seenFinish, 200)
|
|
|
|
|
|
|
|
c:seturl("http://httpbin.org/user-agent")
|
|
|
|
c:setheader("Connection", "close")
|
|
|
|
seenConnect = false
|
|
|
|
seenData = nil
|
|
|
|
seenHeaders = nil
|
|
|
|
seenFinish = nil
|
|
|
|
status, connected = c:request()
|
|
|
|
assertEquals(status, 200)
|
|
|
|
assertEquals(connected, false)
|
|
|
|
assertEquals(seenConnect, false) -- You don't get another connect callback
|
|
|
|
assert(seenHeaders) -- But you do get new headers
|
2018-11-08 21:14:15 +01:00
|
|
|
assertEquals(seenData, '{\n "user-agent": "NodeMCU (ESP32)"\n}\n')
|
2018-11-08 20:24:18 +01:00
|
|
|
assertEquals(seenFinish, 200)
|
|
|
|
c:close()
|
|
|
|
end
|
|
|
|
|
|
|
|
function test_oneshot_get()
|
|
|
|
local options = {
|
|
|
|
headers = {
|
|
|
|
["user-agent"] = "ESP32 HTTP Module User Agent test",
|
|
|
|
},
|
|
|
|
}
|
|
|
|
local code, data = http.get("http://httpbin.org/user-agent", options)
|
|
|
|
assertEquals(code, 200)
|
|
|
|
assertEquals(data, '{\n "user-agent": "ESP32 HTTP Module User Agent test"\n}\n')
|
|
|
|
|
|
|
|
-- And async version
|
|
|
|
print("test_oneshot_get async starting")
|
|
|
|
http.get("http://httpbin.org/user-agent", options, function(code, data)
|
|
|
|
assertEquals(code, 200)
|
|
|
|
assertEquals(data, '{\n "user-agent": "ESP32 HTTP Module User Agent test"\n}\n')
|
|
|
|
print("test_oneshot_get async completed")
|
|
|
|
end)
|
|
|
|
end
|
|
|
|
|
|
|
|
function test_404()
|
|
|
|
local status = http.get("http://httpbin.org/status/404")
|
|
|
|
assertEquals(status, 404)
|
|
|
|
end
|
|
|
|
|
|
|
|
function test_post()
|
|
|
|
local status, data = http.post("http://httpbin.org/post", nil, "hello=world&answer=42")
|
|
|
|
assertEquals(status, 200)
|
|
|
|
assert(data:match('"hello": "world"'))
|
|
|
|
assert(data:match('"answer": "42"'))
|
|
|
|
|
|
|
|
status, data = http.post("http://httpbin.org/post", {headers = {["Content-Type"] = "application/json"}}, '{"hello":"world"}')
|
|
|
|
assertEquals(status, 200)
|
|
|
|
assert(data:match('"hello": "world"'))
|
|
|
|
end
|
|
|
|
|
|
|
|
function test_redirects()
|
|
|
|
local status = http.createConnection("http://httpbin.org/redirect/3", { max_redirects = 0 }):request()
|
|
|
|
assertEquals(status, -28673) -- -ESP_ERR_HTTP_MAX_REDIRECT
|
|
|
|
|
|
|
|
status = http.createConnection("http://httpbin.org/redirect/3", { max_redirects = 2 }):request()
|
|
|
|
assertEquals(status, -28673)
|
|
|
|
|
|
|
|
status = http.createConnection("http://httpbin.org/redirect/3"):request()
|
|
|
|
assertEquals(status, 200)
|
|
|
|
end
|
|
|
|
|
|
|
|
-- Doesn't seem to work...
|
|
|
|
function SKIP_test_timeout()
|
|
|
|
local status = http.createConnection("http://httpbin.org/delay/10", { timeout = 2000 }):request()
|
|
|
|
assertEquals(status, -1)
|
|
|
|
end
|
|
|
|
|
|
|
|
local tests = {}
|
|
|
|
for k, v in pairs(_G) do
|
|
|
|
if type(v) == "function" and k:match("^test_") then
|
|
|
|
table.insert(tests, k)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
table.sort(tests)
|
|
|
|
for _, t in ipairs(tests) do
|
|
|
|
print(t)
|
|
|
|
_G[t]()
|
|
|
|
end
|