train 1.5.11 → 1.6.3
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/lib/train/transports/winrm.rb +16 -4
- data/lib/train/version.rb +1 -1
- metadata +3 -165
- data/.rubocop.yml +0 -77
- data/CHANGELOG.md +0 -900
- data/Gemfile +0 -41
- data/README.md +0 -212
- data/Rakefile +0 -73
- data/test/fixtures/plugins/train-test-fixture/LICENSE +0 -201
- data/test/fixtures/plugins/train-test-fixture/README.md +0 -5
- data/test/fixtures/plugins/train-test-fixture/lib/train-test-fixture/connection.rb +0 -35
- data/test/fixtures/plugins/train-test-fixture/lib/train-test-fixture/platform.rb +0 -18
- data/test/fixtures/plugins/train-test-fixture/lib/train-test-fixture/transport.rb +0 -14
- data/test/fixtures/plugins/train-test-fixture/lib/train-test-fixture/version.rb +0 -5
- data/test/fixtures/plugins/train-test-fixture/lib/train-test-fixture.rb +0 -4
- data/test/fixtures/plugins/train-test-fixture/pkg/train-test-fixture-0.1.0.gem +0 -0
- data/test/fixtures/plugins/train-test-fixture/train-test-fixture.gemspec +0 -35
- data/test/integration/.kitchen.yml +0 -43
- data/test/integration/Berksfile +0 -3
- data/test/integration/bootstrap.sh +0 -22
- data/test/integration/chefignore +0 -1
- data/test/integration/cookbooks/test/metadata.rb +0 -1
- data/test/integration/cookbooks/test/recipes/default.rb +0 -100
- data/test/integration/cookbooks/test/recipes/prep_files.rb +0 -56
- data/test/integration/docker_run.rb +0 -153
- data/test/integration/docker_test.rb +0 -24
- data/test/integration/docker_test_container.rb +0 -24
- data/test/integration/helper.rb +0 -61
- data/test/integration/sudo/customcommand.rb +0 -15
- data/test/integration/sudo/nopasswd.rb +0 -16
- data/test/integration/sudo/passwd.rb +0 -21
- data/test/integration/sudo/reqtty.rb +0 -17
- data/test/integration/sudo/run_as.rb +0 -12
- data/test/integration/test-travis-centos.yml +0 -6
- data/test/integration/test-travis-debian.yml +0 -6
- data/test/integration/test-travis-fedora.yml +0 -8
- data/test/integration/test-travis-oel.yml +0 -6
- data/test/integration/test-travis-ubuntu.yml +0 -8
- data/test/integration/test_local.rb +0 -19
- data/test/integration/test_ssh.rb +0 -39
- data/test/integration/tests/path_block_device_test.rb +0 -74
- data/test/integration/tests/path_character_device_test.rb +0 -74
- data/test/integration/tests/path_file_test.rb +0 -99
- data/test/integration/tests/path_folder_test.rb +0 -90
- data/test/integration/tests/path_missing_test.rb +0 -76
- data/test/integration/tests/path_pipe_test.rb +0 -62
- data/test/integration/tests/path_symlink_test.rb +0 -95
- data/test/integration/tests/run_command_test.rb +0 -35
- data/test/unit/extras/command_wrapper_test.rb +0 -110
- data/test/unit/extras/stat_test.rb +0 -210
- data/test/unit/file/local/unix_test.rb +0 -224
- data/test/unit/file/local/windows_test.rb +0 -101
- data/test/unit/file/local_test.rb +0 -121
- data/test/unit/file/remote/aix_test.rb +0 -81
- data/test/unit/file/remote/linux_test.rb +0 -221
- data/test/unit/file/remote/qnx_test.rb +0 -80
- data/test/unit/file/remote/unix_test.rb +0 -119
- data/test/unit/file/remote/windows_test.rb +0 -72
- data/test/unit/file/remote_test.rb +0 -62
- data/test/unit/file_test.rb +0 -129
- data/test/unit/helper.rb +0 -7
- data/test/unit/platforms/detect/os_common_test.rb +0 -85
- data/test/unit/platforms/detect/os_linux_test.rb +0 -132
- data/test/unit/platforms/detect/os_windows_test.rb +0 -107
- data/test/unit/platforms/detect/scanner_test.rb +0 -61
- data/test/unit/platforms/detect/uuid_test.rb +0 -133
- data/test/unit/platforms/family_test.rb +0 -32
- data/test/unit/platforms/os_detect_test.rb +0 -249
- data/test/unit/platforms/platform_test.rb +0 -405
- data/test/unit/platforms/platforms_test.rb +0 -52
- data/test/unit/plugins/connection_test.rb +0 -219
- data/test/unit/plugins/transport_test.rb +0 -111
- data/test/unit/plugins_test.rb +0 -22
- data/test/unit/train_test.rb +0 -247
- data/test/unit/transports/aws_test.rb +0 -120
- data/test/unit/transports/azure_test.rb +0 -145
- data/test/unit/transports/cisco_ios_connection.rb +0 -92
- data/test/unit/transports/gcp_test.rb +0 -266
- data/test/unit/transports/helpers/azure/file_credentials_test.rb +0 -129
- data/test/unit/transports/local_test.rb +0 -183
- data/test/unit/transports/mock_test.rb +0 -150
- data/test/unit/transports/ssh_test.rb +0 -330
- data/test/unit/transports/vmware_test.rb +0 -159
- data/test/unit/version_test.rb +0 -8
- data/test/windows/local_test.rb +0 -243
- data/test/windows/winrm_test.rb +0 -187
- data/train.gemspec +0 -45
@@ -1,110 +0,0 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
# author: Dominik Richter
|
3
|
-
# author: Christoph Hartmann
|
4
|
-
|
5
|
-
require 'helper'
|
6
|
-
require 'train/transports/mock'
|
7
|
-
require 'train/extras'
|
8
|
-
require 'base64'
|
9
|
-
|
10
|
-
describe 'linux command' do
|
11
|
-
let(:cls) { Train::Extras::LinuxCommand }
|
12
|
-
let(:cmd) { rand.to_s }
|
13
|
-
let(:backend) {
|
14
|
-
backend = Train::Transports::Mock.new.connection
|
15
|
-
backend.mock_os({ family: 'linux' })
|
16
|
-
backend
|
17
|
-
}
|
18
|
-
|
19
|
-
describe 'sudo wrapping' do
|
20
|
-
it 'wraps commands in sudo' do
|
21
|
-
lc = cls.new(backend, { sudo: true })
|
22
|
-
lc.run(cmd).must_equal "sudo #{cmd}"
|
23
|
-
end
|
24
|
-
|
25
|
-
it 'doesnt wrap commands in sudo if user == root' do
|
26
|
-
lc = cls.new(backend, { sudo: true, user: 'root' })
|
27
|
-
lc.run(cmd).must_equal cmd
|
28
|
-
end
|
29
|
-
|
30
|
-
it 'wraps commands in sudo with all options' do
|
31
|
-
opts = rand.to_s
|
32
|
-
lc = cls.new(backend, { sudo: true, sudo_options: opts })
|
33
|
-
lc.run(cmd).must_equal "sudo #{opts} #{cmd}"
|
34
|
-
end
|
35
|
-
|
36
|
-
it 'runs commands in sudo with password' do
|
37
|
-
pw = rand.to_s
|
38
|
-
lc = cls.new(backend, { sudo: true, sudo_password: pw })
|
39
|
-
bpw = Base64.strict_encode64(pw + "\n")
|
40
|
-
lc.run(cmd).must_equal "echo #{bpw} | base64 --decode | sudo -S #{cmd}"
|
41
|
-
end
|
42
|
-
|
43
|
-
it 'wraps commands in sudo_command instead of sudo' do
|
44
|
-
sudo_command = rand.to_s
|
45
|
-
lc = cls.new(backend, { sudo: true, sudo_command: sudo_command })
|
46
|
-
lc.run(cmd).must_equal "#{sudo_command} #{cmd}"
|
47
|
-
end
|
48
|
-
|
49
|
-
it 'wraps commands in sudo_command with all options' do
|
50
|
-
opts = rand.to_s
|
51
|
-
sudo_command = rand.to_s
|
52
|
-
lc = cls.new(backend, { sudo: true, sudo_command: sudo_command, sudo_options: opts })
|
53
|
-
lc.run(cmd).must_equal "#{sudo_command} #{opts} #{cmd}"
|
54
|
-
end
|
55
|
-
|
56
|
-
it 'runs commands in sudo_command with password' do
|
57
|
-
pw = rand.to_s
|
58
|
-
sudo_command = rand.to_s
|
59
|
-
lc = cls.new(backend, { sudo: true, sudo_command: sudo_command, sudo_password: pw })
|
60
|
-
bpw = Base64.strict_encode64(pw + "\n")
|
61
|
-
lc.run(cmd).must_equal "echo #{bpw} | base64 --decode | #{sudo_command} -S #{cmd}"
|
62
|
-
end
|
63
|
-
end
|
64
|
-
|
65
|
-
describe 'shell wrapping' do
|
66
|
-
it 'wraps commands in a default shell with login' do
|
67
|
-
lc = cls.new(backend, { shell: true, shell_options: '--login' })
|
68
|
-
bcmd = Base64.strict_encode64(cmd)
|
69
|
-
lc.run(cmd).must_equal "echo #{bcmd} | base64 --decode | $SHELL --login"
|
70
|
-
end
|
71
|
-
|
72
|
-
it 'wraps sudo commands in a default shell with login' do
|
73
|
-
lc = cls.new(backend, { sudo: true, shell: true, shell_options: '--login' })
|
74
|
-
bcmd = Base64.strict_encode64("sudo #{cmd}")
|
75
|
-
lc.run(cmd).must_equal "echo #{bcmd} | base64 --decode | $SHELL --login"
|
76
|
-
end
|
77
|
-
|
78
|
-
it 'wraps sudo commands and sudo passwords in a default shell with login' do
|
79
|
-
pw = rand.to_s
|
80
|
-
lc = cls.new(backend, { sudo: true, sudo_password: pw, shell: true, shell_options: '--login' })
|
81
|
-
bpw = Base64.strict_encode64(pw + "\n")
|
82
|
-
bcmd = Base64.strict_encode64("echo #{bpw} | base64 --decode | sudo -S #{cmd}")
|
83
|
-
lc.run(cmd).must_equal "echo #{bcmd} | base64 --decode | $SHELL --login"
|
84
|
-
p bcmd
|
85
|
-
end
|
86
|
-
|
87
|
-
it 'wraps commands in a default shell when shell is true' do
|
88
|
-
lc = cls.new(backend, { shell: true })
|
89
|
-
bcmd = Base64.strict_encode64(cmd)
|
90
|
-
lc.run(cmd).must_equal "echo #{bcmd} | base64 --decode | $SHELL"
|
91
|
-
end
|
92
|
-
|
93
|
-
it 'doesnt wrap commands in a shell when shell is false' do
|
94
|
-
lc = cls.new(backend, { shell: false })
|
95
|
-
lc.run(cmd).must_equal cmd
|
96
|
-
end
|
97
|
-
|
98
|
-
it 'wraps commands in a `shell` instead of default shell' do
|
99
|
-
lc = cls.new(backend, { shell: true, shell_command: '/bin/bash' })
|
100
|
-
bcmd = Base64.strict_encode64(cmd)
|
101
|
-
lc.run(cmd).must_equal "echo #{bcmd} | base64 --decode | /bin/bash"
|
102
|
-
end
|
103
|
-
|
104
|
-
it 'wraps commands in a default shell with login' do
|
105
|
-
lc = cls.new(backend, { shell: true, shell_command: '/bin/bash', shell_options: '--login' })
|
106
|
-
bcmd = Base64.strict_encode64(cmd)
|
107
|
-
lc.run(cmd).must_equal "echo #{bcmd} | base64 --decode | /bin/bash --login"
|
108
|
-
end
|
109
|
-
end
|
110
|
-
end
|
@@ -1,210 +0,0 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
require 'helper'
|
3
|
-
require 'train/extras'
|
4
|
-
require 'train/transports/mock'
|
5
|
-
|
6
|
-
describe 'stat' do
|
7
|
-
let(:cls) { Train::Extras::Stat }
|
8
|
-
|
9
|
-
describe 'find_type' do
|
10
|
-
let (:random_mode) { (rand * 1000).to_i }
|
11
|
-
|
12
|
-
it 'detects :unknown types' do
|
13
|
-
cls.find_type(random_mode).must_equal :unknown
|
14
|
-
end
|
15
|
-
|
16
|
-
it 'detects sockets' do
|
17
|
-
cls.find_type(00140755).must_equal :socket
|
18
|
-
end
|
19
|
-
|
20
|
-
it 'detects symlinks' do
|
21
|
-
cls.find_type(00120755).must_equal :symlink
|
22
|
-
end
|
23
|
-
|
24
|
-
it 'detects files' do
|
25
|
-
cls.find_type(00100755).must_equal :file
|
26
|
-
end
|
27
|
-
|
28
|
-
it 'detects block devices' do
|
29
|
-
cls.find_type(00060755).must_equal :block_device
|
30
|
-
end
|
31
|
-
|
32
|
-
it 'detects directories' do
|
33
|
-
cls.find_type(00040755).must_equal :directory
|
34
|
-
end
|
35
|
-
|
36
|
-
it 'detects character devices' do
|
37
|
-
cls.find_type(00020755).must_equal :character_device
|
38
|
-
end
|
39
|
-
|
40
|
-
it 'detects pipes' do
|
41
|
-
cls.find_type(00010755).must_equal :pipe
|
42
|
-
end
|
43
|
-
end
|
44
|
-
|
45
|
-
describe 'linux stat' do
|
46
|
-
let(:backend) {
|
47
|
-
mock = Train::Transports::Mock.new(verbose: true).connection
|
48
|
-
mock.mock_os({ name: 'ubuntu', family: 'debian', release: '15.04', arch: 'x86_64' })
|
49
|
-
mock.commands = {
|
50
|
-
"stat /path 2>/dev/null --printf '%s\n%f\n%U\n%u\n%G\n%g\n%X\n%Y\n%C'" => mock.mock_command('', '', '', 0),
|
51
|
-
"stat /path-stat 2>/dev/null --printf '%s\n%f\n%U\n%u\n%G\n%g\n%X\n%Y\n%C'" => mock.mock_command('', "360\n43ff\nroot\n0\nrootz\n1\n1444520846\n1444522445\n?", '', 0),
|
52
|
-
}
|
53
|
-
mock
|
54
|
-
}
|
55
|
-
|
56
|
-
it 'ignores wrong stat results' do
|
57
|
-
cls.linux_stat('/path', backend, false).must_equal({})
|
58
|
-
end
|
59
|
-
|
60
|
-
it 'reads correct stat results' do
|
61
|
-
cls.linux_stat('/path-stat', backend, false).must_equal({
|
62
|
-
type: :directory,
|
63
|
-
mode: 01777,
|
64
|
-
owner: 'root',
|
65
|
-
uid: 0,
|
66
|
-
group: 'rootz',
|
67
|
-
gid: 1,
|
68
|
-
mtime: 1444522445,
|
69
|
-
size: 360,
|
70
|
-
selinux_label: nil,
|
71
|
-
})
|
72
|
-
end
|
73
|
-
end
|
74
|
-
|
75
|
-
describe 'esx stat' do
|
76
|
-
let(:backend) {
|
77
|
-
mock = Train::Transports::Mock.new(verbose: true).connection
|
78
|
-
mock.mock_os({ name: 'vmkernel', family: 'esx', release: '5' })
|
79
|
-
mock.commands = {
|
80
|
-
"stat /path 2>/dev/null -c '%s\n%f\n%U\n%u\n%G\n%g\n%X\n%Y\n%C'" => mock.mock_command('', '', '', 0),
|
81
|
-
"stat /path-stat 2>/dev/null -c '%s\n%f\n%U\n%u\n%G\n%g\n%X\n%Y\n%C'" => mock.mock_command('', "360\n43ff\nroot\n0\nrootz\n1\n1444520846\n1444522445\n?", '', 0),
|
82
|
-
}
|
83
|
-
mock
|
84
|
-
}
|
85
|
-
|
86
|
-
it 'ignores wrong stat results' do
|
87
|
-
cls.linux_stat('/path', backend, false).must_equal({})
|
88
|
-
end
|
89
|
-
|
90
|
-
it 'reads correct stat results' do
|
91
|
-
cls.linux_stat('/path-stat', backend, false).must_equal({
|
92
|
-
type: :directory,
|
93
|
-
mode: 01777,
|
94
|
-
owner: 'root',
|
95
|
-
uid: 0,
|
96
|
-
group: 'rootz',
|
97
|
-
gid: 1,
|
98
|
-
mtime: 1444522445,
|
99
|
-
size: 360,
|
100
|
-
selinux_label: nil,
|
101
|
-
})
|
102
|
-
end
|
103
|
-
end
|
104
|
-
|
105
|
-
describe 'alpine stat' do
|
106
|
-
let(:backend) {
|
107
|
-
mock = Train::Transports::Mock.new(verbose: true).connection
|
108
|
-
mock.mock_os({ name: 'alpine', family: 'alpine', release: nil })
|
109
|
-
mock.commands = {
|
110
|
-
"stat /path 2>/dev/null -c '%s\n%f\n%U\n%u\n%G\n%g\n%X\n%Y\n%C'" => mock.mock_command('', '', '', 0),
|
111
|
-
"stat /path-stat 2>/dev/null -c '%s\n%f\n%U\n%u\n%G\n%g\n%X\n%Y\n%C'" => mock.mock_command('', "360\n43ff\nroot\n0\nrootz\n1\n1444520846\n1444522445\n?", '', 0),
|
112
|
-
}
|
113
|
-
mock
|
114
|
-
}
|
115
|
-
|
116
|
-
it 'ignores wrong stat results' do
|
117
|
-
cls.linux_stat('/path', backend, false).must_equal({})
|
118
|
-
end
|
119
|
-
|
120
|
-
it 'reads correct stat results' do
|
121
|
-
cls.linux_stat('/path-stat', backend, false).must_equal({
|
122
|
-
type: :directory,
|
123
|
-
mode: 01777,
|
124
|
-
owner: 'root',
|
125
|
-
uid: 0,
|
126
|
-
group: 'rootz',
|
127
|
-
gid: 1,
|
128
|
-
mtime: 1444522445,
|
129
|
-
size: 360,
|
130
|
-
selinux_label: nil,
|
131
|
-
})
|
132
|
-
end
|
133
|
-
end
|
134
|
-
|
135
|
-
describe 'bsd stat' do
|
136
|
-
let(:backend) { Minitest::Mock.new }
|
137
|
-
|
138
|
-
it 'ignores failed stat results' do
|
139
|
-
res = Minitest::Mock.new
|
140
|
-
res.expect :stdout, '.....'
|
141
|
-
res.expect :exit_status, 1
|
142
|
-
backend.expect :run_command, res, [String]
|
143
|
-
cls.bsd_stat('/path', backend, false).must_equal({})
|
144
|
-
end
|
145
|
-
|
146
|
-
it 'ignores wrong stat results' do
|
147
|
-
res = Minitest::Mock.new
|
148
|
-
res.expect :stdout, ''
|
149
|
-
res.expect :exit_status, 0
|
150
|
-
backend.expect :run_command, res, [String]
|
151
|
-
cls.bsd_stat('/path', backend, false).must_equal({})
|
152
|
-
end
|
153
|
-
|
154
|
-
it 'reads correct stat results' do
|
155
|
-
res = Minitest::Mock.new
|
156
|
-
res.expect :stdout, "360\n41777\nroot\n0\nrootz\n1\n1444520846\n1444522445"
|
157
|
-
res.expect :exit_status, 0
|
158
|
-
backend.expect :run_command, res, [String]
|
159
|
-
cls.bsd_stat('/path', backend, false).must_equal({
|
160
|
-
type: :directory,
|
161
|
-
mode: 01777,
|
162
|
-
owner: 'root',
|
163
|
-
uid: 0,
|
164
|
-
group: 'rootz',
|
165
|
-
gid: 1,
|
166
|
-
mtime: 1444522445,
|
167
|
-
size: 360,
|
168
|
-
selinux_label: nil,
|
169
|
-
})
|
170
|
-
end
|
171
|
-
end
|
172
|
-
|
173
|
-
describe 'aix stat' do
|
174
|
-
let(:backend) { Minitest::Mock.new }
|
175
|
-
|
176
|
-
it 'ignores failed stat results' do
|
177
|
-
res = Minitest::Mock.new
|
178
|
-
res.expect :stdout, '.....'
|
179
|
-
res.expect :exit_status, 1
|
180
|
-
backend.expect :run_command, res, [String]
|
181
|
-
cls.aix_stat('/path', backend, false).must_equal({})
|
182
|
-
end
|
183
|
-
|
184
|
-
it 'ignores wrong stat results' do
|
185
|
-
res = Minitest::Mock.new
|
186
|
-
res.expect :stdout, ''
|
187
|
-
res.expect :exit_status, 0
|
188
|
-
backend.expect :run_command, res, [String]
|
189
|
-
cls.aix_stat('/path', backend, false).must_equal({})
|
190
|
-
end
|
191
|
-
|
192
|
-
it 'reads correct stat results' do
|
193
|
-
res = Minitest::Mock.new
|
194
|
-
res.expect :stdout, "41777\nroot\n0\nrootz\n1\n1444522445\n360\n"
|
195
|
-
res.expect :exit_status, 0
|
196
|
-
backend.expect :run_command, res, [String]
|
197
|
-
cls.aix_stat('/path', backend, false).must_equal({
|
198
|
-
type: :directory,
|
199
|
-
mode: 01777,
|
200
|
-
owner: 'root',
|
201
|
-
uid: 0,
|
202
|
-
group: 'rootz',
|
203
|
-
gid: 1,
|
204
|
-
mtime: 1444522445,
|
205
|
-
size: 360,
|
206
|
-
selinux_label: nil,
|
207
|
-
})
|
208
|
-
end
|
209
|
-
end
|
210
|
-
end
|
@@ -1,224 +0,0 @@
|
|
1
|
-
require 'helper'
|
2
|
-
require 'train/file/local/unix'
|
3
|
-
require 'train/transports/mock'
|
4
|
-
require 'train/transports/local'
|
5
|
-
|
6
|
-
describe Train::File::Local::Unix do
|
7
|
-
let(:cls) { Train::File::Local::Unix }
|
8
|
-
|
9
|
-
let(:backend) {
|
10
|
-
backend = Train::Transports::Mock.new.connection
|
11
|
-
backend.mock_os({ family: 'linux' })
|
12
|
-
backend
|
13
|
-
}
|
14
|
-
|
15
|
-
it 'checks a mounted path' do
|
16
|
-
backend.mock_command("mount | grep -- ' on /mount/path '", rand.to_s)
|
17
|
-
cls.new(backend, '/mount/path').mounted?.must_equal true
|
18
|
-
end
|
19
|
-
|
20
|
-
describe 'file metadata' do
|
21
|
-
let(:transport) { Train::Transports::Local.new }
|
22
|
-
let(:connection) { transport.connection }
|
23
|
-
|
24
|
-
let(:stat) { Struct.new(:mode, :size, :mtime, :uid, :gid) }
|
25
|
-
let(:uid) { rand }
|
26
|
-
let(:gid) { rand }
|
27
|
-
let(:statres) { stat.new(00140755, rand, (rand*100).to_i, uid, gid) }
|
28
|
-
|
29
|
-
def meta_stub(method, param, &block)
|
30
|
-
pwres = Struct.new(:name)
|
31
|
-
Etc.stub :getpwuid, pwres.new('owner') do
|
32
|
-
Etc.stub :getgrgid, pwres.new('group') do
|
33
|
-
File.stub method, param do; yield; end
|
34
|
-
end
|
35
|
-
end
|
36
|
-
end
|
37
|
-
|
38
|
-
it 'recognizes type' do
|
39
|
-
meta_stub :stat, statres do
|
40
|
-
connection.file(rand.to_s).stat[:type].must_equal :socket
|
41
|
-
end
|
42
|
-
end
|
43
|
-
|
44
|
-
it 'recognizes mode' do
|
45
|
-
meta_stub :stat, statres do
|
46
|
-
connection.file(rand.to_s).stat[:mode].must_equal 00755
|
47
|
-
end
|
48
|
-
end
|
49
|
-
|
50
|
-
it 'recognizes mtime' do
|
51
|
-
meta_stub :stat, statres do
|
52
|
-
connection.file(rand.to_s).stat[:mtime].must_equal statres.mtime
|
53
|
-
end
|
54
|
-
end
|
55
|
-
|
56
|
-
it 'recognizes size' do
|
57
|
-
meta_stub :stat, statres do
|
58
|
-
connection.file(rand.to_s).stat[:size].must_equal statres.size
|
59
|
-
end
|
60
|
-
end
|
61
|
-
|
62
|
-
it 'recognizes uid' do
|
63
|
-
meta_stub :stat, statres do
|
64
|
-
connection.file(rand.to_s).stat[:uid].must_equal uid
|
65
|
-
end
|
66
|
-
end
|
67
|
-
|
68
|
-
it 'recognizes gid' do
|
69
|
-
meta_stub :stat, statres do
|
70
|
-
connection.file(rand.to_s).stat[:gid].must_equal gid
|
71
|
-
end
|
72
|
-
end
|
73
|
-
|
74
|
-
it 'recognizes owner' do
|
75
|
-
meta_stub :stat, statres do
|
76
|
-
connection.file(rand.to_s).owner.must_equal 'owner'
|
77
|
-
end
|
78
|
-
end
|
79
|
-
|
80
|
-
it 'recognizes group' do
|
81
|
-
meta_stub :stat, statres do
|
82
|
-
connection.file(rand.to_s).group.must_equal 'group'
|
83
|
-
end
|
84
|
-
end
|
85
|
-
|
86
|
-
it 'grouped_into' do
|
87
|
-
meta_stub :stat, statres do
|
88
|
-
connection.file(rand.to_s).grouped_into?('group').must_equal true
|
89
|
-
end
|
90
|
-
end
|
91
|
-
|
92
|
-
it 'recognizes selinux label' do
|
93
|
-
meta_stub :stat, statres do
|
94
|
-
label = rand.to_s
|
95
|
-
res = Train::Extras::CommandResult.new(label, nil, 0)
|
96
|
-
connection.stub :run_command, res do
|
97
|
-
connection.file(rand.to_s).selinux_label.must_equal label
|
98
|
-
end
|
99
|
-
end
|
100
|
-
end
|
101
|
-
|
102
|
-
it 'recognizes source selinux label' do
|
103
|
-
meta_stub :lstat, statres do
|
104
|
-
label = rand.to_s
|
105
|
-
res = Train::Extras::CommandResult.new(label, nil, 0)
|
106
|
-
connection.stub :run_command, res do
|
107
|
-
connection.file(rand.to_s).source.selinux_label.must_equal label
|
108
|
-
end
|
109
|
-
end
|
110
|
-
end
|
111
|
-
end
|
112
|
-
|
113
|
-
describe '#unix_mode_mask' do
|
114
|
-
let(:file_tester) do
|
115
|
-
Class.new(cls) do
|
116
|
-
define_method :type do
|
117
|
-
:file
|
118
|
-
end
|
119
|
-
end.new(nil, nil, false)
|
120
|
-
end
|
121
|
-
|
122
|
-
it 'check owner mode calculation' do
|
123
|
-
file_tester.unix_mode_mask('owner', 'x').must_equal 0100
|
124
|
-
file_tester.unix_mode_mask('owner', 'w').must_equal 0200
|
125
|
-
file_tester.unix_mode_mask('owner', 'r').must_equal 0400
|
126
|
-
end
|
127
|
-
|
128
|
-
it 'check group mode calculation' do
|
129
|
-
file_tester.unix_mode_mask('group', 'x').must_equal 0010
|
130
|
-
file_tester.unix_mode_mask('group', 'w').must_equal 0020
|
131
|
-
file_tester.unix_mode_mask('group', 'r').must_equal 0040
|
132
|
-
end
|
133
|
-
|
134
|
-
it 'check other mode calculation' do
|
135
|
-
file_tester.unix_mode_mask('other', 'x').must_equal 0001
|
136
|
-
file_tester.unix_mode_mask('other', 'w').must_equal 0002
|
137
|
-
file_tester.unix_mode_mask('other', 'r').must_equal 0004
|
138
|
-
end
|
139
|
-
|
140
|
-
it 'check all mode calculation' do
|
141
|
-
file_tester.unix_mode_mask('all', 'x').must_equal 0111
|
142
|
-
file_tester.unix_mode_mask('all', 'w').must_equal 0222
|
143
|
-
file_tester.unix_mode_mask('all', 'r').must_equal 0444
|
144
|
-
end
|
145
|
-
end
|
146
|
-
|
147
|
-
describe '#md5sum' do
|
148
|
-
let(:md5_checksum) { '57d4c6f9d15313fd5651317e588c035d' }
|
149
|
-
|
150
|
-
let(:ruby_md5_mock) do
|
151
|
-
checksum_mock = mock
|
152
|
-
checksum_mock.expects(:update).returns('')
|
153
|
-
checksum_mock.expects(:hexdigest).returns(md5_checksum)
|
154
|
-
checksum_mock
|
155
|
-
end
|
156
|
-
|
157
|
-
it 'defaults to a Ruby based checksum if other methods fail' do
|
158
|
-
backend.mock_command('md5sum /tmp/testfile', '', '', 1)
|
159
|
-
Digest::MD5.expects(:new).returns(ruby_md5_mock)
|
160
|
-
cls.new(backend, '/tmp/testfile').md5sum.must_equal md5_checksum
|
161
|
-
end
|
162
|
-
|
163
|
-
it 'calculates the correct md5sum on the `linux` platform family' do
|
164
|
-
output = "#{md5_checksum} /tmp/testfile"
|
165
|
-
backend.mock_command('md5sum /tmp/testfile', output)
|
166
|
-
cls.new(backend, '/tmp/testfile').md5sum.must_equal md5_checksum
|
167
|
-
end
|
168
|
-
|
169
|
-
it 'calculates the correct md5sum on the `darwin` platform family' do
|
170
|
-
output = "#{md5_checksum} /tmp/testfile"
|
171
|
-
backend.mock_os(family: 'darwin')
|
172
|
-
backend.mock_command('md5 -r /tmp/testfile', output)
|
173
|
-
cls.new(backend, '/tmp/testfile').md5sum.must_equal md5_checksum
|
174
|
-
end
|
175
|
-
|
176
|
-
it 'calculates the correct md5sum on the `solaris` platform family' do
|
177
|
-
# The `digest` command doesn't output the filename by default
|
178
|
-
output = "#{md5_checksum}"
|
179
|
-
backend.mock_os(family: 'solaris')
|
180
|
-
backend.mock_command('digest -a md5 /tmp/testfile', output)
|
181
|
-
cls.new(backend, '/tmp/testfile').md5sum.must_equal md5_checksum
|
182
|
-
end
|
183
|
-
end
|
184
|
-
|
185
|
-
describe '#sha256sum' do
|
186
|
-
let(:sha256_checksum) {
|
187
|
-
'491260aaa6638d4a64c714a17828c3d82bad6ca600c9149b3b3350e91bcd283d'
|
188
|
-
}
|
189
|
-
|
190
|
-
let(:ruby_sha256_mock) do
|
191
|
-
checksum_mock = mock
|
192
|
-
checksum_mock.expects(:update).returns('')
|
193
|
-
checksum_mock.expects(:hexdigest).returns(sha256_checksum)
|
194
|
-
checksum_mock
|
195
|
-
end
|
196
|
-
|
197
|
-
it 'defaults to a Ruby based checksum if other methods fail' do
|
198
|
-
backend.mock_command('sha256sum /tmp/testfile', '', '', 1)
|
199
|
-
Digest::SHA256.expects(:new).returns(ruby_sha256_mock)
|
200
|
-
cls.new(backend, '/tmp/testfile').sha256sum.must_equal sha256_checksum
|
201
|
-
end
|
202
|
-
|
203
|
-
it 'calculates the correct sha256sum on the `linux` platform family' do
|
204
|
-
output = "#{sha256_checksum} /tmp/testfile"
|
205
|
-
backend.mock_command('sha256sum /tmp/testfile', output)
|
206
|
-
cls.new(backend, '/tmp/testfile').sha256sum.must_equal sha256_checksum
|
207
|
-
end
|
208
|
-
|
209
|
-
it 'calculates the correct sha256sum on the `darwin` platform family' do
|
210
|
-
output = "#{sha256_checksum} /tmp/testfile"
|
211
|
-
backend.mock_os(family: 'darwin')
|
212
|
-
backend.mock_command('shasum -a 256 /tmp/testfile', output)
|
213
|
-
cls.new(backend, '/tmp/testfile').sha256sum.must_equal sha256_checksum
|
214
|
-
end
|
215
|
-
|
216
|
-
it 'calculates the correct sha256sum on the `solaris` platform family' do
|
217
|
-
# The `digest` command doesn't output the filename by default
|
218
|
-
output = "#{sha256_checksum}"
|
219
|
-
backend.mock_os(family: 'solaris')
|
220
|
-
backend.mock_command('digest -a sha256 /tmp/testfile', output)
|
221
|
-
cls.new(backend, '/tmp/testfile').sha256sum.must_equal sha256_checksum
|
222
|
-
end
|
223
|
-
end
|
224
|
-
end
|
@@ -1,101 +0,0 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
|
3
|
-
require 'helper'
|
4
|
-
require 'train/transports/mock'
|
5
|
-
require 'train/file/local/windows'
|
6
|
-
|
7
|
-
describe 'file common' do
|
8
|
-
let(:cls) { Train::File::Local::Windows }
|
9
|
-
let(:backend) {
|
10
|
-
backend = Train::Transports::Mock.new.connection
|
11
|
-
backend.mock_os({ family: 'windows' })
|
12
|
-
backend
|
13
|
-
}
|
14
|
-
|
15
|
-
it 'check escaping of invalid chars in path' do
|
16
|
-
wf = cls.new(nil, nil)
|
17
|
-
wf.sanitize_filename('c:/test') .must_equal 'c:/test'
|
18
|
-
wf.sanitize_filename('c:/test directory') .must_equal 'c:/test directory'
|
19
|
-
%w{ < > " * ?}.each do |char|
|
20
|
-
wf.sanitize_filename("c:/test#{char}directory") .must_equal 'c:/testdirectory'
|
21
|
-
end
|
22
|
-
end
|
23
|
-
|
24
|
-
it 'returns file version' do
|
25
|
-
out = rand.to_s
|
26
|
-
backend.mock_command('[System.Diagnostics.FileVersionInfo]::GetVersionInfo("path").FileVersion', out)
|
27
|
-
cls.new(backend, 'path').file_version.must_equal out
|
28
|
-
end
|
29
|
-
|
30
|
-
it 'returns product version' do
|
31
|
-
out = rand.to_s
|
32
|
-
backend.mock_command('[System.Diagnostics.FileVersionInfo]::GetVersionInfo("path").FileVersion', out)
|
33
|
-
cls.new(backend, 'path').file_version.must_equal out
|
34
|
-
end
|
35
|
-
|
36
|
-
it 'returns owner of file' do
|
37
|
-
out = rand.to_s
|
38
|
-
backend.mock_command('Get-Acl "path" | select -expand Owner', out)
|
39
|
-
cls.new(backend, 'path').owner.must_equal out
|
40
|
-
end
|
41
|
-
|
42
|
-
describe '#md5sum' do
|
43
|
-
let(:md5_checksum) { '4ce0c733cdcf1d2f78532bbd9ce3441d' }
|
44
|
-
let(:filepath) { 'C:\Windows\explorer.exe' }
|
45
|
-
|
46
|
-
let(:ruby_md5_mock) do
|
47
|
-
checksum_mock = mock
|
48
|
-
checksum_mock.expects(:update).returns('')
|
49
|
-
checksum_mock.expects(:hexdigest).returns(md5_checksum)
|
50
|
-
checksum_mock
|
51
|
-
end
|
52
|
-
|
53
|
-
it 'defaults to a Ruby based checksum if other methods fail' do
|
54
|
-
backend.mock_command("CertUtil -hashfile #{filepath} MD5", '', '', 1)
|
55
|
-
Digest::MD5.expects(:new).returns(ruby_md5_mock)
|
56
|
-
cls.new(backend, '/tmp/testfile').md5sum.must_equal md5_checksum
|
57
|
-
end
|
58
|
-
|
59
|
-
it 'calculates the correct md5sum on the `windows` platform family' do
|
60
|
-
output = <<-EOC
|
61
|
-
MD5 hash of file C:\\Windows\\explorer.exe:\r
|
62
|
-
4c e0 c7 33 cd cf 1d 2f 78 53 2b bd 9c e3 44 1d\r
|
63
|
-
CertUtil: -hashfile command completed successfully.\r
|
64
|
-
EOC
|
65
|
-
|
66
|
-
backend.mock_command("CertUtil -hashfile #{filepath} MD5", output)
|
67
|
-
cls.new(backend, filepath).md5sum.must_equal md5_checksum
|
68
|
-
end
|
69
|
-
end
|
70
|
-
|
71
|
-
describe '#sha256sum' do
|
72
|
-
let(:sha256_checksum) {
|
73
|
-
'85270240a5fd51934f0627c92b2282749d071fdc9ac351b81039ced5b10f798b'
|
74
|
-
}
|
75
|
-
let(:filepath) { 'C:\Windows\explorer.exe' }
|
76
|
-
|
77
|
-
let(:ruby_sha256_mock) do
|
78
|
-
checksum_mock = mock
|
79
|
-
checksum_mock.expects(:update).returns('')
|
80
|
-
checksum_mock.expects(:hexdigest).returns(sha256_checksum)
|
81
|
-
checksum_mock
|
82
|
-
end
|
83
|
-
|
84
|
-
it 'defaults to a Ruby based checksum if other methods fail' do
|
85
|
-
backend.mock_command('CertUtil -hashfile #{filepath} SHA256', '', '', 1)
|
86
|
-
Digest::SHA256.expects(:new).returns(ruby_sha256_mock)
|
87
|
-
cls.new(backend, '/tmp/testfile').sha256sum.must_equal sha256_checksum
|
88
|
-
end
|
89
|
-
|
90
|
-
it 'calculates the correct sha256sum on the `windows` platform family' do
|
91
|
-
output = <<-EOC
|
92
|
-
SHA256 hash of file C:\\Windows\\explorer.exe:\r
|
93
|
-
85 27 02 40 a5 fd 51 93 4f 06 27 c9 2b 22 82 74 9d 07 1f dc 9a c3 51 b8 10 39 ce d5 b1 0f 79 8b\r
|
94
|
-
CertUtil: -hashfile command completed successfully.\r
|
95
|
-
EOC
|
96
|
-
|
97
|
-
backend.mock_command("CertUtil -hashfile #{filepath} SHA256", output)
|
98
|
-
cls.new(backend, filepath).sha256sum.must_equal sha256_checksum
|
99
|
-
end
|
100
|
-
end
|
101
|
-
end
|