microwave 1.0.4 → 11.400.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (249) hide show
  1. data/CONTRIBUTING.md +155 -0
  2. data/README.md +89 -0
  3. data/Rakefile +2 -2
  4. data/bin/chef-apply +25 -0
  5. data/bin/chef-shell +34 -0
  6. data/bin/chef-solo +0 -2
  7. data/bin/shef +6 -5
  8. data/lib/chef.rb +2 -4
  9. data/spec/data/big_json.json +2 -1
  10. data/spec/data/big_json_plus_one.json +2 -1
  11. data/spec/data/cookbooks/chefignore +2 -0
  12. data/spec/data/cookbooks/openldap/attributes/default.rb +10 -9
  13. data/spec/data/cookbooks/openldap/attributes/smokey.rb +1 -1
  14. data/spec/data/git_bundles/sinatra-test-app-with-callback-files.gitbundle +0 -0
  15. data/spec/data/git_bundles/sinatra-test-app-with-symlinks.gitbundle +0 -0
  16. data/spec/data/git_bundles/sinatra-test-app.gitbundle +0 -0
  17. data/spec/data/lwrp/providers/inline_compiler.rb +26 -0
  18. data/spec/data/nodes/default.rb +3 -3
  19. data/spec/data/nodes/test.example.com.rb +3 -3
  20. data/spec/data/nodes/test.rb +3 -3
  21. data/spec/data/partial_one.erb +1 -0
  22. data/spec/data/run_context/cookbooks/circular-dep1/attributes/default.rb +4 -0
  23. data/spec/data/run_context/cookbooks/circular-dep1/definitions/circular_dep1_res.rb +1 -0
  24. data/spec/data/run_context/cookbooks/circular-dep1/libraries/lib.rb +2 -0
  25. data/spec/data/run_context/cookbooks/circular-dep1/metadata.rb +2 -0
  26. data/spec/data/run_context/cookbooks/circular-dep1/providers/provider.rb +1 -0
  27. data/spec/data/run_context/cookbooks/circular-dep1/recipes/default.rb +0 -0
  28. data/spec/data/run_context/cookbooks/circular-dep1/resources/resource.rb +1 -0
  29. data/spec/data/run_context/cookbooks/circular-dep2/attributes/default.rb +3 -0
  30. data/spec/data/run_context/cookbooks/circular-dep2/definitions/circular_dep2_res.rb +1 -0
  31. data/spec/data/run_context/cookbooks/circular-dep2/libraries/lib.rb +2 -0
  32. data/spec/data/run_context/cookbooks/circular-dep2/metadata.rb +2 -0
  33. data/spec/data/run_context/cookbooks/circular-dep2/providers/provider.rb +1 -0
  34. data/spec/data/run_context/cookbooks/circular-dep2/recipes/default.rb +0 -0
  35. data/spec/data/run_context/cookbooks/circular-dep2/resources/resource.rb +1 -0
  36. data/spec/data/run_context/cookbooks/dependency1/attributes/aa_first.rb +2 -0
  37. data/spec/data/run_context/cookbooks/dependency1/attributes/default.rb +2 -0
  38. data/spec/data/run_context/cookbooks/dependency1/attributes/zz_last.rb +3 -0
  39. data/spec/data/run_context/cookbooks/dependency1/definitions/dependency1_res.rb +1 -0
  40. data/spec/data/run_context/cookbooks/dependency1/libraries/lib.rb +2 -0
  41. data/spec/data/run_context/cookbooks/dependency1/providers/provider.rb +1 -0
  42. data/spec/data/run_context/cookbooks/dependency1/recipes/default.rb +0 -0
  43. data/spec/data/run_context/cookbooks/dependency1/resources/resource.rb +1 -0
  44. data/spec/data/run_context/cookbooks/dependency2/attributes/default.rb +3 -0
  45. data/spec/data/run_context/cookbooks/dependency2/definitions/dependency2_res.rb +1 -0
  46. data/spec/data/run_context/cookbooks/dependency2/libraries/lib.rb +2 -0
  47. data/spec/data/run_context/cookbooks/dependency2/providers/provider.rb +1 -0
  48. data/spec/data/run_context/cookbooks/dependency2/recipes/default.rb +0 -0
  49. data/spec/data/run_context/cookbooks/dependency2/resources/resource.rb +1 -0
  50. data/spec/data/run_context/cookbooks/no-default-attr/attributes/server.rb +3 -0
  51. data/spec/data/run_context/cookbooks/no-default-attr/definitions/no_default-attr_res.rb +1 -0
  52. data/spec/data/run_context/cookbooks/no-default-attr/providers/provider.rb +1 -0
  53. data/spec/data/run_context/cookbooks/no-default-attr/recipes/default.rb +0 -0
  54. data/spec/data/run_context/cookbooks/no-default-attr/resources/resource.rb +1 -0
  55. data/spec/data/run_context/cookbooks/test-with-circular-deps/attributes/default.rb +3 -0
  56. data/spec/data/run_context/cookbooks/test-with-circular-deps/definitions/test_with-circular-deps_res.rb +1 -0
  57. data/spec/data/run_context/cookbooks/test-with-circular-deps/libraries/lib.rb +2 -0
  58. data/spec/data/run_context/cookbooks/test-with-circular-deps/metadata.rb +2 -0
  59. data/spec/data/run_context/cookbooks/test-with-circular-deps/providers/provider.rb +1 -0
  60. data/spec/data/run_context/cookbooks/test-with-circular-deps/recipes/default.rb +0 -0
  61. data/spec/data/run_context/cookbooks/test-with-circular-deps/resources/resource.rb +1 -0
  62. data/spec/data/run_context/cookbooks/test-with-deps/attributes/default.rb +3 -0
  63. data/spec/data/run_context/cookbooks/test-with-deps/definitions/test_with-deps_res.rb +1 -0
  64. data/spec/data/run_context/cookbooks/test-with-deps/libraries/lib.rb +1 -0
  65. data/spec/data/run_context/cookbooks/test-with-deps/metadata.rb +3 -0
  66. data/spec/data/run_context/cookbooks/test-with-deps/providers/provider.rb +1 -0
  67. data/spec/data/run_context/cookbooks/test-with-deps/recipes/default.rb +0 -0
  68. data/spec/data/run_context/cookbooks/test-with-deps/recipes/server.rb +0 -0
  69. data/spec/data/run_context/cookbooks/test-with-deps/resources/resource.rb +1 -0
  70. data/spec/data/run_context/cookbooks/test/attributes/default.rb +0 -0
  71. data/spec/data/run_context/cookbooks/test/attributes/george.rb +1 -1
  72. data/spec/data/run_context/cookbooks/test/definitions/test_res.rb +1 -0
  73. data/spec/data/run_context/cookbooks/test/providers/provider.rb +1 -0
  74. data/spec/data/run_context/cookbooks/test/resources/resource.rb +1 -0
  75. data/spec/data/shef-config.rb +10 -0
  76. data/spec/functional/dsl/registry_helper_spec.rb +63 -0
  77. data/spec/functional/knife/cookbook_delete_spec.rb +0 -2
  78. data/spec/functional/knife/exec_spec.rb +4 -6
  79. data/spec/functional/knife/smoke_test.rb +34 -0
  80. data/spec/functional/knife/ssh_spec.rb +64 -3
  81. data/spec/functional/resource/cookbook_file_spec.rb +33 -2
  82. data/spec/functional/resource/deploy_revision_spec.rb +515 -0
  83. data/spec/functional/resource/directory_spec.rb +4 -0
  84. data/spec/functional/resource/file_spec.rb +56 -22
  85. data/spec/functional/resource/link_spec.rb +12 -10
  86. data/spec/functional/resource/registry_spec.rb +572 -0
  87. data/spec/functional/resource/remote_directory_spec.rb +142 -36
  88. data/spec/functional/resource/remote_file_spec.rb +28 -3
  89. data/spec/functional/resource/template_spec.rb +23 -2
  90. data/spec/functional/run_lock_spec.rb +238 -0
  91. data/spec/functional/shell_spec.rb +101 -0
  92. data/spec/functional/tiny_server_spec.rb +5 -4
  93. data/spec/functional/win32/registry_helper_spec.rb +632 -0
  94. data/spec/functional/win32/security_spec.rb +37 -0
  95. data/spec/spec_helper.rb +15 -3
  96. data/spec/stress/win32/security_spec.rb +5 -5
  97. data/spec/support/chef_helpers.rb +14 -3
  98. data/spec/support/lib/chef/resource/cat.rb +3 -5
  99. data/spec/support/lib/chef/resource/one_two_three_four.rb +8 -10
  100. data/spec/support/lib/chef/resource/zen_master.rb +8 -10
  101. data/spec/support/matchers/leak.rb +1 -1
  102. data/spec/support/platform_helpers.rb +18 -0
  103. data/spec/support/shared/functional/directory_resource.rb +85 -23
  104. data/spec/support/shared/functional/file_resource.rb +198 -53
  105. data/spec/support/shared/functional/securable_resource.rb +140 -105
  106. data/spec/support/shared/functional/securable_resource_with_reporting.rb +375 -0
  107. data/spec/support/shared/unit/file_system_support.rb +110 -0
  108. data/spec/support/shared/unit/platform_introspector.rb +162 -0
  109. data/spec/tiny_server.rb +29 -10
  110. data/spec/unit/api_client/registration_spec.rb +172 -0
  111. data/spec/unit/api_client_spec.rb +156 -103
  112. data/spec/unit/application/apply.rb +84 -0
  113. data/spec/unit/application/knife_spec.rb +5 -0
  114. data/spec/unit/application_spec.rb +57 -2
  115. data/spec/unit/chef_fs/diff_spec.rb +329 -0
  116. data/spec/unit/chef_fs/file_pattern_spec.rb +526 -0
  117. data/spec/unit/chef_fs/file_system/chef_server_root_dir_spec.rb +237 -0
  118. data/spec/unit/chef_fs/file_system/cookbooks_dir_spec.rb +568 -0
  119. data/spec/unit/chef_fs/file_system/data_bags_dir_spec.rb +220 -0
  120. data/spec/unit/chef_fs/file_system_spec.rb +136 -0
  121. data/spec/unit/client_spec.rb +188 -16
  122. data/spec/unit/config_spec.rb +54 -4
  123. data/spec/unit/cookbook/chefignore_spec.rb +2 -1
  124. data/spec/unit/cookbook/syntax_check_spec.rb +48 -109
  125. data/spec/unit/cookbook_loader_spec.rb +153 -91
  126. data/spec/unit/cookbook_manifest_spec.rb +81 -81
  127. data/spec/unit/cookbook_spec.rb +3 -20
  128. data/spec/unit/cookbook_version_spec.rb +23 -122
  129. data/spec/unit/digester_spec.rb +50 -0
  130. data/spec/unit/dsl/data_query_spec.rb +66 -0
  131. data/spec/unit/dsl/platform_introspection_spec.rb +130 -0
  132. data/spec/unit/dsl/regsitry_helper_spec.rb +55 -0
  133. data/spec/unit/encrypted_data_bag_item_spec.rb +126 -10
  134. data/spec/unit/environment_spec.rb +0 -130
  135. data/spec/unit/exceptions_spec.rb +2 -3
  136. data/spec/unit/formatters/error_inspectors/resource_failure_inspector_spec.rb +23 -3
  137. data/spec/unit/json_compat_spec.rb +69 -0
  138. data/spec/unit/knife/bootstrap_spec.rb +81 -28
  139. data/spec/unit/knife/client_reregister_spec.rb +23 -22
  140. data/spec/unit/knife/configure_spec.rb +29 -26
  141. data/spec/unit/knife/cookbook_metadata_spec.rb +11 -4
  142. data/spec/unit/knife/cookbook_site_install_spec.rb +12 -2
  143. data/spec/unit/knife/cookbook_test_spec.rb +1 -0
  144. data/spec/unit/knife/cookbook_upload_spec.rb +41 -2
  145. data/spec/unit/knife/core/bootstrap_context_spec.rb +8 -1
  146. data/spec/unit/knife/core/ui_spec.rb +156 -7
  147. data/spec/unit/knife/data_bag_create_spec.rb +14 -0
  148. data/spec/unit/knife/data_bag_edit_spec.rb +14 -4
  149. data/spec/unit/knife/data_bag_from_file_spec.rb +17 -5
  150. data/spec/unit/knife/data_bag_show_spec.rb +11 -4
  151. data/spec/unit/knife/index_rebuild_spec.rb +96 -33
  152. data/spec/unit/knife/knife_help.rb +7 -7
  153. data/spec/unit/knife/node_run_list_remove_spec.rb +2 -1
  154. data/spec/unit/knife/ssh_spec.rb +121 -15
  155. data/spec/unit/knife/status_spec.rb +2 -2
  156. data/spec/unit/knife/user_create_spec.rb +86 -0
  157. data/spec/unit/knife/user_delete_spec.rb +39 -0
  158. data/spec/unit/knife/user_edit_spec.rb +42 -0
  159. data/spec/unit/knife/user_list_spec.rb +32 -0
  160. data/spec/unit/knife/user_reregister_spec.rb +53 -0
  161. data/spec/unit/knife/user_show_spec.rb +41 -0
  162. data/spec/unit/knife_spec.rb +53 -0
  163. data/spec/unit/lwrp_spec.rb +59 -17
  164. data/spec/unit/mixin/checksum_spec.rb +2 -2
  165. data/spec/unit/mixin/deep_merge_spec.rb +56 -491
  166. data/spec/unit/mixin/deprecation_spec.rb +23 -0
  167. data/spec/unit/mixin/enforce_ownership_and_permissions_spec.rb +6 -1
  168. data/spec/unit/mixin/params_validate_spec.rb +4 -2
  169. data/spec/unit/mixin/securable_spec.rb +5 -3
  170. data/spec/unit/mixin/template_spec.rb +119 -0
  171. data/spec/unit/node/attribute_spec.rb +272 -137
  172. data/spec/unit/node/immutable_collections_spec.rb +139 -0
  173. data/spec/unit/node_spec.rb +411 -339
  174. data/spec/unit/platform_spec.rb +8 -8
  175. data/spec/unit/provider/breakpoint_spec.rb +8 -8
  176. data/spec/unit/provider/cookbook_file_spec.rb +4 -8
  177. data/spec/unit/provider/deploy/revision_spec.rb +2 -8
  178. data/spec/unit/provider/deploy_spec.rb +6 -40
  179. data/spec/unit/provider/directory_spec.rb +103 -68
  180. data/spec/unit/provider/erl_call_spec.rb +0 -2
  181. data/spec/unit/provider/file_spec.rb +69 -59
  182. data/spec/unit/provider/git_spec.rb +0 -10
  183. data/spec/unit/provider/group/groupadd_spec.rb +1 -1
  184. data/spec/unit/provider/group/usermod_spec.rb +2 -2
  185. data/spec/unit/provider/http_request_spec.rb +28 -69
  186. data/spec/unit/provider/ifconfig_spec.rb +2 -2
  187. data/spec/unit/provider/link_spec.rb +1 -1
  188. data/spec/unit/provider/ohai_spec.rb +4 -4
  189. data/spec/unit/provider/package/apt_spec.rb +0 -1
  190. data/spec/unit/provider/package/ips_spec.rb +0 -1
  191. data/spec/unit/provider/package/rubygems_spec.rb +0 -18
  192. data/spec/unit/provider/package/yum_spec.rb +79 -15
  193. data/spec/unit/provider/package_spec.rb +7 -5
  194. data/spec/unit/provider/registry_key_spec.rb +269 -0
  195. data/spec/unit/provider/remote_directory_spec.rb +24 -7
  196. data/spec/unit/provider/remote_file_spec.rb +36 -0
  197. data/spec/unit/provider/route_spec.rb +3 -6
  198. data/spec/unit/provider/ruby_block_spec.rb +8 -0
  199. data/spec/unit/provider/service/arch_service_spec.rb +4 -4
  200. data/spec/unit/provider/service/debian_service_spec.rb +1 -1
  201. data/spec/unit/provider/service/freebsd_service_spec.rb +4 -4
  202. data/spec/unit/provider/service/init_service_spec.rb +26 -3
  203. data/spec/unit/provider/service/insserv_service_spec.rb +1 -1
  204. data/spec/unit/provider/service/invokercd_service_spec.rb +3 -3
  205. data/spec/unit/provider/service/redhat_spec.rb +1 -1
  206. data/spec/unit/provider/service/simple_service_spec.rb +3 -3
  207. data/spec/unit/provider/service/upstart_service_spec.rb +7 -7
  208. data/spec/unit/provider/service_spec.rb +2 -2
  209. data/spec/unit/provider/subversion_spec.rb +1 -1
  210. data/spec/unit/provider/template_spec.rb +35 -11
  211. data/spec/unit/provider/user/dscl_spec.rb +57 -31
  212. data/spec/unit/provider/user_spec.rb +7 -16
  213. data/spec/unit/provider_spec.rb +4 -3
  214. data/spec/unit/recipe_spec.rb +10 -8
  215. data/spec/unit/registry_helper_spec.rb +376 -0
  216. data/spec/unit/resource/log_spec.rb +9 -0
  217. data/spec/unit/resource/registry_key_spec.rb +171 -0
  218. data/spec/unit/resource/remote_file_spec.rb +21 -23
  219. data/spec/unit/resource/ruby_block_spec.rb +7 -3
  220. data/spec/unit/resource/service_spec.rb +11 -0
  221. data/spec/unit/resource_spec.rb +27 -4
  222. data/spec/unit/rest/auth_credentials_spec.rb +2 -14
  223. data/spec/unit/rest_spec.rb +122 -187
  224. data/spec/unit/run_context/cookbook_compiler_spec.rb +181 -0
  225. data/spec/unit/run_context_spec.rb +18 -4
  226. data/spec/unit/run_list_spec.rb +0 -209
  227. data/spec/unit/run_lock_spec.rb +37 -0
  228. data/spec/unit/runner_spec.rb +101 -2
  229. data/spec/unit/scan_access_control_spec.rb +4 -4
  230. data/spec/unit/{shef → shell}/model_wrapper_spec.rb +5 -5
  231. data/spec/unit/{shef/shef_ext_spec.rb → shell/shell_ext_spec.rb} +21 -21
  232. data/spec/unit/{shef/shef_session_spec.rb → shell/shell_session_spec.rb} +12 -12
  233. data/spec/unit/shell_out_spec.rb +18 -0
  234. data/spec/unit/{shef_spec.rb → shell_spec.rb} +20 -20
  235. data/spec/unit/user_spec.rb +255 -0
  236. metadata +162 -157
  237. data/README.rdoc +0 -177
  238. data/spec/unit/certificate_spec.rb +0 -76
  239. data/spec/unit/checksum_cache_spec.rb +0 -209
  240. data/spec/unit/checksum_spec.rb +0 -94
  241. data/spec/unit/couchdb_spec.rb +0 -274
  242. data/spec/unit/index_queue_spec.rb +0 -391
  243. data/spec/unit/json_compat_spect.rb +0 -53
  244. data/spec/unit/mixin/language_spec.rb +0 -305
  245. data/spec/unit/openid_registration_spec.rb +0 -153
  246. data/spec/unit/solr_query/query_transform_spec.rb +0 -454
  247. data/spec/unit/solr_query/solr_http_request_spec.rb +0 -244
  248. data/spec/unit/solr_query_spec.rb +0 -203
  249. data/spec/unit/webui_user_spec.rb +0 -238
