diff options
author | Florian Bruhin <git@the-compiler.org> | 2015-09-09 10:47:34 +0200 |
---|---|---|
committer | Florian Bruhin <git@the-compiler.org> | 2015-09-09 19:31:52 +0200 |
commit | b135569d5c6e68c735ea83f42e4baf51f7972281 (patch) | |
tree | 015f7135d86d046f17601eb325a78be7590f3623 | |
parent | 69e735c42ee4ac9cda1018f33ebde9a235dac0a5 (diff) | |
download | qutebrowser-b135569d5c6e68c735ea83f42e4baf51f7972281.tar.gz qutebrowser-b135569d5c6e68c735ea83f42e4baf51f7972281.zip |
ipc: Add workaround for NameError w/ SocketOptions.
-rw-r--r-- | qutebrowser/misc/ipc.py | 15 | ||||
-rw-r--r-- | tests/unit/misc/test_ipc.py | 19 |
2 files changed, 31 insertions, 3 deletions
diff --git a/qutebrowser/misc/ipc.py b/qutebrowser/misc/ipc.py index d3c98c69d..f44e90387 100644 --- a/qutebrowser/misc/ipc.py +++ b/qutebrowser/misc/ipc.py @@ -31,7 +31,8 @@ from PyQt5.QtCore import pyqtSignal, pyqtSlot, QObject from PyQt5.QtNetwork import QLocalSocket, QLocalServer, QAbstractSocket import qutebrowser -from qutebrowser.utils import log, usertypes, error, objreg, standarddir +from qutebrowser.utils import (log, usertypes, error, objreg, standarddir, + qtutils) CONNECT_TIMEOUT = 100 @@ -143,6 +144,8 @@ class IPCServer(QObject): _server: A QLocalServer to accept new connections. _socket: The QLocalSocket we're currently connected to. _socketname: The socketname to use. + _socketopts_ok: Set if using setSocketOptions is working with this + OS/Qt version. Signals: got_args: Emitted when there was an IPC connection and arguments were @@ -169,9 +172,13 @@ class IPCServer(QObject): self._timer.setInterval(READ_TIMEOUT) self._timer.timeout.connect(self.on_timeout) self._server = QLocalServer(self) - self._server.setSocketOptions(QLocalServer.UserAccessOption) self._server.newConnection.connect(self.handle_connection) self._socket = None + self._socketopts_ok = os.name == 'nt' or qtutils.version_check('5.4') + if self._socketopts_ok: # pragma: no cover + # If we use setSocketOptions on Unix with Qt < 5.4, we get a + # NameError while listening... + self._server.setSocketOptions(QLocalServer.UserAccessOption) def _remove_server(self): """Remove an existing server.""" @@ -190,6 +197,10 @@ class IPCServer(QObject): raise AddressInUseError(self._server) else: raise ListenError(self._server) + if not self._socketopts_ok: # pragma: no cover + # If we use setSocketOptions on Unix with Qt < 5.4, we get a + # NameError while listening... + os.chmod(self._server.fullServerName(), 0o700) @pyqtSlot(int) def on_error(self, err): diff --git a/tests/unit/misc/test_ipc.py b/tests/unit/misc/test_ipc.py index a7fe385ba..25e7f87cc 100644 --- a/tests/unit/misc/test_ipc.py +++ b/tests/unit/misc/test_ipc.py @@ -35,7 +35,7 @@ from PyQt5.QtTest import QSignalSpy import qutebrowser from qutebrowser.misc import ipc -from qutebrowser.utils import objreg +from qutebrowser.utils import objreg, qtutils from helpers import stubs # pylint: disable=import-error @@ -773,3 +773,20 @@ def test_connect_inexistant(qlocalsocket): """ qlocalsocket.connectToServer('qute-test-inexistent') assert qlocalsocket.error() == QLocalSocket.ServerNotFoundError + + +def test_socket_options_listen_problem(qlocalserver, tmpdir): + """In earlier versions of Qt, listening fails when using socketOptions. + + With this test, we verify that this bug exists in the Qt version/OS + combinations we expect it to, and doesn't exist in other versions. + """ + servername = str(tmpdir / 'x') + qlocalserver.setSocketOptions(QLocalServer.UserAccessOption) + ok = qlocalserver.listen(servername) + if os.name == 'nt' or qtutils.version_check('5.4'): + assert ok + else: + assert not ok + assert qlocalserver.serverError() == QAbstractSocket.HostNotFoundError + assert qlocalserver.errorString() == 'QLocalServer::listen: Name error' |