Skip to content

Commit f150cfd

Browse files
remove unused multiprocessing test mode (#1011)
* remove BOLT_PYTHON_MOCK_SERVER_MODE --------- Co-authored-by: Kazuhiro Sera <[email protected]>
1 parent 5e63905 commit f150cfd

File tree

7 files changed

+21
-296
lines changed

7 files changed

+21
-296
lines changed

.github/workflows/codecov.yml

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,6 @@ jobs:
1414
matrix:
1515
python-version: ["3.11"]
1616
env:
17-
# default: multiprocessing
18-
# threading is more stable on GitHub Actions
19-
BOLT_PYTHON_MOCK_SERVER_MODE: threading
2017
BOLT_PYTHON_CODECOV_RUNNING: "1"
2118
steps:
2219
- uses: actions/checkout@v3

.github/workflows/tests.yml

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,6 @@ jobs:
1313
strategy:
1414
matrix:
1515
python-version: ["3.6", "3.7", "3.8", "3.9", "3.10", "3.11"]
16-
env:
17-
# default: multiprocessing
18-
# threading is more stable on GitHub Actions
19-
BOLT_PYTHON_MOCK_SERVER_MODE: threading
2016
steps:
2117
- uses: actions/checkout@v3
2218
- name: Set up Python ${{ matrix.python-version }}
Lines changed: 9 additions & 69 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,11 @@
11
import json
22
import logging
3-
import sys
43
import threading
54
import time
65
import requests
7-
from multiprocessing.context import Process
86
from typing import List
97
from unittest import TestCase
108

11-
from tests.utils import get_mock_server_mode
12-
139
socket_mode_envelopes = [
1410
"""{"envelope_id":"57d6a792-4d35-4d0b-b6aa-3361493e1caf","payload":{"type":"shortcut","token":"xxx","action_ts":"1610198080.300836","team":{"id":"T111","domain":"seratch"},"user":{"id":"U111","username":"seratch","team_id":"T111"},"is_enterprise_install":false,"enterprise":null,"callback_id":"do-something","trigger_id":"111.222.xxx"},"type":"interactive","accepts_response_payload":false}""",
1511
"""{"envelope_id":"1d3c79ab-0ffb-41f3-a080-d19e85f53649","payload":{"token":"xxx","team_id":"T111","team_domain":"xxx","channel_id":"C111","channel_name":"random","user_id":"U111","user_name":"seratch","command":"/hello-socket-mode","text":"","api_app_id":"A111","response_url":"https://hooks.slack.com/commands/T111/111/xxx","trigger_id":"111.222.xxx"},"type":"slash_commands","accepts_response_payload":true}""",
@@ -56,42 +52,11 @@ def link(ws):
5652
return _start_thread_socket_mode_server
5753

5854

59-
def start_process_socket_mode_server(port: int):
60-
logger = logging.getLogger(__name__)
61-
app: Flask = Flask(__name__)
62-
sockets: Sockets = Sockets(app)
63-
64-
envelopes_to_consume: List[str] = list(socket_mode_envelopes)
65-
66-
@sockets.route("/link")
67-
def link(ws):
68-
while not ws.closed:
69-
message = ws.read_message()
70-
if message is not None:
71-
if len(envelopes_to_consume) > 0:
72-
e = envelopes_to_consume.pop(0)
73-
logger.debug(f"Send an envelope: {e}")
74-
ws.send(e)
75-
76-
logger.debug(f"Server received a message: {message}")
77-
ws.send(message)
78-
79-
from gevent import pywsgi
80-
from geventwebsocket.handler import WebSocketHandler
81-
82-
server = pywsgi.WSGIServer(("", port), app, handler_class=WebSocketHandler)
83-
server.serve_forever(stop_timeout=1)
84-
85-
8655
def start_socket_mode_server(test, port: int):
87-
if get_mock_server_mode() == "threading":
88-
test.sm_thread = threading.Thread(target=start_thread_socket_mode_server(test, port))
89-
test.sm_thread.daemon = True
90-
test.sm_thread.start()
91-
wait_for_socket_mode_server(port, 2) # wait for the server
92-
else:
93-
test.sm_process = Process(target=start_process_socket_mode_server, kwargs={"port": port})
94-
test.sm_process.start()
56+
test.sm_thread = threading.Thread(target=start_thread_socket_mode_server(test, port))
57+
test.sm_thread.daemon = True
58+
test.sm_thread.start()
59+
wait_for_socket_mode_server(port, 4) # wait for the server
9560

9661

9762
def wait_for_socket_mode_server(port: int, secs: int):
@@ -100,39 +65,14 @@ def wait_for_socket_mode_server(port: int, secs: int):
10065
response = requests.get(url=f"http://localhost:{port}/state")
10166
if response.ok:
10267
break
68+
time.sleep(0.01)
10369

10470

10571
def stop_socket_mode_server(test):
106-
if get_mock_server_mode() == "threading":
107-
print(test)
108-
test.server.stop()
109-
test.server.close()
110-
else:
111-
# terminate the process
112-
test.sm_process.terminate()
113-
test.sm_process.join()
114-
# Python 3.6 does not have these methods
115-
if sys.version_info.major == 3 and sys.version_info.minor > 6:
116-
# cleanup the process's resources
117-
test.sm_process.kill()
118-
test.sm_process.close()
119-
120-
test.sm_process = None
72+
test.server.stop()
73+
test.server.close()
12174

12275

12376
async def stop_socket_mode_server_async(test: TestCase):
124-
if get_mock_server_mode() == "threading":
125-
test.server.stop()
126-
test.server.close()
127-
else:
128-
# terminate the process
129-
test.sm_process.terminate()
130-
test.sm_process.join()
131-
132-
# Python 3.6 does not have these methods
133-
if sys.version_info.major == 3 and sys.version_info.minor > 6:
134-
# cleanup the process's resources
135-
test.sm_process.kill()
136-
test.sm_process.close()
137-
138-
test.sm_process = None
77+
test.server.stop()
78+
test.server.close()

tests/adapter_tests/socket_mode/mock_web_api_server.py

Lines changed: 6 additions & 101 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,13 @@
11
import json
22
import logging
33
import re
4-
import sys
54
import threading
65
import time
76
from http import HTTPStatus
87
from http.server import HTTPServer, SimpleHTTPRequestHandler
9-
from multiprocessing.context import Process
108
from typing import Type
119
from unittest import TestCase
1210
from urllib.parse import urlparse, parse_qs
13-
from urllib.request import Request, urlopen
14-
15-
from tests.utils import get_mock_server_mode
1611

1712

1813
class MockHandler(SimpleHTTPRequestHandler):
@@ -120,59 +115,6 @@ def do_POST(self):
120115
self._handle()
121116

122117

123-
#
124-
# multiprocessing
125-
#
126-
127-
128-
class MockServerProcessTarget:
129-
def __init__(self, handler: Type[SimpleHTTPRequestHandler] = MockHandler):
130-
self.handler = handler
131-
132-
def run(self):
133-
self.handler.received_requests = {}
134-
self.server = HTTPServer(("localhost", 8888), self.handler)
135-
try:
136-
self.server.serve_forever(0.05)
137-
finally:
138-
self.server.server_close()
139-
140-
def stop(self):
141-
self.handler.received_requests = {}
142-
self.server.shutdown()
143-
self.join()
144-
145-
146-
class MonitorThread(threading.Thread):
147-
def __init__(self, test: TestCase, handler: Type[SimpleHTTPRequestHandler] = MockHandler):
148-
threading.Thread.__init__(self, daemon=True)
149-
self.handler = handler
150-
self.test = test
151-
self.test.mock_received_requests = None
152-
self.is_running = True
153-
154-
def run(self) -> None:
155-
while self.is_running:
156-
try:
157-
req = Request(f"{self.test.server_url}/received_requests.json")
158-
resp = urlopen(req, timeout=1)
159-
self.test.mock_received_requests = json.loads(resp.read().decode("utf-8"))
160-
except Exception as e:
161-
# skip logging for the initial request
162-
if self.test.mock_received_requests is not None:
163-
logging.getLogger(__name__).exception(e)
164-
time.sleep(0.01)
165-
166-
def stop(self):
167-
self.is_running = False
168-
self.join()
169-
170-
171-
#
172-
# threading
173-
#
174-
175-
176118
class MockServerThread(threading.Thread):
177119
def __init__(self, test: TestCase, handler: Type[SimpleHTTPRequestHandler] = MockHandler):
178120
threading.Thread.__init__(self)
@@ -197,52 +139,15 @@ def stop(self):
197139

198140

199141
def setup_mock_web_api_server(test: TestCase):
200-
if get_mock_server_mode() == "threading":
201-
test.server_started = threading.Event()
202-
test.thread = MockServerThread(test)
203-
test.thread.start()
204-
test.server_started.wait()
205-
else:
206-
# start a mock server as another process
207-
target = MockServerProcessTarget()
208-
test.server_url = "http://localhost:8888"
209-
test.host, test.port = "localhost", 8888
210-
test.process = Process(target=target.run, daemon=True)
211-
test.process.start()
212-
time.sleep(0.1)
213-
214-
# start a thread in the current process
215-
# this thread fetches mock_received_requests from the remote process
216-
test.monitor_thread = MonitorThread(test)
217-
test.monitor_thread.start()
218-
count = 0
219-
# wait until the first successful data retrieval
220-
while test.mock_received_requests is None:
221-
time.sleep(0.01)
222-
count += 1
223-
if count >= 100:
224-
raise Exception("The mock server is not yet running!")
142+
test.server_started = threading.Event()
143+
test.thread = MockServerThread(test)
144+
test.thread.start()
145+
test.server_started.wait()
225146

226147

227148
def cleanup_mock_web_api_server(test: TestCase):
228-
if get_mock_server_mode() == "threading":
229-
test.thread.stop()
230-
test.thread = None
231-
else:
232-
# stop the thread to fetch mock_received_requests from the remote process
233-
test.monitor_thread.stop()
234-
235-
# terminate the process
236-
test.process.terminate()
237-
test.process.join()
238-
239-
# Python 3.6 does not have these methods
240-
if sys.version_info.major == 3 and sys.version_info.minor > 6:
241-
# cleanup the process's resources
242-
test.process.kill()
243-
test.process.close()
244-
245-
test.process = None
149+
test.thread.stop()
150+
test.thread = None
246151

247152

248153
def assert_auth_test_count(test: TestCase, expected_count: int):

tests/adapter_tests/socket_mode/test_interactions_builtin.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,6 @@ def teardown_method(self):
3434
stop_socket_mode_server(self)
3535

3636
def test_interactions(self):
37-
3837
app = App(client=self.web_client)
3938

4039
result = {"shortcut": False, "command": False}

0 commit comments

Comments
 (0)