summaryrefslogtreecommitdiffstats
path: root/test/util/inifile.rb
blob: 2d5841ca0a5bbfd1403ea185a7d270395d239dcd (plain)
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
#!/usr/bin/env ruby

require File.dirname(__FILE__) + '/../lib/puppettest'

require 'puppet'
require 'puppet/util/inifile'
require 'puppettest'

class TestFileType < Test::Unit::TestCase
    include PuppetTest

    def setup
        super
        @file = Puppet::Util::IniConfig::File.new
    end

    def teardown
        @file = nil
        super
    end

    def test_simple
        fname = mkfile("[main]\nkey1=value1\n# Comment\nkey2=value=2")
        assert_nothing_raised {
            @file.read(fname)
        }
        s = get_section('main')
        assert_entries(s, { 'key1' => 'value1', 'key2' => 'value=2' })
        @file['main']['key2'] = 'newvalue2'
        @file['main']['key3'] = 'newvalue3'
        text = s.format

            assert_equal(
                "[main]\nkey1=value1\n# Comment\nkey2=newvalue2\nkey3=newvalue3\n",

                    s.format)
    end

    def test_multi
        fmain = mkfile("[main]\nkey1=main.value1\n# Comment\nkey2=main.value2")
        fsub = mkfile("[sub1]\nkey1=sub1 value1\n\n[sub2]\nkey1=sub2.value1")
        main_mtime = File::stat(fmain).mtime
        assert_nothing_raised {
            @file.read(fmain)
            @file.read(fsub)
        }
        main = get_section('main')

            assert_entries(
                main,

                    { 'key1' => 'main.value1', 'key2' => 'main.value2' })
        sub1 = get_section('sub1')
        assert_entries(sub1, { 'key1' => 'sub1 value1' })
        sub2 = get_section('sub2')
        assert_entries(sub2, { 'key1' => 'sub2.value1' })
        [main, sub1, sub2].each { |s| assert( !s.dirty? ) }
        sub1['key1'] = 'sub1 newvalue1'
        sub2['key2'] = 'sub2 newvalue2'
        assert(! main.dirty?)
        [sub1, sub2].each { |s| assert( s.dirty? ) }
        @file.store
        [main, sub1, sub2].each { |s| assert( !s.dirty? ) }
        assert( File.exists?(fmain) )
        assert( File.exists?(fsub) )
        assert_equal(main_mtime, File::stat(fmain).mtime)
        subtext = File.read(fsub)

            assert_equal(
                "[sub1]\nkey1=sub1 newvalue1\n\n[sub2]\nkey1=sub2.value1\nkey2=sub2 newvalue2\n",

                    subtext)
    end

    def test_format_nil
        fname = mkfile("[main]\nkey1=value1\n# Comment\nkey2=value2\n# Comment2\n")
        assert_nothing_raised {
            @file.read(fname)
        }
        s = get_section('main')
        s['key2'] = nil
        s['key3'] = nil
        text = s.format

            assert_equal(
                "[main]\nkey1=value1\n# Comment\n# Comment2\n",

                    s.format)
    end

    def test_whitespace
        # FIXME: Should we really accept keys preceded by whitespace ?
        fname = mkfile("[main]\n  key1=v1\nkey2  =v2\n")
        assert_nothing_raised {
            @file.read(fname)
        }
        s = get_section('main')
        assert_equal('v1', s['key1'])
        assert_equal('v2', s['key2'])
        # FIXME: We are losing whitespace around keys
        assert_equal("[main]\nkey1=v1\nkey2=v2\n", s.format)
    end

    def test_continuation
        cont = "[main]\nkey1=v1\nkey2=v2a\n v2b\nkey3=\n\tv3a\n v3b\n"
        fname = mkfile(cont)
        assert_nothing_raised {
            @file.read(fname)
        }
        s = get_section('main')
        assert_equal('v1', s['key1'])
        assert_equal("v2a\n v2b", s['key2'])
        assert_equal("\n\tv3a\n v3b", s['key3'])
        assert_equal(cont, s.format)
    end

    def assert_entries(section, hash)
        hash.each do |k, v|

            assert_equal(
                v, section[k],

                    "Expected <#{v}> for #{section.name}[#{k}] but got <#{section[k]}>")
        end
    end

    def get_section(name)
        result = @file[name]
        assert_not_nil(result)
        result
    end

    def mkfile(content)
        file = tempfile()
        File.open(file, "w") { |f| f.print(content) }
        file
    end
end