eventmachine 1.0.3-x86-mingw32 → 1.2.0.dev.2-x86-mingw32

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (101) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +84 -1
  3. data/README.md +6 -7
  4. data/ext/binder.cpp +10 -10
  5. data/ext/binder.h +5 -5
  6. data/ext/cmain.cpp +173 -61
  7. data/ext/ed.cpp +262 -127
  8. data/ext/ed.h +50 -30
  9. data/ext/em.cpp +491 -445
  10. data/ext/em.h +101 -36
  11. data/ext/eventmachine.h +67 -51
  12. data/ext/extconf.rb +124 -31
  13. data/ext/fastfilereader/extconf.rb +9 -2
  14. data/ext/fastfilereader/mapper.cpp +3 -1
  15. data/ext/fastfilereader/rubymain.cpp +7 -7
  16. data/ext/kb.cpp +1 -1
  17. data/ext/pipe.cpp +11 -4
  18. data/ext/project.h +26 -6
  19. data/ext/rubymain.cpp +408 -201
  20. data/ext/ssl.cpp +167 -20
  21. data/ext/ssl.h +11 -2
  22. data/java/src/com/rubyeventmachine/EmReactor.java +16 -0
  23. data/java/src/com/rubyeventmachine/EventableChannel.java +2 -0
  24. data/java/src/com/rubyeventmachine/EventableDatagramChannel.java +6 -0
  25. data/java/src/com/rubyeventmachine/EventableSocketChannel.java +55 -10
  26. data/lib/1.9/fastfilereaderext.so +0 -0
  27. data/lib/1.9/rubyeventmachine.so +0 -0
  28. data/lib/2.0/fastfilereaderext.so +0 -0
  29. data/lib/2.0/rubyeventmachine.so +0 -0
  30. data/lib/2.1/fastfilereaderext.so +0 -0
  31. data/lib/2.1/rubyeventmachine.so +0 -0
  32. data/lib/2.2/fastfilereaderext.so +0 -0
  33. data/lib/2.2/rubyeventmachine.so +0 -0
  34. data/lib/2.3/fastfilereaderext.so +0 -0
  35. data/lib/2.3/rubyeventmachine.so +0 -0
  36. data/lib/em/buftok.rb +34 -85
  37. data/lib/em/channel.rb +5 -0
  38. data/lib/em/completion.rb +2 -2
  39. data/lib/em/connection.rb +62 -4
  40. data/lib/em/iterator.rb +30 -48
  41. data/lib/em/pool.rb +1 -1
  42. data/lib/em/protocols/httpclient.rb +31 -11
  43. data/lib/em/protocols/line_and_text.rb +4 -4
  44. data/lib/em/protocols/linetext2.rb +44 -39
  45. data/lib/em/protocols/smtpclient.rb +60 -31
  46. data/lib/em/protocols/smtpserver.rb +32 -9
  47. data/lib/em/pure_ruby.rb +8 -3
  48. data/lib/em/queue.rb +16 -7
  49. data/lib/em/resolver.rb +64 -24
  50. data/lib/em/threaded_resource.rb +2 -2
  51. data/lib/em/tick_loop.rb +19 -19
  52. data/lib/em/version.rb +1 -1
  53. data/lib/eventmachine.rb +96 -49
  54. data/lib/jeventmachine.rb +17 -0
  55. data/rakelib/package.rake +31 -4
  56. data/tests/dhparam.pem +13 -0
  57. data/tests/em_test_helper.rb +87 -0
  58. data/tests/test_attach.rb +25 -0
  59. data/tests/test_basic.rb +27 -38
  60. data/tests/test_channel.rb +14 -1
  61. data/tests/test_completion.rb +1 -0
  62. data/tests/test_connection_count.rb +22 -1
  63. data/tests/test_connection_write.rb +35 -0
  64. data/tests/test_defer.rb +17 -0
  65. data/tests/test_epoll.rb +26 -14
  66. data/tests/test_file_watch.rb +1 -0
  67. data/tests/test_fork.rb +75 -0
  68. data/tests/test_httpclient.rb +43 -0
  69. data/tests/test_idle_connection.rb +6 -4
  70. data/tests/test_ipv4.rb +125 -0
  71. data/tests/test_ipv6.rb +131 -0
  72. data/tests/test_iterator.rb +115 -0
  73. data/tests/test_kb.rb +19 -25
  74. data/tests/test_ltp2.rb +20 -0
  75. data/tests/test_many_fds.rb +22 -0
  76. data/tests/test_pause.rb +29 -0
  77. data/tests/test_pool.rb +2 -0
  78. data/tests/test_process_watch.rb +2 -0
  79. data/tests/test_processes.rb +7 -7
  80. data/tests/test_queue.rb +14 -0
  81. data/tests/test_resolver.rb +56 -7
  82. data/tests/test_set_sock_opt.rb +2 -0
  83. data/tests/test_smtpclient.rb +20 -0
  84. data/tests/test_ssl_args.rb +2 -2
  85. data/tests/test_ssl_dhparam.rb +83 -0
  86. data/tests/test_ssl_ecdh_curve.rb +79 -0
  87. data/tests/test_ssl_extensions.rb +49 -0
  88. data/tests/test_ssl_methods.rb +22 -5
  89. data/tests/test_ssl_protocols.rb +246 -0
  90. data/tests/test_ssl_verify.rb +103 -59
  91. data/tests/test_system.rb +4 -0
  92. data/tests/test_threaded_resource.rb +8 -0
  93. data/tests/test_unbind_reason.rb +5 -1
  94. metadata +173 -107
  95. data/.gitignore +0 -21
  96. data/.travis.yml +0 -12
  97. data/.yardopts +0 -7
  98. data/Gemfile +0 -2
  99. data/Rakefile +0 -20
  100. data/eventmachine.gemspec +0 -36
  101. data/rakelib/cpp.rake_example +0 -77
