5 RUBY_PLATFORM =~ /linux/ and require 'strace'
11 class TestAutopush < Test::Unit::TestCase
17 assert_equal false, Kgio.autopush?
19 @host = ENV["TEST_HOST"] || '127.0.0.1'
20 @srv = Kgio::TCPServer.new(@host, 0)
21 assert_nothing_raised {
22 @srv.setsockopt(Socket::IPPROTO_TCP, TCP_CORK, 1)
23 } if RUBY_PLATFORM =~ /linux/
24 assert_nothing_raised {
25 @srv.setsockopt(Socket::IPPROTO_TCP, TCP_NOPUSH, 1)
26 } if RUBY_PLATFORM =~ /freebsd/
30 def test_autopush_accessors
32 opt = RUBY_PLATFORM =~ /freebsd/ ? TCP_NOPUSH : TCP_CORK
33 s = Kgio::TCPSocket.new(@host, @port)
34 assert_equal 0, s.getsockopt(Socket::IPPROTO_TCP, opt).unpack('i')[0]
35 assert ! s.kgio_autopush?
36 s.kgio_autopush = true
37 assert s.kgio_autopush?
38 assert_nothing_raised { s.kgio_write 'asdf' }
39 assert_equal :wait_readable, s.kgio_tryread(1)
40 assert s.kgio_autopush?
41 assert_equal 1, s.getsockopt(Socket::IPPROTO_TCP, opt).unpack('i')[0]
44 def test_autopush_true_unix
46 tmp = Tempfile.new('kgio_unix')
50 @srv = Kgio::UNIXServer.new(@path)
51 @rd = Kgio::UNIXSocket.new(@path)
54 io, err = Strace.me { @wr = @srv.kgio_accept }
60 rc = @wr.kgio_tryread 666
64 assert lines.grep(/TCP_CORK/).empty?, lines.inspect
66 assert_nothing_raised do
67 @wr = @srv.kgio_accept
70 rc = @wr.kgio_tryread 666
73 assert_equal "HI\n", @rd.kgio_read(3)
75 assert(diff < 0.200, "nopush on UNIX sockets? diff=#{diff} > 200ms")
76 assert_equal :wait_readable, rc
78 File.unlink(@path) rescue nil
81 def test_autopush_false
83 assert_equal false, Kgio.autopush?
85 @wr = Kgio::TCPSocket.new(@host, @port)
87 io, err = Strace.me { @rd = @srv.kgio_accept }
90 assert lines.grep(/TCP_CORK/).empty?, lines.inspect
91 assert_equal 1, @rd.getsockopt(Socket::SOL_TCP, TCP_CORK).unpack("i")[0]
93 @rd = @srv.kgio_accept
99 @wr.kgio_read(3, rbuf)
101 assert(diff >= 0.190, "nopush broken? diff=#{diff} > 200ms")
102 assert_equal "HI\n", rbuf
105 def test_autopush_true
107 assert_equal true, Kgio.autopush?
108 @wr = Kgio::TCPSocket.new(@host, @port)
111 io, err = Strace.me { @rd = @srv.kgio_accept }
114 assert_equal 1, lines.grep(/TCP_CORK/).size, lines.inspect
115 assert_equal 1, @rd.getsockopt(Socket::SOL_TCP, TCP_CORK).unpack("i")[0]
117 @rd = @srv.kgio_accept
123 io, err = Strace.me { @rd.kgio_read(3, rbuf) }
126 assert lines.grep(/TCP_CORK/).empty?, lines.inspect
127 assert_equal "HI\n", rbuf
129 assert_equal "HI\n", @rd.kgio_read(3, rbuf)
133 @rd.kgio_write "HI2U2\n"
134 @rd.kgio_write "HOW\n"
138 io, err = Strace.me { rc = @rd.kgio_tryread(666) }
140 rc = @rd.kgio_tryread(666)
143 @wr.readpartial(666, rbuf)
144 rbuf == "HI2U2\nHOW\n" or warn "rbuf=#{rbuf.inspect} looking bad?"
146 assert(diff < 0.200, "time diff=#{diff} >= 200ms")
147 assert_equal :wait_readable, rc
151 assert_equal 2, lines.grep(/TCP_CORK/).size, lines.inspect
153 assert_nothing_raised { @wr.close }
154 assert_nothing_raised { @rd.close }
156 @wr = Kgio::TCPSocket.new(@host, @port)
158 io, err = Strace.me { @rd = @srv.kgio_accept }
161 assert lines.grep(/TCP_CORK/).empty?,"optimization fail: #{lines.inspect}"
162 assert_equal 1, @rd.getsockopt(Socket::SOL_TCP, TCP_CORK).unpack("i")[0]
167 Kgio.autopush = false
169 end if RUBY_PLATFORM =~ /linux|freebsd/