summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorCalum Lind <calumlind+deluge@gmail.com>2021-07-24 14:11:58 +0100
committerCalum Lind <calumlind+deluge@gmail.com>2021-08-01 08:48:27 +0100
commitb89b2c45b145c33c41115a9aac6e46b085ce668a (patch)
tree8c373cdb925284b6915061659efb2444bfa0b89c
parente38f1173cf470f2f8373f2fa4edbb726c932c980 (diff)
downloaddeluge-b89b2c45b145c33c41115a9aac6e46b085ce668a.tar.gz
deluge-b89b2c45b145c33c41115a9aac6e46b085ce668a.tar.bz2
deluge-b89b2c45b145c33c41115a9aac6e46b085ce668a.zip
[Console] Fix using windows-curses on Windows
The console tests are still failing on Windows due to an issue where the sys args are not being correctly replaced in the tests so the pytest args are being passed to console.
-rw-r--r--deluge/tests/common.py2
-rw-r--r--deluge/tests/test_client.py6
-rw-r--r--deluge/tests/test_common.py6
-rw-r--r--deluge/tests/test_ui_console.py4
-rw-r--r--deluge/tests/test_ui_entry.py18
-rw-r--r--deluge/ui/console/main.py63
-rw-r--r--deluge/ui/console/modes/basemode.py4
-rw-r--r--requirements.txt1
8 files changed, 53 insertions, 51 deletions
diff --git a/deluge/tests/common.py b/deluge/tests/common.py
index f0ddb2b99..be33f8c58 100644
--- a/deluge/tests/common.py
+++ b/deluge/tests/common.py
@@ -69,7 +69,7 @@ def add_watchdog(deferred, timeout=0.05, message=None):
return value
deferred.addBoth(callback)
- watchdog = reactor.callLater(timeout, defer.timeout, deferred)
+ watchdog = reactor.callLater(timeout, defer.Deferred.addTimeout, deferred)
return watchdog
diff --git a/deluge/tests/test_client.py b/deluge/tests/test_client.py
index c89ad5309..ae1e95a71 100644
--- a/deluge/tests/test_client.py
+++ b/deluge/tests/test_client.py
@@ -11,7 +11,7 @@ from twisted.internet import defer
import deluge.component as component
from deluge import error
-from deluge.common import AUTH_LEVEL_NORMAL, get_localhost_auth, windows_check
+from deluge.common import AUTH_LEVEL_NORMAL, get_localhost_auth
from deluge.core.authmanager import AUTH_LEVEL_ADMIN
from deluge.ui.client import Client, DaemonSSLProxy, client
@@ -79,10 +79,6 @@ class NoVersionSendingClient(Client):
class ClientTestCase(BaseTestCase, DaemonBase):
-
- if windows_check():
- skip = 'windows cant start_core not enough arguments for format string'
-
def set_up(self):
d = self.common_set_up()
d.addCallback(self.start_core)
diff --git a/deluge/tests/test_common.py b/deluge/tests/test_common.py
index 3cecb6467..4f6aa2fd4 100644
--- a/deluge/tests/test_common.py
+++ b/deluge/tests/test_common.py
@@ -8,6 +8,7 @@
from __future__ import unicode_literals
import os
+import sys
import tarfile
from twisted.trial import unittest
@@ -98,8 +99,9 @@ class CommonTestCase(unittest.TestCase):
self.assertTrue(is_infohash('2dc5d0e71a66fe69649a640d39cb00a259704973'))
def test_get_path_size(self):
- if windows_check():
- raise unittest.SkipTest('os devnull is different on windows')
+ if windows_check() and sys.version_info < (3, 8):
+ # https://bugs.python.org/issue1311
+ raise unittest.SkipTest('os.devnull returns False on Windows')
self.assertTrue(get_path_size(os.devnull) == 0)
self.assertTrue(get_path_size('non-existant.file') == -1)
diff --git a/deluge/tests/test_ui_console.py b/deluge/tests/test_ui_console.py
index da97f5c15..3667c608e 100644
--- a/deluge/tests/test_ui_console.py
+++ b/deluge/tests/test_ui_console.py
@@ -9,7 +9,6 @@ from __future__ import unicode_literals
import argparse
-from deluge.common import windows_check
from deluge.ui.console.cmdline.commands.add import Command
from deluge.ui.console.cmdline.commands.config import json_eval
from deluge.ui.console.widgets.fields import TextInput
@@ -46,8 +45,7 @@ class UIConsoleFieldTestCase(BaseTestCase):
complete=False,
)
self.assertTrue(t)
- if not windows_check():
- self.assertTrue(t.handle_read(33))
+ self.assertTrue(t.handle_read(33))
class UIConsoleCommandsTestCase(BaseTestCase):
diff --git a/deluge/tests/test_ui_entry.py b/deluge/tests/test_ui_entry.py
index bf4cff5f3..f85bc7d7d 100644
--- a/deluge/tests/test_ui_entry.py
+++ b/deluge/tests/test_ui_entry.py
@@ -19,6 +19,9 @@ from twisted.internet import defer
import deluge
import deluge.component as component
+import deluge.ui.console
+import deluge.ui.console.cmdline.commands.quit
+import deluge.ui.console.main
import deluge.ui.web.server
from deluge.common import PY2, get_localhost_auth, windows_check
from deluge.ui import ui_entry
@@ -28,11 +31,6 @@ from . import common
from .basetest import BaseTestCase
from .daemon_base import DaemonBase
-if not windows_check():
- import deluge.ui.console
- import deluge.ui.console.cmdline.commands.quit
- import deluge.ui.console.main
-
DEBUG_COMMAND = False
sys_stdout = sys.stdout
@@ -102,7 +100,7 @@ class UIWithDaemonBaseTestCase(UIBaseTestCase, DaemonBase):
class DelugeEntryTestCase(BaseTestCase):
if windows_check():
- skip = 'cannot test console ui on windows'
+ skip = 'Console ui test on Windows broken due to sys args issue'
def set_up(self):
common.set_tmp_config_dir()
@@ -250,7 +248,7 @@ class WebUIBaseTestCase(UIBaseTestCase):
class WebUIScriptEntryTestCase(BaseTestCase, WebUIBaseTestCase):
if windows_check():
- skip = 'cannot test console ui on windows'
+ skip = 'Console ui test on Windows broken due to sys args issue'
def __init__(self, testname):
super(WebUIScriptEntryTestCase, self).__init__(testname)
@@ -269,7 +267,7 @@ class WebUIScriptEntryTestCase(BaseTestCase, WebUIBaseTestCase):
class WebUIDelugeScriptEntryTestCase(BaseTestCase, WebUIBaseTestCase):
if windows_check():
- skip = 'cannot test console ui on windows'
+ skip = 'Console ui test on Windows broken due to sys args issue'
def __init__(self, testname):
super(WebUIDelugeScriptEntryTestCase, self).__init__(testname)
@@ -466,7 +464,7 @@ class ConsoleScriptEntryWithDaemonTestCase(
):
if windows_check():
- skip = 'cannot test console ui on windows'
+ skip = 'Console ui test on Windows broken due to sys args issue'
def __init__(self, testname):
super(ConsoleScriptEntryWithDaemonTestCase, self).__init__(testname)
@@ -492,7 +490,7 @@ class ConsoleScriptEntryWithDaemonTestCase(
class ConsoleScriptEntryTestCase(BaseTestCase, ConsoleUIBaseTestCase):
if windows_check():
- skip = 'cannot test console ui on windows'
+ skip = 'Console ui test on Windows broken due to sys args issue'
def __init__(self, testname):
super(ConsoleScriptEntryTestCase, self).__init__(testname)
diff --git a/deluge/ui/console/main.py b/deluge/ui/console/main.py
index 23965bbb2..c74d9022f 100644
--- a/deluge/ui/console/main.py
+++ b/deluge/ui/console/main.py
@@ -67,6 +67,14 @@ DEFAULT_CONSOLE_PREFS = {
}
+class MockConsoleLog(object):
+ def write(self, data):
+ pass
+
+ def flush(self):
+ pass
+
+
class ConsoleUI(component.Component, TermResizeHandler):
def __init__(self, options, cmds, log_stream):
component.Component.__init__(self, 'ConsoleUI')
@@ -114,6 +122,7 @@ class ConsoleUI(component.Component, TermResizeHandler):
all commands are executed. Else None is returned.
"""
if self.options.parsed_cmds:
+ # Non-Interactive mode
self.interactive = False
if not self._commands:
print('No valid console commands found')
@@ -122,41 +131,37 @@ class ConsoleUI(component.Component, TermResizeHandler):
deferred = self.exec_args(self.options)
reactor.run()
return deferred
- else:
- # Interactive
- if deluge.common.windows_check():
- print(
- """\nDeluge-console does not run in interactive mode on Windows. \n
-Please use commands from the command line, e.g.:\n
- deluge-console.exe help
- deluge-console.exe info
- deluge-console.exe "add --help"
- deluge-console.exe "add -p c:\\mytorrents c:\\new.torrent"
-"""
- )
- else:
- class ConsoleLog(object):
- def write(self, data):
- pass
+ # Interactive
- def flush(self):
- pass
+ # We use the curses.wrapper function to prevent the console from getting
+ # messed up if an uncaught exception is experienced.
+ try:
+ from curses import wrapper
+ except ImportError:
+ wrapper = None
- # We don't ever want log output to terminal when running in
- # interactive mode, so insert a dummy here
- self.log_stream.out = ConsoleLog()
+ if deluge.common.windows_check() and not wrapper:
+ print(
+ """\nDeluge-console does not run in interactive mode on Windows. \n
+Please use commands from the command line, e.g.:\n
+deluge-console.exe help
+deluge-console.exe info
+deluge-console.exe "add --help"
+deluge-console.exe "add -p c:\\mytorrents c:\\new.torrent"
+"""
+ )
- # Set Esc key delay to 0 to avoid a very annoying delay
- # due to curses waiting in case of other key are pressed
- # after ESC is pressed
- os.environ.setdefault('ESCDELAY', '0')
+ # We don't ever want log output to terminal when running in
+ # interactive mode, so insert a dummy here
+ self.log_stream.out = MockConsoleLog()
- # We use the curses.wrapper function to prevent the console from getting
- # messed up if an uncaught exception is experienced.
- from curses import wrapper
+ # Set Esc key delay to 0 to avoid a very annoying delay
+ # due to curses waiting in case of other key are pressed
+ # after ESC is pressed
+ os.environ.setdefault('ESCDELAY', '0')
- wrapper(self.run)
+ wrapper(self.run)
def quit(self):
if client.connected():
diff --git a/deluge/ui/console/modes/basemode.py b/deluge/ui/console/modes/basemode.py
index 5520b0b46..5267eae5a 100644
--- a/deluge/ui/console/modes/basemode.py
+++ b/deluge/ui/console/modes/basemode.py
@@ -67,7 +67,9 @@ class TermResizeHandler(object):
try:
signal.signal(signal.SIGWINCH, self.on_terminal_size)
except ValueError as ex:
- log.debug('Unable to catch SIGWINCH signal: %s', ex)
+ log.debug('TermResize unavailable, unable to catch SIGWINCH signal: %s', ex)
+ except AttributeError as ex:
+ log.debug('TermResize unavailable, no SIGWINCH signal on Windows: %s', ex)
def on_terminal_size(self, *args):
# Get the new rows and cols value
diff --git a/requirements.txt b/requirements.txt
index c9cfee9eb..c414829b9 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -9,5 +9,6 @@ six
setproctitle
pywin32; sys_platform == 'win32'
certifi; sys_platform == 'win32'
+windows-curses; sys_platform == 'win32'
zope.interface>=4.4.2
distro; 'linux' in sys_platform or 'bsd' in sys_platform