@@ -62,6 +62,58 @@ describe Chef::Config do
62
62
  it_behaves_like "server URL"
63
63
  end
64
64
 
65
+ describe "when configuring formatters" do
66
+ # if TTY and not(force-logger)
67
+ # formatter = configured formatter or default formatter
68
+ # formatter goes to STDOUT/ERR
69
+ # if log file is writeable
70
+ # log level is configured level or info
71
+ # log location is file
72
+ # else
73
+ # log level is warn
74
+ # log location is STDERR
75
+ # end
76
+ # elsif not(TTY) and force formatter
77
+ # formatter = configured formatter or default formatter
78
+ # if log_location specified
79
+ # formatter goes to log_location
80
+ # else
81
+ # formatter goes to STDOUT/ERR
82
+ # end
83
+ # else
84
+ # formatter = "null"
85
+ # log_location = configured-value or defualt
86
+ # log_level = info or defualt
87
+ # end
88
+ #
89
+ before do
90
+ @config_class = Class.new(Chef::Config)
91
+ end
92
+
93
+ it "has an empty list of formatters by default" do
94
+ @config_class.formatters.should == []
95
+ end
96
+
97
+ it "configures a formatter with a short name" do
98
+ @config_class.add_formatter(:doc)
99
+ @config_class.formatters.should == [[:doc, nil]]
100
+ end
101
+
102
+ it "configures a formatter with a file output" do
103
+ @config_class.add_formatter(:doc, "/var/log/formatter.log")
104
+ @config_class.formatters.should == [[:doc, "/var/log/formatter.log"]]
105
+ end
106
+
107
+ end
108
+
109
+ context "when the url is a frozen string" do
110
+ before do
111
+ Chef::Config.chef_server_url = " https://junglist.gen.nz".freeze
112
+ end
113
+
114
+ it_behaves_like "server URL"
115
+ end
116
+
65
117
  describe "class method: manage_secret_key" do
