3 RUBY_PLATFORM =~ /linux/ and require 'strace'
7 class TestNoPushSmart < Test::Unit::TestCase
11 Kgio.nopush_smart = false
12 assert_equal false, Kgio.nopush_smart?
14 @host = ENV["TEST_HOST"] || '127.0.0.1'
15 @srv = Kgio::TCPServer.new(@host, 0)
16 assert_nothing_raised {
17 @srv.setsockopt(Socket::SOL_TCP, TCP_CORK, 1)
18 } if RUBY_PLATFORM =~ /linux/
22 def test_nopush_smart_true_unix
23 Kgio.nopush_smart = true
24 tmp = Tempfile.new('kgio_unix')
28 @srv = Kgio::UNIXServer.new(@path)
29 @rd = Kgio::UNIXSocket.new(@path)
30 io, err = Strace.me { @wr = @srv.kgio_accept }
35 rc = @wr.kgio_tryread 666
39 assert lines.grep(/TCP_CORK/).empty?, lines.inspect
40 assert_equal :wait_readable, rc
42 File.unlink(@path) rescue nil
45 def test_nopush_smart_false
46 Kgio.nopush_smart = nil
47 assert_equal false, Kgio.nopush_smart?
49 @wr = Kgio::TCPSocket.new(@host, @port)
50 io, err = Strace.me { @rd = @srv.kgio_accept }
53 assert lines.grep(/TCP_CORK/).empty?, lines.inspect
54 assert_equal 1, @rd.getsockopt(Socket::SOL_TCP, TCP_CORK).unpack("i")[0]
59 @wr.kgio_read(3, rbuf)
61 assert(diff >= 0.200, "TCP_CORK broken? diff=#{diff} > 200ms")
62 assert_equal "HI\n", rbuf
63 end if RUBY_PLATFORM =~ /linux/
65 def test_nopush_smart_true
66 Kgio.nopush_smart = true
67 assert_equal true, Kgio.nopush_smart?
68 @wr = Kgio::TCPSocket.new(@host, @port)
69 io, err = Strace.me { @rd = @srv.kgio_accept }
72 assert_equal 1, lines.grep(/TCP_CORK/).size, lines.inspect
73 assert_equal 1, @rd.getsockopt(Socket::SOL_TCP, TCP_CORK).unpack("i")[0]
77 io, err = Strace.me { @rd.kgio_read(3, rbuf) }
80 assert lines.grep(/TCP_CORK/).empty?, lines.inspect
81 assert_equal "HI\n", rbuf
84 @rd.kgio_write "HI2U2\n"
85 @rd.kgio_write "HOW\n"
87 io, err = Strace.me { rc = @rd.kgio_tryread(666) }
88 @wr.readpartial(666, rbuf)
89 rbuf == "HI2U2\nHOW\n" or warn "rbuf=#{rbuf.inspect} looking bad?"
91 assert(diff < 0.200, "time diff=#{diff} >= 200ms")
92 assert_equal :wait_readable, rc
95 assert_equal 2, lines.grep(/TCP_CORK/).size, lines.inspect
96 assert_nothing_raised { @wr.close }
97 assert_nothing_raised { @rd.close }
99 @wr = Kgio::TCPSocket.new(@host, @port)
100 io, err = Strace.me { @rd = @srv.kgio_accept }
103 assert lines.grep(/TCP_CORK/).empty?, "optimization fail: #{lines.inspect}"
104 assert_equal 1, @rd.getsockopt(Socket::SOL_TCP, TCP_CORK).unpack("i")[0]
105 end if RUBY_PLATFORM =~ /linux/
108 Kgio.nopush_smart = false