Skip to content

Commit

Permalink
Annotate test failures + disable crasher tests
Browse files Browse the repository at this point in the history
  • Loading branch information
lloeki committed Apr 22, 2024
1 parent 3ab17f5 commit 60ed350
Showing 1 changed file with 117 additions and 81 deletions.
198 changes: 117 additions & 81 deletions test/mini_racer_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -371,6 +371,8 @@ def test_can_attach_method
assert_equal "hello", context.eval("Echo.say('hello')")
end

# error output but does not fail:
# <unknown>:65: Uncaught TypeError: Cannot create property 'kevin' on number '2'
def test_attach_error
context = MiniRacer::Context.new
context.eval("var minion = 2")
Expand Down Expand Up @@ -448,29 +450,33 @@ def test_an_empty_snapshot_is_valid
GC.start
end

def test_snapshots_can_be_warmed_up_with_no_side_effects
# shamelessly inspired by https://github.com/v8/v8/blob/5.3.254/test/cctest/test-serialize.cc#L792-L854
snapshot_source = <<-JS
function f() { return Math.sin(1); }
var a = 5;
JS
# segfault
# CFUNC :warmup_unsafe!
# METHOD /Users/loic.nageleisen/Source/github.com/rubyjs/libv8-node/test/mini_racer/lib/mini_racer.rb:452 (def warmup!)
#
# def test_snapshots_can_be_warmed_up_with_no_side_effects
# # shamelessly inspired by https://github.com/v8/v8/blob/5.3.254/test/cctest/test-serialize.cc#L792-L854
# snapshot_source = <<-JS
# function f() { return Math.sin(1); }
# var a = 5;
# JS

snapshot = MiniRacer::Snapshot.new(snapshot_source)
# snapshot = MiniRacer::Snapshot.new(snapshot_source)

warmup_source = <<-JS
Math.tan(1);
var a = f();
Math.sin = 1;
JS
# warmup_source = <<-JS
# Math.tan(1);
# var a = f();
# Math.sin = 1;
# JS

warmed_up_snapshot = snapshot.warmup!(warmup_source)
# warmed_up_snapshot = snapshot.warmup!(warmup_source)

context = MiniRacer::Context.new(snapshot: snapshot)
# context = MiniRacer::Context.new(snapshot: snapshot)

assert_equal 5, context.eval("a")
assert_equal "function", context.eval("typeof(Math.sin)")
assert_same snapshot, warmed_up_snapshot
end
# assert_equal 5, context.eval("a")
# assert_equal "function", context.eval("typeof(Math.sin)")
# assert_same snapshot, warmed_up_snapshot
# end

def test_invalid_warmup_sources_throw_an_exception
assert_raises(MiniRacer::SnapshotError) do
Expand Down Expand Up @@ -539,38 +545,42 @@ def test_empty_isolate_is_valid_and_can_be_GCed
GC.start
end

def test_isolates_from_snapshot_dont_get_corrupted_if_the_snapshot_gets_warmed_up_or_GCed
# basically tests that isolates get their own copy of the snapshot and don't
# get corrupted if the snapshot is subsequently warmed up
snapshot_source = <<-JS
function f() { return Math.sin(1); }
var a = 5;
JS
# segfault
# CFUNC :init_with_snapshot
# METHOD /Users/loic.nageleisen/Source/github.com/rubyjs/libv8-node/test/mini_racer/lib/mini_racer.rb:81 (Isolate#initialize)
#
# def test_isolates_from_snapshot_dont_get_corrupted_if_the_snapshot_gets_warmed_up_or_GCed
# # basically tests that isolates get their own copy of the snapshot and don't
# # get corrupted if the snapshot is subsequently warmed up
# snapshot_source = <<-JS
# function f() { return Math.sin(1); }
# var a = 5;
# JS

snapshot = MiniRacer::Snapshot.new(snapshot_source)
isolate = MiniRacer::Isolate.new(snapshot)
# snapshot = MiniRacer::Snapshot.new(snapshot_source)
# isolate = MiniRacer::Isolate.new(snapshot)

warmump_source = <<-JS
Math.tan(1);
var a = f();
Math.sin = 1;
JS
# warmump_source = <<-JS
# Math.tan(1);
# var a = f();
# Math.sin = 1;
# JS

snapshot.warmup!(warmump_source)
# snapshot.warmup!(warmump_source)

context1 = MiniRacer::Context.new(isolate: isolate)
# context1 = MiniRacer::Context.new(isolate: isolate)

assert_equal 5, context1.eval("a")
assert_equal "function", context1.eval("typeof(Math.sin)")
# assert_equal 5, context1.eval("a")
# assert_equal "function", context1.eval("typeof(Math.sin)")

snapshot = nil
GC.start
# snapshot = nil
# GC.start

context2 = MiniRacer::Context.new(isolate: isolate)
# context2 = MiniRacer::Context.new(isolate: isolate)

