summaryrefslogtreecommitdiff
path: root/spec/ffi/library_spec.rb
diff options
context:
space:
mode:
Diffstat (limited to 'spec/ffi/library_spec.rb')
-rw-r--r--spec/ffi/library_spec.rb100
1 files changed, 81 insertions, 19 deletions
diff --git a/spec/ffi/library_spec.rb b/spec/ffi/library_spec.rb
index a17d673..8691b17 100644
--- a/spec/ffi/library_spec.rb
+++ b/spec/ffi/library_spec.rb
@@ -5,6 +5,12 @@
require File.expand_path(File.join(File.dirname(__FILE__), "spec_helper"))
+module TestEnumValueRactor
+ extend FFI::Library
+ enum :something, [:one, :two]
+ freeze
+end
+
describe "Library" do
describe ".enum_value" do
m = Module.new do
@@ -20,6 +26,14 @@ describe "Library" do
it "should return nil for an invalid key" do
expect(m.enum_value(:three)).to be nil
end
+
+ it "should be queryable in Ractor", :ractor do
+ res = Ractor.new do
+ TestEnumValueRactor.enum_value(:one)
+ end.take
+
+ expect( res ).to eq(0)
+ end
end
describe "#ffi_convention" do
@@ -184,15 +198,49 @@ describe "Library" do
end.getpid).to eq(Process.pid)
}.to raise_error(LoadError)
end
+ end
- it "attach_function :bool_return_true from [ File.expand_path(#{TestLibrary::PATH.inspect}) ]" do
- mod = Module.new do |m|
- m.extend FFI::Library
- ffi_lib File.expand_path(TestLibrary::PATH)
- attach_function :bool_return_true, [ ], :bool
- end
- expect(mod.bool_return_true).to be true
+ it "attach_function :bool_return_true from [ File.expand_path(#{TestLibrary::PATH.inspect}) ]" do
+ mod = Module.new do |m|
+ m.extend FFI::Library
+ ffi_lib File.expand_path(TestLibrary::PATH)
+ attach_function :bool_return_true, [ ], :bool
+ end
+ expect(mod.bool_return_true).to be true
+ end
+
+ it "can define a foo! function" do
+ mod = Module.new do |m|
+ m.extend FFI::Library
+ ffi_lib File.expand_path(TestLibrary::PATH)
+ attach_function :foo!, :bool_return_true, [], :bool
end
+ expect(mod.foo!).to be true
+ end
+
+ it "can define a foo? function" do
+ mod = Module.new do |m|
+ m.extend FFI::Library
+ ffi_lib File.expand_path(TestLibrary::PATH)
+ attach_function :foo?, :bool_return_true, [], :bool
+ end
+ expect(mod.foo?).to be true
+ end
+
+ it "can reveal the function type" do
+ skip 'this is not yet implemented on JRuby' if RUBY_ENGINE == 'jruby'
+ skip 'this is not yet implemented on Truffleruby' if RUBY_ENGINE == 'truffleruby'
+
+ mod = Module.new do |m|
+ m.extend FFI::Library
+ ffi_lib File.expand_path(TestLibrary::PATH)
+ attach_function :bool_return_true, [ :string ], :bool
+ end
+
+ fun = mod.attached_functions
+ expect(fun.keys).to eq([:bool_return_true])
+ expect(fun[:bool_return_true].param_types).to eq([FFI::Type::STRING])
+ expect(fun[:bool_return_true].return_type).to eq(FFI::Type::BOOL)
end
def gvar_lib(name, type)
@@ -323,20 +371,34 @@ describe "Library" do
end
end
- describe "Symbol" do
- before do
- @libtest = FFI::DynamicLibrary.open(
- TestLibrary::PATH,
- FFI::DynamicLibrary::RTLD_LAZY | FFI::DynamicLibrary::RTLD_GLOBAL,
- )
+ it "can reveal its attached global struct based variables" do
+ lib = Module.new do |m|
+ m.extend FFI::Library
+ ffi_lib TestLibrary::PATH
+ attach_variable :gvari, "gvar_gstruct", GlobalStruct
end
+ expect(lib.attached_variables).to eq({ gvari: GlobalStruct })
+ end
- it "has a memsize function", skip: RUBY_ENGINE != "ruby" do
- base_size = ObjectSpace.memsize_of(Object.new)
-
- symbol = @libtest.find_symbol("gvar_gstruct_set")
- size = ObjectSpace.memsize_of(symbol)
- expect(size).to be > base_size
+ it "can reveal its attached global variables" do
+ lib = Module.new do |m|
+ m.extend FFI::Library
+ ffi_lib TestLibrary::PATH
+ attach_variable "gvaro", "gvar_u32", :uint32
end
+ expect(lib.attached_variables).to eq({ gvaro: FFI::Type::UINT32 })
+ end
+
+ it "should have shareable constants for Ractor", :ractor do
+ res = Ractor.new do
+ [
+ FFI::Library::LIBC,
+ FFI::Library::CURRENT_PROCESS,
+ FFI::CURRENT_PROCESS,
+ FFI::USE_THIS_PROCESS_AS_LIBRARY,
+ ]
+ end.take
+
+ expect( res.size ).to be > 0
end
end