Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Unittest passed on Python 3.5 #12

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -6,3 +6,7 @@
*.pyc
.coverage
_build
.project
.pydevproject
python/
.settings/
4 changes: 2 additions & 2 deletions spamc/backend_eventlet.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,8 @@
# pylint: disable=unused-import,invalid-name,no-member
# from eventlet.green import select
from eventlet import sleep
from eventlet.green import socket
from eventlet.green.socket import socket

Socket = socket.socket
Socket = socket
# Select = select.select
assert sleep
21 changes: 14 additions & 7 deletions spamc/client.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,6 @@
"""
import os
import errno
import types
import socket

from zlib import compress
Expand All @@ -36,10 +35,12 @@

PROTOCOL_VERSION = 'SPAMC/1.5'

from io import UnsupportedOperation


def _check_action(action):
"""check for invalid actions"""
if isinstance(action, types.StringTypes):
if isinstance(action, str):
action = action.lower()

if action not in ['learn', 'forget', 'report', 'revoke']:
Expand Down Expand Up @@ -67,6 +68,8 @@ def get_response(cmd, conn):
resp_dict['didremove'] = False

data = resp.read()
if isinstance(data, bytes):
data = data.decode()
lines = data.split('\r\n')
for index, line in enumerate(lines):
if index == 0:
Expand Down Expand Up @@ -192,7 +195,11 @@ def perform(self, cmd, msg='', extra_headers=None):
try:
conn = self.get_connection()
if hasattr(msg, 'read') and hasattr(msg, 'fileno'):
msg_length = str(os.fstat(msg.fileno()).st_size)
try:
msg_length = str(os.fstat(msg.fileno()).st_size)
except UnsupportedOperation:
msg.seek(0, 2)
msg_length = str(msg.tell() + 2)
elif hasattr(msg, 'read'):
msg.seek(0, 2)
msg_length = str(msg.tell() + 2)
Expand All @@ -209,7 +216,7 @@ def perform(self, cmd, msg='', extra_headers=None):

headers = self.get_headers(cmd, msg_length, extra_headers)

if isinstance(msg, types.StringTypes):
if isinstance(msg, str):
if self.gzip and msg:
msg = compress(msg + '\r\n', self.compress_level)
else:
Expand All @@ -224,7 +231,7 @@ def perform(self, cmd, msg='', extra_headers=None):
conn.send('\r\n')
try:
conn.socket().shutdown(socket.SHUT_WR)
except socket.error:
except socket.error as er:
pass
return get_response(cmd, conn)
except socket.gaierror as err:
Expand All @@ -240,7 +247,7 @@ def perform(self, cmd, msg='', extra_headers=None):
conn.close()
errors = (errno.EAGAIN, errno.EPIPE, errno.EBADF,
errno.ECONNRESET)
if err[0] not in errors or tries >= self.max_tries:
if err not in errors or tries >= self.max_tries:
raise SpamCError("socket.error: %s" % str(err))
except BaseException:
if conn is not None:
Expand Down Expand Up @@ -313,7 +320,7 @@ def tell(self, msg, action, learnas=''):

def learn(self, msg, learnas):
"""Learn message as spam/ham or forget"""
if not isinstance(learnas, types.StringTypes):
if not isinstance(learnas, str):
raise SpamCError('The learnas option is invalid')
if learnas.lower() == 'forget':
resp = self.tell(msg, 'forget')
Expand Down
2 changes: 2 additions & 0 deletions spamc/conn.py
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,8 @@ def invalidate(self):
self._connected = False

def send(self, data):
if isinstance(data, str):
return self._s.sendall(data.encode())
"send data"
return self._s.sendall(data)

Expand Down
87 changes: 47 additions & 40 deletions tests/_s.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,14 +20,17 @@

Copyright 2015, Andrew Colin Kissa
Licensed under AGPLv3+

Python3.5 update by Łukasz A. Grabowski
"""
import os
import socket

from mimetools import Message
from cStringIO import StringIO
from SocketServer import StreamRequestHandler, ThreadingTCPServer, \
ThreadingUnixStreamServer
from email.message import Message
from email import message_from_binary_file, message_from_file
from io import StringIO #old from cStringIO
from socketserver import StreamRequestHandler, ThreadingTCPServer, \
ThreadingUnixStreamServer #old from SocketServer


ThreadingTCPServer.allow_reuse_address = True
Expand Down Expand Up @@ -63,45 +66,49 @@ class TestSpamdHandler(StreamRequestHandler):

def do_PING(self):
"""Emulate PING"""
self.wfile.write("SPAMD/1.5 0 PONG\r\n")
self.wfile.write("SPAMD/1.5 0 PONG\r\n".encode())

