summaryrefslogtreecommitdiff
path: root/test/dl/test_cfunc.rb
blob: 28501f2c6d195d6c76c239a34fe3829afc42c367 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
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("0x%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
      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
  end
end