README: update with extra disclaimer
[raindrops.git] / test / test_linux_all_tcp_listen_stats_leak.rb
bloba3da07e77f7cd03ba0ae8bce160ba919ce9296fd
1 # -*- encoding: binary -*-
2 # frozen_string_literal: false
3 require 'test/unit'
4 require 'raindrops'
5 require 'socket'
6 require 'benchmark'
7 $stderr.sync = $stdout.sync = true
9 class TestLinuxAllTcpListenStatsLeak < Test::Unit::TestCase
11   TEST_ADDR = ENV['UNICORN_TEST_ADDR'] || '127.0.0.1'
14   def rss_kb
15     File.readlines("/proc/#$$/status").grep(/VmRSS:/)[0].split(/\s+/)[1].to_i
16   end
17   def test_leak
18     s = TCPServer.new(TEST_ADDR, 0)
19     start_kb = rss_kb
20     p [ :start_kb, start_kb ]
21     assert_nothing_raised do
22       p(Benchmark.measure {
23         1000.times { Raindrops::Linux.all_tcp_listener_stats }
24       })
25     end
26     cur_kb = rss_kb
27     p [ :cur_kb, cur_kb ]
28     now = Time.now.to_i
29     fin = now + 60
30     assert_nothing_raised do
31       1000000000.times { |i|
32         if (i % 1024) == 0
33           now = Time.now.to_i
34           break if now > fin
35         end
36         Raindrops::Linux.all_tcp_listener_stats
37       }
38     end
39     cur_kb = rss_kb
40     p [ :cur_kb, cur_kb ]
41   ensure
42     s.close
43   end
44 end if ENV["STRESS"].to_i != 0