* io.c (rb_open_file): encoding in mode string was ignored if perm is
[ruby-svn.git] / test / socket / test_socket.rb
blob90f1037db8e5402631e9bcc12c6f207297f92d49
1 begin
2   require "socket"
3   require "test/unit"
4 rescue LoadError
5 end
7 class TestBasicSocket < 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
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)
19       n = s.getsockopt(Socket::SOL_SOCKET, Socket::SO_ERROR)
20       assert_equal([0].pack("i"), n)
21       val = Object.new
22       class << val; self end.send(:define_method, :to_int) {
23         s.close
24         Socket::SO_TYPE
25       }
26       assert_raise(IOError) {
27         n = s.getsockopt(Socket::SOL_SOCKET, val)
28       }
29     end
30   end
32   def test_setsockopt
33     s = nil
34     linger = [0, 0].pack("ii")
36     val = Object.new
37     class << val; self end.send(:define_method, :to_str) {
38       s.close
39       linger
40     }
41     inet_stream do |sock|
42       s = sock
43       assert_equal(0, s.setsockopt(Socket::SOL_SOCKET, Socket::SO_LINGER, linger))
45       assert_raise(IOError, "[ruby-dev:25039]") {
46         s.setsockopt(Socket::SOL_SOCKET, Socket::SO_LINGER, val)
47       }
48     end
50     val = Object.new
51     class << val; self end.send(:define_method, :to_int) {
52       s.close
53       Socket::SO_LINGER
54     }
55     inet_stream do |sock|
56       s = sock
57       assert_raise(IOError) {
58         s.setsockopt(Socket::SOL_SOCKET, val, linger)
59       }
60     end
61   end
63   def test_listen
64     s = nil
65     log = Object.new
66     class << log; self end.send(:define_method, :to_int) {
67       s.close
68       2
69     }
70     inet_stream do |sock|
71       s = sock
72       assert_raise(IOError) {
73         s.listen(log)
74       }
75     end
76   end
77 end if defined?(Socket)
79 class TestSocket < Test::Unit::TestCase
80   def test_unpack_sockaddr
81     sockaddr_in = Socket.sockaddr_in(80, "")
82     assert_raise(ArgumentError) { Socket.unpack_sockaddr_un(sockaddr_in) }
83     sockaddr_un = Socket.sockaddr_un("/tmp/s")
84     assert_raise(ArgumentError) { Socket.unpack_sockaddr_in(sockaddr_un) }
85   end if Socket.respond_to?(:sockaddr_un)
87   def test_sysaccept
88     serv = Socket.new(Socket::AF_INET, Socket::SOCK_STREAM, 0)
89     serv.bind(Socket.sockaddr_in(0, "127.0.0.1"))
90     serv.listen 5
91     c = Socket.new(Socket::AF_INET, Socket::SOCK_STREAM, 0)
92     c.connect(serv.getsockname)
93     fd, peeraddr = serv.sysaccept
94     assert_equal(c.getsockname, peeraddr)
95   ensure
96     serv.close if serv
97     c.close if c
98     IO.for_fd(fd).close if fd
99   end
100 end if defined?(Socket)