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 RUBY_PLATFORM =~ /linux/ and
22 @srv.setsockopt(Socket::IPPROTO_TCP, TCP_CORK, 1)
23 RUBY_PLATFORM =~ /freebsd/ and
24 @srv.setsockopt(Socket::IPPROTO_TCP, TCP_NOPUSH, 1)
28 def test_autopush_accessors
30 opt = RUBY_PLATFORM =~ /freebsd/ ? TCP_NOPUSH : TCP_CORK
31 s = Kgio::TCPSocket.new(@host, @port)
32 assert_equal 0, s.getsockopt(Socket::IPPROTO_TCP, opt).unpack('i')[0]
33 assert ! s.kgio_autopush?
34 s.kgio_autopush = true
35 assert s.kgio_autopush?
37 assert_equal :wait_readable, s.kgio_tryread(1)
38 assert s.kgio_autopush?
39 val = s.getsockopt(Socket::IPPROTO_TCP, opt).unpack('i')[0]
40 assert_operator val, :>, 0, "#{opt}=#{val} (#{RUBY_PLATFORM})"
43 def test_autopush_true_unix
45 tmp = Tempfile.new('kgio_unix')
48 @srv = Kgio::UNIXServer.new(@path)
49 @rd = Kgio::UNIXSocket.new(@path)
52 io, err = Strace.me { @wr = @srv.kgio_accept }
58 rc = @wr.kgio_tryread 666
62 assert lines.grep(/TCP_CORK/).empty?, lines.inspect
64 @wr = @srv.kgio_accept
67 rc = @wr.kgio_tryread 666
69 assert_equal "HI\n", @rd.kgio_read(3)
71 assert(diff < 0.200, "nopush on UNIX sockets? diff=#{diff} > 200ms")
72 assert_equal :wait_readable, rc
74 File.unlink(@path) rescue nil
77 def test_autopush_false
79 assert_equal false, Kgio.autopush?
81 @wr = Kgio::TCPSocket.new(@host, @port)
83 io, err = Strace.me { @rd = @srv.kgio_accept }
86 assert lines.grep(/TCP_CORK/).empty?, lines.inspect
87 assert_equal 1, @rd.getsockopt(Socket::SOL_TCP, TCP_CORK).unpack("i")[0]
89 @rd = @srv.kgio_accept
95 @wr.kgio_read(3, rbuf)
97 assert(diff >= 0.190, "nopush broken? diff=#{diff} > 200ms")
98 assert_equal "HI\n", rbuf
101 def test_autopush_true
103 assert_equal true, Kgio.autopush?
104 @wr = Kgio::TCPSocket.new(@host, @port)
107 io, err = Strace.me { @rd = @srv.kgio_accept }
110 assert_equal 1, lines.grep(/TCP_CORK/).size, lines.inspect
111 assert_equal 1, @rd.getsockopt(Socket::SOL_TCP, TCP_CORK).unpack("i")[0]
113 @rd = @srv.kgio_accept
119 io, err = Strace.me { @rd.kgio_read(3, rbuf) }
122 assert lines.grep(/TCP_CORK/).empty?, lines.inspect
123 assert_equal "HI\n", rbuf
125 assert_equal "HI\n", @rd.kgio_read(3, rbuf)
129 @rd.kgio_write "HI2U2\n"
130 @rd.kgio_write "HOW\n"
134 io, err = Strace.me { rc = @rd.kgio_tryread(666) }
136 rc = @rd.kgio_tryread(666)
139 @wr.readpartial(666, rbuf)
140 rbuf == "HI2U2\nHOW\n" or warn "rbuf=#{rbuf.inspect} looking bad?"
142 assert(diff < 0.200, "time diff=#{diff} >= 200ms")
143 assert_equal :wait_readable, rc
147 assert_equal 2, lines.grep(/TCP_CORK/).size, lines.inspect
152 @wr = Kgio::TCPSocket.new(@host, @port)
154 io, err = Strace.me { @rd = @srv.kgio_accept }
157 assert lines.grep(/TCP_CORK/).empty?,"optimization fail: #{lines.inspect}"
158 assert_equal 1, @rd.getsockopt(Socket::SOL_TCP, TCP_CORK).unpack("i")[0]
163 Kgio.autopush = false
165 end if RUBY_PLATFORM =~ /linux|freebsd/