| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259 | 
							- local sent = {}
 
- local from = "diego@localhost"
 
- local server = "localhost"
 
- local rcpt = "luasocket@localhost"
 
- local files = {
 
-     "/var/spool/mail/luasocket",
 
-     "/var/spool/mail/luasock1",
 
-     "/var/spool/mail/luasock2",
 
-     "/var/spool/mail/luasock3",
 
- }
 
- local t = socket.time()
 
- local err
 
- dofile("mbox.lua")
 
- local parse = mbox.parse
 
- dofile("testsupport.lua")
 
- local total = function()
 
-     local t = 0
 
-     for i = 1, #sent do
 
-         t = t + sent[i].count
 
-     end
 
-     return t
 
- end
 
- local similar = function(s1, s2)
 
-     return 
 
-     string.lower(string.gsub(s1, "%s", "")) == 
 
-     string.lower(string.gsub(s2, "%s", ""))
 
- end
 
- local fail = function(s)
 
-     s = s or "failed!"
 
-     print(s)
 
-     os.exit()
 
- end
 
- local readfile = function(name)
 
-     local f = io.open(name, "r")
 
-     if not f then 
 
-         fail("unable to open file!")
 
-         return nil 
 
-     end
 
-     local s = f:read("*a")
 
-     f:close()
 
-     return s
 
- end
 
- local empty = function()
 
-     for i,v in ipairs(files) do
 
-         local f = io.open(v, "w")
 
-         if not f then 
 
-             fail("unable to open file!")
 
-         end
 
-         f:close()
 
-     end
 
- end
 
- local get = function()
 
-     local s = ""
 
-     for i,v in ipairs(files) do
 
-         s = s .. "\n" .. readfile(v)
 
-     end
 
-     return s
 
- end
 
- local check_headers = function(sent, got)
 
-     sent = sent or {}
 
-     got = got or {}
 
-     for i,v in pairs(sent) do
 
-         if not similar(v, got[i]) then fail("header " .. v .. "failed!") end
 
-     end
 
- end
 
- local check_body = function(sent, got)
 
-     sent = sent or ""
 
-     got = got or ""
 
-     if not similar(sent, got) then fail("bodies differ!") end
 
- end
 
- local check = function(sent, m)
 
-     io.write("checking ", m.headers.title, ": ")
 
-     for i = 1, #sent do
 
-         local s = sent[i]
 
-         if s.title == m.headers.title and s.count > 0 then
 
-             check_headers(s.headers, m.headers)
 
-             check_body(s.body, m.body)
 
-             s.count = s.count - 1
 
-             print("ok")
 
-             return
 
-         end
 
-     end
 
-     fail("not found")
 
- end
 
- local insert = function(sent, message)
 
-     if type(message.rcpt) == "table" then
 
-         message.count = #message.rcpt
 
-     else message.count = 1 end
 
-     message.headers = message.headers or {}
 
-     message.headers.title = message.title
 
-     table.insert(sent, message)
 
- end
 
- local mark = function()
 
-     local time = socket.time()
 
-     return { time = time }
 
- end
 
- local wait = function(sentinel, n)
 
-     local to
 
-     io.write("waiting for ", n, " messages: ")
 
-     while 1 do
 
-         local mbox = parse(get())
 
-         if n == #mbox then break end
 
-         if socket.time() - sentinel.time > 50 then 
 
-             to = 1 
 
-             break
 
-         end
 
-         socket.sleep(1)
 
-         io.write(".")
 
-         io.stdout:flush()
 
-     end
 
-     if to then fail("timeout")
 
-     else print("ok") end
 
- end
 
- local stuffed_body = [[
 
- This message body needs to be
 
- stuffed because it has a dot
 
- .
 
- by itself on a line. 
 
- Otherwise the mailer would
 
- think that the dot
 
- .
 
- is the end of the message
 
- and the remaining text would cause
 
- a lot of trouble.
 
- ]]
 
- insert(sent, {
 
-     from = from,
 
-     rcpt = {
 
-         "luasocket@localhost",
 
-         "[email protected]",
 
-         "[email protected]"
 
-     },
 
-     body = "multiple rcpt body",
 
-     title = "multiple rcpt",
 
- })
 
- insert(sent, {
 
-     from = from,
 
-     rcpt = {
 
-         "luasock2@localhost",
 
-         "luasock3",
 
-         "luasock1"
 
-     },
 
-     headers = {
 
-         header1 = "header 1",
 
-         header2 = "header 2",
 
-         header3 = "header 3",
 
-         header4 = "header 4",
 
-         header5 = "header 5",
 
-         header6 = "header 6",
 
-     },
 
-     body = stuffed_body,
 
-     title = "complex message",
 
- })
 
- insert(sent, {
 
-     from = from,
 
-     rcpt = rcpt,
 
-     server = server,
 
-     body = "simple message body",
 
-     title = "simple message"
 
- })
 
- insert(sent, {
 
-     from = from,
 
-     rcpt = rcpt,
 
-     server = server,
 
-     body = stuffed_body,
 
-     title = "stuffed message body"
 
- })
 
- insert(sent, {
 
-     from = from,
 
-     rcpt = rcpt,
 
-     headers = {
 
-         header1 = "header 1",
 
-         header2 = "header 2",
 
-         header3 = "header 3",
 
-         header4 = "header 4",
 
-         header5 = "header 5",
 
-         header6 = "header 6",
 
-     },
 
-     title = "multiple headers"
 
- })
 
- insert(sent, {
 
-     from = from,
 
-     rcpt = rcpt,
 
-     title = "minimum message"
 
- })
 
- io.write("testing host not found: ")
 
- local c, e = socket.connect("wrong.host", 25)
 
- local ret, err = socket.smtp.mail{
 
-     from = from,
 
-     rcpt = rcpt,
 
-     server = "wrong.host"
 
- }
 
- if ret or e ~= err then fail("wrong error message")
 
- else print("ok") end
 
- io.write("testing invalid from: ")
 
- local ret, err = socket.smtp.mail{
 
-     from = ' " " (( _ * ', 
 
-     rcpt = rcpt,
 
- }
 
- if ret or not err then fail("wrong error message")
 
- else print(err) end
 
- io.write("testing no rcpt: ")
 
- local ret, err = socket.smtp.mail{
 
-     from = from, 
 
- }
 
- if ret or not err then fail("wrong error message")
 
- else print(err) end
 
- io.write("clearing mailbox: ")
 
- empty()
 
- print("ok")
 
- io.write("sending messages: ")
 
- for i = 1, #sent do
 
-     ret, err = socket.smtp.mail(sent[i])
 
-     if not ret then fail(err) end
 
-     io.write("+")
 
-     io.stdout:flush()
 
- end
 
- print("ok")
 
- wait(mark(), total())
 
- io.write("parsing mailbox: ")
 
- local mbox = parse(get())
 
- print(#mbox .. " messages found!")
 
- for i = 1, #mbox do
 
-     check(sent, mbox[i])
 
- end
 
- print("passed all tests")
 
- print(string.format("done in %.2fs", socket.time() - t))
 
 
  |