train 1.5.11 → 1.6.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (88) hide show
  1. checksums.yaml +4 -4
  2. data/lib/train/transports/winrm.rb +16 -4
  3. data/lib/train/version.rb +1 -1
  4. metadata +3 -165
  5. data/.rubocop.yml +0 -77
  6. data/CHANGELOG.md +0 -900
  7. data/Gemfile +0 -41
  8. data/README.md +0 -212
  9. data/Rakefile +0 -73
  10. data/test/fixtures/plugins/train-test-fixture/LICENSE +0 -201
  11. data/test/fixtures/plugins/train-test-fixture/README.md +0 -5
  12. data/test/fixtures/plugins/train-test-fixture/lib/train-test-fixture/connection.rb +0 -35
  13. data/test/fixtures/plugins/train-test-fixture/lib/train-test-fixture/platform.rb +0 -18
  14. data/test/fixtures/plugins/train-test-fixture/lib/train-test-fixture/transport.rb +0 -14
  15. data/test/fixtures/plugins/train-test-fixture/lib/train-test-fixture/version.rb +0 -5
  16. data/test/fixtures/plugins/train-test-fixture/lib/train-test-fixture.rb +0 -4
  17. data/test/fixtures/plugins/train-test-fixture/pkg/train-test-fixture-0.1.0.gem +0 -0
  18. data/test/fixtures/plugins/train-test-fixture/train-test-fixture.gemspec +0 -35
  19. data/test/integration/.kitchen.yml +0 -43
  20. data/test/integration/Berksfile +0 -3
  21. data/test/integration/bootstrap.sh +0 -22
  22. data/test/integration/chefignore +0 -1
  23. data/test/integration/cookbooks/test/metadata.rb +0 -1
  24. data/test/integration/cookbooks/test/recipes/default.rb +0 -100
  25. data/test/integration/cookbooks/test/recipes/prep_files.rb +0 -56
  26. data/test/integration/docker_run.rb +0 -153
  27. data/test/integration/docker_test.rb +0 -24
  28. data/test/integration/docker_test_container.rb +0 -24
  29. data/test/integration/helper.rb +0 -61
  30. data/test/integration/sudo/customcommand.rb +0 -15
  31. data/test/integration/sudo/nopasswd.rb +0 -16
  32. data/test/integration/sudo/passwd.rb +0 -21
  33. data/test/integration/sudo/reqtty.rb +0 -17
  34. data/test/integration/sudo/run_as.rb +0 -12
  35. data/test/integration/test-travis-centos.yml +0 -6
  36. data/test/integration/test-travis-debian.yml +0 -6
  37. data/test/integration/test-travis-fedora.yml +0 -8
  38. data/test/integration/test-travis-oel.yml +0 -6
  39. data/test/integration/test-travis-ubuntu.yml +0 -8
  40. data/test/integration/test_local.rb +0 -19
  41. data/test/integration/test_ssh.rb +0 -39
  42. data/test/integration/tests/path_block_device_test.rb +0 -74
  43. data/test/integration/tests/path_character_device_test.rb +0 -74
  44. data/test/integration/tests/path_file_test.rb +0 -99
  45. data/test/integration/tests/path_folder_test.rb +0 -90
  46. data/test/integration/tests/path_missing_test.rb +0 -76
  47. data/test/integration/tests/path_pipe_test.rb +0 -62
  48. data/test/integration/tests/path_symlink_test.rb +0 -95
  49. data/test/integration/tests/run_command_test.rb +0 -35
  50. data/test/unit/extras/command_wrapper_test.rb +0 -110
  51. data/test/unit/extras/stat_test.rb +0 -210
  52. data/test/unit/file/local/unix_test.rb +0 -224
  53. data/test/unit/file/local/windows_test.rb +0 -101
  54. data/test/unit/file/local_test.rb +0 -121
  55. data/test/unit/file/remote/aix_test.rb +0 -81
  56. data/test/unit/file/remote/linux_test.rb +0 -221
  57. data/test/unit/file/remote/qnx_test.rb +0 -80
  58. data/test/unit/file/remote/unix_test.rb +0 -119
  59. data/test/unit/file/remote/windows_test.rb +0 -72
  60. data/test/unit/file/remote_test.rb +0 -62
  61. data/test/unit/file_test.rb +0 -129
  62. data/test/unit/helper.rb +0 -7
  63. data/test/unit/platforms/detect/os_common_test.rb +0 -85
  64. data/test/unit/platforms/detect/os_linux_test.rb +0 -132
  65. data/test/unit/platforms/detect/os_windows_test.rb +0 -107
  66. data/test/unit/platforms/detect/scanner_test.rb +0 -61
  67. data/test/unit/platforms/detect/uuid_test.rb +0 -133
  68. data/test/unit/platforms/family_test.rb +0 -32
  69. data/test/unit/platforms/os_detect_test.rb +0 -249
  70. data/test/unit/platforms/platform_test.rb +0 -405
  71. data/test/unit/platforms/platforms_test.rb +0 -52
  72. data/test/unit/plugins/connection_test.rb +0 -219
  73. data/test/unit/plugins/transport_test.rb +0 -111
  74. data/test/unit/plugins_test.rb +0 -22
  75. data/test/unit/train_test.rb +0 -247
  76. data/test/unit/transports/aws_test.rb +0 -120
  77. data/test/unit/transports/azure_test.rb +0 -145
  78. data/test/unit/transports/cisco_ios_connection.rb +0 -92
  79. data/test/unit/transports/gcp_test.rb +0 -266
  80. data/test/unit/transports/helpers/azure/file_credentials_test.rb +0 -129
  81. data/test/unit/transports/local_test.rb +0 -183
  82. data/test/unit/transports/mock_test.rb +0 -150
  83. data/test/unit/transports/ssh_test.rb +0 -330
  84. data/test/unit/transports/vmware_test.rb +0 -159
  85. data/test/unit/version_test.rb +0 -8
  86. data/test/windows/local_test.rb +0 -243
  87. data/test/windows/winrm_test.rb +0 -187
  88. data/train.gemspec +0 -45