def do_TELL(self):
"""Emulate TELL"""
self.wfile.write("SPAMD/1.5 0 EX_OK\r\n")
self.wfile.write("SPAMD/1.5 0 EX_OK\r\n".encode())
didset = self.headers.get('Set')
if didset:
self.wfile.write("DidSet: True\r\n")
self.wfile.write("DidSet: True\r\n".encode())
didremove = self.headers.get('Remove')
if didremove:
self.wfile.write("DidRemove: True\r\n")
self.wfile.write("\r\n\r\n")
self.wfile.write("DidRemove: True\r\n".encode())
self.wfile.write("\r\n\r\n".encode())
self.close_connection = 1

def do_HEADERS(self):
"""Emulate HEADERS"""
content_length = int(self.headers.get('Content-length', 0))
body = self.rfile.read(content_length)
if isinstance(body, bytes):
body = body.decode()
parts, = body.split('\r\n\r\n')
_headers = self.MessageClass(StringIO(parts))
self.wfile.write("SPAMD/1.5 0 EX_OK\r\n")
self.wfile.write("Spam: True ; 15 / 5\r\n")
_headers = message_from_file(StringIO(parts))
self.wfile.write("SPAMD/1.5 0 EX_OK\r\n".encode())
self.wfile.write("Spam: True ; 15 / 5\r\n".encode())
if self.request_version >= (1, 3):
self.wfile.write("Content-length: %d\r\n" % len(_headers))
self.wfile.write("\r\n\r\n")
self.wfile.write(_headers)
self.wfile.write(("Content-length: %d\r\n" % len(_headers)).encode())
self.wfile.write("\r\n\r\n".encode())
self.wfile.write(str(_headers).encode())
self.close_connection = 1

def do_PROCESS(self):
"""Emulate PROCESS"""
content_length = int(self.headers.get('Content-length', 0))
body = self.rfile.read(content_length)
self.wfile.write("SPAMD/1.5 0 EX_OK\r\n")
self.wfile.write("Spam: True ; 15 / 5\r\n")
if isinstance(body, bytes):
body = body.decode()
self.wfile.write("SPAMD/1.5 0 EX_OK\r\n".encode())
self.wfile.write("Spam: True ; 15 / 5\r\n".encode())
if self.request_version >= (1, 3):
self.wfile.write(
"Content-length: %d\r\n" % content_length)
self.wfile.write("\r\n\r\n")
self.wfile.write(body)
self.wfile.write((
"Content-length: %d\r\n" % content_length).encode())
self.wfile.write("\r\n\r\n".encode())
self.wfile.write(body.encode())
self.close_connection = 1

def do_REPORT_IFSPAM(self):
Expand All @@ -110,45 +117,45 @@ def do_REPORT_IFSPAM(self):

def do_REPORT(self):
"""Emulate REPORT"""
self.wfile.write("SPAMD/1.5 0 EX_OK\r\n")
self.wfile.write("Spam: True ; 15 / 5\r\n")
self.wfile.write("SPAMD/1.5 0 EX_OK\r\n".encode())
self.wfile.write("Spam: True ; 15 / 5\r\n".encode())
if self.request_version >= (1, 3):
self.wfile.write(
"Content-length: %d\r\n" % len(REPORT_TMPL))
self.wfile.write("\r\n\r\n")
self.wfile.write(REPORT_TMPL)
self.wfile.write((
"Content-length: %d\r\n" % len(REPORT_TMPL)).encode())
self.wfile.write("\r\n\r\n".encode())
self.wfile.write(REPORT_TMPL.encode())
self.close_connection = 1

def do_SYMBOLS(self):
"""Emulate SYMBOLS"""
rules = "BAYES_00,RDNS_NONE,KAM_LAZY_DOMAIN_SECURITY"
self.wfile.write("SPAMD/1.5 0 EX_OK\r\n")
self.wfile.write("Spam: True ; 15 / 5\r\n")
self.wfile.write("SPAMD/1.5 0 EX_OK\r\n".encode())
self.wfile.write("Spam: True ; 15 / 5\r\n".encode())
if self.request_version >= (1, 3):
self.wfile.write("Content-length: %d\r\n" % len(rules))
self.wfile.write("\r\n\r\n")
self.wfile.write(rules)
self.wfile.write(("Content-length: %d\r\n" % len(rules)).encode())
self.wfile.write("\r\n\r\n".encode())
self.wfile.write(rules.encode())
if self.request_version < (1, 3):
self.wfile.write("\r\n")
self.wfile.write("\r\n".encode())
self.close_connection = 1

def do_CHECK(self):
"""Emulate CHECK"""
self.wfile.write("SPAMD/1.5 0 EX_OK\r\n")
self.wfile.write("Spam: True ; 15 / 5\r\n")
self.wfile.write("\r\n\r\n")
self.wfile.write("SPAMD/1.5 0 EX_OK\r\n".encode())
self.wfile.write("Spam: True ; 15 / 5\r\n".encode())
self.wfile.write("\r\n\r\n".encode())
self.close_connection = 1