@@ -0,0 +1,115 @@
1
+ require 'em_test_helper'
2
+
3
+ class TestIterator < Test::Unit::TestCase
4
+
5
+ def get_time
6
+ EM.current_time.strftime('%H:%M:%S')
7
+ end
8
+
9
+ def test_default_concurrency
10
+ items = {}
11
+ list = 1..10
12
+ EM.run {
13
+ EM::Iterator.new(list).each( proc {|num,iter|
14
+ time = get_time
15
+ items[time] ||= []
16
+ items[time] << num
17
+ EM::Timer.new(1) {iter.next}
18
+ }, proc {EM.stop})
19
+ }
20
+ assert_equal(10, items.keys.size)
21
+ assert_equal(list.to_a.sort, items.values.flatten.sort)
22
+ end
23
+
24
+ def test_default_concurrency_with_a_proc
25
+ items = {}
26
+ list = (1..10).to_a
27
+ original_list = list.dup
28
+ EM.run {
29
+ EM::Iterator.new(proc{list.pop || EM::Iterator::Stop}).each( proc {|num,iter|
30
+ time = get_time
31
+ items[time] ||= []
32
+ items[time] << num
33
+ EM::Timer.new(1) {iter.next}
34
+ }, proc {EM.stop})
35
+ }
36
+ assert_equal(10, items.keys.size)
37
+ assert_equal(original_list.to_a.sort, items.values.flatten.sort)
38
+ end
39
+
40
+ def test_concurrency_bigger_than_list_size
41
+ items = {}
42
+ list = [1,2,3]
43
+ EM.run {
44
+ EM::Iterator.new(list,10).each(proc {|num,iter|
45
+ time = get_time
46
+ items[time] ||= []
47
+ items[time] << num
48
+ EM::Timer.new(1) {iter.next}
49
+ }, proc {EM.stop})
50
+ }
51
+ assert_equal(1, items.keys.size)
52
+ assert_equal(list.to_a.sort, items.values.flatten.sort)
53
+ end
54
+
55
+
56
+ def test_changing_concurrency_affects_active_iteration
57
+ items = {}
58
+ list = 1..25
59
+ EM.run {
60
+ i = EM::Iterator.new(list,5)
61
+ i.each(proc {|num,iter|
62
+ time = get_time
63
+ items[time] ||= []
64
+ items[time] << num
65
+ EM::Timer.new(1) {iter.next}
66
+ }, proc {EM.stop})
67
+ EM.add_timer(1){
68
+ i.concurrency = 1
69
+ }
70
+ EM.add_timer(3){
71
+ i.concurrency = 3
72
+ }
73
+ }
74
+ assert_equal(9, items.keys.size)
75
+ assert_equal(list.to_a.sort, items.values.flatten.sort)
76
+ end
77
+
78
+ def test_map
79
+ list = 100..150
80
+ EM.run {
81
+ EM::Iterator.new(list).map(proc{ |num,iter|
82
+ EM.add_timer(0.01){ iter.return(num) }
83
+ }, proc{ |results|
84
+ assert_equal(list.to_a.size, results.size)
85
+ EM.stop
86
+ })
87
+ }
88
+ end
89
+
90
+ def test_inject
91
+ omit_if(windows?)
92
+
93
+ list = %w[ pwd uptime uname date ]
94
+ EM.run {
95
+ EM::Iterator.new(list, 2).inject({}, proc{ |hash,cmd,iter|
96
+ EM.system(cmd){ |output,status|
97
+ hash[cmd] = status.exitstatus == 0 ? output.strip : nil
98
+ iter.return(hash)
99
+ }
100
+ }, proc{ |results|
101
+ assert_equal(results.keys.sort, list.sort)
102
+ EM.stop
103
+ })
104
+ }
105
+ end
106
+
107
+ def test_concurrency_is_0
108
+ EM.run {
109
+ assert_raise ArgumentError do
110
+ EM::Iterator.new(1..5,0)
111
+ end
112
+ EM.stop
113
+ }
114
+ end
115
+ end
@@ -2,33 +2,27 @@ require 'em_test_helper'
2
2
 
