microwave 1.0.4 → 11.400.2

Sign up to get free protection for your applications and to get access to all the features.
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