@@ -85,4 +85,68 @@ def test_ssl_sysread_blocking_error
8585 end
8686 end if RUBY_VERSION > '2.2'
8787
88+ def test_read_nonblock_no_exception
89+ ssl_pair do |s1 , s2 |
90+ assert_equal :wait_readable , eval ( 's2.read_nonblock 10, exception: false' )
91+ s1 . write "abc\n def\n "
92+ IO . select [ s2 ]
93+ ret = eval ( 's2.read_nonblock 2, exception: false' )
94+ assert_equal "ab" , ret
95+ assert_equal "c\n " , s2 . gets
96+ ret = eval ( 's2.read_nonblock 10, exception: false' )
97+ assert_equal ( "def\n " , ret )
98+ s1 . close
99+ sleep 0.1
100+ opts = { :exception => false }
101+ assert_equal nil , s2 . read_nonblock ( 10 , opts )
102+ end
103+ end if RUBY_VERSION > '2.2'
104+
105+ private
106+
107+ def server
108+ require 'socket'
109+ host = "127.0.0.1" ; port = 0
110+ ctx = OpenSSL ::SSL ::SSLContext . new ( )
111+ ctx . ciphers = "ADH"
112+ server = TCPServer . new ( host , port )
113+ OpenSSL ::SSL ::SSLServer . new ( server , ctx )
114+ end
115+
116+ def client ( port )
117+ require 'socket'
118+ host = "127.0.0.1"
119+ ctx = OpenSSL ::SSL ::SSLContext . new ( )
120+ ctx . ciphers = "ADH"
121+ client = TCPSocket . new ( host , port )
122+ ssl = OpenSSL ::SSL ::SSLSocket . new ( client , ctx )
123+ ssl . connect
124+ ssl . sync_close = true
125+ ssl
126+ end
127+
128+ def ssl_pair
129+ ssl_server = server
130+ thread = Thread . new do
131+ ssl_server . accept . tap { ssl_server . close }
132+ end
133+ port = ssl_server . to_io . local_address . ip_port
134+ ssl_client = client ( port )
135+ ssl_socket = thread . value
136+ if block_given?
137+ begin
138+ yield ssl_client , ssl_socket
139+ ensure
140+ ssl_client . close unless ssl_client . closed?
141+ ssl_socket . close unless ssl_socket . closed?
142+ end
143+ else
144+ return ssl_client , ssl_socket
145+ end
146+ ensure
147+ if thread && thread . alive?
148+ thread . kill ; thread . join
149+ end
150+ end
151+
88152end
0 commit comments