66
118
  before do
67
119
  Chef::FileCache.stub!(:load).and_return(true)
@@ -129,16 +181,14 @@ describe Chef::Config do
129
181
  it "should return given path on non-windows systems" do
130
182
  platform_mock :unix do
131
183
  path = "/etc/chef/cookbooks"
132
- Chef::Config.platform_specific_path(path).should == "#{ENV['MICROWAVE_ROOT']}/etc/chef/cookbooks"
184
+ Chef::Config.platform_specific_path(path).should == "#{Chef::Config[:alt_root]}/etc/chef/cookbooks"
133
185
  end
134
186
  end
135
187
 
136
188
  it "should return a windows path on windows systems" do
137
189
  platform_mock :windows do
138
190
  path = "/etc/chef/cookbooks"
139
- save_microwave_root = ENV['MICROWAVE_ROOT']
140
- expected_microwave_root = save_microwave_root.gsub(File::SEPARATOR, (File::ALT_SEPARATOR || '\\'))
141
- ENV.stub!(:[]).with('MICROWAVE_ROOT').and_return(save_microwave_root)
191
+ expected_microwave_root = Chef::Config[:alt_root].gsub(File::SEPARATOR, (File::ALT_SEPARATOR || '\\'))
142
192
  ENV.stub!(:[]).with('SYSTEMDRIVE').and_return('C:')