3
3
  class TestKeyboardEvents < Test::Unit::TestCase
4
4
 
5
- if !jruby?
6
- module KbHandler
7
- include EM::Protocols::LineText2
8
- def receive_line d
9
- EM::stop if d == "STOP"
10
- end
5
+ module KbHandler
6
+ include EM::Protocols::LineText2
7
+ def receive_line d
8
+ EM::stop if d == "STOP"
11
9
  end
10
+ end
12
11
 
13
- # This test doesn't actually do anything useful but is here to
14
- # illustrate the usage. If you removed the timer and ran this test
15
- # by itself on a console, and then typed into the console, it would
16
- # work.
17
- # I don't know how to get the test harness to simulate actual keystrokes.
18
- # When someone figures that out, then we can make this a real test.
19
- #
20
- def test_kb
21
- EM.run {
22
- EM.open_keyboard KbHandler
23
- EM::Timer.new(1) { EM.stop }
24
- } if $stdout.tty? # don't run the test unless it stands a chance of validity.
25
- end
26
- else
27
- warn "EM.open_keyboard not implemented, skipping tests in #{__FILE__}"
28
-
29
- # Because some rubies will complain if a TestCase class has no tests
30
- def test_em_open_keyboard_unsupported
31
- assert true
12
+ # This test doesn't actually do anything useful but is here to
13
+ # illustrate the usage. If you removed the timer and ran this test
14
+ # by itself on a console, and then typed into the console, it would
15
+ # work.
16
+ # I don't know how to get the test harness to simulate actual keystrokes.
17
+ # When someone figures that out, then we can make this a real test.
18
+ #
19
+ def test_kb
20
+ omit_if(jruby?)
21
+ omit_if(!$stdout.tty?) # don't run the test unless it stands a chance of validity.
22
+ EM.run do
23
+ EM.open_keyboard KbHandler
24
+ EM::Timer.new(1) { EM.stop }
32
25
  end
33
26
  end
27
+
34
28
  end
@@ -26,6 +26,26 @@ class TestLineText2 < Test::Unit::TestCase
26
26
  assert_equal( ["Line 1", "Line 2", "Line 3"], a.lines )
27
27
  end
28
28
 
29
+ # The basic test above shows that extra newlines are chomped
30
+ # This test shows that newlines are preserved if the delimiter isn't \n
31
+ class PreserveNewlines
32
+ include EM::Protocols::LineText2
33
+ attr_reader :lines
34
+ def initialize *args
35
+ super
36
+ @delim = "|"
37
+ set_delimiter @delim
38
+ end
39
+ def receive_line line
40
+ (@lines ||= []) << line
41
+ end
42
+ end
43
+ def test_preserve_newlines
44
+ a = PreserveNewlines.new
45
+ a.receive_data "aaa|bbb|ccc|\n|\r\n| \t ||"
46
+ assert_equal( ["aaa", "bbb", "ccc", "\n", "\r\n", " \t ", ""], a.lines )
47
+ end
48
+
29
49
  class ChangeDelimiter
30
50
  include EM::Protocols::LineText2
31
51
  attr_reader :lines
