forked from luopingyi/xc_agent_platform_demo
fix missing/invalid_token: bake xc_token file + XC_TOKEN_FILE first; dual ENV; token_probe diagnostics (63 tests)
This commit is contained in:
@@ -76,10 +76,19 @@ class TestLiveCycle(unittest.TestCase):
|
||||
self.assertNotIn('do not log', self.logs.getvalue())
|
||||
|
||||
def test_missing_token_real_reader(self):
|
||||
with patch.dict(os.environ, {'XC_TOKEN': ''}):
|
||||
with patch.dict(os.environ, {'STRATEGY_ID': 'sid'}, clear=True):
|
||||
run_cycle([candidate('a')], self.client)
|
||||
self.client.submit.assert_not_called()
|
||||
self.assertIn('missing/invalid_token', self.logs.getvalue())
|
||||
self.assertIn('[live] token_probe EXTERNAL_SERVICE_TOKEN=absent XC_TOKEN_FILE=absent XC_TOKEN=absent MODELHUB_XC_TOKEN=absent', self.logs.getvalue())
|
||||
self.assertNotIn('[live] token source=', self.logs.getvalue())
|
||||
|
||||
def test_rejected_token_probe_does_not_leak(self):
|
||||
with patch.dict(os.environ, {'XC_TOKEN': '<private-secret-fragment>'}):
|
||||
self.cycle()
|
||||
self.client.submit.assert_not_called()
|
||||
self.assertIn('XC_TOKEN=rejected', self.logs.getvalue())
|
||||
self.assertNotIn('private-secret', self.logs.getvalue())
|
||||
|
||||
def test_worker_waits_and_stops(self):
|
||||
from src.server import _live_worker
|
||||
|
||||
@@ -54,10 +54,11 @@ class TestLedger(unittest.TestCase):
|
||||
def test_source_and_no_value_logs(self):
|
||||
import io
|
||||
with patch.dict(os.environ, {'EXTERNAL_SERVICE_TOKEN': 'platform-credential', 'XC_TOKEN_FILE': '/nonexistent'}), patch('sys.stderr', new_callable=io.StringIO) as log:
|
||||
self.assertEqual(resolve_token_with_source(), ('platform-credential', 'EXTERNAL_SERVICE_TOKEN'))
|
||||
self.assertEqual(resolve_token_with_source(), ('synthetic-credential', 'XC_TOKEN'))
|
||||
self.cycle()
|
||||
self.assertEqual(log.getvalue().count('token source=EXTERNAL_SERVICE_TOKEN'), 1)
|
||||
self.assertEqual(log.getvalue().count('token source=XC_TOKEN'), 1)
|
||||
self.assertNotIn('platform-credential', log.getvalue())
|
||||
self.assertNotIn('synthetic-credential', log.getvalue())
|
||||
with patch.dict(os.environ, {'EXTERNAL_SERVICE_TOKEN': '<TOKEN>', 'XC_TOKEN': 'placeholder', 'MODELHUB_XC_TOKEN': 'alias-credential'}):
|
||||
self.assertEqual(resolve_token_with_source()[1], 'MODELHUB_XC_TOKEN')
|
||||
|
||||
|
||||
@@ -62,6 +62,48 @@ class TestTaskAddClient(unittest.TestCase):
|
||||
with self.assertRaises(ValueError):
|
||||
module.resolve_token()
|
||||
|
||||
def test_file_first_and_empty_external_override(self):
|
||||
with tempfile.TemporaryDirectory() as directory:
|
||||
path = Path(directory) / 'credential'
|
||||
path.write_text('file-secret-credential')
|
||||
for external in ('external-secret-credential', ''):
|
||||
with self.subTest(external_empty=not external), mock.patch.dict(os.environ, {
|
||||
'XC_TOKEN_FILE': str(path), 'XC_TOKEN': 'alias-secret-credential',
|
||||
'MODELHUB_XC_TOKEN': 'model-secret-credential',
|
||||
'EXTERNAL_SERVICE_TOKEN': external}, clear=True):
|
||||
self.assertEqual(module.resolve_token_with_source(),
|
||||
('file-secret-credential', 'XC_TOKEN_FILE'))
|
||||
|
||||
def test_alias_fallback_order(self):
|
||||
env = {'XC_TOKEN_FILE': '/nonexistent/credential', 'XC_TOKEN': 'alias-secret',
|
||||
'MODELHUB_XC_TOKEN': 'model-secret', 'EXTERNAL_SERVICE_TOKEN': 'external-secret'}
|
||||
with mock.patch.dict(os.environ, env, clear=True):
|
||||
for name in module.TOKEN_SOURCES[1:]:
|
||||
self.assertEqual(module.resolve_token_with_source()[1], name)
|
||||
os.environ[name] = ''
|
||||
with self.assertRaises(ValueError):
|
||||
module.resolve_token()
|
||||
|
||||
def test_probe_statuses_are_labels_only(self):
|
||||
with tempfile.TemporaryDirectory() as directory:
|
||||
path = Path(directory) / 'private-path'
|
||||
for contents, expected in (('file-secret-credential', 'ok'), (' ', 'empty'),
|
||||
('<private-rejected-secret>', 'rejected')):
|
||||
path.write_text(contents)
|
||||
with mock.patch.dict(os.environ, {'XC_TOKEN_FILE': str(path),
|
||||
'XC_TOKEN': 'alias-secret-credential',
|
||||
'MODELHUB_XC_TOKEN': '<model-private-secret>',
|
||||
'EXTERNAL_SERVICE_TOKEN': ' '}, clear=True):
|
||||
statuses = module.token_probe_status()
|
||||
self.assertEqual(statuses, dict(XC_TOKEN_FILE=expected, XC_TOKEN='ok',
|
||||
MODELHUB_XC_TOKEN='rejected', EXTERNAL_SERVICE_TOKEN='empty'))
|
||||
for secret in ('private', 'credential', 'alias-secret', 'model-private', str(path)):
|
||||
self.assertNotIn(secret, str(statuses))
|
||||
with mock.patch.dict(os.environ, {}, clear=True):
|
||||
self.assertEqual(set(module.token_probe_status().values()), {'absent'})
|
||||
with mock.patch.dict(os.environ, {'XC_TOKEN_FILE': str(path / 'missing')}, clear=True):
|
||||
self.assertEqual(module.token_probe_status()['XC_TOKEN_FILE'], 'rejected')
|
||||
|
||||
def test_placeholder_never_requests(self):
|
||||
with mock.patch('urllib.request.urlopen') as urlopen:
|
||||
with self.assertRaises(ValueError):
|
||||
|
||||
Reference in New Issue
Block a user