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.
- data/CONTRIBUTING.md +155 -0
- data/README.md +89 -0
- data/Rakefile +2 -2
- data/bin/chef-apply +25 -0
- data/bin/chef-shell +34 -0
- data/bin/chef-solo +0 -2
- data/bin/shef +6 -5
- data/lib/chef.rb +2 -4
- data/spec/data/big_json.json +2 -1
- data/spec/data/big_json_plus_one.json +2 -1
- data/spec/data/cookbooks/chefignore +2 -0
- data/spec/data/cookbooks/openldap/attributes/default.rb +10 -9
- data/spec/data/cookbooks/openldap/attributes/smokey.rb +1 -1
- data/spec/data/git_bundles/sinatra-test-app-with-callback-files.gitbundle +0 -0
- data/spec/data/git_bundles/sinatra-test-app-with-symlinks.gitbundle +0 -0
- data/spec/data/git_bundles/sinatra-test-app.gitbundle +0 -0
- data/spec/data/lwrp/providers/inline_compiler.rb +26 -0
- data/spec/data/nodes/default.rb +3 -3
- data/spec/data/nodes/test.example.com.rb +3 -3
- data/spec/data/nodes/test.rb +3 -3
- data/spec/data/partial_one.erb +1 -0
- data/spec/data/run_context/cookbooks/circular-dep1/attributes/default.rb +4 -0
- data/spec/data/run_context/cookbooks/circular-dep1/definitions/circular_dep1_res.rb +1 -0
- data/spec/data/run_context/cookbooks/circular-dep1/libraries/lib.rb +2 -0
- data/spec/data/run_context/cookbooks/circular-dep1/metadata.rb +2 -0
- data/spec/data/run_context/cookbooks/circular-dep1/providers/provider.rb +1 -0
- data/spec/data/run_context/cookbooks/circular-dep1/recipes/default.rb +0 -0
- data/spec/data/run_context/cookbooks/circular-dep1/resources/resource.rb +1 -0
- data/spec/data/run_context/cookbooks/circular-dep2/attributes/default.rb +3 -0
- data/spec/data/run_context/cookbooks/circular-dep2/definitions/circular_dep2_res.rb +1 -0
- data/spec/data/run_context/cookbooks/circular-dep2/libraries/lib.rb +2 -0
- data/spec/data/run_context/cookbooks/circular-dep2/metadata.rb +2 -0
- data/spec/data/run_context/cookbooks/circular-dep2/providers/provider.rb +1 -0
- data/spec/data/run_context/cookbooks/circular-dep2/recipes/default.rb +0 -0
- data/spec/data/run_context/cookbooks/circular-dep2/resources/resource.rb +1 -0
- data/spec/data/run_context/cookbooks/dependency1/attributes/aa_first.rb +2 -0
- data/spec/data/run_context/cookbooks/dependency1/attributes/default.rb +2 -0
- data/spec/data/run_context/cookbooks/dependency1/attributes/zz_last.rb +3 -0
- data/spec/data/run_context/cookbooks/dependency1/definitions/dependency1_res.rb +1 -0
- data/spec/data/run_context/cookbooks/dependency1/libraries/lib.rb +2 -0
- data/spec/data/run_context/cookbooks/dependency1/providers/provider.rb +1 -0
- data/spec/data/run_context/cookbooks/dependency1/recipes/default.rb +0 -0
- data/spec/data/run_context/cookbooks/dependency1/resources/resource.rb +1 -0
- data/spec/data/run_context/cookbooks/dependency2/attributes/default.rb +3 -0
- data/spec/data/run_context/cookbooks/dependency2/definitions/dependency2_res.rb +1 -0
- data/spec/data/run_context/cookbooks/dependency2/libraries/lib.rb +2 -0
- data/spec/data/run_context/cookbooks/dependency2/providers/provider.rb +1 -0
- data/spec/data/run_context/cookbooks/dependency2/recipes/default.rb +0 -0
- data/spec/data/run_context/cookbooks/dependency2/resources/resource.rb +1 -0
- data/spec/data/run_context/cookbooks/no-default-attr/attributes/server.rb +3 -0
- data/spec/data/run_context/cookbooks/no-default-attr/definitions/no_default-attr_res.rb +1 -0
- data/spec/data/run_context/cookbooks/no-default-attr/providers/provider.rb +1 -0
- data/spec/data/run_context/cookbooks/no-default-attr/recipes/default.rb +0 -0
- data/spec/data/run_context/cookbooks/no-default-attr/resources/resource.rb +1 -0
- data/spec/data/run_context/cookbooks/test-with-circular-deps/attributes/default.rb +3 -0
- data/spec/data/run_context/cookbooks/test-with-circular-deps/definitions/test_with-circular-deps_res.rb +1 -0
- data/spec/data/run_context/cookbooks/test-with-circular-deps/libraries/lib.rb +2 -0
- data/spec/data/run_context/cookbooks/test-with-circular-deps/metadata.rb +2 -0
- data/spec/data/run_context/cookbooks/test-with-circular-deps/providers/provider.rb +1 -0
- data/spec/data/run_context/cookbooks/test-with-circular-deps/recipes/default.rb +0 -0
- data/spec/data/run_context/cookbooks/test-with-circular-deps/resources/resource.rb +1 -0
- data/spec/data/run_context/cookbooks/test-with-deps/attributes/default.rb +3 -0
- data/spec/data/run_context/cookbooks/test-with-deps/definitions/test_with-deps_res.rb +1 -0
- data/spec/data/run_context/cookbooks/test-with-deps/libraries/lib.rb +1 -0
- data/spec/data/run_context/cookbooks/test-with-deps/metadata.rb +3 -0
- data/spec/data/run_context/cookbooks/test-with-deps/providers/provider.rb +1 -0
- data/spec/data/run_context/cookbooks/test-with-deps/recipes/default.rb +0 -0
- data/spec/data/run_context/cookbooks/test-with-deps/recipes/server.rb +0 -0
- data/spec/data/run_context/cookbooks/test-with-deps/resources/resource.rb +1 -0
- data/spec/data/run_context/cookbooks/test/attributes/default.rb +0 -0
- data/spec/data/run_context/cookbooks/test/attributes/george.rb +1 -1
- data/spec/data/run_context/cookbooks/test/definitions/test_res.rb +1 -0
- data/spec/data/run_context/cookbooks/test/providers/provider.rb +1 -0
- data/spec/data/run_context/cookbooks/test/resources/resource.rb +1 -0
- data/spec/data/shef-config.rb +10 -0
- data/spec/functional/dsl/registry_helper_spec.rb +63 -0
- data/spec/functional/knife/cookbook_delete_spec.rb +0 -2
- data/spec/functional/knife/exec_spec.rb +4 -6
- data/spec/functional/knife/smoke_test.rb +34 -0
- data/spec/functional/knife/ssh_spec.rb +64 -3
- data/spec/functional/resource/cookbook_file_spec.rb +33 -2
- data/spec/functional/resource/deploy_revision_spec.rb +515 -0
- data/spec/functional/resource/directory_spec.rb +4 -0
- data/spec/functional/resource/file_spec.rb +56 -22
- data/spec/functional/resource/link_spec.rb +12 -10
- data/spec/functional/resource/registry_spec.rb +572 -0
- data/spec/functional/resource/remote_directory_spec.rb +142 -36
- data/spec/functional/resource/remote_file_spec.rb +28 -3
- data/spec/functional/resource/template_spec.rb +23 -2
- data/spec/functional/run_lock_spec.rb +238 -0
- data/spec/functional/shell_spec.rb +101 -0
- data/spec/functional/tiny_server_spec.rb +5 -4
- data/spec/functional/win32/registry_helper_spec.rb +632 -0
- data/spec/functional/win32/security_spec.rb +37 -0
- data/spec/spec_helper.rb +15 -3
- data/spec/stress/win32/security_spec.rb +5 -5
- data/spec/support/chef_helpers.rb +14 -3
- data/spec/support/lib/chef/resource/cat.rb +3 -5
- data/spec/support/lib/chef/resource/one_two_three_four.rb +8 -10
- data/spec/support/lib/chef/resource/zen_master.rb +8 -10
- data/spec/support/matchers/leak.rb +1 -1
- data/spec/support/platform_helpers.rb +18 -0
- data/spec/support/shared/functional/directory_resource.rb +85 -23
- data/spec/support/shared/functional/file_resource.rb +198 -53
- data/spec/support/shared/functional/securable_resource.rb +140 -105
- data/spec/support/shared/functional/securable_resource_with_reporting.rb +375 -0
- data/spec/support/shared/unit/file_system_support.rb +110 -0
- data/spec/support/shared/unit/platform_introspector.rb +162 -0
- data/spec/tiny_server.rb +29 -10
- data/spec/unit/api_client/registration_spec.rb +172 -0
- data/spec/unit/api_client_spec.rb +156 -103
- data/spec/unit/application/apply.rb +84 -0
- data/spec/unit/application/knife_spec.rb +5 -0
- data/spec/unit/application_spec.rb +57 -2
- data/spec/unit/chef_fs/diff_spec.rb +329 -0
- data/spec/unit/chef_fs/file_pattern_spec.rb +526 -0
- data/spec/unit/chef_fs/file_system/chef_server_root_dir_spec.rb +237 -0
- data/spec/unit/chef_fs/file_system/cookbooks_dir_spec.rb +568 -0
- data/spec/unit/chef_fs/file_system/data_bags_dir_spec.rb +220 -0
- data/spec/unit/chef_fs/file_system_spec.rb +136 -0
- data/spec/unit/client_spec.rb +188 -16
- data/spec/unit/config_spec.rb +54 -4
- data/spec/unit/cookbook/chefignore_spec.rb +2 -1
- data/spec/unit/cookbook/syntax_check_spec.rb +48 -109
- data/spec/unit/cookbook_loader_spec.rb +153 -91
- data/spec/unit/cookbook_manifest_spec.rb +81 -81
- data/spec/unit/cookbook_spec.rb +3 -20
- data/spec/unit/cookbook_version_spec.rb +23 -122
- data/spec/unit/digester_spec.rb +50 -0
- data/spec/unit/dsl/data_query_spec.rb +66 -0
- data/spec/unit/dsl/platform_introspection_spec.rb +130 -0
- data/spec/unit/dsl/regsitry_helper_spec.rb +55 -0
- data/spec/unit/encrypted_data_bag_item_spec.rb +126 -10
- data/spec/unit/environment_spec.rb +0 -130
- data/spec/unit/exceptions_spec.rb +2 -3
- data/spec/unit/formatters/error_inspectors/resource_failure_inspector_spec.rb +23 -3
- data/spec/unit/json_compat_spec.rb +69 -0
- data/spec/unit/knife/bootstrap_spec.rb +81 -28
- data/spec/unit/knife/client_reregister_spec.rb +23 -22
- data/spec/unit/knife/configure_spec.rb +29 -26
- data/spec/unit/knife/cookbook_metadata_spec.rb +11 -4
- data/spec/unit/knife/cookbook_site_install_spec.rb +12 -2
- data/spec/unit/knife/cookbook_test_spec.rb +1 -0
- data/spec/unit/knife/cookbook_upload_spec.rb +41 -2
- data/spec/unit/knife/core/bootstrap_context_spec.rb +8 -1
- data/spec/unit/knife/core/ui_spec.rb +156 -7
- data/spec/unit/knife/data_bag_create_spec.rb +14 -0
- data/spec/unit/knife/data_bag_edit_spec.rb +14 -4
- data/spec/unit/knife/data_bag_from_file_spec.rb +17 -5
- data/spec/unit/knife/data_bag_show_spec.rb +11 -4
- data/spec/unit/knife/index_rebuild_spec.rb +96 -33
- data/spec/unit/knife/knife_help.rb +7 -7
- data/spec/unit/knife/node_run_list_remove_spec.rb +2 -1
- data/spec/unit/knife/ssh_spec.rb +121 -15
- data/spec/unit/knife/status_spec.rb +2 -2
- data/spec/unit/knife/user_create_spec.rb +86 -0
- data/spec/unit/knife/user_delete_spec.rb +39 -0
- data/spec/unit/knife/user_edit_spec.rb +42 -0
- data/spec/unit/knife/user_list_spec.rb +32 -0
- data/spec/unit/knife/user_reregister_spec.rb +53 -0
- data/spec/unit/knife/user_show_spec.rb +41 -0
- data/spec/unit/knife_spec.rb +53 -0
- data/spec/unit/lwrp_spec.rb +59 -17
- data/spec/unit/mixin/checksum_spec.rb +2 -2
- data/spec/unit/mixin/deep_merge_spec.rb +56 -491
- data/spec/unit/mixin/deprecation_spec.rb +23 -0
- data/spec/unit/mixin/enforce_ownership_and_permissions_spec.rb +6 -1
- data/spec/unit/mixin/params_validate_spec.rb +4 -2
- data/spec/unit/mixin/securable_spec.rb +5 -3
- data/spec/unit/mixin/template_spec.rb +119 -0
- data/spec/unit/node/attribute_spec.rb +272 -137
- data/spec/unit/node/immutable_collections_spec.rb +139 -0
- data/spec/unit/node_spec.rb +411 -339
- data/spec/unit/platform_spec.rb +8 -8
- data/spec/unit/provider/breakpoint_spec.rb +8 -8
- data/spec/unit/provider/cookbook_file_spec.rb +4 -8
- data/spec/unit/provider/deploy/revision_spec.rb +2 -8
- data/spec/unit/provider/deploy_spec.rb +6 -40
- data/spec/unit/provider/directory_spec.rb +103 -68
- data/spec/unit/provider/erl_call_spec.rb +0 -2
- data/spec/unit/provider/file_spec.rb +69 -59
- data/spec/unit/provider/git_spec.rb +0 -10
- data/spec/unit/provider/group/groupadd_spec.rb +1 -1
- data/spec/unit/provider/group/usermod_spec.rb +2 -2
- data/spec/unit/provider/http_request_spec.rb +28 -69
- data/spec/unit/provider/ifconfig_spec.rb +2 -2
- data/spec/unit/provider/link_spec.rb +1 -1
- data/spec/unit/provider/ohai_spec.rb +4 -4
- data/spec/unit/provider/package/apt_spec.rb +0 -1
- data/spec/unit/provider/package/ips_spec.rb +0 -1
- data/spec/unit/provider/package/rubygems_spec.rb +0 -18
- data/spec/unit/provider/package/yum_spec.rb +79 -15
- data/spec/unit/provider/package_spec.rb +7 -5
- data/spec/unit/provider/registry_key_spec.rb +269 -0
- data/spec/unit/provider/remote_directory_spec.rb +24 -7
- data/spec/unit/provider/remote_file_spec.rb +36 -0
- data/spec/unit/provider/route_spec.rb +3 -6
- data/spec/unit/provider/ruby_block_spec.rb +8 -0
- data/spec/unit/provider/service/arch_service_spec.rb +4 -4
- data/spec/unit/provider/service/debian_service_spec.rb +1 -1
- data/spec/unit/provider/service/freebsd_service_spec.rb +4 -4
- data/spec/unit/provider/service/init_service_spec.rb +26 -3
- data/spec/unit/provider/service/insserv_service_spec.rb +1 -1
- data/spec/unit/provider/service/invokercd_service_spec.rb +3 -3
- data/spec/unit/provider/service/redhat_spec.rb +1 -1
- data/spec/unit/provider/service/simple_service_spec.rb +3 -3
- data/spec/unit/provider/service/upstart_service_spec.rb +7 -7
- data/spec/unit/provider/service_spec.rb +2 -2
- data/spec/unit/provider/subversion_spec.rb +1 -1
- data/spec/unit/provider/template_spec.rb +35 -11
- data/spec/unit/provider/user/dscl_spec.rb +57 -31
- data/spec/unit/provider/user_spec.rb +7 -16
- data/spec/unit/provider_spec.rb +4 -3
- data/spec/unit/recipe_spec.rb +10 -8
- data/spec/unit/registry_helper_spec.rb +376 -0
- data/spec/unit/resource/log_spec.rb +9 -0
- data/spec/unit/resource/registry_key_spec.rb +171 -0
- data/spec/unit/resource/remote_file_spec.rb +21 -23
- data/spec/unit/resource/ruby_block_spec.rb +7 -3
- data/spec/unit/resource/service_spec.rb +11 -0
- data/spec/unit/resource_spec.rb +27 -4
- data/spec/unit/rest/auth_credentials_spec.rb +2 -14
- data/spec/unit/rest_spec.rb +122 -187
- data/spec/unit/run_context/cookbook_compiler_spec.rb +181 -0
- data/spec/unit/run_context_spec.rb +18 -4
- data/spec/unit/run_list_spec.rb +0 -209
- data/spec/unit/run_lock_spec.rb +37 -0
- data/spec/unit/runner_spec.rb +101 -2
- data/spec/unit/scan_access_control_spec.rb +4 -4
- data/spec/unit/{shef → shell}/model_wrapper_spec.rb +5 -5
- data/spec/unit/{shef/shef_ext_spec.rb → shell/shell_ext_spec.rb} +21 -21
- data/spec/unit/{shef/shef_session_spec.rb → shell/shell_session_spec.rb} +12 -12
- data/spec/unit/shell_out_spec.rb +18 -0
- data/spec/unit/{shef_spec.rb → shell_spec.rb} +20 -20
- data/spec/unit/user_spec.rb +255 -0
- metadata +162 -157
- data/README.rdoc +0 -177
- data/spec/unit/certificate_spec.rb +0 -76
- data/spec/unit/checksum_cache_spec.rb +0 -209
- data/spec/unit/checksum_spec.rb +0 -94
- data/spec/unit/couchdb_spec.rb +0 -274
- data/spec/unit/index_queue_spec.rb +0 -391
- data/spec/unit/json_compat_spect.rb +0 -53
- data/spec/unit/mixin/language_spec.rb +0 -305
- data/spec/unit/openid_registration_spec.rb +0 -153
- data/spec/unit/solr_query/query_transform_spec.rb +0 -454
- data/spec/unit/solr_query/solr_http_request_spec.rb +0 -244
- data/spec/unit/solr_query_spec.rb +0 -203
- 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
|