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
|