test_utils_process.py 9.7 KB
Newer Older
1
import os
2
import unittest
3 4 5 6 7 8

try:
    from unittest import mock
except ImportError:
    import mock

9

10
from avocado.utils import gdb
11
from avocado.utils import process
12
from avocado.utils import path
13

14 15
TRUE_CMD = path.find_command('true')

16

17 18 19 20 21 22 23
class TestSubProcess(unittest.TestCase):

    def test_allow_output_check_parameter(self):
        self.assertRaises(ValueError, process.SubProcess,
                          TRUE_CMD, False, "invalid")


24 25 26
class TestGDBProcess(unittest.TestCase):

    def setUp(self):
27
        self.current_runtime_expr = gdb.GDB_RUN_BINARY_NAMES_EXPR[:]
28 29

    def cleanUp(self):
30
        gdb.GDB_RUN_BINARY_NAMES_EXPR = self.current_runtime_expr
31 32

    def test_should_run_inside_gdb(self):
33
        gdb.GDB_RUN_BINARY_NAMES_EXPR = ['foo']
34 35 36 37
        self.assertTrue(process.should_run_inside_gdb('foo'))
        self.assertTrue(process.should_run_inside_gdb('/usr/bin/foo'))
        self.assertFalse(process.should_run_inside_gdb('/usr/bin/fooz'))

38
        gdb.GDB_RUN_BINARY_NAMES_EXPR.append('foo:main')
39 40 41
        self.assertTrue(process.should_run_inside_gdb('foo'))
        self.assertFalse(process.should_run_inside_gdb('bar'))

42
        gdb.GDB_RUN_BINARY_NAMES_EXPR.append('bar:main.c:5')
43 44 45 46 47
        self.assertTrue(process.should_run_inside_gdb('bar'))
        self.assertFalse(process.should_run_inside_gdb('baz'))
        self.assertTrue(process.should_run_inside_gdb('bar 1 2 3'))
        self.assertTrue(process.should_run_inside_gdb('/usr/bin/bar 1 2 3'))

48 49 50
    def test_should_run_inside_gdb_malformed_command(self):
        gdb.GDB_RUN_BINARY_NAMES_EXPR = ['/bin/virsh']
        cmd = """/bin/virsh node-memory-tune --shm-sleep-millisecs ~!@#$%^*()-=[]{}|_+":;'`,>?. """
51 52 53
        self.assertTrue(process.should_run_inside_gdb(cmd))
        self.assertFalse(process.should_run_inside_gdb("foo bar baz"))
        self.assertFalse(process.should_run_inside_gdb("foo ' "))
54

55
    def test_get_sub_process_klass(self):
56
        gdb.GDB_RUN_BINARY_NAMES_EXPR = []
57
        self.assertIs(process.get_sub_process_klass(TRUE_CMD),
58 59
                      process.SubProcess)

60
        gdb.GDB_RUN_BINARY_NAMES_EXPR.append('/bin/false')
61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80
        self.assertIs(process.get_sub_process_klass('/bin/false'),
                      process.GDBSubProcess)
        self.assertIs(process.get_sub_process_klass('false'),
                      process.GDBSubProcess)
        self.assertIs(process.get_sub_process_klass('true'),
                      process.SubProcess)

    def test_split_gdb_expr(self):
        binary, breakpoint = process.split_gdb_expr('foo:debug_print')
        self.assertEqual(binary, 'foo')
        self.assertEqual(breakpoint, 'debug_print')
        binary, breakpoint = process.split_gdb_expr('bar')
        self.assertEqual(binary, 'bar')
        self.assertEqual(breakpoint, 'main')
        binary, breakpoint = process.split_gdb_expr('baz:main.c:57')
        self.assertEqual(binary, 'baz')
        self.assertEqual(breakpoint, 'main.c:57')
        self.assertIsInstance(process.split_gdb_expr('foo'), tuple)
        self.assertIsInstance(process.split_gdb_expr('foo:debug_print'), tuple)

81 82 83 84 85 86 87 88 89