@@ -0,0 +1,22 @@
1
+ require 'em_test_helper'
2
+ require 'socket'
3
+
4
+ class TestManyFDs < Test::Unit::TestCase
5
+ def setup
6
+ @port = next_port
7
+ end
8
+
9
+ def test_connection_class_cache
10
+ mod = Module.new
11
+ a = nil
12
+ Process.setrlimit(Process::RLIMIT_NOFILE, 4096) rescue nil
13
+ EM.run {
14
+ EM.start_server '127.0.0.1', @port, mod
15
+ 1100.times do
16
+ a = EM.connect '127.0.0.1', @port, mod
17
+ assert_kind_of EM::Connection, a
18
+ end
19
+ EM.stop
20
+ }
21
+ end
22
+ end
@@ -67,6 +67,35 @@ class TestPause < Test::Unit::TestCase
67
67
  end
68
68
  end
69
69
  end
70
+
71
+ def test_pause_in_receive_data
72
+ incoming = []
73
+
74
+ test_server = Module.new do
75
+ define_method(:receive_data) do |data|
76
+ incoming << data
77
+ pause
78
+ EM.add_timer(0.5){ close_connection }
79
+ end
80
+ define_method(:unbind) do
81
+ EM.stop
82
+ end
83
+ end
84
+
85
+ buf = 'a' * 1024
86
+
87
+ EM.run do
88
+ EM.start_server "127.0.0.1", @port, test_server
89
+ cli = EM.connect "127.0.0.1", @port
90
+ 128.times do
91
+ cli.send_data buf
92
+ end
93
+ end
94
+
95
+ assert_equal 1, incoming.size
96
+ assert incoming[0].bytesize > buf.bytesize
97
+ assert incoming[0].bytesize < buf.bytesize * 128
98
+ end
70
99
  else
71
100
  warn "EM.pause_connection not implemented, skipping tests in #{__FILE__}"
72
101
 
@@ -1,3 +1,5 @@
1
+ require 'em_test_helper'
2
+
1
3
  class TestPool < Test::Unit::TestCase
2
4
  def pool
3
5
  @pool ||= EM::Pool.new
@@ -27,6 +27,8 @@ if EM.kqueue?
27
27
  end
28
28
 
29
29
  def test_events
30
+ omit_if(rbx?)
31
+ omit_if(jruby?)
30
32
  EM.run{
31
33
  # watch ourselves for a fork notification
32
34
  EM.watch_process(Process.pid, ParentProcessWatcher)
@@ -37,8 +37,8 @@ class TestProcesses < Test::Unit::TestCase
37
37
  }
38
38
 
39
39
  assert( $out.length > 0 )
40
- assert_equal($status.exitstatus, 0)
41
- assert_equal($status.class, Process::Status)
40
+ assert_equal(0, $status.exitstatus)
41
+ assert_kind_of(Process::Status, $status)
42
42
  end
43
43
 
44
44
  def test_em_system_pid
@@ -57,8 +57,8 @@ class TestProcesses < Test::Unit::TestCase
57
57
  }
58
58
 
59
59
  assert( $out.length > 0 )
60
- assert_equal($status.exitstatus, 0)
61
- assert_equal($status.class, Process::Status)
60
+ assert_equal(0, $status.exitstatus)
61
+ assert_kind_of(Process::Status, $status)
62
62
  end
63
63
 
64
64
  def test_em_system_with_two_procs
@@ -111,9 +111,9 @@ class TestProcesses < Test::Unit::TestCase
111
111
  end
112
112
  end
113
113
 
114
- EM.run{
115
- EM.popen('cat /dev/random', test_client)
116
- }
114
+ EM.run do
115
+ EM.popen('echo 1', test_client)
116
+ end
117
117
 
118
118
  assert_equal 1, c_rx
119
119
  end
@@ -47,4 +47,18 @@ class TestEMQueue < Test::Unit::TestCase
47
47
  EM.run { EM.next_tick { EM.stop } }
48
48
  assert_equal many, q.num_waiting
49
49
  end
50
+
51
+ def test_big_queue
52
+ EM.run do
53
+ q = EM::Queue.new
54
+ 2000.times do |i|
55
+ q.push(*0..1000)
56
+ q.pop { |v| assert_equal v, i % 1001 }
57
+ end
58
+ q.pop do
59
+ assert_equal 1_999_999, q.size
60
+ EM.stop
61
+ end
62
+ end
63
+ end
50
64
  end
@@ -1,7 +1,24 @@
1
1
  require 'em_test_helper'
2
2
 
3
3
  class TestResolver < Test::Unit::TestCase
