JRuby-OpenSSL 0.1
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.
- data/History.txt +12 -0
- data/License.txt +30 -0
- data/README.txt +18 -0
- data/lib/bcmail-jdk14-135.jar +0 -0
- data/lib/bcprov-jdk14-135.jar +0 -0
- data/lib/jopenssl.jar +0 -0
- data/lib/jopenssl/version.rb +5 -0
- data/lib/openssl.rb +24 -0
- data/lib/openssl/bn.rb +35 -0
- data/lib/openssl/buffering.rb +239 -0
- data/lib/openssl/cipher.rb +58 -0
- data/lib/openssl/digest.rb +48 -0
- data/lib/openssl/dummy.rb +34 -0
- data/lib/openssl/dummyssl.rb +13 -0
- data/lib/openssl/ssl.rb +135 -0
- data/lib/openssl/x509.rb +154 -0
- data/test/openssl/ssl_server.rb +81 -0
- data/test/openssl/test_asn1.rb +199 -0
- data/test/openssl/test_cipher.rb +151 -0
- data/test/openssl/test_digest.rb +88 -0
- data/test/openssl/test_hmac.rb +34 -0
- data/test/openssl/test_ns_spki.rb +69 -0
- data/test/openssl/test_pair.rb +149 -0
- data/test/openssl/test_pkey_rsa.rb +49 -0
- data/test/openssl/test_ssl.rb +284 -0
- data/test/openssl/test_x509cert.rb +174 -0
- data/test/openssl/test_x509crl.rb +218 -0
- data/test/openssl/test_x509ext.rb +74 -0
- data/test/openssl/test_x509name.rb +265 -0
- data/test/openssl/test_x509req.rb +140 -0
- data/test/openssl/test_x509store.rb +217 -0
- data/test/openssl/utils.rb +135 -0
- data/test/test_openssl.rb +21 -0
- data/test/ut_eof.rb +128 -0
- metadata +85 -0
@@ -0,0 +1,151 @@
|
|
1
|
+
begin
|
2
|
+
require "openssl"
|
3
|
+
rescue LoadError
|
4
|
+
end
|
5
|
+
require "test/unit"
|
6
|
+
|
7
|
+
if defined?(OpenSSL)
|
8
|
+
|
9
|
+
class OpenSSL::TestCipher < Test::Unit::TestCase
|
10
|
+
def setup
|
11
|
+
@c1 = OpenSSL::Cipher::Cipher.new("DES-EDE3-CBC")
|
12
|
+
@c2 = OpenSSL::Cipher::DES.new(:EDE3, "CBC")
|
13
|
+
@key = "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
|
14
|
+
@iv = "\0\0\0\0\0\0\0\0"
|
15
|
+
@hexkey = "0000000000000000000000000000000000000000000000"
|
16
|
+
@hexiv = "0000000000000000"
|
17
|
+
@data = "DATA"
|
18
|
+
end
|
19
|
+
|
20
|
+
def teardown
|
21
|
+
@c1 = @c2 = nil
|
22
|
+
end
|
23
|
+
|
24
|
+
def test_crypt
|
25
|
+
@c1.encrypt.pkcs5_keyivgen(@key, @iv)
|
26
|
+
@c2.encrypt.pkcs5_keyivgen(@key, @iv)
|
27
|
+
s1 = @c1.update(@data) + @c1.final
|
28
|
+
s2 = @c2.update(@data) + @c2.final
|
29
|
+
assert_equal(s1, s2, "encrypt")
|
30
|
+
|
31
|
+
@c1.decrypt.pkcs5_keyivgen(@key, @iv)
|
32
|
+
@c2.decrypt.pkcs5_keyivgen(@key, @iv)
|
33
|
+
assert_equal(@data, @c1.update(s1)+@c1.final, "decrypt")
|
34
|
+
assert_equal(@data, @c2.update(s2)+@c2.final, "decrypt")
|
35
|
+
end
|
36
|
+
|
37
|
+
def test_info
|
38
|
+
assert_equal("DES-EDE3-CBC", @c1.name, "name")
|
39
|
+
assert_equal("DES-EDE3-CBC", @c2.name, "name")
|
40
|
+
assert_kind_of(Fixnum, @c1.key_len, "key_len")
|
41
|
+
assert_kind_of(Fixnum, @c1.iv_len, "iv_len")
|
42
|
+
end
|
43
|
+
|
44
|
+
def test_dup
|
45
|
+
assert_equal(@c1.name, @c1.dup.name, "dup")
|
46
|
+
assert_equal(@c1.name, @c1.clone.name, "clone")
|
47
|
+
@c1.encrypt
|
48
|
+
@c1.key = @key
|
49
|
+
@c1.iv = @iv
|
50
|
+
tmpc = @c1.dup
|
51
|
+
s1 = @c1.update(@data) + @c1.final
|
52
|
+
s2 = tmpc.update(@data) + tmpc.final
|
53
|
+
assert_equal(s1, s2, "encrypt dup")
|
54
|
+
end
|
55
|
+
|
56
|
+
def test_reset
|
57
|
+
@c1.encrypt
|
58
|
+
@c1.key = @key
|
59
|
+
@c1.iv = @iv
|
60
|
+
s1 = @c1.update(@data) + @c1.final
|
61
|
+
@c1.reset
|
62
|
+
s2 = @c1.update(@data) + @c1.final
|
63
|
+
assert_equal(s1, s2, "encrypt reset")
|
64
|
+
end
|
65
|
+
|
66
|
+
def test_empty_data
|
67
|
+
@c1.encrypt
|
68
|
+
assert_raises(ArgumentError){ @c1.update("") }
|
69
|
+
end
|
70
|
+
|
71
|
+
def test_disable_padding(padding=0)
|
72
|
+
# assume a padding size of 8
|
73
|
+
# encrypt the data with padding
|
74
|
+
@c1.encrypt
|
75
|
+
@c1.key = @key
|
76
|
+
@c1.iv = @iv
|
77
|
+
encrypted_data = @c1.update(@data) + @c1.final
|
78
|
+
assert_equal(8, encrypted_data.size)
|
79
|
+
# decrypt with padding disabled
|
80
|
+
@c1.decrypt
|
81
|
+
@c1.padding = padding
|
82
|
+
decrypted_data = @c1.update(encrypted_data) + @c1.final
|
83
|
+
# check that the result contains the padding
|
84
|
+
assert_equal(8, decrypted_data.size)
|
85
|
+
assert_equal(@data, decrypted_data[0...@data.size])
|
86
|
+
end
|
87
|
+
|
88
|
+
if PLATFORM =~ /java/
|
89
|
+
# JRuby extension - using Java padding types
|
90
|
+
|
91
|
+
def test_disable_padding_javastyle
|
92
|
+
test_disable_padding('NoPadding')
|
93
|
+
end
|
94
|
+
|
95
|
+
def test_iso10126_padding
|
96
|
+
@c1.encrypt
|
97
|
+
@c1.key = @key
|
98
|
+
@c1.iv = @iv
|
99
|
+
@c1.padding = 'ISO10126Padding'
|
100
|
+
encrypted_data = @c1.update(@data) + @c1.final
|
101
|
+
# decrypt with padding disabled to see the padding
|
102
|
+
@c1.decrypt
|
103
|
+
@c1.padding = 0
|
104
|
+
decrypted_data = @c1.update(encrypted_data) + @c1.final
|
105
|
+
assert_equal(@data, decrypted_data[0...@data.size])
|
106
|
+
# last byte should be the amount of padding
|
107
|
+
assert_equal(4, decrypted_data[-1])
|
108
|
+
end
|
109
|
+
|
110
|
+
def test_iso10126_padding_boundry
|
111
|
+
@data = 'HELODATA' # 8 bytes, same as padding size
|
112
|
+
@c1.encrypt
|
113
|
+
@c1.key = @key
|
114
|
+
@c1.iv = @iv
|
115
|
+
@c1.padding = 'ISO10126Padding'
|
116
|
+
encrypted_data = @c1.update(@data) + @c1.final
|
117
|
+
# decrypt with padding disabled to see the padding
|
118
|
+
@c1.decrypt
|
119
|
+
@c1.padding = 0
|
120
|
+
decrypted_data = @c1.update(encrypted_data) + @c1.final
|
121
|
+
assert_equal(@data, decrypted_data[0...@data.size])
|
122
|
+
# padding should be one whole block
|
123
|
+
assert_equal(8, decrypted_data[-1])
|
124
|
+
end
|
125
|
+
end
|
126
|
+
|
127
|
+
if OpenSSL::OPENSSL_VERSION_NUMBER > 0x00907000
|
128
|
+
def test_ciphers
|
129
|
+
OpenSSL::Cipher.ciphers.each{|name|
|
130
|
+
assert(OpenSSL::Cipher::Cipher.new(name).is_a?(OpenSSL::Cipher::Cipher))
|
131
|
+
}
|
132
|
+
end
|
133
|
+
|
134
|
+
def test_AES
|
135
|
+
pt = File.read(__FILE__)
|
136
|
+
%w(ECB CBC CFB OFB).each{|mode|
|
137
|
+
c1 = OpenSSL::Cipher::AES256.new(mode)
|
138
|
+
c1.encrypt
|
139
|
+
c1.pkcs5_keyivgen("passwd")
|
140
|
+
ct = c1.update(pt) + c1.final
|
141
|
+
|
142
|
+
c2 = OpenSSL::Cipher::AES256.new(mode)
|
143
|
+
c2.decrypt
|
144
|
+
c2.pkcs5_keyivgen("passwd")
|
145
|
+
assert_equal(pt, c2.update(ct) + c2.final)
|
146
|
+
}
|
147
|
+
end
|
148
|
+
end
|
149
|
+
end
|
150
|
+
|
151
|
+
end
|
@@ -0,0 +1,88 @@
|
|
1
|
+
begin
|
2
|
+
require "openssl"
|
3
|
+
rescue LoadError
|
4
|
+
end
|
5
|
+
require "digest/md5"
|
6
|
+
require "test/unit"
|
7
|
+
|
8
|
+
if defined?(OpenSSL)
|
9
|
+
|
10
|
+
class OpenSSL::TestDigest < Test::Unit::TestCase
|
11
|
+
def setup
|
12
|
+
@d1 = OpenSSL::Digest::Digest::new("MD5")
|
13
|
+
@d2 = OpenSSL::Digest::MD5.new
|
14
|
+
@md = Digest::MD5.new
|
15
|
+
@data = "DATA"
|
16
|
+
end
|
17
|
+
|
18
|
+
def teardown
|
19
|
+
@d1 = @d2 = @md = nil
|
20
|
+
end
|
21
|
+
|
22
|
+
def test_digest
|
23
|
+
assert_equal(@md.digest, @d1.digest)
|
24
|
+
assert_equal(@md.hexdigest, @d1.hexdigest)
|
25
|
+
@d1 << @data
|
26
|
+
@d2 << @data
|
27
|
+
@md << @data
|
28
|
+
assert_equal(@md.digest, @d1.digest)
|
29
|
+
assert_equal(@md.hexdigest, @d1.hexdigest)
|
30
|
+
assert_equal(@d1.digest, @d2.digest)
|
31
|
+
assert_equal(@d1.hexdigest, @d2.hexdigest)
|
32
|
+
assert_equal(@md.digest, OpenSSL::Digest::MD5.digest(@data))
|
33
|
+
assert_equal(@md.hexdigest, OpenSSL::Digest::MD5.hexdigest(@data))
|
34
|
+
end
|
35
|
+
|
36
|
+
def test_eql
|
37
|
+
assert(@d1 == @d2, "==")
|
38
|
+
d = @d1.clone
|
39
|
+
assert(d == @d1, "clone")
|
40
|
+
end
|
41
|
+
|
42
|
+
def test_info
|
43
|
+
assert_equal("MD5", @d1.name, "name")
|
44
|
+
assert_equal("MD5", @d2.name, "name")
|
45
|
+
assert_equal(16, @d1.size, "size")
|
46
|
+
end
|
47
|
+
|
48
|
+
def test_dup
|
49
|
+
@d1.update(@data)
|
50
|
+
assert_equal(@d1.name, @d1.dup.name, "dup")
|
51
|
+
assert_equal(@d1.name, @d1.clone.name, "clone")
|
52
|
+
assert_equal(@d1.digest, @d1.clone.digest, "clone .digest")
|
53
|
+
end
|
54
|
+
|
55
|
+
def test_reset
|
56
|
+
@d1.update(@data)
|
57
|
+
dig1 = @d1.digest
|
58
|
+
@d1.reset
|
59
|
+
@d1.update(@data)
|
60
|
+
dig2 = @d1.digest
|
61
|
+
assert_equal(dig1, dig2, "reset")
|
62
|
+
end
|
63
|
+
|
64
|
+
if OpenSSL::OPENSSL_VERSION_NUMBER > 0x00908000
|
65
|
+
def encode16(str)
|
66
|
+
str.unpack("H*").first
|
67
|
+
end
|
68
|
+
|
69
|
+
def test_098_features
|
70
|
+
sha224_a = "abd37534c7d9a2efb9465de931cd7055ffdb8879563ae98078d6d6d5"
|
71
|
+
sha256_a = "ca978112ca1bbdcafac231b39a23dc4da786eff8147c4e72b9807785afee48bb"
|
72
|
+
sha384_a = "54a59b9f22b0b80880d8427e548b7c23abd873486e1f035dce9cd697e85175033caa88e6d57bc35efae0b5afd3145f31"
|
73
|
+
sha512_a = "1f40fc92da241694750979ee6cf582f2d5d7d28e18335de05abc54d0560e0f5302860c652bf08d560252aa5e74210546f369fbbbce8c12cfc7957b2652fe9a75"
|
74
|
+
|
75
|
+
assert_equal(sha224_a, OpenSSL::Digest::SHA224.hexdigest("a"))
|
76
|
+
assert_equal(sha256_a, OpenSSL::Digest::SHA256.hexdigest("a"))
|
77
|
+
assert_equal(sha384_a, OpenSSL::Digest::SHA384.hexdigest("a"))
|
78
|
+
assert_equal(sha512_a, OpenSSL::Digest::SHA512.hexdigest("a"))
|
79
|
+
|
80
|
+
assert_equal(sha224_a, encode16(OpenSSL::Digest::SHA224.digest("a")))
|
81
|
+
assert_equal(sha256_a, encode16(OpenSSL::Digest::SHA256.digest("a")))
|
82
|
+
assert_equal(sha384_a, encode16(OpenSSL::Digest::SHA384.digest("a")))
|
83
|
+
assert_equal(sha512_a, encode16(OpenSSL::Digest::SHA512.digest("a")))
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
begin
|
2
|
+
require "openssl"
|
3
|
+
rescue LoadError
|
4
|
+
end
|
5
|
+
require "test/unit"
|
6
|
+
|
7
|
+
if defined?(OpenSSL)
|
8
|
+
|
9
|
+
class OpenSSL::TestHMAC < Test::Unit::TestCase
|
10
|
+
def setup
|
11
|
+
@digest = OpenSSL::Digest::MD5.new
|
12
|
+
@key = "KEY"
|
13
|
+
@data = "DATA"
|
14
|
+
@h1 = OpenSSL::HMAC.new(@key, @digest)
|
15
|
+
@h2 = OpenSSL::HMAC.new(@key, @digest)
|
16
|
+
end
|
17
|
+
|
18
|
+
def teardown
|
19
|
+
end
|
20
|
+
|
21
|
+
def test_hmac
|
22
|
+
@h1.update(@data)
|
23
|
+
assert_equal(OpenSSL::HMAC.digest(@digest, @key, @data), @h1.digest, "digest")
|
24
|
+
assert_equal(OpenSSL::HMAC.hexdigest(@digest, @key, @data), @h1.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
|
33
|
+
|
34
|
+
end
|
@@ -0,0 +1,69 @@
|
|
1
|
+
begin
|
2
|
+
require "openssl"
|
3
|
+
require File.join(File.dirname(__FILE__), "utils.rb")
|
4
|
+
rescue LoadError
|
5
|
+
end
|
6
|
+
require "test/unit"
|
7
|
+
|
8
|
+
if defined?(OpenSSL)
|
9
|
+
|
10
|
+
|
11
|
+
class OpenSSL::TestNSSPI < Test::Unit::TestCase
|
12
|
+
def setup
|
13
|
+
# This request data is adopt from the specification of
|
14
|
+
# "Netscape Extensions for User Key Generation".
|
15
|
+
# -- http://wp.netscape.com/eng/security/comm4-keygen.html
|
16
|
+
@b64 = "MIHFMHEwXDANBgkqhkiG9w0BAQEFAANLADBIAkEAnX0TILJrOMUue+PtwBRE6XfV"
|
17
|
+
@b64 << "WtKQbsshxk5ZhcUwcwyvcnIq9b82QhJdoACdD34rqfCAIND46fXKQUnb0mvKzQID"
|
18
|
+
@b64 << "AQABFhFNb3ppbGxhSXNNeUZyaWVuZDANBgkqhkiG9w0BAQQFAANBAAKv2Eex2n/S"
|
19
|
+
@b64 << "r/7iJNroWlSzSMtTiQTEB+ADWHGj9u1xrUrOilq/o2cuQxIfZcNZkYAkWP4DubqW"
|
20
|
+
@b64 << "i0//rgBvmco="
|
21
|
+
end
|
22
|
+
|
23
|
+
def teardown
|
24
|
+
end
|
25
|
+
def pr(obj, ind=0)
|
26
|
+
if obj.respond_to?(:value)
|
27
|
+
puts((" "*ind) + obj.class.to_s + ":")
|
28
|
+
pr(obj.value,(ind+1))
|
29
|
+
elsif obj.respond_to?(:each) && !(String===obj)
|
30
|
+
obj.each {|v| pr(v,ind+1) }
|
31
|
+
else
|
32
|
+
puts((" "*ind) + obj.inspect)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
def test_build_data
|
37
|
+
key1 = OpenSSL::TestUtils::TEST_KEY_RSA1024
|
38
|
+
key2 = OpenSSL::TestUtils::TEST_KEY_RSA2048
|
39
|
+
spki = OpenSSL::Netscape::SPKI.new
|
40
|
+
spki.challenge = "RandomString"
|
41
|
+
spki.public_key = key1.public_key
|
42
|
+
spki.sign(key1, OpenSSL::Digest::SHA1.new)
|
43
|
+
assert(spki.verify(spki.public_key))
|
44
|
+
assert(spki.verify(key1.public_key))
|
45
|
+
assert(!spki.verify(key2.public_key))
|
46
|
+
|
47
|
+
der = spki.to_der
|
48
|
+
spki = OpenSSL::Netscape::SPKI.new(der)
|
49
|
+
assert_equal("RandomString", spki.challenge)
|
50
|
+
assert_equal(key1.public_key.to_der, spki.public_key.to_der)
|
51
|
+
assert(spki.verify(spki.public_key))
|
52
|
+
end
|
53
|
+
|
54
|
+
def test_decode_data
|
55
|
+
spki = OpenSSL::Netscape::SPKI.new(@b64)
|
56
|
+
assert_equal(@b64, spki.to_pem)
|
57
|
+
assert_equal(@b64.unpack("m").first, spki.to_der)
|
58
|
+
assert_equal("MozillaIsMyFriend", spki.challenge)
|
59
|
+
assert_equal(OpenSSL::PKey::RSA, spki.public_key.class)
|
60
|
+
|
61
|
+
spki = OpenSSL::Netscape::SPKI.new(@b64.unpack("m").first)
|
62
|
+
assert_equal(@b64, spki.to_pem)
|
63
|
+
assert_equal(@b64.unpack("m").first, spki.to_der)
|
64
|
+
assert_equal("MozillaIsMyFriend", spki.challenge)
|
65
|
+
assert_equal(OpenSSL::PKey::RSA, spki.public_key.class)
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
end
|
@@ -0,0 +1,149 @@
|
|
1
|
+
begin
|
2
|
+
require "openssl"
|
3
|
+
rescue LoadError
|
4
|
+
end
|
5
|
+
require 'test/unit'
|
6
|
+
|
7
|
+
if defined?(OpenSSL)
|
8
|
+
|
9
|
+
require 'socket'
|
10
|
+
dir = File.expand_path(__FILE__)
|
11
|
+
2.times {dir = File.dirname(dir)}
|
12
|
+
$:.replace([File.join(dir, "ruby")] | $:)
|
13
|
+
require 'ut_eof'
|
14
|
+
|
15
|
+
module SSLPair
|
16
|
+
def server
|
17
|
+
host = "127.0.0.1"
|
18
|
+
port = 0
|
19
|
+
ctx = OpenSSL::SSL::SSLContext.new()
|
20
|
+
ctx.ciphers = "ADH"
|
21
|
+
tcps = TCPServer.new(host, port)
|
22
|
+
ssls = OpenSSL::SSL::SSLServer.new(tcps, ctx)
|
23
|
+
return ssls
|
24
|
+
end
|
25
|
+
|
26
|
+
def client(port)
|
27
|
+
host = "127.0.0.1"
|
28
|
+
ctx = OpenSSL::SSL::SSLContext.new()
|
29
|
+
ctx.ciphers = "ADH"
|
30
|
+
s = TCPSocket.new(host, port)
|
31
|
+
ssl = OpenSSL::SSL::SSLSocket.new(s, ctx)
|
32
|
+
ssl.connect
|
33
|
+
ssl.sync_close = true
|
34
|
+
ssl
|
35
|
+
end
|
36
|
+
|
37
|
+
def ssl_pair
|
38
|
+
ssls = server
|
39
|
+
tv = nil
|
40
|
+
th = Thread.new {
|
41
|
+
ns = ssls.accept
|
42
|
+
ssls.close
|
43
|
+
tv = ns
|
44
|
+
}
|
45
|
+
port = ssls.to_io.addr[1]
|
46
|
+
c = client(port)
|
47
|
+
th.join
|
48
|
+
s = tv
|
49
|
+
if block_given?
|
50
|
+
begin
|
51
|
+
yield c, s
|
52
|
+
ensure
|
53
|
+
c.close unless c.closed?
|
54
|
+
s.close unless s.closed?
|
55
|
+
end
|
56
|
+
else
|
57
|
+
return c, s
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
class OpenSSL::TestEOF1 < Test::Unit::TestCase
|
63
|
+
include TestEOF
|
64
|
+
include SSLPair
|
65
|
+
|
66
|
+
def open_file(content)
|
67
|
+
s1, s2 = ssl_pair
|
68
|
+
Thread.new {
|
69
|
+
s2 << content;
|
70
|
+
s2.close
|
71
|
+
}
|
72
|
+
yield s1
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
class OpenSSL::TestEOF2 < Test::Unit::TestCase
|
77
|
+
include TestEOF
|
78
|
+
include SSLPair
|
79
|
+
|
80
|
+
def open_file(content)
|
81
|
+
s1, s2 = ssl_pair
|
82
|
+
Thread.new { s1 << content; s1.close }
|
83
|
+
yield s2
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
class OpenSSL::TestPair < Test::Unit::TestCase
|
88
|
+
include SSLPair
|
89
|
+
|
90
|
+
def test_getc
|
91
|
+
ssl_pair {|s1, s2|
|
92
|
+
s1 << "a"
|
93
|
+
assert_equal(?a, s2.getc)
|
94
|
+
}
|
95
|
+
end
|
96
|
+
|
97
|
+
def test_readpartial
|
98
|
+
ssl_pair {|s1, s2|
|
99
|
+
s2.write "a\nbcd"
|
100
|
+
assert_equal("a\n", s1.gets)
|
101
|
+
assert_equal("bcd", s1.readpartial(10))
|
102
|
+
s2.write "efg"
|
103
|
+
assert_equal("efg", s1.readpartial(10))
|
104
|
+
s2.close
|
105
|
+
assert_raise(EOFError) { s1.readpartial(10) }
|
106
|
+
assert_raise(EOFError) { s1.readpartial(10) }
|
107
|
+
assert_equal("", s1.readpartial(0))
|
108
|
+
}
|
109
|
+
end
|
110
|
+
|
111
|
+
def test_readall
|
112
|
+
ssl_pair {|s1, s2|
|
113
|
+
s2.close
|
114
|
+
assert_equal("", s1.read)
|
115
|
+
}
|
116
|
+
end
|
117
|
+
|
118
|
+
def test_readline
|
119
|
+
ssl_pair {|s1, s2|
|
120
|
+
s2.close
|
121
|
+
assert_raise(EOFError) { s1.readline }
|
122
|
+
}
|
123
|
+
end
|
124
|
+
|
125
|
+
def test_puts_meta
|
126
|
+
ssl_pair {|s1, s2|
|
127
|
+
begin
|
128
|
+
old = $/
|
129
|
+
$/ = '*'
|
130
|
+
s1.puts 'a'
|
131
|
+
ensure
|
132
|
+
$/ = old
|
133
|
+
end
|
134
|
+
s1.close
|
135
|
+
assert_equal("a\n", s2.read)
|
136
|
+
}
|
137
|
+
end
|
138
|
+
|
139
|
+
def test_puts_empty
|
140
|
+
ssl_pair {|s1, s2|
|
141
|
+
s1.puts
|
142
|
+
s1.close
|
143
|
+
assert_equal("\n", s2.read)
|
144
|
+
}
|
145
|
+
end
|
146
|
+
|
147
|
+
end
|
148
|
+
|
149
|
+
end
|