asyncengine 0.0.1.testing1 → 0.0.2.alpha1
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.
- data/README.markdown +3 -0
- data/Rakefile +38 -0
- data/asyncengine.gemspec +8 -4
- data/ext/asyncengine/ae_call_from_other_thread.c +106 -0
- data/ext/asyncengine/ae_call_from_other_thread.h +12 -0
- data/ext/asyncengine/ae_handle_common.c +193 -48
- data/ext/asyncengine/ae_handle_common.h +40 -13
- data/ext/asyncengine/ae_ip_utils.c +246 -0
- data/ext/asyncengine/ae_ip_utils.h +25 -0
- data/ext/asyncengine/ae_next_tick.c +81 -21
- data/ext/asyncengine/ae_next_tick.h +4 -2
- data/ext/asyncengine/ae_resolver.c +156 -0
- data/ext/asyncengine/ae_resolver.h +10 -0
- data/ext/asyncengine/ae_tcp.c +908 -0
- data/ext/asyncengine/ae_tcp.h +20 -0
- data/ext/asyncengine/ae_timer.c +355 -81
- data/ext/asyncengine/ae_timer.h +11 -4
- data/ext/asyncengine/ae_udp.c +579 -13
- data/ext/asyncengine/ae_udp.h +15 -2
- data/ext/asyncengine/ae_utils.c +192 -0
- data/ext/asyncengine/ae_utils.h +16 -0
- data/ext/asyncengine/asyncengine_ruby.c +469 -26
- data/ext/asyncengine/asyncengine_ruby.h +49 -11
- data/ext/asyncengine/debug.h +68 -0
- data/ext/asyncengine/extconf.rb +26 -2
- data/ext/asyncengine/ip_parser.c +5954 -0
- data/ext/asyncengine/ip_parser.h +16 -0
- data/ext/asyncengine/libuv/AUTHORS +16 -0
- data/ext/asyncengine/libuv/common.gypi +4 -4
- data/ext/asyncengine/libuv/config-mingw.mk +6 -6
- data/ext/asyncengine/libuv/config-unix.mk +13 -13
- data/ext/asyncengine/libuv/gyp_uv +5 -1
- data/ext/asyncengine/libuv/ibc_tests/exec_test.sh +8 -0
- data/ext/asyncengine/libuv/ibc_tests/uv_shutdown_write_issue.c +171 -0
- data/ext/asyncengine/libuv/ibc_tests/uv_tcp_close_while_connecting.c +102 -0
- data/ext/asyncengine/libuv/include/uv-private/ngx-queue.h +3 -1
- data/ext/asyncengine/libuv/include/uv-private/uv-unix.h +103 -50
- data/ext/asyncengine/libuv/include/uv-private/uv-win.h +76 -24
- data/ext/asyncengine/libuv/include/uv.h +353 -88
- data/ext/asyncengine/libuv/src/ares/ares__close_sockets.o +0 -0
- data/ext/asyncengine/libuv/src/ares/ares__get_hostent.o +0 -0
- data/ext/asyncengine/libuv/src/ares/ares__read_line.o +0 -0
- data/ext/asyncengine/libuv/src/ares/ares__timeval.o +0 -0
- data/ext/asyncengine/libuv/src/ares/ares_cancel.o +0 -0
- data/ext/asyncengine/libuv/src/ares/ares_data.o +0 -0
- data/ext/asyncengine/libuv/src/ares/ares_destroy.o +0 -0
- data/ext/asyncengine/libuv/src/ares/ares_expand_name.o +0 -0
- data/ext/asyncengine/libuv/src/ares/ares_expand_string.o +0 -0
- data/ext/asyncengine/libuv/src/ares/ares_fds.o +0 -0
- data/ext/asyncengine/libuv/src/ares/ares_free_hostent.o +0 -0
- data/ext/asyncengine/libuv/src/ares/ares_free_string.o +0 -0
- data/ext/asyncengine/libuv/src/ares/ares_gethostbyaddr.o +0 -0
- data/ext/asyncengine/libuv/src/ares/ares_gethostbyname.o +0 -0
- data/ext/asyncengine/libuv/src/ares/ares_getnameinfo.o +0 -0
- data/ext/asyncengine/libuv/src/ares/ares_getopt.o +0 -0
- data/ext/asyncengine/libuv/src/ares/ares_getsock.o +0 -0
- data/ext/asyncengine/libuv/src/ares/ares_init.o +0 -0
- data/ext/asyncengine/libuv/src/ares/ares_library_init.o +0 -0
- data/ext/asyncengine/libuv/src/ares/ares_llist.o +0 -0
- data/ext/asyncengine/libuv/src/ares/ares_mkquery.o +0 -0
- data/ext/asyncengine/libuv/src/ares/ares_nowarn.o +0 -0
- data/ext/asyncengine/libuv/src/ares/ares_options.o +0 -0
- data/ext/asyncengine/libuv/src/ares/ares_parse_a_reply.o +0 -0
- data/ext/asyncengine/libuv/src/ares/ares_parse_aaaa_reply.o +0 -0
- data/ext/asyncengine/libuv/src/ares/ares_parse_mx_reply.o +0 -0
- data/ext/asyncengine/libuv/src/ares/ares_parse_ns_reply.o +0 -0
- data/ext/asyncengine/libuv/src/ares/ares_parse_ptr_reply.o +0 -0
- data/ext/asyncengine/libuv/src/ares/ares_parse_srv_reply.o +0 -0
- data/ext/asyncengine/libuv/src/ares/ares_parse_txt_reply.o +0 -0
- data/ext/asyncengine/libuv/src/ares/ares_process.o +0 -0
- data/ext/asyncengine/libuv/src/ares/ares_query.o +0 -0
- data/ext/asyncengine/libuv/src/ares/ares_search.o +0 -0
- data/ext/asyncengine/libuv/src/ares/ares_send.o +0 -0
- data/ext/asyncengine/libuv/src/ares/ares_strcasecmp.o +0 -0
- data/ext/asyncengine/libuv/src/ares/ares_strdup.o +0 -0
- data/ext/asyncengine/libuv/src/ares/ares_strerror.o +0 -0
- data/ext/asyncengine/libuv/src/ares/ares_timeout.o +0 -0
- data/ext/asyncengine/libuv/src/ares/ares_version.o +0 -0
- data/ext/asyncengine/libuv/src/ares/ares_writev.o +0 -0
- data/ext/asyncengine/libuv/src/ares/bitncmp.o +0 -0
- data/ext/asyncengine/libuv/src/ares/inet_net_pton.o +0 -0
- data/ext/asyncengine/libuv/src/ares/inet_ntop.o +0 -0
- data/ext/asyncengine/libuv/src/cares.c +225 -0
- data/ext/asyncengine/libuv/src/cares.o +0 -0
- data/ext/asyncengine/libuv/src/fs-poll.c +237 -0
- data/ext/asyncengine/libuv/src/fs-poll.o +0 -0
- data/ext/asyncengine/libuv/src/unix/async.c +78 -17
- data/ext/asyncengine/libuv/src/unix/async.o +0 -0
- data/ext/asyncengine/libuv/src/unix/core.c +305 -213
- data/ext/asyncengine/libuv/src/unix/core.o +0 -0
- data/ext/asyncengine/libuv/src/unix/cygwin.c +1 -1
- data/ext/asyncengine/libuv/src/unix/darwin.c +2 -1
- data/ext/asyncengine/libuv/src/unix/dl.c +36 -44
- data/ext/asyncengine/libuv/src/unix/dl.o +0 -0
- data/ext/asyncengine/libuv/src/unix/eio/eio.o +0 -0
- data/ext/asyncengine/libuv/src/unix/error.c +6 -0
- data/ext/asyncengine/libuv/src/unix/error.o +0 -0
- data/ext/asyncengine/libuv/src/unix/ev/ev.c +8 -4
- data/ext/asyncengine/libuv/src/unix/ev/ev.o +0 -0
- data/ext/asyncengine/libuv/src/unix/freebsd.c +1 -1
- data/ext/asyncengine/libuv/src/unix/fs.c +25 -33
- data/ext/asyncengine/libuv/src/unix/fs.o +0 -0
- data/ext/asyncengine/libuv/src/unix/internal.h +50 -31
- data/ext/asyncengine/libuv/src/unix/kqueue.c +2 -7
- data/ext/asyncengine/libuv/src/unix/linux/core.o +0 -0
- data/ext/asyncengine/libuv/src/unix/linux/inotify.c +12 -14
- data/ext/asyncengine/libuv/src/unix/linux/inotify.o +0 -0
- data/ext/asyncengine/libuv/src/unix/linux/{core.c → linux-core.c} +1 -1
- data/ext/asyncengine/libuv/src/unix/linux/linux-core.o +0 -0
- data/ext/asyncengine/libuv/src/unix/linux/syscalls.c +147 -1
- data/ext/asyncengine/libuv/src/unix/linux/syscalls.h +39 -2
- data/ext/asyncengine/libuv/src/unix/linux/syscalls.o +0 -0
- data/ext/asyncengine/libuv/src/unix/loop-watcher.c +63 -0
- data/ext/asyncengine/libuv/src/unix/loop-watcher.o +0 -0
- data/ext/asyncengine/libuv/src/unix/loop.c +29 -6
- data/ext/asyncengine/libuv/src/unix/loop.o +0 -0
- data/ext/asyncengine/libuv/src/unix/netbsd.c +1 -1
- data/ext/asyncengine/libuv/src/unix/openbsd.c +1 -1
- data/ext/asyncengine/libuv/src/unix/pipe.c +31 -36
- data/ext/asyncengine/libuv/src/unix/pipe.o +0 -0
- data/ext/asyncengine/libuv/src/unix/poll.c +116 -0
- data/ext/asyncengine/libuv/src/unix/poll.o +0 -0
- data/ext/asyncengine/libuv/src/unix/process.c +193 -115
- data/ext/asyncengine/libuv/src/unix/process.o +0 -0
- data/ext/asyncengine/libuv/src/unix/stream.c +146 -153
- data/ext/asyncengine/libuv/src/unix/stream.o +0 -0
- data/ext/asyncengine/libuv/src/unix/sunos.c +45 -36
- data/ext/asyncengine/libuv/src/unix/tcp.c +6 -5
- data/ext/asyncengine/libuv/src/unix/tcp.o +0 -0
- data/ext/asyncengine/libuv/src/unix/thread.c +82 -25
- data/ext/asyncengine/libuv/src/unix/thread.o +0 -0
- data/ext/asyncengine/libuv/src/unix/timer.c +69 -58
- data/ext/asyncengine/libuv/src/unix/timer.o +0 -0
- data/ext/asyncengine/libuv/src/unix/tty.c +3 -3
- data/ext/asyncengine/libuv/src/unix/tty.o +0 -0
- data/ext/asyncengine/libuv/src/unix/udp.c +57 -66
- data/ext/asyncengine/libuv/src/unix/udp.o +0 -0
- data/ext/asyncengine/libuv/src/unix/uv-eio.c +33 -50
- data/ext/asyncengine/libuv/src/unix/uv-eio.o +0 -0
- data/ext/asyncengine/libuv/src/uv-common.c +68 -38
- data/ext/asyncengine/libuv/src/uv-common.h +104 -20
- data/ext/asyncengine/libuv/src/uv-common.o +0 -0
- data/ext/asyncengine/libuv/src/win/async.c +20 -17
- data/ext/asyncengine/libuv/src/win/core.c +44 -31
- data/ext/asyncengine/libuv/src/win/dl.c +40 -36
- data/ext/asyncengine/libuv/src/win/error.c +21 -1
- data/ext/asyncengine/libuv/src/win/fs-event.c +19 -21
- data/ext/asyncengine/libuv/src/win/fs.c +541 -189
- data/ext/asyncengine/libuv/src/win/getaddrinfo.c +56 -63
- data/ext/asyncengine/libuv/src/win/handle-inl.h +145 -0
- data/ext/asyncengine/libuv/src/win/handle.c +26 -101
- data/ext/asyncengine/libuv/src/win/internal.h +92 -107
- data/ext/asyncengine/libuv/src/win/loop-watcher.c +6 -14
- data/ext/asyncengine/libuv/src/win/pipe.c +78 -64
- data/ext/asyncengine/libuv/src/win/poll.c +618 -0
- data/ext/asyncengine/libuv/src/win/process-stdio.c +479 -0
- data/ext/asyncengine/libuv/src/win/process.c +147 -274
- data/ext/asyncengine/libuv/src/win/req-inl.h +225 -0
- data/ext/asyncengine/libuv/src/win/req.c +0 -149
- data/ext/asyncengine/libuv/src/{unix/check.c → win/stream-inl.h} +31 -42
- data/ext/asyncengine/libuv/src/win/stream.c +9 -43
- data/ext/asyncengine/libuv/src/win/tcp.c +200 -82
- data/ext/asyncengine/libuv/src/win/thread.c +42 -2
- data/ext/asyncengine/libuv/src/win/threadpool.c +3 -2
- data/ext/asyncengine/libuv/src/win/timer.c +13 -63
- data/ext/asyncengine/libuv/src/win/tty.c +26 -20
- data/ext/asyncengine/libuv/src/win/udp.c +26 -17
- data/ext/asyncengine/libuv/src/win/util.c +312 -167
- data/ext/asyncengine/libuv/src/win/winapi.c +16 -1
- data/ext/asyncengine/libuv/src/win/winapi.h +33 -9
- data/ext/asyncengine/libuv/src/win/winsock.c +88 -1
- data/ext/asyncengine/libuv/src/win/winsock.h +36 -3
- data/ext/asyncengine/libuv/test/benchmark-ares.c +16 -17
- data/ext/asyncengine/libuv/test/benchmark-fs-stat.c +164 -0
- data/ext/asyncengine/libuv/test/benchmark-list.h +9 -0
- data/ext/asyncengine/libuv/{src/unix/prepare.c → test/benchmark-loop-count.c} +42 -33
- data/ext/asyncengine/libuv/test/benchmark-million-timers.c +65 -0
- data/ext/asyncengine/libuv/test/benchmark-pound.c +1 -1
- data/ext/asyncengine/libuv/test/benchmark-sizes.c +2 -0
- data/ext/asyncengine/libuv/test/benchmark-spawn.c +7 -1
- data/ext/asyncengine/libuv/test/benchmark-udp-packet-storm.c +1 -1
- data/ext/asyncengine/libuv/test/echo-server.c +8 -0
- data/ext/asyncengine/libuv/test/run-tests.c +30 -0
- data/ext/asyncengine/libuv/test/runner-unix.c +6 -26
- data/ext/asyncengine/libuv/test/runner-win.c +5 -63
- data/ext/asyncengine/libuv/test/runner.c +10 -1
- data/ext/asyncengine/libuv/test/task.h +0 -8
- data/ext/asyncengine/libuv/test/test-async.c +43 -141
- data/ext/asyncengine/libuv/test/test-callback-order.c +76 -0
- data/ext/asyncengine/libuv/test/test-counters-init.c +2 -3
- data/ext/asyncengine/libuv/test/test-dlerror.c +17 -8
- data/ext/asyncengine/libuv/test/test-fs-event.c +31 -39
- data/ext/asyncengine/libuv/test/test-fs-poll.c +146 -0
- data/ext/asyncengine/libuv/test/test-fs.c +114 -2
- data/ext/asyncengine/libuv/test/test-gethostbyname.c +8 -8
- data/ext/asyncengine/libuv/test/test-hrtime.c +18 -15
- data/ext/asyncengine/libuv/test/test-ipc.c +8 -2
- data/ext/asyncengine/libuv/test/test-list.h +59 -9
- data/ext/asyncengine/libuv/test/test-loop-handles.c +2 -25
- data/ext/asyncengine/libuv/{src/unix/idle.c → test/test-poll-close.c} +37 -39
- data/ext/asyncengine/libuv/test/test-poll.c +573 -0
- data/ext/asyncengine/libuv/test/test-ref.c +79 -63
- data/ext/asyncengine/libuv/test/test-run-once.c +15 -11
- data/ext/asyncengine/libuv/test/test-semaphore.c +111 -0
- data/ext/asyncengine/libuv/test/test-spawn.c +368 -20
- data/ext/asyncengine/libuv/test/test-stdio-over-pipes.c +25 -35
- data/ext/asyncengine/libuv/test/test-tcp-close-while-connecting.c +80 -0
- data/ext/asyncengine/libuv/test/test-tcp-close.c +1 -1
- data/ext/asyncengine/libuv/test/test-tcp-connect-error-after-write.c +95 -0
- data/ext/asyncengine/libuv/test/test-tcp-connect-timeout.c +85 -0
- data/ext/asyncengine/libuv/test/test-tcp-shutdown-after-write.c +131 -0
- data/ext/asyncengine/libuv/test/test-tcp-write-error.c +2 -2
- data/ext/asyncengine/libuv/test/test-tcp-writealot.c +29 -54
- data/ext/asyncengine/libuv/test/test-timer-again.c +1 -1
- data/ext/asyncengine/libuv/test/test-timer.c +23 -1
- data/ext/asyncengine/libuv/test/test-udp-options.c +1 -1
- data/ext/asyncengine/libuv/test/{test-eio-overflow.c → test-walk-handles.c} +31 -44
- data/ext/asyncengine/libuv/uv.gyp +26 -9
- data/ext/asyncengine/rb_utilities.c +54 -0
- data/ext/asyncengine/rb_utilities.h +63 -0
- data/lib/asyncengine.rb +45 -38
- data/lib/asyncengine/asyncengine_ext.so +0 -0
- data/lib/asyncengine/debug.rb +37 -0
- data/lib/asyncengine/handle.rb +9 -0
- data/lib/asyncengine/tcp.rb +28 -0
- data/lib/asyncengine/timer.rb +18 -28
- data/lib/asyncengine/udp.rb +29 -0
- data/lib/asyncengine/utils.rb +32 -0
- data/lib/asyncengine/uv_error.rb +17 -0
- data/lib/asyncengine/version.rb +9 -1
- data/test/ae_test_helper.rb +62 -0
- data/test/test_basic.rb +169 -0
- data/test/test_call_from_other_thread.rb +55 -0
- data/test/test_error.rb +92 -0
- data/test/test_ip_utils.rb +44 -0
- data/test/test_next_tick.rb +37 -0
- data/test/test_resolver.rb +51 -0
- data/test/test_threads.rb +69 -0
- data/test/test_timer.rb +95 -0
- data/test/test_udp.rb +216 -0
- data/test/test_utils.rb +49 -0
- metadata +84 -57
- data/ext/asyncengine/libuv/mkmf.log +0 -24
- data/ext/asyncengine/libuv/src/unix/cares.c +0 -194
- data/ext/asyncengine/libuv/src/unix/cares.o +0 -0
- data/ext/asyncengine/libuv/src/unix/check.o +0 -0
- data/ext/asyncengine/libuv/src/unix/idle.o +0 -0
- data/ext/asyncengine/libuv/src/unix/prepare.o +0 -0
- data/ext/asyncengine/libuv/src/win/cares.c +0 -290
- data/lib/asyncengine/errors.rb +0 -5
- data/lib/asyncengine/next_tick.rb +0 -24
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
require "ae_test_helper"
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
class TestResolver < AETest
|
|
5
|
+
|
|
6
|
+
def test_01_resolve_success
|
|
7
|
+
@num_ips = 0
|
|
8
|
+
|
|
9
|
+
AE.run do
|
|
10
|
+
AE::Resolver.resolve "google.com" do |error, ips|
|
|
11
|
+
assert_nil error
|
|
12
|
+
assert_equal Array, ips.class
|
|
13
|
+
@num_ips = ips.size
|
|
14
|
+
AE.stop
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
AE.run do
|
|
19
|
+
AE::Resolver.resolve "google.com", Socket::AF_UNSPEC do |error, ips|
|
|
20
|
+
assert_equal @num_ips, ips.size
|
|
21
|
+
AE.stop
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
AE.run do
|
|
26
|
+
AE::Resolver.resolve "google.com", Socket::AF_INET6 do |error, ips|
|
|
27
|
+
assert_true @num_ips > ips.size
|
|
28
|
+
AE.stop
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def test_02_resolve_error
|
|
34
|
+
AE.run do
|
|
35
|
+
AE::Resolver.resolve "qweasdzxc.qwe" do |error, ips|
|
|
36
|
+
assert_true error.is_a? AE::UvError
|
|
37
|
+
assert_equal error.type, :ENOENT
|
|
38
|
+
AE.stop
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
AE.run do
|
|
43
|
+
AE::Resolver.resolve "ipv6.google.com", Socket::AF_INET do |error, ips|
|
|
44
|
+
assert_true error.is_a? AE::UvError
|
|
45
|
+
assert_equal error.type, :ENOENT
|
|
46
|
+
AE.stop
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
end
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
require "ae_test_helper"
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
class TestThreads < AETest
|
|
5
|
+
|
|
6
|
+
def test_01_thread_works_as_expected
|
|
7
|
+
str = ""
|
|
8
|
+
|
|
9
|
+
AE.run do
|
|
10
|
+
AE.add_periodic_timer(0.1) {}
|
|
11
|
+
|
|
12
|
+
Thread.new { str << "a" }
|
|
13
|
+
Thread.new { sleep 0.01 ; str << "b" }
|
|
14
|
+
Thread.new { sleep 0.02 ; str << "c" }
|
|
15
|
+
Thread.new { sleep 0.03 ; str << "d" }
|
|
16
|
+
Thread.new { sleep 0.04 ; AE.stop }
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
assert_false AE.running?
|
|
20
|
+
assert_equal "abcd", str
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def test_02_can_run_anything_in_call_from_other_thread
|
|
24
|
+
str = ""
|
|
25
|
+
|
|
26
|
+
AE.run do
|
|
27
|
+
Thread.new do
|
|
28
|
+
AE.call_from_other_thread { AE.next_tick { str << "a" } }
|
|
29
|
+
end
|
|
30
|
+
Thread.new do
|
|
31
|
+
sleep 0.02
|
|
32
|
+
AE.call_from_other_thread { AE.add_timer(0) { str << "b" } }
|
|
33
|
+
end
|
|
34
|
+
Thread.new do
|
|
35
|
+
sleep 0.02
|
|
36
|
+
AE.call_from_other_thread { AE.add_timer(0.05) { str << "c" } }
|
|
37
|
+
end
|
|
38
|
+
str << "1"
|
|
39
|
+
AE.next_tick { str << "2" }
|
|
40
|
+
AE.add_timer(0.1) { str << "d" ; AE.stop }
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
assert_false AE.running?
|
|
44
|
+
assert_equal "12abcd", str
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
def test_03_run_and_stop_are_thread_safe
|
|
48
|
+
summ = 0
|
|
49
|
+
|
|
50
|
+
th1 = Thread.new do
|
|
51
|
+
AE.run { AE.add_timer(0.1) { AE.stop } }
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
th2 = Thread.new do
|
|
55
|
+
sleep 0.01
|
|
56
|
+
AE.run { summ+=1 }
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
th3 = Thread.new do
|
|
60
|
+
sleep 0.01
|
|
61
|
+
AE.run { AE.add_timer(0) { summ+=1 } }
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
th1.join ; th2.join ; th3.join
|
|
65
|
+
|
|
66
|
+
assert_equal 2, summ
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
end
|
data/test/test_timer.rb
ADDED
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
require "ae_test_helper"
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
class TestTimer < AETest
|
|
5
|
+
|
|
6
|
+
def test_01_timer_fires
|
|
7
|
+
t1_executed = false
|
|
8
|
+
|
|
9
|
+
AE.run do
|
|
10
|
+
t1 = AE::Timer.new(0.01) { t1_executed = true ; assert_false t1.alive? }
|
|
11
|
+
assert_true t1.alive?
|
|
12
|
+
AE.add_timer(0.02) { assert_false t1.alive? }
|
|
13
|
+
AE.add_timer(0.03) { assert_false t1.close ; AE.stop }
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
assert_true t1_executed
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def test_02_timer_closed
|
|
20
|
+
t1_executed = false
|
|
21
|
+
pt1_executed = false
|
|
22
|
+
|
|
23
|
+
AE.run do
|
|
24
|
+
t1 = AE::Timer.new(0.02) { t1_executed = true }
|
|
25
|
+
AE.add_timer(0.01) { assert_true t1.close ; assert_false t1.alive? }
|
|
26
|
+
AE.add_timer(0.03) { assert_false t1.close }
|
|
27
|
+
|
|
28
|
+
pt1 = AE::PeriodicTimer.new(0.02) { pt1_executed = true }
|
|
29
|
+
AE.add_timer(0.01) { assert_true pt1.close ; assert_false pt1.alive? }
|
|
30
|
+
AE.add_timer(0.03) { assert_false pt1.close ; AE.stop }
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
assert_false t1_executed
|
|
34
|
+
assert_false pt1_executed
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def test_03_periodic_timer_closed_after_4_repeats
|
|
38
|
+
pt1_ticks = 0
|
|
39
|
+
|
|
40
|
+
AE.run do
|
|
41
|
+
pt1 = AE::PeriodicTimer.new(0.01) do
|
|
42
|
+
pt1_ticks += 1
|
|
43
|
+
AE.stop if pt1_ticks == 4
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
assert_equal 4, pt1_ticks
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
def test_04_periodic_timer_interval_increased
|
|
51
|
+
pt1_ticks = 0
|
|
52
|
+
pt1_interval = 0.001
|
|
53
|
+
|
|
54
|
+
AE.run do
|
|
55
|
+
pt1 = AE::PeriodicTimer.new(pt1_interval) do
|
|
56
|
+
# This should stop after 0.015 seconds.
|
|
57
|
+
AE.stop if (pt1_ticks += 1) == 4
|
|
58
|
+
pt1.restart (pt1_interval *= 2)
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
# So check that pt1 is terminated after 0.05 seconds (it should).
|
|
62
|
+
AE.add_timer(0.05) { assert_false pt1.alive? }
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
assert_equal 4, pt1_ticks
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
def test_05_timer_restarted
|
|
69
|
+
str1 = ""
|
|
70
|
+
str2 = ""
|
|
71
|
+
|
|
72
|
+
AE.run do
|
|
73
|
+
t1 = AE::Timer.new(0.01) { str1 << "0" }
|
|
74
|
+
t1.restart # So "0" will be written.
|
|
75
|
+
AE.next_tick { t1.restart }
|
|
76
|
+
AE.add_timer(0.02) { assert_false t1.restart } # Timer was terminated so nothing new occurs.
|
|
77
|
+
|
|
78
|
+
t2 = AE::Timer.new(0.01, Proc.new { str2 << "0" })
|
|
79
|
+
t2.pause
|
|
80
|
+
AE.add_timer(0.001) { t2.restart(0.002) }
|
|
81
|
+
|
|
82
|
+
AE.add_timer(0.05) { AE.stop }
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
assert_equal "0", str1
|
|
86
|
+
assert_equal "0", str2
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
def test_06_timer_closed_on_its_callback_does_not_crash
|
|
90
|
+
AE.run do
|
|
91
|
+
t1 = AE::Timer.new(0.001) { assert_false t1.close ; AE.stop }
|
|
92
|
+
end
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
end
|
data/test/test_udp.rb
ADDED
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
require "ae_test_helper"
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
class TestUdp < AETest
|
|
5
|
+
|
|
6
|
+
RECEIVED_DATAGRAMS = []
|
|
7
|
+
|
|
8
|
+
class MyUDP < AE::UDPSocket
|
|
9
|
+
def initialize
|
|
10
|
+
@local_ip, @local_port = local_address()
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def setup
|
|
15
|
+
super
|
|
16
|
+
RECEIVED_DATAGRAMS.clear
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def test_01_udp_basic_ipv4
|
|
20
|
+
return false unless (ip = host_loopback_ipv4)
|
|
21
|
+
private_test_01_udp_basic ip
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def test_01_udp_basic_ipv6
|
|
25
|
+
return false unless (ip = host_loopback_ipv6)
|
|
26
|
+
private_test_01_udp_basic ip
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def test_02_set_encoding_ipv4
|
|
30
|
+
return false unless (ip = host_loopback_ipv4)
|
|
31
|
+
private_test_02_set_encoding ip
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def test_02_set_encoding_ipv6
|
|
35
|
+
return false unless (ip = host_loopback_ipv6)
|
|
36
|
+
private_test_02_set_encoding ip
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def test_03_send_callback_ipv4
|
|
40
|
+
return false unless (ip = host_loopback_ipv4)
|
|
41
|
+
private_test_03_send_callback ip
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def test_03_send_callback_ipv6
|
|
45
|
+
return false unless (ip = host_loopback_ipv6)
|
|
46
|
+
private_test_03_send_callback ip
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
def test_04_datagram_source_address_ipv4
|
|
50
|
+
return false unless (ip = host_loopback_ipv4)
|
|
51
|
+
private_test_04_datagram_source_address ip
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
def test_04_datagram_source_address_ipv6
|
|
55
|
+
return false unless (ip = host_loopback_ipv6)
|
|
56
|
+
private_test_04_datagram_source_address ip
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
private
|
|
61
|
+
|
|
62
|
+
def private_test_01_udp_basic ip
|
|
63
|
+
AE.run do
|
|
64
|
+
sock = AE.open_udp_socket ip, 0
|
|
65
|
+
local_ip, local_port = sock.local_address()
|
|
66
|
+
|
|
67
|
+
assert_true [:ipv4, :ipv6].include?(sock.ip_type)
|
|
68
|
+
|
|
69
|
+
def sock.on_datagram_received datagram, ip, port
|
|
70
|
+
RECEIVED_DATAGRAMS << datagram
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
assert_true sock.alive?
|
|
74
|
+
assert_false sock.paused?
|
|
75
|
+
|
|
76
|
+
assert_equal ip, local_ip
|
|
77
|
+
|
|
78
|
+
# This will be received.
|
|
79
|
+
assert_true sock.send_datagram("1", local_ip, local_port)
|
|
80
|
+
|
|
81
|
+
AE.add_timer(0.1) do
|
|
82
|
+
sock.pause
|
|
83
|
+
assert_true sock.paused?
|
|
84
|
+
|
|
85
|
+
# This wont be received.
|
|
86
|
+
assert_true sock.send_datagram("2", local_ip, local_port)
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
AE.add_timer(0.15) do
|
|
90
|
+
sock.resume
|
|
91
|
+
assert_false sock.paused?
|
|
92
|
+
|
|
93
|
+
# This will be received.
|
|
94
|
+
assert_true sock.send_datagram("3", local_ip, local_port)
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
AE.add_timer(0.2) do
|
|
98
|
+
assert_true sock.close()
|
|
99
|
+
assert_false sock.alive?
|
|
100
|
+
|
|
101
|
+
# Socket closed, cannot be sent.
|
|
102
|
+
assert_false sock.send_datagram "hello", "1.2.3.4", 1234
|
|
103
|
+
|
|
104
|
+
AE.stop
|
|
105
|
+
end
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
assert_equal ["1", "3"], RECEIVED_DATAGRAMS
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
def private_test_02_set_encoding ip
|
|
112
|
+
AE.run do
|
|
113
|
+
sock = AE.open_udp_socket ip, 0
|
|
114
|
+
local_ip, local_port = sock.local_address()
|
|
115
|
+
|
|
116
|
+
def sock.on_datagram_received datagram, ip, port
|
|
117
|
+
RECEIVED_DATAGRAMS << datagram
|
|
118
|
+
AE.stop if RECEIVED_DATAGRAMS.size == 2
|
|
119
|
+
set_encoding_ascii()
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
# Default UDP receiving encoding is ASCII_8BIT.
|
|
123
|
+
assert_equal sock.encoding, :ascii
|
|
124
|
+
|
|
125
|
+
sock.set_encoding_utf8
|
|
126
|
+
assert_equal sock.encoding, :utf8
|
|
127
|
+
sock.send_datagram "\x80", local_ip, local_port
|
|
128
|
+
|
|
129
|
+
sock.send_datagram "\x80", local_ip, local_port
|
|
130
|
+
end
|
|
131
|
+
|
|
132
|
+
assert_equal RECEIVED_DATAGRAMS[0].encoding, Encoding::UTF_8
|
|
133
|
+
assert_false RECEIVED_DATAGRAMS[0].valid_encoding?
|
|
134
|
+
assert_equal RECEIVED_DATAGRAMS[1].encoding, Encoding::ASCII_8BIT
|
|
135
|
+
assert_true RECEIVED_DATAGRAMS[1].valid_encoding?
|
|
136
|
+
end
|
|
137
|
+
|
|
138
|
+
def private_test_03_send_callback ip
|
|
139
|
+
send_cb_ok = 0
|
|
140
|
+
send_cb_error = 0
|
|
141
|
+
|
|
142
|
+
AE.run do
|
|
143
|
+
sock = AE.open_udp_socket ip, 4444
|
|
144
|
+
local_ip, local_port = sock.local_address()
|
|
145
|
+
|
|
146
|
+
def sock.on_datagram_received datagram, ip, port
|
|
147
|
+
RECEIVED_DATAGRAMS << datagram
|
|
148
|
+
end
|
|
149
|
+
|
|
150
|
+
sock.send_datagram "1", local_ip, local_port do |error|
|
|
151
|
+
error ? (send_cb_error += 1) : (send_cb_ok += 1)
|
|
152
|
+
end
|
|
153
|
+
|
|
154
|
+
sock.send_datagram("2", local_ip, local_port, proc do |error|
|
|
155
|
+
error ? (send_cb_error += 1) : (send_cb_ok += 1)
|
|
156
|
+
end)
|
|
157
|
+
|
|
158
|
+
# Sending to destination port 0 causes a EINVAL error.
|
|
159
|
+
sock.send_datagram "3", local_ip, 0 do |error|
|
|
160
|
+
error ? (send_cb_error += 1) : (send_cb_ok += 1)
|
|
161
|
+
assert_equal error.class, AE::UvError
|
|
162
|
+
assert_equal error.type, :EINVAL
|
|
163
|
+
end
|
|
164
|
+
|
|
165
|
+
AE.add_timer(0.1) { assert_true sock.close() ; AE.stop }
|
|
166
|
+
end
|
|
167
|
+
|
|
168
|
+
assert_equal ["1", "2"], RECEIVED_DATAGRAMS
|
|
169
|
+
assert_equal 2, send_cb_ok
|
|
170
|
+
assert_equal 1, send_cb_error
|
|
171
|
+
end
|
|
172
|
+
|
|
173
|
+
def private_test_04_datagram_source_address ip
|
|
174
|
+
sock = nil
|
|
175
|
+
local_ip = nil
|
|
176
|
+
local_port = nil
|
|
177
|
+
|
|
178
|
+
AE.run do
|
|
179
|
+
sock = AE.open_udp_socket ip, 0
|
|
180
|
+
local_ip, local_port = sock.local_address()
|
|
181
|
+
|
|
182
|
+
def sock.on_datagram_received datagram, src_ip, src_port
|
|
183
|
+
RECEIVED_DATAGRAMS << datagram
|
|
184
|
+
@last_src_ip = src_ip
|
|
185
|
+
@last_src_port = src_port
|
|
186
|
+
|
|
187
|
+
case RECEIVED_DATAGRAMS.size
|
|
188
|
+
when 1
|
|
189
|
+
send_datagram "reply1", src_ip, src_port
|
|
190
|
+
when 2
|
|
191
|
+
send_datagram "reply2", src_ip, src_port do |error|
|
|
192
|
+
error ? (@reply_cb_error += 1) : (@reply_cb_ok += 1)
|
|
193
|
+
end
|
|
194
|
+
when 3
|
|
195
|
+
send_datagram("reply3", src_ip, src_port, proc do |error|
|
|
196
|
+
error ? (@reply_cb_error += 1) : (@reply_cb_ok += 1)
|
|
197
|
+
end)
|
|
198
|
+
when 4
|
|
199
|
+
AE.stop
|
|
200
|
+
end
|
|
201
|
+
end
|
|
202
|
+
|
|
203
|
+
sock.instance_variable_set :@reply_cb_ok, 0
|
|
204
|
+
sock.instance_variable_set :@reply_cb_error, 0
|
|
205
|
+
|
|
206
|
+
sock.send_datagram "hello", local_ip, local_port
|
|
207
|
+
end
|
|
208
|
+
|
|
209
|
+
assert_equal ["hello", "reply1", "reply2", "reply3"], RECEIVED_DATAGRAMS
|
|
210
|
+
assert_equal 2, sock.instance_variable_get(:@reply_cb_ok)
|
|
211
|
+
assert_equal 0, sock.instance_variable_get(:@reply_cb_error)
|
|
212
|
+
assert_equal sock.instance_variable_get(:@last_src_ip), local_ip
|
|
213
|
+
assert_equal sock.instance_variable_get(:@last_src_port), local_port
|
|
214
|
+
end
|
|
215
|
+
|
|
216
|
+
end
|
data/test/test_utils.rb
ADDED
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
require "ae_test_helper"
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
class TestUtils < AETest
|
|
5
|
+
|
|
6
|
+
def test_01_hrtime
|
|
7
|
+
assert (AE::Utils.get_hrtime < AE::Utils.get_hrtime)
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def test_02_memory
|
|
11
|
+
assert (AE::Utils.get_free_memory < AE::Utils.get_total_memory)
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def test_03_loadavg
|
|
15
|
+
loadavg = AE::Utils.get_loadavg
|
|
16
|
+
|
|
17
|
+
assert_true loadavg[0].is_a? Float
|
|
18
|
+
assert_true loadavg[1].is_a? Float
|
|
19
|
+
assert_true loadavg[2].is_a? Float
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def test_04_uptime
|
|
23
|
+
assert (AE::Utils.get_uptime < AE::Utils.get_uptime)
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def test_05_network_interfaces
|
|
27
|
+
AE::Utils.get_network_interfaces.each do |iface|
|
|
28
|
+
assert_true (iface.is_a? AE::Utils::NetworkInterface)
|
|
29
|
+
assert_true (iface.name.is_a? String)
|
|
30
|
+
assert_true ([true, false].include? iface.internal?)
|
|
31
|
+
assert_true ([:ipv4, :ipv6].include? iface.ip_type)
|
|
32
|
+
assert_true (iface.ip.is_a? String)
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def test_06_cpu_info
|
|
37
|
+
AE::Utils.get_cpu_info.each do |cpu|
|
|
38
|
+
assert_true (cpu.is_a? AE::Utils::CpuInfo)
|
|
39
|
+
assert_true (cpu.model.is_a? String)
|
|
40
|
+
assert_true (cpu.speed.is_a? Fixnum)
|
|
41
|
+
assert_true (cpu.time_sys.is_a? Float)
|
|
42
|
+
assert_true (cpu.time_user.is_a? Float)
|
|
43
|
+
assert_true (cpu.time_idle.is_a? Float)
|
|
44
|
+
assert_true (cpu.time_irq.is_a? Float)
|
|
45
|
+
assert_true (cpu.time_nice.is_a? Float)
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
end
|