Skip to content

Commit cffe642

Browse files
authored
test: fix gem binaries and CLI (#76)
Fix native recorder loading and debug printing. Update gem installation scripts to use new classes and add '--' separator test.
1 parent fe53409 commit cffe642

File tree

3 files changed

+73
-17
lines changed

3 files changed

+73
-17
lines changed

gems/codetracer-pure-ruby-recorder/lib/trace.rb

Lines changed: 27 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -61,13 +61,23 @@ def self.trace_ruby_file(program, out_dir, program_args = [])
6161
Kernel.load(program)
6262
rescue Exception => e
6363
if tracer.debug
64-
codetracer_original_puts ''
65-
codetracer_original_puts '==== trace.rb error while tracing program ==='
66-
codetracer_original_puts 'ERROR'
67-
codetracer_original_puts e
68-
codetracer_original_puts e.backtrace
69-
codetracer_original_puts '====================='
70-
codetracer_original_puts ''
64+
if Kernel.respond_to?(:codetracer_original_puts, true)
65+
Kernel.codetracer_original_puts ''
66+
Kernel.codetracer_original_puts '==== trace.rb error while tracing program ==='
67+
Kernel.codetracer_original_puts 'ERROR'
68+
Kernel.codetracer_original_puts e
69+
Kernel.codetracer_original_puts e.backtrace
70+
Kernel.codetracer_original_puts '====================='
71+
Kernel.codetracer_original_puts ''
72+
else
73+
puts ''
74+
puts '==== trace.rb error while tracing program ==='
75+
puts 'ERROR'
76+
puts e
77+
puts e.backtrace
78+
puts '====================='
79+
puts ''
80+
end
7181
end
7282
ensure
7383
# Restore original ARGV
@@ -163,7 +173,11 @@ def record_call(tp)
163173
method_name_prefix = module_name == 'Object' ? '' : "#{module_name}#"
164174
method_name = "#{method_name_prefix}#{tp.method_id}"
165175

166-
codetracer_original_puts "call #{method_name} with #{tp.parameters}" if $tracer.debug
176+
if @debug && Kernel.respond_to?(:codetracer_original_puts, true)
177+
Kernel.codetracer_original_puts "call #{method_name} with #{tp.parameters}"
178+
elsif @debug
179+
puts "call #{method_name} with #{tp.parameters}"
180+
end
167181

168182
arg_records = prepare_args(tp)
169183

@@ -175,7 +189,11 @@ def record_call(tp)
175189

176190
def record_return(tp)
177191
if self.tracks_call?(tp)
178-
codetracer_original_puts "return" if $tracer.debug
192+
if @debug && Kernel.respond_to?(:codetracer_original_puts, true)
193+
Kernel.codetracer_original_puts 'return'
194+
elsif @debug
195+
puts 'return'
196+
end
179197
return_value = to_value(tp.return_value)
180198
@record.register_step(tp.path, tp.lineno)
181199
# return value support inspired by existing IDE-s/envs like

gems/codetracer-ruby-recorder/lib/native_trace.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -120,15 +120,15 @@ def load_native_recorder
120120
.find { |path| File.exist?(path) }
121121
if alt_path
122122
begin
123-
File.symlink(alt_path, target_path)path, target_path)
123+
File.symlink(alt_path, target_path)
124124
rescue StandardError
125125
FileUtils.cp(alt_path, target_path)
126126
end
127127
end
128128
end
129129

130130
require target_path
131-
@recorder = RubyRecorder.new
131+
@recorder = CodeTracerNativeRecorder.new
132132
rescue Exception => e
133133
warn "native tracer unavailable: #{e}"
134134
@recorder = nil

test/test_tracer.rb

Lines changed: 44 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,24 @@ def run_trace(tracer_script, program_name, *args)
3232
end
3333
end
3434

