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