summaryrefslogtreecommitdiff
path: root/jni/ruby/test/dtrace/helper.rb
diff options
context:
space:
mode:
Diffstat (limited to 'jni/ruby/test/dtrace/helper.rb')
-rw-r--r--jni/ruby/test/dtrace/helper.rb50
1 files changed, 50 insertions, 0 deletions
diff --git a/jni/ruby/test/dtrace/helper.rb b/jni/ruby/test/dtrace/helper.rb
new file mode 100644
index 0000000..ccc7081
--- /dev/null
+++ b/jni/ruby/test/dtrace/helper.rb
@@ -0,0 +1,50 @@
+# -*- coding: us-ascii -*-
+require 'test/unit'
+require 'tempfile'
+
+if Process.euid == 0
+ ok = true
+elsif (sudo = ENV["SUDO"]) and !sudo.empty? and (`#{sudo} echo ok` rescue false)
+ ok = true
+else
+ ok = false
+end
+ok &= (`dtrace -V` rescue false)
+module DTrace
+ class TestCase < Test::Unit::TestCase
+ INCLUDE = File.expand_path('..', File.dirname(__FILE__))
+
+ def trap_probe d_program, ruby_program
+ d = Tempfile.new(%w'probe .d')
+ d.write d_program
+ d.flush
+
+ rb = Tempfile.new(%w'probed .rb')
+ rb.write ruby_program
+ rb.flush
+
+ d_path = d.path
+ rb_path = rb.path
+
+ cmd = ["dtrace", "-q", "-s", d_path, "-c", "#{EnvUtil.rubybin} -I#{INCLUDE} #{rb_path}"]
+ if sudo = @@sudo
+ [RbConfig::CONFIG["LIBPATHENV"], "RUBY", "RUBYOPT"].each do |name|
+ if name and val = ENV[name]
+ cmd.unshift("#{name}=#{val}")
+ end
+ end
+ cmd.unshift(sudo)
+ end
+ probes = IO.popen(cmd, err: [:child, :out]) do |io|
+ io.readlines
+ end
+ d.close(true)
+ rb.close(true)
+ yield(d_path, rb_path, probes)
+ end
+ end
+end if ok
+
+if ok
+ DTrace::TestCase.class_variable_set(:@@sudo, sudo)
+end