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
@@ -24,41 +24,106 @@
24
24
  require 'etc'
25
25
 
26
26
  shared_context "setup correct permissions" do
27
- context "on unix", :unix_only do
28
- context "with root", :requires_root do
29
- before :each do
30
- File.chown(Etc.getpwnam('nobody').uid, 1337, path)
31
- File.chmod(0776, path)
32
- end
33
- end
34
27
 
35
- context "without root", :requires_unprivileged_user do
36
- before :each do
37
- File.chmod(0776, path)
38
- end
39
- end
28
+ # I could not get this to work with :requires_unprivileged_user for whatever
29
+ # reason. The setup when running as root is the same as non-root, except we
30
+ # also do a chown, so this sets up correct context for either case.
31
+ before :each, :unix_only do
32
+ File.chmod(0776, path)
33
+ now = Time.now.to_i
34
+ File.utime(now - 9000, now - 9000, path)
35
+ end
36
+
37
+ # Root only context.
38
+ before :each, :unix_only, :requires_root do
39
+ File.chown(Etc.getpwnam('nobody').uid, 1337, path)
40
40
  end
41
41
 
42
42
  # FIXME: windows
43
43
  end
44
44
 
45
45
  shared_context "setup broken permissions" do
46
- context "on unix", :unix_only do
47
- context "with root", :requires_root do
48
- before :each do
49
- File.chown(0, 0, path)
50
- File.chmod(0644, path)
51
- end
46
+
47
+ before :each, :unix_only do
48
+ File.chmod(0644, path)
49
+ end
50
+
51
+ before :each, :unix_only, :requires_root do
52
+ File.chown(0, 0, path)
53
+ end
54
+
55
+ # FIXME: windows
56
+ end
57
+
58
+ shared_context "use Windows permissions", :windows_only do
59
+ if windows?
60
+ SID ||= Chef::ReservedNames::Win32::Security::SID
61
+ ACE ||= Chef::ReservedNames::Win32::Security::ACE
62
+ end
63
+
64
+ def get_security_descriptor(path)
65
+ Chef::ReservedNames::Win32::Security.get_named_security_info(path)
66
+ end
67
+
68
+ def explicit_aces
69
+ descriptor.dacl.select { |ace| ace.explicit? }
70
+ end
71
+
72
+ def extract_ace_properties(aces)
73
+ hashes = []
74
+ aces.each do |ace|
75
+ hashes << { :mask => ace.mask, :type => ace.type, :flags => ace.flags }
52
76
  end
53
-
54
- context "without root", :requires_unprivileged_user do
55
- before :each do
56
- File.chmod(0644, path)
57
- end
77
+ hashes
78
+ end
79
+
80
+ # Standard expected rights
81
+ let(:expected_read_perms) do
82
+ {
83
+ :generic => Chef::ReservedNames::Win32::API::Security::GENERIC_READ,
84
+ :specific => Chef::ReservedNames::Win32::API::Security::FILE_GENERIC_READ,
85
+ }
86
+ end
87
+
88
+ let(:expected_read_execute_perms) do
89
+ {
90
+ :generic => Chef::ReservedNames::Win32::API::Security::GENERIC_READ | Chef::ReservedNames::Win32::API::Security::GENERIC_EXECUTE,
91
+ :specific => Chef::ReservedNames::Win32::API::Security::FILE_GENERIC_READ | Chef::ReservedNames::Win32::API::Security::FILE_GENERIC_EXECUTE
92
+ }
93
+ end
94
+
95
+ let(:expected_write_perms) do
96
+ {
97
+ :generic => Chef::ReservedNames::Win32::API::Security::GENERIC_WRITE,
98
+ :specific => Chef::ReservedNames::Win32::API::Security::FILE_GENERIC_WRITE
99
+ }
100
+ end
101
+
102
+ let(:expected_modify_perms) do
103
+ {
104
+ :generic => Chef::ReservedNames::Win32::API::Security::GENERIC_READ | Chef::ReservedNames::Win32::API::Security::GENERIC_WRITE | Chef::ReservedNames::Win32::API::Security::GENERIC_EXECUTE | Chef::ReservedNames::Win32::API::Security::DELETE,
105
+ :specific => Chef::ReservedNames::Win32::API::Security::FILE_GENERIC_READ | Chef::ReservedNames::Win32::API::Security::FILE_GENERIC_WRITE | Chef::ReservedNames::Win32::API::Security::FILE_GENERIC_EXECUTE | Chef::ReservedNames::Win32::API::Security::DELETE
106
+ }
107
+ end
108
+
109
+ let(:expected_full_control_perms) do
110
+ {
111
+ :generic => Chef::ReservedNames::Win32::API::Security::GENERIC_ALL,
112
+ :specific => Chef::ReservedNames::Win32::API::Security::FILE_ALL_ACCESS
113
+ }
114
+ end
115
+
116
+ RSpec::Matchers.define :have_expected_properties do |mask, type, flags|
117
+ match do |ace|
118
+ ace.mask == mask
119
+ ace.type == type
120
+ ace.flags == flags
58
121
  end