143
193
  # match on a regex that looks for the base path with an optional
144
194
  # system drive at the beginning (c:)
@@ -23,7 +23,7 @@ describe Chef::Cookbook::Chefignore do
23
23
  end
24
24
 
25
25
  it "loads the globs in the chefignore file" do
26
- @chefignore.ignores.should =~ %w[recipes/ignoreme.rb]
26
+ @chefignore.ignores.should =~ %w[recipes/ignoreme.rb ignored]
27
27
  end
28
28
 
29
29
  it "removes items from an array that match the ignores" do
@@ -32,6 +32,7 @@ describe Chef::Cookbook::Chefignore do
32
32
  end
33
33
 
34
34
  it "determines if a file is ignored" do
35
+ @chefignore.ignored?('ignored').should be_true
35
36
  @chefignore.ignored?('recipes/ignoreme.rb').should be_true
36
37
  @chefignore.ignored?('recipes/dontignoreme.rb').should be_false
37
38
  end
@@ -16,175 +16,114 @@
16
16
  # limitations under the License.
17
17
  #
18
18
 
19
- ###################################################
20
- # OLD:
21
- ###################################################
22
- # def test_ruby(cookbook_dir)
23
- # cache = Chef::ChecksumCache.instance
24
- # Dir[File.join(cookbook_dir, '**', '*.rb')].each do |ruby_file|
25
- # key = cache.generate_key(ruby_file, "chef-test")
26
- # fstat = File.stat(ruby_file)
27
- #
28
- # if cache.lookup_checksum(key, fstat)
29
- # Chef::Log.info("No change in checksum of #{ruby_file}")
30
- # else
31
- # Chef::Log.info("Testing #{ruby_file} for syntax errors...")
32
- # Chef::Mixin::Command.run_command(:command => "ruby -c #{ruby_file}", :output_on_failure => true)
33
- # cache.generate_checksum(key, ruby_file, fstat)
34
- # end
35
- # end
36
- # end
37
- #
38
- #def test_templates(cookbook_dir)
39
- # cache = Chef::ChecksumCache.instance
40
- # Dir[File.join(cookbook_dir, '**', '*.erb')].each do |erb_file|
41
- # key = cache.generate_key(erb_file, "chef-test")
42
- # fstat = File.stat(erb_file)
43
- #
44
- # if cache.lookup_checksum(key, fstat)
45
- # Chef::Log.info("No change in checksum of #{erb_file}")
46
- # else
47
- # Chef::Log.info("Testing template #{erb_file} for syntax errors...")
48
- # Chef::Mixin::Command.run_command(:command => "sh -c 'erubis -x #{erb_file} | ruby -c'", :output_on_failure => true)
49
- # cache.generate_checksum(key, erb_file, fstat)
50
- # end
51
- # end
52
- #end
53
- #
54
-
55
- ###################################################
56
- # NEW:
57
- ###################################################
58
- # def test_template_file(cookbook_dir, erb_file)
59
- # Chef::Log.debug("Testing template #{erb_file} for syntax errors...")
60
- # result = shell_out("sh -c 'erubis -x #{erb_file} | ruby -c'")
61
- # result.error!
62
- # rescue Mixlib::ShellOut::ShellCommandFailed
63
- # file_relative_path = erb_file[/^#{Regexp.escape(cookbook_dir+File::Separator)}(.*)/, 1]
64
- # Chef::Log.fatal("Erb template #{file_relative_path} has a syntax error:")
65
- # result.stderr.each_line { |l| Chef::Log.fatal(l.chomp) }
66
- # exit(1)
67
- # end
68
- #
69
- # def test_ruby_file(cookbook_dir, ruby_file)
70
- # Chef::Log.debug("Testing #{ruby_file} for syntax errors...")
71
- # result = shell_out("ruby -c #{ruby_file}")
72
- # result.error!
73
- # rescue Mixlib::ShellOut::ShellCommandFailed
74
- # file_relative_path = ruby_file[/^#{Regexp.escape(cookbook_dir+File::Separator)}(.*)/, 1]
75
- # Chef::Log.fatal("Cookbook file #{file_relative_path} has a syntax error:")
76
- # result.stderr.each_line { |l| Chef::Log.fatal(l.chomp) }
77
- # exit(1)
78
- # end
79
- #
80
-
81
19
  require 'spec_helper'
