mirror of
https://github.com/OpenHands/OpenHands.git
synced 2025-12-26 05:48:36 +08:00
118 lines
3.1 KiB
Python
118 lines
3.1 KiB
Python
import logging
|
|
from unittest.mock import patch
|
|
|
|
from openhands.core.logger import SensitiveDataFilter
|
|
|
|
|
|
@patch.dict(
|
|
'os.environ',
|
|
{
|
|
'API_SECRET': 'super-secret-123',
|
|
'AUTH_TOKEN': 'auth-token-456',
|
|
'NORMAL_VAR': 'normal-value',
|
|
},
|
|
clear=True,
|
|
)
|
|
def test_sensitive_data_filter_basic():
|
|
# Create a filter instance
|
|
filter = SensitiveDataFilter()
|
|
|
|
# Create a log record with sensitive data
|
|
record = logging.LogRecord(
|
|
name='test_logger',
|
|
level=logging.INFO,
|
|
pathname='test.py',
|
|
lineno=1,
|
|
msg='API Secret: super-secret-123, Token: auth-token-456, Normal: normal-value',
|
|
args=(),
|
|
exc_info=None,
|
|
)
|
|
|
|
# Apply the filter
|
|
filter.filter(record)
|
|
|
|
# Check that sensitive data is masked but normal data isn't
|
|
assert '******' in record.msg
|
|
assert 'super-secret-123' not in record.msg
|
|
assert 'auth-token-456' not in record.msg
|
|
assert 'normal-value' in record.msg
|
|
|
|
|
|
@patch.dict('os.environ', {}, clear=True)
|
|
def test_sensitive_data_filter_empty_values():
|
|
# Test with empty environment variables
|
|
filter = SensitiveDataFilter()
|
|
|
|
record = logging.LogRecord(
|
|
name='test_logger',
|
|
level=logging.INFO,
|
|
pathname='test.py',
|
|
lineno=1,
|
|
msg='No sensitive data here',
|
|
args=(),
|
|
exc_info=None,
|
|
)
|
|
|
|
# Apply the filter
|
|
filter.filter(record)
|
|
|
|
# Message should remain unchanged
|
|
assert record.msg == 'No sensitive data here'
|
|
|
|
|
|
@patch.dict('os.environ', {'API_KEY': 'secret-key-789'}, clear=True)
|
|
def test_sensitive_data_filter_multiple_occurrences():
|
|
# Test with multiple occurrences of the same sensitive data
|
|
filter = SensitiveDataFilter()
|
|
|
|
# Create a message with multiple occurrences of the same sensitive data
|
|
record = logging.LogRecord(
|
|
name='test_logger',
|
|
level=logging.INFO,
|
|
pathname='test.py',
|
|
lineno=1,
|
|
msg='Key1: secret-key-789, Key2: secret-key-789',
|
|
args=(),
|
|
exc_info=None,
|
|
)
|
|
|
|
# Apply the filter
|
|
filter.filter(record)
|
|
|
|
# Check that all occurrences are masked
|
|
assert record.msg.count('******') == 2
|
|
assert 'secret-key-789' not in record.msg
|
|
|
|
|
|
@patch.dict(
|
|
'os.environ',
|
|
{
|
|
'secret_KEY': 'secret-value-1',
|
|
'API_secret': 'secret-value-2',
|
|
'TOKEN_code': 'secret-value-3',
|
|
},
|
|
clear=True,
|
|
)
|
|
def test_sensitive_data_filter_case_sensitivity():
|
|
# Test with different case variations in environment variable names
|
|
filter = SensitiveDataFilter()
|
|
|
|
record = logging.LogRecord(
|
|
name='test_logger',
|
|
level=logging.INFO,
|
|
pathname='test.py',
|
|
lineno=1,
|
|
msg='Values: secret-value-1, secret-value-2, secret-value-3',
|
|
args=(),
|
|
exc_info=None,
|
|
)
|
|
|
|
# Apply the filter
|
|
filter.filter(record)
|
|
|
|
# Check that all sensitive values are masked regardless of case
|
|
assert 'secret-value-1' not in record.msg
|
|
assert 'secret-value-2' not in record.msg
|
|
assert 'secret-value-3' not in record.msg
|
|
assert record.msg.count('******') == 3
|