35+
def run_trace_with_separator(tracer_script, program_name, *args)
36+
base = File.basename(program_name, '.rb')
37+
tracer_name = tracer_script.include?('native') ? 'native' : 'pure'
38+
Dir.chdir(File.expand_path('..', __dir__)) do
39+
program = File.join('test', 'programs', program_name)
40+
out_dir = File.join('test', 'tmp', "#{base}_dashdash", tracer_name)
41+
FileUtils.mkdir_p(out_dir)
42+
stdout, stderr, status = Open3.capture3(
43+
RbConfig.ruby, tracer_script, '--out-dir', out_dir, '--', program, *args
44+
)
45+
raise "trace failed: #{stderr}" unless status.success?
46+
trace_file = File.join(out_dir, 'trace.json')
47+
trace = JSON.parse(File.read(trace_file)) if File.exist?(trace_file)
48+
program_out = stdout.lines.reject { |l| l.start_with?('call ') || l.start_with?('return') }.join
49+
[trace, program_out]
50+
end
51+
end
52+
3553
def expected_output(program_name)
3654
base = File.basename(program_name, '.rb')
3755
fixture = File.join(FIXTURE_DIR, "#{base}_output.txt")
@@ -63,6 +81,19 @@ def program_args(base)
6381
end
6482
end
6583

84+
def test_args_sum_with_separator
85+
base = 'args_sum'
86+
pure_trace, pure_out = run_trace_with_separator('gems/codetracer-pure-ruby-recorder/bin/codetracer-pure-ruby-recorder', "#{base}.rb", *program_args(base))
87+
native_trace, native_out = run_trace_with_separator('gems/codetracer-ruby-recorder/bin/codetracer-ruby-recorder', "#{base}.rb", *program_args(base))
88+
89+
expected = expected_trace("#{base}.rb")
90+
assert_equal expected, pure_trace
91+
assert_equal expected, native_trace
92+
expected = expected_output("#{base}.rb")
93+
assert_equal expected, pure_out
94+
assert_equal expected, native_out
95+
end
96+
6697
def run_gem_installation_test(gem_bin, gem_module)
6798
Dir.chdir(File.expand_path('..', __dir__)) do
6899
gem_dir = File.join('gems', gem_bin)
@@ -92,15 +123,22 @@ def run_gem_installation_test(gem_bin, gem_module)
92123

93124
out_dir_lib = File.join('test', 'tmp', "gem_install_#{gem_bin.tr('-', '_')}_lib")
94125
FileUtils.rm_rf(out_dir_lib)
126+
if gem_bin == 'codetracer-ruby-recorder'
127+
class_name = 'CodeTracer::RubyRecorder'
128+
init_args = ''
129+
else
130+
class_name = 'Codetracer::PureRubyRecorder'
131+
init_args = '$codetracer_record'
132+
end
95133
script = <<~RUBY
96134
require '#{gem_module}'
97-
recorder = RubyRecorder.new
135+
recorder = Object.const_get("#{class_name}").new(#{init_args})
98136
puts 'start trace'
99-
recorder.disable_tracing
137+
recorder.deactivate
100138
puts 'this will not be traced'
101-
recorder.enable_tracing
139+
recorder.activate
102140
puts 'this will be traced'
103-
recorder.disable_tracing
141+
recorder.deactivate
104142
puts 'tracing disabled'
105143
recorder.flush_trace('#{out_dir_lib}')
106144
RUBY
@@ -121,11 +159,11 @@ def run_gem_installation_test(gem_bin, gem_module)
121159
end
122160

123161
def test_gem_installation
124-
run_gem_installation_test('codetracer-ruby-recorder', 'codetracer_ruby_recorder')
162+
run_gem_installation_test('codetracer-ruby-recorder', 'native_trace')
125163
end
126164

127165
def test_pure_gem_installation
128-
run_gem_installation_test('codetracer-pure-ruby-recorder', 'codetracer_pure_ruby_recorder')
166+
run_gem_installation_test('codetracer-pure-ruby-recorder', 'trace')
129167
end
130168

131169
def test_pure_debug_smoke

0 commit comments

Comments
 (0)