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,220 @@
1
+ #
2
+ # Author:: John Keiser (<jkeiser@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
+ require 'chef/chef_fs/file_system/chef_server_root_dir'
21
+
22
+ describe Chef::ChefFS::FileSystem::DataBagsDir do
23
+ let(:root_dir) {
24
+ Chef::ChefFS::FileSystem::ChefServerRootDir.new('remote',
25
+ {
26
+ :chef_server_url => 'url',
27
+ :node_name => 'username',
28
+ :client_key => 'key'
29
+ }, 'everything')
30
+ }
31
+ let(:data_bags_dir) { root_dir.child('data_bags') }
32
+ let(:should_list_data_bags) do
33
+ @rest.should_receive(:get_rest).with('data').once.and_return(
34
+ {
35
+ "achild" => "http://opscode.com/achild",
36
+ "bchild" => "http://opscode.com/bchild"
37
+ })
38
+ end
39
+ before(:each) do
40
+ @rest = double("rest")
41
+ Chef::REST.stub(:new).with('url','username','key') { @rest }
42
+ end
43
+
44
+ it 'has / as parent' do
45
+ data_bags_dir.parent.should == root_dir
46
+ end
47
+ it 'is a directory' do
48
+ data_bags_dir.dir?.should be_true
49
+ end
50
+ it 'exists' do
51
+ data_bags_dir.exists?.should be_true
52
+ end
53
+ it 'has name data_bags' do
54
+ data_bags_dir.name.should == 'data_bags'
55
+ end
56
+ it 'has path /data_bags' do
57
+ data_bags_dir.path.should == '/data_bags'
58
+ end
59
+ it 'has path_for_printing remote/data_bags' do
60
+ data_bags_dir.path_for_printing.should == 'remote/data_bags'
61
+ end
62
+ it 'has correct children' do
63
+ should_list_data_bags
64
+ data_bags_dir.children.map { |child| child.name }.should =~ %w(achild bchild)
65
+ end
66
+ it 'can have directories as children' do
67
+ data_bags_dir.can_have_child?('blah', true).should be_true
68
+ end
69
+ it 'cannot have files as children' do
70
+ data_bags_dir.can_have_child?('blah', false).should be_false
71
+ end
72
+
73
+ shared_examples_for 'a data bag item' do
74
+ it 'has data bag as parent' do
75
+ data_bag_item.parent.should == data_bag_dir
76
+ end
77
+ it 'is not a directory' do
78
+ data_bag_item.dir?.should be_false
79
+ end
80
+ it 'exists' do
81
+ should_list_data_bag_items
82
+ data_bag_item.exists?.should be_true
83
+ end
84
+ it 'has correct name' do
85
+ data_bag_item.name.should == data_bag_item_name
86
+ end
87
+ it 'has correct path' do
88
+ data_bag_item.path.should == "/data_bags/#{data_bag_dir_name}/#{data_bag_item_name}"
89
+ end
90
+ it 'has correct path_for_printing' do
91
+ data_bag_item.path_for_printing.should == "remote/data_bags/#{data_bag_dir_name}/#{data_bag_item_name}"
92
+ end
93
+ it 'reads correctly' do
94
+ @rest.should_receive(:get_rest).with("data/#{data_bag_dir_name}/#{data_bag_item_short_name}").once.and_return({
95
+ 'a' => 'b'
96
+ })
97
+ data_bag_item.read.should == '{
98
+ "a": "b"
99
+ }'
100
+ end
101
+ end
102
+
103
+ shared_examples_for 'a data bag' do
104
+ let(:should_list_data_bag_items) do
105
+ @rest.should_receive(:get_rest).with("data/#{data_bag_dir_name}").once.and_return(
106
+ {
107
+ "aitem" => "http://opscode.com/achild",
108
+ "bitem" => "http://opscode.com/bchild"
109
+ })
110
+ end
111
+ it 'has /data as a parent' do
112
+ data_bag_dir.parent.should == data_bags_dir
113
+ end
114
+ it 'is a directory' do
115
+ should_list_data_bags
116
+ data_bag_dir.dir?.should be_true
117
+ end
118
+ it 'exists' do
119
+ should_list_data_bags
120
+ data_bag_dir.exists?.should be_true
121
+ end
122
+ it 'has correct name' do
123
+ data_bag_dir.name.should == data_bag_dir_name
124
+ end
125
+ it 'has correct path' do
126
+ data_bag_dir.path.should == "/data_bags/#{data_bag_dir_name}"
127
+ end
128
+ it 'has correct path_for_printing' do
129
+ data_bag_dir.path_for_printing.should == "remote/data_bags/#{data_bag_dir_name}"
130
+ end
131
+ it 'has correct children' do
132
+ should_list_data_bag_items
133
+ data_bag_dir.children.map { |child| child.name }.should =~ %w(aitem.json bitem.json)
134
+ end
135
+ it 'can have json files as children' do
136
+ data_bag_dir.can_have_child?('blah.json', false).should be_true
137
+ end
138
+ it 'cannot have non-json files as children' do
139
+ data_bag_dir.can_have_child?('blah', false).should be_false
140
+ end
141
+ it 'cannot have directories as children' do
142
+ data_bag_dir.can_have_child?('blah', true).should be_false
143
+ data_bag_dir.can_have_child?('blah.json', true).should be_false
144
+ end
145
+ context 'aitem from data_bag.children' do
146
+ let(:data_bag_item) do
147
+ should_list_data_bag_items
148
+ data_bag_dir.children.select { |child| child.name == 'aitem.json' }.first
149
+ end
150
+ let(:data_bag_item_short_name) { 'aitem' }
151
+ let(:data_bag_item_name) { 'aitem.json' }
152
+ it_behaves_like 'a data bag item'
153
+ end
154
+ context 'data_bag.child(aitem)' do
155
+ let(:data_bag_item) { data_bag_dir.child('aitem.json') }
156
+ let(:data_bag_item_short_name) { 'aitem' }
157
+ let(:data_bag_item_name) { 'aitem.json' }
158
+ it_behaves_like 'a data bag item'
159
+ end
160
+ context 'nonexistent child()' do
161
+ let(:nonexistent_child) { data_bag_dir.child('blah.json') }
162
+ it 'has correct parent, name, path and path_for_printing' do
163
+ nonexistent_child.parent.should == data_bag_dir
164
+ nonexistent_child.name.should == "blah.json"
165
+ nonexistent_child.path.should == "/data_bags/#{data_bag_dir_name}/blah.json"
166
+ nonexistent_child.path_for_printing.should == "remote/data_bags/#{data_bag_dir_name}/blah.json"
167
+ end
168
+ it 'does not exist' do
169
+ should_list_data_bag_items
170
+ nonexistent_child.exists?.should be_false
171
+ end
172
+ it 'is not a directory' do
173
+ nonexistent_child.dir?.should be_false
174
+ end
175
+ it 'read returns NotFoundError' do
176
+ @rest.should_receive(:get_rest).with("data/#{data_bag_dir_name}/blah").once.and_raise(Net::HTTPServerException.new(nil,Net::HTTPResponse.new(nil,'404',nil)))
177
+ expect { nonexistent_child.read }.to raise_error(Chef::ChefFS::FileSystem::NotFoundError)
178
+ end
179
+ end
180
+ end
181
+
182
+ context 'achild from data_bags.children' do
183
+ let(:data_bag_dir) do
184
+ should_list_data_bags
185
+ data_bags_dir.children.select { |child| child.name == 'achild' }.first
186
+ end
187
+ let(:data_bag_dir_name) { 'achild' }
188
+ it_behaves_like 'a data bag'
189
+ end
190
+
191
+ context 'data_bags.child(achild)' do
192
+ let(:data_bag_dir) do
193
+ data_bags_dir.child('achild')
194
+ end
195
+ let(:data_bag_dir_name) { 'achild' }
196
+ it_behaves_like 'a data bag'
197
+ end
198
+
199
+ context 'nonexistent child()' do
200
+ let(:nonexistent_child) { data_bags_dir.child('blah') }
201
+ it 'has correct parent, name, path and path_for_printing' do
202
+ nonexistent_child.parent.should == data_bags_dir
203
+ nonexistent_child.name.should == "blah"
204
+ nonexistent_child.path.should == "/data_bags/blah"
205
+ nonexistent_child.path_for_printing.should == "remote/data_bags/blah"
206
+ end
207
+ it 'does not exist' do
208
+ should_list_data_bags
209
+ nonexistent_child.exists?.should be_false
210
+ end
211
+ it 'is not a directory' do
212
+ should_list_data_bags
213
+ nonexistent_child.dir?.should be_false
214
+ end
215
+ it 'read returns NotFoundError' do
216
+ expect { nonexistent_child.read }.to raise_error(Chef::ChefFS::FileSystem::NotFoundError)
217
+ end
218
+ end
219
+
220
+ end
@@ -0,0 +1,136 @@
1
+ #
2
+ # Author:: John Keiser (<jkeiser@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
+ require 'support/shared/unit/file_system_support'
21
+ require 'chef/chef_fs/file_system'
22
+ require 'chef/chef_fs/file_pattern'
23
+
24
+ describe Chef::ChefFS::FileSystem do
25
+ include FileSystemSupport
26
+
27
+ context 'with empty filesystem' do
28
+ let(:fs) { memory_fs('', {}) }
29
+
30
+ context 'list' do
31
+ it '/' do
32
+ list_should_yield_paths(fs, '/', '/')
33
+ end
34
+ it '/a' do
35
+ list_should_yield_paths(fs, '/a', '/a')
36
+ end
37
+ it '/a/b' do
38
+ list_should_yield_paths(fs, '/a/b')
39
+ end
40
+ it '/*' do
41
+ list_should_yield_paths(fs, '/*', '/')
42
+ end
43
+ end
44
+
45
+ context 'resolve_path' do
46
+ it '/' do
47
+ Chef::ChefFS::FileSystem.resolve_path(fs, '/').path.should == '/'
48
+ end
49
+ it 'nonexistent /a' do
50
+ Chef::ChefFS::FileSystem.resolve_path(fs, '/a').path.should == '/a'
51
+ end
52
+ it 'nonexistent /a/b' do
53
+ Chef::ChefFS::FileSystem.resolve_path(fs, '/a/b').path.should == '/a/b'
54
+ end
55
+ end
56
+ end
57
+
58
+ context 'with a populated filesystem' do
59
+ let(:fs) {
60
+ memory_fs('', {
61
+ :a => {
62
+ :aa => {
63
+ :c => '',
64
+ :zz => ''
65
+ },
66
+ :ab => {
67
+ :c => '',
68
+ }
69
+ },
70
+ :x => ''
71
+ })
72
+ }
73
+ context 'list' do
74
+ it '/**' do
75
+ list_should_yield_paths(fs, '/**', '/', '/a', '/x', '/a/aa', '/a/aa/c', '/a/aa/zz', '/a/ab', '/a/ab/c')
76
+ end
77
+ it '/' do
78
+ list_should_yield_paths(fs, '/', '/')
79
+ end
80
+ it '/*' do
81
+ list_should_yield_paths(fs, '/*', '/', '/a', '/x')
82
+ end
83
+ it '/*/*' do
84
+ list_should_yield_paths(fs, '/*/*', '/a/aa', '/a/ab')
85
+ end
86
+ it '/*/*/*' do
87
+ list_should_yield_paths(fs, '/*/*/*', '/a/aa/c', '/a/aa/zz', '/a/ab/c')
88
+ end
89
+ it '/*/*/?' do
90
+ list_should_yield_paths(fs, '/*/*/?', '/a/aa/c', '/a/ab/c')
91
+ end
92
+ it '/a/*/c' do
93
+ list_should_yield_paths(fs, '/a/*/c', '/a/aa/c', '/a/ab/c')
94
+ end
95
+ it '/**b/c' do
96
+ list_should_yield_paths(fs, '/**b/c', '/a/ab/c')
97
+ end
98
+ it '/a/ab/c' do
99
+ no_blocking_calls_allowed
100
+ list_should_yield_paths(fs, '/a/ab/c', '/a/ab/c')
101
+ end
102
+ it 'nonexistent /a/ab/blah' do
103
+ no_blocking_calls_allowed
104
+ list_should_yield_paths(fs, '/a/ab/blah', '/a/ab/blah')
105
+ end
106
+ it 'nonexistent /a/ab/blah/bjork' do
107
+ no_blocking_calls_allowed
108
+ list_should_yield_paths(fs, '/a/ab/blah/bjork')
109
+ end
110
+ end
111
+
112
+ context 'resolve_path' do
113
+ before(:each) do
114
+ no_blocking_calls_allowed
115
+ end
116
+ it 'resolves /' do
117
+ Chef::ChefFS::FileSystem.resolve_path(fs, '/').path.should == '/'
118
+ end
119
+ it 'resolves /x' do
120
+ Chef::ChefFS::FileSystem.resolve_path(fs, '/x').path.should == '/x'
121
+ end
122
+ it 'resolves /a' do
123
+ Chef::ChefFS::FileSystem.resolve_path(fs, '/a').path.should == '/a'
124
+ end
125
+ it 'resolves /a/aa' do
126
+ Chef::ChefFS::FileSystem.resolve_path(fs, '/a/aa').path.should == '/a/aa'
127
+ end
128
+ it 'resolves /a/aa/zz' do
129
+ Chef::ChefFS::FileSystem.resolve_path(fs, '/a/aa/zz').path.should == '/a/aa/zz'
130
+ end
131
+ it 'resolves nonexistent /y/x/w' do
132
+ Chef::ChefFS::FileSystem.resolve_path(fs, '/y/x/w').path.should == '/y/x/w'
133
+ end
134
+ end
135
+ end
136
+ end
@@ -35,17 +35,15 @@ shared_examples_for Chef::Client do
35
35
  ohai_data = { :fqdn => @fqdn,
36
36
  :hostname => @hostname,
37
37
  :platform => 'example-platform',
38
- :platform_version => 'example-platform',
38
+ :platform_version => 'example-platform-1.0',
39
39
  :data => {} }
