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
@@ -0,0 +1,181 @@
1
+ #
2
+ # Author:: Daniel DeLeo (<dan@opscode.com>)
3
+ # Copyright:: Copyright (c) 2012 Opscode, Inc.
4
+ # License:: Apache License, Version 2.0
5
+ #
6
+ # Licensed under the Apache License, Version 2.0 (the "License");
7
+ # you may not use this file except in compliance with the License.
8
+ # You may obtain a copy of the License at
9
+ #
10
+ # http://www.apache.org/licenses/LICENSE-2.0
11
+ #
12
+ # Unless required by applicable law or agreed to in writing, software
13
+ # distributed under the License is distributed on an "AS IS" BASIS,
14
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
+ # See the License for the specific language governing permissions and
16
+ # limitations under the License.
17
+ #
18
+
19
+ require 'spec_helper'
20
+
21
+ # Keeps track of what file got loaded in what order.
22
+ module LibraryLoadOrder
23
+ extend self
24
+
25
+ def load_order
26
+ @load_order ||= []
27
+ end
28
+
29
+ def reset!
30
+ @load_order = nil
31
+ end
32
+
33
+ def record(file)
34
+ load_order << file
35
+ end
36
+ end
37
+
38
+ # These tests rely on fixture data in spec/data/run_context/cookbooks.
39
+ #
40
+ # Dependencies (circular or not) are specified by `depends` directives in the
41
+ # metadata of these cookbooks.
42
+ #
43
+ # Side effects used to verify the behavior are implemented as code in the various file types.
44
+ #
45
+ describe Chef::RunContext::CookbookCompiler do
46
+
47
+ let(:node) { Chef::Node.new }
48
+
49
+ let(:events) { Chef::EventDispatch::Dispatcher.new }
50
+
51
+ let(:cookbook_loader) do
52
+ cl = Chef::CookbookLoader.new(chef_repo_path)
53
+ cl.load_cookbooks
54
+ cl
55
+ end
56
+
57
+ let(:run_context) { Chef::RunContext.new(node, cookbook_collection, events) }
58
+
59
+ let(:chef_repo_path) { File.expand_path(File.join(CHEF_SPEC_DATA, "run_context", "cookbooks")) }
60
+
61
+ let(:cookbook_collection) { Chef::CookbookCollection.new(cookbook_loader) }
62
+
63
+ # Lazy evaluation of `expansion` here is used to mutate the run list before expanding it
64
+ let(:run_list_expansion) { node.run_list.expand('_default') }
65
+
66
+ let(:compiler) do
67
+ Chef::RunContext::CookbookCompiler.new(run_context, run_list_expansion, events)
68
+ end
69
+
70
+
71
+ describe "loading attribute files" do
72
+
73
+ # Attribute files in the fixture data will append their
74
+ # "cookbook_name::attribute_file_name" to the node's `:attr_load_order`
75
+ # attribute when loaded.
76
+
77
+ it "loads default.rb first, then other files in sort order" do
78
+ node.run_list("dependency1::default")
79
+
80
+ compiler.compile_attributes
81
+ node[:attr_load_order].should == ["dependency1::default", "dependency1::aa_first", "dependency1::zz_last"]
82
+ end
83
+
84
+ it "loads dependencies before loading the depending cookbook's attributes" do
85
+ # Also make sure that attributes aren't loaded twice if we have two
86
+ # recipes from the same cookbook in the run list
87
+ node.run_list("test-with-deps::default", "test-with-deps::server")
88
+
89
+ compiler.compile_attributes
90
+
91
+ # dependencies are stored in a hash so therefore unordered, but they should be loaded in sort order
92
+ node[:attr_load_order].should == ["dependency1::default",
93
+ "dependency1::aa_first",
94
+ "dependency1::zz_last",
95
+ "dependency2::default",
96
+ "test-with-deps::default"]
97
+ end
98
+
99
+ it "does not follow infinite dependency loops" do
100
+ node.run_list("test-with-circular-deps::default")
101
+
102
+ # Circular deps should not cause infinite loops
103
+ compiler.compile_attributes
104
+
105
+ node[:attr_load_order].should == ["circular-dep2::default", "circular-dep1::default", "test-with-circular-deps::default"]
106
+ end
107
+
108
+ it "loads attributes from cookbooks that don't have a default.rb attribute file" do
109
+ node.run_list("no-default-attr::default.rb")
110
+
111
+ compiler.compile_attributes
112
+
113
+ node[:attr_load_order].should == ["no-default-attr::server"]
114
+ end
115
+ end
116
+
117
+ describe "loading libraries" do
118
+ before do
119
+ LibraryLoadOrder.reset!
120
+ end
121
+
122
+ # One big test for everything. Individual behaviors are tested by the attribute code above.
123
+ it "loads libraries in run list order" do
124
+ node.run_list("test-with-deps::default", "test-with-circular-deps::default")
125
+
126
+ compiler.compile_libraries
127
+ LibraryLoadOrder.load_order.should == ["dependency1", "dependency2", "test-with-deps", "circular-dep2", "circular-dep1", "test-with-circular-deps"]
128
+ end
129
+ end
130
+
131
+ describe "loading LWRPs" do
132
+ before do
133
+ LibraryLoadOrder.reset!
134
+ end
135
+
136
+ # One big test for everything. Individual behaviors are tested by the attribute code above.
137
+ it "loads LWRPs in run list order" do
138
+ node.run_list("test-with-deps::default", "test-with-circular-deps::default")
139
+
140
+ compiler.compile_lwrps
141
+ LibraryLoadOrder.load_order.should == ["dependency1-provider",
142
+ "dependency1-resource",
143
+ "dependency2-provider",
144
+ "dependency2-resource",
145
+ "test-with-deps-provider",
146
+ "test-with-deps-resource",
147
+ "circular-dep2-provider",
148
+ "circular-dep2-resource",
149
+ "circular-dep1-provider",
150
+ "circular-dep1-resource",
151
+ "test-with-circular-deps-provider",
152
+ "test-with-circular-deps-resource"]
153
+ end
154
+ end
155
+
156
+ describe "loading resource definitions" do
157
+ before do
158
+ LibraryLoadOrder.reset!
159
+ end
160
+
161
+ # One big test for all load order concerns. Individual behaviors are tested
162
+ # by the attribute code above.
163
+ it "loads resource definitions in run list order" do
164
+ node.run_list("test-with-deps::default", "test-with-circular-deps::default")
165
+
166
+ compiler.compile_resource_definitions
167
+ LibraryLoadOrder.load_order.should == ["dependency1-definition",
168
+ "dependency2-definition",
169
+ "test-with-deps-definition",
170
+ "circular-dep2-definition",
171
+ "circular-dep1-definition",
172
+ "test-with-circular-deps-definition"]
173
+ end
174
+
175
+ end
176
+
177
+ describe "loading recipes" do
178
+ # Tests for this behavior are in RunContext's tests
179
+ end
180
+
181
+ end
@@ -24,11 +24,12 @@ Chef::Log.level = :debug
24
24
 