def mock_fail_find_cmd(cmd, default=None):
    path_paths = ["/usr/libexec", "/usr/local/sbin", "/usr/local/bin",
                  "/usr/sbin", "/usr/bin", "/sbin", "/bin"]
    raise path.CmdNotFoundError(cmd, path_paths)


class TestProcessRun(unittest.TestCase):

90
    @mock.patch.object(path, 'find_command',
91
                       mock.Mock(return_value=TRUE_CMD))
92
    @mock.patch.object(os, 'getuid',
93
                       mock.Mock(return_value=1000))
94 95 96 97 98
    def test_subprocess_nosudo(self):
        expected_command = 'ls -l'
        p = process.SubProcess(cmd='ls -l')
        self.assertEqual(p.cmd, expected_command)

99
    @mock.patch.object(path, 'find_command',
100 101
                       mock.Mock(return_value=TRUE_CMD))
    @mock.patch.object(os, 'getuid', mock.Mock(return_value=0))
102 103 104 105 106
    def test_subprocess_nosudo_uid_0(self):
        expected_command = 'ls -l'
        p = process.SubProcess(cmd='ls -l')
        self.assertEqual(p.cmd, expected_command)

107
    @mock.patch.object(path, 'find_command',
108
                       mock.Mock(return_value=TRUE_CMD))
109
    @mock.patch.object(os, 'getuid',
110
                       mock.Mock(return_value=1000))
111
    def test_subprocess_sudo(self):
112
        expected_command = '%s -n ls -l' % TRUE_CMD
113 114 115
        p = process.SubProcess(cmd='ls -l', sudo=True)
        self.assertEqual(p.cmd, expected_command)

116
    @mock.patch.object(path, 'find_command', mock_fail_find_cmd)
117
    @mock.patch.object(os, 'getuid', mock.Mock(return_value=1000))
118 119 120 121 122
    def test_subprocess_sudo_no_sudo_installed(self):
        expected_command = 'ls -l'
        p = process.SubProcess(cmd='ls -l', sudo=True)
        self.assertEqual(p.cmd, expected_command)

123
    @mock.patch.object(path, 'find_command',
124 125
                       mock.Mock(return_value=TRUE_CMD))
    @mock.patch.object(os, 'getuid', mock.Mock(return_value=0))
126 127 128 129 130
    def test_subprocess_sudo_uid_0(self):
        expected_command = 'ls -l'
        p = process.SubProcess(cmd='ls -l', sudo=True)
        self.assertEqual(p.cmd, expected_command)

131
    @mock.patch.object(path, 'find_command',
132 133
                       mock.Mock(return_value=TRUE_CMD))
    @mock.patch.object(os, 'getuid', mock.Mock(return_value=1000))
134
    def test_subprocess_sudo_shell(self):
135
        expected_command = '%s -n -s ls -l' % TRUE_CMD
136 137 138
        p = process.SubProcess(cmd='ls -l', sudo=True, shell=True)
        self.assertEqual(p.cmd, expected_command)

139
    @mock.patch.object(path, 'find_command', mock_fail_find_cmd)
140
    @mock.patch.object(os, 'getuid', mock.Mock(return_value=1000))
141 142 143 144 145
    def test_subprocess_sudo_shell_no_sudo_installed(self):
        expected_command = 'ls -l'
        p = process.SubProcess(cmd='ls -l', sudo=True, shell=True)
        self.assertEqual(p.cmd, expected_command)

146
    @mock.patch.object(path, 'find_command',
147 148
                       mock.Mock(return_value=TRUE_CMD))
    @mock.patch.object(os, 'getuid', mock.Mock(return_value=0))
149 150 151 152 153
    def test_subprocess_sudo_shell_uid_0(self):
        expected_command = 'ls -l'
        p = process.SubProcess(cmd='ls -l', sudo=True, shell=True)
        self.assertEqual(p.cmd, expected_command)

154
    @mock.patch.object(path, 'find_command',
155 156
                       mock.Mock(return_value=TRUE_CMD))
    @mock.patch.object(os, 'getuid', mock.Mock(return_value=1000))
