require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
describe "RubyProcess" do
it "should be able to do quick in-and-outs without leaking" do
ts = []
1.upto(2) do |tcount|
ts << Thread.new do
1.upto(10) do
Ruby_process::Cproxy.run do |data|
sp = data[:subproc]
str = sp.new(:String, "Wee")
res1 = str.include?("Kasper")
end
end
end
end
ts.each do |thread|
thread.join
end
end
it "should be able to do basic stuff" do
require "stringio"
Ruby_process::Cproxy.run do |data|
data[:subproc].static(:Object, :require, "rubygems")
data[:subproc].static(:Object, :require, "rexml/document")
doc = Ruby_process::Cproxy::REXML::Document.new
doc.add_element("test")
strio = StringIO.new
doc.write(strio)
raise "Didnt expect REXML to be defined in host process." if Kernel.const_defined?(:REXML)
raise "Expected strio to contain '' but it didnt: '#{strio.string}'." if strio.string != ""
end
end
it "should be able to do multiple calls at once" do
ts = []
0.upto(9) do |tcount|
ts << Thread.new do
Ruby_process::Cproxy.run do |data|
sp = data[:subproc]
sp.new(:String, "Wee")
1.upto(250) do
str = sp.new(:String, "Kasper Johansen")
res1 = str.include?("Kasper")
str << " More"
res2 = str.include?("Johansen")
str << " Even more"
res3 = str.include?("Christina")
str << " Much more"
raise "Expected res1 to be true but it wasnt: '#{res1}'." if res1 != true
raise "Expected res2 to be true but it wasnt: '#{res2}'." if res2 != true
raise "Expected res3 to be false but it wasnt: '#{res3}'." if res3 != false
#print tcount
end
end
end
end
count = 0
ts.each do |t|
count += 1
#puts "Thread #{count}"
t.join
end
end
it "should not leak" do
str = "kasper"
str = nil
sleep 0.1
GC.start
sleep 0.1
count_objs = 0
ObjectSpace.each_object(Ruby_process) do |obj|
count_objs += 1
end
count_proxy_objs = 0
ObjectSpace.each_object(Ruby_process::Proxyobj) do |obj|
count_proxy_objs += 1
end
raise "Expected 1 or less 'Ruby_process' to be left but it wasnt like that: #{count_objs} (proxy objects: #{count_proxy_objs})" if count_objs > 1
raise "Expected 0 constants to be left on cproxy." if !Ruby_process::Cproxy.constants.empty?
end
end