82
20
  require "chef/cookbook/syntax_check"
83
21
 
84
22
  describe Chef::Cookbook::SyntaxCheck do
23
+
24
+ let(:cookbook_path) { File.join(CHEF_SPEC_DATA, 'cookbooks', 'openldap') }
25
+ let(:syntax_check) { Chef::Cookbook::SyntaxCheck.new(cookbook_path) }
26
+
85
27
  before do
86
28
  Chef::Log.logger = Logger.new(StringIO.new)
29
+ Chef::Log.level = :warn # suppress "Syntax OK" messages
87
30
 
88
- @cookbook_path = File.join(CHEF_SPEC_DATA, 'cookbooks', 'openldap')
89
31
 
90
- @attr_files = %w{default.rb smokey.rb}.map { |f| File.join(@cookbook_path, 'attributes', f) }
91
- @defn_files = %w{client.rb server.rb}.map { |f| File.join(@cookbook_path, 'definitions', f)}
92
- @recipes = %w{default.rb gigantor.rb one.rb}.map { |f| File.join(@cookbook_path, 'recipes', f) }
32
+ @attr_files = %w{default.rb smokey.rb}.map { |f| File.join(cookbook_path, 'attributes', f) }
33
+ @defn_files = %w{client.rb server.rb}.map { |f| File.join(cookbook_path, 'definitions', f)}
34
+ @recipes = %w{default.rb gigantor.rb one.rb}.map { |f| File.join(cookbook_path, 'recipes', f) }
93
35
  @ruby_files = @attr_files + @defn_files + @recipes
94
36
 
95
- @template_files = %w{openldap_stuff.conf.erb openldap_variable_stuff.conf.erb test.erb}.map { |f| File.join(@cookbook_path, 'templates', 'default', f)}
37
+ @template_files = %w{openldap_stuff.conf.erb openldap_variable_stuff.conf.erb test.erb}.map { |f| File.join(cookbook_path, 'templates', 'default', f)}
96
38
 
97
- @syntax_check = Chef::Cookbook::SyntaxCheck.new(@cookbook_path)
98
39
  end
99
40
 
100
41
  it "creates a syntax checker given the cookbook name when Chef::Config.cookbook_path is set" do
101
- Chef::Config[:cookbook_path] = File.dirname(@cookbook_path)
42
+ Chef::Config[:cookbook_path] = File.dirname(cookbook_path)
102
43
  syntax_check = Chef::Cookbook::SyntaxCheck.for_cookbook(:openldap)
103
- syntax_check.cookbook_path.should == @cookbook_path
44
+ syntax_check.cookbook_path.should == cookbook_path
104
45
  end
105
46
 
106
47
  describe "when first created" do
107
48
  it "has the path to the cookbook to syntax check" do
108
- @syntax_check.cookbook_path.should == @cookbook_path
109
- end
110
-
111
- it "has access to the checksum cache" do
112
- @syntax_check.cache.should equal(Chef::ChecksumCache.instance)
49
+ syntax_check.cookbook_path.should == cookbook_path
113
50
  end
114
51
 
115
52
  it "lists the ruby files in the cookbook" do
116
- @syntax_check.ruby_files.sort.should == @ruby_files.sort
53
+ syntax_check.ruby_files.sort.should == @ruby_files.sort
117
54
  end
118
55
 
119
56
  it "lists the erb templates in the cookbook" do
120
- @syntax_check.template_files.sort.should == @template_files.sort
57
+ syntax_check.template_files.sort.should == @template_files.sort
121
58
  end
122
59
 
123
60
  end
124
61
 
125
62
  describe "when validating cookbooks" do
63
+ let(:cache_path) { Dir.mktmpdir }
64
+
126
65
  before do
