about summary refs log tree commit homepage
path: root/test
diff options
context:
space:
mode:
Diffstat (limited to 'test')
-rw-r--r--test/ipv6_enabled.rb9
-rw-r--r--test/rack_unicorn.rb4
-rw-r--r--test/test_aggregate_pmq.rb1
-rw-r--r--test/test_inet_diag_socket.rb1
-rw-r--r--test/test_last_data_recv.rb58
-rw-r--r--test/test_last_data_recv_unicorn.rb1
-rw-r--r--test/test_linux.rb6
-rw-r--r--test/test_linux_all_tcp_listen_stats.rb1
-rw-r--r--test/test_linux_all_tcp_listen_stats_leak.rb5
-rw-r--r--test/test_linux_ipv6.rb1
-rw-r--r--test/test_linux_middleware.rb1
-rw-r--r--test/test_linux_reuseport_tcp_listen_stats.rb52
-rw-r--r--test/test_middleware.rb1
-rw-r--r--test/test_middleware_unicorn.rb1
-rw-r--r--test/test_middleware_unicorn_ipv6.rb1
-rw-r--r--test/test_raindrops.rb45
-rw-r--r--test/test_raindrops_gc.rb1
-rw-r--r--test/test_struct.rb1
-rw-r--r--test/test_tcp_info.rb9
-rw-r--r--test/test_watcher.rb23
20 files changed, 196 insertions, 26 deletions
diff --git a/test/ipv6_enabled.rb b/test/ipv6_enabled.rb
index f02b48f..84ed9c1 100644
--- a/test/ipv6_enabled.rb
+++ b/test/ipv6_enabled.rb
@@ -1,9 +1,10 @@
+# frozen_string_literal: false
 def ipv6_enabled?
   tmp = TCPServer.new(ENV["TEST_HOST6"] || '::1', 0)
   tmp.close
   true
-  rescue => e
-    warn "skipping IPv6 tests, host does not seem to be IPv6 enabled:"
-    warn "  #{e.class}: #{e}"
-    false
+rescue => e
+  warn "skipping IPv6 tests, host does not seem to be IPv6 enabled:"
+  warn "  #{e.class}: #{e}"
+  false
 end
diff --git a/test/rack_unicorn.rb b/test/rack_unicorn.rb
index 779e8bf..05a7751 100644
--- a/test/rack_unicorn.rb
+++ b/test/rack_unicorn.rb
@@ -1,11 +1,11 @@
 # -*- encoding: binary -*-
+# frozen_string_literal: false
 require "test/unit"
 require "raindrops"
-require "rack"
-require "rack/lobster"
 require "open-uri"
 begin
   require "unicorn"
+  require "rack"
   require "rack/lobster"
 rescue LoadError => e
   warn "W: #{e} skipping test since Rack or Unicorn was not found"
diff --git a/test/test_aggregate_pmq.rb b/test/test_aggregate_pmq.rb
index 692b9bd..24e0277 100644
--- a/test/test_aggregate_pmq.rb
+++ b/test/test_aggregate_pmq.rb
@@ -1,3 +1,4 @@
+# frozen_string_literal: false
 require "test/unit"
 require "raindrops"
 pmq = begin
diff --git a/test/test_inet_diag_socket.rb b/test/test_inet_diag_socket.rb
index a8c9973..e310dff 100644
--- a/test/test_inet_diag_socket.rb
+++ b/test/test_inet_diag_socket.rb
@@ -1,4 +1,5 @@
 # -*- encoding: binary -*-
+# frozen_string_literal: false
 require 'test/unit'
 require 'raindrops'
 require 'fcntl'
