-
Notifications
You must be signed in to change notification settings - Fork 9
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #15 from threat9/tcp-service
WIP: TCPServiceMock
- Loading branch information
Showing
11 changed files
with
102 additions
and
18 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -32,7 +32,7 @@ | |
install_requires=[ | ||
"click", | ||
"Faker", | ||
"flask", | ||
"flask>=1.0.0", | ||
"gunicorn", | ||
"pyopenssl", | ||
"requests", | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,23 @@ | ||
import socket | ||
|
||
from threat9_test_bed.service_mocks import TCPServiceMock | ||
|
||
|
||
def test_tcp_service_mock_add_banner(): | ||
with TCPServiceMock("127.0.0.1", 8023) as target: | ||
assert target.host == "127.0.0.1" | ||
assert target.port == 8023 | ||
|
||
mocked_doo = target.get_command_mock(b"doo") | ||
mocked_doo.return_value = b"where are you?" | ||
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: | ||
s.connect((target.host, target.port)) | ||
s.send(b"doo") | ||
assert s.recv(1024) == b"where are you?" | ||
|
||
mocked_scoo = target.get_command_mock(b"scoo") | ||
mocked_scoo.return_value = b"bee" | ||
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: | ||
s.connect((target.host, target.port)) | ||
s.send(b"scoo") | ||
assert s.recv(1024) == b"bee" |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -64,6 +64,7 @@ def redirect_(): | |
|
||
def timeout(): | ||
time.sleep(60 * 60) | ||
return found() | ||
|
||
|
||
def error(): | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,2 +1,4 @@ | ||
from .http_scenario_service import HttpScenarioService # noqa: F401 | ||
from .http_service_mock import HttpServiceMock # noqa: F401 | ||
from .tcp_service_mock import TCPServiceMock # noqa: F401 | ||
from .telnet_service_mock import TelnetServiceMock # noqa: F401 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,30 @@ | ||
from logging import getLogger | ||
import threading | ||
from unittest import mock | ||
|
||
from ..tcp_service.tcp_server import TCPHandler, TCPServer | ||
from .base_service import BaseService | ||
|
||
logger = getLogger(__name__) | ||
|
||
|
||
class TCPServiceMock(BaseService): | ||
|
||
def __init__(self, host: str, port: int): | ||
super().__init__(host, port) | ||
self.server = TCPServer((self.host, self.port), TCPHandler, False) | ||
self.server_thread = threading.Thread(target=self.server.serve_forever) | ||
|
||
def start(self): | ||
self.server.server_bind() | ||
self.server.server_activate() | ||
self.server_thread.start() | ||
|
||
def teardown(self): | ||
self.server.shutdown() | ||
self.server_thread.join() | ||
self.server.server_close() | ||
|
||
def get_command_mock(self, command: bytes) -> mock.Mock: | ||
logger.debug(f"{self} mock for '{command}' has been added.") | ||
return self.server.get_command_mock(command) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Empty file.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,32 @@ | ||
from logging import getLogger | ||
import socketserver | ||
from unittest import mock | ||
|
||
logger = getLogger(__name__) | ||
|
||
|
||
class TCPServer(socketserver.ThreadingTCPServer): | ||
allow_reuse_address = True | ||
|
||
def __init__( | ||
self, | ||
server_address, | ||
request_handler_class, | ||
bind_and_activate=True, | ||
): | ||
super().__init__( | ||
server_address, request_handler_class, bind_and_activate, | ||
) | ||
self.handlers = {} | ||
|
||
def get_command_mock(self, command: bytes) -> mock.Mock: | ||
mocked_handler = mock.MagicMock(name=command) | ||
self.handlers[command] = mocked_handler | ||
return mocked_handler | ||
|
||
|
||
class TCPHandler(socketserver.BaseRequestHandler): | ||
def handle(self): | ||
data = self.request.recv(1024) | ||
handler = self.server.handlers[data] | ||
self.request.sendall(handler()) |