mirror of
https://github.com/OpenHands/OpenHands.git
synced 2025-12-26 05:48:36 +08:00
161 lines
5.2 KiB
Python
161 lines
5.2 KiB
Python
"""Tests for system stats utilities."""
|
|
|
|
import time
|
|
from unittest.mock import patch
|
|
|
|
import psutil
|
|
|
|
from openhands.runtime.utils.system_stats import (
|
|
get_system_info,
|
|
get_system_stats,
|
|
update_last_execution_time,
|
|
)
|
|
|
|
|
|
def test_get_system_stats():
|
|
"""Test that get_system_stats returns valid system statistics."""
|
|
stats = get_system_stats()
|
|
|
|
# Test structure
|
|
assert isinstance(stats, dict)
|
|
assert set(stats.keys()) == {'cpu_percent', 'memory', 'disk', 'io'}
|
|
|
|
# Test CPU stats
|
|
assert isinstance(stats['cpu_percent'], float)
|
|
assert 0 <= stats['cpu_percent'] <= 100 * psutil.cpu_count()
|
|
|
|
# Test memory stats
|
|
assert isinstance(stats['memory'], dict)
|
|
assert set(stats['memory'].keys()) == {'rss', 'vms', 'percent'}
|
|
assert isinstance(stats['memory']['rss'], int)
|
|
assert isinstance(stats['memory']['vms'], int)
|
|
assert isinstance(stats['memory']['percent'], float)
|
|
assert stats['memory']['rss'] > 0
|
|
assert stats['memory']['vms'] > 0
|
|
assert 0 <= stats['memory']['percent'] <= 100
|
|
|
|
# Test disk stats
|
|
assert isinstance(stats['disk'], dict)
|
|
assert set(stats['disk'].keys()) == {'total', 'used', 'free', 'percent'}
|
|
assert isinstance(stats['disk']['total'], int)
|
|
assert isinstance(stats['disk']['used'], int)
|
|
assert isinstance(stats['disk']['free'], int)
|
|
assert isinstance(stats['disk']['percent'], float)
|
|
assert stats['disk']['total'] > 0
|
|
assert stats['disk']['used'] >= 0
|
|
assert stats['disk']['free'] >= 0
|
|
assert 0 <= stats['disk']['percent'] <= 100
|
|
# Verify that used + free is less than or equal to total
|
|
# (might not be exactly equal due to filesystem overhead)
|
|
assert stats['disk']['used'] + stats['disk']['free'] <= stats['disk']['total']
|
|
|
|
# Test I/O stats
|
|
assert isinstance(stats['io'], dict)
|
|
assert set(stats['io'].keys()) == {'read_bytes', 'write_bytes'}
|
|
assert isinstance(stats['io']['read_bytes'], int)
|
|
assert isinstance(stats['io']['write_bytes'], int)
|
|
assert stats['io']['read_bytes'] >= 0
|
|
assert stats['io']['write_bytes'] >= 0
|
|
|
|
|
|
def test_get_system_stats_stability():
|
|
"""Test that get_system_stats can be called multiple times without errors."""
|
|
# Call multiple times to ensure stability
|
|
for _ in range(3):
|
|
stats = get_system_stats()
|
|
assert isinstance(stats, dict)
|
|
assert stats['cpu_percent'] >= 0
|
|
|
|
|
|
def test_get_system_info():
|
|
"""Test that get_system_info returns valid system information."""
|
|
with patch(
|
|
'openhands.runtime.utils.system_stats.get_system_stats'
|
|
) as mock_get_stats:
|
|
mock_get_stats.return_value = {'cpu_percent': 10.0}
|
|
|
|
info = get_system_info()
|
|
|
|
# Test structure
|
|
assert isinstance(info, dict)
|
|
assert set(info.keys()) == {'uptime', 'idle_time', 'resources'}
|
|
|
|
# Test values
|
|
assert isinstance(info['uptime'], float)
|
|
assert isinstance(info['idle_time'], float)
|
|
assert info['uptime'] > 0
|
|
assert info['idle_time'] >= 0
|
|
assert info['resources'] == {'cpu_percent': 10.0}
|
|
|
|
# Verify get_system_stats was called
|
|
mock_get_stats.assert_called_once()
|
|
|
|
|
|
def test_update_last_execution_time():
|
|
"""Test that update_last_execution_time updates the last execution time."""
|
|
# Get initial system info
|
|
initial_info = get_system_info()
|
|
initial_idle_time = initial_info['idle_time']
|
|
|
|
# Wait a bit to ensure time difference
|
|
time.sleep(0.1)
|
|
|
|
# Update last execution time
|
|
update_last_execution_time()
|
|
|
|
# Get updated system info
|
|
updated_info = get_system_info()
|
|
updated_idle_time = updated_info['idle_time']
|
|
|
|
# The idle time should be reset (close to zero)
|
|
assert updated_idle_time < initial_idle_time
|
|
assert updated_idle_time < 0.1 # Should be very small
|
|
|
|
|
|
def test_idle_time_increases_without_updates():
|
|
"""Test that idle_time increases when no updates are made."""
|
|
# Update last execution time to reset idle time
|
|
update_last_execution_time()
|
|
|
|
# Get initial system info
|
|
initial_info = get_system_info()
|
|
initial_idle_time = initial_info['idle_time']
|
|
|
|
# Wait a bit
|
|
time.sleep(0.2)
|
|
|
|
# Get updated system info without calling update_last_execution_time
|
|
updated_info = get_system_info()
|
|
updated_idle_time = updated_info['idle_time']
|
|
|
|
# The idle time should have increased
|
|
assert updated_idle_time > initial_idle_time
|
|
assert updated_idle_time >= 0.2 # Should be at least the sleep time
|
|
|
|
|
|
@patch('time.time')
|
|
def test_idle_time_calculation(mock_time):
|
|
"""Test that idle_time is calculated correctly."""
|
|
# Mock time.time() to return controlled values
|
|
mock_time.side_effect = [
|
|
100.0, # Initial _start_time
|
|
100.0, # Initial _last_execution_time
|
|
110.0, # Current time in get_system_info
|
|
]
|
|
|
|
# Import the module again to reset the global variables with our mocked time
|
|
import importlib
|
|
|
|
import openhands.runtime.utils.system_stats
|
|
|
|
importlib.reload(openhands.runtime.utils.system_stats)
|
|
|
|
# Get system info
|
|
from openhands.runtime.utils.system_stats import get_system_info
|
|
|
|
info = get_system_info()
|
|
|
|
# Verify idle_time calculation
|
|
assert info['uptime'] == 10.0 # 110 - 100
|
|
assert info['idle_time'] == 10.0 # 110 - 100
|