40
40
  ohai_data.stub!(:all_plugins).and_return(true)
41
- ohai_data.stub!(:data).and_return(ohai_data[:data])
41
+ ohai_data.stub!(:data).and_return(ohai_data)
42
42
  Ohai::System.stub!(:new).and_return(ohai_data)
43
43
 
44
- @node = Chef::Node.new(@hostname)
44
+ @node = Chef::Node.new
45
45
  @node.name(@fqdn)
46
46
  @node.chef_environment("_default")
47
- @node[:platform] = "example-platform"
48
- @node[:platform_version] = "example-platform-1.0"
49
47
 
50
48
  @client = Chef::Client.new
51
49
  @client.node = @node
@@ -75,6 +73,111 @@ shared_examples_for Chef::Client do
75
73
  end
76
74
  end
77
75
 
76
+ describe "configuring output formatters" do
77
+ before do
78
+ @original_config = Chef::Config.configuration
79
+ end
80
+
81
+ after do
82
+ Chef::Config.configuration.replace(@original_config)
83
+ end
84
+ context "when no formatter has been configured" do
85
+ before do
86
+ Chef::Config.formatters.clear
87
+ @client = Chef::Client.new
88
+ end
89
+
90
+ context "and STDOUT is a TTY" do
91
+ before do
92
+ Chef::Config[:force_formatter] = false
93
+ Chef::Config[:force_logger] = false
94
+ STDOUT.stub!(:tty?).and_return(true)
95
+ end
96
+
97
+ it "configures the :doc formatter" do
98
+ @client.formatters_for_run.should == [[:doc]]
99
+ end
100
+
101
+ context "and force_logger is set" do
102
+ before do
103
+ Chef::Config[:force_logger] = true
104
+ end
105
+
106
+ it "configures the :null formatter" do
107
+ Chef::Config[:force_logger].should be_true
108
+ @client.formatters_for_run.should == [[:null]]
109
+ end
110
+
111
+ end
112
+
113
+ end
114
+
115
+ context "and STDOUT is not a TTY" do
116
+ before do
117
+ Chef::Config[:force_formatter] = false
118
+ STDOUT.stub!(:tty?).and_return(false)
119
+ end
120
+
121
+ it "configures the :null formatter" do
122
+ @client.formatters_for_run.should == [[:null]]
123
+ end
124
+
125
+ context "and force_formatter is set" do
126
+ before do
127
+ Chef::Config[:force_formatter] = true
128
+ end
129
+ it "it configures the :doc formatter" do
130
+ @client.formatters_for_run.should == [[:doc]]
131
+ end
132
+ end
133
+ end
134
+
135
+ end
136
+
137
+ context "when a formatter is configured" do
138
+ context "with no output path" do
139
+ before do
140
+ Chef::Config.formatters.clear
141
+ @client = Chef::Client.new
142
+ Chef::Config.add_formatter(:min)
143
+ end
144
+
145
+ it "does not configure a default formatter" do
146
+ @client.formatters_for_run.should == [[:min, nil]]
147
+ end
148
+
149
+ it "configures the formatter for STDOUT/STDERR" do
150
+ configured_formatters = @client.configure_formatters
151
+ min_formatter = configured_formatters[0]
152
+ min_formatter.output.out.should == STDOUT
153
+ min_formatter.output.err.should == STDERR
154
+ end
155
+ end
156
+
157
+ context "with an output path" do
158
+ before do
159
+ Chef::Config.formatters.clear
160
+ @client = Chef::Client.new
161
+ @tmpout = Tempfile.open("rspec-for-client-formatter-selection-#{Process.pid}")
162
+ Chef::Config.add_formatter(:min, @tmpout.path)
163
+ end
164
+
165
+ after do
166
+ @tmpout.close unless @tmpout.closed?
167
+ @tmpout.unlink
168
+ end
169
+
170
+ it "configures the formatter for the file path" do
171
+ configured_formatters = @client.configure_formatters
172
+ min_formatter = configured_formatters[0]
173
+ min_formatter.output.out.path.should == @tmpout.path
174
+ min_formatter.output.err.path.should == @tmpout.path
175
+ end
176
+ end
177
+
178
+ end
179
+ end
180
+
78
181
  describe "run" do
