summaryrefslogtreecommitdiff
path: root/test/fiddle/test_pointer.rb
diff options
context:
space:
mode:
Diffstat (limited to 'test/fiddle/test_pointer.rb')
-rw-r--r--test/fiddle/test_pointer.rb126
1 files changed, 88 insertions, 38 deletions
diff --git a/test/fiddle/test_pointer.rb b/test/fiddle/test_pointer.rb
index bd059c51d4..7d708ee417 100644
--- a/test/fiddle/test_pointer.rb
+++ b/test/fiddle/test_pointer.rb
@@ -1,3 +1,4 @@
+# frozen_string_literal: true
begin
require_relative 'helper'
rescue LoadError
@@ -9,8 +10,6 @@ module Fiddle
Fiddle.dlwrap arg
end
- include Test::Unit::Assertions
-
def test_cptr_to_int
null = Fiddle::NULL
assert_equal(null.to_i, null.to_int)
@@ -33,6 +32,31 @@ module Fiddle
assert_equal free.to_i, ptr.free.to_i
end
+ def test_malloc_block
+ escaped_ptr = nil
+ returned = Pointer.malloc(10, Fiddle::RUBY_FREE) do |ptr|
+ assert_equal 10, ptr.size
+ assert_equal Fiddle::RUBY_FREE, ptr.free.to_i
+ escaped_ptr = ptr
+ :returned
+ end
+ assert_equal :returned, returned
+ assert escaped_ptr.freed?
+ end
+
+ def test_malloc_block_no_free
+ assert_raise ArgumentError do
+ Pointer.malloc(10) { |ptr| }
+ end
+ end
+
+ def test_malloc_subclass
+ subclass = Class.new(Pointer)
+ subclass.malloc(10, Fiddle::RUBY_FREE) do |ptr|
+ assert ptr.is_a?(subclass)
+ end
+ end
+
def test_to_str
str = Marshal.load(Marshal.dump("hello world"))
ptr = Pointer[str]
@@ -80,23 +104,23 @@ module Fiddle
def test_to_ptr_string
str = "hello world"
ptr = Pointer[str]
- assert ptr.tainted?, 'pointer should be tainted'
assert_equal str.length, ptr.size
assert_equal 'hello', ptr[0,5]
end
def test_to_ptr_io
- buf = Pointer.malloc(10)
- File.open(__FILE__, 'r') do |f|
- ptr = Pointer.to_ptr f
- fread = Function.new(@libc['fread'],
- [TYPE_VOIDP, TYPE_INT, TYPE_INT, TYPE_VOIDP],
- TYPE_INT)
- fread.call(buf.to_i, Fiddle::SIZEOF_CHAR, buf.size - 1, ptr.to_i)
- end
-
- File.open(__FILE__, 'r') do |f|
- assert_equal f.read(9), buf.to_s
+ Pointer.malloc(10, Fiddle::RUBY_FREE) do |buf|
+ File.open(__FILE__, 'r') do |f|
+ ptr = Pointer.to_ptr f
+ fread = Function.new(@libc['fread'],
+ [TYPE_VOIDP, TYPE_INT, TYPE_INT, TYPE_VOIDP],
+ TYPE_INT)
+ fread.call(buf.to_i, Fiddle::SIZEOF_CHAR, buf.size - 1, ptr.to_i)
+ end
+
+ File.open(__FILE__, 'r') do |f|
+ assert_equal f.read(9), buf.to_s
+ end
end
end
@@ -105,7 +129,7 @@ module Fiddle
ptr2 = Pointer.to_ptr Struct.new(:to_ptr).new(ptr)
assert_equal ptr, ptr2
- assert_raises(Fiddle::DLError) do
+ assert_raise(Fiddle::DLError) do
Pointer.to_ptr Struct.new(:to_ptr).new(nil)
end
end
@@ -147,24 +171,14 @@ module Fiddle
def test_free
ptr = Pointer.malloc(4)
- assert_nil ptr.free
+ begin
+ assert_nil ptr.free
+ ensure
+ Fiddle.free ptr
+ end
end
def test_free=
- assert_normal_exit(<<-"End", '[ruby-dev:39269]')
- require 'fiddle'
- Fiddle::LIBC_SO = #{Fiddle::LIBC_SO.dump}
- Fiddle::LIBM_SO = #{Fiddle::LIBM_SO.dump}
- include Fiddle
- @libc = dlopen(LIBC_SO)
- @libm = dlopen(LIBM_SO)
- free = Fiddle::Function.new(Fiddle::RUBY_FREE, [TYPE_VOIDP], TYPE_VOID)
- ptr = Fiddle::Pointer.malloc(4)
- ptr.free = free
- free.ptr
- ptr.free.ptr
- End
-
free = Function.new(Fiddle::RUBY_FREE, [TYPE_VOIDP], TYPE_VOID)
ptr = Pointer.malloc(4)
ptr.free = free
@@ -172,22 +186,49 @@ module Fiddle
assert_equal free.ptr, ptr.free.ptr
end
+ def test_free_with_func
+ ptr = Pointer.malloc(4, Fiddle::RUBY_FREE)
+ refute ptr.freed?
+ ptr.call_free
+ assert ptr.freed?
+ ptr.call_free # you can safely run it again
+ assert ptr.freed?
+ GC.start # you can safely run the GC routine
+ assert ptr.freed?
+ end
+
+ def test_free_with_no_func
+ ptr = Pointer.malloc(4)
+ refute ptr.freed?
+ ptr.call_free
+ refute ptr.freed?
+ ptr.call_free # you can safely run it again
+ refute ptr.freed?
+ end
+
+ def test_freed?
+ ptr = Pointer.malloc(4, Fiddle::RUBY_FREE)
+ refute ptr.freed?
+ ptr.call_free
+ assert ptr.freed?
+ end
+
def test_null?
ptr = Pointer.new(0)
assert ptr.null?
end
def test_size
- ptr = Pointer.malloc(4)
- assert_equal 4, ptr.size
- Fiddle.free ptr.to_i
+ Pointer.malloc(4, Fiddle::RUBY_FREE) do |ptr|
+ assert_equal 4, ptr.size
+ end
end
def test_size=
- ptr = Pointer.malloc(4)
- ptr.size = 10
- assert_equal 10, ptr.size
- Fiddle.free ptr.to_i
+ Pointer.malloc(4, Fiddle::RUBY_FREE) do |ptr|
+ ptr.size = 10
+ assert_equal 10, ptr.size
+ end
end
def test_aref_aset
@@ -231,7 +272,16 @@ module Fiddle
end
def test_no_memory_leak
- assert_no_memory_leak(%w[-W0 -rfiddle.so], '', '100_000.times {Fiddle::Pointer.allocate}', rss: true)
+ if respond_to?(:assert_nothing_leaked_memory)
+ n_tries = 100_000
+ assert_nothing_leaked_memory(SIZEOF_VOIDP * (n_tries / 100)) do
+ n_tries.times do
+ Fiddle::Pointer.allocate
+ end
+ end
+ else
+ assert_no_memory_leak(%w[-W0 -rfiddle.so], '', '100_000.times {Fiddle::Pointer.allocate}', rss: true)
+ end
end
end
end if defined?(Fiddle)