127
- Chef::Config[:cache_type] = 'Memory'
128
- @checksum_cache_klass = Class.new(Chef::ChecksumCache)
129
- @checksum_cache = @checksum_cache_klass.instance
130
- @checksum_cache.reset!('Memory')
131
- @syntax_check.stub!(:cache).and_return(@checksum_cache)
132
- $stdout.stub!(:write)
66
+ Chef::Config[:syntax_check_cache_path] = cache_path
67
+ end
68
+
69
+ after do
70
+ FileUtils.rm_rf(cache_path) if File.exist?(cache_path)
71
+ Chef::Config[:syntax_check_cache_path] = nil
133
72
  end
134
73
 
135
74
  describe "and the files have not been syntax checked previously" do
136
75
  it "shows that all ruby files require a syntax check" do
137
- @syntax_check.untested_ruby_files.sort.should == @ruby_files.sort
76
+ syntax_check.untested_ruby_files.sort.should == @ruby_files.sort
138
77
  end
139
78
 
140
79
  it "shows that all template files require a syntax check" do
141
- @syntax_check.untested_template_files.sort.should == @template_files.sort
80
+ syntax_check.untested_template_files.sort.should == @template_files.sort
142
81
  end
143
82
 
144
83
  it "removes a ruby file from the list of untested files after it is marked as validated" do
145
- recipe = File.join(@cookbook_path, 'recipes', 'default.rb')
146
- @syntax_check.validated(recipe)
147
- @syntax_check.untested_ruby_files.should_not include(recipe)
84
+ recipe = File.join(cookbook_path, 'recipes', 'default.rb')
85
+ syntax_check.validated(recipe)
86
+ syntax_check.untested_ruby_files.should_not include(recipe)
148
87
  end
149
88
 
150
89
  it "removes a template file from the list of untested files after it is marked as validated" do
151
- template = File.join(@cookbook_path, 'templates', 'default', 'test.erb')
152
- @syntax_check.validated(template)
153
- @syntax_check.untested_template_files.should_not include(template)
90
+ template = File.join(cookbook_path, 'templates', 'default', 'test.erb')
91
+ syntax_check.validated(template)
92
+ syntax_check.untested_template_files.should_not include(template)
154
93
  end
155
94
 
156
95
  it "validates all ruby files" do
157
- @syntax_check.validate_ruby_files.should be_true
158
- @syntax_check.untested_ruby_files.should be_empty
96
+ syntax_check.validate_ruby_files.should be_true
97
+ syntax_check.untested_ruby_files.should be_empty
159
98
  end
160
99
 
161
100
  it "validates all templates" do
162
- @syntax_check.validate_templates.should be_true
163
- @syntax_check.untested_template_files.should be_empty
101
+ syntax_check.validate_templates.should be_true
102
+ syntax_check.untested_template_files.should be_empty
164
103
  end
165
104
 
166
105
  describe "and a file has a syntax error" do
167
106
  before do
168
- @cookbook_path = File.join(CHEF_SPEC_DATA, 'cookbooks', 'borken')
169
- @syntax_check.cookbook_path.replace(@cookbook_path)
107
+ cookbook_path = File.join(CHEF_SPEC_DATA, 'cookbooks', 'borken')
108
+ syntax_check.cookbook_path.replace(cookbook_path)
170
109
  end
171
110
 
172
111
  it "it indicates that a ruby file has a syntax error" do
173
- @syntax_check.validate_ruby_files.should be_false
112
+ syntax_check.validate_ruby_files.should be_false
174
113
  end
175
114
 
176
115
  it "does not remove the invalid file from the list of untested files" do
177
- @syntax_check.untested_ruby_files.should include(File.join(@cookbook_path, 'recipes', 'default.rb'))
178
- lambda { @syntax_check.validate_ruby_files }.should_not change(@syntax_check, :untested_ruby_files)
116
+ syntax_check.untested_ruby_files.should include(File.join(cookbook_path, 'recipes', 'default.rb'))
117
+ lambda { syntax_check.validate_ruby_files }.should_not change(syntax_check, :untested_ruby_files)
179
118
  end
180
119
 
181
120
  it "indicates that a template file has a syntax error" do
182
- @syntax_check.validate_templates.should be_false
121
+ syntax_check.validate_templates.should be_false
183
122
  end
184
123
 
185
124
  it "does not remove the invalid template from the list of untested templates" do
186
- @syntax_check.untested_template_files.should include(File.join(@cookbook_path, 'templates', 'default', 'borken.erb'))
187
- lambda {@syntax_check.validate_templates}.should_not change(@syntax_check, :untested_template_files)
125
+ syntax_check.untested_template_files.should include(File.join(cookbook_path, 'templates', 'default', 'borken.erb'))
126
+ lambda {syntax_check.validate_templates}.should_not change(syntax_check, :untested_template_files)
188
127
  end
189
128
 
190
129
  end
@@ -193,18 +132,18 @@ describe Chef::Cookbook::SyntaxCheck do
193
132
 
194
133
  describe "and the files have been syntax checked previously" do
195
134
  before do
196
- @syntax_check.untested_ruby_files.each { |f| @syntax_check.validated(f) }
197
- @syntax_check.untested_template_files.each { |f| @syntax_check.validated(f) }
135
+ syntax_check.untested_ruby_files.each { |f| syntax_check.validated(f) }
136
+ syntax_check.untested_template_files.each { |f| syntax_check.validated(f) }
198
137
  end
199
138
 
200
139
  it "does not syntax check ruby files" do
201
- @syntax_check.should_not_receive(:shell_out)
202
- @syntax_check.validate_ruby_files.should be_true
140
+ syntax_check.should_not_receive(:shell_out)
141
+ syntax_check.validate_ruby_files.should be_true
203
142
  end
204
143
 
205
144
  it "does not syntax check templates" do
206
- @syntax_check.should_not_receive(:shell_out)
207
- @syntax_check.validate_templates.should be_true
145
+ syntax_check.should_not_receive(:shell_out)
146
+ syntax_check.validate_templates.should be_true
208
147
  end
209
148
  end
210
149
  end
@@ -25,121 +25,183 @@ describe Chef::CookbookLoader do
25
25
  @cookbook_loader = Chef::CookbookLoader.new(@repo_paths)
26
26
  end
27
27
 
28
- describe "[]" do
29
- it "should return cookbook objects with []" do
30
- @cookbook_loader[:openldap].should be_a_kind_of(Chef::CookbookVersion)
28
+ describe "loading all cookbooks" do
29
+ before(:each) do
30
+ @cookbook_loader.load_cookbooks
31
31
  end
