1begin 2 require "socket" 3 require "test/unit" 4rescue LoadError 5end 6 7class TestSocket_BasicSocket < Test::Unit::TestCase 8 def inet_stream 9 sock = Socket.new(Socket::AF_INET, Socket::SOCK_STREAM, 0) 10 yield sock 11 ensure 12 assert_raise(IOError) {sock.close} 13 end 14 15 def test_getsockopt 16 inet_stream do |s| 17 n = s.getsockopt(Socket::SOL_SOCKET, Socket::SO_TYPE) 18 assert_equal([Socket::SOCK_STREAM].pack("i"), n.data) 19 20 n = s.getsockopt("SOL_SOCKET", "SO_TYPE") 21 assert_equal([Socket::SOCK_STREAM].pack("i"), n.data) 22 23 n = s.getsockopt(:SOL_SOCKET, :SO_TYPE) 24 assert_equal([Socket::SOCK_STREAM].pack("i"), n.data) 25 26 n = s.getsockopt(:SOCKET, :TYPE) 27 assert_equal([Socket::SOCK_STREAM].pack("i"), n.data) 28 29 n = s.getsockopt(Socket::SOL_SOCKET, Socket::SO_ERROR) 30 assert_equal([0].pack("i"), n.data) 31 32 val = Object.new 33 class << val; self end.send(:define_method, :to_int) { 34 s.close 35 Socket::SO_TYPE 36 } 37 assert_raise(IOError) { 38 n = s.getsockopt(Socket::SOL_SOCKET, val) 39 } 40 end 41 end 42 43 def test_setsockopt 44 s = nil 45 linger = [0, 0].pack("ii") 46 47 val = Object.new 48 class << val; self end.send(:define_method, :to_str) { 49 s.close 50 linger 51 } 52 inet_stream do |sock| 53 s = sock 54 assert_equal(0, s.setsockopt(Socket::SOL_SOCKET, Socket::SO_LINGER, linger)) 55 56 assert_raise(IOError, "[ruby-dev:25039]") { 57 s.setsockopt(Socket::SOL_SOCKET, Socket::SO_LINGER, val) 58 } 59 end 60 61 val = Object.new 62 class << val; self end.send(:define_method, :to_int) { 63 s.close 64 Socket::SO_LINGER 65 } 66 inet_stream do |sock| 67 s = sock 68 assert_raise(IOError) { 69 s.setsockopt(Socket::SOL_SOCKET, val, linger) 70 } 71 end 72 end 73 74 def test_listen 75 s = nil 76 log = Object.new 77 class << log; self end.send(:define_method, :to_int) { 78 s.close 79 2 80 } 81 inet_stream do |sock| 82 s = sock 83 assert_raise(IOError) { 84 s.listen(log) 85 } 86 end 87 end 88end if defined?(BasicSocket) 89