inspec-core 3.7.11 → 3.9.0

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 (43) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +1 -0
  3. data/lib/inspec/reporters/automate.rb +0 -4
  4. data/lib/inspec/reporters/json_automate.rb +7 -1
  5. data/lib/inspec/version.rb +1 -1
  6. metadata +2 -39
  7. data/lib/plugins/inspec-artifact/test/functional/inspec_artifact_test.rb +0 -46
  8. data/lib/plugins/inspec-compliance/test/functional/inspec_compliance_test.rb +0 -43
  9. data/lib/plugins/inspec-compliance/test/integration/default/cli.rb +0 -93
  10. data/lib/plugins/inspec-compliance/test/unit/api/login_test.rb +0 -190
  11. data/lib/plugins/inspec-compliance/test/unit/api_test.rb +0 -385
  12. data/lib/plugins/inspec-compliance/test/unit/target_test.rb +0 -155
  13. data/lib/plugins/inspec-habitat/test/cookbooks/inspec_habitat_fixture/Berksfile +0 -2
  14. data/lib/plugins/inspec-habitat/test/cookbooks/inspec_habitat_fixture/README.md +0 -3
  15. data/lib/plugins/inspec-habitat/test/cookbooks/inspec_habitat_fixture/files/hab_setup.exp +0 -28
  16. data/lib/plugins/inspec-habitat/test/cookbooks/inspec_habitat_fixture/metadata.rb +0 -9
  17. data/lib/plugins/inspec-habitat/test/cookbooks/inspec_habitat_fixture/recipes/default.rb +0 -61
  18. data/lib/plugins/inspec-habitat/test/functional/inspec_habitat_test.rb +0 -38
  19. data/lib/plugins/inspec-habitat/test/integration/default/inspec_habitat/README.md +0 -3
  20. data/lib/plugins/inspec-habitat/test/integration/default/inspec_habitat/controls/inspec_habitat.rb +0 -40
  21. data/lib/plugins/inspec-habitat/test/integration/default/inspec_habitat/inspec.yml +0 -10
  22. data/lib/plugins/inspec-habitat/test/support/example_profile/README.md +0 -3
  23. data/lib/plugins/inspec-habitat/test/support/example_profile/controls/example.rb +0 -7
  24. data/lib/plugins/inspec-habitat/test/support/example_profile/inspec.yml +0 -10
  25. data/lib/plugins/inspec-habitat/test/unit/profile_test.rb +0 -240
  26. data/lib/plugins/inspec-init/templates/plugins/inspec-plugin-template/test/fixtures/README.md +0 -24
  27. data/lib/plugins/inspec-init/templates/plugins/inspec-plugin-template/test/functional/README.md +0 -12
  28. data/lib/plugins/inspec-init/templates/plugins/inspec-plugin-template/test/functional/inspec_plugin_template_test.rb +0 -110
  29. data/lib/plugins/inspec-init/templates/plugins/inspec-plugin-template/test/helper.rb +0 -26
  30. data/lib/plugins/inspec-init/templates/plugins/inspec-plugin-template/test/unit/README.md +0 -17
  31. data/lib/plugins/inspec-init/templates/plugins/inspec-plugin-template/test/unit/cli_args_test.rb +0 -67
  32. data/lib/plugins/inspec-init/templates/plugins/inspec-plugin-template/test/unit/plugin_def_test.rb +0 -51
  33. data/lib/plugins/inspec-init/test/functional/inspec_init_plugin_test.rb +0 -173
  34. data/lib/plugins/inspec-init/test/functional/inspec_init_profile_test.rb +0 -100
  35. data/lib/plugins/inspec-plugin-manager-cli/test/fixtures/config_dirs/empty/.gitkeep +0 -0
  36. data/lib/plugins/inspec-plugin-manager-cli/test/fixtures/plugins/inspec-egg-white-omelette/lib/inspec-egg-white-omelette.rb +0 -2
  37. data/lib/plugins/inspec-plugin-manager-cli/test/fixtures/plugins/inspec-egg-white-omelette/lib/inspec-egg-white-omelette/.gitkeep +0 -0
  38. data/lib/plugins/inspec-plugin-manager-cli/test/fixtures/plugins/inspec-wrong-structure/.gitkeep +0 -0
  39. data/lib/plugins/inspec-plugin-manager-cli/test/fixtures/plugins/wrong-name/lib/wrong-name.rb +0 -1
  40. data/lib/plugins/inspec-plugin-manager-cli/test/fixtures/plugins/wrong-name/lib/wrong-name/.gitkeep +0 -0
  41. data/lib/plugins/inspec-plugin-manager-cli/test/functional/inspec-plugin_test.rb +0 -713
  42. data/lib/plugins/inspec-plugin-manager-cli/test/unit/cli_args_test.rb +0 -75
  43. data/lib/plugins/inspec-plugin-manager-cli/test/unit/plugin_def_test.rb +0 -20