@@ -1,92 +0,0 @@
1
- # encoding: utf-8
2
-
3
- require 'helper'
4
- require 'train/transports/ssh'
5
-
6
- describe 'CiscoIOSConnection' do
7
- let(:cls) do
8
- Train::Platforms::Detect::Specifications::OS.load
9
- plat = Train::Platforms.name('mock').in_family('cisco_ios')
10
- plat.add_platform_methods
11
- plat.stubs(:cisco_ios?).returns(true)
12
- Train::Platforms::Detect.stubs(:scan).returns(plat)
13
- Train::Transports::SSH
14
- end
15
-
16
- let(:opts) do
17
- {
18
- host: 'fakehost',
19
- user: 'fakeuser',
20
- password: 'fakepassword',
21
- }
22
- end
23
-
24
- let(:connection) do
25
- cls.new(opts).connection
26
- end
27
-
28
- describe '#initialize' do
29
- it 'provides a uri' do
30
- connection.uri.must_equal 'ssh://fakeuser@fakehost:22'
31
- end
32
- end
33
-
34
- describe '#unique_identifier' do
35
- it 'returns the correct identifier' do
36
- output = "\r\nProcessor board ID 1111111111\r\n"
37
- Train::Transports::SSH::CiscoIOSConnection.any_instance
38
- .expects(:run_command_via_connection)
39
- .with('show version | include Processor')
40
- .returns(OpenStruct.new(stdout: output))
41
- connection.unique_identifier.must_equal('1111111111')
42
- end
43
- end
44
-
45
- describe '#format_result' do
46
- it 'returns correctly when result is `good`' do
47
- output = 'good'
48
- Train::Extras::CommandResult.expects(:new).with(output, '', 0)
49
- connection.send(:format_result, 'good')
50
- end
51
-
52
- it 'returns correctly when result matches /Bad IP address/' do
53
- output = "Translating \"nope\"\r\n\r\nTranslating \"nope\"\r\n\r\n% Bad IP address or host name\r\n% Unknown command or computer name, or unable to find computer address\r\n"
54
- Train::Extras::CommandResult.expects(:new).with('', output, 1)
55
- connection.send(:format_result, output)
56
- end
57
-
58
- it 'returns correctly when result matches /Incomplete command/' do
59
- output = "% Incomplete command.\r\n\r\n"
60
- Train::Extras::CommandResult.expects(:new).with('', output, 1)
61
- connection.send(:format_result, output)
62
- end
63
-
64
- it 'returns correctly when result matches /Invalid input detected/' do
65
- output = " ^\r\n% Invalid input detected at '^' marker.\r\n\r\n"
66
- Train::Extras::CommandResult.expects(:new).with('', output, 1)
67
- connection.send(:format_result, output)
68
- end
69
-
70
- it 'returns correctly when result matches /Unrecognized host/' do
71
- output = "Translating \"nope\"\r\n% Unrecognized host or address, or protocol not running.\r\n\r\n"
72
- Train::Extras::CommandResult.expects(:new).with('', output, 1)
73
- connection.send(:format_result, output)
74
- end
75
- end
76
-
77
- describe '#format_output' do
78
- it 'returns the correct output' do
79
- cmd = 'show calendar'
80
- output = "show calendar\r\n10:35:50 UTC Fri Mar 23 2018\r\n7200_ios_12#\r\n7200_ios_12#"
81
- result = connection.send(:format_output, output, cmd)
82
- result.must_equal '10:35:50 UTC Fri Mar 23 2018'
83
- end
84
-
85
- it 'returns the correct output when a pipe is used' do
86
- cmd = 'show running-config | section line con 0'
87
- output = "show running-config | section line con 0\r\nline con 0\r\n exec-timeout 0 0\r\n privilege level 15\r\n logging synchronous\r\n stopbits 1\r\n7200_ios_12#\r\n7200_ios_12#"
88
- result = connection.send(:format_output, output, cmd)
89
- result.must_equal "line con 0\r\n exec-timeout 0 0\r\n privilege level 15\r\n logging synchronous\r\n stopbits 1"
90
- end
91
- end
92
- end
@@ -1,266 +0,0 @@
1
- # encoding: utf-8
2
-
3
- require 'helper'
4
-
5
- describe 'gcp transport' do
6
-
7
- let(:credentials_file) do
8
- require 'tempfile'
9
- file = Tempfile.new('application_default_credentials.json')
10
- info = <<-INFO
11
- {
12
- "client_id": "asdfasf-asdfasdf.apps.googleusercontent.com",
13
- "client_secret": "d-asdfasdf",
14
- "refresh_token": "1/adsfasdf-lCkju3-yQmjr20xVZonrfkE48L",
15
- "type": "authorized_user"
16
- }
17
- INFO
18
- file.write(info)
19
- file.close
20
- file
21
- end
22
-
23
- let(:credentials_file_override) do
24
- require 'tempfile'
25
- file = Tempfile.new('application_default_credentials.json')
26
- info = <<-INFO
27
- {
28
- "client_id": "asdfasf-asdfasdf.apps.googleusercontent.com",
29
- "client_secret": "d-asdfasdf",
30
- "refresh_token": "1/adsfasdf-lCkju3-yQmjr20xVZonrfkE48L",
31
- "type": "authorized_user"
32
- }
33
- INFO
34
- file.write(info)
35
- file.close
36
- file
37
- end
38
-
39
- def transport(options = nil)
40
- ENV['GOOGLE_APPLICATION_CREDENTIALS'] = credentials_file.path
41
- ENV['GOOGLE_CLOUD_PROJECT'] = 'test_project'
42
- # need to require this at here as it captures the envs on load
43
- require 'train/transports/gcp'
44
- Train::Transports::Gcp.new(options)
45
- end
46
-
47
- let(:connection) { transport.connection }
48
- let(:options) { connection.instance_variable_get(:@options) }
49
- let(:cache) { connection.instance_variable_get(:@cache) }
50
-
51
- describe 'options' do
52
- it 'defaults to env options' do
53
- options[:google_application_credentials] = credentials_file.path
54
- options[:google_cloud_project].must_equal 'test_project'
55
- end
56
- end
57
-
58
- it 'allows for options override' do
59
- transport = transport(google_application_credentials: credentials_file_override.path, google_cloud_project: "override_project")
60
- options = transport.connection.instance_variable_get(:@options)
61
- options[:google_application_credentials].must_equal credentials_file_override.path
62
- options[:google_cloud_project].must_equal "override_project"
63
- end
64
-
65
- describe 'platform' do
66
- it 'returns platform' do
67
- platform = connection.platform
68
- platform.name.must_equal 'gcp'
69
- platform.family_hierarchy.must_equal ['cloud', 'api']
70
- end
71
- end
72
-
73
- describe 'gcp_client' do
74
- it 'test gcp_client with caching' do
75
- client = connection.gcp_client(Object)
76
- client.is_a?(Object).must_equal true
77
- cache[:api_call].count.must_equal 1
78
- end
79
-
80
- it 'test gcp_client without caching' do
81
- connection.disable_cache(:api_call)
82
- client = connection.gcp_client(Object)
83
- client.is_a?(Object).must_equal true
84
- cache[:api_call].count.must_equal 0
85
- end
86
- end
87
-
88
-
89
- describe 'gcp_compute_client' do
90
- it 'test gcp_compute_client with caching' do
91
- client = connection.gcp_compute_client
92
- client.is_a?(Google::Apis::ComputeV1::ComputeService).must_equal true
93
- cache[:api_call].count.must_equal 1
94
- end
95
-
96
- it 'test gcp_client without caching' do
97
- connection.disable_cache(:api_call)
98
- client = connection.gcp_compute_client
99
- client.is_a?(Google::Apis::ComputeV1::ComputeService).must_equal true
100
- cache[:api_call].count.must_equal 0
101
- end
102
-
103
- it 'test gcp_compute_client application name' do
104
- client = connection.gcp_compute_client
105
- client.is_a?(Google::Apis::ComputeV1::ComputeService).must_equal true
106
- client.client_options.application_name.must_equal 'chef-inspec-train'
107
- end
108
-
109
- it 'test gcp_compute_client application version' do
110
- client = connection.gcp_compute_client
111
- client.is_a?(Google::Apis::ComputeV1::ComputeService).must_equal true
112
- client.client_options.application_version.must_equal Train::VERSION
113
- end
114
- end
115
-
116
- describe 'gcp_iam_client' do
117
- it 'test gcp_iam_client with caching' do
118
- client = connection.gcp_iam_client
119
- client.is_a?(Google::Apis::IamV1::IamService).must_equal true
120
- cache[:api_call].count.must_equal 1
121
- end
122
-
123
- it 'test gcp_iam_client without caching' do
124
- connection.disable_cache(:api_call)
125
- client = connection.gcp_iam_client
126
- client.is_a?(Google::Apis::IamV1::IamService).must_equal true
127
- cache[:api_call].count.must_equal 0
128
- end
129
-
130
- it 'test gcp_iam_client application name' do
131
- client = connection.gcp_iam_client
132
- client.is_a?(Google::Apis::IamV1::IamService).must_equal true
133
- client.client_options.application_name.must_equal 'chef-inspec-train'
134
- end
135
-
136
- it 'test gcp_iam_client application version' do
137
- client = connection.gcp_iam_client
138
- client.is_a?(Google::Apis::IamV1::IamService).must_equal true
139
- client.client_options.application_version.must_equal Train::VERSION
140
- end
141
- end
142
-
143
- describe 'gcp_project_client' do
144
- it 'test gcp_project_client with caching' do
145
- client = connection.gcp_project_client
146
- client.is_a?(Google::Apis::CloudresourcemanagerV1::CloudResourceManagerService).must_equal true
147
- cache[:api_call].count.must_equal 1
148
- end
149
-
150
- it 'test gcp_project_client without caching' do
151
- connection.disable_cache(:api_call)
152
- client = connection.gcp_project_client
153
- client.is_a?(Google::Apis::CloudresourcemanagerV1::CloudResourceManagerService).must_equal true
154
- cache[:api_call].count.must_equal 0
155
- end
156
-
157
- it 'test gcp_project_client application name' do
158
- client = connection.gcp_project_client
159
- client.is_a?(Google::Apis::CloudresourcemanagerV1::CloudResourceManagerService).must_equal true
160
- client.client_options.application_name.must_equal 'chef-inspec-train'
161
- end
162
-
163
- it 'test gcp_project_client application version' do
164
- client = connection.gcp_project_client
165
- client.is_a?(Google::Apis::CloudresourcemanagerV1::CloudResourceManagerService).must_equal true
166
- client.client_options.application_version.must_equal Train::VERSION
167
- end
168
- end
169
-
170
- describe 'gcp_storage_client' do
171
- it 'test gcp_storage_client with caching' do
172
- client = connection.gcp_storage_client
173
- client.is_a?(Google::Apis::StorageV1::StorageService).must_equal true
174
- cache[:api_call].count.must_equal 1
175
- end
176
-
177
- it 'test gcp_storage_client without caching' do
178
- connection.disable_cache(:api_call)
179
- client = connection.gcp_storage_client
180
- client.is_a?(Google::Apis::StorageV1::StorageService).must_equal true
181
- cache[:api_call].count.must_equal 0
182
- end
183
-
184
- it 'test gcp_storage_client application name' do
185
- client = connection.gcp_storage_client
186
- client.is_a?(Google::Apis::StorageV1::StorageService).must_equal true
187
- client.client_options.application_name.must_equal 'chef-inspec-train'
188
- end
189
-
190
- it 'test gcp_storage_client application version' do
191
- client = connection.gcp_storage_client
192
- client.is_a?(Google::Apis::StorageV1::StorageService).must_equal true
193
- client.client_options.application_version.must_equal Train::VERSION
194
- end
195
- end
196
-
197
- describe 'gcp_admin_client' do
198
- it 'test gcp_admin_client with caching' do
199
- client = connection.gcp_admin_client
200
- client.is_a?(Google::Apis::AdminDirectoryV1::DirectoryService).must_equal true
201
- cache[:api_call].count.must_equal 1
202
- end
203
-
204
- it 'test gcp_admin_client without caching' do
205
- connection.disable_cache(:api_call)
206
- client = connection.gcp_admin_client
207
- client.is_a?(Google::Apis::AdminDirectoryV1::DirectoryService).must_equal true
208
- cache[:api_call].count.must_equal 0
209
- end
210
-
211
- it 'test gcp_admin_client application name' do
212
- client = connection.gcp_admin_client
213
- client.is_a?(Google::Apis::AdminDirectoryV1::DirectoryService).must_equal true
214
- client.client_options.application_name.must_equal 'chef-inspec-train'
215
- end
216
-
217
- it 'test gcp_admin_client application version' do
218
- client = connection.gcp_admin_client
219
- client.is_a?(Google::Apis::AdminDirectoryV1::DirectoryService).must_equal true
220
- client.client_options.application_version.must_equal Train::VERSION
221
- end
222
- end
223
-
224
- # test options override of env vars in connect
225
- describe 'connect' do
226
- let(:creds) do
227
- require 'tempfile'
228
- file = Tempfile.new('creds')
229
- info = <<-INFO
230
- {
231
- "client_id": "asdfasf-asdfasdf.apps.googleusercontent.com",
232
- "client_secret": "d-asdfasdf",
233
- "refresh_token": "1/adsfasdf-lCkju3-yQmjr20xVZonrfkE48L",
234
- "type": "authorized_user"
235
- }
236
- INFO
237
- file.write(info)
238
- file.close
239
- file
240
- end
241
- it 'validate gcp connection with credentials' do
242
- options[:google_application_credentials] = creds.path
243
- connection.connect
244
- ENV['GOOGLE_APPLICATION_CREDENTIALS'].must_equal creds.path
245
- end
246
- it 'validate gcp connection with project' do
247
- options[:google_cloud_project] = 'project'
248
- connection.connect
249
- ENV['GOOGLE_CLOUD_PROJECT'].must_equal 'project'
250
- end
251
- end
252
-
253
- describe 'unique_identifier' do
254
- it 'test connection unique identifier' do
255
- client = connection
256
- client.unique_identifier.must_equal 'asdfasf-asdfasdf.apps.googleusercontent.com'
257
- end
258
- end
259
-
260
- describe 'uri' do
261
- it 'test uri' do
262
- client = connection
263
- client.uri.must_equal 'gcp://asdfasf-asdfasdf.apps.googleusercontent.com'
264
- end
265
- end
266
- end
@@ -1,129 +0,0 @@
1
- # encoding: utf-8
2
-
3
- require 'helper'
4
- require 'tempfile'
5
- require 'train/transports/helpers/azure/file_credentials'
6
-
7
- describe 'parse_credentials_file' do
8
- let(:cred_file_single_entry) do
9
- file = Tempfile.new('cred_file')
10
- info = <<-INFO
11
- [my_subscription_id]
12
- client_id = "my_client_id"
13
- client_secret = "my_client_secret"
14
- tenant_id = "my_tenant_id"
15
- INFO
16
- file.write(info)
17
- file.close
18
- file
19
- end
20
-
21
- let(:cred_file_multiple_entries) do
22
- file = Tempfile.new('cred_file')
23
- info = <<-INFO
24
- [my_subscription_id]
25
- client_id = "my_client_id"
26
- client_secret = "my_client_secret"
27
- tenant_id = "my_tenant_id"
28
-
29
- [my_subscription_id2]
30
- client_id = "my_client_id2"
31
- client_secret = "my_client_secret2"
32
- tenant_id = "my_tenant_id2"
33
- INFO
34
- file.write(info)
35
- file.close
36
- file
37
- end
38
-
39
- let(:options) { { credentials_file: cred_file_multiple_entries.path } }
40
-
41
- it 'handles a nil file' do
42
- options[:credentials_file] = nil
43
-
44
- result = Train::Transports::Helpers::Azure::FileCredentials.parse(options)
45
-
46
- assert_empty(result)
47
- end
48
-
49
- it 'returns empty hash when no credentials file detected' do
50
- result = Train::Transports::Helpers::Azure::FileCredentials.parse({})
51
-
52
- assert_empty(result)
53
- end
54
-
55
- it 'loads only entry from file when no subscription id given' do
56
- options[:credentials_file] = cred_file_single_entry.path
57
-
58
- result = Train::Transports::Helpers::Azure::FileCredentials.parse(options)
59
-
60
- assert_equal('my_tenant_id', result[:tenant_id])
61
- assert_equal('my_client_id', result[:client_id])
62
- assert_equal('my_client_secret', result[:client_secret])
63
- assert_equal('my_subscription_id', result[:subscription_id])
64
- end
65
-
66
- it 'raises an error when no subscription id given and multiple entries' do
67
- error = assert_raises RuntimeError do
68
- Train::Transports::Helpers::Azure::FileCredentials.parse(options)
69
- end
70
-
71
- assert_equal('Credentials file must have one entry. Check your credentials file. If you have more than one entry set AZURE_SUBSCRIPTION_ID environment variable.', error.message)
72
- end
73
-
74
- it 'loads entry when subscription id is given' do
75
- options[:subscription_id] = 'my_subscription_id'
76
-
77
- result = Train::Transports::Helpers::Azure::FileCredentials.parse(options)
78
-
79
- assert_equal('my_tenant_id', result[:tenant_id])
80
- assert_equal('my_client_id', result[:client_id])
81
- assert_equal('my_client_secret', result[:client_secret])
82
- assert_equal('my_subscription_id', result[:subscription_id])
83
- end
84
-
85
- it 'raises an error when subscription id not found' do
86
- options[:subscription_id] = 'missing_subscription_id'
87
-
88
- error = assert_raises RuntimeError do
89
- Train::Transports::Helpers::Azure::FileCredentials.parse(options)
90
- end
91
-
92
- assert_equal('No credentials found for subscription number missing_subscription_id', error.message)
93
- end
94
-
95
- it 'loads entry based on index' do
96
- ENV['AZURE_SUBSCRIPTION_NUMBER'] = '2'
97
-
98
- result = Train::Transports::Helpers::Azure::FileCredentials.parse(options)
99
-
100
- ENV.delete('AZURE_SUBSCRIPTION_NUMBER')
101
-
102
- assert_equal('my_tenant_id2', result[:tenant_id])
103
- assert_equal('my_client_id2', result[:client_id])
104
- assert_equal('my_client_secret2', result[:client_secret])
105
- assert_equal('my_subscription_id2', result[:subscription_id])
106
- end
107
-
108
- it 'raises an error when index is out of bounds' do
109
- ENV['AZURE_SUBSCRIPTION_NUMBER'] = '3'
110
-
111
- error = assert_raises RuntimeError do
112
- Train::Transports::Helpers::Azure::FileCredentials.parse(options)
113
- end
114
- ENV.delete('AZURE_SUBSCRIPTION_NUMBER')
115
-
116
- assert_equal('Your credentials file only contains 2 subscriptions. You specified number 3.', error.message)
117
- end
118
-
119
- it 'raises an error when index 0 is given' do
120
- ENV['AZURE_SUBSCRIPTION_NUMBER'] = '0'
121
-
122
- error = assert_raises RuntimeError do
123
- Train::Transports::Helpers::Azure::FileCredentials.parse(options)
124
- end
125
- ENV.delete('AZURE_SUBSCRIPTION_NUMBER')
126
-
127
- assert_equal('Index must be greater than 0.', error.message)
128
- end
129
- end
@@ -1,183 +0,0 @@
1
- # encoding: utf-8
2
-
3
- require 'helper'
4
- require 'train/transports/local'
5
-
6
- class TransportHelper
7
- attr_accessor :transport
8
-
9
- def initialize(user_opts = {})
10
- opts = {platform_name: 'mock', family_hierarchy: ['mock']}.merge(user_opts)
11
- Train::Platforms::Detect::Specifications::OS.load
12
- plat = Train::Platforms.name(opts[:platform_name])
13
- plat.family_hierarchy = opts[:family_hierarchy]
14
- plat.add_platform_methods
15
- Train::Platforms::Detect.stubs(:scan).returns(plat)
16
- @transport = Train::Transports::Local.new(user_opts)
17
- end
18
- end
19
-
20
- describe 'local transport' do
21
- let(:transport) { TransportHelper.new.transport }
22
- let(:connection) { transport.connection }
23
-
24
- it 'can be instantiated' do
25
- transport.wont_be_nil
26
- end
27
-
28
- it 'gets the connection' do
29
- connection.must_be_kind_of Train::Transports::Local::Connection
30
- end
31
-
32
- it 'provides a uri' do
33
- connection.uri.must_equal 'local://'
34
- end
35
-
36
- it 'doesnt wait to be read' do
37
- connection.wait_until_ready.must_be_nil
38
- end
39
-
40
- it 'can be closed' do
41
- connection.close.must_be_nil
42
- end
43
-
44
- it 'has no login command' do
45
- connection.login_command.must_be_nil
46
- end
47
-
48
- it 'provides a run_command_via_connection method' do
49
- methods = connection.class.private_instance_methods(false)
50
- methods.include?(:run_command_via_connection).must_equal true
51
- end
52
-
53
- it 'provides a file_via_connection method' do
54
- methods = connection.class.private_instance_methods(false)
55
- methods.include?(:file_via_connection).must_equal true
56
- end
57
-
58
- describe 'when overriding runner selection' do
59
- it 'can select the `GenericRunner`' do
60
- Train::Transports::Local::Connection::GenericRunner
61
- .expects(:new)
62
-
63
- Train::Transports::Local::Connection::WindowsPipeRunner
64
- .expects(:new)
65
- .never
66
-
67
- Train::Transports::Local::Connection::WindowsShellRunner
68
- .expects(:new)
69
- .never
70
-
71
- Train::Transports::Local::Connection.new(command_runner: :generic)
72
- end
73
-
74
- it 'can select the `WindowsPipeRunner`' do
75
- Train::Transports::Local::Connection::GenericRunner
76
- .expects(:new)
77
- .never
78
-
79
- Train::Transports::Local::Connection::WindowsPipeRunner
80
- .expects(:new)
81
-
82
- Train::Transports::Local::Connection::WindowsShellRunner
83
- .expects(:new)
84
- .never
85
-
86
- Train::Transports::Local::Connection.new(command_runner: :windows_pipe)
87
- end
88
-
89
- it 'can select the `WindowsShellRunner`' do
90
- Train::Transports::Local::Connection::GenericRunner
91
- .expects(:new)
92
- .never
93
-
94
- Train::Transports::Local::Connection::WindowsPipeRunner
95
- .expects(:new)
96
- .never
97
-
98
- Train::Transports::Local::Connection::WindowsShellRunner
99
- .expects(:new)
100
-
101
- Train::Transports::Local::Connection.new(command_runner: :windows_shell)
102
- end
103
-
104
- it 'throws a RuntimeError when an invalid runner type is passed' do
105
- proc { Train::Transports::Local::Connection.new(command_runner: :nope ) }
106
- .must_raise(RuntimeError, "Runner type `:nope` not supported")
107
- end
108
- end
109
-
110
- describe 'when running a local command' do
111
- let(:cmd_runner) { Minitest::Mock.new }
112
-
113
- def mock_run_cmd(cmd, &block)
114
- cmd_runner.expect :run_command, nil
115
- Mixlib::ShellOut.stub :new, cmd_runner do |*args|
116
- block.call()
117
- end
118
- end
119
-
120
- it 'gets stdout' do
121
- mock_run_cmd(rand) do
122
- x = rand
123
- cmd_runner.expect :stdout, x
124
- cmd_runner.expect :stderr, nil
125
- cmd_runner.expect :exitstatus, nil
126
- connection.run_command(rand).stdout.must_equal x
127
- end
128
- end
129
-
130
- it 'gets stderr' do
131
- mock_run_cmd(rand) do
132
- x = rand
133
- cmd_runner.expect :stdout, nil
134
- cmd_runner.expect :stderr, x
135
- cmd_runner.expect :exitstatus, nil
136
- connection.run_command(rand).stderr.must_equal x
137
- end
138
- end
139
-
140
- it 'gets exit_status' do
141
- mock_run_cmd(rand) do
142
- x = rand
143
- cmd_runner.expect :stdout, nil
144
- cmd_runner.expect :stderr, nil
145
- cmd_runner.expect :exitstatus, x
146
- connection.run_command(rand).exit_status.must_equal x
147
- end
148
- end
149
- end
150
-
151
- describe 'when running on Windows' do
152
- let(:connection) do
153
- TransportHelper.new(family_hierarchy: ['windows']).transport.connection
154
- end
155
- let(:runner) { mock }
156
-
157
- it 'uses `WindowsPipeRunner` by default' do
158
- Train::Transports::Local::Connection::WindowsPipeRunner
159
- .expects(:new)
160
- .returns(runner)
161
-
162
- Train::Transports::Local::Connection::WindowsShellRunner
163
- .expects(:new)
164
- .never
165
-
166
- runner.expects(:run_command).with('not actually executed')
167
- connection.run_command('not actually executed')
168
- end
169
-
170
- it 'uses `WindowsShellRunner` when a named pipe is not available' do
171
- Train::Transports::Local::Connection::WindowsPipeRunner
172
- .expects(:new)
173
- .raises(Train::Transports::Local::PipeError)
174
-
175
- Train::Transports::Local::Connection::WindowsShellRunner
176
- .expects(:new)
177
- .returns(runner)
178
-
179
- runner.expects(:run_command).with('not actually executed')
180
- connection.run_command('not actually executed')
181
- end
182
- end
183
- end