1 # -*- encoding: binary -*-
2 # frozen_string_literal: false
8 require "./test/ipv6_enabled"
9 $stderr.sync = $stdout.sync = true
11 class TestLinuxIPv6 < Test::Unit::TestCase
12 include Raindrops::Linux
14 TEST_ADDR = ENV["TEST_HOST6"] || "::1"
21 @to_close.each { |io| io.close unless io.closed? }
25 s = TCPServer.new(TEST_ADDR, 0)
27 addr = "[#{TEST_ADDR}]:#{port}"
29 stats = tcp_listener_stats(addrs)
30 assert_equal 1, stats.size
31 assert_equal 0, stats[addr].queued
32 assert_equal 0, stats[addr].active
34 @to_close << TCPSocket.new(TEST_ADDR, port)
35 stats = tcp_listener_stats(addrs)
36 assert_equal 1, stats.size
37 assert_equal 1, stats[addr].queued
38 assert_equal 0, stats[addr].active
41 stats = tcp_listener_stats(addrs)
42 assert_equal 1, stats.size
43 assert_equal 0, stats[addr].queued
44 assert_equal 1, stats[addr].active
48 s1 = TCPServer.new(TEST_ADDR, 0)
49 s2 = TCPServer.new(TEST_ADDR, 0)
50 port1, port2 = s1.addr[1], s2.addr[1]
51 addr1, addr2 = "[#{TEST_ADDR}]:#{port1}", "[#{TEST_ADDR}]:#{port2}"
52 addrs = [ addr1, addr2 ]
53 stats = tcp_listener_stats(addrs)
54 assert_equal 2, stats.size
55 assert_equal 0, stats[addr1].queued
56 assert_equal 0, stats[addr1].active
57 assert_equal 0, stats[addr2].queued
58 assert_equal 0, stats[addr2].active
60 @to_close << TCPSocket.new(TEST_ADDR, port1)
61 stats = tcp_listener_stats(addrs)
62 assert_equal 2, stats.size
63 assert_equal 1, stats[addr1].queued
64 assert_equal 0, stats[addr1].active
65 assert_equal 0, stats[addr2].queued
66 assert_equal 0, stats[addr2].active
69 stats = tcp_listener_stats(addrs)
70 assert_equal 2, stats.size
71 assert_equal 0, stats[addr1].queued
72 assert_equal 1, stats[addr1].active
73 assert_equal 0, stats[addr2].queued
74 assert_equal 0, stats[addr2].active
76 @to_close << TCPSocket.new(TEST_ADDR, port2)
77 stats = tcp_listener_stats(addrs)
78 assert_equal 2, stats.size
79 assert_equal 0, stats[addr1].queued
80 assert_equal 1, stats[addr1].active
81 assert_equal 1, stats[addr2].queued
82 assert_equal 0, stats[addr2].active
84 @to_close << TCPSocket.new(TEST_ADDR, port2)
85 stats = tcp_listener_stats(addrs)
86 assert_equal 2, stats.size
87 assert_equal 0, stats[addr1].queued
88 assert_equal 1, stats[addr1].active
89 assert_equal 2, stats[addr2].queued
90 assert_equal 0, stats[addr2].active
92 @to_close << s2.accept
93 stats = tcp_listener_stats(addrs)
94 assert_equal 2, stats.size
95 assert_equal 0, stats[addr1].queued
96 assert_equal 1, stats[addr1].active
97 assert_equal 1, stats[addr2].queued
98 assert_equal 1, stats[addr2].active
101 stats = tcp_listener_stats(addrs)
102 assert_equal 0, stats[addr1].queued
103 assert_equal 0, stats[addr1].active
104 assert_equal 1, stats[addr2].queued
105 assert_equal 1, stats[addr2].active
108 def test_invalid_addresses
109 assert_raises(ArgumentError) { tcp_listener_stats(%w([1:::5)) }
110 assert_raises(ArgumentError) { tcp_listener_stats(%w([1:::]5)) }
113 # tries to overflow buffers
114 def test_tcp_stress_test
117 s = TCPServer.new(TEST_ADDR, 0)
119 addr = "[#{TEST_ADDR}]:#{port}"
128 @to_close.concat((1..nr_sock).map { s.accept })
131 rdb.sysread(1) # wait for parent to nuke us
139 @to_close.concat((1..nr_sock).map { TCPSocket.new(TEST_ADDR, port) })
142 rdb.sysread(1) # wait for parent to nuke us
146 assert_equal('.' * (nr_proc * 2), rda.read(nr_proc * 2))
149 stats = tcp_listener_stats(addrs)
150 expect = { addr => Raindrops::ListenStats[nr_sock * nr_proc, 0] }
151 assert_equal expect, stats
153 @to_close << TCPSocket.new(TEST_ADDR, port)
154 stats = tcp_listener_stats(addrs)
155 expect = { addr => Raindrops::ListenStats[nr_sock * nr_proc, 1] }
156 assert_equal expect, stats
158 if ENV["BENCHMARK"].to_i != 0
160 puts(Benchmark.measure{1000.times { tcp_listener_stats(addrs) }})
163 wrb.syswrite('.' * (nr_proc * 2)) # broadcast a wakeup
164 statuses = Process.waitall
165 statuses.each { |(_,status)| assert status.success?, status.inspect }
166 end if ENV["STRESS"].to_i != 0
167 end if RUBY_PLATFORM =~ /linux/ && ipv6_enabled?