diff --git a/test/test_last_data_recv.rb b/test/test_last_data_recv.rb
new file mode 100644
index 0000000..edd00f3
--- /dev/null
+++ b/test/test_last_data_recv.rb
@@ -0,0 +1,58 @@
+# frozen_string_literal: false
+begin
+  require 'aggregate'
+  have_aggregate = true
+rescue LoadError => e
+  warn "W: #{e} skipping #{__FILE__}"
+end
+require 'test/unit'
+require 'raindrops'
+require 'io/wait'
+
+class TestLastDataRecv < Test::Unit::TestCase
+  def setup
+    Raindrops::Aggregate::LastDataRecv.default_aggregate = []
+  end
+
+  def teardown
+    Raindrops::Aggregate::LastDataRecv.default_aggregate = nil
+  end
+
+  def test_accept_nonblock_agg
+    s = Socket.new(:INET, :STREAM, 0)
+    s.listen(128)
+    addr = s.connect_address
+    s.extend(Raindrops::Aggregate::LastDataRecv)
+    s.raindrops_aggregate = []
+    c = Socket.new(:INET, :STREAM, 0)
+    c.connect(addr)
+    c.write '.' # for TCP_DEFER_ACCEPT
+    client, ai = s.accept_nonblock(exception: false)
+    assert client.kind_of?(Socket)
+    assert ai.kind_of?(Addrinfo)
+    assert_equal 1, s.raindrops_aggregate.size
+    assert s.raindrops_aggregate[0].instance_of?(Integer)
+    client, ai = s.accept_nonblock(exception: false)
+    assert_equal :wait_readable, client
+    assert_nil ai
+    assert_equal 1, s.raindrops_aggregate.size
+    assert_raise(IO::WaitReadable) { s.accept_nonblock }
+  end
+
+  def test_accept_nonblock_one
+    s = TCPServer.new('127.0.0.1', 0)
+    s.extend(Raindrops::Aggregate::LastDataRecv)
+    s.raindrops_aggregate = []
+    addr = s.addr
+    c = TCPSocket.new(addr[3], addr[1])
+    c.write '.' # for TCP_DEFER_ACCEPT
+    client = s.accept_nonblock(exception: false)
+    assert client.kind_of?(TCPSocket)
+    assert_equal 1, s.raindrops_aggregate.size
+    assert s.raindrops_aggregate[0].instance_of?(Integer)
+    client = s.accept_nonblock(exception: false)
+    assert_equal :wait_readable, client
+    assert_equal 1, s.raindrops_aggregate.size
+    assert_raise(IO::WaitReadable) { s.accept_nonblock }
+  end
+end if RUBY_PLATFORM =~ /linux/ && have_aggregate
diff --git a/test/test_last_data_recv_unicorn.rb b/test/test_last_data_recv_unicorn.rb
index 60d1be9..55f5e7f 100644
--- a/test/test_last_data_recv_unicorn.rb
+++ b/test/test_last_data_recv_unicorn.rb
@@ -1,4 +1,5 @@
 # -*- encoding: binary -*-
+# frozen_string_literal: false
 require "./test/rack_unicorn"
 require "tempfile"
 require "net/http"
diff --git a/test/test_linux.rb b/test/test_linux.rb
index bfefcc4..5451c3f 100644
--- a/test/test_linux.rb
+++ b/test/test_linux.rb
@@ -1,4 +1,5 @@
 # -*- encoding: binary -*-
+# frozen_string_literal: false
 require 'test/unit'
 require 'tempfile'
 require 'raindrops'
@@ -76,6 +77,7 @@ class TestLinux < Test::Unit::TestCase
 
     assert_equal 0, stats[tmp.path].active
     assert_equal 0, stats[tmp.path].queued
+    us.close
   end
 
   def test_unix_resolves_symlinks
@@ -151,8 +153,8 @@ class TestLinux < Test::Unit::TestCase
     assert_equal 1, stats.size
     assert_equal 0, stats[addr].queued
     assert_equal 1, stats[addr].active
-    ensure
-      nlsock.close
+  ensure
+    nlsock.close
   end
 
   def test_tcp_multi
diff --git a/test/test_linux_all_tcp_listen_stats.rb b/test/test_linux_all_tcp_listen_stats.rb
index ef1f943..12a35ba 100644
--- a/test/test_linux_all_tcp_listen_stats.rb
+++ b/test/test_linux_all_tcp_listen_stats.rb
@@ -1,4 +1,5 @@
 # -*- encoding: binary -*-
+# frozen_string_literal: false
 require 'test/unit'
 require 'socket'
 require 'raindrops'
diff --git a/test/test_linux_all_tcp_listen_stats_leak.rb b/test/test_linux_all_tcp_listen_stats_leak.rb
index 7368220..a3da07e 100644
--- a/test/test_linux_all_tcp_listen_stats_leak.rb
+++ b/test/test_linux_all_tcp_listen_stats_leak.rb
@@ -1,4 +1,5 @@
 # -*- encoding: binary -*-
