jruby-openssl 0.7.5.dev → 0.7.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (93) hide show
  1. data/History.txt +44 -14
  2. data/Manifest.txt +135 -80
  3. data/Rakefile +14 -6
  4. data/lib/{openssl.rb → 1.8/openssl.rb} +2 -11
  5. data/lib/{openssl → 1.8/openssl}/bn.rb +2 -2
  6. data/lib/{openssl → 1.8/openssl}/buffering.rb +3 -1
  7. data/lib/{openssl → 1.8/openssl}/cipher.rb +0 -0
  8. data/lib/{openssl → 1.8/openssl}/config.rb +1 -1
  9. data/lib/{openssl → 1.8/openssl}/digest.rb +2 -2
  10. data/lib/{openssl → 1.8/openssl}/pkcs7.rb +0 -0
  11. data/lib/{openssl/ssl.rb → 1.8/openssl/ssl-internal.rb} +2 -2
  12. data/lib/1.8/openssl/ssl.rb +1 -0
  13. data/lib/{openssl/x509.rb → 1.8/openssl/x509-internal.rb} +8 -9
  14. data/lib/1.8/openssl/x509.rb +1 -0
  15. data/lib/1.9/openssl.rb +22 -0
  16. data/lib/1.9/openssl/bn.rb +35 -0
  17. data/lib/1.9/openssl/buffering.rb +448 -0
  18. data/lib/1.9/openssl/cipher.rb +65 -0
  19. data/lib/1.9/openssl/config.rb +313 -0
  20. data/lib/1.9/openssl/digest.rb +72 -0
  21. data/lib/1.9/openssl/ssl-internal.rb +177 -0
  22. data/lib/1.9/openssl/ssl.rb +2 -0
  23. data/lib/1.9/openssl/x509-internal.rb +158 -0
  24. data/lib/1.9/openssl/x509.rb +2 -0
  25. data/lib/{jopenssl.jar → shared/jopenssl.jar} +0 -0
  26. data/lib/{jopenssl → shared/jopenssl}/version.rb +1 -1
  27. data/lib/shared/openssl.rb +18 -0
  28. data/lib/{openssl → shared/openssl}/dummy.rb +0 -0
  29. data/lib/{openssl → shared/openssl}/dummyssl.rb +0 -0
  30. data/lib/shared/openssl/ssl.rb +1 -0
  31. data/lib/shared/openssl/x509.rb +1 -0
  32. data/test/{openssl → 1.8}/ssl_server.rb +0 -0
  33. data/test/{openssl → 1.8}/test_asn1.rb +15 -0
  34. data/test/{openssl → 1.8}/test_cipher.rb +0 -0
  35. data/test/{openssl → 1.8}/test_config.rb +0 -0
  36. data/test/{openssl → 1.8}/test_digest.rb +0 -0
  37. data/test/{openssl → 1.8}/test_ec.rb +0 -0
  38. data/test/{openssl → 1.8}/test_hmac.rb +0 -0
  39. data/test/{openssl → 1.8}/test_ns_spki.rb +0 -0
  40. data/test/{openssl → 1.8}/test_pair.rb +10 -2
  41. data/test/{openssl → 1.8}/test_pkcs7.rb +0 -0
  42. data/test/{openssl → 1.8}/test_pkey_rsa.rb +0 -0
  43. data/test/{openssl → 1.8}/test_ssl.rb +17 -20
  44. data/test/{openssl → 1.8}/test_x509cert.rb +0 -0
  45. data/test/{openssl → 1.8}/test_x509crl.rb +0 -0
  46. data/test/{openssl → 1.8}/test_x509ext.rb +0 -0
  47. data/test/{openssl → 1.8}/test_x509name.rb +0 -0
  48. data/test/{openssl → 1.8}/test_x509req.rb +0 -0
  49. data/test/{openssl → 1.8}/test_x509store.rb +0 -0
  50. data/test/{openssl → 1.8}/utils.rb +0 -0
  51. data/test/1.9/ssl_server.rb +81 -0
  52. data/test/1.9/test_asn1.rb +589 -0
  53. data/test/1.9/test_bn.rb +23 -0
  54. data/test/1.9/test_buffering.rb +88 -0
  55. data/test/1.9/test_cipher.rb +107 -0
  56. data/test/1.9/test_config.rb +288 -0
  57. data/test/1.9/test_digest.rb +118 -0
  58. data/test/1.9/test_engine.rb +15 -0
  59. data/test/1.9/test_hmac.rb +32 -0
  60. data/test/1.9/test_ns_spki.rb +50 -0
  61. data/test/1.9/test_ocsp.rb +47 -0
  62. data/test/1.9/test_pair.rb +257 -0
  63. data/test/1.9/test_pkcs12.rb +209 -0
  64. data/test/1.9/test_pkcs7.rb +151 -0
  65. data/test/1.9/test_pkey_dh.rb +72 -0
  66. data/test/1.9/test_pkey_dsa.rb +224 -0
  67. data/test/1.9/test_pkey_ec.rb +182 -0
  68. data/test/1.9/test_pkey_rsa.rb +244 -0
  69. data/test/1.9/test_ssl.rb +455 -0
  70. data/test/1.9/test_ssl_session.rb +327 -0
  71. data/test/1.9/test_x509cert.rb +217 -0
  72. data/test/1.9/test_x509crl.rb +221 -0
  73. data/test/1.9/test_x509ext.rb +69 -0
  74. data/test/1.9/test_x509name.rb +296 -0
  75. data/test/1.9/test_x509req.rb +150 -0
  76. data/test/1.9/test_x509store.rb +229 -0
  77. data/test/1.9/utils.rb +304 -0
  78. data/test/fixture/purpose/ca/ca_config.rb +1 -1
  79. data/test/fixture/purpose/ca/gen_cert.rb +128 -0
  80. data/test/fixture/purpose/ca/newcerts/4_cert.pem +19 -0
  81. data/test/fixture/purpose/ca/serial +1 -1
  82. data/test/fixture/purpose/sslserver_no_dsig_in_keyUsage.pem +19 -0
  83. data/test/ruby/envutil.rb +208 -0
  84. data/test/ruby/ut_eof.rb +128 -0
  85. data/test/test_java.rb +1 -1
  86. data/test/test_openssl.rb +1 -1
  87. data/test/test_pkcs7.rb +16 -0
  88. data/test/test_pkey_dsa.rb +180 -0
  89. data/test/test_pkey_rsa.rb +298 -0
  90. data/test/test_ssl.rb +1 -1
  91. data/test/test_x509store.rb +8 -0
  92. metadata +121 -75
  93. data/test/test_pkey.rb +0 -204