32
32
 
33
+ describe "[]" do
34
+ it "should return cookbook objects with []" do
35
+ @cookbook_loader[:openldap].should be_a_kind_of(Chef::CookbookVersion)
36
+ end
33
37
 
34
- it "should raise an exception if it cannot find a cookbook with []" do
35
- lambda { @cookbook_loader[:monkeypoop] }.should raise_error(Chef::Exceptions::CookbookNotFoundInRepo)
36
- end
37
-
38
- it "should allow you to look up available cookbooks with [] and a symbol" do
39
- @cookbook_loader[:openldap].name.should eql(:openldap)
40
- end
38
+ it "should raise an exception if it cannot find a cookbook with []" do
39
+ lambda { @cookbook_loader[:monkeypoop] }.should raise_error(Chef::Exceptions::CookbookNotFoundInRepo)
40
+ end
41
41
 
42
- it "should allow you to look up available cookbooks with [] and a string" do
43
- @cookbook_loader["openldap"].name.should eql(:openldap)
44
- end
45
- end
42
+ it "should allow you to look up available cookbooks with [] and a symbol" do
43
+ @cookbook_loader[:openldap].name.should eql(:openldap)
44
+ end
46
45
 
47
- describe "each" do
48
- it "should allow you to iterate over cookbooks with each" do
49
- seen = Hash.new
50
- @cookbook_loader.each do |cookbook_name, cookbook|
51
- seen[cookbook_name] = true
46
+ it "should allow you to look up available cookbooks with [] and a string" do
47
+ @cookbook_loader["openldap"].name.should eql(:openldap)
52
48
  end
53
- seen.should have_key("openldap")
54
- seen.should have_key("apache2")
55
49
  end
56
50
 
57
- it "should iterate in alphabetical order" do
58
- seen = Array.new
59
- @cookbook_loader.each do |cookbook_name, cookbook|
60
- seen << cookbook_name
51
+ describe "each" do
52
+ it "should allow you to iterate over cookbooks with each" do
53
+ seen = Hash.new
54
+ @cookbook_loader.each do |cookbook_name, cookbook|
55
+ seen[cookbook_name] = true
56
+ end
57
+ seen.should have_key("openldap")
58
+ seen.should have_key("apache2")
61
59
  end
62
- seen[0].should == "angrybash"
63
- seen[1].should == "apache2"
64
- seen[2].should == "borken"
65
- seen[3].should == "java"
66
- seen[4].should == "openldap"
67
- end
68
- end
69
60
 
70
- describe "load_cookbooks" do
71
- it "should find all the cookbooks in the cookbook path" do
72
- Chef::Config.cookbook_path << File.expand_path(File.join(CHEF_SPEC_DATA, "hidden-cookbooks"))
73
- @cookbook_loader.load_cookbooks
74
- @cookbook_loader.should have_key(:openldap)
75
- @cookbook_loader.should have_key(:apache2)
61
+ it "should iterate in alphabetical order" do
62
+ seen = Array.new
63
+ @cookbook_loader.each do |cookbook_name, cookbook|
64
+ seen << cookbook_name
65
+ end
66
+ seen[0].should == "angrybash"
67
+ seen[1].should == "apache2"
68
+ seen[2].should == "borken"
69
+ seen[3].should == "java"
70
+ seen[4].should == "openldap"
71
+ end
76
72
  end
73
+
74
+ describe "load_cookbooks" do
75
+ it "should find all the cookbooks in the cookbook path" do
76
+ Chef::Config.cookbook_path << File.expand_path(File.join(CHEF_SPEC_DATA, "hidden-cookbooks"))
77
+ @cookbook_loader.load_cookbooks
78
+ @cookbook_loader.should have_key(:openldap)
79
+ @cookbook_loader.should have_key(:apache2)
80
+ end
81
+
82
+ it "should allow you to override an attribute file via cookbook_path" do
83
+ @cookbook_loader[:openldap].attribute_filenames.detect { |f|
84
+ f =~ /cookbooks\/openldap\/attributes\/default.rb/
85
+ }.should_not eql(nil)
86
+ @cookbook_loader[:openldap].attribute_filenames.detect { |f|
87
+ f =~ /kitchen\/openldap\/attributes\/default.rb/
88
+ }.should eql(nil)
89
+ end
90
+
91
+ it "should load different attribute files from deeper paths" do
92
+ @cookbook_loader[:openldap].attribute_filenames.detect { |f|
93
+ f =~ /kitchen\/openldap\/attributes\/robinson.rb/
94
+ }.should_not eql(nil)
95
+ end
96
+
97
+ it "should allow you to override a definition file via cookbook_path" do
98
+ @cookbook_loader[:openldap].definition_filenames.detect { |f|
99
+ f =~ /cookbooks\/openldap\/definitions\/client.rb/
100
+ }.should_not eql(nil)
101
+ @cookbook_loader[:openldap].definition_filenames.detect { |f|
102
+ f =~ /kitchen\/openldap\/definitions\/client.rb/
103
+ }.should eql(nil)
104
+ end
105
+
106
+ it "should load definition files from deeper paths" do
107
+ @cookbook_loader[:openldap].definition_filenames.detect { |f|
108
+ f =~ /kitchen\/openldap\/definitions\/drewbarrymore.rb/
109
+ }.should_not eql(nil)
110
+ end
111
+
112
+ it "should allow you to override a recipe file via cookbook_path" do
113
+ @cookbook_loader[:openldap].recipe_filenames.detect { |f|
114
+ f =~ /cookbooks\/openldap\/recipes\/gigantor.rb/
115
+ }.should_not eql(nil)
116
+ @cookbook_loader[:openldap].recipe_filenames.detect { |f|
117
+ f =~ /kitchen\/openldap\/recipes\/gigantor.rb/
118
+ }.should eql(nil)
119
+ end
120
+
121
+ it "should load recipe files from deeper paths" do
122
+ @cookbook_loader[:openldap].recipe_filenames.detect { |f|
123
+ f =~ /kitchen\/openldap\/recipes\/woot.rb/
124
+ }.should_not eql(nil)
125
+ end
126
+
127
+ it "should allow you to have an 'ignore' file, which skips loading files in later cookbooks" do
128
+ @cookbook_loader[:openldap].recipe_filenames.detect { |f|
129
+ f =~ /kitchen\/openldap\/recipes\/ignoreme.rb/
130
+ }.should eql(nil)
131
+ end
132
+
133
+ it "should find files that start with a ." do
134
+ @cookbook_loader[:openldap].file_filenames.detect { |f|
135
+ f =~ /\.dotfile$/
136
+ }.should =~ /\.dotfile$/
137
+ @cookbook_loader[:openldap].file_filenames.detect { |f|
138
+ f =~ /\.ssh\/id_rsa$/
139
+ }.should =~ /\.ssh\/id_rsa$/
140
+ end
141
+
142
+ it "should load the metadata for the cookbook" do
143
+ @cookbook_loader.metadata[:openldap].name.should == :openldap
144
+ @cookbook_loader.metadata[:openldap].should be_a_kind_of(Chef::Cookbook::Metadata)
145
+ end
77
146
 
