aboutsummaryrefslogtreecommitdiffstats
path: root/lib/python2.7/site-packages/Twisted-12.2.0-py2.7-linux-x86_64.egg/twisted/internet/test/test_inotify.py
diff options
context:
space:
mode:
Diffstat (limited to 'lib/python2.7/site-packages/Twisted-12.2.0-py2.7-linux-x86_64.egg/twisted/internet/test/test_inotify.py')
-rwxr-xr-xlib/python2.7/site-packages/Twisted-12.2.0-py2.7-linux-x86_64.egg/twisted/internet/test/test_inotify.py504
1 files changed, 0 insertions, 504 deletions
diff --git a/lib/python2.7/site-packages/Twisted-12.2.0-py2.7-linux-x86_64.egg/twisted/internet/test/test_inotify.py b/lib/python2.7/site-packages/Twisted-12.2.0-py2.7-linux-x86_64.egg/twisted/internet/test/test_inotify.py
deleted file mode 100755
index a0035622..00000000
--- a/lib/python2.7/site-packages/Twisted-12.2.0-py2.7-linux-x86_64.egg/twisted/internet/test/test_inotify.py
+++ /dev/null
@@ -1,504 +0,0 @@
-# Copyright (c) Twisted Matrix Laboratories.
-# See LICENSE for details.
-
-"""
-Tests for the inotify wrapper in L{twisted.internet.inotify}.
-"""
-
-from twisted.internet import defer, reactor
-from twisted.python import filepath, runtime
-from twisted.trial import unittest
-
-try:
- from twisted.python import _inotify
-except ImportError:
- inotify = None
-else:
- from twisted.internet import inotify
-
-
-
-class TestINotify(unittest.TestCase):
- """
- Define all the tests for the basic functionality exposed by
- L{inotify.INotify}.
- """
- if not runtime.platform.supportsINotify():
- skip = "This platform doesn't support INotify."
-
- def setUp(self):
- self.dirname = filepath.FilePath(self.mktemp())
- self.dirname.createDirectory()
- self.inotify = inotify.INotify()
- self.inotify.startReading()
- self.addCleanup(self.inotify.loseConnection)
-
-
- def test_initializationErrors(self):
- """
- L{inotify.INotify} emits a C{RuntimeError} when initialized
- in an environment that doesn't support inotify as we expect it.
-
- We just try to raise an exception for every possible case in
- the for loop in L{inotify.INotify._inotify__init__}.
- """
- class FakeINotify:
- def init(self):
- raise inotify.INotifyError()
- self.patch(inotify.INotify, '_inotify', FakeINotify())
- self.assertRaises(inotify.INotifyError, inotify.INotify)
-
-
- def _notificationTest(self, mask, operation, expectedPath=None):
- """
- Test notification from some filesystem operation.
-
- @param mask: The event mask to use when setting up the watch.
-
- @param operation: A function which will be called with the
- name of a file in the watched directory and which should
- trigger the event.
-
- @param expectedPath: Optionally, the name of the path which is
- expected to come back in the notification event; this will
- also be passed to C{operation} (primarily useful when the
- operation is being done to the directory itself, not a
- file in it).
-
- @return: A L{Deferred} which fires successfully when the
- expected event has been received or fails otherwise.
- """
- if expectedPath is None:
- expectedPath = self.dirname.child("foo.bar")
- notified = defer.Deferred()
- def cbNotified((watch, filename, events)):
- self.assertEqual(filename, expectedPath)
- self.assertTrue(events & mask)
- notified.addCallback(cbNotified)
-
- self.inotify.watch(
- self.dirname, mask=mask,
- callbacks=[lambda *args: notified.callback(args)])
- operation(expectedPath)
- return notified
-
-
- def test_access(self):
- """
- Reading from a file in a monitored directory sends an
- C{inotify.IN_ACCESS} event to the callback.
- """
- def operation(path):
- path.setContent("foo")
- path.getContent()
-
- return self._notificationTest(inotify.IN_ACCESS, operation)
-
-
- def test_modify(self):
- """
- Writing to a file in a monitored directory sends an
- C{inotify.IN_MODIFY} event to the callback.
- """
- def operation(path):
- fObj = path.open("w")
- fObj.write('foo')
- fObj.close()
-
- return self._notificationTest(inotify.IN_MODIFY, operation)
-
-
- def test_attrib(self):
- """
- Changing the metadata of a a file in a monitored directory
- sends an C{inotify.IN_ATTRIB} event to the callback.
- """
- def operation(path):
- path.touch()
- path.touch()
-
- return self._notificationTest(inotify.IN_ATTRIB, operation)
-
-
- def test_closeWrite(self):
- """
- Closing a file which was open for writing in a monitored
- directory sends an C{inotify.IN_CLOSE_WRITE} event to the
- callback.
- """
- def operation(path):
- fObj = path.open("w")
- fObj.close()
-
- return self._notificationTest(inotify.IN_CLOSE_WRITE, operation)
-
-
- def test_closeNoWrite(self):
- """
- Closing a file which was open for reading but not writing in a
- monitored directory sends an C{inotify.IN_CLOSE_NOWRITE} event
- to the callback.
- """
- def operation(path):
- path.touch()
- fObj = path.open("r")
- fObj.close()
-
- return self._notificationTest(inotify.IN_CLOSE_NOWRITE, operation)
-
-
- def test_open(self):
- """
- Opening a file in a monitored directory sends an
- C{inotify.IN_OPEN} event to the callback.
- """
- def operation(path):
- fObj = path.open("w")
- fObj.close()
-
- return self._notificationTest(inotify.IN_OPEN, operation)
-
-
- def test_movedFrom(self):
- """
- Moving a file out of a monitored directory sends an
- C{inotify.IN_MOVED_FROM} event to the callback.
- """
- def operation(path):
- fObj = path.open("w")
- fObj.close()
- path.moveTo(filepath.FilePath(self.mktemp()))
-
- return self._notificationTest(inotify.IN_MOVED_FROM, operation)
-
-
- def test_movedTo(self):
- """
- Moving a file into a monitored directory sends an
- C{inotify.IN_MOVED_TO} event to the callback.
- """
- def operation(path):
- p = filepath.FilePath(self.mktemp())
- p.touch()
- p.moveTo(path)
-
- return self._notificationTest(inotify.IN_MOVED_TO, operation)
-
-
- def test_create(self):
- """
- Creating a file in a monitored directory sends an
- C{inotify.IN_CREATE} event to the callback.
- """
- def operation(path):
- fObj = path.open("w")
- fObj.close()
-
- return self._notificationTest(inotify.IN_CREATE, operation)
-
-
- def test_delete(self):
- """
- Deleting a file in a monitored directory sends an
- C{inotify.IN_DELETE} event to the callback.
- """
- def operation(path):
- path.touch()
- path.remove()
-
- return self._notificationTest(inotify.IN_DELETE, operation)
-
-
- def test_deleteSelf(self):
- """
- Deleting the monitored directory itself sends an
- C{inotify.IN_DELETE_SELF} event to the callback.
- """
- def operation(path):
- path.remove()
-
- return self._notificationTest(
- inotify.IN_DELETE_SELF, operation, expectedPath=self.dirname)
-
-
- def test_moveSelf(self):
- """
- Renaming the monitored directory itself sends an
- C{inotify.IN_MOVE_SELF} event to the callback.
- """
- def operation(path):
- path.moveTo(filepath.FilePath(self.mktemp()))
-
- return self._notificationTest(
- inotify.IN_MOVE_SELF, operation, expectedPath=self.dirname)
-
-
- def test_simpleSubdirectoryAutoAdd(self):
- """
- L{inotify.INotify} when initialized with autoAdd==True adds
- also adds the created subdirectories to the watchlist.
- """
- def _callback(wp, filename, mask):
- # We are notified before we actually process new
- # directories, so we need to defer this check.
- def _():
- try:
- self.assertTrue(self.inotify._isWatched(subdir))
- d.callback(None)
- except Exception:
- d.errback()
- reactor.callLater(0, _)
-
- checkMask = inotify.IN_ISDIR | inotify.IN_CREATE
- self.inotify.watch(
- self.dirname, mask=checkMask, autoAdd=True,
- callbacks=[_callback])
- subdir = self.dirname.child('test')
- d = defer.Deferred()
- subdir.createDirectory()
- return d
-
-
- def test_simpleDeleteDirectory(self):
- """
- L{inotify.INotify} removes a directory from the watchlist when
- it's removed from the filesystem.
- """
- calls = []
- def _callback(wp, filename, mask):
- # We are notified before we actually process new
- # directories, so we need to defer this check.
- def _():
- try:
- self.assertTrue(self.inotify._isWatched(subdir))
- subdir.remove()
- except Exception:
- d.errback()
- def _eb():
- # second call, we have just removed the subdir
- try:
- self.assertTrue(not self.inotify._isWatched(subdir))
- d.callback(None)
- except Exception:
- d.errback()
-
- if not calls:
- # first call, it's the create subdir
- calls.append(filename)
- reactor.callLater(0, _)
-
- else:
- reactor.callLater(0, _eb)
-
- checkMask = inotify.IN_ISDIR | inotify.IN_CREATE
- self.inotify.watch(
- self.dirname, mask=checkMask, autoAdd=True,
- callbacks=[_callback])
- subdir = self.dirname.child('test')
- d = defer.Deferred()
- subdir.createDirectory()
- return d
-
-
- def test_ignoreDirectory(self):
- """
- L{inotify.INotify.ignore} removes a directory from the watchlist
- """
- self.inotify.watch(self.dirname, autoAdd=True)
- self.assertTrue(self.inotify._isWatched(self.dirname))
- self.inotify.ignore(self.dirname)
- self.assertFalse(self.inotify._isWatched(self.dirname))
-
-
- def test_humanReadableMask(self):
- """
- L{inotify.humaReadableMask} translates all the possible event
- masks to a human readable string.
- """
- for mask, value in inotify._FLAG_TO_HUMAN:
- self.assertEqual(inotify.humanReadableMask(mask)[0], value)
-
- checkMask = (
- inotify.IN_CLOSE_WRITE | inotify.IN_ACCESS | inotify.IN_OPEN)
- self.assertEqual(
- set(inotify.humanReadableMask(checkMask)),
- set(['close_write', 'access', 'open']))
-
-
- def test_recursiveWatch(self):
- """
- L{inotify.INotify.watch} with recursive==True will add all the
- subdirectories under the given path to the watchlist.
- """
- subdir = self.dirname.child('test')
- subdir2 = subdir.child('test2')
- subdir3 = subdir2.child('test3')
- subdir3.makedirs()
- dirs = [subdir, subdir2, subdir3]
- self.inotify.watch(self.dirname, recursive=True)
- # let's even call this twice so that we test that nothing breaks
- self.inotify.watch(self.dirname, recursive=True)
- for d in dirs:
- self.assertTrue(self.inotify._isWatched(d))
-
-
- def test_connectionLostError(self):
- """
- L{inotify.INotify.connectionLost} if there's a problem while closing
- the fd shouldn't raise the exception but should log the error
- """
- import os
- in_ = inotify.INotify()
- os.close(in_._fd)
- in_.loseConnection()
- self.flushLoggedErrors()
-
- def test_noAutoAddSubdirectory(self):
- """
- L{inotify.INotify.watch} with autoAdd==False will stop inotify
- from watching subdirectories created under the watched one.
- """
- def _callback(wp, fp, mask):
- # We are notified before we actually process new
- # directories, so we need to defer this check.
- def _():
- try:
- self.assertFalse(self.inotify._isWatched(subdir.path))
- d.callback(None)
- except Exception:
- d.errback()
- reactor.callLater(0, _)
-
- checkMask = inotify.IN_ISDIR | inotify.IN_CREATE
- self.inotify.watch(
- self.dirname, mask=checkMask, autoAdd=False,
- callbacks=[_callback])
- subdir = self.dirname.child('test')
- d = defer.Deferred()
- subdir.createDirectory()
- return d
-
-
- def test_seriesOfWatchAndIgnore(self):
- """
- L{inotify.INotify} will watch a filepath for events even if the same
- path is repeatedly added/removed/re-added to the watchpoints.
- """
- expectedPath = self.dirname.child("foo.bar2")
- expectedPath.touch()
-
- notified = defer.Deferred()
- def cbNotified((ignored, filename, events)):
- self.assertEqual(filename, expectedPath)
- self.assertTrue(events & inotify.IN_DELETE_SELF)
-
- def callIt(*args):
- notified.callback(args)
-
- # Watch, ignore, watch again to get into the state being tested.
- self.assertTrue(self.inotify.watch(expectedPath, callbacks=[callIt]))
- self.inotify.ignore(expectedPath)
- self.assertTrue(
- self.inotify.watch(
- expectedPath, mask=inotify.IN_DELETE_SELF, callbacks=[callIt]))
-
- notified.addCallback(cbNotified)
-
- # Apparently in kernel version < 2.6.25, inofify has a bug in the way
- # similar events are coalesced. So, be sure to generate a different
- # event here than the touch() at the top of this method might have
- # generated.
- expectedPath.remove()
-
- return notified
-
-
- def test_ignoreFilePath(self):
- """
- L{inotify.INotify} will ignore a filepath after it has been removed from
- the watch list.
- """
- expectedPath = self.dirname.child("foo.bar2")
- expectedPath.touch()
- expectedPath2 = self.dirname.child("foo.bar3")
- expectedPath2.touch()
-
- notified = defer.Deferred()
- def cbNotified((ignored, filename, events)):
- self.assertEqual(filename, expectedPath2)
- self.assertTrue(events & inotify.IN_DELETE_SELF)
-
- def callIt(*args):
- notified.callback(args)
-
- self.assertTrue(
- self.inotify.watch(
- expectedPath, inotify.IN_DELETE_SELF, callbacks=[callIt]))
- notified.addCallback(cbNotified)
-
- self.assertTrue(
- self.inotify.watch(
- expectedPath2, inotify.IN_DELETE_SELF, callbacks=[callIt]))
-
- self.inotify.ignore(expectedPath)
-
- expectedPath.remove()
- expectedPath2.remove()
-
- return notified
-
-
- def test_ignoreNonWatchedFile(self):
- """
- L{inotify.INotify} will raise KeyError if a non-watched filepath is
- ignored.
- """
- expectedPath = self.dirname.child("foo.ignored")
- expectedPath.touch()
-
- self.assertRaises(KeyError, self.inotify.ignore, expectedPath)
-
-
- def test_complexSubdirectoryAutoAdd(self):
- """
- L{inotify.INotify} with autoAdd==True for a watched path
- generates events for every file or directory already present
- in a newly created subdirectory under the watched one.
-
- This tests that we solve a race condition in inotify even though
- we may generate duplicate events.
- """
- calls = set()
- def _callback(wp, filename, mask):
- calls.add(filename)
- if len(calls) == 6:
- try:
- self.assertTrue(self.inotify._isWatched(subdir))
- self.assertTrue(self.inotify._isWatched(subdir2))
- self.assertTrue(self.inotify._isWatched(subdir3))
- created = someFiles + [subdir, subdir2, subdir3]
- self.assertEqual(len(calls), len(created))
- self.assertEqual(calls, set(created))
- except Exception:
- d.errback()
- else:
- d.callback(None)
-
- checkMask = inotify.IN_ISDIR | inotify.IN_CREATE
- self.inotify.watch(
- self.dirname, mask=checkMask, autoAdd=True,
- callbacks=[_callback])
- subdir = self.dirname.child('test')
- subdir2 = subdir.child('test2')
- subdir3 = subdir2.child('test3')
- d = defer.Deferred()
- subdir3.makedirs()
-
- someFiles = [subdir.child('file1.dat'),
- subdir2.child('file2.dat'),
- subdir3.child('file3.dat')]
- # Add some files in pretty much all the directories so that we
- # see that we process all of them.
- for i, filename in enumerate(someFiles):
- filename.setContent(filename.path)
- return d