r10k 3.14.1 → 5.0.1
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.
- checksums.yaml +4 -4
- data/.github/dependabot.yml +17 -0
- data/.github/workflows/docker.yml +9 -4
- data/.github/workflows/release.yml +3 -2
- data/.github/workflows/rspec_tests.yml +8 -10
- data/CHANGELOG.mkd +100 -0
- data/CODEOWNERS +1 -2
- data/Gemfile +2 -2
- data/README.mkd +18 -19
- data/doc/common-patterns.mkd +1 -2
- data/doc/dynamic-environments/configuration.mkd +91 -12
- data/doc/dynamic-environments/usage.mkd +4 -0
- data/doc/dynamic-environments/workflow-guide.mkd +3 -3
- data/doc/faq.mkd +1 -1
- data/doc/puppetfile.mkd +9 -3
- data/integration/Gemfile +3 -4
- data/integration/Rakefile +58 -23
- data/integration/files/pre-suite/git_config.pp.erb +1 -1
- data/integration/pre-suite/00_pe_install.rb +3 -0
- data/integration/pre-suite/10_git_config.rb +1 -3
- data/integration/tests/Puppetfile/HTTP_PROXY_affects_git_source.rb +5 -4
- data/integration/tests/basic_functionality/negative/negative_bad_proxy.rb +1 -1
- data/integration/tests/basic_functionality/proxy_specified_in_configuration.rb +2 -2
- data/integration/tests/basic_functionality/proxy_with_puppetfile.rb +2 -2
- data/integration/tests/basic_functionality/rugged_git_provider_with_ssh.rb +3 -3
- data/integration/tests/basic_functionality/rugged_git_provider_without_ssh.rb +3 -3
- data/integration/tests/command_line/deploy_env_without_mod_update.rb +0 -3
- data/integration/tests/command_line/negative/neg_deploy_env_with_module_update.rb +0 -3
- data/integration/tests/git_source/HTTP_proxy_and_git_source.rb +5 -10
- data/integration/tests/git_source/git_source_git.rb +1 -4
- data/integration/tests/git_source/git_source_repeated_remote.rb +2 -5
- data/integration/tests/git_source/git_source_submodule.rb +1 -1
- data/integration/tests/git_source/negative/neg_git_unauthorized_ssh.rb +1 -1
- data/integration/tests/purging/content_not_purged_at_root.rb +2 -5
- data/integration/tests/purging/default_purging.rb +0 -3
- data/integration/tests/purging/{does_not_purge_files_on_white_list.rb → does_not_purge_files_on_allowlist.rb} +2 -5
- data/integration/tests/user_scenario/basic_workflow/multi_env_custom_forge_git_module.rb +1 -4
- data/integration/tests/user_scenario/basic_workflow/multi_env_custom_forge_git_module_static.rb +1 -4
- data/integration/tests/user_scenario/basic_workflow/multi_source_custom_forge_git_module.rb +1 -4
- data/integration/tests/user_scenario/basic_workflow/negative/neg_bad_forge_module.rb +0 -3
- data/integration/tests/user_scenario/basic_workflow/negative/neg_bad_git_module.rb +1 -1
- data/integration/tests/user_scenario/basic_workflow/negative/neg_bad_git_module_ref.rb +1 -1
- data/integration/tests/user_scenario/basic_workflow/negative/neg_disk_full.rb +1 -1
- data/integration/tests/user_scenario/basic_workflow/negative/neg_duplicate_module_names.rb +0 -3
- data/integration/tests/user_scenario/basic_workflow/negative/neg_inaccessible_forge.rb +3 -2
- data/integration/tests/user_scenario/basic_workflow/negative/neg_specify_deleted_forge_module.rb +1 -5
- data/integration/tests/user_scenario/basic_workflow/single_env_10000_files.rb +1 -1
- data/integration/tests/user_scenario/basic_workflow/single_env_custom_forge_git_module.rb +1 -4
- data/integration/tests/user_scenario/basic_workflow/single_env_custom_forge_module.rb +0 -3
- data/integration/tests/user_scenario/basic_workflow/single_env_large_files.rb +1 -1
- data/integration/tests/user_scenario/basic_workflow/single_env_module_already_installed.rb +0 -3
- data/integration/tests/user_scenario/basic_workflow/single_env_purge_unmanaged_modules.rb +0 -3
- data/integration/tests/user_scenario/basic_workflow/single_env_switch_forge_git_module.rb +1 -4
- data/integration/tests/user_scenario/basic_workflow/single_env_upgrade_forge_mod_revert_change.rb +0 -3
- data/integration/tests/user_scenario/complex_workflow/multi_env_add_change_remove.rb +0 -3
- data/lib/r10k/action/deploy/environment.rb +2 -19
- data/lib/r10k/action/deploy/module.rb +1 -0
- data/lib/r10k/action/puppetfile/check.rb +7 -0
- data/lib/r10k/action/puppetfile/install.rb +3 -1
- data/lib/r10k/cli/deploy.rb +15 -1
- data/lib/r10k/cli/puppetfile.rb +1 -0
- data/lib/r10k/content_synchronizer.rb +7 -2
- data/lib/r10k/environment/with_modules.rb +24 -1
- data/lib/r10k/environment.rb +0 -1
- data/lib/r10k/git/rugged/bare_repository.rb +5 -4
- data/lib/r10k/git/rugged/thin_repository.rb +7 -0
- data/lib/r10k/git/rugged/working_repository.rb +13 -7
- data/lib/r10k/git/shellgit/thin_repository.rb +5 -1
- data/lib/r10k/git/shellgit/working_repository.rb +5 -4
- data/lib/r10k/git/stateful_repository.rb +4 -4
- data/lib/r10k/module/base.rb +3 -3
- data/lib/r10k/module/git.rb +19 -5
- data/lib/r10k/module_loader/puppetfile/dsl.rb +4 -0
- data/lib/r10k/module_loader/puppetfile.rb +22 -14
- data/lib/r10k/puppetfile.rb +1 -1
- data/lib/r10k/settings/container.rb +1 -0
- data/lib/r10k/settings.rb +6 -7
- data/lib/r10k/tarball.rb +1 -1
- data/lib/r10k/version.rb +1 -1
- data/locales/r10k.pot +34 -82
- data/r10k.gemspec +8 -18
- metadata +40 -213
- data/.github/workflows/stale.yml +0 -21
- data/.travis.yml +0 -42
- data/docker/.gitignore +0 -1
- data/docker/.rspec +0 -4
- data/docker/Gemfile +0 -11
- data/docker/Makefile +0 -92
- data/docker/README.md +0 -28
- data/docker/docker-compose.yml +0 -18
- data/docker/r10k/Dockerfile +0 -68
- data/docker/r10k/adduser.sh +0 -13
- data/docker/r10k/docker-entrypoint.d/10-analytics.sh +0 -30
- data/docker/r10k/docker-entrypoint.sh +0 -10
- data/docker/r10k/release.Dockerfile +0 -55
- data/docker/spec/dockerfile_spec.rb +0 -37
- data/docker/spec/fixtures/Puppetfile +0 -2
- data/integration/tests/basic_functionality/install_pe_only_module_with_puppetfile.rb +0 -83
- data/integration/tests/basic_functionality/proxy_with_pe_only_module.rb +0 -128
- data/integration/tests/purging/invalid_whitelist_types.rb +0 -63
- data/integration/tests/user_scenario/basic_workflow/negative/neg_module_specified_at_deleted_release.rb +0 -49
- data/integration/tests/user_scenario/basic_workflow/single_env_module_last_release_deleted.rb +0 -68
- data/lib/r10k/environment/bare.rb +0 -13
- data/spec/fixtures/empty/.empty +0 -0
- data/spec/fixtures/integration/git/puppet-boolean-bare.tar +0 -0
- data/spec/fixtures/module/forge/bad_module/metadata.json +0 -1
- data/spec/fixtures/module/forge/eight_hundred/Modulefile +0 -8
- data/spec/fixtures/module/forge/eight_hundred/metadata.json +0 -19
- data/spec/fixtures/tarball/tarball.tar.gz +0 -0
- data/spec/fixtures/unit/action/r10k.yaml +0 -5
- data/spec/fixtures/unit/action/r10k_cachedir.yaml +0 -2
- data/spec/fixtures/unit/action/r10k_creds.yaml +0 -9
- data/spec/fixtures/unit/action/r10k_forge_auth.yaml +0 -4
- data/spec/fixtures/unit/action/r10k_forge_auth_no_url.yaml +0 -3
- data/spec/fixtures/unit/action/r10k_generate_types.yaml +0 -3
- data/spec/fixtures/unit/action/r10k_logging.yaml +0 -12
- data/spec/fixtures/unit/action/r10k_puppet_path.yaml +0 -3
- data/spec/fixtures/unit/puppetfile/argument-error/Puppetfile +0 -1
- data/spec/fixtures/unit/puppetfile/default-branch-override/Puppetfile +0 -5
- data/spec/fixtures/unit/puppetfile/duplicate-module-error/Puppetfile +0 -10
- data/spec/fixtures/unit/puppetfile/forge-override/Puppetfile +0 -8
- data/spec/fixtures/unit/puppetfile/invalid-syntax/Puppetfile +0 -1
- data/spec/fixtures/unit/puppetfile/load-error/Puppetfile +0 -1
- data/spec/fixtures/unit/puppetfile/name-error/Puppetfile +0 -1
- data/spec/fixtures/unit/puppetfile/valid-forge-with-version/Puppetfile +0 -1
- data/spec/fixtures/unit/puppetfile/valid-forge-without-version/Puppetfile +0 -1
- data/spec/fixtures/unit/puppetfile/various-modules/Puppetfile +0 -10
- data/spec/fixtures/unit/puppetfile/various-modules/Puppetfile.new +0 -10
- data/spec/fixtures/unit/util/purgeable/managed_one/expected_1 +0 -0
- data/spec/fixtures/unit/util/purgeable/managed_one/managed_subdir_1/managed_symlink_file +0 -1
- data/spec/fixtures/unit/util/purgeable/managed_one/managed_subdir_1/subdir_allowlisted_2/ignored_1 +0 -0
- data/spec/fixtures/unit/util/purgeable/managed_one/managed_subdir_1/subdir_expected_1 +0 -0
- data/spec/fixtures/unit/util/purgeable/managed_one/managed_subdir_1/subdir_unmanaged_1 +0 -0
- data/spec/fixtures/unit/util/purgeable/managed_one/managed_subdir_1/unmanaged_symlink_dir +0 -1
- data/spec/fixtures/unit/util/purgeable/managed_one/managed_symlink_dir +0 -1
- data/spec/fixtures/unit/util/purgeable/managed_one/unmanaged_1 +0 -0
- data/spec/fixtures/unit/util/purgeable/managed_one/unmanaged_symlink_file +0 -1
- data/spec/fixtures/unit/util/purgeable/managed_two/.hidden/unmanaged_3 +0 -0
- data/spec/fixtures/unit/util/purgeable/managed_two/expected_2 +0 -0
- data/spec/fixtures/unit/util/purgeable/managed_two/unmanaged_2 +0 -0
- data/spec/fixtures/unit/util/subprocess/runner/no-execute.sh +0 -3
- data/spec/integration/git/rugged/bare_repository_spec.rb +0 -13
- data/spec/integration/git/rugged/cache_spec.rb +0 -33
- data/spec/integration/git/rugged/thin_repository_spec.rb +0 -14
- data/spec/integration/git/rugged/working_repository_spec.rb +0 -48
- data/spec/integration/git/shellgit/bare_repository_spec.rb +0 -13
- data/spec/integration/git/shellgit/thin_repository_spec.rb +0 -14
- data/spec/integration/git/shellgit/working_repository_spec.rb +0 -13
- data/spec/integration/git/stateful_repository_spec.rb +0 -159
- data/spec/integration/util/purageable_spec.rb +0 -41
- data/spec/matchers/exit_with.rb +0 -28
- data/spec/matchers/match_realpath.rb +0 -18
- data/spec/r10k-mocks/mock_config.rb +0 -33
- data/spec/r10k-mocks/mock_env.rb +0 -18
- data/spec/r10k-mocks/mock_source.rb +0 -17
- data/spec/r10k-mocks.rb +0 -3
- data/spec/shared-contexts/git-fixtures.rb +0 -55
- data/spec/shared-contexts/tarball.rb +0 -32
- data/spec/shared-examples/deploy-actions.rb +0 -69
- data/spec/shared-examples/git/bare_repository.rb +0 -132
- data/spec/shared-examples/git/thin_repository.rb +0 -26
- data/spec/shared-examples/git/working_repository.rb +0 -207
- data/spec/shared-examples/git-repository.rb +0 -38
- data/spec/shared-examples/puppetfile-action.rb +0 -39
- data/spec/shared-examples/settings/ancestry.rb +0 -44
- data/spec/shared-examples/subprocess-runner.rb +0 -89
- data/spec/spec_helper.rb +0 -41
- data/spec/unit/action/cri_runner_spec.rb +0 -72
- data/spec/unit/action/deploy/deploy_helpers_spec.rb +0 -38
- data/spec/unit/action/deploy/display_spec.rb +0 -61
- data/spec/unit/action/deploy/environment_spec.rb +0 -640
- data/spec/unit/action/deploy/module_spec.rb +0 -476
- data/spec/unit/action/puppetfile/check_spec.rb +0 -53
- data/spec/unit/action/puppetfile/cri_runner_spec.rb +0 -47
- data/spec/unit/action/puppetfile/install_spec.rb +0 -112
- data/spec/unit/action/puppetfile/purge_spec.rb +0 -60
- data/spec/unit/action/runner_spec.rb +0 -407
- data/spec/unit/action/visitor_spec.rb +0 -39
- data/spec/unit/cli_spec.rb +0 -9
- data/spec/unit/deployment/config_spec.rb +0 -33
- data/spec/unit/deployment_spec.rb +0 -162
- data/spec/unit/environment/bare_spec.rb +0 -13
- data/spec/unit/environment/base_spec.rb +0 -122
- data/spec/unit/environment/git_spec.rb +0 -114
- data/spec/unit/environment/name_spec.rb +0 -181
- data/spec/unit/environment/plain_spec.rb +0 -8
- data/spec/unit/environment/svn_spec.rb +0 -146
- data/spec/unit/environment/tarball_spec.rb +0 -45
- data/spec/unit/environment/with_modules_spec.rb +0 -75
- data/spec/unit/errors/formatting_spec.rb +0 -84
- data/spec/unit/feature_spec.rb +0 -50
- data/spec/unit/forge/module_release_spec.rb +0 -213
- data/spec/unit/git/alternates_spec.rb +0 -116
- data/spec/unit/git/cache_spec.rb +0 -66
- data/spec/unit/git/rugged/cache_spec.rb +0 -48
- data/spec/unit/git/rugged/credentials_spec.rb +0 -215
- data/spec/unit/git/shellgit/cache_spec.rb +0 -27
- data/spec/unit/git/stateful_repository_spec.rb +0 -45
- data/spec/unit/git_spec.rb +0 -102
- data/spec/unit/initializers_spec.rb +0 -68
- data/spec/unit/instance_cache_spec.rb +0 -78
- data/spec/unit/keyed_factory_spec.rb +0 -51
- data/spec/unit/logging/terminaloutputter_spec.rb +0 -53
- data/spec/unit/logging_spec.rb +0 -68
- data/spec/unit/module/base_spec.rb +0 -118
- data/spec/unit/module/forge_spec.rb +0 -271
- data/spec/unit/module/git_spec.rb +0 -387
- data/spec/unit/module/metadata_file_spec.rb +0 -68
- data/spec/unit/module/svn_spec.rb +0 -208
- data/spec/unit/module/tarball_spec.rb +0 -70
- data/spec/unit/module_loader/puppetfile_spec.rb +0 -421
- data/spec/unit/module_spec.rb +0 -114
- data/spec/unit/puppetfile_spec.rb +0 -304
- data/spec/unit/settings/collection_spec.rb +0 -123
- data/spec/unit/settings/container_spec.rb +0 -92
- data/spec/unit/settings/definition_spec.rb +0 -79
- data/spec/unit/settings/enum_definition_spec.rb +0 -20
- data/spec/unit/settings/inheritance_spec.rb +0 -38
- data/spec/unit/settings/list_spec.rb +0 -88
- data/spec/unit/settings/loader_spec.rb +0 -110
- data/spec/unit/settings/uri_definition_spec.rb +0 -23
- data/spec/unit/settings_spec.rb +0 -303
- data/spec/unit/source/base_spec.rb +0 -31
- data/spec/unit/source/exec_spec.rb +0 -81
- data/spec/unit/source/git_spec.rb +0 -233
- data/spec/unit/source/hash_spec.rb +0 -54
- data/spec/unit/source/svn_spec.rb +0 -196
- data/spec/unit/source/yaml_spec.rb +0 -42
- data/spec/unit/source_spec.rb +0 -10
- data/spec/unit/svn/remote_spec.rb +0 -21
- data/spec/unit/svn/working_dir_spec.rb +0 -56
- data/spec/unit/tarball_spec.rb +0 -57
- data/spec/unit/util/attempt_spec.rb +0 -82
- data/spec/unit/util/cacheable_spec.rb +0 -23
- data/spec/unit/util/commands_spec.rb +0 -61
- data/spec/unit/util/downloader_spec.rb +0 -98
- data/spec/unit/util/exec_env_spec.rb +0 -56
- data/spec/unit/util/purgeable_spec.rb +0 -267
- data/spec/unit/util/setopts_spec.rb +0 -83
- data/spec/unit/util/subprocess/result_spec.rb +0 -36
- data/spec/unit/util/subprocess/runner/posix_spec.rb +0 -7
- data/spec/unit/util/subprocess/runner/pump_spec.rb +0 -79
- data/spec/unit/util/subprocess/runner/windows_spec.rb +0 -7
- data/spec/unit/util/subprocess/subprocess_error_spec.rb +0 -26
- data/spec/unit/util/subprocess_spec.rb +0 -65
- data/spec/unit/util/symbolize_keys_spec.rb +0 -67
@@ -1,146 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
require 'r10k/environment'
|
3
|
-
|
4
|
-
describe R10K::Environment::SVN do
|
5
|
-
|
6
|
-
subject do
|
7
|
-
described_class.new(
|
8
|
-
'myenv',
|
9
|
-
'/some/nonexistent/environmentdir',
|
10
|
-
'svn-dirname',
|
11
|
-
{
|
12
|
-
:remote => 'https://svn-server.site/svn-repo/trunk'
|
13
|
-
}
|
14
|
-
)
|
15
|
-
end
|
16
|
-
|
17
|
-
let(:working_dir) { subject.working_dir }
|
18
|
-
|
19
|
-
describe "initializing" do
|
20
|
-
subject do
|
21
|
-
described_class.new('name', '/dir', 'ref', {
|
22
|
-
:puppetfile_name => 'Puppetfile',
|
23
|
-
})
|
24
|
-
end
|
25
|
-
|
26
|
-
it "accepts valid base class initialization arguments" do
|
27
|
-
expect(subject.name).to eq 'name'
|
28
|
-
end
|
29
|
-
end
|
30
|
-
|
31
|
-
describe "storing attributes" do
|
32
|
-
it "can return the environment name" do
|
33
|
-
expect(subject.name).to eq 'myenv'
|
34
|
-
end
|
35
|
-
|
36
|
-
it "can return the environment basedir" do
|
37
|
-
expect(subject.basedir).to eq '/some/nonexistent/environmentdir'
|
38
|
-
end
|
39
|
-
|
40
|
-
it "can return the environment dirname" do
|
41
|
-
expect(subject.dirname).to eq 'svn-dirname'
|
42
|
-
end
|
43
|
-
|
44
|
-
it "can return the environment remote" do
|
45
|
-
expect(subject.remote).to eq 'https://svn-server.site/svn-repo/trunk'
|
46
|
-
end
|
47
|
-
end
|
48
|
-
|
49
|
-
describe "synchronizing the environment" do
|
50
|
-
it "checks out the working directory when creating a new environment" do
|
51
|
-
allow(working_dir).to receive(:is_svn?).and_return(false)
|
52
|
-
expect(working_dir).to receive(:checkout)
|
53
|
-
subject.sync
|
54
|
-
end
|
55
|
-
|
56
|
-
it "updates the working directory when updating an existing environment" do
|
57
|
-
allow(working_dir).to receive(:is_svn?).and_return(true)
|
58
|
-
expect(working_dir).to receive(:update)
|
59
|
-
subject.sync
|
60
|
-
end
|
61
|
-
end
|
62
|
-
|
63
|
-
describe "generating a puppetfile for the environment" do
|
64
|
-
let(:puppetfile) { subject.puppetfile }
|
65
|
-
|
66
|
-
it "creates a puppetfile at the full path to the environment" do
|
67
|
-
expect(puppetfile.basedir).to eq '/some/nonexistent/environmentdir/svn-dirname'
|
68
|
-
end
|
69
|
-
|
70
|
-
it "sets the moduledir to 'modules' relative to the environment path" do
|
71
|
-
expect(puppetfile.moduledir).to eq '/some/nonexistent/environmentdir/svn-dirname/modules'
|
72
|
-
end
|
73
|
-
|
74
|
-
it "sets the puppetfile path to 'Puppetfile' relative to the environment path" do
|
75
|
-
expect(puppetfile.puppetfile_path).to eq '/some/nonexistent/environmentdir/svn-dirname/Puppetfile'
|
76
|
-
end
|
77
|
-
end
|
78
|
-
|
79
|
-
describe "enumerating modules" do
|
80
|
-
it "loads the Puppetfile and returns modules in that puppetfile" do
|
81
|
-
loaded = { managed_directories: [], desired_contents: [], purge_exclusions: [] }
|
82
|
-
mod = double('A module', :name => 'dbl')
|
83
|
-
expect(subject.loader).to receive(:load).and_return(loaded.merge(modules: [mod]))
|
84
|
-
expect(subject.modules).to eq([mod])
|
85
|
-
end
|
86
|
-
end
|
87
|
-
|
88
|
-
describe "determining the status" do
|
89
|
-
it "is absent if the working directory is absent" do
|
90
|
-
expect(subject.path).to receive(:exist?).and_return(false)
|
91
|
-
expect(subject.status).to eq :absent
|
92
|
-
end
|
93
|
-
|
94
|
-
it "is mismatched if the working directory is not an SVN repo" do
|
95
|
-
expect(subject.path).to receive(:exist?).and_return(true)
|
96
|
-
expect(working_dir).to receive(:is_svn?).and_return(false)
|
97
|
-
expect(subject.status).to eq :mismatched
|
98
|
-
end
|
99
|
-
|
100
|
-
it "is mismatched if the working directory remote doesn't match the expected remote" do
|
101
|
-
expect(subject.path).to receive(:exist?).and_return(true)
|
102
|
-
expect(working_dir).to receive(:is_svn?).and_return(true)
|
103
|
-
expect(working_dir).to receive(:url).and_return 'https://svn-server.site/another-svn-repo/trunk'
|
104
|
-
expect(subject.status).to eq :mismatched
|
105
|
-
end
|
106
|
-
|
107
|
-
it "is outdated when the the working directory has not synced" do
|
108
|
-
expect(subject.path).to receive(:exist?).and_return(true)
|
109
|
-
expect(working_dir).to receive(:is_svn?).and_return(true)
|
110
|
-
expect(working_dir).to receive(:url).and_return 'https://svn-server.site/svn-repo/trunk'
|
111
|
-
expect(subject.status).to eq :outdated
|
112
|
-
end
|
113
|
-
|
114
|
-
it "is insync when the working directory has been synced" do
|
115
|
-
expect(subject.path).to receive(:exist?).and_return(true)
|
116
|
-
expect(working_dir).to receive(:is_svn?).twice.and_return(true)
|
117
|
-
expect(working_dir).to receive(:url).and_return 'https://svn-server.site/svn-repo/trunk'
|
118
|
-
|
119
|
-
expect(working_dir).to receive(:update)
|
120
|
-
|
121
|
-
subject.sync
|
122
|
-
|
123
|
-
expect(subject.status).to eq :insync
|
124
|
-
end
|
125
|
-
end
|
126
|
-
|
127
|
-
describe "environment signature" do
|
128
|
-
it "returns the svn revision of the branch" do
|
129
|
-
expect(working_dir).to receive(:revision).and_return '1337'
|
130
|
-
expect(subject.signature).to eq '1337'
|
131
|
-
end
|
132
|
-
end
|
133
|
-
|
134
|
-
describe "info hash" do
|
135
|
-
let(:info_hash) { subject.info }
|
136
|
-
|
137
|
-
before(:each) do
|
138
|
-
expect(working_dir).to receive(:revision).and_return '1337'
|
139
|
-
end
|
140
|
-
|
141
|
-
it "includes name and signature" do
|
142
|
-
expect(info_hash.keys).to include :name, :signature
|
143
|
-
expect(info_hash).not_to have_value(nil)
|
144
|
-
end
|
145
|
-
end
|
146
|
-
end
|
@@ -1,45 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
require 'r10k/environment'
|
3
|
-
|
4
|
-
describe R10K::Environment::Tarball do
|
5
|
-
let(:tgz_path) do
|
6
|
-
File.expand_path('spec/fixtures/tarball/tarball.tar.gz', PROJECT_ROOT)
|
7
|
-
end
|
8
|
-
|
9
|
-
let(:checksum) { '36afcfc2378b8235902d6e647fce7479da6898354d620388646c595a1155ed67' }
|
10
|
-
let(:base_params) { { source: tgz_path, version: checksum, modules: { } } }
|
11
|
-
|
12
|
-
subject { described_class.new('envname', '/some/imaginary/path', 'dirname', base_params) }
|
13
|
-
|
14
|
-
describe "initializing" do
|
15
|
-
it "accepts valid base class initialization arguments" do
|
16
|
-
expect(subject.name).to eq 'envname'
|
17
|
-
end
|
18
|
-
end
|
19
|
-
|
20
|
-
describe "storing attributes" do
|
21
|
-
it "can return the environment name" do
|
22
|
-
expect(subject.name).to eq 'envname'
|
23
|
-
end
|
24
|
-
|
25
|
-
it "can return the environment basedir" do
|
26
|
-
expect(subject.basedir).to eq '/some/imaginary/path'
|
27
|
-
end
|
28
|
-
|
29
|
-
it "can return the environment dirname" do
|
30
|
-
expect(subject.dirname).to eq 'dirname'
|
31
|
-
end
|
32
|
-
|
33
|
-
it "can return the environment path" do
|
34
|
-
expect(subject.path.to_s).to eq '/some/imaginary/path/dirname'
|
35
|
-
end
|
36
|
-
|
37
|
-
it "can return the environment source" do
|
38
|
-
expect(subject.tarball.source).to eq tgz_path
|
39
|
-
end
|
40
|
-
|
41
|
-
it "can return the environment version" do
|
42
|
-
expect(subject.tarball.checksum).to eq checksum
|
43
|
-
end
|
44
|
-
end
|
45
|
-
end
|
@@ -1,75 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
require 'r10k/environment'
|
3
|
-
|
4
|
-
describe R10K::Environment::WithModules do
|
5
|
-
subject do
|
6
|
-
described_class.new(
|
7
|
-
'release42',
|
8
|
-
'/some/nonexistent/environmentdir',
|
9
|
-
'prefix_release42',
|
10
|
-
{
|
11
|
-
:type => 'plain',
|
12
|
-
:modules => {
|
13
|
-
'puppetlabs-stdlib' => { local: true },
|
14
|
-
'puppetlabs-concat' => { local: true },
|
15
|
-
'puppetlabs-exec' => { local: true },
|
16
|
-
}
|
17
|
-
}.merge(subject_params)
|
18
|
-
)
|
19
|
-
end
|
20
|
-
|
21
|
-
# Default no additional params
|
22
|
-
let(:subject_params) { {} }
|
23
|
-
|
24
|
-
describe "dealing with module conflicts" do
|
25
|
-
context "with no module conflicts" do
|
26
|
-
it "validates when there are no conflicts" do
|
27
|
-
mod = instance_double('R10K::Module::Base', name: 'nonconflict', origin: :puppetfile)
|
28
|
-
expect(subject.module_conflicts?(mod)).to eq false
|
29
|
-
end
|
30
|
-
end
|
31
|
-
|
32
|
-
context "with module conflicts and default behavior" do
|
33
|
-
it "does not raise an error" do
|
34
|
-
mod = instance_double('R10K::Module::Base', name: 'stdlib', origin: :puppetfile)
|
35
|
-
expect(subject.logger).to receive(:warn).with(/Puppetfile.*both define.*ignored/i)
|
36
|
-
expect(subject.module_conflicts?(mod)).to eq true
|
37
|
-
end
|
38
|
-
end
|
39
|
-
|
40
|
-
context "with module conflicts and 'error' behavior" do
|
41
|
-
let(:subject_params) {{ :module_conflicts => 'error' }}
|
42
|
-
it "raises an error" do
|
43
|
-
mod = instance_double('R10K::Module::Base', name: 'stdlib', origin: :puppetfile)
|
44
|
-
expect { subject.module_conflicts?(mod) }.to raise_error(R10K::Error, /Puppetfile.*both define.*/i)
|
45
|
-
end
|
46
|
-
end
|
47
|
-
|
48
|
-
context "with module conflicts and 'override' behavior" do
|
49
|
-
let(:subject_params) {{ :module_conflicts => 'override' }}
|
50
|
-
it "does not raise an error" do
|
51
|
-
mod = instance_double('R10K::Module::Base', name: 'stdlib', origin: :puppetfile)
|
52
|
-
expect(subject.logger).to receive(:debug).with(/Puppetfile.*both define.*ignored/i)
|
53
|
-
expect(subject.module_conflicts?(mod)).to eq true
|
54
|
-
end
|
55
|
-
end
|
56
|
-
|
57
|
-
context "with module conflicts and invalid configuration" do
|
58
|
-
let(:subject_params) {{ :module_conflicts => 'batman' }}
|
59
|
-
it "raises an error" do
|
60
|
-
mod = instance_double('R10K::Module::Base', name: 'stdlib', origin: :puppetfile)
|
61
|
-
expect { subject.module_conflicts?(mod) }.to raise_error(R10K::Error, /Unexpected value.*module_conflicts.*/i)
|
62
|
-
end
|
63
|
-
end
|
64
|
-
end
|
65
|
-
|
66
|
-
describe "modules method" do
|
67
|
-
it "returns the configured modules, and Puppetfile modules" do
|
68
|
-
loaded = { managed_directories: [], desired_contents: [], purge_exclusions: [] }
|
69
|
-
puppetfile_mod = instance_double('R10K::Module::Base', name: 'zebra')
|
70
|
-
expect(subject.loader).to receive(:load).and_return(loaded.merge(modules: [puppetfile_mod]))
|
71
|
-
returned_modules = subject.modules
|
72
|
-
expect(returned_modules.map(&:name).sort).to eq(%w[concat exec stdlib zebra])
|
73
|
-
end
|
74
|
-
end
|
75
|
-
end
|
@@ -1,84 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
require 'r10k/errors/formatting'
|
3
|
-
|
4
|
-
describe R10K::Errors::Formatting do
|
5
|
-
|
6
|
-
describe "without a nested exception" do
|
7
|
-
let(:exc) do
|
8
|
-
ArgumentError.new("ArgumentError message").tap do |a|
|
9
|
-
a.set_backtrace(%w[/backtrace/line:1 /backtrace/line:2])
|
10
|
-
end
|
11
|
-
end
|
12
|
-
|
13
|
-
describe "and without a backtrace" do
|
14
|
-
subject do
|
15
|
-
described_class.format_exception(exc, false)
|
16
|
-
end
|
17
|
-
|
18
|
-
it "formats the exception with the message" do
|
19
|
-
expect(subject).to eq("ArgumentError message")
|
20
|
-
end
|
21
|
-
end
|
22
|
-
|
23
|
-
describe "and with a backtrace" do
|
24
|
-
subject do
|
25
|
-
described_class.format_exception(exc, true)
|
26
|
-
end
|
27
|
-
|
28
|
-
it "formats the exception with the message and backtrace" do
|
29
|
-
expect(subject).to eq([
|
30
|
-
"ArgumentError message",
|
31
|
-
"/backtrace/line:1",
|
32
|
-
"/backtrace/line:2",
|
33
|
-
].join("\n"))
|
34
|
-
end
|
35
|
-
end
|
36
|
-
end
|
37
|
-
|
38
|
-
describe "with a nested exception" do
|
39
|
-
|
40
|
-
let(:nestee) do
|
41
|
-
ArgumentError.new("ArgumentError message").tap do |a|
|
42
|
-
a.set_backtrace(%w[/backtrace/line:1 /backtrace/line:2])
|
43
|
-
end
|
44
|
-
end
|
45
|
-
|
46
|
-
let(:exc) do
|
47
|
-
R10K::Error.wrap(nestee, "R10K::Error message").tap do |r|
|
48
|
-
r.set_backtrace(%w[/another/backtrace/line:1 /another/backtrace/line:2])
|
49
|
-
end
|
50
|
-
end
|
51
|
-
|
52
|
-
describe "and without a backtrace" do
|
53
|
-
subject do
|
54
|
-
described_class.format_exception(exc, false)
|
55
|
-
end
|
56
|
-
|
57
|
-
it "formats the exception with the message and original message" do
|
58
|
-
expect(subject).to eq([
|
59
|
-
"R10K::Error message",
|
60
|
-
"Original exception:",
|
61
|
-
"ArgumentError message"
|
62
|
-
].join("\n"))
|
63
|
-
end
|
64
|
-
end
|
65
|
-
|
66
|
-
describe "and with a backtrace" do
|
67
|
-
subject do
|
68
|
-
described_class.format_exception(exc, true)
|
69
|
-
end
|
70
|
-
|
71
|
-
it "formats the exception with the message, backtrace, original message, and original backtrace" do
|
72
|
-
expect(subject).to eq([
|
73
|
-
"R10K::Error message",
|
74
|
-
"/another/backtrace/line:1",
|
75
|
-
"/another/backtrace/line:2",
|
76
|
-
"Original exception:",
|
77
|
-
"ArgumentError message",
|
78
|
-
"/backtrace/line:1",
|
79
|
-
"/backtrace/line:2",
|
80
|
-
].join("\n"))
|
81
|
-
end
|
82
|
-
end
|
83
|
-
end
|
84
|
-
end
|
data/spec/unit/feature_spec.rb
DELETED
@@ -1,50 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
require 'r10k/feature'
|
3
|
-
|
4
|
-
describe R10K::Feature do
|
5
|
-
describe "confining a feature to a library" do
|
6
|
-
it "is available if the library can be loaded" do
|
7
|
-
feature = described_class.new(:r10k, :libraries => 'r10k')
|
8
|
-
expect(feature.available?).to be_truthy
|
9
|
-
end
|
10
|
-
|
11
|
-
it "is unavailable if the library cannot be loaded" do
|
12
|
-
feature = described_class.new(:squidlibs, :libraries => 'squid/libs')
|
13
|
-
expect(feature.available?).to be_falsey
|
14
|
-
end
|
15
|
-
end
|
16
|
-
|
17
|
-
describe "confining a feature to a block" do
|
18
|
-
it "is available if the block is true" do
|
19
|
-
feature = described_class.new(:blockfeature) { true }
|
20
|
-
expect(feature.available?).to be_truthy
|
21
|
-
end
|
22
|
-
|
23
|
-
it "is unavailable if the block is false" do
|
24
|
-
feature = described_class.new(:blockfeature) { false }
|
25
|
-
expect(feature.available?).to be_falsey
|
26
|
-
end
|
27
|
-
end
|
28
|
-
|
29
|
-
describe "confining a feature to both a block and libraries" do
|
30
|
-
it "is unavailable if the block returns false and libraries are absent" do
|
31
|
-
feature = described_class.new(:nope, :libraries => 'nope/nope') { false }
|
32
|
-
expect(feature.available?).to be_falsey
|
33
|
-
end
|
34
|
-
|
35
|
-
it "is unavailable if the block returns true and libraries are absent" do
|
36
|
-
feature = described_class.new(:nope, :libraries => 'nope/nope') { true }
|
37
|
-
expect(feature.available?).to be_falsey
|
38
|
-
end
|
39
|
-
|
40
|
-
it "is unavailable if the block returns false and libraries are present" do
|
41
|
-
feature = described_class.new(:nope, :libraries => 'r10k') { false }
|
42
|
-
expect(feature.available?).to be_falsey
|
43
|
-
end
|
44
|
-
|
45
|
-
it "is available if the block returns true and libraries are present" do
|
46
|
-
feature = described_class.new(:yep, :libraries => 'r10k') { true }
|
47
|
-
expect(feature.available?).to be_truthy
|
48
|
-
end
|
49
|
-
end
|
50
|
-
end
|
@@ -1,213 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
require 'r10k/forge/module_release'
|
3
|
-
require 'r10k/util/exec_env'
|
4
|
-
require 'puppet_forge'
|
5
|
-
|
6
|
-
describe R10K::Forge::ModuleRelease do
|
7
|
-
subject { described_class.new('branan-eight_hundred', '8.0.0') }
|
8
|
-
|
9
|
-
let(:forge_release_class) { PuppetForge::V3::Release }
|
10
|
-
let(:sha256_digest_class) { Digest::SHA256 }
|
11
|
-
let(:md5_digest_class) { Digest::MD5 }
|
12
|
-
|
13
|
-
let(:download_path) { instance_double('Pathname') }
|
14
|
-
let(:tarball_cache_path) { instance_double('Pathname') }
|
15
|
-
let(:tarball_cache_root) { instance_double('Pathname') }
|
16
|
-
let(:unpack_path) { instance_double('Pathname') }
|
17
|
-
let(:target_dir) { instance_double('Pathname') }
|
18
|
-
let(:tarball_cache_path) { instance_double('Pathname') }
|
19
|
-
let(:md5_file_path) { instance_double('Pathname') }
|
20
|
-
let(:sha256_file_path) { instance_double('Pathname') }
|
21
|
-
|
22
|
-
let(:file_lists) { {:valid=>['valid_ex'], :invalid=>[], :symlinks=>['symlink_ex']} }
|
23
|
-
|
24
|
-
let(:file_contents) { "skeletor's closet" }
|
25
|
-
let(:sha256_digest) { instance_double('Digest::SHA256') }
|
26
|
-
let(:sha256_of_tarball) { "sha256_hash" }
|
27
|
-
let(:md5_digest) { instance_double('Digest::MD5') }
|
28
|
-
let(:md5_of_tarball) { "md5_hash" }
|
29
|
-
let(:good_md5) { md5_of_tarball }
|
30
|
-
let(:good_sha256) { sha256_of_tarball }
|
31
|
-
let(:bad_sha256) { "bad_sha256_hash" }
|
32
|
-
let(:bad_md5) { "bad_md5_hash" }
|
33
|
-
|
34
|
-
before do
|
35
|
-
subject.download_path = download_path
|
36
|
-
subject.tarball_cache_path = tarball_cache_path
|
37
|
-
subject.tarball_cache_root = tarball_cache_root
|
38
|
-
subject.unpack_path = unpack_path
|
39
|
-
subject.md5_file_path = md5_file_path
|
40
|
-
subject.sha256_file_path = sha256_file_path
|
41
|
-
end
|
42
|
-
|
43
|
-
context "no cached tarball" do
|
44
|
-
describe '#download' do
|
45
|
-
it "downloads the module from the forge into `download_path`" do
|
46
|
-
expect(tarball_cache_path).to receive(:exist?).and_return(false)
|
47
|
-
expect(subject.forge_release).to receive(:download).with(download_path)
|
48
|
-
allow(FileUtils).to receive(:mkdir_p).with(tarball_cache_root)
|
49
|
-
expect(FileUtils).to receive(:mv).with(download_path, tarball_cache_path)
|
50
|
-
subject.download
|
51
|
-
end
|
52
|
-
end
|
53
|
-
end
|
54
|
-
|
55
|
-
context "with cached tarball" do
|
56
|
-
describe '#download' do
|
57
|
-
it "does not download a new tarball" do
|
58
|
-
expect(tarball_cache_path).to receive(:exist?).and_return(true)
|
59
|
-
expect(subject.forge_release).not_to receive(:download).with(download_path)
|
60
|
-
subject.download
|
61
|
-
end
|
62
|
-
end
|
63
|
-
end
|
64
|
-
|
65
|
-
describe '#verify' do
|
66
|
-
|
67
|
-
it "verifies using the file SHA256, if that exists" do
|
68
|
-
allow(sha256_digest_class).to receive(:file).and_return(sha256_digest)
|
69
|
-
allow(sha256_digest).to receive(:hexdigest).and_return(sha256_of_tarball)
|
70
|
-
allow(sha256_file_path).to receive(:exist?).and_return(true)
|
71
|
-
expect(subject).to receive(:verify_from_file).with(sha256_of_tarball, sha256_file_path)
|
72
|
-
subject.verify
|
73
|
-
end
|
74
|
-
|
75
|
-
it "verifies using the forge file_sha256, if no sha256 file exists" do
|
76
|
-
allow(sha256_digest_class).to receive(:file).and_return(sha256_digest)
|
77
|
-
allow(sha256_digest).to receive(:hexdigest).and_return(sha256_of_tarball)
|
78
|
-
allow(sha256_file_path).to receive(:exist?).and_return(false)
|
79
|
-
allow(subject.forge_release).to receive(:respond_to?).and_return(true)
|
80
|
-
allow(subject.forge_release).to receive(:sha256_file).and_return(sha256_of_tarball)
|
81
|
-
expect(subject).to receive(:verify_from_forge)
|
82
|
-
subject.verify
|
83
|
-
end
|
84
|
-
|
85
|
-
it "falls back to md5 verification when not in FIPS mode and no sha256 available" do
|
86
|
-
expect(R10K::Util::Platform).to receive(:fips?).and_return(false)
|
87
|
-
# failed sha256 verification
|
88
|
-
allow(sha256_digest_class).to receive(:file).and_return(sha256_digest)
|
89
|
-
allow(sha256_digest).to receive(:hexdigest).and_return(sha256_of_tarball)
|
90
|
-
allow(sha256_file_path).to receive(:exist?).and_return(false)
|
91
|
-
allow(subject.forge_release).to receive(:respond_to?).and_return(false)
|
92
|
-
allow(subject).to receive(:verify_from_forge)
|
93
|
-
# md5 verification
|
94
|
-
allow(md5_digest_class).to receive(:file).and_return(md5_digest)
|
95
|
-
allow(md5_digest).to receive(:hexdigest).and_return(md5_of_tarball)
|
96
|
-
allow(md5_file_path).to receive(:exist?).and_return(true)
|
97
|
-
expect(subject).to receive(:verify_from_file)
|
98
|
-
subject.verify
|
99
|
-
end
|
100
|
-
|
101
|
-
it "errors when in FIPS mode and no sha256 is available" do
|
102
|
-
expect(R10K::Util::Platform).to receive(:fips?).and_return(true)
|
103
|
-
allow(sha256_digest_class).to receive(:file).and_return(sha256_digest)
|
104
|
-
allow(sha256_digest).to receive(:hexdigest).and_return(sha256_of_tarball)
|
105
|
-
allow(sha256_file_path).to receive(:exist?).and_return(false)
|
106
|
-
allow(subject.forge_release).to receive(:respond_to?).and_return(false)
|
107
|
-
allow(subject).to receive(:verify_from_forge)
|
108
|
-
expect { subject.verify }.to raise_error(R10K::Error)
|
109
|
-
end
|
110
|
-
end
|
111
|
-
|
112
|
-
describe '#verify_from_file' do
|
113
|
-
|
114
|
-
it "does nothing when the checksums match" do
|
115
|
-
expect(File).to receive(:read).with(sha256_file_path).and_return(good_sha256)
|
116
|
-
expect(subject).not_to receive(:cleanup_cached_tarball_path)
|
117
|
-
subject.verify_from_file(sha256_of_tarball, sha256_file_path)
|
118
|
-
end
|
119
|
-
|
120
|
-
it "raises an error and cleans up when the checksums do not match" do
|
121
|
-
expect(File).to receive(:read).with(sha256_file_path).and_return(bad_sha256)
|
122
|
-
expect(tarball_cache_path).to receive(:delete)
|
123
|
-
expect(sha256_file_path).to receive(:delete)
|
124
|
-
expect { subject.verify_from_file(sha256_of_tarball, sha256_file_path) }.to raise_error(PuppetForge::V3::Release::ChecksumMismatch)
|
125
|
-
end
|
126
|
-
end
|
127
|
-
|
128
|
-
describe '#verify_from_forge' do
|
129
|
-
it "write the checksum to file when the checksums match" do
|
130
|
-
expect(tarball_cache_path).not_to receive(:delete)
|
131
|
-
expect(File).to receive(:write).with(sha256_file_path, good_sha256)
|
132
|
-
subject.verify_from_forge(sha256_of_tarball, good_sha256, sha256_file_path)
|
133
|
-
end
|
134
|
-
|
135
|
-
it "raises an error and cleans up when the checksums do not match" do
|
136
|
-
expect(tarball_cache_path).to receive(:delete)
|
137
|
-
expect { subject.verify_from_forge(sha256_of_tarball, bad_sha256, sha256_file_path) }
|
138
|
-
.to raise_error(PuppetForge::V3::Release::ChecksumMismatch)
|
139
|
-
end
|
140
|
-
end
|
141
|
-
|
142
|
-
describe '#unpack' do
|
143
|
-
it "unpacks the module tarball in `tarball_cache_path` into the provided target path" do
|
144
|
-
expect(PuppetForge::Unpacker).to receive(:unpack).with(tarball_cache_path.to_s, target_dir.to_s, unpack_path.to_s).\
|
145
|
-
and_return({:valid=>["extractedmodule/metadata.json"], :invalid=>[], :symlinks=>[]})
|
146
|
-
subject.unpack(target_dir)
|
147
|
-
end
|
148
|
-
|
149
|
-
it "logs a warning if symlinks are present during the unpacking process" do
|
150
|
-
logger_dbl = double(Log4r::Logger, debug1: true, debug2: true)
|
151
|
-
allow(subject).to receive(:logger).and_return(logger_dbl)
|
152
|
-
allow(PuppetForge::Unpacker).to receive(:unpack).and_return(file_lists)
|
153
|
-
|
154
|
-
expect(logger_dbl).to receive(:warn).with(/symlinks are unsupported.*#{Regexp.escape(subject.forge_release.slug)}/i)
|
155
|
-
|
156
|
-
subject.unpack(target_dir)
|
157
|
-
end
|
158
|
-
end
|
159
|
-
|
160
|
-
describe "#cleanup" do
|
161
|
-
it "cleans up the unpack paths" do
|
162
|
-
expect(subject).to receive(:cleanup_unpack_path)
|
163
|
-
expect(subject).to receive(:cleanup_download_path)
|
164
|
-
subject.cleanup
|
165
|
-
end
|
166
|
-
end
|
167
|
-
|
168
|
-
describe "#cleanup_unpack_path" do
|
169
|
-
it "ignores the unpack_path if the parent doesn't exist" do
|
170
|
-
parent = instance_double('Pathname')
|
171
|
-
expect(parent).to receive(:exist?).and_return false
|
172
|
-
expect(parent).to_not receive(:rmtree)
|
173
|
-
expect(unpack_path).to receive(:parent).and_return(parent)
|
174
|
-
subject.cleanup_unpack_path
|
175
|
-
end
|
176
|
-
|
177
|
-
it "removes the containing directory of unpack_path if it exists" do
|
178
|
-
parent = instance_double('Pathname')
|
179
|
-
expect(parent).to receive(:rmtree)
|
180
|
-
expect(parent).to receive(:exist?).and_return true
|
181
|
-
expect(unpack_path).to receive(:parent).and_return(parent).exactly(2).times
|
182
|
-
subject.cleanup_unpack_path
|
183
|
-
end
|
184
|
-
end
|
185
|
-
|
186
|
-
describe "#cleanup_download_path" do
|
187
|
-
it "ignores the download_path if the parent doesn't exist" do
|
188
|
-
parent = instance_double('Pathname')
|
189
|
-
expect(parent).to receive(:exist?).and_return false
|
190
|
-
expect(parent).to_not receive(:rmtree)
|
191
|
-
expect(download_path).to receive(:parent).and_return(parent)
|
192
|
-
subject.cleanup_download_path
|
193
|
-
end
|
194
|
-
|
195
|
-
it "removes the containing directory of download_path if it exists" do
|
196
|
-
parent = instance_double('Pathname')
|
197
|
-
expect(parent).to receive(:rmtree)
|
198
|
-
expect(parent).to receive(:exist?).and_return true
|
199
|
-
expect(download_path).to receive(:parent).and_return(parent).exactly(2).times
|
200
|
-
subject.cleanup_download_path
|
201
|
-
end
|
202
|
-
end
|
203
|
-
|
204
|
-
describe '#install' do
|
205
|
-
it "performs all steps needed to install the module" do
|
206
|
-
expect(subject).to receive(:download)
|
207
|
-
expect(subject).to receive(:verify)
|
208
|
-
expect(subject).to receive(:unpack).with(target_dir)
|
209
|
-
expect(subject).to receive(:cleanup)
|
210
|
-
subject.install(target_dir)
|
211
|
-
end
|
212
|
-
end
|
213
|
-
end
|