59
122
  end
60
123
 
61
- # FIXME: windows
124
+ def descriptor
125
+ get_security_descriptor(path)
126
+ end
62
127
  end
63
128
 
64
129
  shared_examples_for "a securable resource" do
@@ -71,107 +136,77 @@ shared_examples_for "a securable resource" do
71
136
  pending "should set an owner (Rerun specs under root)", :requires_unprivileged_user => true
72
137
  pending "should set a group (Rerun specs under root)", :requires_unprivileged_user => true
73
138
 
74
- it "should set an owner", :requires_root do
75
- resource.owner expected_user_name
76
- resource.run_action(:create)
77
- File.lstat(path).uid.should == expected_uid
78
- end
139
+ describe "when setting the owner", :requires_root do
140
+ before do
141
+ resource.owner expected_user_name
142
+ resource.run_action(:create)
143
+ end
79
144
 
80
- it "should set a group", :requires_root do
81
- resource.group desired_gid
82
- resource.run_action(:create)
83
- File.lstat(path).gid.should == expected_gid
84
- end
145
+ it "should set an owner" do
146
+ File.lstat(path).uid.should == expected_uid
147
+ end
85
148
 
86
- it "should set permissions in string form as an octal number" do
87
- mode_string = '776'
88
- resource.mode mode_string
89
- resource.run_action(:create)
90
- pending('Linux does not support lchmod', :if => resource.instance_of?(Chef::Resource::Link) && !os_x? && !freebsd?) do
91
- (File.lstat(path).mode & 007777).should == (mode_string.oct & 007777)
149
+ it "is marked as updated only if changes are made" do
150
+ resource.updated_by_last_action?.should == expect_updated?
92
151
  end
152
+
93
153
  end
94
154
 
95
- it "should set permissions in numeric form as a ruby-interpreted octal" do
96
- mode_integer = 0776
97
- resource.mode mode_integer
98
- resource.run_action(:create)
99
- pending('Linux does not support lchmod', :if => resource.instance_of?(Chef::Resource::Link) && !os_x? && !freebsd?) do
100
- (File.lstat(path).mode & 007777).should == (mode_integer & 007777)
155
+ describe "when setting the group", :requires_root do
156
+ before do
157
+ resource.group desired_gid
158
+ resource.run_action(:create)
101
159
  end
102
- end
103
- end
104
160
 
105
- context "on Windows", :windows_only do
161
+ it "should set a group" do
162
+ File.lstat(path).gid.should == expected_gid
163
+ end
106
164
 
107
- if windows?
108
- SID = Chef::ReservedNames::Win32::Security::SID
109
- ACE = Chef::ReservedNames::Win32::Security::ACE
110
- end
165
+ it "is marked as updated only if changes are made" do
166
+ resource.updated_by_last_action?.should == expect_updated?
167
+ end
111
168
 
112
- def get_security_descriptor(path)
113
- Chef::ReservedNames::Win32::Security.get_named_security_info(path)
114
169
  end
115
170
 
116
- def explicit_aces
117
- descriptor.dacl.select { |ace| ace.explicit? }
118
- end
171
+ describe "when setting the permissions from octal given as a String" do
172
+ before do
173
+ @mode_string = '776'
174
+ resource.mode @mode_string
175
+ resource.run_action(:create)
176
+ end
119
177
 
