ruby-changes:39305
From: tenderlove <ko1@a...>
Date: Sun, 26 Jul 2015 10:09:46 +0900 (JST)
Subject: [ruby-changes:39305] tenderlove:r51386 (trunk): * test/openssl/test_ssl.rb (class OpenSSL): add test coverage around
tenderlove 2015-07-26 10:09:31 +0900 (Sun, 26 Jul 2015) New Revision: 51386 http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=revision&revision=51386 Log: * test/openssl/test_ssl.rb (class OpenSSL): add test coverage around OpenSSL::SSL::SSLContext#servername_cb Modified files: trunk/ChangeLog trunk/test/openssl/test_ssl.rb Index: ChangeLog =================================================================== --- ChangeLog (revision 51385) +++ ChangeLog (revision 51386) @@ -1,3 +1,8 @@ https://github.com/ruby/ruby/blob/trunk/ChangeLog#L1 +Sun Jul 26 10:07:26 2015 Aaron Patterson <tenderlove@r...> + + * test/openssl/test_ssl.rb (class OpenSSL): add test coverage around + OpenSSL::SSL::SSLContext#servername_cb + Sun Jul 26 09:10:32 2015 SHIBATA Hiroshi <hsbt@r...> * gems/bundled_gems: update latest version of bundled power-assert. Index: test/openssl/test_ssl.rb =================================================================== --- test/openssl/test_ssl.rb (revision 51385) +++ test/openssl/test_ssl.rb (revision 51386) @@ -607,6 +607,135 @@ class OpenSSL::TestSSL < OpenSSL::SSLTes https://github.com/ruby/ruby/blob/trunk/test/openssl/test_ssl.rb#L607 cert end + def test_servername_cb_raises_an_exception_on_unknown_objects + hostname = 'example.org' + + ctx2 = OpenSSL::SSL::SSLContext.new + ctx2.ciphers = "DH" + ctx2.servername_cb = lambda { |args| Object.new } + + sock1, sock2 = UNIXSocket.pair + + s2 = OpenSSL::SSL::SSLSocket.new(sock2, ctx2) + + ctx1 = OpenSSL::SSL::SSLContext.new + ctx1.ciphers = "DH" + + s1 = OpenSSL::SSL::SSLSocket.new(sock1, ctx1) + s1.hostname = hostname + t = Thread.new { + assert_raises(OpenSSL::SSL::SSLError) do + s1.connect + end + } + + assert_raises(ArgumentError) do + s2.accept + end + + assert t.join + ensure + sock1.close if sock1 + sock2.close if sock2 + end + + def test_servername_cb_calls_setup_on_returned_ctx + hostname = 'example.org' + + ctx3 = OpenSSL::SSL::SSLContext.new + ctx3.ciphers = "DH" + refute_predicate ctx3, :frozen? + + ctx2 = OpenSSL::SSL::SSLContext.new + ctx2.ciphers = "DH" + ctx2.servername_cb = lambda { |args| ctx3 } + + sock1, sock2 = UNIXSocket.pair + + s2 = OpenSSL::SSL::SSLSocket.new(sock2, ctx2) + + ctx1 = OpenSSL::SSL::SSLContext.new + ctx1.ciphers = "DH" + + s1 = OpenSSL::SSL::SSLSocket.new(sock1, ctx1) + s1.hostname = hostname + t = Thread.new { s1.connect } + + accepted = s2.accept + assert t.value + assert_predicate ctx3, :frozen? + ensure + s1.close if s1 + s2.close if s2 + sock1.close if sock1 + sock2.close if sock2 + accepted.close if accepted.respond_to?(:close) + end + + def test_servername_cb_can_return_nil + hostname = 'example.org' + + ctx2 = OpenSSL::SSL::SSLContext.new + ctx2.ciphers = "DH" + ctx2.servername_cb = lambda { |args| nil } + + sock1, sock2 = UNIXSocket.pair + + s2 = OpenSSL::SSL::SSLSocket.new(sock2, ctx2) + + ctx1 = OpenSSL::SSL::SSLContext.new + ctx1.ciphers = "DH" + + s1 = OpenSSL::SSL::SSLSocket.new(sock1, ctx1) + s1.hostname = hostname + t = Thread.new { s1.connect } + + accepted = s2.accept + assert t.value + ensure + s1.close if s1 + s2.close if s2 + sock1.close if sock1 + sock2.close if sock2 + accepted.close if accepted.respond_to?(:close) + end + + def test_servername_cb + lambda_called = nil + cb_socket = nil + hostname = 'example.org' + + ctx2 = OpenSSL::SSL::SSLContext.new + ctx2.ciphers = "DH" + ctx2.servername_cb = lambda do |args| + cb_socket = args[0] + lambda_called = args[1] + ctx2 + end + + sock1, sock2 = UNIXSocket.pair + + s2 = OpenSSL::SSL::SSLSocket.new(sock2, ctx2) + + ctx1 = OpenSSL::SSL::SSLContext.new + ctx1.ciphers = "DH" + + s1 = OpenSSL::SSL::SSLSocket.new(sock1, ctx1) + s1.hostname = hostname + t = Thread.new { s1.connect } + + accepted = s2.accept + assert t.value + assert_equal hostname, lambda_called + assert_equal s2, cb_socket + ensure + s1.close if s1 + s2.close if s2 + sock1.close if sock1 + sock2.close if sock2 + accepted.close if accepted.respond_to?(:close) + end + def test_tlsext_hostname return unless OpenSSL::SSL::SSLSocket.instance_methods.include?(:hostname) -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/