157 158 159 160 161
    def test_run_nosudo(self):
        expected_command = 'ls -l'
        p = process.run(cmd='ls -l', ignore_status=True)
        self.assertEqual(p.command, expected_command)

162
    @mock.patch.object(path, 'find_command',
163 164
                       mock.Mock(return_value=TRUE_CMD))
    @mock.patch.object(os, 'getuid', mock.Mock(return_value=0))
165 166 167 168 169
    def test_run_nosudo_uid_0(self):
        expected_command = 'ls -l'
        p = process.run(cmd='ls -l', ignore_status=True)
        self.assertEqual(p.command, expected_command)

170
    @mock.patch.object(path, 'find_command',
171 172
                       mock.Mock(return_value=TRUE_CMD))
    @mock.patch.object(os, 'getuid', mock.Mock(return_value=1000))
173
    def test_run_sudo(self):
174
        expected_command = '%s -n ls -l' % TRUE_CMD
175 176 177
        p = process.run(cmd='ls -l', sudo=True, ignore_status=True)
        self.assertEqual(p.command, expected_command)

178
    @mock.patch.object(path, 'find_command', mock_fail_find_cmd)
179
    @mock.patch.object(os, 'getuid', mock.Mock(return_value=1000))
180 181 182 183 184
    def test_run_sudo_no_sudo_installed(self):
        expected_command = 'ls -l'
        p = process.run(cmd='ls -l', sudo=True, ignore_status=True)
        self.assertEqual(p.command, expected_command)

185
    @mock.patch.object(path, 'find_command',
186 187
                       mock.Mock(return_value=TRUE_CMD))
    @mock.patch.object(os, 'getuid', mock.Mock(return_value=0))
188 189 190 191 192
    def test_run_sudo_uid_0(self):
        expected_command = 'ls -l'
        p = process.run(cmd='ls -l', sudo=True, ignore_status=True)
        self.assertEqual(p.command, expected_command)

193
    @mock.patch.object(path, 'find_command',
194 195
                       mock.Mock(return_value=TRUE_CMD))
    @mock.patch.object(os, 'getuid', mock.Mock(return_value=1000))
196
    def test_run_sudo_shell(self):
197
        expected_command = '%s -n -s ls -l' % TRUE_CMD
198 199 200
        p = process.run(cmd='ls -l', sudo=True, shell=True, ignore_status=True)
        self.assertEqual(p.command, expected_command)

201
    @mock.patch.object(path, 'find_command', mock_fail_find_cmd)
202
    @mock.patch.object(os, 'getuid', mock.Mock(return_value=1000))
203 204 205 206 207
    def test_run_sudo_shell_no_sudo_installed(self):
        expected_command = 'ls -l'
        p = process.run(cmd='ls -l', sudo=True, shell=True, ignore_status=True)
        self.assertEqual(p.command, expected_command)

208
    @mock.patch.object(path, 'find_command',
209 210
                       mock.Mock(return_value=TRUE_CMD))
    @mock.patch.object(os, 'getuid', mock.Mock(return_value=0))
211 212 213 214 215
    def test_run_sudo_shell_uid_0(self):
        expected_command = 'ls -l'
        p = process.run(cmd='ls -l', sudo=True, shell=True, ignore_status=True)
        self.assertEqual(p.command, expected_command)

216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231

class MiscProcessTests(unittest.TestCase):

    def test_binary_from_shell(self):
        self.assertEqual("binary", process.binary_from_shell_cmd("binary"))
        res = process.binary_from_shell_cmd("MY_VAR=foo myV4r=123 "
                                            "quote='a b c' QUOTE=\"1 2 && b\" "
                                            "QuOtE=\"1 2\"foo' 3 4' first_bin "
                                            "second_bin VAR=xyz")
        self.assertEqual("first_bin", res)
        res = process.binary_from_shell_cmd("VAR=VALUE 1st_binary var=value "
                                            "second_binary")
        self.assertEqual("1st_binary", res)
        res = process.binary_from_shell_cmd("FOO=bar ./bin var=value")
        self.assertEqual("./bin", res)

L
Lukáš Doktor 已提交
232

233 234
if __name__ == "__main__":
    unittest.main()