summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authornobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2018-10-09 03:21:57 +0000
committernobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2018-10-09 03:21:57 +0000
commit97fffcadcb45c26c988d893c992072163d9f03b3 (patch)
tree2913a6c395408ff994caec282a83f39f85d597e6 /test
parente20ac9442dbb615530775551619687518c37459b (diff)
ext/objspace/objspace_dump.c: print addresses consistently
The format addresses are printed in are different if you use `ObjectSpace.dump_all(output: :stdout)` vs. `ObjectSpace.dump_all(output: :string)` (or `ObjectSpace.dump`) due to differences in the underlying `vfprintf` implementation. Use `"%#"PRIxVALUE` to format `VALUE`. Co-authored-by: Ashe Connor <ashe@kivikakk.ee> git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@64974 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'test')
-rw-r--r--test/objspace/test_objspace.rb56
1 files changed, 56 insertions, 0 deletions
diff --git a/test/objspace/test_objspace.rb b/test/objspace/test_objspace.rb
index 0e1ad327b9..947170203a 100644
--- a/test/objspace/test_objspace.rb
+++ b/test/objspace/test_objspace.rb
@@ -318,6 +318,62 @@ class TestObjSpace < Test::Unit::TestCase
end
end
+ def test_dump_addresses_match_dump_all_addresses
+ assert_in_out_err(%w[-robjspace], "#{<<-"begin;"}\n#{<<-'end;'}") do |output, error|
+ begin;
+ def dump_my_heap_please
+ obj = Object.new
+ puts ObjectSpace.dump(obj)
+ ObjectSpace.dump_all(output: $stdout)
+ end
+
+ dump_my_heap_please
+ end;
+ needle = JSON.parse(output.first)
+ addr = needle['address']
+ found = output.drop(1).find { |l| JSON.parse(l)['address'] == addr }
+ assert found, "object #{addr} should be findable in full heap dump"
+ end
+ end
+
+ def test_dump_class_addresses_match_dump_all_addresses
+ assert_in_out_err(%w[-robjspace], "#{<<-"begin;"}\n#{<<-'end;'}") do |output, error|
+ begin;
+ def dump_my_heap_please
+ obj = Object.new
+ puts ObjectSpace.dump(obj)
+ ObjectSpace.dump_all(output: $stdout)
+ end
+
+ dump_my_heap_please
+ end;
+ needle = JSON.parse(output.first)
+ addr = needle['class']
+ found = output.drop(1).find { |l| JSON.parse(l)['address'] == addr }
+ assert found, "object #{addr} should be findable in full heap dump"
+ end
+ end
+
+ def test_dump_reference_addresses_match_dump_all_addresses
+ assert_in_out_err(%w[-robjspace], "#{<<-"begin;"}\n#{<<-'end;'}") do |output, error|
+ begin;
+ def dump_my_heap_please
+ obj = Object.new
+ obj2 = Object.new
+ obj2.instance_variable_set(:@ref, obj)
+ puts ObjectSpace.dump(obj)
+ ObjectSpace.dump_all(output: $stdout)
+ end
+
+ dump_my_heap_please
+ end;
+ needle = JSON.parse(output.first)
+ addr = needle['address']
+ found = output.drop(1).find { |l| (JSON.parse(l)['references'] || []).include? addr }
+ assert found, "object #{addr} should be findable in full heap dump"
+ end
+ end
+
def test_dump_all
entry = /"bytesize":11, "value":"TEST STRING", "encoding":"UTF-8", "file":"-", "line":4, "method":"dump_my_heap_please", "generation":/