1# -*- coding: utf-8 -
2#
3# This file is part of gunicorn released under the MIT license.
4# See the NOTICE for more information.
5
6import errno
7import sys
8
9try:
10    import unittest.mock as mock
11except ImportError:
12    import mock
13
14import gunicorn.pidfile
15
16
17def builtin(name):
18    if sys.version_info >= (3, 0):
19        module = 'builtins'
20    else:
21        module = '__builtin__'
22
23    return '{0}.{1}'.format(module, name)
24
25
26@mock.patch(builtin('open'), new_callable=mock.mock_open)
27def test_validate_no_file(_open):
28    pidfile = gunicorn.pidfile.Pidfile('test.pid')
29    _open.side_effect = IOError(errno.ENOENT)
30    assert pidfile.validate() is None
31
32
33@mock.patch(builtin('open'), new_callable=mock.mock_open, read_data='1')
34@mock.patch('os.kill')
35def test_validate_file_pid_exists(kill, _open):
36    pidfile = gunicorn.pidfile.Pidfile('test.pid')
37    assert pidfile.validate() == 1
38    assert kill.called
39
40
41@mock.patch(builtin('open'), new_callable=mock.mock_open, read_data='a')
42def test_validate_file_pid_malformed(_open):
43    pidfile = gunicorn.pidfile.Pidfile('test.pid')
44    assert pidfile.validate() is None
45
46
47@mock.patch(builtin('open'), new_callable=mock.mock_open, read_data='1')
48@mock.patch('os.kill')
49def test_validate_file_pid_exists_kill_exception(kill, _open):
50    pidfile = gunicorn.pidfile.Pidfile('test.pid')
51    kill.side_effect = OSError(errno.EPERM)
52    assert pidfile.validate() == 1
53
54
55@mock.patch(builtin('open'), new_callable=mock.mock_open, read_data='1')
56@mock.patch('os.kill')
57def test_validate_file_pid_does_not_exist(kill, _open):
58    pidfile = gunicorn.pidfile.Pidfile('test.pid')
59    kill.side_effect = OSError(errno.ESRCH)
60    assert pidfile.validate() is None
61