def send_error(self, msg):
"""Send Error response"""
self.wfile.write("SPAMD/1.0 EX_PROTOCOL Bad header line: %s\r\n" % msg)
self.wfile.write(("SPAMD/1.0 EX_PROTOCOL Bad header line: %s\r\n" % msg).encode())

def parse_request(self):
"""Parse the request"""
self.command = None
self.request_version = version = self.default_request_version
self.close_connection = 1
requestline = self.raw_requestline
requestline = self.raw_requestline.decode()
requestline = requestline.rstrip('\r\n')
self.requestline = requestline
words = requestline.split()
Expand Down Expand Up @@ -177,8 +184,8 @@ def parse_request(self):
else:
self.send_error("Bad request syntax (%r)" % requestline)
return False
self.command, self.request_version = command, version
self.headers = self.MessageClass(self.rfile, 0)
self.command, self.request_version = command, version_number
self.headers = message_from_binary_file(self.rfile)
return True

def handle_one_request(self):
Expand Down
13 changes: 5 additions & 8 deletions tests/test_spamc_load_backend.py
Original file line number Diff line number Diff line change
@@ -1,15 +1,10 @@
import os
import sys
import threading
try:
import unittest2
except ImportError:
if sys.version_info < (2, 7):
raise
import unittest as unittest2
import unittest as unittest2

from spamc import SpamC
from spamc import backend_eventlet
from spamc import backend_thread
from spamc.exceptions import SpamCError

from _s import return_tcp
Expand All @@ -35,14 +30,15 @@ def setUpClass(cls):
port=int(os.environ.get('SPAMD_PORT', 10030)),
gzip=gzip,
compress_level=int(os.environ.get('SPAMD_COMPRESS_LEVEL', 6)),
backend=backend_eventlet)
backend=backend_thread)
path = os.path.dirname(os.path.dirname(__file__))
cls.filename = os.path.join(path, 'examples', 'sample-spam.txt')

@classmethod
def tearDownClass(cls):
if hasattr(cls, 'tcp_server'):
cls.tcp_server.shutdown()
cls.tcp_server.server_close()

def test_spamc_tcp_no_conn(self):
spamc_tcp = SpamC(host='127.0.0.1', port=10001)
Expand All @@ -53,5 +49,6 @@ def test_spamc_tcp_ping(self):
self.assertIn('message', result)
self.assertEqual('PONG', result['message'])


if __name__ == '__main__':
unittest2.main()
7 changes: 1 addition & 6 deletions tests/test_spamc_mock.py
Original file line number Diff line number Diff line change
@@ -1,12 +1,7 @@
import sys
import socket
import threading
try:
import unittest2
except ImportError:
if sys.version_info < (2, 7):
raise
import unittest as unittest2
import unittest as unittest2

import mock

Expand Down
13 changes: 4 additions & 9 deletions tests/test_spamc_stringio.py
Original file line number Diff line number Diff line change
@@ -1,15 +1,10 @@
import os
import sys
import threading
try:
import unittest2
except ImportError:
if sys.version_info < (2, 7):
raise
import unittest as unittest2

from mimetools import Message
from cStringIO import StringIO
import unittest as unittest2

from email.message import Message
from io import StringIO

from spamc import SpamC
from spamc.exceptions import SpamCError
Expand Down
13 changes: 4 additions & 9 deletions tests/test_spamc_tcp.py
Original file line number Diff line number Diff line change
@@ -1,15 +1,10 @@
import os
import sys
import threading
try:
import unittest2
except ImportError:
if sys.version_info < (2, 7):
raise
import unittest as unittest2

from mimetools import Message
from cStringIO import StringIO
import unittest as unittest2

from email.message import Message
from io import StringIO

from spamc import SpamC
from spamc.exceptions import SpamCError
Expand Down
12 changes: 4 additions & 8 deletions tests/test_spamc_tcp_eventlet.py
Original file line number Diff line number Diff line change
@@ -1,15 +1,10 @@
import os
import sys
import threading
try:
import unittest2
except ImportError:
if sys.version_info < (2, 7):
raise
import unittest as unittest2
import unittest as unittest2

from mimetools import Message
from cStringIO import StringIO
from email.message import Message
from io import StringIO

from spamc import SpamC
from spamc.exceptions import SpamCError
Expand Down Expand Up @@ -45,6 +40,7 @@ def setUpClass(cls):
def tearDownClass(cls):
if hasattr(cls, 'tcp_server'):
cls.tcp_server.shutdown()
cls.tcp_server.server_close()

def test_spamc_tcp_no_conn(self):
spamc_tcp = SpamC(host='127.0.0.1', port=10001)
Expand Down
Loading