4
+ def test_nameserver
5
+ assert_kind_of(String, EM::DNS::Resolver.nameserver)
6
+ end
7
+
8
+ def test_nameservers
9
+ assert_kind_of(Array, EM::DNS::Resolver.nameservers)
10
+ end
11
+
12
+ def test_hosts
13
+ assert_kind_of(Hash, EM::DNS::Resolver.hosts)
14
+
15
+ # Make sure that blank or comment lines are skipped
16
+ refute(EM::DNS::Resolver.hosts.include? nil)
17
+ end
18
+
4
19
  def test_a
20
+ pend('FIXME: this test is broken on Windows') if windows?
21
+
5
22
  EM.run {
6
23
  d = EM::DNS::Resolver.resolve "google.com"
7
24
  d.errback { assert false }
@@ -29,27 +46,59 @@ class TestResolver < Test::Unit::TestCase
29
46
  end
30
47
 
31
48
  def test_a_pair
49
+ pend('FIXME: this test is broken on Windows') if windows?
50
+
32
51
  EM.run {
33
- d = EM::DNS::Resolver.resolve "google.com"
34
- d.errback { assert false }
52
+ d = EM::DNS::Resolver.resolve "yahoo.com"
53
+ d.errback { |err| assert false, "failed to resolve yahoo.com: #{err}" }
35
54
  d.callback { |r|
36
- assert_equal(Array, r.class)
37
- assert r.size > 1
55
+ assert_kind_of(Array, r)
56
+ assert r.size > 1, "returned #{r.size} results: #{r.inspect}"
38
57
  EM.stop
39
58
  }
40
59
  }
41
60
  end
42
61
 
43
62
  def test_localhost
63
+ pend('FIXME: this test is broken on Windows') if windows?
64
+
44
65
  EM.run {
45
66
  d = EM::DNS::Resolver.resolve "localhost"
46
67
  d.errback { assert false }
47
68
  d.callback { |r|
48
- assert_equal("127.0.0.1", r.first)
49
- assert_equal(Array, r.class)
69
+ assert_include(["127.0.0.1", "::1"], r.first)
70
+ assert_kind_of(Array, r)
71
+
72
+ EM.stop
73
+ }
74
+ }
75
+ end
76
+
77
+ def test_timer_cleanup
78
+ pend('FIXME: this test is broken on Windows') if windows?
79
+
80
+ EM.run {
81
+ d = EM::DNS::Resolver.resolve "google.com"
82
+ d.errback { |err| assert false, "failed to resolve google.com: #{err}" }
83
+ d.callback { |r|
84
+ # This isn't a great test, but it's hard to get more canonical
85
+ # confirmation that the timer is cancelled
86
+ assert_nil(EM::DNS::Resolver.socket.instance_variable_get(:@timer))
87
+
88
+ EM.stop
89
+ }
90
+ }
91
+ end
92
+
93
+ def test_failure_timer_cleanup
94
+ EM.run {
95
+ d = EM::DNS::Resolver.resolve "asdfasdf"
96
+ d.callback { assert false }
97
+ d.errback {
98
+ assert_nil(EM::DNS::Resolver.socket.instance_variable_get(:@timer))
50
99
 
51
100
  EM.stop
52
101
  }
53
102
  }
54
103
  end
55
- end
104
+ end
@@ -15,6 +15,8 @@ class TestSetSockOpt < Test::Unit::TestCase
15
15
  #-------------------------------------
16
16
 
17
17
  def test_set_sock_opt
18
+ omit_if(windows?)
19
+
18
20
  test = self
19
21
  EM.run do
20
22
  EM.connect 'google.com', 80, Module.new {
@@ -52,4 +52,24 @@ class TestSmtpClient < Test::Unit::TestCase
52
52
  assert(err)
53
53
  end
54
54
 
55
+
56
+ EM::Protocols::SmtpClient.__send__(:public, :escape_leading_dots)
57
+
58
+ def test_escaping
59
+ smtp = EM::Protocols::SmtpClient.new :domain => "example.com"
60
+
61
+ expectations = {
62
+ "Hello\r\n" => "Hello\r\n",
63
+ "\r\n.whatever\r\n" => "\r\n..whatever\r\n",
64
+ "\r\n.\r\n" => "\r\n..\r\n",
65
+ "\r\n.\r\n." => "\r\n..\r\n..",
66
+ ".\r\n.\r\n" => "..\r\n..\r\n",
67
+ "..\r\n" => "...\r\n"
68
+ }
69
+
70
+ expectations.each do |input, output|
71
+ assert_equal output, smtp.escape_leading_dots(input)
72
+ end
73
+ end
74
+
55
75
  end