Skip to content

Commit f27fab8

Browse files
Add tests/test_webserver.py
1 parent 4d9357c commit f27fab8

1 file changed

Lines changed: 96 additions & 0 deletions

File tree

tests/test_webserver.py

Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
"""
2+
Unit tests for the MicroPythonOS webserver.
3+
"""
4+
5+
import _thread
6+
import sys
7+
import time
8+
import unittest
9+
10+
sys.path.insert(0, "../internal_filesystem/lib")
11+
12+
from mpos import TaskManager
13+
from mpos.net.download_manager import DownloadManager
14+
from mpos.webserver.webserver import WebServer
15+
16+
17+
class TestWebServer(unittest.TestCase):
18+
"""Test cases for WebServer."""
19+
20+
def tearDown(self):
21+
"""Ensure the webserver is stopped after tests."""
22+
if WebServer.is_started():
23+
WebServer.stop()
24+
TaskManager.stop()
25+
26+
def test_webserver_serves_webrepl_page(self):
27+
"""Webserver should serve the WebREPL HTML page on root."""
28+
29+
def start_task_manager():
30+
try:
31+
TaskManager.enable()
32+
TaskManager.start()
33+
except KeyboardInterrupt:
34+
print("TaskManager got KeyboardInterrupt, falling back to REPL shell...")
35+
except Exception as exc:
36+
print(f"TaskManager got exception: {exc}")
37+
38+
TaskManager.enable()
39+
_thread.stack_size(TaskManager.good_stack_size())
40+
_thread.start_new_thread(start_task_manager, ())
41+
42+
startup_timeout = 5.0
43+
start_time = time.time()
44+
while TaskManager.keep_running is not True and (time.time() - start_time) < startup_timeout:
45+
time.sleep(0.05)
46+
47+
if TaskManager.keep_running is not True:
48+
self.fail("TaskManager failed to start")
49+
50+
started = WebServer.start()
51+
if not started:
52+
self.fail("WebServer failed to start")
53+
54+
startup_wait = 1.0
55+
startup_wait_start = time.time()
56+
while (time.time() - startup_wait_start) < startup_wait:
57+
time.sleep(0.05)
58+
59+
response_state = {"data": None, "error": None, "done": False}
60+
61+
async def download_task():
62+
response_bytes = None
63+
last_error = None
64+
url_attempts = ["http://localhost:7890/", "http://127.0.0.1:7890/"]
65+
for url in url_attempts:
66+
for _ in range(15):
67+
try:
68+
response_bytes = await DownloadManager.download_url(url)
69+
break
70+
except Exception as exc:
71+
last_error = exc
72+
await TaskManager.sleep(0.5)
73+
if response_bytes is not None:
74+
break
75+
76+
if response_bytes is None:
77+
response_state["error"] = last_error
78+
else:
79+
response_state["data"] = response_bytes
80+
response_state["done"] = True
81+
82+
TaskManager.create_task(download_task())
83+
84+
timeout_seconds = 20.0
85+
start_wait = time.time()
86+
while not response_state["done"] and (time.time() - start_wait) < timeout_seconds:
87+
time.sleep(0.1)
88+
89+
if response_state["data"] is None:
90+
raise response_state["error"]
91+
92+
response_text = response_state["data"].decode("utf-8", "replace")
93+
self.assertIn("<title>MicroPython WebREPL</title>", response_text)
94+
95+
WebServer.stop()
96+
self.assertFalse(WebServer.is_started())

0 commit comments

Comments
 (0)