mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
79fdbe0519
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@16512 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
195 lines
4.6 KiB
Ruby
195 lines
4.6 KiB
Ruby
require "net/imap"
|
|
require "test/unit"
|
|
|
|
class IMAPTest < Test::Unit::TestCase
|
|
CA_FILE = File.expand_path("cacert.pem", File.dirname(__FILE__))
|
|
SERVER_KEY = File.expand_path("server.key", File.dirname(__FILE__))
|
|
SERVER_CERT = File.expand_path("server.crt", File.dirname(__FILE__))
|
|
|
|
def test_encode_utf7
|
|
utf8 = "\357\274\241\357\274\242\357\274\243".force_encoding("UTF-8")
|
|
s = Net::IMAP.encode_utf7(utf8)
|
|
assert_equal("&,yH,Iv8j-".force_encoding("UTF-8"), s)
|
|
end
|
|
|
|
def test_decode_utf7
|
|
s = Net::IMAP.decode_utf7("&,yH,Iv8j-")
|
|
utf8 = "\357\274\241\357\274\242\357\274\243".force_encoding("UTF-8")
|
|
assert_equal(utf8, s)
|
|
end
|
|
|
|
def test_imaps_unknown_ca
|
|
if defined?(OpenSSL)
|
|
assert_raise(OpenSSL::SSL::SSLError) do
|
|
imaps_test do |port|
|
|
Net::IMAP.new("localhost",
|
|
:port => port,
|
|
:ssl => true)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
def test_imaps_with_ca_file
|
|
if defined?(OpenSSL)
|
|
assert_nothing_raised do
|
|
imaps_test do |port|
|
|
Net::IMAP.new("localhost",
|
|
:port => port,
|
|
:ssl => { :ca_file => CA_FILE })
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
def test_imaps_verify_none
|
|
if defined?(OpenSSL)
|
|
assert_nothing_raised do
|
|
imaps_test do |port|
|
|
Net::IMAP.new("localhost",
|
|
:port => port,
|
|
:ssl => { :verify_mode => OpenSSL::SSL::VERIFY_NONE })
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
def test_imaps_post_connection_check
|
|
if defined?(OpenSSL)
|
|
assert_raise(OpenSSL::SSL::SSLError) do
|
|
imaps_test do |port|
|
|
Net::IMAP.new("127.0.0.1",
|
|
:port => port,
|
|
:ssl => { :ca_file => CA_FILE })
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
def test_starttls
|
|
imap = nil
|
|
if defined?(OpenSSL)
|
|
starttls_test do |port|
|
|
imap = Net::IMAP.new("localhost", :port => port)
|
|
imap.starttls(:ca_file => CA_FILE)
|
|
imap
|
|
end
|
|
end
|
|
ensure
|
|
if imap && !imap.disconnected?
|
|
imap.disconnect
|
|
end
|
|
end
|
|
|
|
def test_unexpected_eof
|
|
server = TCPServer.new(0)
|
|
port = server.addr[1]
|
|
Thread.start do
|
|
begin
|
|
sock = server.accept
|
|
begin
|
|
sock.print("* OK test server\r\n")
|
|
sock.gets
|
|
# sock.print("* BYE terminating connection\r\n")
|
|
# sock.print("RUBY0001 OK LOGOUT completed\r\n")
|
|
ensure
|
|
sock.close
|
|
end
|
|
rescue
|
|
end
|
|
end
|
|
begin
|
|
begin
|
|
imap = Net::IMAP.new("localhost", :port => port)
|
|
assert_raise(EOFError) do
|
|
imap.logout
|
|
end
|
|
ensure
|
|
imap.disconnect if imap
|
|
end
|
|
ensure
|
|
server.close
|
|
end
|
|
end
|
|
|
|
private
|
|
|
|
def imaps_test
|
|
server = TCPServer.new(0)
|
|
port = server.addr[1]
|
|
ctx = OpenSSL::SSL::SSLContext.new
|
|
ctx.ca_file = CA_FILE
|
|
ctx.key = File.open(SERVER_KEY) { |f|
|
|
OpenSSL::PKey::RSA.new(f)
|
|
}
|
|
ctx.cert = File.open(SERVER_CERT) { |f|
|
|
OpenSSL::X509::Certificate.new(f)
|
|
}
|
|
ssl_server = OpenSSL::SSL::SSLServer.new(server, ctx)
|
|
Thread.start do
|
|
begin
|
|
sock = ssl_server.accept
|
|
begin
|
|
sock.print("* OK test server\r\n")
|
|
sock.gets
|
|
sock.print("* BYE terminating connection\r\n")
|
|
sock.print("RUBY0001 OK LOGOUT completed\r\n")
|
|
ensure
|
|
sock.close
|
|
end
|
|
rescue
|
|
end
|
|
end
|
|
begin
|
|
begin
|
|
imap = yield(port)
|
|
imap.logout
|
|
ensure
|
|
imap.disconnect if imap
|
|
end
|
|
ensure
|
|
ssl_server.close
|
|
end
|
|
end
|
|
|
|
def starttls_test
|
|
server = TCPServer.new(0)
|
|
port = server.addr[1]
|
|
Thread.start do
|
|
begin
|
|
sock = server.accept
|
|
sock.print("* OK test server\r\n")
|
|
sock.gets
|
|
sock.print("RUBY0001 OK completed\r\n")
|
|
ctx = OpenSSL::SSL::SSLContext.new
|
|
ctx.ca_file = CA_FILE
|
|
ctx.key = File.open(SERVER_KEY) { |f|
|
|
OpenSSL::PKey::RSA.new(f)
|
|
}
|
|
ctx.cert = File.open(SERVER_CERT) { |f|
|
|
OpenSSL::X509::Certificate.new(f)
|
|
}
|
|
sock = OpenSSL::SSL::SSLSocket.new(sock, ctx)
|
|
begin
|
|
sock.accept
|
|
sock.gets
|
|
sock.print("* BYE terminating connection\r\n")
|
|
sock.print("RUBY0002 OK LOGOUT completed\r\n")
|
|
ensure
|
|
sock.close
|
|
end
|
|
rescue
|
|
end
|
|
end
|
|
begin
|
|
begin
|
|
imap = yield(port)
|
|
imap.logout
|
|
ensure
|
|
imap.disconnect if imap
|
|
end
|
|
ensure
|
|
server.close
|
|
end
|
|
end
|
|
end
|