120
- def extract_ace_properties(aces)
121
- hashes = []
122
- aces.each do |ace|
123
- hashes << { :mask => ace.mask, :type => ace.type, :flags => ace.flags }
178
+ it "should set permissions as specified" do
179
+ pending('Linux does not support lchmod', :if => resource.instance_of?(Chef::Resource::Link) && !os_x? && !freebsd?) do
180
+ (File.lstat(path).mode & 007777).should == (@mode_string.oct & 007777)
124
181
  end
125
- hashes
126
- end
127
-
128
- # Standard expected rights
129
- let(:expected_read_perms) do
130
- {
131
- :generic => Chef::ReservedNames::Win32::API::Security::GENERIC_READ,
132
- :specific => Chef::ReservedNames::Win32::API::Security::FILE_GENERIC_READ,
133
- }
134
- end
135
-
136
- let(:expected_read_execute_perms) do
137
- {
138
- :generic => Chef::ReservedNames::Win32::API::Security::GENERIC_READ | Chef::ReservedNames::Win32::API::Security::GENERIC_EXECUTE,
139
- :specific => Chef::ReservedNames::Win32::API::Security::FILE_GENERIC_READ | Chef::ReservedNames::Win32::API::Security::FILE_GENERIC_EXECUTE
140
- }
141
- end
182
+ end
142
183
 
143
- let(:expected_write_perms) do
144
- {
145
- :generic => Chef::ReservedNames::Win32::API::Security::GENERIC_WRITE,
146
- :specific => Chef::ReservedNames::Win32::API::Security::FILE_GENERIC_WRITE
147
- }
184
+ it "is marked as updated only if changes are made" do
185
+ resource.updated_by_last_action?.should == expect_updated?
186
+ end
148
187
  end
149
188
 
150
- let(:expected_modify_perms) do
151
- {
152
- :generic => Chef::ReservedNames::Win32::API::Security::GENERIC_READ | Chef::ReservedNames::Win32::API::Security::GENERIC_WRITE | Chef::ReservedNames::Win32::API::Security::GENERIC_EXECUTE | Chef::ReservedNames::Win32::API::Security::DELETE,
153
- :specific => Chef::ReservedNames::Win32::API::Security::FILE_GENERIC_READ | Chef::ReservedNames::Win32::API::Security::FILE_GENERIC_WRITE | Chef::ReservedNames::Win32::API::Security::FILE_GENERIC_EXECUTE | Chef::ReservedNames::Win32::API::Security::DELETE
154
- }
155
- end
189
+ describe "when setting permissions from a literal octal Integer" do
190
+ before do
191
+ @mode_integer = 0776
192
+ resource.mode @mode_integer
193
+ resource.run_action(:create)
194
+ end
156
195
 
157
- let(:expected_full_control_perms) do
158
- {
159
- :generic => Chef::ReservedNames::Win32::API::Security::GENERIC_ALL,
160
- :specific => Chef::ReservedNames::Win32::API::Security::FILE_ALL_ACCESS
161
- }
162
- end
196
+ it "should set permissions in numeric form as a ruby-interpreted octal" do
197
+ pending('Linux does not support lchmod', :if => resource.instance_of?(Chef::Resource::Link) && !os_x? && !freebsd?) do
198
+ (File.lstat(path).mode & 007777).should == (@mode_integer & 007777)
199
+ end
200
+ end
163
201
 
164
- RSpec::Matchers.define :have_expected_properties do |mask, type, flags|
165
- match do |ace|
166
- ace.mask == mask
167
- ace.type == type
168
- ace.flags == flags
202
+ it "is marked as updated only if changes are made" do
203
+ resource.updated_by_last_action?.should == expect_updated?
169
204
  end
170
205
  end
206
+ end
171
207
 
172
- def descriptor
173
- get_security_descriptor(path)
174
- end
208
+ context "on Windows", :windows_only do
209
+ include_context "use Windows permissions"
175
210
 
176
211
  before(:each) do
177
212
  resource.run_action(:delete)
@@ -321,7 +356,7 @@ shared_examples_for "a securable resource" do
321
356
 
322
357
  context "with a mode attribute" do
323
358
  if windows?
324
- Security = Chef::ReservedNames::Win32::API::Security
359
+ Security ||= Chef::ReservedNames::Win32::API::Security
325
360
  end
326
361
 