25
25
  describe Chef::RunContext do
26
26
  before(:each) do
27
- Chef::Config.node_path(File.expand_path(File.join(CHEF_SPEC_DATA, "run_context", "nodes")))
28
27
  @chef_repo_path = File.expand_path(File.join(CHEF_SPEC_DATA, "run_context", "cookbooks"))
29
- @cookbook_collection = Chef::CookbookCollection.new(Chef::CookbookLoader.new(@chef_repo_path))
28
+ cl = Chef::CookbookLoader.new(@chef_repo_path)
29
+ cl.load_cookbooks
30
+ @cookbook_collection = Chef::CookbookCollection.new(cl)
30
31
  @node = Chef::Node.new
31
- @node.find_file("run_context")
32
+ @node.run_list << "test" << "test::one" << "test::two"
32
33
  @events = Chef::EventDispatch::Dispatcher.new
33
34
  @run_context = Chef::RunContext.new(@node, @cookbook_collection, @events)
34
35
  end
@@ -53,12 +54,25 @@ describe Chef::RunContext do
53
54
  end
54
55
 
55
56
  it "should load all the recipes specified for this node" do
56
- @run_context.resource_collection[0].to_s.should == "cat[einstein]"
57
+ @run_context.resource_collection[0].to_s.should == "cat[einstein]"
57
58
  @run_context.resource_collection[1].to_s.should == "cat[loulou]"
