1 # frozen_string_literal: true
5 class TestSafeLoad < TestCase
7 @orig_verbose, $VERBOSE = $VERBOSE, nil
11 $VERBOSE = @orig_verbose
16 [1, 2.2, {}, [], "foo"].each do |obj|
17 define_method(:"test_basic_#{obj.class}") do
22 def test_raises_when_alias_found_if_alias_parsing_not_enabled
23 yaml_with_aliases = <<~YAML
31 assert_raise(Psych::AliasesNotEnabled) do
32 Psych.safe_load(yaml_with_aliases)
36 def test_aliases_are_parsed_when_alias_parsing_is_enabled
37 yaml_with_aliases = <<~YAML
45 result = Psych.safe_load(yaml_with_aliases, aliases: true)
46 assert_same result.fetch("a"), result.fetch("b")
49 def test_permitted_symbol
51 assert_raise(Psych::DisallowedClass) do
58 permitted_classes: [Symbol],
59 permitted_symbols: [:foo]
65 assert_raise(Psych::DisallowedClass) do
66 assert_safe_cycle :foo
68 assert_raise(Psych::DisallowedClass) do
69 Psych.safe_load '--- !ruby/symbol foo', permitted_classes: []
72 assert_safe_cycle :foo, permitted_classes: [Symbol]
73 assert_safe_cycle :foo, permitted_classes: %w{ Symbol }
74 assert_equal :foo, Psych.safe_load('--- !ruby/symbol foo', permitted_classes: [Symbol])
78 assert_raise(Psych::DisallowedClass) do
79 Psych.safe_load '--- !ruby/object:Foo {}', permitted_classes: [Foo]
82 assert_raise(Psych::DisallowedClass) do
83 assert_safe_cycle Foo.new
85 assert_kind_of(Foo, Psych.safe_load(Psych.dump(Foo.new), permitted_classes: [Foo]))
89 def test_struct_depends_on_sym
90 assert_safe_cycle(X.new, permitted_classes: [X, Symbol])
91 assert_raise(Psych::DisallowedClass) do
92 cycle X.new, permitted_classes: [X]
97 assert Psych.safe_load(<<-eoyml, permitted_classes: [Struct, Symbol])
102 assert_raise(Psych::DisallowedClass) do
103 Psych.safe_load(<<-eoyml, permitted_classes: [Struct])
109 assert_raise(Psych::DisallowedClass) do
110 Psych.safe_load(<<-eoyml, permitted_classes: [Symbol])
117 def test_safe_load_default_fallback
118 assert_nil Psych.safe_load("")
122 assert_equal %w[a b], Psych.safe_load("- a\n- b")
125 def test_safe_load_raises_on_bad_input
126 assert_raise(Psych::SyntaxError) { Psych.safe_load("--- `") }
131 def cycle object, permitted_classes: []
132 Psych.safe_load(Psych.dump(object), permitted_classes: permitted_classes)
135 def assert_safe_cycle object, permitted_classes: []
136 other = cycle object, permitted_classes: permitted_classes
137 assert_equal object, other