diff options
author | Jari Vetoniemi <jari.vetoniemi@indooratlas.com> | 2020-03-16 18:49:26 +0900 |
---|---|---|
committer | Jari Vetoniemi <jari.vetoniemi@indooratlas.com> | 2020-03-30 00:39:06 +0900 |
commit | fcbf63e62c627deae76c1b8cb8c0876c536ed811 (patch) | |
tree | 64cb17de3f41a2b6fef2368028fbd00349946994 /jni/ruby/test/drb |
Fresh start
Diffstat (limited to 'jni/ruby/test/drb')
-rw-r--r-- | jni/ruby/test/drb/drbtest.rb | 368 | ||||
-rw-r--r-- | jni/ruby/test/drb/ignore_test_drb.rb | 13 | ||||
-rw-r--r-- | jni/ruby/test/drb/test_acl.rb | 197 | ||||
-rw-r--r-- | jni/ruby/test/drb/test_drb.rb | 357 | ||||
-rw-r--r-- | jni/ruby/test/drb/test_drbssl.rb | 76 | ||||
-rw-r--r-- | jni/ruby/test/drb/test_drbunix.rb | 59 | ||||
-rw-r--r-- | jni/ruby/test/drb/ut_array.rb | 16 | ||||
-rw-r--r-- | jni/ruby/test/drb/ut_array_drbssl.rb | 40 | ||||
-rw-r--r-- | jni/ruby/test/drb/ut_array_drbunix.rb | 16 | ||||
-rw-r--r-- | jni/ruby/test/drb/ut_drb.rb | 167 | ||||
-rw-r--r-- | jni/ruby/test/drb/ut_drb_drbssl.rb | 41 | ||||
-rw-r--r-- | jni/ruby/test/drb/ut_drb_drbunix.rb | 17 | ||||
-rw-r--r-- | jni/ruby/test/drb/ut_eq.rb | 36 | ||||
-rw-r--r-- | jni/ruby/test/drb/ut_eval.rb | 36 | ||||
-rw-r--r-- | jni/ruby/test/drb/ut_large.rb | 43 | ||||
-rw-r--r-- | jni/ruby/test/drb/ut_port.rb | 15 | ||||
-rw-r--r-- | jni/ruby/test/drb/ut_safe1.rb | 16 | ||||
-rw-r--r-- | jni/ruby/test/drb/ut_timerholder.rb | 53 |
18 files changed, 1566 insertions, 0 deletions
diff --git a/jni/ruby/test/drb/drbtest.rb b/jni/ruby/test/drb/drbtest.rb new file mode 100644 index 0000000..aac705c --- /dev/null +++ b/jni/ruby/test/drb/drbtest.rb @@ -0,0 +1,368 @@ +require 'test/unit' +require 'drb/drb' +require 'drb/extservm' +require 'timeout' +require 'shellwords' + +module DRbTests + +class DRbService + @@manager = DRb::ExtServManager.new + @@ruby = Shellwords.escape(EnvUtil.rubybin) + @@ruby += " -d" if $DEBUG + def self.add_service_command(nm) + dir = File.dirname(File.expand_path(__FILE__)) + DRb::ExtServManager.command[nm] = [@@ruby, "#{dir}/#{nm}"] + end + + %w(ut_drb.rb ut_array.rb ut_port.rb ut_large.rb ut_safe1.rb ut_eval.rb ut_eq.rb).each do |nm| + add_service_command(nm) + end + @server = @@server = DRb::DRbServer.new('druby://localhost:0', @@manager, {}) + @@manager.uri = @@server.uri + def self.manager + @@manager + end + def self.server + @server || @@server + end + def self.ext_service(name) + timeout(100, RuntimeError) do + manager.service(name) + end + end + def self.finish + @server.instance_variable_get(:@grp).list.each {|th| th.join } + end +end + +class Onecky + include DRbUndumped + def initialize(n) + @num = n + end + + def to_i + @num.to_i + end + + def sleep(n) + Kernel.sleep(n) + to_i + end +end + +class FailOnecky < Onecky + class OneckyError < RuntimeError; end + def to_i + raise(OneckyError, @num.to_s) + end +end + +class XArray < Array + def initialize(ary) + ary.each do |x| + self.push(x) + end + end +end + +module DRbBase + def setup_service(service_name) + @service_name = service_name + @ext = DRbService.ext_service(@service_name) + @there = @ext.front + end + + def teardown + @ext.stop_service if defined?(@ext) && @ext + DRbService.manager.unregist(@service_name) + while (@there&&@there.to_s rescue nil) + # nop + end + signal = /mswin|mingw/ =~ RUBY_PLATFORM ? :KILL : :TERM + Thread.list.each {|th| + if th.respond_to?(:pid) && th[:drb_service] == @service_name + 10.times do + begin + Process.kill signal, th.pid + break + rescue Errno::ESRCH + break + rescue Errno::EPERM # on Windows + sleep 0.1 + retry + end + end + th.join + end + } + end +end + +module DRbCore + include DRbBase + + def test_00_DRbObject + ro = DRbObject.new(nil, 'druby://localhost:12345') + assert_equal('druby://localhost:12345', ro.__drburi) + assert_equal(nil, ro.__drbref) + + ro = DRbObject.new_with_uri('druby://localhost:12345') + assert_equal('druby://localhost:12345', ro.__drburi) + assert_equal(nil, ro.__drbref) + + ro = DRbObject.new_with_uri('druby://localhost:12345?foobar') + assert_equal('druby://localhost:12345', ro.__drburi) + assert_equal(DRb::DRbURIOption.new('foobar'), ro.__drbref) + end + + def test_01 + assert_equal("hello", @there.hello) + onecky = Onecky.new('3') + assert_equal(6, @there.sample(onecky, 1, 2)) + ary = @there.to_a + assert_kind_of(DRb::DRbObject, ary) + + assert(@there.respond_to?(:to_a, true)) + assert(@there.respond_to?(:eval, true)) + assert(! @there.respond_to?(:eval, false)) + assert(! @there.respond_to?(:eval)) + end + + def test_01_02_loop + onecky = Onecky.new('3') + 50.times do + assert_equal(6, @there.sample(onecky, 1, 2)) + ary = @there.to_a + assert_kind_of(DRb::DRbObject, ary) + end + end + + def test_02_unknown + obj = @there.unknown_class + assert_kind_of(DRb::DRbUnknown, obj) + assert_equal('DRbTests::Unknown2', obj.name) + + obj = @there.unknown_module + assert_kind_of(DRb::DRbUnknown, obj) + assert_equal('DRbTests::DRbEx::', obj.name) + + assert_raise(DRb::DRbUnknownError) do + @there.unknown_error + end + + onecky = FailOnecky.new('3') + + assert_raise(FailOnecky::OneckyError) do + @there.sample(onecky, 1, 2) + end + end + + def test_03 + assert_equal(8, @there.sum(1, 1, 1, 1, 1, 1, 1, 1)) + assert_raise(DRb::DRbConnError) do + @there.sum(1, 1, 1, 1, 1, 1, 1, 1, 1) + end + assert_raise(DRb::DRbConnError) do + @there.sum('1' * 4096) + end + end + + def test_04 + assert_respond_to(@there, 'sum') + assert(!(@there.respond_to? "foobar")) + end + + def test_05_eq + a = @there.to_a[0] + b = @there.to_a[0] + assert(a.object_id != b.object_id) + assert(a == b) + assert_equal(a, b) + assert(a == @there) + assert_equal(a.hash, b.hash) + assert_equal(a.hash, @there.hash) + assert(a.eql?(b)) + assert(a.eql?(@there)) + end + + def test_06_timeout + ten = Onecky.new(10) + assert_raise(Timeout::Error) do + @there.do_timeout(ten) + end + assert_raise(Timeout::Error) do + @there.do_timeout(ten) + end + end + + def test_07_public_private_protected_missing + assert_nothing_raised() { + begin + @there.method_missing(:eval, 'nil') + rescue NoMethodError + assert_match(/^private method \`eval\'/, $!.message) + end + } + assert_nothing_raised() { + begin + @there.call_private_method + rescue NoMethodError + assert_equal(NoMethodError, $!.class) + assert_match(/^private method \`call_private_method\'/, $!.message) + end + } + assert_nothing_raised() { + begin + @there.call_protected_method + rescue NoMethodError + assert_equal(NoMethodError, $!.class) + assert_match(/^protected method \`call_protected_method\'/, $!.message) + end + } + assert_nothing_raised() { + begin + @there.method_missing(:undefined_method_test) + rescue NoMethodError + assert_equal(NoMethodError, $!.class) + assert_match(/^undefined method \`undefined_method_test\'/, $!.message) + end + } + assert_raise(DRb::DRbConnError) do + @there.method_missing(:__send__, :to_s) + end + assert_equal(true, @there.missing) + end + + def test_08_here + ro = DRbObject.new(nil, DRb.uri) + assert_kind_of(String, ro.to_s) + + ro = DRbObject.new_with_uri(DRb.uri) + assert_kind_of(String, ro.to_s) + end + + def uri_concat_option(uri, opt) + "#{uri}?#{opt}" + end + + def test_09_option + uri = uri_concat_option(@there.__drburi, "foo") + ro = DRbObject.new_with_uri(uri) + assert_equal(ro.__drburi, @there.__drburi) + assert_equal(3, ro.size) + + uri = uri_concat_option(@there.__drburi, "") + ro = DRbObject.new_with_uri(uri) + assert_equal(ro.__drburi, @there.__drburi) + assert_equal(DRb::DRbURIOption.new(''), ro.__drbref) + + uri = uri_concat_option(@there.__drburi, "hello?world") + ro = DRbObject.new_with_uri(uri) + assert_equal(DRb::DRbURIOption.new('hello?world'), ro.__drbref) + + uri = uri_concat_option(@there.__drburi, "?hello?world") + ro = DRbObject.new_with_uri(uri) + assert_equal(DRb::DRbURIOption.new('?hello?world'), ro.__drbref) + end + + def test_10_yield + @there.simple_hash.each do |k, v| + assert_kind_of(String, k) + assert_kind_of(Symbol, v) + end + end + + def test_10_yield_undumped + @there.xarray2_hash.each do |k, v| + assert_kind_of(String, k) + assert_kind_of(DRbObject, v) + end + end + + def test_11_remote_no_method_error + assert_raise(DRb::DRbRemoteError) do + @there.remote_no_method_error + end + begin + @there.remote_no_method_error + rescue + error = $! + assert_match(/^undefined method .*\(NoMethodError\)/, error.message) + assert_equal('NoMethodError', error.reason) + end + end +end + +module DRbAry + include DRbBase + + def test_01 + assert_kind_of(DRb::DRbObject, @there) + end + + def test_02_collect + ary = @there.collect do |x| x + x end + assert_kind_of(Array, ary) + assert_equal([2, 4, 'IIIIII', 8, 'fivefive', 12], ary) + end + + def test_03_redo + ary = [] + count = 0 + @there.each do |x| + count += 1 + ary.push x + redo if count == 3 + end + assert_equal([1, 2, 'III', 'III', 4, 'five', 6], ary) + end + + # retry in block is not supported on ruby 1.9 + #def test_04_retry + # retried = false + # ary = [] + # @there.each do |x| + # ary.push x + # if x == 4 && !retried + # retried = true + # retry + # end + # end + # assert_equal([1, 2, 'III', 4, 1, 2, 'III', 4, 'five', 6], ary) + #end + + def test_05_break + ary = [] + @there.each do |x| + ary.push x + break if x == 4 + end + assert_equal([1, 2, 'III', 4], ary) + end + + def test_06_next + ary = [] + @there.each do |x| + next if String === x + ary.push x + end + assert_equal([1, 2, 4, 6], ary) + end + + class_eval <<EOS + def test_07_break_18 + ary = [] + result = @there.each do |x| + ary.push x + break(:done) if x == 4 + end + assert_equal([1, 2, 'III', 4], ary) + assert_equal(:done, result) + end +EOS + +end + +end diff --git a/jni/ruby/test/drb/ignore_test_drb.rb b/jni/ruby/test/drb/ignore_test_drb.rb new file mode 100644 index 0000000..8b94650 --- /dev/null +++ b/jni/ruby/test/drb/ignore_test_drb.rb @@ -0,0 +1,13 @@ +require 'drbtest' + +module DRbTests + +class TestDRbReusePort < Test::Unit::TestCase + include DRbAry + + def setup + setup_service 'ut_port.rb' + end +end + +end diff --git a/jni/ruby/test/drb/test_acl.rb b/jni/ruby/test/drb/test_acl.rb new file mode 100644 index 0000000..a1ee1d4 --- /dev/null +++ b/jni/ruby/test/drb/test_acl.rb @@ -0,0 +1,197 @@ +# acltest.rb - ACL unit test +# Copyright (c) 2000 Masatoshi SEKI +# +# acltest.rb is copyrighted free software by Masatoshi SEKI. +# You can redistribute it and/or modify it under the same terms as Ruby. + +require 'test/unit' +require 'drb/acl' + +module DRbTests + +class SampleHosts + def initialize + list = %w(127.0.0.1 localhost + 192.168.1.1 x68k.linux.or.jp + 192.168.1.2 lc630.macos.or.jp + 192.168.1.3 lib30.win32.or.jp + 192.168.1.4 ns00.linux.or.jp + 192.168.1.5 yum.macos.or.jp + ::ffff:192.168.1.5 ipv6.macos.or.jp + ::192.168.1.5 too.yumipv6.macos.or.jp + 192.168.1.254 comstarz.foo.or.jp) + + @hostlist = Array.new(list.size / 2) + @hostlist.each_index do |idx| + @hostlist[idx] = ["AF_INET", 10000, list[idx * 2 + 1], list[idx * 2]] + end + + @hosts = Hash.new + @hostlist.each do |h| + @hosts[h[2].split('.')[0]] = h + end + end + attr_reader(:hostlist, :hosts) +end + + +class ACLEntryTest < Test::Unit::TestCase + HOSTS = SampleHosts.new + + def setup + @hostlist = HOSTS.hostlist + @hosts = HOSTS.hosts + end + + def test_all + a = ACL::ACLEntry.new("*") + b = ACL::ACLEntry.new("all") + @hostlist.each do |h| + assert(a.match(h)) + assert(b.match(h)) + end + end + + def test_ip_v6 + a = ACL::ACLEntry.new('::ffff:192.0.0.0/104') + assert(! a.match(@hosts['localhost'])) + assert(a.match(@hosts['yum'])) + assert(a.match(@hosts['ipv6'])) + assert(! a.match(@hosts['too'])) + end + + def test_ip + a = ACL::ACLEntry.new('192.0.0.0/8') + assert(! a.match(@hosts['localhost'])) + assert(a.match(@hosts['yum'])) + + a = ACL::ACLEntry.new('192.168.0.1/255.255.0.255') + assert(! a.match(@hosts['localhost'])) + assert(! a.match(@hosts['yum'])) + assert(a.match(@hosts['x68k'])) + + a = ACL::ACLEntry.new('192.168.1.0/24') + assert(! a.match(@hosts['localhost'])) + assert(a.match(@hosts['yum'])) + assert(a.match(@hosts['x68k'])) + + a = ACL::ACLEntry.new('92.0.0.0/8') + assert(! a.match(@hosts['localhost'])) + assert(! a.match(@hosts['yum'])) + assert(! a.match(@hosts['x68k'])) + + a = ACL::ACLEntry.new('127.0.0.1/255.0.0.255') + assert(a.match(@hosts['localhost'])) + assert(! a.match(@hosts['yum'])) + assert(! a.match(@hosts['x68k'])) + end + + def test_name + a = ACL::ACLEntry.new('*.jp') + assert(! a.match(@hosts['localhost'])) + assert(a.match(@hosts['yum'])) + + a = ACL::ACLEntry.new('yum.*.jp') + assert(a.match(@hosts['yum'])) + assert(! a.match(@hosts['lc630'])) + + a = ACL::ACLEntry.new('*.macos.or.jp') + assert(a.match(@hosts['yum'])) + assert(a.match(@hosts['lc630'])) + assert(! a.match(@hosts['lib30'])) + end +end + +class ACLListTest < Test::Unit::TestCase + HOSTS = SampleHosts.new + + def setup + @hostlist = HOSTS.hostlist + @hosts = HOSTS.hosts + end + + private + def build(list) + acl= ACL::ACLList.new + list.each do |s| + acl.add s + end + acl + end + + public + def test_all_1 + a = build(%w(all)) + @hostlist.each do |h| + assert(a.match(h)) + end + end + + def test_all_2 + a = build(%w(localhost 127.0.0.0/8 yum.* *)) + @hostlist.each do |h| + assert(a.match(h)) + end + end + + def test_1 + a = build(%w(192.0.0.1/255.0.0.255 yum.*.jp)) + assert(a.match(@hosts['yum'])) + assert(a.match(@hosts['x68k'])) + assert(! a.match(@hosts['lc630'])) + end + + def test_2 + a = build(%w(*.linux.or.jp)) + assert(!a.match(@hosts['yum'])) + assert(a.match(@hosts['x68k'])) + assert(!a.match(@hosts['lc630'])) + end +end + +class ACLTest < Test::Unit::TestCase + HOSTS = SampleHosts.new + + def setup + @hostlist = HOSTS.hostlist + @hosts = HOSTS.hosts + end + + def test_0 + a = ACL.new + @hostlist.each do |h| + assert(a.allow_addr?(h)) + end + end + + def test_not_0 + a = ACL.new([], ACL::ALLOW_DENY) + @hostlist.each do |h| + assert(! a.allow_addr?(h)) + end + end + + def test_1 + data = %w(deny all + allow localhost + allow x68k.*) + + a = ACL.new(data) + assert(a.allow_addr?(@hosts['x68k'])) + assert(a.allow_addr?(@hosts['localhost'])) + assert(! a.allow_addr?(@hosts['lc630'])) + end + + def test_not_1 + data = %w(deny 192.0.0.0/8 + allow localhost + allow x68k.*) + + a = ACL.new(data, ACL::ALLOW_DENY) + assert(!a.allow_addr?(@hosts['x68k'])) + assert(a.allow_addr?(@hosts['localhost'])) + assert(! a.allow_addr?(@hosts['lc630'])) + end +end + +end diff --git a/jni/ruby/test/drb/test_drb.rb b/jni/ruby/test/drb/test_drb.rb new file mode 100644 index 0000000..ffc2935 --- /dev/null +++ b/jni/ruby/test/drb/test_drb.rb @@ -0,0 +1,357 @@ +require_relative 'drbtest' + +module DRbTests + +class TestDRbCore < Test::Unit::TestCase + include DRbCore + + def setup + setup_service 'ut_drb.rb' + super + end + + def teardown + super + DRbService.finish + end +end + +class TestDRbYield < Test::Unit::TestCase + include DRbBase + + def setup + setup_service 'ut_drb.rb' + super + end + + def teardown + super + DRbService.finish + end + + def test_01_one + @there.echo_yield_1([]) {|one| + assert_equal([], one) + } + + @there.echo_yield_1(1) {|one| + assert_equal(1, one) + } + + @there.echo_yield_1(nil) {|one| + assert_equal(nil, one) + } + end + + def test_02_two + @there.echo_yield_2([], []) {|one, two| + assert_equal([], one) + assert_equal([], two) + } + + @there.echo_yield_2(1, 2) {|one, two| + assert_equal(1, one) + assert_equal(2, two) + } + + @there.echo_yield_2(3, nil) {|one, two| + assert_equal(3, one) + assert_equal(nil, two) + } + + @there.echo_yield_1([:key, :value]) {|one, two| + assert_equal(:key, one) + assert_equal(:value, two) + } + end + + def test_03_many + @there.echo_yield_0 {|*s| + assert_equal([], s) + } + @there.echo_yield(nil) {|*s| + assert_equal([nil], s) + } + @there.echo_yield(1) {|*s| + assert_equal([1], s) + } + @there.echo_yield(1, 2) {|*s| + assert_equal([1, 2], s) + } + @there.echo_yield(1, 2, 3) {|*s| + assert_equal([1, 2, 3], s) + } + @there.echo_yield([], []) {|*s| + assert_equal([[], []], s) + } + @there.echo_yield([]) {|*s| + assert_equal([[]], s) # ! + } + end + + def test_04_many_to_one + @there.echo_yield_0 {|*s| + assert_equal([], s) + } + @there.echo_yield(nil) {|*s| + assert_equal([nil], s) + } + @there.echo_yield(1) {|*s| + assert_equal([1], s) + } + @there.echo_yield(1, 2) {|*s| + assert_equal([1, 2], s) + } + @there.echo_yield(1, 2, 3) {|*s| + assert_equal([1, 2, 3], s) + } + @there.echo_yield([], []) {|*s| + assert_equal([[], []], s) + } + @there.echo_yield([]) {|*s| + assert_equal([[]], s) + } + end + + def test_05_array_subclass + @there.xarray_each {|x| assert_kind_of(XArray, x)} + @there.xarray_each {|*x| assert_kind_of(XArray, x[0])} + end + + def test_06_taint + x = proc {} + assert(! x.tainted?) + @there.echo_yield(x) {|o| + assert_equal(x, o) + assert(! x.tainted?) + } + end +end + +class TestDRbRubyYield < TestDRbYield + def echo_yield(*arg) + yield(*arg) + end + + def echo_yield_0 + yield + end + + def echo_yield_1(a) + yield(a) + end + + def echo_yield_2(a, b) + yield(a, b) + end + + def xarray_each + xary = [XArray.new([0])] + xary.each do |x| + yield(x) + end + end + + def setup + @there = self + end + + def teardown + end +end + +class TestDRbRuby18Yield < TestDRbRubyYield + class YieldTest18 + def echo_yield(*arg, &proc) + proc.call(*arg) + end + + def echo_yield_0(&proc) + proc.call + end + + def echo_yield_1(a, &proc) + proc.call(a) + end + + def echo_yield_2(a, b, &proc) + proc.call(a, b) + end + + def xarray_each(&proc) + xary = [XArray.new([0])] + xary.each(&proc) + end + + end + + def setup + @there = YieldTest18.new + end +end + +class TestDRbAry < Test::Unit::TestCase + include DRbAry + + def setup + setup_service 'ut_array.rb' + super + end + + def teardown + super + DRbService.finish + end +end + +class TestDRbMServer < Test::Unit::TestCase + include DRbBase + + def setup + setup_service 'ut_drb.rb' + super + @server = (1..3).collect do |n| + DRb::DRbServer.new(nil, Onecky.new(n.to_s)) + end + end + + def teardown + @server.each do |s| + s.stop_service + end + super + DRbService.finish + end + + def test_01 + assert_equal(6, @there.sample(@server[0].front, @server[1].front, @server[2].front)) + end +end + +class TestDRbSafe1 < TestDRbAry + def setup + setup_service 'ut_safe1.rb' + end + + def teardown + super + DRbService.finish + end +end + +class TestDRbEval # < Test::Unit::TestCase + def setup + super + @ext = DRbService.ext_service('ut_eval.rb') + @there = @ext.front + end + + def teardown + @ext.stop_service if @ext + end + + def test_01_safe1_safe4_eval + assert_raise(SecurityError) do + @there.method_missing(:instance_eval, 'ENV.inspect') + end + + assert_raise(SecurityError) do + @there.method_missing(:send, :eval, 'ENV.inspect') + end + + remote_class = @there.remote_class + + assert_raise(SecurityError) do + remote_class.class_eval('ENV.inspect') + end + + assert_raise(SecurityError) do + remote_class.module_eval('ENV.inspect') + end + + four = @there.four + assert_equal(1, four.method_missing(:send, :eval, '1')) + + remote_class = four.remote_class + + assert_equal(1, remote_class.class_eval('1')) + + assert_equal(1, remote_class.module_eval('1')) + + assert_raise(SecurityError) do + remote_class.class_eval('ENV = {}') + end + + assert_raise(SecurityError) do + remote_class.module_eval('ENV = {}') + end + end +end + +class TestDRbLarge < Test::Unit::TestCase + include DRbBase + + def setup + setup_service 'ut_large.rb' + super + end + + def teardown + super + DRbService.finish + end + + def test_01_large_ary + ary = [2] * 10240 + assert_equal(10240, @there.size(ary)) + assert_equal(20480, @there.sum(ary)) + end + + def test_02_large_ary + ary = ["Hello, World"] * 10240 + assert_equal(10240, @there.size(ary)) + end + + def test_03_large_ary + ary = [Thread.current] * 10240 + assert_equal(10240, @there.size(ary)) + end + + def test_04_many_arg + assert_raise(DRb::DRbConnError) { + @there.arg_test(1, 2, 3, 4, 5, 6, 7, 8, 9, 0) + } + end + + def test_05_too_large_ary + ary = ["Hello, World"] * 102400 + exception = nil + begin + @there.size(ary) + rescue StandardError + exception = $! + end + assert_kind_of(StandardError, exception) + end +end + +class TestBug4409 < Test::Unit::TestCase + include DRbBase + + def setup + setup_service 'ut_eq.rb' + super + end + + def teardown + super + DRbService.finish + end + + def test_bug4409 + foo = @there.foo + assert(@there.foo?(foo)) + end +end + +end diff --git a/jni/ruby/test/drb/test_drbssl.rb b/jni/ruby/test/drb/test_drbssl.rb new file mode 100644 index 0000000..bcf5f90 --- /dev/null +++ b/jni/ruby/test/drb/test_drbssl.rb @@ -0,0 +1,76 @@ +require_relative 'drbtest' + +begin + require 'drb/ssl' +rescue LoadError +end + +module DRbTests + +if Object.const_defined?("OpenSSL") + + +class DRbSSLService < DRbService + %w(ut_drb_drbssl.rb ut_array_drbssl.rb).each do |nm| + add_service_command(nm) + end + config = Hash.new + + config[:SSLVerifyMode] = OpenSSL::SSL::VERIFY_PEER + config[:SSLVerifyCallback] = lambda{ |ok,x509_store| + true + } + begin + data = open("sample.key"){|io| io.read } + config[:SSLPrivateKey] = OpenSSL::PKey::RSA.new(data) + data = open("sample.crt"){|io| io.read } + config[:SSLCertificate] = OpenSSL::X509::Certificate.new(data) + rescue + # $stderr.puts "Switching to use self-signed certificate" + config[:SSLCertName] = + [ ["C","JP"], ["O","Foo.DRuby.Org"], ["CN", "Sample"] ] + end + + uri = ARGV.shift if $0 == __FILE__ + @server = DRb::DRbServer.new(uri || 'drbssl://:0', self.manager, config) +end + +class TestDRbSSLCore < Test::Unit::TestCase + include DRbCore + def setup + setup_service 'ut_drb_drbssl.rb' + super + end + + def teardown + super + DRbService.finish + end + + def test_02_unknown + end + + def test_01_02_loop + end + + def test_05_eq + end +end + +class TestDRbSSLAry < Test::Unit::TestCase + include DRbAry + def setup + setup_service 'ut_array_drbssl.rb' + super + end + + def teardown + super + DRbService.finish + end +end + + +end + +end diff --git a/jni/ruby/test/drb/test_drbunix.rb b/jni/ruby/test/drb/test_drbunix.rb new file mode 100644 index 0000000..c422b7a --- /dev/null +++ b/jni/ruby/test/drb/test_drbunix.rb @@ -0,0 +1,59 @@ +require_relative 'drbtest' + +begin + require 'drb/unix' +rescue LoadError +end + +module DRbTests + +if Object.const_defined?("UNIXServer") + + +class DRbUNIXService < DRbService + %w(ut_drb_drbunix.rb ut_array_drbunix.rb).each do |nm| + add_service_command(nm) + end + + uri = ARGV.shift if $0 == __FILE__ + @server = DRb::DRbServer.new(uri || 'drbunix:', self.manager, {}) +end + +class TestDRbUNIXCore < Test::Unit::TestCase + include DRbCore + def setup + setup_service 'ut_drb_drbunix.rb' + super + end + + def teardown + super + DRbService.finish + end + + def test_02_unknown + end + + def test_01_02_loop + end + + def test_05_eq + end +end + +class TestDRbUNIXAry < Test::Unit::TestCase + include DRbAry + def setup + setup_service 'ut_array_drbunix.rb' + super + end + def teardown + super + DRbService.finish + end +end + + +end + +end diff --git a/jni/ruby/test/drb/ut_array.rb b/jni/ruby/test/drb/ut_array.rb new file mode 100644 index 0000000..01599f1 --- /dev/null +++ b/jni/ruby/test/drb/ut_array.rb @@ -0,0 +1,16 @@ +require 'drb/drb' +require 'drb/extserv' + +if __FILE__ == $0 + def ARGV.shift + it = super() + raise "usage: #{$0} <uri> <name>" unless it + it + end + + DRb.start_service('druby://localhost:0', [1, 2, 'III', 4, "five", 6]) + es = DRb::ExtServ.new(ARGV.shift, ARGV.shift) + DRb.thread.join + es.stop_service if es.alive? +end + diff --git a/jni/ruby/test/drb/ut_array_drbssl.rb b/jni/ruby/test/drb/ut_array_drbssl.rb new file mode 100644 index 0000000..fa9afa6 --- /dev/null +++ b/jni/ruby/test/drb/ut_array_drbssl.rb @@ -0,0 +1,40 @@ +require 'drb/drb' +require 'drb/extserv' +require 'drb/ssl' + +if __FILE__ == $0 + def ARGV.shift + it = super() + raise "usage: #{$0} <uri> <name>" unless it + it + end + + module DRbTests + + TEST_KEY_DH1024 = OpenSSL::PKey::DH.new <<-_end_of_pem_ +-----BEGIN DH PARAMETERS----- +MIGHAoGBAKnKQ8MNK6nYZzLrrcuTsLxuiJGXoOO5gT+tljOTbHBuiktdMTITzIY0 +pFxIvjG05D7HoBZQfrR0c92NGWPkAiCkhQKB8JCbPVzwNLDy6DZ0pmofDKrEsYHG +AQjjxMXhwULlmuR/K+WwlaZPiLIBYalLAZQ7ZbOPeVkJ8ePao0eLAgEC +-----END DH PARAMETERS----- + _end_of_pem_ + + TEST_KEY_DH1024.priv_key = OpenSSL::BN.new("48561834C67E65FFD2A9B47F41E5E78FDC95C387428FDB1E4B0188B64D1643C3A8D3455B945B7E8C4D166010C7C2CE23BFB9BEF43D0348FE7FA5284B0225E7FE1537546D114E3D8A4411B9B9351AB451E1A358F50ED61B1F00DA29336EEBBD649980AC86D76AF8BBB065298C2052672EEF3EF13AB47A15275FC2836F3AC74CEA", 16) + + end + + config = Hash.new + config[:SSLTmpDhCallback] = proc { DRbTests::TEST_KEY_DH1024 } + config[:SSLVerifyMode] = OpenSSL::SSL::VERIFY_PEER + config[:SSLVerifyCallback] = lambda{|ok,x509_store| + true + } + config[:SSLCertName] = + [ ["C","JP"], ["O","Foo.DRuby.Org"], ["CN", "Sample"] ] + + DRb.start_service('drbssl://localhost:0', [1, 2, 'III', 4, "five", 6], config) + es = DRb::ExtServ.new(ARGV.shift, ARGV.shift) + DRb.thread.join + es.stop_service if es.alive? +end + diff --git a/jni/ruby/test/drb/ut_array_drbunix.rb b/jni/ruby/test/drb/ut_array_drbunix.rb new file mode 100644 index 0000000..dd39790 --- /dev/null +++ b/jni/ruby/test/drb/ut_array_drbunix.rb @@ -0,0 +1,16 @@ +require 'drb/drb' +require 'drb/extserv' + +if __FILE__ == $0 + def ARGV.shift + it = super() + raise "usage: #{$0} <uri> <name>" unless it + it + end + + DRb.start_service('drbunix:', [1, 2, 'III', 4, "five", 6]) + es = DRb::ExtServ.new(ARGV.shift, ARGV.shift) + DRb.thread.join + es.stop_service if es.alive? +end + diff --git a/jni/ruby/test/drb/ut_drb.rb b/jni/ruby/test/drb/ut_drb.rb new file mode 100644 index 0000000..c2a5f62 --- /dev/null +++ b/jni/ruby/test/drb/ut_drb.rb @@ -0,0 +1,167 @@ +require 'drb/drb' +require 'drb/extserv' +require 'timeout' + +module DRbTests + +class XArray < Array + def initialize(ary) + ary.each do |x| + self.push(x) + end + end +end + +class XArray2 < XArray + include DRbUndumped +end + +class Unknown2 + def initialize + @foo = 'unknown2' + end +end + +class DRbEx + include DRbUndumped + + class FooBar + def initialize + @foo = 'bar' + end + end + + class UError < RuntimeError; end + + def initialize + @xary2_hash = nil + @hash = nil + @hello = 'hello' + end + attr_reader :hello + + def sample(a, b, c) + a.to_i + b.to_i + c.to_i + end + + def sum(*a) + s = 0 + a.each do |e| + s += e.to_i + end + s + end + + def do_timeout(n) + timeout(0.1) do + n.sleep(2) + end + end + + def unknown_module + FooBar.new + end + + def unknown_class + Unknown2.new + end + + def unknown_error + raise UError + end + + def remote_no_method_error + invoke_no_method(self) + end + + def test_yield + yield + yield([]) + yield(*[]) + end + + def echo_yield(*arg) + yield(*arg) + nil + end + + def echo_yield_0 + yield + nil + end + + def echo_yield_1(one) + yield(one) + nil + end + + def echo_yield_2(one, two) + yield(one, two) + nil + end + + def xarray_each + xary = [XArray.new([0])] + xary.each do |x| + yield(x) + end + nil + end + + def xarray2_hash + unless @xary2_hash + @xary2_hash = { "a" => XArray2.new([0]), "b" => XArray2.new([1]) } + end + DRbObject.new(@xary2_hash) + end + + def simple_hash + unless @hash + @hash = { 'a'=>:a, 'b'=>:b } + end + DRbObject.new(@hash) + end + + def [](key) + key.to_s + end + + def to_a + [self] + end + + def method_missing(msg, *a, &b) + if msg == :missing + return true + else + super(msg, *a, &b) + end + end + + private + def call_private_method + true + end + + protected + def call_protected_method + true + end +end + +end + +if __FILE__ == $0 + def ARGV.shift + it = super() + raise "usage: #{$0} <manager-uri> <name>" unless it + it + end + + DRb::DRbServer.default_argc_limit(8) + DRb::DRbServer.default_load_limit(4096) + DRb.start_service('druby://localhost:0', DRbTests::DRbEx.new) + es = DRb::ExtServ.new(ARGV.shift, ARGV.shift) + DRb.thread.join + es.stop_service if es.alive? +end diff --git a/jni/ruby/test/drb/ut_drb_drbssl.rb b/jni/ruby/test/drb/ut_drb_drbssl.rb new file mode 100644 index 0000000..b6d1c12 --- /dev/null +++ b/jni/ruby/test/drb/ut_drb_drbssl.rb @@ -0,0 +1,41 @@ +require_relative "ut_drb" +require 'drb/ssl' + +if __FILE__ == $0 + def ARGV.shift + it = super() + raise "usage: #{$0} <manager-uri> <name>" unless it + it + end + + module DRbTests + + TEST_KEY_DH1024 = OpenSSL::PKey::DH.new <<-_end_of_pem_ +-----BEGIN DH PARAMETERS----- +MIGHAoGBAKnKQ8MNK6nYZzLrrcuTsLxuiJGXoOO5gT+tljOTbHBuiktdMTITzIY0 +pFxIvjG05D7HoBZQfrR0c92NGWPkAiCkhQKB8JCbPVzwNLDy6DZ0pmofDKrEsYHG +AQjjxMXhwULlmuR/K+WwlaZPiLIBYalLAZQ7ZbOPeVkJ8ePao0eLAgEC +-----END DH PARAMETERS----- + _end_of_pem_ + + TEST_KEY_DH1024.priv_key = OpenSSL::BN.new("48561834C67E65FFD2A9B47F41E5E78FDC95C387428FDB1E4B0188B64D1643C3A8D3455B945B7E8C4D166010C7C2CE23BFB9BEF43D0348FE7FA5284B0225E7FE1537546D114E3D8A4411B9B9351AB451E1A358F50ED61B1F00DA29336EEBBD649980AC86D76AF8BBB065298C2052672EEF3EF13AB47A15275FC2836F3AC74CEA", 16) + + end + + config = Hash.new + config[:SSLTmpDhCallback] = proc { DRbTests::TEST_KEY_DH1024 } + config[:SSLVerifyMode] = OpenSSL::SSL::VERIFY_PEER + config[:SSLVerifyCallback] = lambda{|ok,x509_store| + true + } + config[:SSLCertName] = + [ ["C","JP"], ["O","Foo.DRuby.Org"], ["CN", "Sample"] ] + + DRb::DRbServer.default_argc_limit(8) + DRb::DRbServer.default_load_limit(4096) + DRb.start_service('drbssl://localhost:0', DRbTests::DRbEx.new, config) + es = DRb::ExtServ.new(ARGV.shift, ARGV.shift) + DRb.thread.join + es.stop_service if es.alive? +end + diff --git a/jni/ruby/test/drb/ut_drb_drbunix.rb b/jni/ruby/test/drb/ut_drb_drbunix.rb new file mode 100644 index 0000000..c997d24 --- /dev/null +++ b/jni/ruby/test/drb/ut_drb_drbunix.rb @@ -0,0 +1,17 @@ +require "#{File.dirname(File.expand_path(__FILE__))}/ut_drb" + +if __FILE__ == $0 + def ARGV.shift + it = super() + raise "usage: #{$0} <manager-uri> <name>" unless it + it + end + + DRb::DRbServer.default_argc_limit(8) + DRb::DRbServer.default_load_limit(4096) + DRb.start_service('drbunix:', DRbTests::DRbEx.new) + es = DRb::ExtServ.new(ARGV.shift, ARGV.shift) + DRb.thread.join + es.stop_service if es.alive? +end + diff --git a/jni/ruby/test/drb/ut_eq.rb b/jni/ruby/test/drb/ut_eq.rb new file mode 100644 index 0000000..cc86158 --- /dev/null +++ b/jni/ruby/test/drb/ut_eq.rb @@ -0,0 +1,36 @@ +require 'drb/drb' +require 'drb/extserv' + +module DRbTests + +class Foo + include DRbUndumped +end + +class Bar + include DRbUndumped + def initialize + @foo = Foo.new + end + attr_reader :foo + + def foo?(foo) + @foo == foo + end +end + +end + +if __FILE__ == $0 + def ARGV.shift + it = super() + raise "usage: #{$0} <uri> <name>" unless it + it + end + + DRb.start_service('druby://localhost:0', DRbTests::Bar.new) + es = DRb::ExtServ.new(ARGV.shift, ARGV.shift) + DRb.thread.join + es.stop_service if es.alive? +end + diff --git a/jni/ruby/test/drb/ut_eval.rb b/jni/ruby/test/drb/ut_eval.rb new file mode 100644 index 0000000..c456790 --- /dev/null +++ b/jni/ruby/test/drb/ut_eval.rb @@ -0,0 +1,36 @@ +require 'drb/drb' +require 'drb/extserv' + +module DRbTests + +class EvalAttack + def initialize + @four = DRb::DRbServer.new('druby://localhost:0', self, {:safe_level => 4}) + end + + def four + DRbObject.new_with_uri(@four.uri) + end + + def remote_class + DRbObject.new(self.class) + end +end + +end + + +if __FILE__ == $0 + def ARGV.shift + it = super() + raise "usage: #{$0} <uri> <name>" unless it + it + end + + $SAFE = 1 + + DRb.start_service('druby://localhost:0', DRbTests::EvalAttack.new, {:safe_level => 2}) + es = DRb::ExtServ.new(ARGV.shift, ARGV.shift) + DRb.thread.join + es.stop_service if es.alive? +end diff --git a/jni/ruby/test/drb/ut_large.rb b/jni/ruby/test/drb/ut_large.rb new file mode 100644 index 0000000..c2fbd3e --- /dev/null +++ b/jni/ruby/test/drb/ut_large.rb @@ -0,0 +1,43 @@ +require 'drb/drb' +require 'drb/extserv' +require 'timeout' + +module DRbTests + +class DRbLarge + include DRbUndumped + + def size(ary) + ary.size + end + + def sum(ary) + sum = 0 + ary.each do |e| + sum += e.to_i + end + sum + end + + def arg_test(*arg) + # nop + end +end + +end + +if __FILE__ == $0 + def ARGV.shift + it = super() + raise "usage: #{$0} <manager-uri> <name>" unless it + it + end + + DRb::DRbServer.default_argc_limit(3) + DRb::DRbServer.default_load_limit(100000) + DRb.start_service('druby://localhost:0', DRbTests::DRbLarge.new) + es = DRb::ExtServ.new(ARGV.shift, ARGV.shift) + DRb.thread.join + es.stop_service if es.alive? +end + diff --git a/jni/ruby/test/drb/ut_port.rb b/jni/ruby/test/drb/ut_port.rb new file mode 100644 index 0000000..3009db5 --- /dev/null +++ b/jni/ruby/test/drb/ut_port.rb @@ -0,0 +1,15 @@ +require 'drb/drb' +require 'drb/extserv' + +if __FILE__ == $0 + def ARGV.shift + it = super() + raise "usage: #{$0} <uri> <name>" unless it + it + end + + DRb.start_service('druby://:8473', [1, 2, 'III', 4, "five", 6]) + es = DRb::ExtServ.new(ARGV.shift, ARGV.shift) + DRb.thread.join + es.stop_service if es.alive? +end diff --git a/jni/ruby/test/drb/ut_safe1.rb b/jni/ruby/test/drb/ut_safe1.rb new file mode 100644 index 0000000..43eb367 --- /dev/null +++ b/jni/ruby/test/drb/ut_safe1.rb @@ -0,0 +1,16 @@ +require 'drb/drb' +require 'drb/extserv' + +if __FILE__ == $0 + def ARGV.shift + it = super() + raise "usage: #{$0} <uri> <name>" unless it + it + end + + DRb.start_service('druby://localhost:0', [1, 2, 'III', 4, "five", 6], + {:safe_level => 1}) + es = DRb::ExtServ.new(ARGV.shift, ARGV.shift) + DRb.thread.join + es.stop_service if es.alive? +end diff --git a/jni/ruby/test/drb/ut_timerholder.rb b/jni/ruby/test/drb/ut_timerholder.rb new file mode 100644 index 0000000..6c62ea7 --- /dev/null +++ b/jni/ruby/test/drb/ut_timerholder.rb @@ -0,0 +1,53 @@ +require 'runit/testcase' +require 'runit/cui/testrunner' +require 'timerholder' + +module DRbTests + +class TimerHolderTest < RUNIT::TestCase + def do_test(timeout, keeper_sleep = nil) + holder = TimerHolder.new(timeout) + holder.keeper_sleep = keeper_sleep if keeper_sleep + key = holder.add(self) + sleep(timeout * 0.5) + assert_equal(holder.peek(key), self) + holder.delete(key) + assert(!holder.include?(key)) + key = holder.add(self) + sleep(timeout+0.5) + assert_equal(holder.fetch(key), nil) + key = holder.add(self) + assert_equal(holder.fetch(key), self) + holder.store(key, true) + assert_equal(holder.fetch(key), true) + assert_equal(holder.include?(key), true) + sleep(timeout+0.5) + assert_exception(TimerHolder::InvalidIndexError) do + holder.store(key, 1) + end + assert_equal(holder.include?(key), false) + key = holder.add(self) + sleep(timeout * 0.5) + assert(holder.include?(key)) + holder.extend(key, timeout) + sleep(timeout * 0.5) + assert(holder.include?(key)) + sleep(timeout * 0.6) + assert(!holder.include?(key)) + holder.delete(key) + end + + def test_00 + do_test(0.5) + end + + def test_01 + do_test(1, 0.5) + end +end + +end + +if __FILE__ == $0 + RUNIT::CUI::TestRunner.run(DRbTests::TimerHolderTest.suite) +end |