58
59
  @run_context.resource_collection[2].to_s.should == "cat[birthday]"
59
60
  @run_context.resource_collection[3].to_s.should == "cat[peanut]"
60
61
  @run_context.resource_collection[4].to_s.should == "cat[fat peanut]"
61
62
  end
63
+
64
+ it "loads all the attribute files in the cookbook collection" do
65
+ @run_context.loaded_fully_qualified_attribute?("test", "george").should be_true
66
+ @node[:george].should == "washington"
67
+ end
68
+
69
+ it "registers attributes files as loaded so they won't be reloaded" do
70
+ # This test unfortunately is pretty tightly intertwined with the
71
+ # implementation of how nodes load attribute files, but is the only
72
+ # convenient way to test this behavior.
73
+ @node.should_not_receive(:from_file)
74
+ @node.include_attribute("test::george")
75
+ end
62
76
  end
63
77
 
64
78
  end
@@ -23,13 +23,6 @@ require 'spec_helper'
23
23
  require 'chef/version_class'
24
24
  require 'chef/version_constraint'
25
25
 
26
- # dep_selector/gecode on many platforms is currenly a bowel of hurt
27
- begin
28
- require 'chef/cookbook_version_selector'
29
- rescue LoadError
30
- STDERR.puts "\n*** dep_selector not installed. marking all unit tests 'pending' that have a transitive dependency on dep_selector. ***\n\n"
31
- end
32
-
33
26
  describe Chef::RunList do
34
27
  before(:each) do
35
28
  @run_list = Chef::RunList.new
@@ -255,13 +248,6 @@ describe Chef::RunList do
255
248
 
256
249
  end
257
250
 
258
- describe "from couchdb" do
259
- it "should load the role from couchdb" do
260
- Chef::Role.should_receive(:cdb_load).and_return(@role)
261
- @run_list.expand("_default", "couchdb")
262
- end
263
- end
264
-
265
251
  it "should return the list of expanded recipes" do
266
252
  expansion = @run_list.expand("_default")
267
253
  expansion.recipes[0].should == "one"
@@ -323,199 +309,4 @@ describe Chef::RunList do
323
309
 
324
310
  end
325
311
 