79
182
 
80
183
  it "should identify the node and run ohai, then register the client" do
@@ -89,10 +192,8 @@ shared_examples_for Chef::Client do
89
192
  File.should_receive(:exists?).with(Chef::Config[:client_key]).exactly(1).times.and_return(false)
90
193
 
91
194
  # Client.register will register with the validation client name.
92
- Chef::REST.should_receive(:new).with(Chef::Config[:client_url], Chef::Config[:validation_client_name], Chef::Config[:validation_key]).exactly(1).and_return(mock_chef_rest_for_client)
93
- mock_chef_rest_for_client.should_receive(:register).with(@fqdn, Chef::Config[:client_key]).exactly(1).and_return(true)
195
+ Chef::ApiClient::Registration.any_instance.should_receive(:run)
94
196
  # Client.register will then turn around create another
95
-
96
197
  # Chef::REST object, this time with the client key it got from the
97
198
  # previous step.
98
199
  Chef::REST.should_receive(:new).with(Chef::Config[:chef_server_url], @fqdn, Chef::Config[:client_key]).exactly(1).and_return(mock_chef_rest_for_node)
@@ -124,6 +225,9 @@ shared_examples_for Chef::Client do
124
225
  Chef::REST.should_receive(:new).with(Chef::Config[:chef_server_url]).and_return(mock_chef_rest_for_node_save)
