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