1
0
mirror of https://github.com/craigerl/aprsd.git synced 2026-04-01 20:55:43 -04:00

Merge pull request #223 from craigerl/feature/configurable-stale-timeout

feat: Add configurable stale_timeout for APRS-IS connections
This commit is contained in:
Walter A. Boring IV 2026-03-27 10:27:09 -04:00 committed by GitHub
commit 27413ab8cf
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 36 additions and 3 deletions

View File

@ -32,8 +32,12 @@ class APRSISDriver:
connected = False
def __init__(self):
max_timeout = {'hours': 0.0, 'minutes': 2, 'seconds': 0}
self.max_delta = datetime.timedelta(**max_timeout)
# Use configurable stale_timeout, defaulting to 120 seconds if not set
try:
stale_timeout = CONF.aprs_network.stale_timeout
except (cfg.NoSuchOptError, cfg.NoSuchGroupError):
stale_timeout = 120 # Default to 2 minutes for backward compatibility
self.max_delta = datetime.timedelta(seconds=stale_timeout)
self.login_status = {
'success': False,
'message': None,

View File

@ -47,6 +47,14 @@ aprs_opts = [
default=14580,
help='APRS-IS port',
),
cfg.IntOpt(
'stale_timeout',
default=120,
help='Seconds without receiving data before connection is considered stale. '
'When a connection goes stale, it will be automatically reconnected. '
'Lower values detect dead connections faster but may cause unnecessary '
'reconnects during brief network hiccups. Default is 120 seconds (2 minutes).',
),
]
kiss_serial_opts = [

View File

@ -24,6 +24,7 @@ class TestAPRSISDriver(unittest.TestCase):
self.mock_conf.aprs_network.password = '12345'
self.mock_conf.aprs_network.host = 'rotate.aprs.net'
self.mock_conf.aprs_network.port = 14580
self.mock_conf.aprs_network.stale_timeout = 120 # Default 2 minutes
# Mock APRS Lib Client
self.aprslib_patcher = mock.patch('aprsd.client.drivers.aprsis.APRSLibClient')
@ -71,11 +72,31 @@ class TestAPRSISDriver(unittest.TestCase):
def test_init(self):
"""Test initialization sets default values."""
self.assertIsInstance(self.driver.max_delta, datetime.timedelta)
self.assertEqual(self.driver.max_delta, datetime.timedelta(minutes=2))
# Default stale_timeout is 120 seconds (2 minutes)
self.assertEqual(self.driver.max_delta, datetime.timedelta(seconds=120))
self.assertFalse(self.driver.login_status['success'])
self.assertIsNone(self.driver.login_status['message'])
self.assertIsNone(self.driver._client)
def test_init_custom_stale_timeout(self):
"""Test initialization with custom stale_timeout."""
# Save original max_delta
original_max_delta = self.driver.max_delta
try:
# Set a custom stale_timeout
self.mock_conf.aprs_network.stale_timeout = 60 # 1 minute
# Re-initialize the existing driver with new config
# (singleton pattern means we can't create a new instance)
self.driver.__init__()
self.assertEqual(self.driver.max_delta, datetime.timedelta(seconds=60))
finally:
# Restore original max_delta so other tests aren't affected
self.driver.max_delta = original_max_delta
self.mock_conf.aprs_network.stale_timeout = 120
def test_is_enabled_true(self):
"""Test is_enabled returns True when APRS-IS is enabled."""
self.mock_conf.aprs_network.enabled = True