125
226
  mock_chef_rest_for_node_save.should_receive(:put_rest).with("nodes/#{@fqdn}", @node).and_return(true)
126
227
 
228
+ Chef::RunLock.any_instance.should_receive(:acquire)
229
+ Chef::RunLock.any_instance.should_receive(:release)
230
+
127
231
  # Post conditions: check that node has been filled in correctly
128
232
  @client.should_receive(:run_started)
129
233
  @client.should_receive(:run_completed_successfully)
@@ -138,7 +242,6 @@ shared_examples_for Chef::Client do
138
242
  res.replace(string)
139
243
  end
140
244
  pipe_sim.should_receive(:gets).and_return(res)
141
- Chef::CouchDB.should_receive(:new).and_return(nil)
142
245
  IO.should_receive(:pipe).and_return([pipe_sim, pipe_sim])
143
246
  IO.should_receive(:select).and_return(true)
144
247
  end
@@ -150,7 +253,7 @@ shared_examples_for Chef::Client do
150
253
  block.call
151
254
  end
152
255
  end
153
-
256
+
154
257
  # This is what we're testing.
155
258
  @client.run
156
259
 
@@ -159,7 +262,7 @@ shared_examples_for Chef::Client do
159
262
  @node.automatic_attrs[:platform_version].should == "example-platform-1.0"