326
- describe "constrain" do
327
-
328
- pending "=> can't find 'dep_selector' gem...skipping Chef::CookbookVersionSelector related tests" do
329
-
330
- @fake_db = Object.new
331
-
332
- def cookbook_maker(name, version, deps)
333
- book = Chef::CookbookVersion.new(name, @fake_db)
334
- book.version = version
335
- deps.each { |dep_name, vc| book.metadata.depends(dep_name, vc) }
336
- book
337
- end
338
-
339
- def vc_maker(cookbook_name, version_constraint)
340
- vc = Chef::VersionConstraint.new(version_constraint)
341
- { :name => cookbook_name, :version_constraint => vc }
342
- end
343
-
344
- def assert_failure_unsatisfiable_item(run_list, all_cookbooks, constraints, expected_message)
345
- begin
346
- Chef::CookbookVersionSelector.constrain(all_cookbooks, constraints)
347
- fail "Should have raised a Chef::Exceptions::CookbookVersionSelection::UnsatisfiableRunListItem exception"
348
- rescue Chef::Exceptions::CookbookVersionSelection::UnsatisfiableRunListItem => urli
349
- urli.message.should include(expected_message)
350
- end
351
- end
352
-
353
- def assert_failure_invalid_items(run_list, all_cookbooks, constraints, expected_message)
354
- begin
355
- Chef::CookbookVersionSelector.constrain(all_cookbooks, constraints)
356
- fail "Should have raised a Chef::Exceptions::CookbookVersionSelection::InvalidRunListItems exception"
357
- rescue Chef::Exceptions::CookbookVersionSelection::InvalidRunListItems => irli
358
- irli.message.should include(expected_message)
359
- end
360
- end
361
-
362
- before(:each) do
363
- a1 = cookbook_maker("a", "1.0", [["c", "< 4.0"]])
364
- b1 = cookbook_maker("b", "1.0", [["c", "< 3.0"]])
365
-
366
- c2 = cookbook_maker("c", "2.0", [["d", "> 1.0"], ["f", nil]])
367
- c3 = cookbook_maker("c", "3.0", [["d", "> 2.0"], ["e", nil]])
368
-
369
- d1_1 = cookbook_maker("d", "1.1", [])
370
- d2_1 = cookbook_maker("d", "2.1", [])
371
- e1 = cookbook_maker("e", "1.0", [])
372
- f1 = cookbook_maker("f", "1.0", [])
373
- g1 = cookbook_maker("g", "1.0", [["d", "> 5.0"]])
374
-
375
- n1_1 = cookbook_maker("n", "1.1", [])
376
- n1_2 = cookbook_maker("n", "1.2", [])
377
- n1_10 = cookbook_maker("n", "1.10", [])
378
-
379
- depends_on_nosuch = cookbook_maker("depends_on_nosuch", "1.0", [["nosuch", nil]])
380
-
381
- @all_cookbooks = {
382
- "a" => [a1],
383
- "b" => [b1],
384
- "c" => [c2, c3],
385
- "d" => [d1_1, d2_1],
386
- "e" => [e1],
387
- "f" => [f1],
388
- "g" => [g1],
389
- "n" => [n1_1, n1_2, n1_10],
390
- "depends_on_nosuch" => [depends_on_nosuch]
391
- }
392
-
393
- $stderr.reopen DEV_NULL
394
- end
395
-
396
- after do
397
- $stderr.reopen STDERR
398
- end
399
-
400
- it "pulls in transitive dependencies" do
401
- constraints = [vc_maker("a", "~> 1.0")]
402
- cookbooks = Chef::CookbookVersionSelector.constrain(@all_cookbooks, constraints)
403
- %w(a c d e).each { |k| cookbooks.should have_key k }
404
- cookbooks.size.should == 4
405
- cookbooks["c"].version.should == "3.0.0"
406
- cookbooks["d"].version.should == "2.1.0"
407
- end
408
-
409
- it "should satisfy recipe-specific dependencies" do
410
- depends_on_recipe = cookbook_maker("depends_on_recipe", "1.0", [["f::recipe", "1.0"]])
411
- @all_cookbooks["depends_on_recipe"] = [depends_on_recipe]
412
- constraints = [vc_maker("depends_on_recipe", "= 1.0")]
413
- cookbooks = Chef::CookbookVersionSelector.constrain(@all_cookbooks, constraints)
414
- cookbooks["f"].version.should == "1.0.0"
415
- end
416
-
417
- it "properly sorts version triples, treating each term numerically" do
418
- constraints = [vc_maker("n", "> 1.2")]
419
- cookbooks = Chef::CookbookVersionSelector.constrain(@all_cookbooks, constraints)
420
- cookbooks.size.should == 1
421
- cookbooks["n"].version.should == "1.10.0"
422
- end
423
-
424
- it "should fail to find a solution when a run list item is constrained to a range that includes no cookbooks" do
425
- constraints = [vc_maker("d", "> 5.0")]
426
- assert_failure_invalid_items(@run_list, @all_cookbooks, constraints, "Run list contains invalid items: no versions match the constraints on cookbook d.")
427
- end
428
-
429
- it "should fail to find a solution when a run list item's dependency is constrained to a range that includes no cookbooks" do
430
- constraints = [vc_maker("g", nil)]
431
- assert_failure_unsatisfiable_item(@run_list, @all_cookbooks, constraints, "Unable to satisfy constraints on cookbook d due to run list item (g >= 0.0.0)")
432
- end
433
-
434
- it "selects 'd 2.1.0' given constraint 'd > 1.2.3'" do
435
- constraints = [vc_maker("d", "> 1.2.3")]
436
- cookbooks = Chef::CookbookVersionSelector.constrain(@all_cookbooks, constraints)
437
- cookbooks.size.should == 1
438
- cookbooks["d"].version.should == "2.1.0"
439
- end
440
-
441
- it "selects largest version when constraint allows multiple" do
442
- constraints = [vc_maker("d", "> 1.0")]
443
- cookbooks = Chef::CookbookVersionSelector.constrain(@all_cookbooks, constraints)
444
- cookbooks.size.should == 1
445
- cookbooks["d"].version.should == "2.1.0"
446
- end
447
-
448
- it "selects 'd 1.1.0' given constraint 'd ~> 1.0'" do
449
- constraints = [vc_maker("d", "~> 1.0")]
450
- cookbooks = Chef::CookbookVersionSelector.constrain(@all_cookbooks, constraints)
451
- cookbooks.size.should == 1
452
- cookbooks["d"].version.should == "1.1.0"
453
- end
454
-
455
- it "raises InvalidRunListItems for an unknown cookbook in the run list" do
456
- constraints = [vc_maker("nosuch", "1.0.0")]
457
- assert_failure_invalid_items(@run_list, @all_cookbooks, constraints, "Run list contains invalid items: no such cookbook nosuch.")
458
- end
459
-
460
- it "raises CookbookVersionConflict for an unknown cookbook in a cookbook's dependencies" do
461
- constraints = [vc_maker("depends_on_nosuch", "1.0.0")]
462
- assert_failure_unsatisfiable_item(@run_list, @all_cookbooks, constraints, "Unable to satisfy constraints on cookbook nosuch, which does not exist, due to run list item (depends_on_nosuch = 1.0.0). Run list items that may result in a constraint on nosuch: [(depends_on_nosuch = 1.0.0) -> (nosuch >= 0.0.0)]")
463
- end
464
-
465
- it "raises UnsatisfiableRunListItem for direct conflict" do
466
- constraints = [vc_maker("d", "= 1.1.0"), vc_maker("d", ">= 2.0")]
467
- assert_failure_unsatisfiable_item(@run_list, @all_cookbooks, constraints, "Unable to satisfy constraints on cookbook d due to run list item (d >= 2.0.0)")
468
- end
469
-
470
- describe "should solve regardless of constraint order" do
471
-
472
- it "raises CookbookVersionConflict a then b" do
473
- # Cookbooks a and b both have a dependency on c, but with
474
- # differing constraints.
475
- constraints = [vc_maker("a", "1.0"), vc_maker("b", "1.0")]
476
- cookbooks = Chef::CookbookVersionSelector.constrain(@all_cookbooks, constraints)
477
- cookbooks.size.should == 5
478
- %w(a b c d f).each { |k| cookbooks.should have_key k }
479
- cookbooks["a"].version.should == "1.0.0"
480
- cookbooks["b"].version.should == "1.0.0"
481
- cookbooks["c"].version.should == "2.0.0"
482
- cookbooks["d"].version.should == "2.1.0"
483
- end
484
-
485
- it "resolves b then a" do
486
- # See above comment for a then b. When b is pulled in first,
487
- # we should get a version of c that satifies the constraints
488
- # on the c dependency for both b and a.
489
- constraints = [vc_maker("b", "1.0"), vc_maker("a", "1.0")]
490
- cookbooks = Chef::CookbookVersionSelector.constrain(@all_cookbooks, constraints)
491
- cookbooks.size.should == 5
492
- %w(a b c d f).each { |k| cookbooks.should have_key k }
493
- cookbooks["a"].version.should == "1.0.0"
494
- cookbooks["b"].version.should == "1.0.0"
495
- cookbooks["c"].version.should == "2.0.0"
496
- cookbooks["d"].version.should == "2.1.0"
497
- end
498
-
499
- it "resolves a then d" do
500
- constraints = [vc_maker("a", "1.0"), vc_maker("d", "1.1")]
501
- cookbooks = Chef::CookbookVersionSelector.constrain(@all_cookbooks, constraints)
502
- cookbooks.size.should == 4
503
- %w(a c d f).each { |k| cookbooks.should have_key k }
504
- cookbooks["a"].version.should == "1.0.0"
505
- cookbooks["c"].version.should == "2.0.0"
506
- cookbooks["d"].version.should == "1.1.0"
507
- end
508
-
509
- it "resolves d then a" do
510
- constraints = [vc_maker("d", "1.1"), vc_maker("a", "1.0")]
511
- cookbooks = Chef::CookbookVersionSelector.constrain(@all_cookbooks, constraints)
512
- cookbooks.size.should == 4
513
- %w(a c d f).each { |k| cookbooks.should have_key k }
514
- cookbooks["a"].version.should == "1.0.0"
515
- cookbooks["c"].version.should == "2.0.0"
516
- cookbooks["d"].version.should == "1.1.0"
517
- end
518
- end
519
- end
520
- end
521
312
  end