Fixes https://github.com/google/oauth2client/issues/335 This change fixes a bug where multiple threads and/or processes using multistore_file to access the same backing store could raise IOError errno.EDEADLK to the calling application. Since EDEADLK is a possibility with concurrent access, this change instead causes a fallback to read only mode and refresh credentials if necessary.
44 lines
1.2 KiB
Python
44 lines
1.2 KiB
Python
"""Unit tests for oauth2client.multistore_file."""
|
|
|
|
import errno
|
|
import os
|
|
import tempfile
|
|
import unittest
|
|
|
|
from oauth2client import multistore_file
|
|
|
|
|
|
class _MockLockedFile(object):
|
|
|
|
def __init__(self, filename_str, error_code):
|
|
self.filename_str = filename_str
|
|
self.error_code = error_code
|
|
self.open_and_lock_called = False
|
|
|
|
def open_and_lock(self):
|
|
self.open_and_lock_called = True
|
|
raise IOError(self.error_code, '')
|
|
|
|
def is_locked(self):
|
|
return False
|
|
|
|
def filename(self):
|
|
return self.filename_str
|
|
|
|
|
|
class MultistoreFileTests(unittest.TestCase):
|
|
|
|
def test_lock_file_raises_ioerror(self):
|
|
filehandle, filename = tempfile.mkstemp()
|
|
os.close(filehandle)
|
|
|
|
try:
|
|
for error_code in (errno.EDEADLK, errno.ENOSYS, errno.ENOLCK):
|
|
multistore = multistore_file._MultiStore(filename)
|
|
multistore._file = _MockLockedFile(filename, error_code)
|
|
# Should not raise even though the underlying file class did.
|
|
multistore._lock()
|
|
self.assertTrue(multistore._file.open_and_lock_called)
|
|
finally:
|
|
os.unlink(filename)
|