summaryrefslogtreecommitdiffstats
path: root/test/util/inifile.rb
blob: e3ce20823df12bf00bbac4e1737f216cd6163f42 (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.expand_path(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