160
263
  end
161
264
  end
162
-
265
+
163
266
  describe "when notifying other objects of the status of the chef run" do
164
267
  before do
165
268
  Chef::Client.clear_notifications
@@ -232,13 +335,75 @@ shared_examples_for Chef::Client do
232
335
  end
233
336
  end
234
337
 
338
+ describe "windows_admin_check" do
339
+ before do
340
+ @client = Chef::Client.new
341
+ end
342
+
343
+ context "platform is not windows" do
344
+ before do
345
+ Chef::Platform.stub(:windows?).and_return(false)
346
+ end
347
+
348
+ it "shouldn't be called" do
349
+ @client.should_not_receive(:has_admin_privileges?)
350
+ @client.do_windows_admin_check
351
+ end
352
+ end
353
+
354
+ context "platform is windows" do
355
+ before do
356
+ Chef::Platform.stub(:windows?).and_return(true)
357
+ end
358
+
359
+ it "should be called" do
360
+ @client.should_receive(:has_admin_privileges?)
361
+ @client.do_windows_admin_check
362
+ end
363
+
364
+ context "admin privileges exist" do
365
+ before do
366
+ @client.should_receive(:has_admin_privileges?).and_return(true)
367
+ end
368
+
369
+ it "should not log a warning message" do
370
+ Chef::Log.should_not_receive(:warn)
371
+ @client.do_windows_admin_check
372
+ end
373
+
374
+ context "fatal admin check is configured" do
375
+ it "should not raise an exception" do
376
+ @client.do_windows_admin_check.should_not raise_error(Chef::Exceptions::WindowsNotAdmin)
377
+ end
378
+ end
379
+ end
380
+
381
+ context "admin privileges doesn't exist" do
382
+ before do
383
+ @client.should_receive(:has_admin_privileges?).and_return(false)
384
+ end
385
+
386
+ it "should log a warning message" do
387
+ Chef::Log.should_receive(:warn)
388
+ @client.do_windows_admin_check
389
+ end
390
+
391
+ context "fatal admin check is configured" do
392
+ it "should raise an exception" do
393
+ @client.do_windows_admin_check.should_not raise_error(Chef::Exceptions::WindowsNotAdmin)
394
+ end
395
+ end
396
+ end
397
+ end
398
+ end
399
+
235
400
  describe "when a run list override is provided" do