+# frozen_string_literal: false
 require 'test/unit'
 require 'raindrops'
 require 'socket'
@@ -37,7 +38,7 @@ class TestLinuxAllTcpListenStatsLeak < Test::Unit::TestCase
     end
     cur_kb = rss_kb
     p [ :cur_kb, cur_kb ]
-    ensure
-      s.close
+  ensure
+    s.close
   end
 end if ENV["STRESS"].to_i != 0
diff --git a/test/test_linux_ipv6.rb b/test/test_linux_ipv6.rb
index 9e8730a..9ef8f0a 100644
--- a/test/test_linux_ipv6.rb
+++ b/test/test_linux_ipv6.rb
@@ -1,4 +1,5 @@
 # -*- encoding: binary -*-
+# frozen_string_literal: false
 require 'test/unit'
 require 'tempfile'
 require 'raindrops'
diff --git a/test/test_linux_middleware.rb b/test/test_linux_middleware.rb
index f573225..7ed20df 100644
--- a/test/test_linux_middleware.rb
+++ b/test/test_linux_middleware.rb
@@ -1,4 +1,5 @@
 # -*- encoding: binary -*-
+# frozen_string_literal: false
 require 'test/unit'
 require 'tempfile'
 require 'raindrops'
diff --git a/test/test_linux_reuseport_tcp_listen_stats.rb b/test/test_linux_reuseport_tcp_listen_stats.rb
new file mode 100644
index 0000000..82083e0
--- /dev/null
+++ b/test/test_linux_reuseport_tcp_listen_stats.rb
@@ -0,0 +1,52 @@
+# -*- encoding: binary -*-
+# frozen_string_literal: false
+require "./test/rack_unicorn"
+require 'test/unit'
+require 'socket'
+require 'raindrops'
+$stderr.sync = $stdout.sync = true
+
+class TestLinuxReuseportTcpListenStats < Test::Unit::TestCase
+  include Raindrops::Linux
+  include Unicorn::SocketHelper
+  TEST_ADDR = ENV['UNICORN_TEST_ADDR'] || '127.0.0.1'
+  DEFAULT_BACKLOG = 10
+
+  def setup
+    @socks = []
+  end
+
+  def teardown
+    @socks.each { |io| io.closed? or io.close }
+  end
+
+  def new_socket_server(**kwargs)
+    s = new_tcp_server TEST_ADDR, kwargs[:port] || 0, kwargs
+    s.listen(kwargs[:backlog] || DEFAULT_BACKLOG)
+    @socks << s
+    [ s, s.addr[1] ]
+  end
+
+  def new_client(port)
+    s = TCPSocket.new("127.0.0.1", port)
+    @socks << s
+    s
+  end
+
+  def test_reuseport_queue_stats
+    listeners = 10
+    _, port = new_socket_server(reuseport: true)
+    addr = "#{TEST_ADDR}:#{port}"
+    (listeners - 1).times do
+      new_socket_server(reuseport: true, port: port)
+    end
+
+    listeners.times do |i|
+      all = Raindrops::Linux.tcp_listener_stats
+      assert_equal [0, i], all[addr].to_a
+      new_client(port)
+      all = Raindrops::Linux.tcp_listener_stats
+      assert_equal [0, i+1], all[addr].to_a
+    end
+  end
+end if RUBY_PLATFORM =~ /linux/ && Object.const_defined?(:Unicorn)
diff --git a/test/test_middleware.rb b/test/test_middleware.rb
index 56ce346..5694cd4 100644
--- a/test/test_middleware.rb
+++ b/test/test_middleware.rb
@@ -1,4 +1,5 @@
 # -*- encoding: binary -*-
+# frozen_string_literal: false
 require 'test/unit'
 require 'raindrops'
 
diff --git a/test/test_middleware_unicorn.rb b/test/test_middleware_unicorn.rb
index 6730d4b..53226a9 100644
--- a/test/test_middleware_unicorn.rb
+++ b/test/test_middleware_unicorn.rb
@@ -1,4 +1,5 @@
 # -*- encoding: binary -*-
+# frozen_string_literal: false
 require "./test/rack_unicorn"
 $stderr.sync = $stdout.sync = true
 
