summaryrefslogtreecommitdiff
path: root/test/net/smtp/test_starttls.rb
diff options
context:
space:
mode:
Diffstat (limited to 'test/net/smtp/test_starttls.rb')
-rw-r--r--test/net/smtp/test_starttls.rb121
1 files changed, 121 insertions, 0 deletions
diff --git a/test/net/smtp/test_starttls.rb b/test/net/smtp/test_starttls.rb
new file mode 100644
index 0000000000..98835c952a
--- /dev/null
+++ b/test/net/smtp/test_starttls.rb
@@ -0,0 +1,121 @@
+require 'net/smtp'
+require 'test/unit'
+
+module Net
+ class TestStarttls < Test::Unit::TestCase
+ class MySMTP < SMTP
+ def initialize(socket)
+ @fake_socket = socket
+ super("smtp.example.com")
+ end
+
+ def tcp_socket(*)
+ @fake_socket
+ end
+
+ def tlsconnect(*)
+ @fake_socket
+ end
+ end
+
+ def teardown
+ @server_thread&.exit
+ @server_socket&.close
+ @client_socket&.close
+ end
+
+ def start_smtpd(starttls)
+ @server_socket, @client_socket = UNIXSocket.pair
+ @starttls_executed = false
+ @server_thread = Thread.new(@server_socket) do |s|
+ s.puts "220 fakeserver\r\n"
+ while cmd = s.gets&.chomp
+ case cmd
+ when /\AEHLO /
+ s.puts "250-fakeserver\r\n"
+ s.puts "250-STARTTLS\r\n" if starttls
+ s.puts "250 8BITMIME\r\n"
+ when /\ASTARTTLS/
+ @starttls_executed = true
+ s.puts "220 2.0.0 Ready to start TLS\r\n"
+ else
+ raise "unsupported command: #{cmd}"
+ end
+ end
+ end
+ @client_socket
+ end
+
+ def test_default_with_starttls_capable
+ smtp = MySMTP.new(start_smtpd(true))
+ smtp.start
+ assert(@starttls_executed)
+ end
+
+ def test_default_without_starttls_capable
+ smtp = MySMTP.new(start_smtpd(false))
+ smtp.start
+ assert(!@starttls_executed)
+ end
+
+ def test_enable_starttls_with_starttls_capable
+ smtp = MySMTP.new(start_smtpd(true))
+ smtp.enable_starttls
+ smtp.start
+ assert(@starttls_executed)
+ end
+
+ def test_enable_starttls_without_starttls_capable
+ smtp = MySMTP.new(start_smtpd(false))
+ smtp.enable_starttls
+ err = assert_raise(Net::SMTPUnsupportedCommand) { smtp.start }
+ assert_equal("STARTTLS is not supported on this server", err.message)
+ end
+
+ def test_enable_starttls_auto_with_starttls_capable
+ smtp = MySMTP.new(start_smtpd(true))
+ smtp.enable_starttls_auto
+ smtp.start
+ assert(@starttls_executed)
+ end
+
+ def test_tls_with_starttls_capable
+ smtp = MySMTP.new(start_smtpd(true))
+ smtp.enable_tls
+ smtp.start
+ assert(!@starttls_executed)
+ end
+
+ def test_tls_without_starttls_capable
+ smtp = MySMTP.new(start_smtpd(false))
+ smtp.enable_tls
+ end
+
+ def test_disable_starttls
+ smtp = MySMTP.new(start_smtpd(true))
+ smtp.disable_starttls
+ smtp.start
+ assert(!@starttls_executed)
+ end
+
+ def test_enable_tls_and_enable_starttls
+ smtp = MySMTP.new(start_smtpd(true))
+ smtp.enable_tls
+ err = assert_raise(ArgumentError) { smtp.enable_starttls }
+ assert_equal("SMTPS and STARTTLS is exclusive", err.message)
+ end
+
+ def test_enable_tls_and_enable_starttls_auto
+ smtp = MySMTP.new(start_smtpd(true))
+ smtp.enable_tls
+ err = assert_raise(ArgumentError) { smtp.enable_starttls_auto }
+ assert_equal("SMTPS and STARTTLS is exclusive", err.message)
+ end
+
+ def test_enable_starttls_and_enable_starttls_auto
+ smtp = MySMTP.new(start_smtpd(true))
+ smtp.enable_starttls
+ assert_nothing_raised { smtp.enable_starttls_auto }
+ end
+ end
+end