1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00
ruby--ruby/test/dl/test_cfunc.rb
usa 597d60f792 * test/dl/test_cfunc.rb (test_last_error): CFunc.last_error is thread local
variable.  So, if another test calls CFunc#call, it's set.


git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@28125 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2010-06-02 07:49:00 +00:00

76 lines
1.7 KiB
Ruby

require_relative 'test_base'
require 'dl/func'
module DL
class TestCFunc < TestBase
def setup
super
@name = 'strcpy'
@cf = CFunc.new(@libc[@name], TYPE_VOIDP, @name)
end
def test_ptr=
@cf.ptr = @libc['malloc']
assert_equal @cf.ptr, @libc['malloc']
end
def test_ptr
assert_equal @cf.ptr, @libc[@name]
end
def test_set_calltype
@cf.calltype = :foo
assert_equal :foo, @cf.calltype
end
def test_new_ptr_type_name
assert_equal @name, @cf.name
assert @cf.name.tainted?, 'name should be tainted'
assert_equal :cdecl, @cf.calltype
assert_equal TYPE_VOIDP, @cf.ctype
end
def test_new_ptr
cf = CFunc.new(@libc['strcpy'])
assert_nil cf.name
assert_equal :cdecl, cf.calltype
assert_equal TYPE_VOID, cf.ctype
end
def test_name_should_be_duped
assert_equal @name, @cf.name
assert @cf.name.tainted?, 'name should be tainted'
name = @name.dup
@name << 'foo'
assert_equal name, @cf.name
end
def test_to_s
s = @cf.to_s
assert s.tainted?, 'to_s should be tainted'
assert_match(/ptr=#{sprintf("0x0*%x", @cf.ptr)}/, s)
assert_match(/name='#{@cf.name}'/, s)
assert_match(/type=#{@cf.ctype}/, s)
end
def test_inspect
assert_equal @cf.inspect, @cf.to_s
end
def test_to_i
assert_equal @cf.to_i, @cf.ptr
assert_equal @libc[@name], @cf.to_i
end
def test_last_error
Thread.new do
f = Function.new(@cf, [TYPE_VOIDP, TYPE_VOIDP])
assert_nil CFunc.last_error
str = f.call("000", "123")
assert_not_nil CFunc.last_error
end.join
end
end
end