diff --git a/test/test_middleware_unicorn_ipv6.rb b/test/test_middleware_unicorn_ipv6.rb
index 3d6862c..99ecb7f 100644
--- a/test/test_middleware_unicorn_ipv6.rb
+++ b/test/test_middleware_unicorn_ipv6.rb
@@ -1,4 +1,5 @@
 # -*- encoding: binary -*-
+# frozen_string_literal: false
 require "./test/rack_unicorn"
 require "./test/ipv6_enabled"
 $stderr.sync = $stdout.sync = true
diff --git a/test/test_raindrops.rb b/test/test_raindrops.rb
index 67089b7..165766e 100644
--- a/test/test_raindrops.rb
+++ b/test/test_raindrops.rb
@@ -1,6 +1,8 @@
 # -*- encoding: binary -*-
+# frozen_string_literal: false
 require 'test/unit'
 require 'raindrops'
+require 'tempfile'
 
 class TestRaindrops < Test::Unit::TestCase
 
@@ -134,7 +136,7 @@ class TestRaindrops < Test::Unit::TestCase
     assert_equal 0, rd[rd.capa - 1]
     assert_equal 1, rd.incr(rd.capa - 1)
     assert_raises(ArgumentError) { rd[rd.capa] }
-    rescue RangeError
+  rescue RangeError
   end # if RUBY_PLATFORM =~ /linux/
 
   def test_evaporate
@@ -162,4 +164,45 @@ class TestRaindrops < Test::Unit::TestCase
     assert status.success?
     assert_equal [ 1, 2 ], tmp.to_ary
   end
+
+  def test_io_backed
+    file = Tempfile.new('test_io_backed')
+    rd = Raindrops.new(4, io: file, zero: true)
+    rd[0] = 123
+    rd[1] = 456
+
+    assert_equal 123, rd[0]
+    assert_equal 456, rd[1]
+
+    rd.evaporate!
+
+    file.rewind
+    data = file.read
+    assert_equal 123, data.unpack('L!')[0]
+    assert_equal 456, data[Raindrops::SIZE..data.size].unpack('L!')[0]
+  end
+
+  def test_io_backed_reuse
+    file = Tempfile.new('test_io_backed')
+    rd = Raindrops.new(4, io: file, zero: true)
+    rd[0] = 123
+    rd[1] = 456
+    rd.evaporate!
+
+    rd = Raindrops.new(4, io: file, zero: false)
+    assert_equal 123, rd[0]
+    assert_equal 456, rd[1]
+  end
+
+  def test_iobacked_noreuse
+    file = Tempfile.new('test_io_backed')
+    rd = Raindrops.new(4, io: file, zero: true)
+    rd[0] = 123
+    rd[1] = 456
+    rd.evaporate!
+
+    rd = Raindrops.new(4, io: file, zero: true)
+    assert_equal 0, rd[0]
+    assert_equal 0, rd[1]
+  end
 end
diff --git a/test/test_raindrops_gc.rb b/test/test_raindrops_gc.rb
index 2098129..a9f2026 100644
--- a/test/test_raindrops_gc.rb
+++ b/test/test_raindrops_gc.rb
@@ -1,4 +1,5 @@
 # -*- encoding: binary -*-
+# frozen_string_literal: false
 require 'test/unit'
 require 'raindrops'
 
diff --git a/test/test_struct.rb b/test/test_struct.rb
index 9792d5b..abf0c59 100644
--- a/test/test_struct.rb
+++ b/test/test_struct.rb
@@ -1,3 +1,4 @@
+# frozen_string_literal: false
 require 'test/unit'
 require 'raindrops'
 
diff --git a/test/test_tcp_info.rb b/test/test_tcp_info.rb
index b107565..2dc5c50 100644
--- a/test/test_tcp_info.rb
+++ b/test/test_tcp_info.rb
@@ -1,4 +1,5 @@
 # -*- encoding: binary -*-
+# frozen_string_literal: false
 require 'test/unit'
 require 'tempfile'
 require 'raindrops'
@@ -60,10 +61,10 @@ class TestTCP_Info < Test::Unit::TestCase
     a = s.accept
     i = Raindrops::TCP_Info.new(a)
     assert i.last_data_recv >= delay_ms, "#{i.last_data_recv} < #{delay_ms}"
