Spaces:
Running
Running
| import asyncio | |
| import sys | |
| import time | |
| import types | |
| import unittest | |
| from enum import IntEnum | |
| from pathlib import Path | |
| from pydantic import ValidationError | |
| BACKEND_ROOT = Path(__file__).resolve().parents[1] | |
| sys.path.insert(0, str(BACKEND_ROOT)) | |
| def _install_import_stubs() -> None: | |
| auth_guard = types.ModuleType("api.auth_guard") | |
| class AuthRole(IntEnum): | |
| MACHINE = 1 | |
| auth_guard.AuthRole = AuthRole | |
| auth_guard.require_role = lambda _role: (lambda: None) | |
| sys.modules["api.auth_guard"] = auth_guard | |
| health_module = types.ModuleType("api.health_manager") | |
| class HealthyManager: | |
| async def is_healthy(self, _worker_id: str) -> bool: | |
| return True | |
| health_module.health_manager = HealthyManager() | |
| sys.modules["api.health_manager"] = health_module | |
| _install_import_stubs() | |
| from api.marketplace import WORKERS_REGISTRY, WorkerCapability | |
| from api.resolver import CapabilityResolver, ResolverConstraints | |
| class CapabilityResolverTests(unittest.IsolatedAsyncioTestCase): | |
| def setUp(self): | |
| self._original_registry = dict(WORKERS_REGISTRY) | |
| WORKERS_REGISTRY.clear() | |
| def tearDown(self): | |
| WORKERS_REGISTRY.clear() | |
| WORKERS_REGISTRY.update(self._original_registry) | |
| def register_worker(self, **overrides) -> WorkerCapability: | |
| values = { | |
| "id": "worker", | |
| "name": "Worker", | |
| "version": "1.0.0", | |
| "last_seen": int(time.time()), | |
| "capabilities": ["vision"], | |
| "cost": 1.0, | |
| "latency": 100.0, | |
| "region": "global", | |
| "gpu": False, | |
| "priority": 10, | |
| } | |
| values.update(overrides) | |
| worker = WorkerCapability(**values) | |
| WORKERS_REGISTRY[worker.id] = worker | |
| return worker | |
| async def test_uses_semver_not_lexicographic_ordering(self): | |
| self.register_worker(id="v2", version="2.0.0", priority=20) | |
| self.register_worker(id="v10", version="10.0.0", priority=10) | |
| worker = await CapabilityResolver.resolve( | |
| "vision", | |
| ResolverConstraints(min_version="2.0.0"), | |
| ) | |
| self.assertIsNotNone(worker) | |
| self.assertEqual(worker.id, "v10") | |
| async def test_excludes_prerelease_below_stable_minimum(self): | |
| self.register_worker(id="candidate", version="2.0.0-rc.1", priority=1) | |
| self.register_worker(id="stable", version="2.0.0", priority=10) | |
| worker = await CapabilityResolver.resolve( | |
| "vision", | |
| ResolverConstraints(min_version="2.0.0"), | |
| ) | |
| self.assertIsNotNone(worker) | |
| self.assertEqual(worker.id, "stable") | |
| def test_rejects_malformed_minimum_semver(self): | |
| with self.assertRaises(ValidationError): | |
| ResolverConstraints(min_version="2.0") | |
| async def test_excludes_malformed_worker_version_only_when_constrained(self): | |
| self.register_worker(id="malformed", version="not-a-version", priority=1) | |
| self.register_worker(id="valid", version="2.0.0", priority=10) | |
| worker = await CapabilityResolver.resolve( | |
| "vision", | |
| ResolverConstraints(min_version="2.0.0"), | |
| ) | |
| self.assertIsNotNone(worker) | |
| self.assertEqual(worker.id, "valid") | |
| async def test_prefers_requested_region_when_available(self): | |
| self.register_worker(id="global", region="global", priority=1) | |
| self.register_worker(id="eu", region="eu-west", priority=20) | |
| worker = await CapabilityResolver.resolve( | |
| "vision", | |
| ResolverConstraints(preferred_region="eu-west"), | |
| ) | |
| self.assertIsNotNone(worker) | |
| self.assertEqual(worker.id, "eu") | |
| async def test_falls_back_when_requested_region_is_unavailable(self): | |
| self.register_worker(id="global", region="global", priority=1) | |
| worker = await CapabilityResolver.resolve( | |
| "vision", | |
| ResolverConstraints(preferred_region="eu-west"), | |
| ) | |
| self.assertIsNotNone(worker) | |
| self.assertEqual(worker.id, "global") | |
| async def test_applies_priority_threshold_with_lower_values_preferred(self): | |
| self.register_worker(id="allowed", priority=100, cost=10.0) | |
| self.register_worker(id="excluded", priority=101, cost=0.0) | |
| worker = await CapabilityResolver.resolve( | |
| "vision", | |
| ResolverConstraints(min_priority=100), | |
| ) | |
| self.assertIsNotNone(worker) | |
| self.assertEqual(worker.id, "allowed") | |
| async def test_preserves_existing_cost_latency_and_gpu_constraints(self): | |
| self.register_worker( | |
| id="cpu", | |
| cost=1.0, | |
| latency=50.0, | |
| gpu=False, | |
| priority=1, | |
| ) | |
| self.register_worker( | |
| id="gpu", | |
| cost=2.0, | |
| latency=100.0, | |
| gpu=True, | |
| priority=10, | |
| ) | |
| worker = await CapabilityResolver.resolve( | |
| "vision", | |
| ResolverConstraints( | |
| max_cost=2.0, | |
| max_latency=100.0, | |
| require_gpu=True, | |
| ), | |
| ) | |
| self.assertIsNotNone(worker) | |
| self.assertEqual(worker.id, "gpu") | |
| if __name__ == "__main__": | |
| unittest.main() | |