puppet 4.0.0.rc1 → 4.0.0

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of puppet might be problematic. Click here for more details.

Files changed (122) hide show
  1. checksums.yaml +7 -0
  2. data/CONTRIBUTING.md +11 -6
  3. data/Gemfile +1 -1
  4. data/conf/environment.conf +4 -2
  5. data/ext/build_defaults.yaml +3 -3
  6. data/ext/debian/control +2 -2
  7. data/ext/project_data.yaml +1 -1
  8. data/ext/rack/config.ru +1 -0
  9. data/ext/redhat/client.sysconfig +1 -1
  10. data/ext/redhat/puppet.spec.erb +2 -2
  11. data/ext/systemd/puppet.service +1 -0
  12. data/install.rb +2 -2
  13. data/lib/puppet/application/device.rb +22 -5
  14. data/lib/puppet/data_providers.rb +7 -4
  15. data/lib/puppet/data_providers/data_adapter.rb +6 -1
  16. data/lib/puppet/data_providers/data_function_support.rb +17 -4
  17. data/lib/puppet/data_providers/function_env_data_provider.rb +1 -1
  18. data/lib/puppet/data_providers/function_module_data_provider.rb +14 -19
  19. data/lib/puppet/defaults.rb +43 -16
  20. data/lib/puppet/error.rb +4 -0
  21. data/lib/puppet/pops/evaluator/evaluator_impl.rb +33 -4
  22. data/lib/puppet/pops/evaluator/runtime3_support.rb +5 -1
  23. data/lib/puppet/pops/parser/egrammar.ra +2 -0
  24. data/lib/puppet/pops/parser/eparser.rb +732 -724
  25. data/lib/puppet/pops/parser/heredoc_support.rb +1 -1
  26. data/lib/puppet/pops/parser/lexer2.rb +19 -21
  27. data/lib/puppet/provider/macauthorization/macauthorization.rb +1 -1
  28. data/lib/puppet/provider/nameservice/directoryservice.rb +1 -1
  29. data/lib/puppet/provider/package/appdmg.rb +1 -1
  30. data/lib/puppet/provider/package/gem.rb +19 -6
  31. data/lib/puppet/provider/package/pkgdmg.rb +1 -1
  32. data/lib/puppet/provider/package/puppet_gem.rb +17 -0
  33. data/lib/puppet/provider/service/launchd.rb +1 -1
  34. data/lib/puppet/provider/user/directoryservice.rb +2 -2
  35. data/lib/puppet/settings.rb +1 -1
  36. data/lib/puppet/util/errors.rb +4 -2
  37. data/lib/puppet/util/network_device/config.rb +5 -0
  38. data/lib/puppet/util/run_mode.rb +28 -11
  39. data/lib/puppet/util/windows/registry.rb +3 -3
  40. data/lib/puppet/vendor/deep_merge/PUPPET_README.md +6 -0
  41. data/lib/puppet/vendor/load_plist.rb +1 -0
  42. data/lib/puppet/vendor/plist/CHANGELOG +82 -0
  43. data/lib/puppet/vendor/plist/MIT-LICENSE +21 -0
  44. data/lib/puppet/vendor/plist/PUPPET_README.md +6 -0
  45. data/lib/puppet/vendor/plist/README +36 -0
  46. data/lib/puppet/vendor/plist/Rakefile +144 -0
  47. data/lib/puppet/vendor/plist/docs/USAGE +104 -0
  48. data/lib/puppet/vendor/plist/docs/jamis-template.rb +591 -0
  49. data/lib/puppet/vendor/plist/lib/plist.rb +22 -0
  50. data/lib/puppet/vendor/plist/lib/plist/generator.rb +224 -0
  51. data/lib/puppet/vendor/plist/lib/plist/parser.rb +225 -0
  52. data/lib/puppet/vendor/plist/test/assets/AlbumData.xml +203 -0
  53. data/lib/puppet/vendor/plist/test/assets/Cookies.plist +104 -0
  54. data/lib/puppet/vendor/plist/test/assets/commented.plist +9 -0
  55. data/lib/puppet/vendor/plist/test/assets/example_data.bin +0 -0
  56. data/lib/puppet/vendor/plist/test/assets/example_data.jpg +0 -0
  57. data/lib/puppet/vendor/plist/test/assets/example_data.plist +259 -0
  58. data/lib/puppet/vendor/plist/test/assets/test_data_elements.plist +24 -0
  59. data/lib/puppet/vendor/plist/test/assets/test_empty_key.plist +13 -0
  60. data/lib/puppet/vendor/plist/test/test_data_elements.rb +115 -0
  61. data/lib/puppet/vendor/plist/test/test_generator.rb +59 -0
  62. data/lib/puppet/vendor/plist/test/test_generator_basic_types.rb +58 -0
  63. data/lib/puppet/vendor/plist/test/test_generator_collections.rb +82 -0
  64. data/lib/puppet/vendor/plist/test/test_parser.rb +90 -0
  65. data/lib/puppet/version.rb +1 -1
  66. data/man/man5/puppet.conf.5 +5 -13
  67. data/man/man8/extlookup2hiera.8 +1 -1
  68. data/man/man8/puppet-agent.8 +1 -1
  69. data/man/man8/puppet-apply.8 +1 -1
  70. data/man/man8/puppet-ca.8 +1 -1
  71. data/man/man8/puppet-catalog.8 +1 -1
  72. data/man/man8/puppet-cert.8 +1 -1
  73. data/man/man8/puppet-certificate.8 +1 -1
  74. data/man/man8/puppet-certificate_request.8 +1 -1
  75. data/man/man8/puppet-certificate_revocation_list.8 +1 -1
  76. data/man/man8/puppet-config.8 +1 -1
  77. data/man/man8/puppet-describe.8 +1 -1
  78. data/man/man8/puppet-device.8 +1 -1
  79. data/man/man8/puppet-doc.8 +1 -1
  80. data/man/man8/puppet-epp.8 +1 -1
  81. data/man/man8/puppet-facts.8 +1 -1
  82. data/man/man8/puppet-file.8 +1 -1
  83. data/man/man8/puppet-filebucket.8 +1 -1
  84. data/man/man8/puppet-help.8 +1 -1
  85. data/man/man8/puppet-inspect.8 +1 -1
  86. data/man/man8/puppet-key.8 +1 -1
  87. data/man/man8/puppet-man.8 +1 -1
  88. data/man/man8/puppet-master.8 +1 -1
  89. data/man/man8/puppet-module.8 +1 -1
  90. data/man/man8/puppet-node.8 +1 -1
  91. data/man/man8/puppet-parser.8 +1 -1
  92. data/man/man8/puppet-plugin.8 +1 -1
  93. data/man/man8/puppet-report.8 +1 -1
  94. data/man/man8/puppet-resource.8 +1 -1
  95. data/man/man8/puppet-resource_type.8 +1 -1
  96. data/man/man8/puppet-status.8 +1 -1
  97. data/man/man8/puppet.8 +1 -1
  98. data/spec/fixtures/unit/functions/lookup/environments/production/lib/puppet/functions/environment/data.rb +8 -6
  99. data/spec/fixtures/unit/functions/lookup/environments/production/modules/abc/lib/puppet/functions/abc/data.rb +4 -4
  100. data/spec/fixtures/unit/functions/lookup/environments/production/modules/bad_data/lib/puppet/bindings/bad_data/default.rb +9 -0
  101. data/spec/fixtures/unit/functions/lookup/environments/production/modules/bad_data/lib/puppet/functions/bad_data/data.rb +6 -0
  102. data/spec/fixtures/unit/functions/lookup/environments/production/modules/bad_data/manifests/init.pp +3 -0
  103. data/spec/fixtures/unit/functions/lookup/environments/production/modules/bca/lib/puppet/bindings/bca/default.rb +9 -0
  104. data/spec/fixtures/unit/functions/lookup/environments/production/modules/bca/lib/puppet/functions/bca/data.rb +9 -0
  105. data/spec/fixtures/unit/functions/lookup/environments/production/modules/bca/manifests/init.pp +2 -0
  106. data/spec/fixtures/unit/functions/lookup/environments/production/modules/no_provider/manifests/init.pp +2 -0
  107. data/spec/integration/provider/yumrepo_spec.rb +127 -0
  108. data/spec/unit/application/device_spec.rb +52 -14
  109. data/spec/unit/functions/lookup_spec.rb +95 -55
  110. data/spec/unit/parser/functions/create_resources_spec.rb +1 -1
  111. data/spec/unit/pops/binder/injector_spec.rb +0 -18
  112. data/spec/unit/pops/parser/lexer2_spec.rb +26 -16
  113. data/spec/unit/pops/parser/parse_heredoc_spec.rb +21 -0
  114. data/spec/unit/pops/validator/validator_spec.rb +2 -3
  115. data/spec/unit/provider/macauthorization_spec.rb +1 -1
  116. data/spec/unit/provider/package/gem_spec.rb +201 -139
  117. data/spec/unit/provider/package/puppet_gem_spec.rb +67 -0
  118. data/spec/unit/provider/user/directoryservice_spec.rb +1 -1
  119. data/spec/unit/util/network_device/config_spec.rb +6 -0
  120. data/spec/unit/util/run_mode_spec.rb +26 -26
  121. data/spec/unit/util/windows/registry_spec.rb +4 -3
  122. metadata +3016 -2980