327
362
  it "respects mode in string form as an octal number" do
@@ -0,0 +1,375 @@
1
+
2
+ shared_examples_for "a securable resource with reporting" do
3
+
4
+ let(:current_resource) do
5
+ provider = resource.provider_for_action(resource.action)
6
+ provider.load_current_resource
7
+ provider.current_resource
8
+ end
9
+
10
+ # Default mode varies based on implementation. Providers that use a tempfile
11
+ # will default to 0600. Providers that use File.open will default to 0666 -
12
+ # umask
13
+ # let(:default_mode) { ((0100666 - File.umask) & 07777).to_s(8) }
14
+
15
+ describe "reading file security metadata for reporting on unix", :unix_only => true do
16
+ context "when the target file doesn't exist" do
17
+ before do
18
+ resource.action(:create)
19
+ end
20
+
21
+ it "has empty values for file metadata in 'current_resource'" do
22
+ current_resource.owner.should be_nil
23
+ current_resource.group.should be_nil
24
+ current_resource.mode.should be_nil
25
+ end
26
+
27
+ context "and no security metadata is specified in new_resource" do
28
+ it "sets the metadata values on the new_resource as strings after creating" do
29
+ resource.run_action(:create)
30
+ # TODO: most stable way to specify?
31
+ resource.owner.should == Etc.getpwuid(Process.uid).name
32
+ resource.group.should == Etc.getgrgid(Process.gid).name
33
+ resource.mode.should == "0#{default_mode}"
34
+ end
35
+ end
36
+
37
+ context "and owner is specified with a String (username) in new_resource", :requires_root => true do
38
+
39
+ # TODO/bug: duplicated from the "securable resource" tests
40
+ let(:expected_user_name) { 'nobody' }
41
+
42
+ before do
43
+ resource.owner(expected_user_name)
44
+ resource.run_action(:create)
45
+ end
46
+
47
+ it "sets the owner on new_resource to the username (String) of the desired owner" do
48
+ resource.owner.should == expected_user_name
49
+ end
50
+
51
+ end
52
+
53
+ context "and owner is specified with an Integer (uid) in new_resource", :requires_root => true do
54
+
55
+ # TODO: duplicated from "securable resource"
56
+ let(:expected_user_name) { 'nobody' }
57
+ let(:expected_uid) { Etc.getpwnam(expected_user_name).uid }
58
+ let(:desired_gid) { 1337 }
59
+ let(:expected_gid) { 1337 }
60
+
61
+ before do
62
+ resource.owner(expected_uid)
63
+ resource.run_action(:create)
64
+ end
65
+
66
+ it "sets the owner on new_resource to the uid (Integer) of the desired owner" do
67
+ resource.owner.should == expected_uid
68
+ end
69
+ end
70
+
71
+ context "and group is specified with a String (group name)", :requires_root => true do
72
+
73
+ let(:expected_group_name) { Etc.getgrent.name }
74
+
75
+ before do
76
+ resource.group(expected_group_name)
77
+ resource.run_action(:create)
78
+ end
79
+
80
+ it "sets the group on new_resource to the group name (String) of the group" do
81
+ resource.group.should == expected_group_name
82
+ end
83
+
84
+ end
85
+
86
+ context "and group is specified with an Integer (gid)", :requires_root => true do
87
+ let(:expected_gid) { Etc.getgrent.gid }
88
+
89
+ before do
90
+ resource.group(expected_gid)
91
+ resource.run_action(:create)
92
+ end
93
+
94
+ it "sets the group on new_resource to the gid (Integer)" do
95
+ resource.group.should == expected_gid
96
+ end
97
+
98
+ end
99
+
100
+ context "and mode is specified as a String" do
101
+ # Need full permission for owner here or else remote directory gets
102
+ # into trouble trying to manage nested directories
103
+ let(:set_mode) { "0740" }
104
+ let(:expected_mode) { "0740" }
105
+
106
+ before do
107
+ resource.mode(set_mode)
108
+ resource.run_action(:create)
109
+ end
110
+
111
+ it "sets mode on the new_resource as a String" do
112
+ resource.mode.should == expected_mode
113
+ end
114
+ end
115
+
116
+ context "and mode is specified as an Integer" do
117
+ let(:set_mode) { 00740 }
118
+
119
+ let(:expected_mode) { "0740" }
120
+ before do
121
+ resource.mode(set_mode)
122
+ resource.run_action(:create)
123
+ end
124
+
125
+ it "sets mode on the new resource as a String" do
126
+ resource.mode.should == expected_mode
127
+ end
128
+ end
129
+ end
130
+
131
+ context "when the target file exists" do
132
+ before do
133
+ FileUtils.touch(resource.path)
134
+ resource.action(:create)
135
+ end
136
+
137
+ context "and no security metadata is specified in new_resource" do
138
+ it "sets the current values on current resource as strings" do
139
+ # TODO: most stable way to specify?
140
+ current_resource.owner.should == Etc.getpwuid(Process.uid).name
141
+ current_resource.group.should == Etc.getgrgid(Process.gid).name
142
+ current_resource.mode.should == "0#{((0100666 - File.umask) & 07777).to_s(8)}"
143
+ end
144
+ end
145
+
146
+ context "and owner is specified with a String (username) in new_resource" do
147
+
148
+ let(:expected_user_name) { Etc.getpwuid(Process.uid).name }
149
+
150
+ before do
151
+ resource.owner(expected_user_name)
152
+ end
153
+
154
+ it "sets the owner on new_resource to the username (String) of the desired owner" do
155
+ current_resource.owner.should == expected_user_name
156
+ end
157
+
158
+ end
159
+
160
+ context "and owner is specified with an Integer (uid) in new_resource" do
161
+
162
+ let(:expected_uid) { Process.uid }
163
+
164
+ before do
165
+ resource.owner(expected_uid)
166
+ end
167
+
168
+ it "sets the owner on new_resource to the uid (Integer) of the desired owner" do
169
+ current_resource.owner.should == expected_uid
170
+ end
171
+ end
172
+
173
+ context "and group is specified with a String (group name)" do
174
+
175
+ let(:expected_group_name) { Etc.getgrgid(Process.gid).name }
176
+
177
+ before do
178
+ resource.group(expected_group_name)
179
+ end
180
+
181
+ it "sets the group on new_resource to the group name (String) of the group" do
182
+ current_resource.group.should == expected_group_name
183
+ end
184
+
185
+ end
186
+
187
+ context "and group is specified with an Integer (gid)" do
188
+ let(:expected_gid) { Process.gid }
189
+
190
+ before do
191
+ resource.group(expected_gid)
192
+ end
193
+
194
+ it "sets the group on new_resource to the gid (Integer)" do
195
+ current_resource.group.should == expected_gid
196
+ end
197
+
198
+ end
199
+
200
+ context "and mode is specified as a String" do
201
+ let(:default_create_mode) { (0100666 - File.umask) }
202
+ let(:expected_mode) { "0#{(default_create_mode & 07777).to_s(8)}" }
203
+
204
+ before do
205
+ resource.mode(expected_mode)
206
+ end
207
+
208
+ it "sets mode on the new_resource as a String" do
209
+ current_resource.mode.should == expected_mode
210
+ end
211
+ end
212
+
213
+ context "and mode is specified as an Integer" do
214
+ let(:set_mode) { (0100666 - File.umask) & 07777 }
215
+ let(:expected_mode) { "0#{set_mode.to_s(8)}" }
216
+
217
+ before do
218
+ resource.mode(set_mode)
219
+ end
220
+
221
+ it "sets mode on the new resource as a String" do
222
+ current_resource.mode.should == expected_mode
223
+ end
224
+ end
225
+ end
226
+ end
227
+
228
+ describe "reading file security metadata for reporting on windows", :windows_only do
229
+
230
+ before do
231
+ pending "windows reporting not yet fully supported"
232
+ end
233
+
234
+ ALL_EXPANDED_PERMISSIONS = ["generic read",
235
+ "generic write",
236
+ "generic execute",
237
+ "generic all",
238
+ "delete",
239
+ "read permissions",
240
+ "change permissions",
241
+ "take ownership",
242
+ "synchronize",
243
+ "access system security",
244
+ "read data / list directory",
245
+ "write data / add file",
246
+ "append data / add subdirectory",
247
+ "read extended attributes",
248
+ "write extended attributes",
249
+ "execute / traverse",
250
+ "delete child",
251
+ "read attributes",
252
+ "write attributes"]
253
+
254
+
255
+ context "when the target file doesn't exist" do
256
+
257
+ # Windows reporting data should look like this (+/- ish):
258
+ # { "owner" => "bob", "checksum" => "ffff", "access control" => { "bob" => { "permissions" => ["perm1", "perm2", ...], "flags" => [] }}}
259
+
260
+
261
+ before do
262
+ resource.action(:create)
263
+ end
264
+
265
+ it "has empty values for file metadata in 'current_resource'" do
266
+ current_resource.owner.should be_nil
267
+ current_resource.expanded_rights.should be_nil
268
+ end
269
+
270
+ context "and no security metadata is specified in new_resource" do
271
+ it "sets the metadata values on the new_resource as strings after creating" do
272
+ resource.run_action(:create)
273
+ # TODO: most stable way to specify?
274
+ resource.owner.should == etc.getpwuid(process.uid).name
275
+ resource.state[:expanded_rights].should == { "CURRENTUSER" => { "permissions" => ALL_EXPANDED_PERMISSIONS, "flags" => [] }}
276
+ resource.state[:expanded_deny_rights].should == {}
277
+ resource.state[:inherits].should be_true
278
+ end
279
+ end
280
+
281
+
282
+ context "and owner is specified with a string (username) in new_resource" do
283
+
284
+ # TODO/bug: duplicated from the "securable resource" tests
285
+ let(:expected_user_name) { 'Guest' }
286
+
287
+ before do
288
+ resource.owner(expected_user_name)
289
+ resource.run_action(:create)
290
+ end
291
+
292
+ it "sets the owner on new_resource to the username (string) of the desired owner" do
293
+ resource.owner.should == expected_user_name
294
+ end
295
+
296
+ end
297
+
298
+ context "and owner is specified with a fully qualified domain user" do
299
+
300
+ # TODO: duplicated from "securable resource"
301
+ let(:expected_user_name) { 'domain\user' }
302
+
303
+ before do
304
+ resource.owner(expected_user_name)
305
+ resource.run_action(:create)
306
+ end
307
+
308
+ it "sets the owner on new_resource to the fully qualified name of the desired owner" do
309
+ resource.owner.should == expected_user_name
310
+ end
311
+ end
312
+
313
+ end
314
+
315
+ context "when the target file exists" do
316
+ before do
317
+ FileUtils.touch(resource.path)
318
+ resource.action(:create)
319
+ end
320
+
321
+ context "and no security metadata is specified in new_resource" do
322
+ it "sets the current values on current resource as strings" do
323
+ # TODO: most stable way to specify?
324
+ current_resource.owner.should == etc.getpwuid(process.uid).name
325
+ current_resource.expanded_rights.should == { "CURRENTUSER" => ALL_EXPANDED_PERMISSIONS }
326
+ end
327
+ end
328
+
329
+ context "and owner is specified with a string (username) in new_resource" do
330
+
331
+ let(:expected_user_name) { etc.getpwuid(process.uid).name }
332
+
333
+ before do
334
+ resource.owner(expected_user_name)
335
+ end
336
+
337
+ it "sets the owner on current_resource to the username (string) of the desired owner" do
338
+ current_resource.owner.should == expected_user_name
339
+ end
340
+
341
+ end
342
+
343
+ context "and owner is specified as a fully qualified 'domain\\user' in new_resource" do
344
+
345
+ let(:expected_user_name) { 'domain\user' }
346
+
347
+ before do
348
+ resource.owner(expected_user_name)
349
+ end
350
+
351
+ it "sets the owner on current_resource to the fully qualified name of the desired owner" do
352
+ current_resource.owner.should == expected_uid
353
+ end
354
+ end
355
+
356
+ context "and access rights are specified on the new_resource" do
357
+ # TODO: before do blah
358
+
359
+ it "sets the expanded_rights on the current resource" do
360
+ pending
361
+ end
362
+ end
363
+
364
+ context "and no access rights are specified on the current resource" do
365
+ # TODO: before do blah
366
+
367
+ it "sets the expanded rights on the current resource" do
368
+ pending
369
+ end
370
+ end
371
+
372
+
373
+ end
374
+ end
375
+ end