-    ensure
-      c.close if c
-      a.close if a
-      s.close
+  ensure
+    c.close if c
+    a.close if a
+    s.close
   end
 
   def test_tcp_server_state_closed
diff --git a/test/test_watcher.rb b/test/test_watcher.rb
index d1e4d15..3cf667c 100644
--- a/test/test_watcher.rb
+++ b/test/test_watcher.rb
@@ -1,9 +1,10 @@
 # -*- encoding: binary -*-
+# frozen_string_literal: false
 require "test/unit"
-require "rack"
 require "raindrops"
 begin
   require 'aggregate'
+  require 'rack'
 rescue LoadError => e
   warn "W: #{e} skipping #{__FILE__}"
 end
@@ -118,28 +119,28 @@ class TestWatcher < Test::Unit::TestCase
 
   def test_x_current_header
     env = @req.class.env_for "/active/#@addr.txt"
-    status, headers, body = @app.call(env)
+    _status, headers, _body = @app.call(env)
     assert_equal "0", headers["X-Current"], headers.inspect
 
     env = @req.class.env_for "/queued/#@addr.txt"
-    status, headers, body = @app.call(env)
+    _status, headers, _body = @app.call(env)
     assert_equal "1", headers["X-Current"], headers.inspect
 
     @ios << @srv.accept
     sleep 0.1
 
     env = @req.class.env_for "/queued/#@addr.txt"
-    status, headers, body = @app.call(env)
+    _status, headers, _body = @app.call(env)
     assert_equal "0", headers["X-Current"], headers.inspect
 
     env = @req.class.env_for "/active/#@addr.txt"
-    status, headers, body = @app.call(env)
+    _status, headers, _body = @app.call(env)
     assert_equal "1", headers["X-Current"], headers.inspect
   end
 
   def test_peaks
     env = @req.class.env_for "/active/#@addr.txt"
-    status, headers, body = @app.call(env.dup)
+    _status, headers, _body = @app.call(env.dup)
     start = headers["X-First-Peak-At"]
     assert headers["X-First-Peak-At"], headers.inspect
     assert headers["X-Last-Peak-At"], headers.inspect
@@ -148,14 +149,14 @@ class TestWatcher < Test::Unit::TestCase
     before = headers["X-Last-Peak-At"]
 
     env = @req.class.env_for "/queued/#@addr.txt"
-    status, headers, body = @app.call(env)
+    _status, headers, _body = @app.call(env)
     assert_nothing_raised { Time.parse(headers["X-First-Peak-At"]) }
     assert_nothing_raised { Time.parse(headers["X-Last-Peak-At"]) }
     assert_equal before, headers["X-Last-Peak-At"], "should not change"
 
     sleep 2
     env = @req.class.env_for "/active/#@addr.txt"
-    status, headers, body = @app.call(env.dup)
+    _status, headers, _body = @app.call(env.dup)
     assert_equal before, headers["X-Last-Peak-At"], headers.inspect
 
     @ios << @srv.accept
@@ -167,7 +168,7 @@ class TestWatcher < Test::Unit::TestCase
     end
     sleep 0.1
     env = @req.class.env_for "/queued/#@addr.txt"
-    status, headers, body = @app.call(env.dup)
+    _status, headers, _body = @app.call(env.dup)
     assert headers["X-Last-Peak-At"], headers.inspect
     assert_nothing_raised { Time.parse(headers["X-Last-Peak-At"]) }
     assert before != headers["X-Last-Peak-At"]
@@ -177,10 +178,10 @@ class TestWatcher < Test::Unit::TestCase
     sleep 2
 
     env = @req.class.env_for "/queued/#@addr.txt"
-    status, headers, body = @app.call(env)
+    _status, headers, _body = @app.call(env)
     assert_equal "0", headers["X-Current"]
     assert_nothing_raised { Time.parse(headers["X-Last-Peak-At"]) }
     assert_equal queued_before, headers["X-Last-Peak-At"], "should not change"
     assert_equal start, headers["X-First-Peak-At"]
   end
-end if RUBY_PLATFORM =~ /linux/ && defined?(Aggregate)
+end if RUBY_PLATFORM =~ /linux/ && defined?(Aggregate) && defined?(Rack)