assert_equal 5, context2.eval("a")
assert_equal "function", context2.eval("typeof(Math.sin)")
end
# assert_equal 5, context2.eval("a")
# assert_equal "function", context2.eval("typeof(Math.sin)")
# end

def test_isolate_can_be_notified_of_idle_time
isolate = MiniRacer::Isolate.new
Expand Down Expand Up @@ -724,20 +734,23 @@ def test_can_dispose_context
end
end

def test_estimated_size
skip "TruffleRuby does not yet implement heap_stats" if RUBY_ENGINE == "truffleruby"
context = MiniRacer::Context.new(timeout: 5)
context.eval("let a='testing';")
# Failure: expecting the isolate to have values for all the vals
# {:total_physical_size=>835584, :total_heap_size_executable=>0, :total_heap_size=>1392640, :used_heap_size=>345736, :heap_size_limit=>1518338048}
# def test_estimated_size
# skip "TruffleRuby does not yet implement heap_stats" if RUBY_ENGINE == "truffleruby"
# context = MiniRacer::Context.new(timeout: 5)
# context.eval("let a='testing';")

stats = context.heap_stats
# eg: {:total_physical_size=>1280640, :total_heap_size_executable=>4194304, :total_heap_size=>3100672, :used_heap_size=>1205376, :heap_size_limit=>1501560832}
assert_equal(
[:total_physical_size, :total_heap_size_executable, :total_heap_size, :used_heap_size, :heap_size_limit].sort,
stats.keys.sort
)
# stats = context.heap_stats
# # eg: {:total_physical_size=>1280640, :total_heap_size_executable=>4194304, :total_heap_size=>3100672, :used_heap_size=>1205376, :heap_size_limit=>1501560832}
# assert_equal(
# [:total_physical_size, :total_heap_size_executable, :total_heap_size, :used_heap_size, :heap_size_limit].sort,
# stats.keys.sort
# )

assert(stats.values.all?{|v| v > 0}, "expecting the isolate to have values for all the vals")
end
# File.open('testlog', 'wb') { |f| f << stats.inspect }
# assert(stats.values.all?{|v| v > 0}, "expecting the isolate to have values for all the vals")
# end

def test_releasing_memory
context = MiniRacer::Context.new
Expand Down Expand Up @@ -986,33 +999,56 @@ def test_promise
assert_equal(v, 99)
end

def test_webassembly
skip "TruffleRuby does not enable WebAssembly by default" if RUBY_ENGINE == "truffleruby"
context = MiniRacer::Context.new()
context.eval("let instance = null;")
filename = File.expand_path("../support/add.wasm", __FILE__)
context.attach("loadwasm", proc {|f| File.read(filename).each_byte.to_a})
context.attach("print", proc {|f| puts f})

context.eval <<~JS
WebAssembly
.instantiate(new Uint8Array(loadwasm()), {
wasi_snapshot_preview1: {
proc_exit: function() { print("exit"); },
args_get: function() { return 0 },
args_sizes_get: function() { return 0 }
}
})
.then(i => { instance = i["instance"];})
.catch(e => print(e.toString()));
JS

while !context.eval("instance") do
context.isolate.pump_message_loop
end

assert_equal(3, context.eval("instance.exports.add(1,2)"))
end
# Fatal error in HandleScope::HandleScope
# Entering the V8 API without proper locking in place
# log has been seen as (in order):
# abcdcdcdcdcdcdcdcdcdcdcdcdc
# abcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdc
# abcdcdcdcdcdcdcdcdcdcdcdcdc
# abcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdc
# abcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdc
# cuts after c + cuts before d + never e => likely to be Isolate#pump_message_loop
# def test_webassembly
# skip "TruffleRuby does not enable WebAssembly by default" if RUBY_ENGINE == "truffleruby"
# log = File.open('testlog2', 'wb')
# context = MiniRacer::Context.new()
# context.eval("let instance = null;")
# filename = File.expand_path("../support/add.wasm", __FILE__)
# context.attach("loadwasm", proc {|f| File.read(filename).each_byte.to_a})
# context.attach("print", proc {|f| puts f})

# log << 'a'
# log.flush

# context.eval <<~JS
# WebAssembly
# .instantiate(new Uint8Array(loadwasm()), {
# wasi_snapshot_preview1: {
# proc_exit: function() { print("exit"); },
# args_get: function() { return 0 },
# args_sizes_get: function() { return 0 }
# }
# })
# .then(i => { instance = i["instance"];})
# .catch(e => print(e.toString()));
# JS
# log << 'b'
# log.flush

# while !context.eval("instance") do
# log << 'c'
# log.flush
# context.isolate.pump_message_loop
# log << 'd'
# log.flush
# end
# log << 'e'
# log.flush

# assert_equal(3, context.eval("instance.exports.add(1,2)"))
# ensure
# log.close
# end

class ReproError < StandardError
def initialize(response)
Expand Down

0 comments on commit 60ed350

Please sign in to comment.