Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 19 additions & 0 deletions gems/native-tracer/lib/codetracer_ruby_recorder.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
require 'fileutils'
require 'rbconfig'

ext_dir = File.expand_path('../ext/native_tracer/target/release', __dir__)
dlext = RbConfig::CONFIG['DLEXT']
lib = File.join(ext_dir, "codetracer_ruby_recorder.#{dlext}")
unless File.exist?(lib)
alt = %w[so bundle dylib dll]
.map { |ext| File.join(ext_dir, "libcodetracer_ruby_recorder.#{ext}") }
.find { |path| File.exist?(path) }
if alt
begin
File.symlink(alt, lib)
rescue StandardError
FileUtils.cp(alt, lib)
end
end
end
require lib
82 changes: 54 additions & 28 deletions test/test_tracer.rb
Original file line number Diff line number Diff line change
Expand Up @@ -62,49 +62,75 @@ def program_args(base)
end
end

def test_gem_installation
def run_gem_installation_test(gem_bin, gem_module)
Dir.chdir(File.expand_path('..', __dir__)) do
system('just', 'build-extension', exception: true)

dlext = RbConfig::CONFIG['DLEXT']
ext_path = File.join('gems', 'native-tracer', 'ext', 'native_tracer', 'target', 'release', "codetracer_ruby_recorder.#{dlext}")
FileUtils.rm_f(ext_path)
gem_dir = case gem_bin
when 'codetracer-ruby-recorder'
File.join('gems', 'native-tracer')
when 'codetracer-pure-ruby-recorder'
File.join('gems', 'pure-ruby-tracer')
else
raise ArgumentError, "unknown gem #{gem_bin}"
end

if gem_bin == 'codetracer-ruby-recorder'
system('just', 'build-extension', exception: true)
dlext = RbConfig::CONFIG['DLEXT']
ext_path = File.join(gem_dir, 'ext', 'native_tracer', 'target', 'release', "codetracer_ruby_recorder.#{dlext}")
FileUtils.rm_f(ext_path)
end

Dir.mktmpdir('gemhome') do |gem_home|
gem_build = IO.popen(%w[gem -C gems/native-tracer build codetracer-ruby-recorder.gemspec], err: [:child, :out]) { |io| io.read }
gemspec = Dir[File.join(gem_dir, '*.gemspec')].first
gem_build = IO.popen(%W[gem -C #{gem_dir} build #{File.basename(gemspec)}], err: [:child, :out]) { |io| io.read }
gem_file = gem_build.lines.grep(/File:/).first.split.last
gem_file = File.expand_path(File.join('gems/native-tracer', gem_file))
gem_file = File.expand_path(File.join(gem_dir, gem_file))

env = { 'GEM_HOME' => gem_home, 'GEM_PATH' => gem_home, 'PATH' => "#{gem_home}/bin:#{ENV['PATH']}" }
system(env, 'gem', 'install', '--local', gem_file, exception: true)

out_dir = File.join('test', 'tmp', 'gem_install')
out_dir = File.join('test', 'tmp', "gem_install_#{gem_bin.tr('-', '_')}")
FileUtils.rm_rf(out_dir)
stdout, stderr, status = Open3.capture3(env, 'ruby', '-S', 'codetracer-ruby-recorder', '--out-dir', out_dir, File.join('test', 'programs', 'addition.rb'))
raise "native_trace failed: #{stderr}" unless status.success?
stdout, stderr, status = Open3.capture3(env, 'ruby', '-S', gem_bin, '--out-dir', out_dir, File.join('test', 'programs', 'addition.rb'))
raise "#{gem_bin} failed: #{stderr}" unless status.success?
assert_equal "3\n", stdout
assert File.exist?(File.join(out_dir, 'trace.json'))

out_dir_lib = File.join('test', 'tmp', "gem_install_#{gem_bin.tr('-', '_')}_lib")
FileUtils.rm_rf(out_dir_lib)
script = <<~RUBY
require '#{gem_module}'
recorder = RubyRecorder.new
puts 'start trace'
recorder.disable_tracing
puts 'this will not be traced'
recorder.enable_tracing
puts 'this will be traced'
recorder.disable_tracing
puts 'tracing disabled'
recorder.flush_trace('#{out_dir_lib}')
RUBY
script_path = File.join('test', 'tmp', "use_#{gem_bin.tr('-', '_')}.rb")
File.write(script_path, script)
stdout, stderr, status = Open3.capture3(env, 'ruby', script_path)
raise "#{gem_module} library failed: #{stderr}" unless status.success?
expected_out = <<~OUT
start trace
this will not be traced
this will be traced
tracing disabled
OUT
assert_equal expected_out, stdout
assert File.exist?(File.join(out_dir_lib, 'trace.json'))
end
end
end

def test_pure_gem_installation
Dir.chdir(File.expand_path('..', __dir__)) do
Dir.mktmpdir('gemhome') do |gem_home|
gem_build = IO.popen(%w[gem -C gems/pure-ruby-tracer build codetracer_pure_ruby_recorder.gemspec], err: [:child, :out]) { |io| io.read }
gem_file = gem_build.lines.grep(/File:/).first.split.last
gem_file = File.expand_path(File.join('gems/pure-ruby-tracer', gem_file))

env = { 'GEM_HOME' => gem_home, 'GEM_PATH' => gem_home, 'PATH' => "#{gem_home}/bin:#{ENV['PATH']}" }
system(env, 'gem', 'install', '--local', gem_file, exception: true)
def test_gem_installation
run_gem_installation_test('codetracer-ruby-recorder', 'codetracer_ruby_recorder')
end

out_dir = File.join('test', 'tmp', 'gem_install_pure')
FileUtils.rm_rf(out_dir)
stdout, stderr, status = Open3.capture3(env, 'ruby', '-S', 'codetracer-pure-ruby-recorder', '--out-dir', out_dir, File.join('test', 'programs', 'addition.rb'))
raise "pure_trace failed: #{stderr}" unless status.success?
assert_equal "3\n", stdout
assert File.exist?(File.join(out_dir, 'trace.json'))
end
end
def test_pure_gem_installation
run_gem_installation_test('codetracer-pure-ruby-recorder', 'codetracer_pure_ruby_recorder')
end
end
Loading