commit e89c829fb75331fdc0d5aa03475c751371cb6c7e Author: Damian Johnson atagar@torproject.org Date: Sat Oct 12 16:57:50 2013 -0700
Using python3's unittest.mock module when available
Guess it's been a while since I last tried to test under python3. From python 3.3 on up the Mock library is built into the unittest module. Accounting for this so we can test under python3 again. --- run_tests.py | 6 +++++- stem/prereq.py | 19 ++++++++++++++++++- test/integ/process.py | 6 +++++- test/integ/response/protocolinfo.py | 8 ++++++-- test/integ/util/system.py | 6 +++++- test/settings.cfg | 2 ++ test/unit/connection/authentication.py | 8 ++++++-- test/unit/control/controller.py | 8 ++++++-- test/unit/descriptor/export.py | 8 ++++++-- test/unit/descriptor/reader.py | 6 +++++- test/unit/descriptor/remote.py | 6 +++++- test/unit/descriptor/server_descriptor.py | 8 ++++++-- test/unit/response/events.py | 8 ++++++-- test/unit/response/protocolinfo.py | 8 ++++++-- test/unit/tutorial.py | 8 ++++++-- test/unit/util/connection.py | 8 ++++++-- test/unit/util/proc.py | 8 ++++++-- test/unit/util/system.py | 8 ++++++-- test/unit/version.py | 8 ++++++-- test/util.py | 6 +++++- 20 files changed, 122 insertions(+), 31 deletions(-)
diff --git a/run_tests.py b/run_tests.py index 0b590a1..08143c1 100755 --- a/run_tests.py +++ b/run_tests.py @@ -119,7 +119,11 @@ def main():
if not stem.prereq.is_mock_available(): try: - import mock + try: + import unittest.mock + except ImportError: + import mock + println(MOCK_OUT_OF_DATE_MSG % mock.__version__) except ImportError: println(MOCK_UNAVAILABLE_MSG) diff --git a/stem/prereq.py b/stem/prereq.py index d088480..22b5819 100644 --- a/stem/prereq.py +++ b/stem/prereq.py @@ -91,12 +91,29 @@ def is_crypto_available(): @lru_cache() def is_mock_available(): """ - Checks if the mock module is available. + Checks if the mock module is available. In python 3.3 and up it is a builtin + unittest module, but before this it needed to be `installed separately + https://pypi.python.org/pypi/mock/`_. Imports should be as follows.... + + :: + + try: + # added in python 3.3 + from unittest.mock import Mock + except ImportError: + from mock import Mock
:returns: **True** if the mock module is available and **False** otherwise """
try: + # checks for python 3.3 version + import unittest.mock + return True + except ImportError: + pass + + try: import mock
# check for mock's patch.dict() which was introduced in version 0.7.0 diff --git a/test/integ/process.py b/test/integ/process.py index f6a862a..0f309c8 100644 --- a/test/integ/process.py +++ b/test/integ/process.py @@ -15,7 +15,11 @@ import stem.util.system import stem.version import test.runner
-from mock import patch +try: + # added in python 3.3 + from unittest.mock import patch +except ImportError: + from mock import patch
class TestProcess(unittest.TestCase): diff --git a/test/integ/response/protocolinfo.py b/test/integ/response/protocolinfo.py index 98f0c03..6469b8d 100644 --- a/test/integ/response/protocolinfo.py +++ b/test/integ/response/protocolinfo.py @@ -11,10 +11,14 @@ import stem.util.system import stem.version import test.runner
-from mock import Mock, patch - from test.integ.util.system import filter_system_call
+try: + # added in python 3.3 + from unittest.mock import Mock, patch +except ImportError: + from mock import Mock, patch +
class TestProtocolInfo(unittest.TestCase): def test_parsing(self): diff --git a/test/integ/util/system.py b/test/integ/util/system.py index 0694ffc..df389b1 100644 --- a/test/integ/util/system.py +++ b/test/integ/util/system.py @@ -12,7 +12,11 @@ import stem.util.proc import stem.util.system import test.runner
-from mock import Mock, patch +try: + # added in python 3.3 + from unittest.mock import Mock, patch +except ImportError: + from mock import Mock, patch
def filter_system_call(prefixes): diff --git a/test/settings.cfg b/test/settings.cfg index 9838012..222a7a4 100644 --- a/test/settings.cfg +++ b/test/settings.cfg @@ -129,9 +129,11 @@ pep8.ignore E127 # False positives from pyflakes. These are mappings between the path and the # issue.
+pyflakes.ignore run_tests.py => 'unittest' imported but unused pyflakes.ignore stem/control.py => undefined name 'control' pyflakes.ignore stem/prereq.py => 'RSA' imported but unused pyflakes.ignore stem/prereq.py => 'asn1' imported but unused +pyflakes.ignore stem/prereq.py => 'unittest' imported but unused pyflakes.ignore stem/prereq.py => 'mock' imported but unused pyflakes.ignore stem/prereq.py => 'long_to_bytes' imported but unused pyflakes.ignore stem/descriptor/__init__.py => redefinition of unused 'OrderedDict' from line 62 diff --git a/test/unit/connection/authentication.py b/test/unit/connection/authentication.py index 2157a5b..4b50bcf 100644 --- a/test/unit/connection/authentication.py +++ b/test/unit/connection/authentication.py @@ -13,11 +13,15 @@ import unittest
import stem.connection
-from mock import Mock, patch - from stem.util import log from test import mocking
+try: + # added in python 3.3 + from unittest.mock import Mock, patch +except ImportError: + from mock import Mock, patch +
class TestAuthenticate(unittest.TestCase): @patch('stem.connection.get_protocolinfo') diff --git a/test/unit/control/controller.py b/test/unit/control/controller.py index 7095f5a..14dceea 100644 --- a/test/unit/control/controller.py +++ b/test/unit/control/controller.py @@ -12,13 +12,17 @@ import stem.socket import stem.util.system import stem.version
-from mock import Mock, patch - from stem import InvalidArguments, InvalidRequest, ProtocolError, UnsatisfiableRequest from stem.control import _parse_circ_path, Controller, EventType from stem.exit_policy import ExitPolicy from test import mocking
+try: + # added in python 3.3 + from unittest.mock import Mock, patch +except ImportError: + from mock import Mock, patch +
class TestControl(unittest.TestCase): def setUp(self): diff --git a/test/unit/descriptor/export.py b/test/unit/descriptor/export.py index 32a7809..d2eeaa0 100644 --- a/test/unit/descriptor/export.py +++ b/test/unit/descriptor/export.py @@ -8,13 +8,17 @@ import unittest import stem.prereq import test.runner
-from mock import Mock, patch - from stem.descriptor.export import export_csv, export_csv_file
from test.mocking import get_relay_server_descriptor, \ get_bridge_server_descriptor
+try: + # added in python 3.3 + from unittest.mock import Mock, patch +except ImportError: + from mock import Mock, patch +
class TestExport(unittest.TestCase): @patch('stem.descriptor.server_descriptor.RelayDescriptor._verify_digest', Mock()) diff --git a/test/unit/descriptor/reader.py b/test/unit/descriptor/reader.py index 826f436..62b561b 100644 --- a/test/unit/descriptor/reader.py +++ b/test/unit/descriptor/reader.py @@ -7,7 +7,11 @@ import unittest
import stem.descriptor.reader
-from mock import patch +try: + # added in python 3.3 + from unittest.mock import patch +except ImportError: + from mock import patch
class TestDescriptorReader(unittest.TestCase): diff --git a/test/unit/descriptor/remote.py b/test/unit/descriptor/remote.py index e20dd06..4eda9e8 100644 --- a/test/unit/descriptor/remote.py +++ b/test/unit/descriptor/remote.py @@ -8,7 +8,11 @@ import unittest
import stem.descriptor.remote
-from mock import patch +try: + # added in python 3.3 + from unittest.mock import patch +except ImportError: + from mock import patch
# Output from requesting moria1's descriptor from itself... # % curl http://128.31.0.39:9131/tor/server/fp/9695DFC35FFEB861329B9F1AB04C46397020CE... diff --git a/test/unit/descriptor/server_descriptor.py b/test/unit/descriptor/server_descriptor.py index 50f27f6..b0af7cc 100644 --- a/test/unit/descriptor/server_descriptor.py +++ b/test/unit/descriptor/server_descriptor.py @@ -11,14 +11,18 @@ import stem.exit_policy import stem.prereq import stem.util.str_tools
-from mock import Mock, patch - from stem.descriptor.server_descriptor import RelayDescriptor, BridgeDescriptor
from test.mocking import get_relay_server_descriptor, \ get_bridge_server_descriptor, \ CRYPTO_BLOB
+try: + # added in python 3.3 + from unittest.mock import Mock, patch +except ImportError: + from mock import Mock, patch +
class TestServerDescriptor(unittest.TestCase): @patch('stem.descriptor.server_descriptor.RelayDescriptor._verify_digest', Mock()) diff --git a/test/unit/response/events.py b/test/unit/response/events.py index 23b7006..281dbec 100644 --- a/test/unit/response/events.py +++ b/test/unit/response/events.py @@ -10,11 +10,15 @@ import stem.response import stem.response.events import stem.util.log
-from mock import Mock - from stem import * # enums and exceptions from test import mocking
+try: + # added in python 3.3 + from unittest.mock import Mock +except ImportError: + from mock import Mock + # ADDRMAP event
ADDRMAP = '650 ADDRMAP www.atagar.com 75.119.206.243 "2012-11-19 00:50:13" \ diff --git a/test/unit/response/protocolinfo.py b/test/unit/response/protocolinfo.py index 30b218d..0eed900 100644 --- a/test/unit/response/protocolinfo.py +++ b/test/unit/response/protocolinfo.py @@ -12,11 +12,15 @@ import stem.util.proc import stem.util.system import stem.version
-from mock import Mock, patch - from stem.response.protocolinfo import AuthMethod from test import mocking
+try: + # added in python 3.3 + from unittest.mock import Mock, patch +except ImportError: + from mock import Mock, patch + NO_AUTH = """250-PROTOCOLINFO 1 250-AUTH METHODS=NULL 250-VERSION Tor="0.2.1.30" diff --git a/test/unit/tutorial.py b/test/unit/tutorial.py index 7a582be..8c76de7 100644 --- a/test/unit/tutorial.py +++ b/test/unit/tutorial.py @@ -6,13 +6,17 @@ import io import StringIO import unittest
-from mock import Mock, patch - from stem.control import Controller from stem.descriptor.reader import DescriptorReader from stem.descriptor.server_descriptor import RelayDescriptor from test import mocking
+try: + # added in python 3.3 + from unittest.mock import Mock, patch +except ImportError: + from mock import Mock, patch + MIRROR_MIRROR_OUTPUT = """\ 1. speedyexit (102.13 KB/s) 2. speedyexit (102.13 KB/s) diff --git a/test/unit/util/connection.py b/test/unit/util/connection.py index 1d9e6f6..e9c8980 100644 --- a/test/unit/util/connection.py +++ b/test/unit/util/connection.py @@ -5,12 +5,16 @@ Unit tests for the stem.util.connection functions. import platform import unittest
-from mock import patch - import stem.util.connection
from stem.util.connection import Resolver, Connection
+try: + # added in python 3.3 + from unittest.mock import patch +except ImportError: + from mock import patch + NETSTAT_OUTPUT = """\ Active Internet connections (w/o servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name diff --git a/test/unit/util/proc.py b/test/unit/util/proc.py index caf9d7a..55ed9e7 100644 --- a/test/unit/util/proc.py +++ b/test/unit/util/proc.py @@ -5,11 +5,15 @@ Unit testing code for the stem.util.proc functions. import StringIO import unittest
-from mock import Mock, patch - from stem.util import proc from test import mocking
+try: + # added in python 3.3 + from unittest.mock import Mock, patch +except ImportError: + from mock import Mock, patch +
class TestProc(unittest.TestCase): @patch('stem.util.proc._get_line') diff --git a/test/unit/util/system.py b/test/unit/util/system.py index 36204f6..d36546d 100644 --- a/test/unit/util/system.py +++ b/test/unit/util/system.py @@ -10,10 +10,14 @@ import ntpath import posixpath import unittest
-from mock import Mock, patch - from stem.util import system
+try: + # added in python 3.3 + from unittest.mock import Mock, patch +except ImportError: + from mock import Mock, patch + # Base responses for the get_pid_by_name tests. The 'success' and # 'multiple_results' entries are filled in by tests.
diff --git a/test/unit/version.py b/test/unit/version.py index 273d3e8..77551aa 100644 --- a/test/unit/version.py +++ b/test/unit/version.py @@ -7,10 +7,14 @@ import unittest import stem.util.system import stem.version
-from mock import patch - from stem.version import Version
+try: + # added in python 3.3 + from unittest.mock import patch +except ImportError: + from mock import patch + TOR_VERSION_OUTPUT = """Mar 22 23:09:37.088 [notice] Tor v0.2.2.35 \ (git-73ff13ab3cc9570d). This is experimental software. Do not rely on it for \ strong anonymity. (Running on Linux i686) diff --git a/test/util.py b/test/util.py index 3746e55..fc9386e 100644 --- a/test/util.py +++ b/test/util.py @@ -380,7 +380,11 @@ def check_pycrypto_version():
def check_mock_version(): if stem.prereq.is_mock_available(): - import mock + try: + import unittest.mock as mock + except ImportError: + import mock + return mock.__version__ else: return "missing"
tor-commits@lists.torproject.org