@@ -0,0 +1,118 @@
1
+ require_relative 'utils'
2
+
3
+ if defined?(OpenSSL)
4
+
5
+ class OpenSSL::TestDigest < Test::Unit::TestCase
6
+ def setup
7
+ @d1 = OpenSSL::Digest::Digest::new("MD5")
8
+ @d2 = OpenSSL::Digest::MD5.new
9
+ @md = Digest::MD5.new
10
+ @data = "DATA"
11
+ end
12
+
13
+ def teardown
14
+ @d1 = @d2 = @md = nil
15
+ end
16
+
17
+ def test_digest
18
+ assert_equal(@md.digest, @d1.digest)
19
+ assert_equal(@md.hexdigest, @d1.hexdigest)
20
+ @d1 << @data
21
+ @d2 << @data
22
+ @md << @data
23
+ assert_equal(@md.digest, @d1.digest)
24
+ assert_equal(@md.hexdigest, @d1.hexdigest)
25
+ assert_equal(@d1.digest, @d2.digest)
26
+ assert_equal(@d1.hexdigest, @d2.hexdigest)
27
+ assert_equal(@md.digest, OpenSSL::Digest::MD5.digest(@data))
28
+ assert_equal(@md.hexdigest, OpenSSL::Digest::MD5.hexdigest(@data))
29
+ end
30
+
31
+ def test_eql
32
+ assert(@d1 == @d2, "==")
33
+ d = @d1.clone
34
+ assert(d == @d1, "clone")
35
+ end
36
+
37
+ def test_info
38
+ assert_equal("MD5", @d1.name, "name")
39
+ assert_equal("MD5", @d2.name, "name")
40
+ assert_equal(16, @d1.size, "size")
41
+ end
42
+
43
+ def test_dup
44
+ @d1.update(@data)
45
+ assert_equal(@d1.name, @d1.dup.name, "dup")
46
+ assert_equal(@d1.name, @d1.clone.name, "clone")
47
+ assert_equal(@d1.digest, @d1.clone.digest, "clone .digest")
48
+ end
49
+
50
+ def test_reset
51
+ @d1.update(@data)
52
+ dig1 = @d1.digest
53
+ @d1.reset
54
+ @d1.update(@data)
55
+ dig2 = @d1.digest
56
+ assert_equal(dig1, dig2, "reset")
57
+ end
58
+
59
+ def test_digest_constants
60
+ algs = %w(DSS1 MD4 MD5 RIPEMD160 SHA SHA1)
61
+ if OpenSSL::OPENSSL_VERSION_NUMBER > 0x00908000
62
+ algs += %w(SHA224 SHA256 SHA384 SHA512)
63
+ end
64
+ algs.each do |alg|
65
+ assert_not_nil(OpenSSL::Digest.new(alg))
66
+ klass = OpenSSL::Digest.const_get(alg)
67
+ assert_not_nil(klass.new)
68
+ end
69
+ end
70
+
71
+ def test_digest_by_oid_and_name
72
+ check_digest(OpenSSL::ASN1::ObjectId.new("MD5"))
73
+ check_digest(OpenSSL::ASN1::ObjectId.new("SHA1"))
74
+ end
75
+
76
+ if OpenSSL::OPENSSL_VERSION_NUMBER > 0x00908000
77
+ def encode16(str)
78
+ str.unpack("H*").first
79
+ end
80
+
81
+ def test_098_features
82
+ sha224_a = "abd37534c7d9a2efb9465de931cd7055ffdb8879563ae98078d6d6d5"
83
+ sha256_a = "ca978112ca1bbdcafac231b39a23dc4da786eff8147c4e72b9807785afee48bb"
84
+ sha384_a = "54a59b9f22b0b80880d8427e548b7c23abd873486e1f035dce9cd697e85175033caa88e6d57bc35efae0b5afd3145f31"
85
+ sha512_a = "1f40fc92da241694750979ee6cf582f2d5d7d28e18335de05abc54d0560e0f5302860c652bf08d560252aa5e74210546f369fbbbce8c12cfc7957b2652fe9a75"
86
+
87
+ assert_equal(sha224_a, OpenSSL::Digest::SHA224.hexdigest("a"))
88
+ assert_equal(sha256_a, OpenSSL::Digest::SHA256.hexdigest("a"))
89
+ assert_equal(sha384_a, OpenSSL::Digest::SHA384.hexdigest("a"))
90
+ assert_equal(sha512_a, OpenSSL::Digest::SHA512.hexdigest("a"))
91
+
92
+ assert_equal(sha224_a, encode16(OpenSSL::Digest::SHA224.digest("a")))
93
+ assert_equal(sha256_a, encode16(OpenSSL::Digest::SHA256.digest("a")))
94
+ assert_equal(sha384_a, encode16(OpenSSL::Digest::SHA384.digest("a")))
95
+ assert_equal(sha512_a, encode16(OpenSSL::Digest::SHA512.digest("a")))
96
+ end
97
+
98
+ def test_digest_by_oid_and_name_sha2
99
+ check_digest(OpenSSL::ASN1::ObjectId.new("SHA224"))
100
+ check_digest(OpenSSL::ASN1::ObjectId.new("SHA256"))
101
+ check_digest(OpenSSL::ASN1::ObjectId.new("SHA384"))
102
+ check_digest(OpenSSL::ASN1::ObjectId.new("SHA512"))
103
+ end
104
+ end
105
+
106
+ private
107
+
108
+ def check_digest(oid)
109
+ d = OpenSSL::Digest.new(oid.sn)
110
+ assert_not_nil(d)
111
+ d = OpenSSL::Digest.new(oid.ln)
112
+ assert_not_nil(d)
113
+ d = OpenSSL::Digest.new(oid.oid)
114
+ assert_not_nil(d)
115
+ end
116
+ end
117
+
118
+ end
@@ -0,0 +1,15 @@
1
+ require_relative 'utils'
2
+
3
+ if defined?(OpenSSL) && defined?(OpenSSL::Engine)
4
+
5
+ class OpenSSL::TestEngine < Test::Unit::TestCase
6
+
7
+ def test_engines_free # [ruby-dev:44173]
8
+ OpenSSL::Engine.load
9
+ OpenSSL::Engine.engines
10
+ OpenSSL::Engine.engines
11
+ end
12
+
13
+ end
14
+
15
+ end
@@ -0,0 +1,32 @@
1
+ require_relative 'utils'
2
+
3
+ class OpenSSL::TestHMAC < Test::Unit::TestCase
4
+ def setup
5
+ @digest = OpenSSL::Digest::MD5
6
+ @key = "KEY"
7
+ @data = "DATA"
8
+ @h1 = OpenSSL::HMAC.new(@key, @digest.new)
9
+ @h2 = OpenSSL::HMAC.new(@key, "MD5")
10
+ end
11
+
12
+ def teardown
13
+ end
14
+
15
+ def test_hmac
16
+ @h1.update(@data)
17
+ @h2.update(@data)
18
+ assert_equal(@h1.digest, @h2.digest)
19
+
20
+ assert_equal(OpenSSL::HMAC.digest(@digest.new, @key, @data), @h1.digest, "digest")
21
+ assert_equal(OpenSSL::HMAC.hexdigest(@digest.new, @key, @data), @h1.hexdigest, "hexdigest")
22
+
23
+ assert_equal(OpenSSL::HMAC.digest("MD5", @key, @data), @h2.digest, "digest")
24
+ assert_equal(OpenSSL::HMAC.hexdigest("MD5", @key, @data), @h2.hexdigest, "hexdigest")
25
+ end
26
+
27
+ def test_dup
28
+ @h1.update(@data)
29
+ h = @h1.dup
30
+ assert_equal(@h1.digest, h.digest, "dup digest")
31
+ end
32
+ end if defined?(OpenSSL)
@@ -0,0 +1,50 @@
1
+ require_relative 'utils'
2
+
3
+ if defined?(OpenSSL)
4
+
5
+ class OpenSSL::TestNSSPI < Test::Unit::TestCase
6
+ def setup
7
+ # This request data is adopt from the specification of
8
+ # "Netscape Extensions for User Key Generation".
9
+ # -- http://wp.netscape.com/eng/security/comm4-keygen.html
10
+ @b64 = "MIHFMHEwXDANBgkqhkiG9w0BAQEFAANLADBIAkEAnX0TILJrOMUue+PtwBRE6XfV"
11
+ @b64 << "WtKQbsshxk5ZhcUwcwyvcnIq9b82QhJdoACdD34rqfCAIND46fXKQUnb0mvKzQID"
12
+ @b64 << "AQABFhFNb3ppbGxhSXNNeUZyaWVuZDANBgkqhkiG9w0BAQQFAANBAAKv2Eex2n/S"
13
+ @b64 << "r/7iJNroWlSzSMtTiQTEB+ADWHGj9u1xrUrOilq/o2cuQxIfZcNZkYAkWP4DubqW"
14
+ @b64 << "i0//rgBvmco="
15
+ end
16
+
17
+ def test_build_data
18
+ key1 = OpenSSL::TestUtils::TEST_KEY_RSA1024
19
+ key2 = OpenSSL::TestUtils::TEST_KEY_RSA2048
20
+ spki = OpenSSL::Netscape::SPKI.new
21
+ spki.challenge = "RandomString"
22
+ spki.public_key = key1.public_key
23
+ spki.sign(key1, OpenSSL::Digest::SHA1.new)
24
+ assert(spki.verify(spki.public_key))
25
+ assert(spki.verify(key1.public_key))
26
+ assert(!spki.verify(key2.public_key))
27
+
28
+ der = spki.to_der
29
+ spki = OpenSSL::Netscape::SPKI.new(der)
30
+ assert_equal("RandomString", spki.challenge)
31
+ assert_equal(key1.public_key.to_der, spki.public_key.to_der)
32
+ assert(spki.verify(spki.public_key))
33
+ end
34
+
35
+ def test_decode_data
36
+ spki = OpenSSL::Netscape::SPKI.new(@b64)
37
+ assert_equal(@b64, spki.to_pem)
38
+ assert_equal(@b64.unpack("m").first, spki.to_der)
39
+ assert_equal("MozillaIsMyFriend", spki.challenge)
40
+ assert_equal(OpenSSL::PKey::RSA, spki.public_key.class)
41
+
42
+ spki = OpenSSL::Netscape::SPKI.new(@b64.unpack("m").first)
43
+ assert_equal(@b64, spki.to_pem)
44
+ assert_equal(@b64.unpack("m").first, spki.to_der)
45
+ assert_equal("MozillaIsMyFriend", spki.challenge)
46
+ assert_equal(OpenSSL::PKey::RSA, spki.public_key.class)
47
+ end
48
+ end
49
+
50
+ end
@@ -0,0 +1,47 @@
1
+ require_relative "utils"
2
+
3
+ if defined?(OpenSSL)
4
+
5
+ class OpenSSL::TestOCSP < Test::Unit::TestCase
6
+ def setup
7
+ ca_subj = OpenSSL::X509::Name.parse("/DC=org/DC=ruby-lang/CN=TestCA")
8
+ ca_key = OpenSSL::TestUtils::TEST_KEY_RSA1024
9
+ ca_serial = 0xabcabcabcabc
10
+
11
+ subj = OpenSSL::X509::Name.parse("/DC=org/DC=ruby-lang/CN=TestCert")
12
+ @key = OpenSSL::TestUtils::TEST_KEY_RSA1024
13
+ serial = 0xabcabcabcabd
14
+
15
+ now = Time.at(Time.now.to_i) # suppress usec
16
+ dgst = OpenSSL::Digest::SHA1.new
17
+
18
+ @ca_cert = OpenSSL::TestUtils.issue_cert(
19
+ ca_subj, ca_key, ca_serial, now, now+3600, [], nil, nil, dgst)
20
+ @cert = OpenSSL::TestUtils.issue_cert(
21
+ subj, @key, serial, now, now+3600, [], @ca_cert, nil, dgst)
22
+ end
23
+
24
+ def test_new_certificate_id
25
+ cid = OpenSSL::OCSP::CertificateId.new(@cert, @ca_cert)
26
+ assert_kind_of OpenSSL::OCSP::CertificateId, cid
27
+ assert_equal @cert.serial, cid.serial
28
+ end
29
+
30
+ def test_new_certificate_id_with_digest
31
+ cid = OpenSSL::OCSP::CertificateId.new(@cert, @ca_cert, OpenSSL::Digest::SHA256.new)
32
+ assert_kind_of OpenSSL::OCSP::CertificateId, cid
33
+ assert_equal @cert.serial, cid.serial
34
+ end if defined?(OpenSSL::Digest::SHA256)
35
+
36
+ def test_new_ocsp_request
37
+ request = OpenSSL::OCSP::Request.new
38
+ cid = OpenSSL::OCSP::CertificateId.new(@cert, @ca_cert, OpenSSL::Digest::SHA1.new)
39
+ request.add_certid(cid)
40
+ request.sign(@cert, @key, [@cert])
41
+ assert_kind_of OpenSSL::OCSP::Request, request
42
+ # in current implementation not same instance of certificate id, but should contain same data
43
+ assert_equal cid.serial, request.certid.first.serial
44
+ end
45
+ end
46
+
47
+ end
@@ -0,0 +1,257 @@
1
+ require_relative 'utils'
2
+
3
+ if defined?(OpenSSL)
4
+
5
+ require 'socket'
6
+ require_relative '../ruby/ut_eof'
7
+
8
+ module SSLPair
9
+ DHParam = OpenSSL::PKey::DH.new(128)
10
+ def server
11
+ host = "127.0.0.1"
12
+ port = 0
13
+ ctx = OpenSSL::SSL::SSLContext.new()
14
+ ctx.ciphers = "ADH"
15
+ ctx.tmp_dh_callback = proc { DHParam }
16
+ tcps = TCPServer.new(host, port)
17
+ ssls = OpenSSL::SSL::SSLServer.new(tcps, ctx)
18
+ return ssls
19
+ end
20
+
21
+ def client(port)
22
+ host = "127.0.0.1"
23
+ ctx = OpenSSL::SSL::SSLContext.new()
24
+ ctx.ciphers = "ADH"
25
+ s = TCPSocket.new(host, port)
26
+ ssl = OpenSSL::SSL::SSLSocket.new(s, ctx)
27
+ ssl.connect
28
+ ssl.sync_close = true
29
+ ssl
30
+ end
31
+
32
+ def ssl_pair
33
+ ssls = server
34
+ th = Thread.new {
35
+ ns = ssls.accept
36
+ ssls.close
37
+ ns
38
+ }
39
+ port = ssls.to_io.addr[1]
40
+ c = client(port)
41
+ s = th.value
42
+ if block_given?
43
+ begin
44
+ yield c, s
45
+ ensure
46
+ c.close unless c.closed?
47
+ s.close unless s.closed?
48
+ end
49
+ else
50
+ return c, s
51
+ end
52
+ ensure
53
+ if th && th.alive?
54
+ th.kill
55
+ th.join
56
+ end
57
+ end
58
+ end
59
+
60
+ class OpenSSL::TestEOF1 < Test::Unit::TestCase
61
+ include TestEOF
62
+ include SSLPair
63
+
64
+ def open_file(content)
65
+ s1, s2 = ssl_pair
66
+ Thread.new { s2 << content; s2.close }
67
+ yield s1
68
+ end
69
+ end
70
+
71
+ class OpenSSL::TestEOF2 < Test::Unit::TestCase
72
+ include TestEOF
73
+ include SSLPair
74
+
75
+ def open_file(content)
76
+ s1, s2 = ssl_pair
77
+ Thread.new { s1 << content; s1.close }
78
+ yield s2
79
+ end
80
+ end
81
+
82
+ class OpenSSL::TestPair < Test::Unit::TestCase
83
+ include SSLPair
84
+
85
+ def test_getc
86
+ ssl_pair {|s1, s2|
87
+ s1 << "a"
88
+ assert_equal(?a, s2.getc)
89
+ }
90
+ end
91
+
92
+ def test_readpartial
93
+ ssl_pair {|s1, s2|
94
+ s2.write "a\nbcd"
95
+ assert_equal("a\n", s1.gets)
96
+ read = s1.readpartial(10)
97
+ assert_equal("bcd"[0, read.bytesize], read)
98
+ s1.read(read.bytesize - 3) # drop unread bytes
99
+ s2.write "efg"
100
+ read = s1.readpartial(10)
101
+ assert_equal("efg"[0, read.bytesize], read)
102
+ rest = 3 - read.bytesize
103
+ while rest > 0
104
+ rest -= s1.readpartial(rest).size
105
+ end
106
+ s2.close
107
+ assert_raise(EOFError) { s1.readpartial(10) }
108
+ assert_raise(EOFError) { s1.readpartial(10) }
109
+ assert_equal("", s1.readpartial(0))
110
+ }
111
+ end
112
+
113
+ def test_readall
114
+ ssl_pair {|s1, s2|
115
+ s2.close
116
+ assert_equal("", s1.read)
117
+ }
118
+ end
119
+
120
+ def test_readline
121
+ ssl_pair {|s1, s2|
122
+ s2.close
123
+ assert_raise(EOFError) { s1.readline }
124
+ }
125
+ end
126
+
127
+ def test_puts_meta
128
+ ssl_pair {|s1, s2|
129
+ begin
130
+ old = $/
131
+ $/ = '*'
132
+ s1.puts 'a'
133
+ ensure
134
+ $/ = old
135
+ end
136
+ s1.close
137
+ assert_equal("a\n", s2.read)
138
+ }
139
+ end
140
+
141
+ def test_puts_empty
142
+ ssl_pair {|s1, s2|
143
+ s1.puts
144
+ s1.close
145
+ assert_equal("\n", s2.read)
146
+ }
147
+ end
148
+
149
+ def test_read_nonblock
150
+ ssl_pair {|s1, s2|
151
+ err = nil
152
+ assert_raise(OpenSSL::SSL::SSLError) {
153
+ begin
154
+ s2.read_nonblock(10)
155
+ ensure
156
+ err = $!
157
+ end
158
+ }
159
+ assert_kind_of(IO::WaitReadable, err)
160
+ s1.write "abc\ndef\n"
161
+ IO.select([s2])
162
+ assert_equal("ab", s2.read_nonblock(2))
163
+ assert_equal("c\n", s2.gets)
164
+ ret = nil
165
+ assert_nothing_raised("[ruby-core:20298]") { ret = s2.read_nonblock(10) }
166
+ assert_equal("def\n", ret)
167
+ }
168
+ end
169
+
170
+ def test_write_nonblock
171
+ ssl_pair {|s1, s2|
172
+ n = 0
173
+ begin
174
+ n += s1.write_nonblock("a" * 100000)
175
+ n += s1.write_nonblock("b" * 100000)
176
+ n += s1.write_nonblock("c" * 100000)
177
+ n += s1.write_nonblock("d" * 100000)
178
+ n += s1.write_nonblock("e" * 100000)
179
+ n += s1.write_nonblock("f" * 100000)
180
+ rescue IO::WaitWritable
181
+ end
182
+ s1.close
183
+ assert_equal(n, s2.read.length)
184
+ }
185
+ end
186
+
187
+ def test_write_nonblock_with_buffered_data
188
+ ssl_pair {|s1, s2|
189
+ s1.write "foo"
190
+ s1.write_nonblock("bar")
191
+ s1.write "baz"
192
+ s1.close
193
+ assert_equal("foobarbaz", s2.read)
194
+ }
195
+ end
196
+
197
+ def test_connect_accept_nonblock
198
+ host = "127.0.0.1"
199
+ port = 0
200
+ ctx = OpenSSL::SSL::SSLContext.new()
201
+ ctx.ciphers = "ADH"
202
+ ctx.tmp_dh_callback = proc { DHParam }
203
+ serv = TCPServer.new(host, port)
204
+
205
+ port = serv.connect_address.ip_port
206
+
207
+ sock1 = TCPSocket.new(host, port)
208
+ sock2 = serv.accept
209
+ serv.close
210
+
211
+ th = Thread.new {
212
+ s2 = OpenSSL::SSL::SSLSocket.new(sock2, ctx)
213
+ s2.sync_close = true
214
+ begin
215
+ sleep 0.2
216
+ s2.accept_nonblock
217
+ rescue IO::WaitReadable
218
+ IO.select([s2])
219
+ retry
220
+ rescue IO::WaitWritable
221
+ IO.select(nil, [s2])
222
+ retry
223
+ end
224
+ s2
225
+ }
226
+
227
+ sleep 0.1
228
+ ctx = OpenSSL::SSL::SSLContext.new()
229
+ ctx.ciphers = "ADH"
230
+ s1 = OpenSSL::SSL::SSLSocket.new(sock1, ctx)
231
+ begin
232
+ sleep 0.2
233
+ s1.connect_nonblock
234
+ rescue IO::WaitReadable
235
+ IO.select([s1])
236
+ retry
237
+ rescue IO::WaitWritable
238
+ IO.select(nil, [s1])
239
+ retry
240
+ end
241
+ s1.sync_close = true
242
+
243
+ s2 = th.value
244
+
245
+ s1.print "a\ndef"
246
+ assert_equal("a\n", s2.gets)
247
+ ensure
248
+ s1.close if s1 && !s1.closed?
249
+ s2.close if s2 && !s2.closed?
250
+ serv.close if serv && !serv.closed?
251
+ sock1.close if sock1 && !sock1.closed?
252
+ sock2.close if sock2 && !sock2.closed?
253
+ end
254
+
255
+ end
256
+
257
+ end