78
- it "should allow you to override an attribute file via cookbook_path" do
79
- @cookbook_loader[:openldap].attribute_filenames.detect { |f|
80
- f =~ /cookbooks\/openldap\/attributes\/default.rb/
81
- }.should_not eql(nil)
82
- @cookbook_loader[:openldap].attribute_filenames.detect { |f|
83
- f =~ /kitchen\/openldap\/attributes\/default.rb/
84
- }.should eql(nil)
85
- end
147
+ it "should check each cookbook directory only once (CHEF-3487)" do
148
+ cookbooks = []
149
+ @repo_paths.each do |repo_path|
150
+ cookbooks |= Dir[File.join(repo_path, "*")]
151
+ end
152
+ cookbooks.each do |cookbook|
153
+ File.should_receive(:directory?).with(cookbook).once;
154
+ end
155
+ @cookbook_loader.load_cookbooks
156
+ end
157
+ end # load_cookbooks
86
158
 
87
- it "should load different attribute files from deeper paths" do
88
- @cookbook_loader[:openldap].attribute_filenames.detect { |f|
89
- f =~ /kitchen\/openldap\/attributes\/robinson.rb/
90
- }.should_not eql(nil)
91
- end
159
+ end # loading all cookbooks
92
160
 
93
- it "should allow you to override a definition file via cookbook_path" do
94
- @cookbook_loader[:openldap].definition_filenames.detect { |f|
95
- f =~ /cookbooks\/openldap\/definitions\/client.rb/
96
- }.should_not eql(nil)
97
- @cookbook_loader[:openldap].definition_filenames.detect { |f|
98
- f =~ /kitchen\/openldap\/definitions\/client.rb/
99
- }.should eql(nil)
161
+ describe "loading only one cookbook" do
162
+ before(:each) do
163
+ @cookbook_loader = Chef::CookbookLoader.new(@repo_paths)
164
+ @cookbook_loader.load_cookbook("openldap")
100
165
  end
101
166
 
102
- it "should load definition files from deeper paths" do
103
- @cookbook_loader[:openldap].definition_filenames.detect { |f|
104
- f =~ /kitchen\/openldap\/definitions\/drewbarrymore.rb/
105
- }.should_not eql(nil)
167
+ it "should have loaded the correct cookbook" do
168
+ seen = Hash.new
169
+ @cookbook_loader.each do |cookbook_name, cookbook|
170
+ seen[cookbook_name] = true
171
+ end
172
+ seen.should have_key("openldap")
106
173
  end
107
174
 
108
- it "should allow you to override a recipe file via cookbook_path" do
109
- @cookbook_loader[:openldap].recipe_filenames.detect { |f|
110
- f =~ /cookbooks\/openldap\/recipes\/gigantor.rb/
111
- }.should_not eql(nil)
112
- @cookbook_loader[:openldap].recipe_filenames.detect { |f|
113
- f =~ /kitchen\/openldap\/recipes\/gigantor.rb/
114
- }.should eql(nil)
175
+ it "should not load the cookbook again when accessed" do
176
+ @cookbook_loader.should_not_receive('load_cookbook')
177
+ @cookbook_loader["openldap"]
115
178
  end
116
179
 
117
- it "should load recipe files from deeper paths" do
118
- @cookbook_loader[:openldap].recipe_filenames.detect { |f|
119
- f =~ /kitchen\/openldap\/recipes\/woot.rb/
120
- }.should_not eql(nil)
180
+ it "should not load the other cookbooks" do
181
+ seen = Hash.new
182
+ @cookbook_loader.each do |cookbook_name, cookbook|
183
+ seen[cookbook_name] = true
184
+ end
185
+ seen.should_not have_key("apache2")
121
186
  end
122
187
 
123
- it "should allow you to have an 'ignore' file, which skips loading files in later cookbooks" do
124
- @cookbook_loader[:openldap].recipe_filenames.detect { |f|
125
- f =~ /kitchen\/openldap\/recipes\/ignoreme.rb/
126
- }.should eql(nil)
188
+ it "should load another cookbook lazily with []" do
189
+ @cookbook_loader["apache2"].should be_a_kind_of(Chef::CookbookVersion)
127
190
  end
128
191
 
129
- it "should find files that start with a ." do
130
- @cookbook_loader[:openldap].file_filenames.detect { |f|
131
- f =~ /\.dotfile$/
132
- }.should =~ /\.dotfile$/
133
- @cookbook_loader[:openldap].file_filenames.detect { |f|
134
- f =~ /\.ssh\/id_rsa$/
135
- }.should =~ /\.ssh\/id_rsa$/
136
- end
192
+ describe "loading all cookbooks after loading only one cookbook" do
193
+ before(:each) do
194
+ @cookbook_loader.load_cookbooks
195
+ end
137
196
 
138
- it "should load the metadata for the cookbook" do
139
- @cookbook_loader.metadata[:openldap].name.should == :openldap
140
- @cookbook_loader.metadata[:openldap].should be_a_kind_of(Chef::Cookbook::Metadata)
197
+ it "should load all cookbooks" do
198
+ seen = Hash.new
199
+ @cookbook_loader.each do |cookbook_name, cookbook|
200
+ seen[cookbook_name] = true
201
+ end
202
+ seen.should have_key("openldap")
203
+ seen.should have_key("apache2")
204
+ end
141
205
  end
142
-
143
- end
144
-
206
+ end # loading only one cookbook
145
207
  end