Skip to content

Commit d68829c

Browse files
committed
Added mocking tests for Server start() and common fail on bind().
1 parent c90358e commit d68829c

3 files changed

Lines changed: 50 additions & 16 deletions

File tree

.gitignore

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,3 @@ $RECYCLE.BIN/
140140
.DS_Store
141141

142142
_NCrunch*
143-
144-
# Temporarily
145-
tests/test_network.py

Network/server.py

Lines changed: 7 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
from socket import (
22
SOL_SOCKET,
33
SO_REUSEADDR,
4-
error as sockerror,
54
SHUT_RDWR,
65
socket,
76
)
@@ -58,24 +57,19 @@ def start(self) -> None:
5857
self._socket.listen(1)
5958
print(f"Server listening on {self._host}:{self._port}")
6059

61-
except sockerror as e:
62-
if e.errno != 10038:
63-
print(f"Error in server: {e}")
60+
except OSError as e:
6461
self._socket.close()
6562
self._socket = None
66-
self._conn.update_state()
67-
return
63+
raise e
6864

6965
try:
7066
self.conn_s, addr = self._socket.accept()
7167
print(f"{str(addr)} connected")
72-
except sockerror as e:
73-
if e.errno != 10038:
74-
print(f"Error in server {e}")
68+
except OSError as e:
7569
self._socket.close()
7670
self._socket = None
7771
self._conn.update_state()
78-
return
72+
raise e
7973

8074
def start_and_handle(self):
8175
self.start()
@@ -129,7 +123,7 @@ def handler(self) -> None:
129123
self._conn.update_state()
130124
print("Press Enter to exit")
131125
break
132-
except sockerror as e:
126+
except OSError as e:
133127
print(str(e))
134128
self.close()
135129

@@ -142,7 +136,7 @@ def close(self) -> None:
142136
if self.conn_s:
143137
try:
144138
self.conn_s.shutdown(SHUT_RDWR)
145-
except sockerror as e:
139+
except OSError as e:
146140
# This error is due to lack of connection, so
147141
# `shutdown()` cannot be called without one.
148142
if e.errno != 10038:
@@ -152,4 +146,4 @@ def close(self) -> None:
152146
self.conn_s = None
153147
if self._socket:
154148
self._socket.close()
155-
self._socket = None
149+
self._socket = None

tests/test_network.py

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
import unittest
2+
from unittest.mock import patch
3+
from Network import Server, Connection
4+
from socket import socket, AF_INET, SOCK_STREAM
5+
import errno
6+
7+
8+
class TestServer(unittest.TestCase):
9+
@patch("socket.socket.accept")
10+
def test_start_successful(self, mock_accept):
11+
conn_s = socket(AF_INET, SOCK_STREAM)
12+
mock_accept.return_value = (conn_s, "127.0.0.1")
13+
14+
conn: Connection = Connection()
15+
server: Server = Server("127.0.0.1", 6000, conn)
16+
17+
server.start()
18+
19+
self.assertEqual(server.conn_s, conn_s)
20+
server.close()
21+
22+
@patch("socket.socket.bind", side_effect=OSError(errno.EADDRINUSE))
23+
def test_start_fail_bind_eaddrinuse(self, mock_bind):
24+
with self.assertRaises(OSError) as context:
25+
conn: Connection = Connection()
26+
server: Server = Server("127.0.0.1", 6000, conn)
27+
28+
server.start()
29+
30+
self.assertEqual(str(context.exception), str(errno.EADDRINUSE))
31+
32+
@patch("socket.socket.bind", side_effect=OSError(errno.EACCES))
33+
def test_start_fail_bind_eaccess(self, mock_bind):
34+
with self.assertRaises(OSError) as context:
35+
conn: Connection = Connection()
36+
server: Server = Server("127.0.0.1", 6000, conn)
37+
38+
server.start()
39+
40+
self.assertEqual(str(context.exception), str(errno.EACCES))
41+
42+
if __name__ == "__main__":
43+
unittest.main()

0 commit comments

Comments
 (0)