1 # Copyright (C) 2015 all contributors <kgio-public@bogomips.org>
2 # License: LGPLv2.1 or later (https://www.gnu.org/licenses/lgpl-2.1.txt)
3 # using this code is not recommended, for backwards compatibility only
8 RUBY_PLATFORM =~ /linux/ and require 'strace'
14 class TestAutopush < Test::Unit::TestCase
20 assert_equal false, Kgio.autopush?
22 @host = ENV["TEST_HOST"] || '127.0.0.1'
23 @srv = Kgio::TCPServer.new(@host, 0)
24 RUBY_PLATFORM =~ /linux/ and
25 @srv.setsockopt(Socket::IPPROTO_TCP, TCP_CORK, 1)
26 RUBY_PLATFORM =~ /freebsd/ and
27 @srv.setsockopt(Socket::IPPROTO_TCP, TCP_NOPUSH, 1)
31 def test_autopush_accessors
33 opt = RUBY_PLATFORM =~ /freebsd/ ? TCP_NOPUSH : TCP_CORK
34 s = Kgio::TCPSocket.new(@host, @port)
35 assert_equal 0, s.getsockopt(Socket::IPPROTO_TCP, opt).unpack('i')[0]
36 assert ! s.kgio_autopush?
37 s.kgio_autopush = true
38 assert s.kgio_autopush?
40 assert_equal :wait_readable, s.kgio_tryread(1)
41 assert s.kgio_autopush?
42 val = s.getsockopt(Socket::IPPROTO_TCP, opt).unpack('i')[0]
43 assert_operator val, :>, 0, "#{opt}=#{val} (#{RUBY_PLATFORM})"
46 def test_autopush_true_unix
48 tmp = Tempfile.new('kgio_unix')
51 @srv = Kgio::UNIXServer.new(@path)
52 @rd = Kgio::UNIXSocket.new(@path)
55 io, err = Strace.me { @wr = @srv.kgio_accept }
61 rc = @wr.kgio_tryread 666
65 assert lines.grep(/TCP_CORK/).empty?, lines.inspect
67 @wr = @srv.kgio_accept
70 rc = @wr.kgio_tryread 666
72 assert_equal "HI\n", @rd.kgio_read(3)
74 assert(diff < 0.200, "nopush on UNIX sockets? diff=#{diff} > 200ms")
75 assert_equal :wait_readable, rc
77 File.unlink(@path) rescue nil
80 def test_autopush_false
82 assert_equal false, Kgio.autopush?
84 @wr = Kgio::TCPSocket.new(@host, @port)
86 io, err = Strace.me { @rd = @srv.kgio_accept }
89 assert lines.grep(/TCP_CORK/).empty?, lines.inspect
90 assert_equal 1, @rd.getsockopt(Socket::SOL_TCP, TCP_CORK).unpack("i")[0]
92 @rd = @srv.kgio_accept
98 @wr.kgio_read(3, rbuf)
100 assert(diff >= 0.190, "nopush broken? diff=#{diff} > 200ms")
101 assert_equal "HI\n", rbuf
104 def test_autopush_true
106 assert_equal true, Kgio.autopush?
107 @wr = Kgio::TCPSocket.new(@host, @port)
110 io, err = Strace.me { @rd = @srv.kgio_accept }
113 assert_equal 1, lines.grep(/TCP_CORK/).size, lines.inspect
114 assert_equal 1, @rd.getsockopt(Socket::SOL_TCP, TCP_CORK).unpack("i")[0]
116 @rd = @srv.kgio_accept
122 io, err = Strace.me { @rd.kgio_read(3, rbuf) }
125 assert lines.grep(/TCP_CORK/).empty?, lines.inspect
126 assert_equal "HI\n", rbuf
128 assert_equal "HI\n", @rd.kgio_read(3, rbuf)
132 @rd.kgio_write "HI2U2\n"
133 @rd.kgio_write "HOW\n"
137 io, err = Strace.me { rc = @rd.kgio_tryread(666) }
139 rc = @rd.kgio_tryread(666)
142 @wr.readpartial(666, rbuf)
143 rbuf == "HI2U2\nHOW\n" or warn "rbuf=#{rbuf.inspect} looking bad?"
145 assert(diff < 0.200, "time diff=#{diff} >= 200ms")
146 assert_equal :wait_readable, rc
150 assert_equal 2, lines.grep(/TCP_CORK/).size, lines.inspect
155 @wr = Kgio::TCPSocket.new(@host, @port)
157 io, err = Strace.me { @rd = @srv.kgio_accept }
160 assert lines.grep(/TCP_CORK/).empty?,"optimization fail: #{lines.inspect}"
161 assert_equal 1, @rd.getsockopt(Socket::SOL_TCP, TCP_CORK).unpack("i")[0]
166 Kgio.autopush = false
167 assert_equal false, Kgio.autopush?
169 end if RUBY_PLATFORM =~ /linux|freebsd/