@@ -1,100 +0,0 @@
1
- # encoding: utf-8
2
-
3
- require 'yaml'
4
- require_relative '../../../shared/core_plugin_test_helper.rb'
5
-
6
- class InitCli < MiniTest::Test
7
- include CorePluginFunctionalHelper
8
-
9
- def test_generating_inspec_profile
10
- Dir.mktmpdir do |dir|
11
- profile = File.join(dir, 'test-profile')
12
- out = run_inspec_process("init profile test-profile", prefix: "cd #{dir} &&")
13
- assert_equal 0, out.exit_status
14
- assert_includes out.stdout, 'Creating new profile at'
15
- assert_includes out.stdout, profile
16
- assert_includes Dir.entries(profile).join, 'inspec.yml'
17
- assert_includes Dir.entries(profile).join, 'README.md'
18
- end
19
- end
20
-
21
- def test_generating_inspec_profile_with_explicit_platform
22
- Dir.mktmpdir do |dir|
23
- profile = File.join(dir, 'test-profile')
24
- out = run_inspec_process("init profile --platform os test-profile", prefix: "cd #{dir} &&")
25
- assert_equal 0, out.exit_status
26
- assert_includes out.stdout, 'Creating new profile at'
27
- assert_includes out.stdout, profile
28
- assert_includes Dir.entries(profile).join, 'inspec.yml'
29
- assert_includes Dir.entries(profile).join, 'README.md'
30
- end
31
- end
32
-
33
- def test_generating_inspec_profile_with_bad_platform
34
- Dir.mktmpdir do |dir|
35
- out = run_inspec_process("init profile --platform nonesuch test-profile", prefix: "cd #{dir} &&")
36
- assert_equal 1, out.exit_status
37
- assert_includes out.stdout, 'Unable to generate profile'
38
- assert_includes out.stdout, "No template available for platform 'nonesuch'"
39
- end
40
- end
41
-
42
- def test_profile_with_slash_name
43
- Dir.mktmpdir do |dir|
44
- profile = dir + '/test/deeper/profile'
45
- out = run_inspec_process("init profile test/deeper/profile", prefix: "cd #{dir} &&")
46
- assert_equal 0, out.exit_status
47
- assert_equal true, File.exist?(profile)
48
- profile = YAML.load_file("#{profile}/inspec.yml")
49
- assert_equal 'profile', profile['name']
50
- end
51
- end
52
-
53
- def test_generating_inspec_profile_gcp
54
- Dir.mktmpdir do |dir|
55
- profile = File.join(dir, 'test-gcp-profile')
56
- out = run_inspec_process("init profile --platform gcp test-gcp-profile", prefix: "cd #{dir} &&")
57
- assert_equal 0, out.exit_status
58
- assert_includes out.stdout, 'Creating new profile at'
59
- assert_includes out.stdout, profile
60
- assert_includes Dir.entries(profile).join, 'inspec.yml'
61
- assert_includes Dir.entries(profile).join, 'README.md'
62
- end
63
- end
64
-
65
- def test_generating_inspec_profile_aws
66
- Dir.mktmpdir do |dir|
67
- profile = File.join(dir, 'test-aws-profile')
68
- out = run_inspec_process("init profile --platform aws test-aws-profile", prefix: "cd #{dir} &&")
69
- assert_equal 0, out.exit_status
70
- assert_includes out.stdout, 'Creating new profile at'
71
- assert_includes out.stdout, profile
72
- assert_includes Dir.entries(profile).join, 'inspec.yml'
73
- assert_includes Dir.entries(profile).join, 'README.md'
74
- end
75
- end
76
-
77
- def test_generating_inspec_profile_azure
78
- Dir.mktmpdir do |dir|
79
- profile = File.join(dir, 'test-azure-profile')
80
- out = run_inspec_process("init profile --platform azure test-azure-profile", prefix: "cd #{dir} &&")
81
- assert_equal 0, out.exit_status
82
- assert_includes out.stdout, 'Creating new profile at'
83
- assert_includes out.stdout, profile
84
- assert_includes Dir.entries(profile).join, 'inspec.yml'
85
- assert_includes Dir.entries(profile).join, 'README.md'
86
- end
87
- end
88
-
89
- def test_generating_inspec_profile_os
90
- Dir.mktmpdir do |dir|
91
- profile = File.join(dir, 'test-os-profile')
92
- out = run_inspec_process("init profile --platform os test-os-profile", prefix: "cd #{dir} &&")
93
- assert_equal 0, out.exit_status
94
- assert_includes out.stdout, 'Creating new profile at'
95
- assert_includes out.stdout, profile
96
- assert_includes Dir.entries(profile).join, 'inspec.yml'
97
- assert_includes Dir.entries(profile).join, 'README.md'
98
- end
99
- end
100
- end
@@ -1,2 +0,0 @@
1
- # Despite having the right file structure, and the right name,
2
- # this is not actually an InSpec plugin.
@@ -1 +0,0 @@
1
- # This should should never even be loaded.
@@ -1,713 +0,0 @@
1
- #=========================================================================================#
2
- # `inspec plugin SUBCOMMAND` facility
3
- #=========================================================================================#
4
- require_relative '../../../shared/core_plugin_test_helper.rb'
5
-
6
- #-----------------------------------------------------------------------------------------#
7
- # utilities
8
- #-----------------------------------------------------------------------------------------#
9
- module PluginManagerHelpers
10
- let(:project_repo_path) { File.expand_path(File.join(__FILE__, '..', '..', '..')) }
11
- let(:project_fixtures_path) { File.join(project_repo_path, 'test', 'fixtures') }
12
- let(:project_config_dirs_path) { File.join(project_fixtures_path, 'config_dirs') }
13
- let(:empty_config_dir_path) { File.join(project_config_dirs_path, 'empty') }
14
-
15
- let(:list_after_run) do
16
- Proc.new do |run_result, tmp_dir|
17
- # After installing/uninstalling/whatevering, run list with config in the same dir, and capture it.
18
- run_result.payload.list_result = run_inspec_process('plugin list', env: { INSPEC_CONFIG_DIR: tmp_dir })
19
- end
20
- end
21
-
22
- def copy_in_project_config_dir(fixture_name, dest = nil)
23
- src = Dir.glob(File.join(project_config_dirs_path, fixture_name, '*'))
24
- dest ||= File.join(project_config_dirs_path, 'empty')
25
- src.each { |path| FileUtils.cp_r(path, dest) }
26
- end
27
-
28
- def copy_in_core_config_dir(fixture_name, dest = nil)
29
- src = Dir.glob(File.join(core_config_dir_path, fixture_name, '*'))
30
- dest ||= File.join(project_config_dirs_path, 'empty')
31
- src.each { |path| FileUtils.cp_r(path, dest) }
32
- end
33
-
34
- def clear_empty_config_dir
35
- Dir.glob(File.join(project_config_dirs_path, 'empty', '*')).each do |path|
36
- next if path.end_with? '.gitkeep'
37
- FileUtils.rm_rf(path)
38
- end
39
- end
40
-
41
- def teardown
42
- clear_empty_config_dir
43
- end
44
- end
45
-
46
- #-----------------------------------------------------------------------------------------#
47
- # inspec help
48
- #-----------------------------------------------------------------------------------------#
49
- class PluginManagerCliHelp < MiniTest::Test
50
- include CorePluginFunctionalHelper
51
-
52
- # Main inspec help subcommand listing
53
- def test_inspec_help_includes_plugin
54
- result = run_inspec_process_with_this_plugin('help')
55
- assert_includes result.stdout, 'inspec plugin'
56
- end
57
-
58
- # inspec plugin help subcommand listing
59
- def test_inspec_plugin_help_includes_plugin
60
- result = run_inspec_process_with_this_plugin('plugin help')
61
- assert_includes result.stdout, 'inspec plugin list'
62
- assert_includes result.stdout, 'inspec plugin search'
63
- assert_includes result.stdout, 'inspec plugin install'
64
- assert_includes result.stdout, 'inspec plugin update'
65
- assert_includes result.stdout, 'inspec plugin uninstall'
66
- end
67
- end
68
-
69
- #-----------------------------------------------------------------------------------------#
70
- # inspec plugin list
71
- #-----------------------------------------------------------------------------------------#
72
- class PluginManagerCliList < MiniTest::Test
73
- include CorePluginFunctionalHelper
74
- include PluginManagerHelpers
75
-
76
- def test_list_when_no_user_plugins_installed
77
- result = run_inspec_process_with_this_plugin('plugin list')
78
- assert_equal 0, result.exit_status, 'exist status must be 0'
79
- assert_includes result.stdout, '0 plugin(s) total', 'Empty list should include zero count'
80
- end
81
-
82
- def test_list_all_when_no_user_plugins_installed
83
- result = run_inspec_process_with_this_plugin('plugin list --all')
84
- assert_equal 0, result.exit_status, 'exist status must be 0'
85
- assert_includes result.stdout, '6 plugin(s) total', '--all list should find six'
86
- assert_includes result.stdout, 'inspec-plugin-manager-cli', '--all list should find inspec-plugin-manager-cli'
87
- assert_includes result.stdout, 'habitat', '--all list should find habitat'
88
-
89
- result = run_inspec_process_with_this_plugin('plugin list -a')
90
- assert_equal 0, result.exit_status, 'exist status must be 0'
91
- assert_includes result.stdout, '6 plugin(s) total', '-a list should find six'
92
- end
93
-
94
- def test_list_when_gem_and_path_plugins_installed
95
- pre_block = Proc.new do |plugin_statefile_data, tmp_dir|
96
- plugin_statefile_data.clear # Signal not to write a file, we'll provide one.
97
- copy_in_core_config_dir('test-fixture-1-float', tmp_dir)
98
- end
99
-
100
- result = run_inspec_process_with_this_plugin('plugin list', pre_run: pre_block)
101
- assert_equal 0, result.exit_status, 'exist status must be 0'
102
- assert_includes result.stdout, '2 plugin(s) total', 'gem+path should show two plugins'
103
-
104
- # Plugin Name Version Via ApiVer
105
- # -------------------------------------------------------
106
- # inspec-meaning-of-life src path 2
107
- # inspec-test-fixture 0.1.0 gem 2
108
- # -------------------------------------------------------
109
- # 2 plugin(s) total
110
- gem_line = result.stdout.split("\n").grep(/gem/).first
111
- assert_match(/\s*inspec-\S+\s+\d+\.\d+\.\d+\s+gem\s+2/, gem_line)
112
- path_line = result.stdout.split("\n").grep(/path/).first
113
- assert_match(/\s*inspec-\S+\s+src\s+path\s+2/, path_line)
114
- end
115
-
116
- def test_list_when_a_train_plugin_is_installed
117
- pre_block = Proc.new do |plugin_statefile_data, tmp_dir|
118
- plugin_statefile_data.clear # Signal not to write a file, we'll provide one.
119
- copy_in_core_config_dir('train-test-fixture', tmp_dir)
120
- end
121
-
122
- result = run_inspec_process_with_this_plugin('plugin list', pre_run: pre_block)
123
- assert_equal 0, result.exit_status, 'exist status must be 0'
124
- assert_includes result.stdout, '1 plugin(s) total', 'list train should show one plugins'
125
-
126
- # Plugin Name Version Via ApiVer
127
- # -------------------------------------------------------
128
- # train-test-fixture 0.1.0 gem train-1
129
- # -------------------------------------------------------
130
- # 1 plugin(s) total
131
- train_line = result.stdout.split("\n").grep(/train/).first
132
- assert_includes(train_line, 'train-test-fixture')
133
- assert_includes(train_line, '0.1.0')
134
- assert_includes(train_line, 'gem')
135
- assert_includes(train_line, 'train-1')
136
- end
137
- end
138
-
139
- #-----------------------------------------------------------------------------------------#
140
- # inspec plugin search
141
- #-----------------------------------------------------------------------------------------#
142
- class PluginManagerCliSearch < MiniTest::Test
143
- include CorePluginFunctionalHelper
144
- include PluginManagerHelpers
145
-
146
- # TODO: Thor can't hide options, but we wish it could.
147
- # def test_search_include_fixture_hidden_option
148
- # result = run_inspec_process_with_this_plugin('plugin help search')
149
- # refute_includes result.stdout, '--include-test-fixture'
150
- # end
151
-
152
- def test_search_for_a_real_gem_with_full_name_no_options
153
- result = run_inspec_process('plugin search --include-test-fixture inspec-test-fixture')
154
- assert_equal 0, result.exit_status, 'Search should exit 0 on a hit'
155
- assert_includes result.stdout, 'inspec-test-fixture', 'Search result should contain the gem name'
156
- assert_includes result.stdout, '1 plugin(s) found', 'Search result should find 1 plugin'
157
- line = result.stdout.split("\n").grep(/inspec-test-fixture/).first
158
- assert_match(/\s*inspec-test-fixture\s+\((\d+\.\d+\.\d+){1}\)/,line,'Plugin line should include name and exactly one version')
159
- end
160
-
161
- def test_search_for_a_real_gem_with_stub_name_no_options
162
- result = run_inspec_process('plugin search --include-test-fixture inspec-test-')
163
- assert_equal 0, result.exit_status, 'Search should exit 0 on a hit'
164
- assert_includes result.stdout, 'inspec-test-fixture', 'Search result should contain the gem name'
165
- assert_includes result.stdout, '1 plugin(s) found', 'Search result should find 1 plugin'
166
-
167
- line = result.stdout.split("\n").grep(/inspec-test-fixture/).first
168
- assert_match(/\s*inspec-test-fixture\s+\((\d+\.\d+\.\d+){1}\)/,line,'Plugin line should include name and exactly one version')
169
- end
170
-
171
- def test_search_for_a_real_gem_with_full_name_and_exact_option
172
- result = run_inspec_process('plugin search --exact --include-test-fixture inspec-test-fixture')
173
- assert_equal 0, result.exit_status, 'Search should exit 0 on a hit'
174
- assert_includes result.stdout, 'inspec-test-fixture', 'Search result should contain the gem name'
175
- assert_includes result.stdout, '1 plugin(s) found', 'Search result should find 1 plugin'
176
-
177
- result = run_inspec_process('plugin search -e --include-test-fixture inspec-test-fixture')
178
- assert_equal 0, result.exit_status, 'Search should exit 0 on a hit'
179
- end
180
-
181
- def test_search_for_a_real_gem_with_stub_name_and_exact_option
182
- result = run_inspec_process('plugin search --exact --include-test-fixture inspec-test-')
183
- assert_equal 2, result.exit_status, 'Search should exit 2 on a miss'
184
- assert_includes result.stdout, '0 plugin(s) found', 'Search result should find 0 plugins'
185
-
186
- result = run_inspec_process('plugin search -e --include-test-fixture inspec-test-')
187
- assert_equal 2, result.exit_status, 'Search should exit 2 on a miss'
188
- end
189
-
190
- def test_search_for_a_real_gem_with_full_name_and_all_option
191
- result = run_inspec_process('plugin search --all --include-test-fixture inspec-test-fixture')
192
- assert_equal 0, result.exit_status, 'Search should exit 0 on a hit'
193
- assert_includes result.stdout, 'inspec-test-fixture', 'Search result should contain the gem name'
194
- assert_includes result.stdout, '1 plugin(s) found', 'Search result should find 1 plugin'
195
-
196
- line = result.stdout.split("\n").grep(/inspec-test-fixture/).first
197
- assert_match(/\s*inspec-test-fixture\s+\((\d+\.\d+\.\d+(,\s)?){2,}\)/,line,'Plugin line should include name and at least two versions')
198
-
199
- result = run_inspec_process('plugin search -a --include-test-fixture inspec-test-fixture')
200
- assert_equal 0, result.exit_status, 'Search should exit 0 on a hit'
201
- end
202
-
203
- def test_search_for_a_gem_with_missing_prefix
204
- result = run_inspec_process('plugin search --include-test-fixture test-fixture')
205
- assert_equal 1, result.exit_status, 'Search should exit 1 on user error'
206
- assert_includes result.stdout, "All inspec plugins must begin with either 'inspec-' or 'train-'"
207
- end
208
-
209
- def test_search_for_a_gem_that_does_not_exist
210
- result = run_inspec_process('plugin search --include-test-fixture inspec-test-fixture-nonesuch')
211
- assert_equal 2, result.exit_status, 'Search should exit 2 on a miss'
212
- assert_includes result.stdout, '0 plugin(s) found', 'Search result should find 0 plugins'
213
- end
214
-
215
- def test_search_for_a_real_gem_with_full_name_no_options_and_train_name
216
- result = run_inspec_process('plugin search --include-test-fixture train-test-fixture')
217
- assert_equal 0, result.exit_status, 'Search should exit 0 on a hit'
218
- assert_includes result.stdout, 'train-test-fixture', 'Search result should contain the gem name'
219
- assert_includes result.stdout, '1 plugin(s) found', 'Search result should find 1 plugin'
220
- line = result.stdout.split("\n").grep(/train-test-fixture/).first
221
- assert_match(/\s*train-test-fixture\s+\((\d+\.\d+\.\d+){1}\)/,line,'Plugin line should include name and exactly one version')
222
- end
223
-
224
- def test_search_omit_excluded_inspec_plugins
225
- result = run_inspec_process('plugin search --include-test-fixture inspec-')
226
- assert_equal 0, result.exit_status, 'Search should exit 0'
227
- assert_includes result.stdout, 'inspec-test-fixture', 'Search result should contain the test gem'
228
- [
229
- 'inspec-core',
230
- 'inspec-multi-server',
231
- ].each do |plugin_name|
232
- refute_includes result.stdout, plugin_name, 'Search result should not contain excluded gems'
233
- end
234
- end
235
- def test_search_for_a_real_gem_with_full_name_no_options_filter_fixtures
236
- result = run_inspec_process('plugin search inspec-test-fixture')
237
- refute_includes result.stdout, 'inspec-test-fixture', 'Search result should not contain the fixture gem name'
238
- end
239
-
240
- def test_search_for_a_real_gem_with_full_name_no_options_filter_fixtures_train
241
- result = run_inspec_process('plugin search train-test-fixture')
242
- refute_includes result.stdout, 'train-test-fixture', 'Search result should not contain the fixture gem name'
243
- end
244
-
245
-
246
- end
247
-
248
- #-----------------------------------------------------------------------------------------#
249
- # inspec plugin install
250
- #-----------------------------------------------------------------------------------------#
251
- class PluginManagerCliInstall < MiniTest::Test
252
- include CorePluginFunctionalHelper # gives us instance methods, like `let` aliases inside test methods
253
- extend CorePluginFunctionalHelper # gives us class methods, like `let` aliases out here outside test methods
254
-
255
- include PluginManagerHelpers
256
- ruby_abi_version = (Gem.ruby_version.segments[0, 2] << 0).join('.')
257
- # Test multiple hueristics of the path-mode install.
258
- # These are all positive tests; they should resolve the entry point to the same path in each case.
259
- {
260
- 'is_perfect' => {
261
- given: File.join(core_fixture_plugins_path, 'inspec-test-fixture', 'lib', 'inspec-test-fixture.rb'),
262
- },
263
- 'refers_to_the_entry_point_with_no_extension' => {
264
- given: File.join(core_fixture_plugins_path, 'inspec-test-fixture', 'lib', 'inspec-test-fixture'),
265
- },
266
- 'refers_to_the_src_root_of_a_plugin' => {
267
- given: File.join(core_fixture_plugins_path, 'inspec-test-fixture'),
268
- },
269
- 'refers_to_a_versioned_gem_install' => {
270
- given: File.join(core_config_dir_path, 'test-fixture-1-float', 'gems', ruby_abi_version, 'gems', 'inspec-test-fixture-0.1.0', 'lib', 'inspec-test-fixture.rb'),
271
- resolved_path: File.join(core_config_dir_path, 'test-fixture-1-float', 'gems', ruby_abi_version, 'gems', 'inspec-test-fixture-0.1.0', 'lib', 'inspec-test-fixture.rb'),
272
- },
273
- 'refers_to_a_versioned_gem_install_missing_extension' => {
274
- given: File.join(core_config_dir_path, 'test-fixture-1-float', 'gems', ruby_abi_version, 'gems', 'inspec-test-fixture-0.1.0', 'lib', 'inspec-test-fixture'),
275
- resolved_path: File.join(core_config_dir_path, 'test-fixture-1-float', 'gems', ruby_abi_version, 'gems', 'inspec-test-fixture-0.1.0', 'lib', 'inspec-test-fixture.rb'),
276
- },
277
- 'refers_to_a_relative_path' => {
278
- given: File.join('test', 'unit', 'mock', 'plugins', 'inspec-test-fixture', 'lib', 'inspec-test-fixture.rb'),
279
- },
280
- 'refers_to_a_train_plugin' => {
281
- given: File.join(core_config_dir_path, 'train-test-fixture', 'gems', ruby_abi_version, 'gems', 'train-test-fixture-0.1.0', 'lib', 'train-test-fixture.rb'),
282
- plugin_name: 'train-test-fixture',
283
- resolved_path: File.join(core_config_dir_path, 'train-test-fixture', 'gems', ruby_abi_version, 'gems', 'train-test-fixture-0.1.0', 'lib', 'train-test-fixture.rb'),
284
- },
285
- }.each do |test_name, fixture_info|
286
- define_method(('test_install_from_path_when_path_' + test_name).to_sym) do
287
- fixture_info = {
288
- plugin_name: 'inspec-test-fixture',
289
- resolved_path: File.join(core_fixture_plugins_path, 'inspec-test-fixture', 'lib', 'inspec-test-fixture.rb')
290
- }.merge(fixture_info)
291
-
292
- install_result = run_inspec_process_with_this_plugin("plugin install #{fixture_info[:given]}", post_run: list_after_run)
293
-
294
- assert_empty install_result.stderr
295
- assert_equal 0, install_result.exit_status, 'Exit status should be 0'
296
-
297
- # Check UX messaging
298
- success_message = install_result.stdout.split("\n").grep(/installed/).last
299
- refute_nil success_message, 'Should find a success message at the end'
300
- assert_includes success_message, fixture_info[:plugin_name]
301
- assert_includes success_message, 'plugin installed via source path reference'
302
-
303
- # Check round-trip UX via list
304
- list_result = install_result.payload.list_result
305
- itf_line = list_result.stdout.split("\n").grep(Regexp.new(fixture_info[:plugin_name])).first
306
- refute_nil itf_line, 'plugin name should now appear in the output of inspec list'
307
- assert_match(/\s*(inspec|train)-test-fixture\s+src\s+path\s+/, itf_line, 'list output should show that it is a path installation')
308
-
309
- # Check plugin statefile. Extra important in this case, since all should resolve to the same entry point.
310
- plugin_data = install_result.payload.plugin_data
311
- entry = plugin_data['plugins'].detect { |e| e['name'] == fixture_info[:plugin_name] }
312
- assert_equal fixture_info[:resolved_path], entry['installation_path'], 'Regardless of input, the entry point should be correct.'
313
- end
314
- end
315
-
316
- def test_fail_install_from_nonexistant_path
317
- bad_path = File.join(project_fixtures_path, 'none', 'such', 'inspec-test-fixture-nonesuch.rb')
318
- install_result = run_inspec_process_with_this_plugin("plugin install #{bad_path}")
319
-
320
- assert_empty install_result.stderr
321
- assert_equal 1, install_result.exit_status, 'Exit status should be 1'
322
-
323
- error_message = install_result.stdout.split("\n").last
324
- assert_includes error_message, "No such source code path"
325
- assert_includes error_message, 'inspec-test-fixture-nonesuch.rb'
326
- assert_includes error_message, 'installation failed'
327
- end
328
-
329
- def test_fail_install_from_path_with_wrong_name
330
- bad_path = File.join(project_fixtures_path, 'plugins', 'wrong-name', 'lib', 'wrong-name.rb')
331
- install_result = run_inspec_process_with_this_plugin("plugin install #{bad_path}")
332
-
333
- assert_empty install_result.stderr
334
- assert_equal 1, install_result.exit_status, 'Exit status should be 1'
335
-
336
- error_message = install_result.stdout.split("\n").last
337
- assert_includes error_message, "Invalid plugin name"
338
- assert_includes error_message, 'wrong-name'
339
- assert_includes error_message, "All inspec plugins must begin with either 'inspec-' or 'train-'"
340
- assert_includes error_message, 'installation failed'
341
- end
342
-
343
- def test_fail_install_from_path_when_it_is_not_a_plugin
344
- bad_path = File.join(project_fixtures_path, 'plugins', 'inspec-egg-white-omelette', 'lib', 'inspec-egg-white-omelette.rb')
345
- install_result = run_inspec_process_with_this_plugin("plugin install #{bad_path}")
346
-
347
- assert_empty install_result.stderr
348
- assert_equal 1, install_result.exit_status, 'Exit status should be 1'
349
-
350
- error_message = install_result.stdout.split("\n").last
351
- assert_includes error_message, "Does not appear to be a plugin"
352
- assert_includes error_message, 'inspec-egg-white-omelette'
353
- assert_includes error_message, "After probe-loading the supposed plugin, it did not register"
354
- assert_includes error_message, "Ensure something inherits from 'Inspec.plugin(2)'"
355
- assert_includes error_message, 'installation failed'
356
- end
357
-
358
- def test_fail_install_from_path_when_it_is_already_installed
359
- plugin_path = File.join(core_fixture_plugins_path, 'inspec-test-fixture', 'lib', 'inspec-test-fixture.rb')
360
- pre_block = Proc.new do |plugin_data, _tmp_dir|
361
- plugin_data["plugins"] << {
362
- "name" => "inspec-test-fixture",
363
- "installation_type" => "path",
364
- "installation_path" => plugin_path,
365
- }
366
- end
367
-
368
- install_result = run_inspec_process_with_this_plugin("plugin install #{plugin_path}", pre_run: pre_block)
369
- assert_empty install_result.stderr
370
- assert_equal 2, install_result.exit_status, 'Exit status on second install should be 2'
371
-
372
- error_message = install_result.stdout.split("\n").last
373
- assert_includes error_message, "Plugin already installed"
374
- assert_includes error_message, 'inspec-test-fixture'
375
- assert_includes error_message, "Use 'inspec plugin list' to see previously installed plugin"
376
- assert_includes error_message, 'installation failed'
377
- end
378
-
379
- def test_fail_install_from_path_when_the_dir_structure_is_wrong
380
- bad_path = File.join(project_fixtures_path, 'plugins', 'inspec-wrong-structure')
381
- install_result = run_inspec_process_with_this_plugin("plugin install #{bad_path}")
382
-
383
- assert_empty install_result.stderr
384
- assert_equal 1, install_result.exit_status, 'Exit status should be 1'
385
-
386
- error_message = install_result.stdout.split("\n").last
387
- assert_includes error_message, "Unrecognizable plugin structure"
388
- assert_includes error_message, 'inspec-wrong-structure'
389
- assert_includes error_message, ' When installing from a path, please provide the path of the entry point file'
390
- assert_includes error_message, 'installation failed'
391
- end
392
-
393
- def test_install_from_gemfile
394
- fixture_gemfile_path = File.join(core_fixture_plugins_path, 'inspec-test-fixture', 'pkg', 'inspec-test-fixture-0.1.0.gem')
395
- install_result = run_inspec_process_with_this_plugin("plugin install #{fixture_gemfile_path}", post_run: list_after_run)
396
-
397
- assert_empty install_result.stderr
398
- assert_equal 0, install_result.exit_status, 'Exit status should be 0'
399
-
400
- success_message = install_result.stdout.split("\n").grep(/installed/).last
401
- refute_nil success_message, 'Should find a success message at the end'
402
- assert_includes success_message, 'inspec-test-fixture'
403
- assert_includes success_message, '0.1.0'
404
- assert_includes success_message, 'installed from local .gem file'
405
-
406
- list_result = install_result.payload.list_result
407
- itf_line = list_result.stdout.split("\n").grep(/inspec-test-fixture/).first
408
- refute_nil itf_line, 'inspec-test-fixture should now appear in the output of inspec list'
409
- assert_match(/\s*inspec-test-fixture\s+0.1.0\s+gem\s+/, itf_line, 'list output should show that it is a gem installation with version')
410
- end
411
-
412
- def test_fail_install_from_nonexistant_gemfile
413
- bad_path = File.join(project_fixtures_path, 'none', 'such', 'inspec-test-fixture-nonesuch-0.3.0.gem')
414
- install_result = run_inspec_process_with_this_plugin("plugin install #{bad_path}")
415
-
416
- assert_empty install_result.stderr
417
- assert_equal 1, install_result.exit_status, 'Exit status should be 1'
418
- assert_match(/No such plugin gem file .+ - installation failed./, install_result.stdout)
419
- end
420
-
421
- def test_install_from_rubygems_latest
422
- install_result = run_inspec_process_with_this_plugin('plugin install inspec-test-fixture', post_run: list_after_run)
423
-
424
- assert_empty install_result.stderr
425
- assert_equal 0, install_result.exit_status, 'Exit status should be 0'
426
-
427
- success_message = install_result.stdout.split("\n").grep(/installed/).last
428
- refute_nil success_message, 'Should find a success message at the end'
429
- assert_includes success_message, 'inspec-test-fixture'
430
- assert_includes success_message, '0.2.0'
431
- assert_includes success_message, 'installed from rubygems.org'
432
-
433
- list_result = install_result.payload.list_result
434
- itf_line = list_result.stdout.split("\n").grep(/inspec-test-fixture/).first
435
- refute_nil itf_line, 'inspec-test-fixture should now appear in the output of inspec list'
436
- assert_match(/\s*inspec-test-fixture\s+0.2.0\s+gem\s+/, itf_line, 'list output should show that it is a gem installation with version')
437
- end
438
-
439
- def test_fail_install_from_nonexistant_remote_rubygem
440
- install_result = run_inspec_process_with_this_plugin('plugin install inspec-test-fixture-nonesuch')
441
-
442
- assert_empty install_result.stderr
443
- assert_equal 1, install_result.exit_status, 'Exit status should be 1'
444
- assert_match(/No such plugin gem .+ could be found on rubygems.org - installation failed./, install_result.stdout)
445
- end
446
-
447
- def test_install_from_rubygems_with_pinned_version
448
- install_result = run_inspec_process_with_this_plugin('plugin install inspec-test-fixture -v 0.1.0', post_run: list_after_run)
449
-
450
- assert_empty install_result.stderr
451
- assert_equal 0, install_result.exit_status, 'Exit status should be 0'
452
-
453
- success_message = install_result.stdout.split("\n").grep(/installed/).last
454
- refute_nil success_message, 'Should find a success message at the end'
455
- assert_includes success_message, 'inspec-test-fixture'
456
- assert_includes success_message, '0.1.0'
457
- assert_includes success_message, 'installed from rubygems.org'
458
-
459
- list_result = install_result.payload.list_result
460
- itf_line = list_result.stdout.split("\n").grep(/inspec-test-fixture/).first
461
- refute_nil itf_line, 'inspec-test-fixture should now appear in the output of inspec list'
462
- assert_match(/\s*inspec-test-fixture\s+0.1.0\s+gem\s+/, itf_line, 'list output should show that it is a gem installation with version')
463
- end
464
-
465
- def test_fail_install_from_nonexistant_rubygem_version
466
- install_result = run_inspec_process_with_this_plugin('plugin install inspec-test-fixture -v 99.99.99')
467
-
468
- assert_empty install_result.stderr
469
- assert_equal 1, install_result.exit_status, 'Exit status should be 1'
470
-
471
- fail_message = install_result.stdout.split("\n").grep(/failed/).last
472
- refute_nil fail_message, 'Should find a failure message at the end'
473
- assert_includes fail_message, 'inspec-test-fixture'
474
- assert_includes fail_message, '99.99.99'
475
- assert_includes fail_message, 'no such version'
476
- assert_includes fail_message, 'on rubygems.org'
477
- end
478
-
479
- def test_refuse_install_when_missing_prefix
480
- install_result = run_inspec_process_with_this_plugin('plugin install test-fixture')
481
-
482
- assert_empty install_result.stderr
483
- assert_equal 1, install_result.exit_status, 'Exit status should be 1'
484
-
485
- fail_message = install_result.stdout.split("\n").grep(/failed/).last
486
- refute_nil fail_message, 'Should find a failure message at the end'
487
- assert_includes fail_message, 'test-fixture'
488
- assert_includes fail_message, "All inspec plugins must begin with either 'inspec-' or 'train-'"
489
- end
490
-
491
- def test_refuse_install_when_already_installed_same_version
492
- pre_block = Proc.new do |plugin_statefile_data, tmp_dir|
493
- plugin_statefile_data.clear # Signal not to write a file, we'll provide one.
494
- copy_in_core_config_dir('test-fixture-2-float', tmp_dir)
495
- end
496
-
497
- install_result = run_inspec_process_with_this_plugin('plugin install inspec-test-fixture', pre_run: pre_block)
498
- assert_empty install_result.stderr
499
- assert_equal 2, install_result.exit_status, 'Exit status should be 2'
500
-
501
- refusal_message = install_result.stdout.split("\n").grep(/refusing/).last
502
- refute_nil refusal_message, 'Should find a failure message at the end'
503
- assert_includes refusal_message, 'inspec-test-fixture'
504
- assert_includes refusal_message, '0.2.0'
505
- assert_includes refusal_message, 'Plugin already installed at latest version'
506
- end
507
-
508
- def test_refuse_install_when_already_installed_can_update
509
- pre_block = Proc.new do |plugin_statefile_data, tmp_dir|
510
- plugin_statefile_data.clear # Signal not to write a file, we'll provide one.
511
- copy_in_core_config_dir('test-fixture-1-float', tmp_dir)
512
- end
513
-
514
- install_result = run_inspec_process_with_this_plugin('plugin install inspec-test-fixture', pre_run: pre_block)
515
- assert_empty install_result.stderr
516
- assert_equal 2, install_result.exit_status, 'Exit status should be 2'
517
-
518
- refusal_message = install_result.stdout.split("\n").grep(/refusing/).last
519
- refute_nil refusal_message, 'Should find a failure message at the end'
520
- assert_includes refusal_message, 'inspec-test-fixture'
521
- assert_includes refusal_message, '0.1.0'
522
- assert_includes refusal_message, '0.2.0'
523
- assert_includes refusal_message, 'Update required'
524
- assert_includes refusal_message, 'inspec plugin update'
525
- end
526
-
527
- def test_install_from_rubygems_latest_with_train_plugin
528
- install_result = run_inspec_process_with_this_plugin('plugin install train-test-fixture', post_run: list_after_run)
529
-
530
- assert_empty install_result.stderr
531
- assert_equal 0, install_result.exit_status, 'Exit status should be 0'
532
-
533
- success_message = install_result.stdout.split("\n").grep(/installed/).last
534
- refute_nil success_message, 'Should find a success message at the end'
535
- assert_includes success_message, 'train-test-fixture'
536
- assert_includes success_message, '0.1.0'
537
- assert_includes success_message, 'installed from rubygems.org'
538
-
539
- list_result = install_result.payload.list_result
540
- itf_line = list_result.stdout.split("\n").grep(/train-test-fixture/).first
541
- refute_nil itf_line, 'train-test-fixture should now appear in the output of inspec list'
542
- assert_match(/\s*train-test-fixture\s+0.1.0\s+gem\s+/, itf_line, 'list output should show that it is a gem installation with version')
543
- end
544
-
545
- def test_refuse_install_when_plugin_on_exclusion_list
546
-
547
- # Here, 'inspec-core', 'inspec-multi-server', and 'train-tax-collector'
548
- # are the names of real rubygems. They are not InSpec/Train plugins, though,
549
- # and installing them would be a jam-up.
550
- # This is configured in 'etc/plugin-filter.json'.
551
- [
552
- 'inspec-core',
553
- 'inspec-multi-server',
554
- 'train-tax-calculator',
555
- ].each do |plugin_name|
556
- install_result = run_inspec_process_with_this_plugin("plugin install #{plugin_name}")
557
- assert_empty install_result.stderr
558
- assert_equal 2, install_result.exit_status, 'Exit status should be 2'
559
-
560
- refusal_message = install_result.stdout
561
- refute_nil refusal_message, 'Should find a failure message at the end'
562
- assert_includes refusal_message, plugin_name
563
- assert_includes refusal_message, 'Plugin on Exclusion List'
564
- assert_includes refusal_message, 'refusing to install'
565
- assert_includes refusal_message, 'Rationale:'
566
- assert_includes refusal_message, 'etc/plugin_filters.json'
567
- assert_includes refusal_message, 'github.com/inspec/inspec/issues/new'
568
- end
569
- end
570
-
571
- def test_error_install_with_debug_enabled
572
- install_result = run_inspec_process_with_this_plugin('plugin install inspec-test-fixture -v 0.1.1 --log-level debug')
573
-
574
- assert_equal 1, install_result.exit_status, 'Exit status should be 1'
575
- assert_includes install_result.stdout, 'DEBUG'
576
- assert_includes install_result.stderr, "can't activate rake"
577
- end
578
- end
579
-
580
-
581
- #-----------------------------------------------------------------------------------------#
582
- # inspec plugin update
583
- #-----------------------------------------------------------------------------------------#
584
- class PluginManagerCliUpdate < MiniTest::Test
585
- include CorePluginFunctionalHelper
586
- include PluginManagerHelpers
587
-
588
- def test_when_a_plugin_can_be_updated
589
- pre_block = Proc.new do |plugin_statefile_data, tmp_dir|
590
- plugin_statefile_data.clear # Signal not to write a file, we'll provide one.
591
- copy_in_core_config_dir('test-fixture-1-float', tmp_dir)
592
- end
593
-
594
- update_result = run_inspec_process_with_this_plugin('plugin update inspec-test-fixture', pre_run: pre_block, post_run: list_after_run)
595
- assert_empty update_result.stderr
596
- assert_equal 0, update_result.exit_status, 'Exit status should be 0'
597
-
598
- success_message = update_result.stdout.split("\n").grep(/updated/).last
599
- refute_nil success_message, 'Should find a success message at the end'
600
- assert_includes success_message, 'inspec-test-fixture'
601
- assert_includes success_message, '0.1.0'
602
- assert_includes success_message, '0.2.0'
603
- assert_includes success_message, 'updated from rubygems.org'
604
-
605
- list_result = update_result.payload.list_result
606
- itf_line = list_result.stdout.split("\n").grep(/inspec-test-fixture/).first
607
- refute_nil itf_line, 'inspec-test-fixture should appear in the output of inspec list'
608
- assert_match(/\s*inspec-test-fixture\s+0.2.0\s+gem\s+/, itf_line, 'list output should show that it is a gem installation with version 0.2.0')
609
- end
610
-
611
- def test_refuse_update_when_already_current
612
- pre_block = Proc.new do |plugin_statefile_data, tmp_dir|
613
- plugin_statefile_data.clear # Signal not to write a file, we'll provide one.
614
- copy_in_core_config_dir('test-fixture-2-float', tmp_dir)
615
- end
616
-
617
- update_result = run_inspec_process_with_this_plugin('plugin update inspec-test-fixture', pre_run: pre_block)
618
- assert_empty update_result.stderr
619
- assert_equal 2, update_result.exit_status, 'Exit status should be 2'
620
-
621
- refusal_message = update_result.stdout.split("\n").grep(/refusing/).last
622
- refute_nil refusal_message, 'Should find a failure message at the end'
623
- assert_includes refusal_message, 'inspec-test-fixture'
624
- assert_includes refusal_message, '0.2.0'
625
- assert_includes refusal_message, 'Already installed at latest version'
626
- end
627
-
628
- def test_fail_update_from_nonexistant_gem
629
- update_result = run_inspec_process_with_this_plugin('plugin update inspec-test-fixture-nonesuch')
630
-
631
- assert_empty update_result.stderr
632
- assert_equal 1, update_result.exit_status, 'Exit status should be 1'
633
- assert_match(/No such plugin installed: .+ - update failed/, update_result.stdout)
634
- end
635
-
636
- def test_fail_update_path
637
- pre_block = Proc.new do |plugin_statefile_data, tmp_dir|
638
- plugin_statefile_data.clear # Signal not to write a file, we'll provide one.
639
- copy_in_core_config_dir('meaning_by_path', tmp_dir)
640
- end
641
-
642
- update_result = run_inspec_process_with_this_plugin('plugin update inspec-meaning-of-life', pre_run: pre_block)
643
- assert_empty update_result.stderr
644
- assert_equal 2, update_result.exit_status, 'Exit status should be 2'
645
-
646
- refusal_message = update_result.stdout.split("\n").grep(/refusing/).last
647
- refute_nil refusal_message, 'Should find a failure message at the end'
648
- assert_includes refusal_message, 'inspec-meaning-of-life'
649
- assert_includes refusal_message, 'inspec plugin uninstall'
650
- assert_includes refusal_message, 'Cannot update path-based install'
651
- end
652
- end
653
-
654
- #-----------------------------------------------------------------------------------------#
655
- # inspec plugin uninstall
656
- #-----------------------------------------------------------------------------------------#
657
- class PluginManagerCliUninstall < MiniTest::Test
658
- include CorePluginFunctionalHelper
659
- include PluginManagerHelpers
660
-
661
- def test_when_a_gem_plugin_can_be_uninstalled
662
- pre_block = Proc.new do |plugin_statefile_data, tmp_dir|
663
- plugin_statefile_data.clear # Signal not to write a file, we'll provide one.
664
- copy_in_core_config_dir('test-fixture-1-float', tmp_dir)
665
- end
666
-
667
- # Attempt uninstall
668
- uninstall_result = run_inspec_process_with_this_plugin('plugin uninstall inspec-test-fixture', pre_run: pre_block, post_run: list_after_run)
669
- assert_empty uninstall_result.stderr
670
- assert_equal 0, uninstall_result.exit_status, 'Exit status should be 0'
671
-
672
- success_message = uninstall_result.stdout.split("\n").grep(/uninstalled/).last
673
- refute_nil success_message, 'Should find a success message at the end'
674
- assert_includes success_message, 'inspec-test-fixture'
675
- assert_includes success_message, '0.1.0'
676
- assert_includes success_message, 'has been uninstalled'
677
-
678
- list_result = uninstall_result.payload.list_result
679
- itf_line = list_result.stdout.split("\n").grep(/inspec-test-fixture/).first
680
- assert_nil itf_line, 'inspec-test-fixture should not appear in the output of inspec list'
681
- end
682
-
683
- def test_when_a_path_plugin_can_be_uninstalled
684
- pre_block = Proc.new do |plugin_statefile_data, tmp_dir|
685
- plugin_statefile_data.clear # Signal not to write a file, we'll provide one.
686
- # This fixture includes a path install for inspec-meaning-of-life
687
- copy_in_core_config_dir('test-fixture-1-float', tmp_dir)
688
- end
689
-
690
- uninstall_result = run_inspec_process_with_this_plugin('plugin uninstall inspec-meaning-of-life', pre_run: pre_block, post_run: list_after_run)
691
- assert_empty uninstall_result.stderr
692
- assert_equal 0, uninstall_result.exit_status, 'Exit status should be 0'
693
-
694
- success_message = uninstall_result.stdout.split("\n").grep(/uninstalled/).last
695
- refute_nil success_message, 'Should find a success message at the end'
696
- assert_includes success_message, 'inspec-meaning-of-life'
697
- assert_includes success_message, 'path-based plugin install'
698
- assert_includes success_message, 'has been uninstalled'
699
-
700
- list_result = uninstall_result.payload.list_result
701
- itf_line = list_result.stdout.split("\n").grep(/inspec-meaning-of-life/).first
702
- assert_nil itf_line, 'inspec-meaning-of-life should not appear in the output of inspec list'
703
- end
704
-
705
- def test_fail_uninstall_from_plugin_that_is_not_installed
706
- uninstall_result = run_inspec_process_with_this_plugin('plugin uninstall inspec-test-fixture-nonesuch')
707
-
708
- assert_empty uninstall_result.stderr
709
- assert_equal 1, uninstall_result.exit_status, 'Exit status should be 1'
710
- refute_includes 'Inspec::Plugin::V2::UnInstallError', uninstall_result.stdout # Stacktrace marker
711
- assert_match(/No such plugin installed: .+ - uninstall failed/, uninstall_result.stdout)
712
- end
713
- end