236
401
  before do
237
- @node = Chef::Node.new(@hostname)
402
+ @node = Chef::Node.new
238
403
  @node.name(@fqdn)
239
404
  @node.chef_environment("_default")
240
- @node[:platform] = "example-platform"
241
- @node[:platform_version] = "example-platform-1.0"
405
+ @node.automatic_attrs[:platform] = "example-platform"
406
+ @node.automatic_attrs[:platform_version] = "example-platform-1.0"
242
407
  end
243
408
 
244
409
  it "should permit spaces in overriding run list" do
@@ -264,7 +429,7 @@ shared_examples_for Chef::Client do
264
429
  @node.should_receive(:save).and_return(nil)
265
430
 
266
431
  @client.build_node
267
-
432
+
268
433
  @node[:roles].should_not be_nil
269
434
  @node[:roles].should eql(['test_role'])
270
435
  @node[:recipes].should eql(['cookbook1'])
@@ -283,8 +448,15 @@ describe Chef::Client do
283
448
  end
284
449
 
285
450
  describe "Chef::Client Forked" do
286
- it_behaves_like Chef::Client
287
451
  before do
452
+ @original_config = Chef::Config.configuration
288
453
  Chef::Config[:client_fork] = true
289
454
  end
455
+
456
+ after do
457
+ Chef::Config.configuration.replace(@original_config)
458
+ end
459
+
460
+ it_behaves_like Chef::Client
461
+
290
462
  end