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,329 @@
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_pattern'
22
+ require 'chef/chef_fs/command_line'
23
+
24
+ # Removes the date stamp from the diff and replaces it with ' DATE'
25
+ # example match: "/dev/null\t2012-10-16 16:15:54.000000000 +0000"
26
+ # windows match: "--- /dev/null\tTue Oct 16 18:04:34 2012"
27
+ def remove_os_differences(diff)
28
+ diff = diff.gsub(/([+-]{3}.*)\t.*/, '\1 DATE')
29
+ diff.gsub(/^@@ -\d(,\d)? \+\d(,\d)? @@/, 'CONTEXT_LINE_NUMBERS')
30
+ end
31
+
32
+ describe 'diff', :uses_diff => true do
33
+ include FileSystemSupport
34
+
35
+ context 'with two filesystems with all types of difference' do
36
+ let(:a) {
37
+ memory_fs('a', {
38
+ :both_dirs => {
39
+ :sub_both_dirs => { :subsub => nil },
40
+ :sub_both_files => nil,
41
+ :sub_both_files_different => "a\n",
42
+ :sub_both_dirs_empty => {},
43
+ :sub_dirs_empty_in_a_filled_in_b => {},
44
+ :sub_dirs_empty_in_b_filled_in_a => { :subsub => nil },
45
+ :sub_a_only_dir => { :subsub => nil },
46
+ :sub_a_only_file => nil,
47
+ :sub_dir_in_a_file_in_b => {},
48
+ :sub_file_in_a_dir_in_b => nil
49
+ },
50
+ :both_files => nil,
51
+ :both_files_different => "a\n",
52
+ :both_dirs_empty => {},
53
+ :dirs_empty_in_a_filled_in_b => {},
54
+ :dirs_empty_in_b_filled_in_a => { :subsub => nil },
55
+ :dirs_in_a_cannot_be_in_b => {},
56
+ :file_in_a_cannot_be_in_b => nil,
57
+ :a_only_dir => { :subsub => nil },
58
+ :a_only_file => nil,
59
+ :dir_in_a_file_in_b => {},
60
+ :file_in_a_dir_in_b => nil
61
+ }, /cannot_be_in_a/)
62
+ }
63
+ let(:b) {
64
+ memory_fs('b', {
65
+ :both_dirs => {
66
+ :sub_both_dirs => { :subsub => nil },
67
+ :sub_both_files => nil,
68
+ :sub_both_files_different => "b\n",
69
+ :sub_both_dirs_empty => {},
70
+ :sub_dirs_empty_in_a_filled_in_b => { :subsub => nil },
71
+ :sub_dirs_empty_in_b_filled_in_a => {},
72
+ :sub_b_only_dir => { :subsub => nil },
73
+ :sub_b_only_file => nil,
74
+ :sub_dir_in_a_file_in_b => nil,
75
+ :sub_file_in_a_dir_in_b => {}
76
+ },
77
+ :both_files => nil,
78
+ :both_files_different => "b\n",
79
+ :both_dirs_empty => {},
80
+ :dirs_empty_in_a_filled_in_b => { :subsub => nil },
81
+ :dirs_empty_in_b_filled_in_a => {},
82
+ :dirs_in_b_cannot_be_in_a => {},
83
+ :file_in_b_cannot_be_in_a => nil,
84
+ :b_only_dir => { :subsub => nil },
85
+ :b_only_file => nil,
86
+ :dir_in_a_file_in_b => nil,
87
+ :file_in_a_dir_in_b => {}
88
+ }, /cannot_be_in_b/)
89
+ }
90
+ it 'Chef::ChefFS::CommandLine.diff(/)' do
91
+ results = []
92
+ Chef::ChefFS::CommandLine.diff(pattern('/'), a, b, nil, nil) do |diff|
93
+ results << remove_os_differences(diff)
94
+ end
95
+ results.should =~ [
96
+ 'diff --knife a/both_dirs/sub_both_files_different b/both_dirs/sub_both_files_different
97
+ --- a/both_dirs/sub_both_files_different DATE
98
+ +++ b/both_dirs/sub_both_files_different DATE
99
+ CONTEXT_LINE_NUMBERS
100
+ -a
101
+ +b
102
+ ','diff --knife a/both_dirs/sub_dirs_empty_in_a_filled_in_b/subsub b/both_dirs/sub_dirs_empty_in_a_filled_in_b/subsub
103
+ new file
104
+ --- /dev/null DATE
105
+ +++ b/both_dirs/sub_dirs_empty_in_a_filled_in_b/subsub DATE
106
+ CONTEXT_LINE_NUMBERS
107
+ +subsub
108
+ ','diff --knife a/both_dirs/sub_dirs_empty_in_b_filled_in_a/subsub b/both_dirs/sub_dirs_empty_in_b_filled_in_a/subsub
109
+ deleted file
110
+ --- a/both_dirs/sub_dirs_empty_in_b_filled_in_a/subsub DATE
111
+ +++ /dev/null DATE
112
+ CONTEXT_LINE_NUMBERS
113
+ -subsub
114
+ ','Only in a/both_dirs: sub_a_only_dir
115
+ ','diff --knife a/both_dirs/sub_a_only_file b/both_dirs/sub_a_only_file
116
+ deleted file
117
+ --- a/both_dirs/sub_a_only_file DATE
118
+ +++ /dev/null DATE
119
+ CONTEXT_LINE_NUMBERS
120
+ -sub_a_only_file
121
+ ','File b/both_dirs/sub_dir_in_a_file_in_b is a directory while file b/both_dirs/sub_dir_in_a_file_in_b is a regular file
122
+ ','File a/both_dirs/sub_file_in_a_dir_in_b is a regular file while file a/both_dirs/sub_file_in_a_dir_in_b is a directory
123
+ ','Only in b/both_dirs: sub_b_only_dir
124
+ ','diff --knife a/both_dirs/sub_b_only_file b/both_dirs/sub_b_only_file
125
+ new file
126
+ --- /dev/null DATE
127
+ +++ b/both_dirs/sub_b_only_file DATE
128
+ CONTEXT_LINE_NUMBERS
129
+ +sub_b_only_file
130
+ ','diff --knife a/both_files_different b/both_files_different
131
+ --- a/both_files_different DATE
132
+ +++ b/both_files_different DATE
133
+ CONTEXT_LINE_NUMBERS
134
+ -a
135
+ +b
136
+ ','diff --knife a/dirs_empty_in_a_filled_in_b/subsub b/dirs_empty_in_a_filled_in_b/subsub
137
+ new file
138
+ --- /dev/null DATE
139
+ +++ b/dirs_empty_in_a_filled_in_b/subsub DATE
140
+ CONTEXT_LINE_NUMBERS
141
+ +subsub
142
+ ','diff --knife a/dirs_empty_in_b_filled_in_a/subsub b/dirs_empty_in_b_filled_in_a/subsub
143
+ deleted file
144
+ --- a/dirs_empty_in_b_filled_in_a/subsub DATE
145
+ +++ /dev/null DATE
146
+ CONTEXT_LINE_NUMBERS
147
+ -subsub
148
+ ','Only in a: a_only_dir
149
+ ','diff --knife a/a_only_file b/a_only_file
150
+ deleted file
151
+ --- a/a_only_file DATE
152
+ +++ /dev/null DATE
153
+ CONTEXT_LINE_NUMBERS
154
+ -a_only_file
155
+ ','File b/dir_in_a_file_in_b is a directory while file b/dir_in_a_file_in_b is a regular file
156
+ ','File a/file_in_a_dir_in_b is a regular file while file a/file_in_a_dir_in_b is a directory
157
+ ','Only in b: b_only_dir
158
+ ','diff --knife a/b_only_file b/b_only_file
159
+ new file
160
+ --- /dev/null DATE
161
+ +++ b/b_only_file DATE
162
+ CONTEXT_LINE_NUMBERS
163
+ +b_only_file
164
+ ' ]
165
+ end
166
+ it 'Chef::ChefFS::CommandLine.diff(/both_dirs)' do
167
+ results = []
168
+ Chef::ChefFS::CommandLine.diff(pattern('/both_dirs'), a, b, nil, nil) do |diff|
169
+ results << remove_os_differences(diff)
170
+ end
171
+ results.should =~ [
172
+ 'diff --knife a/both_dirs/sub_both_files_different b/both_dirs/sub_both_files_different
173
+ --- a/both_dirs/sub_both_files_different DATE
174
+ +++ b/both_dirs/sub_both_files_different DATE
175
+ CONTEXT_LINE_NUMBERS
176
+ -a
177
+ +b
178
+ ','diff --knife a/both_dirs/sub_dirs_empty_in_a_filled_in_b/subsub b/both_dirs/sub_dirs_empty_in_a_filled_in_b/subsub
179
+ new file
180
+ --- /dev/null DATE
181
+ +++ b/both_dirs/sub_dirs_empty_in_a_filled_in_b/subsub DATE
182
+ CONTEXT_LINE_NUMBERS
183
+ +subsub
184
+ ','diff --knife a/both_dirs/sub_dirs_empty_in_b_filled_in_a/subsub b/both_dirs/sub_dirs_empty_in_b_filled_in_a/subsub
185
+ deleted file
186
+ --- a/both_dirs/sub_dirs_empty_in_b_filled_in_a/subsub DATE
187
+ +++ /dev/null DATE
188
+ CONTEXT_LINE_NUMBERS
189
+ -subsub
190
+ ','Only in a/both_dirs: sub_a_only_dir
191
+ ','diff --knife a/both_dirs/sub_a_only_file b/both_dirs/sub_a_only_file
192
+ deleted file
193
+ --- a/both_dirs/sub_a_only_file DATE
194
+ +++ /dev/null DATE
195
+ CONTEXT_LINE_NUMBERS
196
+ -sub_a_only_file
197
+ ','File b/both_dirs/sub_dir_in_a_file_in_b is a directory while file b/both_dirs/sub_dir_in_a_file_in_b is a regular file
198
+ ','File a/both_dirs/sub_file_in_a_dir_in_b is a regular file while file a/both_dirs/sub_file_in_a_dir_in_b is a directory
199
+ ','Only in b/both_dirs: sub_b_only_dir
200
+ ','diff --knife a/both_dirs/sub_b_only_file b/both_dirs/sub_b_only_file
201
+ new file
202
+ --- /dev/null DATE
203
+ +++ b/both_dirs/sub_b_only_file DATE
204
+ CONTEXT_LINE_NUMBERS
205
+ +sub_b_only_file
206
+ ' ]
207
+ end
208
+ it 'Chef::ChefFS::CommandLine.diff(/) with depth 1' do
209
+ results = []
210
+ Chef::ChefFS::CommandLine.diff(pattern('/'), a, b, 1, nil) do |diff|
211
+ results << remove_os_differences(diff)
212
+ end
213
+ results.should =~ [
214
+ 'Common subdirectories: /both_dirs
215
+ ','diff --knife a/both_files_different b/both_files_different
216
+ --- a/both_files_different DATE
217
+ +++ b/both_files_different DATE
218
+ CONTEXT_LINE_NUMBERS
219
+ -a
220
+ +b
221
+ ','Common subdirectories: /both_dirs_empty
222
+ ','Common subdirectories: /dirs_empty_in_b_filled_in_a
223
+ ','Common subdirectories: /dirs_empty_in_a_filled_in_b
224
+ ','Only in a: a_only_dir
225
+ ','diff --knife a/a_only_file b/a_only_file
226
+ deleted file
227
+ --- a/a_only_file DATE
228
+ +++ /dev/null DATE
229
+ CONTEXT_LINE_NUMBERS
230
+ -a_only_file
231
+ ','File b/dir_in_a_file_in_b is a directory while file b/dir_in_a_file_in_b is a regular file
232
+ ','File a/file_in_a_dir_in_b is a regular file while file a/file_in_a_dir_in_b is a directory
233
+ ','Only in b: b_only_dir
234
+ ','diff --knife a/b_only_file b/b_only_file
235
+ new file
236
+ --- /dev/null DATE
237
+ +++ b/b_only_file DATE
238
+ CONTEXT_LINE_NUMBERS
239
+ +b_only_file
240
+ ' ]
241
+ end
242
+ it 'Chef::ChefFS::CommandLine.diff(/*_*) with depth 0' do
243
+ results = []
244
+ Chef::ChefFS::CommandLine.diff(pattern('/*_*'), a, b, 0, nil) do |diff|
245
+ results << remove_os_differences(diff)
246
+ end
247
+ results.should =~ [
248
+ 'Common subdirectories: /both_dirs
249
+ ','diff --knife a/both_files_different b/both_files_different
250
+ --- a/both_files_different DATE
251
+ +++ b/both_files_different DATE
252
+ CONTEXT_LINE_NUMBERS
253
+ -a
254
+ +b
255
+ ','Common subdirectories: /both_dirs_empty
256
+ ','Common subdirectories: /dirs_empty_in_b_filled_in_a
257
+ ','Common subdirectories: /dirs_empty_in_a_filled_in_b
258
+ ','Only in a: a_only_dir
259
+ ','diff --knife a/a_only_file b/a_only_file
260
+ deleted file
261
+ --- a/a_only_file DATE
262
+ +++ /dev/null DATE
263
+ CONTEXT_LINE_NUMBERS
264
+ -a_only_file
265
+ ','File b/dir_in_a_file_in_b is a directory while file b/dir_in_a_file_in_b is a regular file
266
+ ','File a/file_in_a_dir_in_b is a regular file while file a/file_in_a_dir_in_b is a directory
267
+ ','Only in b: b_only_dir
268
+ ','diff --knife a/b_only_file b/b_only_file
269
+ new file
270
+ --- /dev/null DATE
271
+ +++ b/b_only_file DATE
272
+ CONTEXT_LINE_NUMBERS
273
+ +b_only_file
274
+ ' ]
275
+ end
276
+ it 'Chef::ChefFS::CommandLine.diff(/) in name-only mode' do
277
+ results = []
278
+ Chef::ChefFS::CommandLine.diff(pattern('/'), a, b, nil, :name_only) do |diff|
279
+ results << remove_os_differences(diff)
280
+ end
281
+ results.should =~ [
282
+ "b/both_dirs/sub_both_files_different\n",
283
+ "b/both_dirs/sub_dirs_empty_in_b_filled_in_a/subsub\n",
284
+ "b/both_dirs/sub_dirs_empty_in_a_filled_in_b/subsub\n",
285
+ "b/both_dirs/sub_a_only_dir\n",
286
+ "b/both_dirs/sub_a_only_file\n",
287
+ "b/both_dirs/sub_b_only_dir\n",
288
+ "b/both_dirs/sub_b_only_file\n",
289
+ "b/both_dirs/sub_dir_in_a_file_in_b\n",
290
+ "b/both_dirs/sub_file_in_a_dir_in_b\n",
291
+ "b/both_files_different\n",
292
+ "b/dirs_empty_in_b_filled_in_a/subsub\n",
293
+ "b/dirs_empty_in_a_filled_in_b/subsub\n",
294
+ "b/a_only_dir\n",
295
+ "b/a_only_file\n",
296
+ "b/b_only_dir\n",
297
+ "b/b_only_file\n",
298
+ "b/dir_in_a_file_in_b\n",
299
+ "b/file_in_a_dir_in_b\n"
300
+ ]
301
+ end
302
+ it 'Chef::ChefFS::CommandLine.diff(/) in name-status mode' do
303
+ results = []
304
+ Chef::ChefFS::CommandLine.diff(pattern('/'), a, b, nil, :name_status) do |diff|
305
+ results << remove_os_differences(diff)
306
+ end
307
+ results.should =~ [
308
+ "M\tb/both_dirs/sub_both_files_different\n",
309
+ "D\tb/both_dirs/sub_dirs_empty_in_b_filled_in_a/subsub\n",
310
+ "A\tb/both_dirs/sub_dirs_empty_in_a_filled_in_b/subsub\n",
311
+ "D\tb/both_dirs/sub_a_only_dir\n",
312
+ "D\tb/both_dirs/sub_a_only_file\n",
313
+ "A\tb/both_dirs/sub_b_only_dir\n",
314
+ "A\tb/both_dirs/sub_b_only_file\n",
315
+ "T\tb/both_dirs/sub_dir_in_a_file_in_b\n",
316
+ "T\tb/both_dirs/sub_file_in_a_dir_in_b\n",
317
+ "M\tb/both_files_different\n",
318
+ "D\tb/dirs_empty_in_b_filled_in_a/subsub\n",
319
+ "A\tb/dirs_empty_in_a_filled_in_b/subsub\n",
320
+ "D\tb/a_only_dir\n",
321
+ "D\tb/a_only_file\n",
322
+ "A\tb/b_only_dir\n",
323
+ "A\tb/b_only_file\n",
324
+ "T\tb/dir_in_a_file_in_b\n",
325
+ "T\tb/file_in_a_dir_in_b\n"
326
+ ]
327
+ end
328
+ end
329
+ end
@@ -0,0 +1,526 @@
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_pattern'
21
+
22
+ describe Chef::ChefFS::FilePattern do
23
+ def p(str)
24
+ Chef::ChefFS::FilePattern.new(str)
25
+ end
26
+
27
+ # Different kinds of patterns
28
+ context 'with empty pattern ""' do
29
+ let(:pattern) { Chef::ChefFS::FilePattern.new('') }
30
+ it 'match?' do
31
+ pattern.match?('').should be_true
32
+ pattern.match?('/').should be_false
33
+ pattern.match?('a').should be_false
34
+ pattern.match?('a/b').should be_false
35
+ end
36
+ it 'exact_path' do
37
+ pattern.exact_path.should == ''
38
+ end
39
+ it 'could_match_children?' do
40
+ pattern.could_match_children?('').should be_false
41
+ pattern.could_match_children?('a/b').should be_false
42
+ end
43
+ end
44
+
45
+ context 'with root pattern "/"' do
46
+ let(:pattern) { Chef::ChefFS::FilePattern.new('/') }
47
+ it 'match?' do
48
+ pattern.match?('/').should be_true
49
+ pattern.match?('').should be_false
50
+ pattern.match?('a').should be_false
51
+ pattern.match?('/a').should be_false
52
+ end
53
+ it 'exact_path' do
54
+ pattern.exact_path.should == '/'
55
+ end
56
+ it 'could_match_children?' do
57
+ pattern.could_match_children?('').should be_false
58
+ pattern.could_match_children?('/').should be_false
59
+ pattern.could_match_children?('a').should be_false
60
+ pattern.could_match_children?('a/b').should be_false
61
+ pattern.could_match_children?('/a').should be_false
62
+ end
63
+ end
64
+
65
+ context 'with simple pattern "abc"' do
66
+ let(:pattern) { Chef::ChefFS::FilePattern.new('abc') }
67
+ it 'match?' do
68
+ pattern.match?('abc').should be_true
69
+ pattern.match?('a').should be_false
70
+ pattern.match?('abcd').should be_false
71
+ pattern.match?('/abc').should be_false
72
+ pattern.match?('').should be_false
73
+ pattern.match?('/').should be_false
74
+ end
75
+ it 'exact_path' do
76
+ pattern.exact_path.should == 'abc'
77
+ end
78
+ it 'could_match_children?' do
79
+ pattern.could_match_children?('').should be_false
80
+ pattern.could_match_children?('abc').should be_false
81
+ pattern.could_match_children?('/abc').should be_false
82
+ end
83
+ end
84
+
85
+ context 'with simple pattern "/abc"' do
86
+ let(:pattern) { Chef::ChefFS::FilePattern.new('/abc') }
87
+ it 'match?' do
88
+ pattern.match?('/abc').should be_true
89
+ pattern.match?('abc').should be_false
90
+ pattern.match?('a').should be_false
91
+ pattern.match?('abcd').should be_false
92
+ pattern.match?('').should be_false
93
+ pattern.match?('/').should be_false
94
+ end
95
+ it 'exact_path' do
96
+ pattern.exact_path.should == '/abc'
97
+ end
98
+ it 'could_match_children?' do
99
+ pattern.could_match_children?('abc').should be_false
100
+ pattern.could_match_children?('/abc').should be_false
101
+ pattern.could_match_children?('/').should be_true
102
+ pattern.could_match_children?('').should be_false
103
+ end
104
+ it 'exact_child_name_under' do
105
+ pattern.exact_child_name_under('/').should == 'abc'
106
+ end
107
+ end
108
+
109
+ context 'with simple pattern "abc/def/ghi"' do
110
+ let(:pattern) { Chef::ChefFS::FilePattern.new('abc/def/ghi') }
111
+ it 'match?' do
112
+ pattern.match?('abc/def/ghi').should be_true
113
+ pattern.match?('/abc/def/ghi').should be_false
114
+ pattern.match?('abc').should be_false
115
+ pattern.match?('abc/def').should be_false
116
+ end
117
+ it 'exact_path' do
118
+ pattern.exact_path.should == 'abc/def/ghi'
119
+ end
120
+ it 'could_match_children?' do
121
+ pattern.could_match_children?('abc').should be_true
122
+ pattern.could_match_children?('xyz').should be_false
123
+ pattern.could_match_children?('/abc').should be_false
124
+ pattern.could_match_children?('abc/def').should be_true
125
+ pattern.could_match_children?('abc/xyz').should be_false
126
+ pattern.could_match_children?('abc/def/ghi').should be_false
127
+ end
128
+ it 'exact_child_name_under' do
129
+ pattern.exact_child_name_under('abc').should == 'def'
130
+ pattern.exact_child_name_under('abc/def').should == 'ghi'
131
+ end
132
+ end
133
+
134
+ context 'with simple pattern "/abc/def/ghi"' do
135
+ let(:pattern) { Chef::ChefFS::FilePattern.new('/abc/def/ghi') }
136
+ it 'match?' do
137
+ pattern.match?('/abc/def/ghi').should be_true
138
+ pattern.match?('abc/def/ghi').should be_false
139
+ pattern.match?('/abc').should be_false
140
+ pattern.match?('/abc/def').should be_false
141
+ end
142
+ it 'exact_path' do
143
+ pattern.exact_path.should == '/abc/def/ghi'
144
+ end
145
+ it 'could_match_children?' do
146
+ pattern.could_match_children?('/abc').should be_true
147
+ pattern.could_match_children?('/xyz').should be_false
148
+ pattern.could_match_children?('abc').should be_false
149
+ pattern.could_match_children?('/abc/def').should be_true
150
+ pattern.could_match_children?('/abc/xyz').should be_false
151
+ pattern.could_match_children?('/abc/def/ghi').should be_false
152
+ end
153
+ it 'exact_child_name_under' do
154
+ pattern.exact_child_name_under('/').should == 'abc'
155
+ pattern.exact_child_name_under('/abc').should == 'def'
156
+ pattern.exact_child_name_under('/abc/def').should == 'ghi'
157
+ end
158
+ end
159
+
160
+ context 'with simple pattern "a\*\b"' do
161
+ let(:pattern) { Chef::ChefFS::FilePattern.new('a\*\b') }
162
+ it 'match?' do
163
+ pattern.match?('a*b').should be_true
164
+ pattern.match?('ab').should be_false
165
+ pattern.match?('acb').should be_false
166
+ pattern.match?('ab').should be_false
167
+ end
168
+ it 'exact_path' do
169
+ pattern.exact_path.should == 'a*b'
170
+ end
171
+ it 'could_match_children?' do
172
+ pattern.could_match_children?('a/*b').should be_false
173
+ end
174
+ end
175
+
176
+ context 'with star pattern "/abc/*/ghi"' do
177
+ let(:pattern) { Chef::ChefFS::FilePattern.new('/abc/*/ghi') }
178
+ it 'match?' do
179
+ pattern.match?('/abc/def/ghi').should be_true
180
+ pattern.match?('/abc/ghi').should be_false
181
+ end
182
+ it 'exact_path' do
183
+ pattern.exact_path.should be_nil
184
+ end
185
+ it 'could_match_children?' do
186
+ pattern.could_match_children?('/abc').should be_true
187
+ pattern.could_match_children?('/xyz').should be_false
188
+ pattern.could_match_children?('abc').should be_false
189
+ pattern.could_match_children?('/abc/def').should be_true
190
+ pattern.could_match_children?('/abc/xyz').should be_true
191
+ pattern.could_match_children?('/abc/def/ghi').should be_false
192
+ end
193
+ it 'exact_child_name_under' do
194
+ pattern.exact_child_name_under('/').should == 'abc'
195
+ pattern.exact_child_name_under('/abc').should == nil
196
+ pattern.exact_child_name_under('/abc/def').should == 'ghi'
197
+ end
198
+ end
199
+
200
+ context 'with star pattern "/abc/d*f/ghi"' do
201
+ let(:pattern) { Chef::ChefFS::FilePattern.new('/abc/d*f/ghi') }
202
+ it 'match?' do
203
+ pattern.match?('/abc/def/ghi').should be_true
204
+ pattern.match?('/abc/dxf/ghi').should be_true
205
+ pattern.match?('/abc/df/ghi').should be_true
206
+ pattern.match?('/abc/dxyzf/ghi').should be_true
207
+ pattern.match?('/abc/d/ghi').should be_false
208
+ pattern.match?('/abc/f/ghi').should be_false
209
+ pattern.match?('/abc/ghi').should be_false
210
+ pattern.match?('/abc/xyz/ghi').should be_false
211
+ end
212
+ it 'exact_path' do
213
+ pattern.exact_path.should be_nil
214
+ end
215
+ it 'could_match_children?' do
216
+ pattern.could_match_children?('/abc').should be_true
217
+ pattern.could_match_children?('/xyz').should be_false
218
+ pattern.could_match_children?('abc').should be_false
219
+ pattern.could_match_children?('/abc/def').should be_true
220
+ pattern.could_match_children?('/abc/xyz').should be_false
221
+ pattern.could_match_children?('/abc/dxyzf').should be_true
222
+ pattern.could_match_children?('/abc/df').should be_true
223
+ pattern.could_match_children?('/abc/d').should be_false
224
+ pattern.could_match_children?('/abc/f').should be_false
225
+ pattern.could_match_children?('/abc/def/ghi').should be_false
226
+ end
227
+ it 'exact_child_name_under' do
228
+ pattern.exact_child_name_under('/').should == 'abc'
229
+ pattern.exact_child_name_under('/abc').should == nil
230
+ pattern.exact_child_name_under('/abc/def').should == 'ghi'
231
+ end
232
+ end
233
+
234
+ context 'with star pattern "/abc/d??f/ghi"' do
235
+ let(:pattern) { Chef::ChefFS::FilePattern.new('/abc/d??f/ghi') }
236
+ it 'match?' do
237
+ pattern.match?('/abc/deef/ghi').should be_true
238
+ pattern.match?('/abc/deeef/ghi').should be_false
239
+ pattern.match?('/abc/def/ghi').should be_false
240
+ pattern.match?('/abc/df/ghi').should be_false
241
+ pattern.match?('/abc/d/ghi').should be_false
242
+ pattern.match?('/abc/f/ghi').should be_false
243
+ pattern.match?('/abc/ghi').should be_false
244
+ end
245
+ it 'exact_path' do
246
+ pattern.exact_path.should be_nil
247
+ end
248
+ it 'could_match_children?' do
249
+ pattern.could_match_children?('/abc').should be_true
250
+ pattern.could_match_children?('/xyz').should be_false
251
+ pattern.could_match_children?('abc').should be_false
252
+ pattern.could_match_children?('/abc/deef').should be_true
253
+ pattern.could_match_children?('/abc/deeef').should be_false
254
+ pattern.could_match_children?('/abc/def').should be_false
255
+ pattern.could_match_children?('/abc/df').should be_false
256
+ pattern.could_match_children?('/abc/d').should be_false
257
+ pattern.could_match_children?('/abc/f').should be_false
258
+ pattern.could_match_children?('/abc/deef/ghi').should be_false
259
+ end
260
+ it 'exact_child_name_under' do
261
+ pattern.exact_child_name_under('/').should == 'abc'
262
+ pattern.exact_child_name_under('/abc').should == nil
263
+ pattern.exact_child_name_under('/abc/deef').should == 'ghi'
264
+ end
265
+ end
266
+
267
+ context 'with star pattern "/abc/d[a-z][0-9]f/ghi"' do
268
+ let(:pattern) { Chef::ChefFS::FilePattern.new('/abc/d[a-z][0-9]f/ghi') }
269
+ it 'match?' do
270
+ pattern.match?('/abc/de1f/ghi').should be_true
271
+ pattern.match?('/abc/deef/ghi').should be_false
272
+ pattern.match?('/abc/d11f/ghi').should be_false
273
+ pattern.match?('/abc/de11f/ghi').should be_false
274
+ pattern.match?('/abc/dee1f/ghi').should be_false
275
+ pattern.match?('/abc/df/ghi').should be_false
276
+ pattern.match?('/abc/d/ghi').should be_false
277
+ pattern.match?('/abc/f/ghi').should be_false
278
+ pattern.match?('/abc/ghi').should be_false
279
+ end
280
+ it 'exact_path' do
281
+ pattern.exact_path.should be_nil
282
+ end
283
+ it 'could_match_children?' do
284
+ pattern.could_match_children?('/abc').should be_true
285
+ pattern.could_match_children?('/xyz').should be_false
286
+ pattern.could_match_children?('abc').should be_false
287
+ pattern.could_match_children?('/abc/de1f').should be_true
288
+ pattern.could_match_children?('/abc/deef').should be_false
289
+ pattern.could_match_children?('/abc/d11f').should be_false
290
+ pattern.could_match_children?('/abc/de11f').should be_false
291
+ pattern.could_match_children?('/abc/dee1f').should be_false
292
+ pattern.could_match_children?('/abc/def').should be_false
293
+ pattern.could_match_children?('/abc/df').should be_false
294
+ pattern.could_match_children?('/abc/d').should be_false
295
+ pattern.could_match_children?('/abc/f').should be_false
296
+ pattern.could_match_children?('/abc/de1f/ghi').should be_false
297
+ end
298
+ it 'exact_child_name_under' do
299
+ pattern.exact_child_name_under('/').should == 'abc'
300
+ pattern.exact_child_name_under('/abc').should == nil
301
+ pattern.exact_child_name_under('/abc/de1f').should == 'ghi'
302
+ end
303
+ end
304
+
305
+ context 'with star pattern "/abc/**/ghi"' do
306
+ let(:pattern) { Chef::ChefFS::FilePattern.new('/abc/**/ghi') }
307
+ it 'match?' do
308
+ pattern.match?('/abc/def/ghi').should be_true
309
+ pattern.match?('/abc/d/e/f/ghi').should be_true
310
+ pattern.match?('/abc/ghi').should be_false
311
+ pattern.match?('/abcdef/d/ghi').should be_false
312
+ pattern.match?('/abc/d/defghi').should be_false
313
+ pattern.match?('/xyz').should be_false
314
+ end
315
+ it 'exact_path' do
316
+ pattern.exact_path.should be_nil
317
+ end
318
+ it 'could_match_children?' do
319
+ pattern.could_match_children?('/abc').should be_true
320
+ pattern.could_match_children?('/abc/d').should be_true
321
+ pattern.could_match_children?('/abc/d/e').should be_true
322
+ pattern.could_match_children?('/abc/d/e/f').should be_true
323
+ pattern.could_match_children?('/abc/def/ghi').should be_true
324
+ pattern.could_match_children?('abc').should be_false
325
+ pattern.could_match_children?('/xyz').should be_false
326
+ end
327
+ it 'exact_child_name_under' do
328
+ pattern.exact_child_name_under('/').should == 'abc'
329
+ pattern.exact_child_name_under('/abc').should == nil
330
+ pattern.exact_child_name_under('/abc/def').should == nil
331
+ end
332
+ end
333
+
334
+ context 'with star pattern "/abc**/ghi"' do
335
+ let(:pattern) { Chef::ChefFS::FilePattern.new('/abc**/ghi') }
336
+ it 'match?' do
337
+ pattern.match?('/abc/def/ghi').should be_true
338
+ pattern.match?('/abc/d/e/f/ghi').should be_true
339
+ pattern.match?('/abc/ghi').should be_true
340
+ pattern.match?('/abcdef/ghi').should be_true
341
+ pattern.match?('/abc/defghi').should be_false
342
+ pattern.match?('/xyz').should be_false
343
+ end
344
+ it 'exact_path' do
345
+ pattern.exact_path.should be_nil
346
+ end
347
+ it 'could_match_children?' do
348
+ pattern.could_match_children?('/abc').should be_true
349
+ pattern.could_match_children?('/abcdef').should be_true
350
+ pattern.could_match_children?('/abc/d/e').should be_true
351
+ pattern.could_match_children?('/abc/d/e/f').should be_true
352
+ pattern.could_match_children?('/abc/def/ghi').should be_true
353
+ pattern.could_match_children?('abc').should be_false
354
+ end
355
+ it 'could_match_children? /abc** returns false for /xyz' do
356
+ pending 'Make could_match_children? more rigorous' do
357
+ # At the moment, we return false for this, but in the end it would be nice to return true:
358
+ pattern.could_match_children?('/xyz').should be_false
359
+ end
360
+ end
361
+ it 'exact_child_name_under' do
362
+ pattern.exact_child_name_under('/').should == nil
363
+ pattern.exact_child_name_under('/abc').should == nil
364
+ pattern.exact_child_name_under('/abc/def').should == nil
365
+ end
366
+ end
367
+
368
+ context 'with star pattern "/abc/**ghi"' do
369
+ let(:pattern) { Chef::ChefFS::FilePattern.new('/abc/**ghi') }
370
+ it 'match?' do
371
+ pattern.match?('/abc/def/ghi').should be_true
372
+ pattern.match?('/abc/def/ghi/ghi').should be_true
373
+ pattern.match?('/abc/def/ghi/jkl').should be_false
374
+ pattern.match?('/abc/d/e/f/ghi').should be_true
375
+ pattern.match?('/abc/ghi').should be_true
376
+ pattern.match?('/abcdef/ghi').should be_false
377
+ pattern.match?('/abc/defghi').should be_true
378
+ pattern.match?('/xyz').should be_false
379
+ end
380
+ it 'exact_path' do
381
+ pattern.exact_path.should be_nil
382
+ end
383
+ it 'could_match_children?' do
384
+ pattern.could_match_children?('/abc').should be_true
385
+ pattern.could_match_children?('/abcdef').should be_false
386
+ pattern.could_match_children?('/abc/d/e').should be_true
387
+ pattern.could_match_children?('/abc/d/e/f').should be_true
388
+ pattern.could_match_children?('/abc/def/ghi').should be_true
389
+ pattern.could_match_children?('abc').should be_false
390
+ pattern.could_match_children?('/xyz').should be_false
391
+ end
392
+ it 'exact_child_name_under' do
393
+ pattern.exact_child_name_under('/').should == 'abc'
394
+ pattern.exact_child_name_under('/abc').should == nil
395
+ pattern.exact_child_name_under('/abc/def').should == nil
396
+ end
397
+ end
398
+
399
+ context 'with star pattern "a**b**c"' do
400
+ let(:pattern) { Chef::ChefFS::FilePattern.new('a**b**c') }
401
+ it 'match?' do
402
+ pattern.match?('axybzwc').should be_true
403
+ pattern.match?('abc').should be_true
404
+ pattern.match?('axyzwc').should be_false
405
+ pattern.match?('ac').should be_false
406
+ pattern.match?('a/x/y/b/z/w/c').should be_true
407
+ end
408
+ it 'exact_path' do
409
+ pattern.exact_path.should be_nil
410
+ end
411
+ end
412
+
413
+ context 'normalization tests' do
414
+ it 'handles trailing slashes' do
415
+ p('abc/').normalized_pattern.should == 'abc'
416
+ p('abc/').exact_path.should == 'abc'
417
+ p('abc/').match?('abc').should be_true
418
+ p('//').normalized_pattern.should == '/'
419
+ p('//').exact_path.should == '/'
420
+ p('//').match?('/').should be_true
421
+ p('/./').normalized_pattern.should == '/'
422
+ p('/./').exact_path.should == '/'
423
+ p('/./').match?('/').should be_true
424
+ end
425
+ it 'handles multiple slashes' do
426
+ p('abc//def').normalized_pattern.should == 'abc/def'
427
+ p('abc//def').exact_path.should == 'abc/def'
428
+ p('abc//def').match?('abc/def').should be_true
429
+ p('abc//').normalized_pattern.should == 'abc'
430
+ p('abc//').exact_path.should == 'abc'
431
+ p('abc//').match?('abc').should be_true
432
+ end
433
+ it 'handles dot' do
434
+ p('abc/./def').normalized_pattern.should == 'abc/def'
435
+ p('abc/./def').exact_path.should == 'abc/def'
436
+ p('abc/./def').match?('abc/def').should be_true
437
+ p('./abc/def').normalized_pattern.should == 'abc/def'
438
+ p('./abc/def').exact_path.should == 'abc/def'
439
+ p('./abc/def').match?('abc/def').should be_true
440
+ p('/.').normalized_pattern.should == '/'
441
+ p('/.').exact_path.should == '/'
442
+ p('/.').match?('/').should be_true
443
+ end
444
+ it 'handles dot by itself', :pending => "decide what to do with dot by itself" do
445
+ p('.').normalized_pattern.should == '.'
446
+ p('.').exact_path.should == '.'
447
+ p('.').match?('.').should be_true
448
+ p('./').normalized_pattern.should == '.'
449
+ p('./').exact_path.should == '.'
450
+ p('./').match?('.').should be_true
451
+ end
452
+ it 'handles dotdot' do
453
+ p('abc/../def').normalized_pattern.should == 'def'
454
+ p('abc/../def').exact_path.should == 'def'
455
+ p('abc/../def').match?('def').should be_true
456
+ p('abc/def/../..').normalized_pattern.should == ''
457
+ p('abc/def/../..').exact_path.should == ''
458
+ p('abc/def/../..').match?('').should be_true
459
+ p('/*/../def').normalized_pattern.should == '/def'
460
+ p('/*/../def').exact_path.should == '/def'
461
+ p('/*/../def').match?('/def').should be_true
462
+ p('/*/*/../def').normalized_pattern.should == '/*/def'
463
+ p('/*/*/../def').exact_path.should be_nil
464
+ p('/*/*/../def').match?('/abc/def').should be_true
465
+ p('/abc/def/../..').normalized_pattern.should == '/'
466
+ p('/abc/def/../..').exact_path.should == '/'
467
+ p('/abc/def/../..').match?('/').should be_true
468
+ p('abc/../../def').normalized_pattern.should == '../def'
469
+ p('abc/../../def').exact_path.should == '../def'
470
+ p('abc/../../def').match?('../def').should be_true
471
+ end
472
+ it 'handles dotdot with double star' do
473
+ p('abc**/def/../ghi').exact_path.should be_nil
474
+ p('abc**/def/../ghi').match?('abc/ghi').should be_true
475
+ p('abc**/def/../ghi').match?('abc/x/y/z/ghi').should be_true
476
+ p('abc**/def/../ghi').match?('ghi').should be_false
477
+ end
478
+ it 'raises error on dotdot with overlapping double star' do
479
+ lambda { Chef::ChefFS::FilePattern.new('abc/**/../def').exact_path }.should raise_error(ArgumentError)
480
+ lambda { Chef::ChefFS::FilePattern.new('abc/**/abc/../../def').exact_path }.should raise_error(ArgumentError)
481
+ end
482
+ it 'handles leading dotdot' do
483
+ p('../abc/def').exact_path.should == '../abc/def'
484
+ p('../abc/def').match?('../abc/def').should be_true
485
+ p('/../abc/def').exact_path.should == '/abc/def'
486
+ p('/../abc/def').match?('/abc/def').should be_true
487
+ p('..').exact_path.should == '..'
488
+ p('..').match?('..').should be_true
489
+ p('/..').exact_path.should == '/'
490
+ p('/..').match?('/').should be_true
491
+ end
492
+ end
493
+
494
+
495
+ # match?
496
+ # - single element matches (empty, fixed, ?, *, characters, escapes)
497
+ # - nested matches
498
+ # - absolute matches
499
+ # - trailing slashes
500
+ # - **
501
+
502
+ # exact_path
503
+ # - empty
504
+ # - single element and nested matches, with escapes
505
+ # - absolute and relative
506
+ # - ?, *, characters, **
507
+
508
+ # could_match_children?
509
+ #
510
+ #
511
+ #
512
+ #
513
+ context 'with pattern "abc"' do
514
+ end
515
+
516
+ context 'with pattern "/abc"' do
517
+ end
518
+
519
+ context 'with pattern "abc/def/ghi"' do
520
+ end
521
+
522
+ context 'with pattern "/abc/def/ghi"' do
523
+ end
524
+
525
+ # Exercise the different methods to their maximum
526
+ end