aboutsummaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
Diffstat (limited to 'test')
-rw-r--r--test/httptest.lua16
-rw-r--r--test/mimetest.lua236
2 files changed, 244 insertions, 8 deletions
diff --git a/test/httptest.lua b/test/httptest.lua
index 3d0db87..dc90741 100644
--- a/test/httptest.lua
+++ b/test/httptest.lua
@@ -5,14 +5,14 @@
5-- needs "AllowOverride AuthConfig" on /home/c/diego/tec/luasocket/test/auth 5-- needs "AllowOverride AuthConfig" on /home/c/diego/tec/luasocket/test/auth
6dofile("noglobals.lua") 6dofile("noglobals.lua")
7 7
8local host, proxyh, proxyp, request, response 8local host, proxyhost, proxyport, request, response
9local ignore, expect, index, prefix, cgiprefix 9local ignore, expect, index, prefix, cgiprefix
10 10
11local t = socket.time() 11local t = socket.time()
12 12
13host = host or "diego.princeton.edu" 13host = host or "diego.princeton.edu"
14proxyh = proxyh or "localhost" 14proxyhost = proxyhost or "localhost"
15proxyp = proxyp or 3128 15proxyport = proxyport or 3128
16prefix = prefix or "/luasocket-test" 16prefix = prefix or "/luasocket-test"
17cgiprefix = cgiprefix or "/luasocket-test-cgi" 17cgiprefix = cgiprefix or "/luasocket-test-cgi"
18 18
@@ -129,8 +129,8 @@ request = {
129 method = "POST", 129 method = "POST",
130 body = index, 130 body = index,
131 headers = { ["content-length"] = string.len(index) }, 131 headers = { ["content-length"] = string.len(index) },
132 port = proxyp, 132 proxyport = proxyport,
133 host = proxyh 133 proxyhost = proxyhost
134} 134}
135expect = { 135expect = {
136 body = index, 136 body = index,
@@ -170,8 +170,8 @@ check_request(request, expect, ignore)
170io.write("testing proxy with redirection: ") 170io.write("testing proxy with redirection: ")
171request = { 171request = {
172 url = "http://" .. host .. prefix, 172 url = "http://" .. host .. prefix,
173 host = proxyh, 173 proxyhost = proxyhost,
174 port = proxyp 174 proxyport = proxyport
175} 175}
176expect = { 176expect = {
177 body = index, 177 body = index,
@@ -267,7 +267,7 @@ io.write("testing manual basic auth: ")
267request = { 267request = {
268 url = "http://" .. host .. prefix .. "/auth/index.html", 268 url = "http://" .. host .. prefix .. "/auth/index.html",
269 headers = { 269 headers = {
270 authorization = "Basic " .. (socket.code.b64("luasocket:password")) 270 authorization = "Basic " .. (socket.mime.b64("luasocket:password"))
271 } 271 }
272} 272}
273expect = { 273expect = {
diff --git a/test/mimetest.lua b/test/mimetest.lua
new file mode 100644
index 0000000..5485db1
--- /dev/null
+++ b/test/mimetest.lua
@@ -0,0 +1,236 @@
1dofile("noglobals.lua")
2
3local qptest = "qptest.bin"
4local eqptest = "qptest.bin2"
5local dqptest = "qptest.bin3"
6
7local b64test = "luasocket"
8local eb64test = "b64test.bin"
9local db64test = "b64test.bin2"
10
11-- from Machado de Assis, "A Mão e a Rosa"
12local mao = [[
13 Cursavam estes dois moços a academia de S. Paulo, estando
14 Luís Alves no quarto ano e Estêvão no terceiro.
15 Conheceram-se na academia, e ficaram amigos íntimos, tanto
16 quanto podiam sê-lo dois espíritos diferentes, ou talvez por
17 isso mesmo que o eram. Estêvão, dotado de extrema
18 sensibilidade, e não menor fraqueza de ânimo, afetuoso e
19 bom, não daquela bondade varonil, que é apanágio de uma alma
20 forte, mas dessa outra bondade mole e de cera, que vai à
21 mercê de todas as circunstâncias, tinha, além de tudo isso,
22 o infortúnio de trazer ainda sobre o nariz os óculos
23 cor-de-rosa de suas virginais ilusões. Luís Alves via bem
24 com os olhos da cara. Não era mau rapaz, mas tinha o seu
25 grão de egoísmo, e se não era incapaz de afeições, sabia
26 regê-las, moderá-las, e sobretudo guiá-las ao seu próprio
27 interesse. Entre estes dois homens travara-se amizade
28 íntima, nascida para um na simpatia, para outro no costume.
29 Eram eles os naturais confidentes um do outro, com a
30 diferença que Luís Alves dava menos do que recebia, e, ainda
31 assim, nem tudo o que dava exprimia grande confiança.
32]]
33
34local fail = function(s)
35 s = s or "failed"
36 assert(nil, s)
37end
38
39local readfile = function(name)
40 local f = io.open(name, "r")
41 if not f then return nil end
42 local s = f:read("*a")
43 f:close()
44 return s
45end
46
47local function transform(input, output, filter)
48 local fi, err = io.open(input, "rb")
49 if not fi then fail(err) end
50 local fo, err = io.open(output, "wb")
51 if not fo then fail(err) end
52 while 1 do
53 local chunk = fi:read(math.random(0, 256))
54 fo:write(filter(chunk))
55 if not chunk then break end
56 end
57 fi:close()
58 fo:close()
59end
60
61local function compare(input, output)
62 local original = readfile(input)
63 local recovered = readfile(output)
64 if original ~= recovered then fail("recovering failed")
65 else print("ok") end
66end
67
68local function encode_qptest(mode)
69 local encode = socket.mime.qprint.encode(mode)
70 local split = socket.mime.qprint.split()
71 local chain = socket.mime.chain(encode, split)
72 transform(qptest, eqptest, chain)
73end
74
75local function compare_qptest()
76 compare(qptest, dqptest)
77end
78
79local function decode_qptest()
80 local decode = socket.mime.qprint.decode()
81 transform(eqptest, dqptest, decode)
82end
83
84local function create_qptest()
85 local f, err = io.open(qptest, "wb")
86 if not f then fail(err) end
87 -- try all characters
88 for i = 0, 255 do
89 f:write(string.char(i))
90 end
91 -- try all characters and different line sizes
92 for i = 0, 255 do
93 for j = 0, i do
94 f:write(string.char(i))
95 end
96 f:write("\r\n")
97 end
98 -- test latin text
99 f:write(mao)
100 -- force soft line breaks and treatment of space/tab in end of line
101 local tab
102 f:write(string.gsub(mao, "(%s)", function(c)
103 if tab then
104 tab = nil
105 return "\t"
106 else
107 tab = 1
108 return " "
109 end
110 end))
111 -- test crazy end of line conventions
112 local eol = { "\r\n", "\r", "\n", "\n\r" }
113 local which = 0
114 f:write(string.gsub(mao, "(\n)", function(c)
115 which = which + 1
116 if which > 4 then which = 1 end
117 return eol[which]
118 end))
119 for i = 1, 4 do
120 for j = 1, 4 do
121 f:write(eol[i])
122 f:write(eol[j])
123 end
124 end
125 -- try long spaced and tabbed lines
126 f:write("\r\n")
127 for i = 0, 255 do
128 f:write(string.char(9))
129 end
130 f:write("\r\n")
131 for i = 0, 255 do
132 f:write(' ')
133 end
134 f:write("\r\n")
135 for i = 0, 255 do
136 f:write(string.char(9),' ')
137 end
138 f:write("\r\n")
139 for i = 0, 255 do
140 f:write(' ',string.char(32))
141 end
142 f:write("\r\n")
143
144 f:close()
145end
146
147local function cleanup_qptest()
148 os.remove(qptest)
149 os.remove(eqptest)
150 os.remove(dqptest)
151end
152
153local function encode_b64test()
154 local e1 = socket.mime.base64.encode()
155 local e2 = socket.mime.base64.encode()
156 local e3 = socket.mime.base64.encode()
157 local e4 = socket.mime.base64.encode()
158 local sp4 = socket.mime.split()
159 local sp3 = socket.mime.split(59)
160 local sp2 = socket.mime.split(30)
161 local sp1 = socket.mime.split(27)
162 local chain = socket.mime.chain(e1, sp1, e2, sp2, e3, sp3, e4, sp4)
163 transform(b64test, eb64test, chain)
164end
165
166local function decode_b64test()
167 local d1 = socket.mime.base64.decode()
168 local d2 = socket.mime.base64.decode()
169 local d3 = socket.mime.base64.decode()
170 local d4 = socket.mime.base64.decode()
171 local chain = socket.mime.chain(d1, d2, d3, d4)
172 transform(eb64test, db64test, chain)
173end
174
175local function cleanup_b64test()
176 os.remove(eb64test)
177 os.remove(db64test)
178end
179
180local function compare_b64test()
181 compare(b64test, db64test)
182end
183
184local function padcheck(original, encoded)
185 local e = (socket.mime.b64(original))
186 local d = (socket.mime.unb64(encoded))
187 if e ~= encoded then fail("encoding failed") end
188 if d ~= original then fail("decoding failed") end
189end
190
191local function chunkcheck(original, encoded)
192 local len = string.len(original)
193 for i = 0, len do
194 local a = string.sub(original, 1, i)
195 local b = string.sub(original, i+1)
196 local e, r = socket.mime.b64(a, b)
197 local f = (socket.mime.b64(r))
198 if (e .. f ~= encoded) then fail(e .. f) end
199 end
200end
201
202local function padding_b64test()
203 padcheck("a", "YQ==")
204 padcheck("ab", "YWI=")
205 padcheck("abc", "YWJj")
206 padcheck("abcd", "YWJjZA==")
207 padcheck("abcde", "YWJjZGU=")
208 padcheck("abcdef", "YWJjZGVm")
209 padcheck("abcdefg", "YWJjZGVmZw==")
210 padcheck("abcdefgh", "YWJjZGVmZ2g=")
211 padcheck("abcdefghi", "YWJjZGVmZ2hp")
212 padcheck("abcdefghij", "YWJjZGVmZ2hpag==")
213 chunkcheck("abcdefgh", "YWJjZGVmZ2g=")
214 chunkcheck("abcdefghi", "YWJjZGVmZ2hp")
215 chunkcheck("abcdefghij", "YWJjZGVmZ2hpag==")
216 print("ok")
217end
218
219local t = socket.time()
220
221create_qptest()
222encode_qptest()
223decode_qptest()
224compare_qptest()
225encode_qptest("binary")
226decode_qptest()
227compare_qptest()
228cleanup_qptest()
229
230encode_b64test()
231decode_b64test()
232compare_b64test()
233cleanup_b64test()
234padding_b64test()
235
236print(string.format("done in %.2fs", socket.time() - t))