File: yaml_spec.rb

package info (click to toggle)
puppet-agent 7.23.0-1
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 19,092 kB
  • sloc: ruby: 245,074; sh: 456; makefile: 38; xml: 33
file content (171 lines) | stat: -rw-r--r-- 5,114 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
# coding: utf-8
require 'spec_helper'
require 'puppet/util/yaml'

describe Puppet::Util::Yaml do
  include PuppetSpec::Files

  let(:filename) { tmpfile("yaml") }

  shared_examples_for 'yaml file loader' do |load_method|
    it 'returns false when the file is empty' do
      file_path = file_containing('input', '')

      expect(load_method.call(file_path)).to eq(false)
    end

    it 'reads a YAML file from disk' do
      file_path = file_containing('input', YAML.dump({ "my" => "data" }))

      expect(load_method.call(file_path)).to eq({ "my" => "data" })
    end

    it 'reads YAML as UTF-8' do
      file_path = file_containing('input', YAML.dump({ "my" => "𠜎" }))

      expect(load_method.call(file_path)).to eq({ "my" => "𠜎" })
    end
  end

  context "#safe_load" do
    it 'raises an error if YAML is invalid' do
      expect {
        Puppet::Util::Yaml.safe_load('{ invalid')
      }.to raise_error(Puppet::Util::Yaml::YamlLoadError, %r[\(<unknown>\): .* at line \d+ column \d+])
    end

    it 'raises if YAML contains classes not in the list' do
      expect {
        Puppet::Util::Yaml.safe_load(<<FACTS, [])
--- !ruby/object:Puppet::Node::Facts
name: localhost
FACTS
      }.to raise_error(Puppet::Util::Yaml::YamlLoadError, "(<unknown>): Tried to load unspecified class: Puppet::Node::Facts")
    end

    it 'includes the filename if YAML contains classes not in the list' do
      expect {
        Puppet::Util::Yaml.safe_load(<<FACTS, [], 'foo.yaml')
--- !ruby/object:Puppet::Node::Facts
name: localhost
FACTS
      }.to raise_error(Puppet::Util::Yaml::YamlLoadError, "(foo.yaml): Tried to load unspecified class: Puppet::Node::Facts")
    end

    it 'allows classes to be loaded' do
      facts = Puppet::Util::Yaml.safe_load(<<FACTS, [Puppet::Node::Facts])
--- !ruby/object:Puppet::Node::Facts
name: localhost
values:
  puppetversion: 6.0.0
FACTS
      expect(facts.name).to eq('localhost')
    end

    it 'returns false if the content is empty' do
      expect(Puppet::Util::Yaml.safe_load('')).to eq(false)
    end

    it 'loads true' do
      expect(Puppet::Util::Yaml.safe_load('true')).to eq(true)
    end

    it 'loads false' do
      expect(Puppet::Util::Yaml.safe_load('false')).to eq(false)
    end

    it 'loads nil' do
      expect(Puppet::Util::Yaml.safe_load(<<~YAML)).to eq('a' => nil)
        ---
        a: null
      YAML
    end

    it 'loads a numeric' do
      expect(Puppet::Util::Yaml.safe_load('42')).to eq(42)
    end

    it 'loads a string' do
      expect(Puppet::Util::Yaml.safe_load('puppet')).to eq('puppet')
    end

    it 'loads an array' do
      expect(Puppet::Util::Yaml.safe_load(<<~YAML)).to eq([1, 2])
        ---
        - 1
        - 2
      YAML
    end

    it 'loads a hash' do
      expect(Puppet::Util::Yaml.safe_load(<<~YAML)).to eq('a' => 1, 'b' => 2)
        ---
        a: 1
        b: 2
      YAML
    end

    it 'loads an alias' do
      expect(Puppet::Util::Yaml.safe_load(<<~YAML)).to eq('a' => [], 'b' => [])
        ---
        a: &1 []
        b: *1
      YAML
    end
  end

  context "#safe_load_file" do
    it_should_behave_like 'yaml file loader', Puppet::Util::Yaml.method(:safe_load_file)

    it 'raises an error when the file is invalid YAML' do
      file_path = file_containing('input', '{ invalid')

      expect {
        Puppet::Util::Yaml.safe_load_file(file_path)
      }.to raise_error(Puppet::Util::Yaml::YamlLoadError, %r[\(#{file_path}\): .* at line \d+ column \d+])
    end

    it 'raises an error when the filename is illegal' do
      expect {
        Puppet::Util::Yaml.safe_load_file("not\0allowed")
      }.to raise_error(ArgumentError, /pathname contains null byte/)
    end

    it 'raises an error when the file does not exist' do
      expect {
        Puppet::Util::Yaml.safe_load_file('does/not/exist.yaml')
      }.to raise_error(Errno::ENOENT, /No such file or directory/)
    end
  end

  context "#safe_load_file_if_valid" do
    before do
      Puppet[:log_level] = 'debug'
    end

    it_should_behave_like 'yaml file loader', Puppet::Util::Yaml.method(:safe_load_file_if_valid)

    it 'returns nil when the file is invalid YAML and debug logs about it' do
      file_path = file_containing('input', '{ invalid')

      expect(Puppet).to receive(:debug)
        .with(/Could not retrieve YAML content .+ expected ',' or '}'/).and_call_original

      expect(Puppet::Util::Yaml.safe_load_file_if_valid(file_path)).to eql(nil)
    end

    it 'returns nil when the filename is illegal and debug logs about it' do
      expect(Puppet).to receive(:debug)
        .with(/Could not retrieve YAML content .+: pathname contains null byte/).and_call_original

      expect(Puppet::Util::Yaml.safe_load_file_if_valid("not\0allowed")).to eql(nil)
    end

    it 'returns nil when the file does not exist and debug logs about it' do
      expect(Puppet).to receive(:debug)
        .with(/Could not retrieve YAML content .+: No such file or directory/).and_call_original

      expect(Puppet::Util::Yaml.safe_load_file_if_valid('does/not/exist.yaml')).to eql(nil)
    end
  end
end