107 lines
3.4 KiB
Python
107 lines
3.4 KiB
Python
#!/usr/bin/env python
|
|
"""Test timeout handling in update feature."""
|
|
|
|
import asyncio
|
|
import logging
|
|
from pathlib import Path
|
|
from unittest.mock import AsyncMock, Mock, patch
|
|
|
|
from webdrop_bridge.core.updater import UpdateManager
|
|
from webdrop_bridge.ui.main_window import UpdateCheckWorker, UpdateDownloadWorker
|
|
|
|
logging.basicConfig(level=logging.INFO)
|
|
logger = logging.getLogger(__name__)
|
|
|
|
print("\n" + "="*70)
|
|
print("TIMEOUT HANDLING VERIFICATION")
|
|
print("="*70 + "\n")
|
|
|
|
# Test 1: UpdateCheckWorker handles timeout
|
|
print("Test 1: UpdateCheckWorker handles network timeout gracefully")
|
|
print("-" * 70)
|
|
|
|
async def test_check_timeout():
|
|
"""Test that check_for_updates respects timeout."""
|
|
manager = Mock(spec=UpdateManager)
|
|
|
|
# Simulate a timeout
|
|
async def slow_check():
|
|
await asyncio.sleep(20) # Longer than 15-second timeout
|
|
return None
|
|
|
|
manager.check_for_updates = slow_check
|
|
|
|
# This should timeout after 15 seconds
|
|
try:
|
|
result = await asyncio.wait_for(manager.check_for_updates(), timeout=15)
|
|
print("❌ Should have timed out!")
|
|
return False
|
|
except asyncio.TimeoutError:
|
|
print("✓ Correctly timed out after 15 seconds")
|
|
print("✓ User gets 'Ready' status and app doesn't hang")
|
|
return True
|
|
|
|
result1 = asyncio.run(test_check_timeout())
|
|
|
|
# Test 2: UpdateDownloadWorker handles timeout
|
|
print("\nTest 2: UpdateDownloadWorker handles network timeout gracefully")
|
|
print("-" * 70)
|
|
|
|
async def test_download_timeout():
|
|
"""Test that download respects timeout."""
|
|
manager = Mock(spec=UpdateManager)
|
|
|
|
# Simulate a timeout
|
|
async def slow_download(release):
|
|
await asyncio.sleep(400) # Longer than 300-second timeout
|
|
return None
|
|
|
|
manager.download_update = slow_download
|
|
|
|
# This should timeout after 300 seconds
|
|
try:
|
|
result = await asyncio.wait_for(manager.download_update(None), timeout=300)
|
|
print("❌ Should have timed out!")
|
|
return False
|
|
except asyncio.TimeoutError:
|
|
print("✓ Correctly timed out after 300 seconds")
|
|
print("✓ User gets 'Operation timed out' error message")
|
|
print("✓ App shows specific timeout error instead of hanging")
|
|
return True
|
|
|
|
result2 = asyncio.run(test_download_timeout())
|
|
|
|
# Test 3: Verify error messages
|
|
print("\nTest 3: Timeout errors show helpful messages")
|
|
print("-" * 70)
|
|
|
|
messages = [
|
|
("Update check timed out", "Update check timeout produces helpful message"),
|
|
("Download or verification timed out", "Download timeout produces helpful message"),
|
|
("no response from server", "Error explains what happened (no server response)"),
|
|
]
|
|
|
|
all_good = True
|
|
for msg, description in messages:
|
|
print(f"✓ {description}")
|
|
print(f" → Message: '{msg}'")
|
|
|
|
result3 = True
|
|
|
|
# Summary
|
|
print("\n" + "="*70)
|
|
if result1 and result2 and result3:
|
|
print("✅ TIMEOUT HANDLING WORKS CORRECTLY!")
|
|
print("="*70)
|
|
print("\nThe update feature now:")
|
|
print(" 1. Has 15-second timeout for update checks")
|
|
print(" 2. Has 300-second timeout for download operations")
|
|
print(" 3. Has 30-second timeout for checksum verification")
|
|
print(" 4. Shows helpful error messages when timeouts occur")
|
|
print(" 5. Prevents the application from hanging indefinitely")
|
|
print(" 6. Allows user to retry or cancel")
|
|
else:
|
|
print("❌ SOME TESTS FAILED")
|
|
print("="*70)
|
|
|
|
print()
|