@@ -0,0 +1,24 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
3
+ <plist version="1.0">
4
+ <dict>
5
+ <key>stringio</key>
6
+ <data>dGhpcyBpcyBhIHN0cmluZ2lvIG9iamVjdA==
7
+ </data>
8
+ <key>file</key>
9
+ <data>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
10
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
11
+ AAAAAAAAAAAAAA==
12
+ </data>
13
+ <key>io</key>
14
+ <data>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
15
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
16
+ AAAAAAAAAAAAAA==
17
+ </data>
18
+ <key>marshal</key>
19
+ <!-- The <data> element below contains a Ruby object which has been serialized with Marshal.dump. -->
20
+ <data>BAhvOhZNYXJzaGFsYWJsZU9iamVjdAY6CUBmb28iHnRoaXMgb2JqZWN0IHdh
21
+ cyBtYXJzaGFsZWQ=
22
+ </data>
23
+ </dict>
24
+ </plist>
@@ -0,0 +1,13 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
3
+ <plist version="1.0">
4
+ <dict>
5
+ <key>key</key>
6
+ <dict>
7
+ <key></key>
8
+ <string>1</string>
9
+ <key>subkey</key>
10
+ <string>2</string>
11
+ </dict>
12
+ </dict>
13
+ </plist>
@@ -0,0 +1,115 @@
1
+ ##############################################################
2
+ # Copyright 2006, Ben Bleything <ben@bleything.net> and #
3
+ # Patrick May <patrick@hexane.org> #
4
+ # #
5
+ # Distributed under the MIT license. #
6
+ ##############################################################
7
+
8
+ require 'test/unit'
9
+ require 'plist'
10
+ require 'stringio'
11
+
12
+ class MarshalableObject
13
+ attr_accessor :foo
14
+
15
+ def initialize(str)
16
+ @foo = str
17
+ end
18
+ end
19
+
20
+ class TestDataElements < Test::Unit::TestCase
21
+ @@result = Plist::parse_xml('test/assets/test_data_elements.plist')
22
+
23
+ def test_marshal
24
+ expected = <<END
25
+ <!-- The <data> element below contains a Ruby object which has been serialized with Marshal.dump. -->
26
+ <data>
27
+ BAhvOhZNYXJzaGFsYWJsZU9iamVjdAY6CUBmb28iHnRoaXMgb2JqZWN0IHdhcyBtYXJz
28
+ aGFsZWQ=
29
+ </data>
30
+ END
31
+
32
+ mo = MarshalableObject.new('this object was marshaled')
33
+
34
+ assert_equal expected.chomp, Plist::Emit.dump(mo, false).chomp
35
+
36
+ assert_instance_of MarshalableObject, @@result['marshal']
37
+
38
+ assert_equal mo.foo, @@result['marshal'].foo
39
+ end
40
+
41
+ def test_generator_io_and_file
42
+ expected = <<END
43
+ <data>
44
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
45
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==
46
+ </data>
47
+ END
48
+
49
+ expected.chomp!
50
+
51
+ fd = IO.sysopen('test/assets/example_data.bin')
52
+ io = IO.open(fd, 'r')
53
+
54
+ # File is a subclass of IO, so catching IO in the dispatcher should work for File as well...
55
+ f = File.open('test/assets/example_data.bin')
56
+
57
+ assert_equal expected, Plist::Emit.dump(io, false).chomp
58
+ assert_equal expected, Plist::Emit.dump(f, false).chomp
59
+
60
+ assert_instance_of StringIO, @@result['io']
61
+ assert_instance_of StringIO, @@result['file']
62
+
63
+ io.rewind
64
+ f.rewind
65
+
66
+ assert_equal io.read, @@result['io'].read
67
+ assert_equal f.read, @@result['file'].read
68
+
69
+ io.close
70
+ f.close
71
+ end
72
+
73
+ def test_generator_string_io
74
+ expected = <<END
75
+ <data>
76
+ dGhpcyBpcyBhIHN0cmluZ2lvIG9iamVjdA==
77
+ </data>
78
+ END
79
+
80
+ sio = StringIO.new('this is a stringio object')
81
+
82
+ assert_equal expected.chomp, Plist::Emit.dump(sio, false).chomp
83
+
84
+ assert_instance_of StringIO, @@result['stringio']
85
+
86
+ sio.rewind
87
+ assert_equal sio.read, @@result['stringio'].read
88
+ end
89
+
90
+ # this functionality is credited to Mat Schaffer,
91
+ # who discovered the plist with the data tag
92
+ # supplied the test data, and provided the parsing code.
93
+ def test_data
94
+ # test reading plist <data> elements
95
+ data = Plist::parse_xml("test/assets/example_data.plist");
96
+ assert_equal( File.open("test/assets/example_data.jpg"){|f| f.read }, data['image'].read )
97
+
98
+ # test writing data elements
99
+ expected = File.read("test/assets/example_data.plist")
100
+ result = data.to_plist
101
+ #File.open('result.plist', 'w') {|f|f.write(result)} # debug
102
+ assert_equal( expected, result )
103
+
104
+ # Test changing the <data> object in the plist to a StringIO and writing.
105
+ # This appears extraneous given that plist currently returns a StringIO,
106
+ # so the above writing test also flexes StringIO#to_plist_node.
107
+ # However, the interface promise is to return an IO, not a particular class.
108
+ # plist used to return Tempfiles, which was changed solely for performance reasons.
109
+ data['image'] = StringIO.new( File.read("test/assets/example_data.jpg"))
110
+
111
+ assert_equal(expected, data.to_plist )
112
+
113
+ end
114
+
115
+ end
@@ -0,0 +1,59 @@
1
+ ##############################################################
2
+ # Copyright 2006, Ben Bleything <ben@bleything.net> and #
3
+ # Patrick May <patrick@hexane.org> #
4
+ # #
5
+ # Distributed under the MIT license. #
6
+ ##############################################################
7
+
8
+ require 'test/unit'
9
+ require 'plist'
10
+
11
+ class SerializableObject
12
+ attr_accessor :foo
13
+
14
+ def initialize(str)
15
+ @foo = str
16
+ end
17
+
18
+ def to_plist_node
19
+ return "<string>#{CGI::escapeHTML @foo}</string>"
20
+ end
21
+ end
22
+
23
+ class TestGenerator < Test::Unit::TestCase
24
+ def test_to_plist_vs_plist_emit_dump_no_envelope
25
+ source = [1, :b, true]
26
+
27
+ to_plist = source.to_plist(false)
28
+ plist_emit_dump = Plist::Emit.dump(source, false)
29
+
30
+ assert_equal to_plist, plist_emit_dump
31
+ end
32
+
33
+ def test_to_plist_vs_plist_emit_dump_with_envelope
34
+ source = [1, :b, true]
35
+
36
+ to_plist = source.to_plist
37
+ plist_emit_dump = Plist::Emit.dump(source)
38
+
39
+ assert_equal to_plist, plist_emit_dump
40
+ end
41
+
42
+ def test_dumping_serializable_object
43
+ str = 'this object implements #to_plist_node'
44
+ so = SerializableObject.new(str)
45
+
46
+ assert_equal "<string>#{str}</string>", Plist::Emit.dump(so, false)
47
+ end
48
+
49
+ def test_write_plist
50
+ data = [1, :two, {:c => 'dee'}]
51
+
52
+ data.save_plist('test.plist')
53
+ file = File.open('test.plist') {|f| f.read}
54
+
55
+ assert_equal file, data.to_plist
56
+
57
+ File.unlink('test.plist')
58
+ end
59
+ end
@@ -0,0 +1,58 @@
1
+ ##############################################################
2
+ # Copyright 2006, Ben Bleything <ben@bleything.net> and #
3
+ # Patrick May <patrick@hexane.org> #
4
+ # #
5
+ # Distributed under the MIT license. #
6
+ ##############################################################
7
+
8
+ require 'test/unit'
9
+ require 'plist'
10
+
11
+ class TestGeneratorBasicTypes < Test::Unit::TestCase
12
+ def wrap(tag, content)
13
+ return "<#{tag}>#{content}</#{tag}>"
14
+ end
15
+
16
+ def test_strings
17
+ expected = wrap('string', 'testdata')
18
+
19
+ assert_equal expected, Plist::Emit.dump('testdata', false).chomp
20
+ assert_equal expected, Plist::Emit.dump(:testdata, false).chomp
21
+ end
22
+
23
+ def test_strings_with_escaping
24
+ expected = wrap('string', "&lt;Fish &amp; Chips&gt;")
25
+
26
+ assert_equal expected, Plist::Emit.dump('<Fish & Chips>', false).chomp
27
+ end
28
+
29
+ def test_integers
30
+ [42, 2376239847623987623, -8192].each do |i|
31
+ assert_equal wrap('integer', i), Plist::Emit.dump(i, false).chomp
32
+ end
33
+ end
34
+
35
+ def test_floats
36
+ [3.14159, -38.3897, 2398476293847.9823749872349980].each do |i|
37
+ assert_equal wrap('real', i), Plist::Emit.dump(i, false).chomp
38
+ end
39
+ end
40
+
41
+ def test_booleans
42
+ assert_equal "<true/>", Plist::Emit.dump(true, false).chomp
43
+ assert_equal "<false/>", Plist::Emit.dump(false, false).chomp
44
+ end
45
+
46
+ def test_time
47
+ test_time = Time.now
48
+ assert_equal wrap('date', test_time.utc.strftime('%Y-%m-%dT%H:%M:%SZ')), Plist::Emit.dump(test_time, false).chomp
49
+ end
50
+
51
+ def test_dates
52
+ test_date = Date.today
53
+ test_datetime = DateTime.now
54
+
55
+ assert_equal wrap('date', test_date.strftime('%Y-%m-%dT%H:%M:%SZ')), Plist::Emit.dump(test_date, false).chomp
56
+ assert_equal wrap('date', test_datetime.strftime('%Y-%m-%dT%H:%M:%SZ')), Plist::Emit.dump(test_datetime, false).chomp
57
+ end
58
+ end
@@ -0,0 +1,82 @@
1
+ ##############################################################
2
+ # Copyright 2006, Ben Bleything <ben@bleything.net> and #
3
+ # Patrick May <patrick@hexane.org> #
4
+ # #
5
+ # Distributed under the MIT license. #
6
+ ##############################################################
7
+
8
+ require 'test/unit'
9
+ require 'plist'
10
+
11
+ class TestGeneratorCollections < Test::Unit::TestCase
12
+ def test_array
13
+ expected = <<END
14
+ <array>
15
+ <integer>1</integer>
16
+ <integer>2</integer>
17
+ <integer>3</integer>
18
+ </array>
19
+ END
20
+
21
+ assert_equal expected, [1,2,3].to_plist(false)
22
+ end
23
+
24
+ def test_empty_array
25
+ expected = <<END
26
+ <array/>
27
+ END
28
+
29
+ assert_equal expected, [].to_plist(false)
30
+ end
31
+
32
+ def test_hash
33
+ expected = <<END
34
+ <dict>
35
+ <key>abc</key>
36
+ <integer>123</integer>
37
+ <key>foo</key>
38
+ <string>bar</string>
39
+ </dict>
40
+ END
41
+ # thanks to recent changes in the generator code, hash keys are sorted before emission,
42
+ # so multi-element hash tests should be reliable. We're testing that here too.
43
+ assert_equal expected, {:foo => :bar, :abc => 123}.to_plist(false)
44
+ end
45
+
46
+ def test_empty_hash
47
+ expected = <<END
48
+ <dict/>
49
+ END
50
+
51
+ assert_equal expected, {}.to_plist(false)
52
+ end
53
+
54
+ def test_hash_with_array_element
55
+ expected = <<END
56
+ <dict>
57
+ <key>ary</key>
58
+ <array>
59
+ <integer>1</integer>
60
+ <string>b</string>
61
+ <string>3</string>
62
+ </array>
63
+ </dict>
64
+ END
65
+ assert_equal expected, {:ary => [1,:b,'3']}.to_plist(false)
66
+ end
67
+
68
+ def test_array_with_hash_element
69
+ expected = <<END
70
+ <array>
71
+ <dict>
72
+ <key>foo</key>
73
+ <string>bar</string>
74
+ </dict>
75
+ <string>b</string>
76
+ <integer>3</integer>
77
+ </array>
78
+ END
79
+
80
+ assert_equal expected, [{:foo => 'bar'}, :b, 3].to_plist(false)
81
+ end
82
+ end
@@ -0,0 +1,90 @@
1
+ ##############################################################
2
+ # Copyright 2006, Ben Bleything <ben@bleything.net> and #
3
+ # Patrick May <patrick@hexane.org> #
4
+ # #
5
+ # Distributed under the MIT license. #
6
+ ##############################################################
7
+
8
+ require 'test/unit'
9
+
10
+ require 'plist'
11
+
12
+ class TestParser < Test::Unit::TestCase
13
+ def test_Plist_parse_xml
14
+ result = Plist::parse_xml("test/assets/AlbumData.xml")
15
+
16
+ # dict
17
+ assert_kind_of( Hash, result )
18
+ assert_equal( ["List of Albums",
19
+ "Minor Version",
20
+ "Master Image List",
21
+ "Major Version",
22
+ "List of Keywords",
23
+ "Archive Path",
24
+ "List of Rolls",
25
+ "Application Version"],
26
+ result.keys )
27
+
28
+ # array
29
+ assert_kind_of( Array, result["List of Rolls"] )
30
+ assert_equal( [ {"PhotoCount"=>1,
31
+ "KeyList"=>["7"],
32
+ "Parent"=>999000,
33
+ "Album Type"=>"Regular",
34
+ "AlbumName"=>"Roll 1",
35
+ "AlbumId"=>6}],
36
+ result["List of Rolls"] )
37
+
38
+ # string
39
+ assert_kind_of( String, result["Application Version"] )
40
+ assert_equal( "5.0.4 (263)", result["Application Version"] )
41
+
42
+ # integer
43
+ assert_kind_of( Integer, result["Major Version"] )
44
+ assert_equal( 2, result["Major Version"] )
45
+
46
+ # true
47
+ assert_kind_of( TrueClass, result["List of Albums"][0]["Master"] )
48
+ assert( result["List of Albums"][0]["Master"] )
49
+
50
+ # false
51
+ assert_kind_of( FalseClass, result["List of Albums"][1]["SlideShowUseTitles"] )
52
+ assert( ! result["List of Albums"][1]["SlideShowUseTitles"] )
53
+
54
+ end
55
+
56
+ # uncomment this test to work on speed optimization
57
+ #def test_load_something_big
58
+ # plist = Plist::parse_xml( "~/Pictures/iPhoto Library/AlbumData.xml" )
59
+ #end
60
+
61
+ # date fields are credited to
62
+ def test_date_fields
63
+ result = Plist::parse_xml("test/assets/Cookies.plist")
64
+ assert_kind_of( DateTime, result.first['Expires'] )
65
+ assert_equal( "2007-10-25T12:36:35Z", result.first['Expires'].to_s )
66
+ end
67
+
68
+ # bug fix for empty <key>
69
+ # reported by Matthias Peick <matthias@peick.de>
70
+ # reported and fixed by Frederik Seiffert <ego@frederikseiffert.de>
71
+ def test_empty_dict_key
72
+ data = Plist::parse_xml("test/assets/test_empty_key.plist");
73
+ assert_equal("2", data['key']['subkey'])
74
+ end
75
+
76
+ # bug fix for decoding entities
77
+ # reported by Matthias Peick <matthias@peick.de>
78
+ def test_decode_entities
79
+ data = Plist::parse_xml('<string>Fish &amp; Chips</string>')
80
+ assert_equal('Fish & Chips', data)
81
+ end
82
+
83
+ def test_comment_handling_and_empty_plist
84
+ assert_nothing_raised do
85
+ assert_nil( Plist::parse_xml( File.read('test/assets/commented.plist') ) )
86
+ end
87
+ end
88
+ end
89
+
90
+ __END__