Spaces:
Sleeping
Sleeping
| from chromadb.config import Component, System, Settings | |
| from overrides import overrides | |
| from threading import local | |
| import random | |
| data = local() # use thread local just in case tests ever run in parallel | |
| def reset() -> None: | |
| global data | |
| data.starts = [] | |
| data.stops = [] | |
| data.inits = [] | |
| class ComponentA(Component): | |
| def __init__(self, system: System): | |
| data.inits += "A" | |
| super().__init__(system) | |
| self.require(ComponentB) | |
| self.require(ComponentC) | |
| def start(self) -> None: | |
| data.starts += "A" | |
| def stop(self) -> None: | |
| data.stops += "A" | |
| class ComponentB(Component): | |
| def __init__(self, system: System): | |
| data.inits += "B" | |
| super().__init__(system) | |
| self.require(ComponentC) | |
| self.require(ComponentD) | |
| def start(self) -> None: | |
| data.starts += "B" | |
| def stop(self) -> None: | |
| data.stops += "B" | |
| class ComponentC(Component): | |
| def __init__(self, system: System): | |
| data.inits += "C" | |
| super().__init__(system) | |
| self.require(ComponentD) | |
| def start(self) -> None: | |
| data.starts += "C" | |
| def stop(self) -> None: | |
| data.stops += "C" | |
| class ComponentD(Component): | |
| def __init__(self, system: System): | |
| data.inits += "D" | |
| super().__init__(system) | |
| def start(self) -> None: | |
| data.starts += "D" | |
| def stop(self) -> None: | |
| data.stops += "D" | |
| # Dependency Graph for tests: | |
| # βββββ | |
| # β A β | |
| # ββ¬ββ¬β | |
| # βββ½βββ | |
| # ββ B β | |
| # βββ¬ββ¬β | |
| # ββ½ββ½ββ | |
| # β C ββ | |
| # ββ¬ββββ | |
| # ββ½ββββ½β | |
| # β D β | |
| # βββββββ | |
| def test_leaf_only() -> None: | |
| settings = Settings() | |
| system = System(settings) | |
| reset() | |
| d = system.instance(ComponentD) | |
| assert isinstance(d, ComponentD) | |
| assert data.inits == ["D"] | |
| system.start() | |
| assert data.starts == ["D"] | |
| system.stop() | |
| assert data.stops == ["D"] | |
| def test_partial() -> None: | |
| settings = Settings() | |
| system = System(settings) | |
| reset() | |
| c = system.instance(ComponentC) | |
| assert isinstance(c, ComponentC) | |
| assert data.inits == ["C", "D"] | |
| system.start() | |
| assert data.starts == ["D", "C"] | |
| system.stop() | |
| assert data.stops == ["C", "D"] | |
| def test_system_startup() -> None: | |
| settings = Settings() | |
| system = System(settings) | |
| reset() | |
| a = system.instance(ComponentA) | |
| assert isinstance(a, ComponentA) | |
| assert data.inits == ["A", "B", "C", "D"] | |
| system.start() | |
| assert data.starts == ["D", "C", "B", "A"] | |
| system.stop() | |
| assert data.stops == ["A", "B", "C", "D"] | |
| def test_system_override_order() -> None: | |
| settings = Settings() | |
| system = System(settings) | |
| reset() | |
| system.instance(ComponentA) | |
| # Deterministically shuffle the instances map to prove that topsort is actually | |
| # working and not just implicitly working because of insertion order. | |
| # This causes the test to actually fail if the deps are not wired up correctly. | |
| random.seed(0) | |
| entries = list(system._instances.items()) | |
| random.shuffle(entries) | |
| system._instances = {k: v for k, v in entries} | |
| system.start() | |
| assert data.starts == ["D", "C", "B", "A"] | |
| system.stop() | |
| assert data.stops == ["A", "B", "C", "D"] | |
| class ComponentZ(Component): | |
| def __init__(self, system: System): | |
| super().__init__(system) | |
| self.require(ComponentC) | |
| def start(self) -> None: | |
| pass | |
| def stop(self) -> None: | |
| pass | |
| def test_runtime_dependencies() -> None: | |
| settings = Settings() | |
| system = System(settings) | |
| reset() | |
| # Nothing to do, no components were requested prior to start | |
| system.start() | |
| assert data.starts == [] | |
| # Constructs dependencies and starts them in the correct order | |
| ComponentZ(system) | |
| assert data.starts == ["D", "C"] | |
| system.stop() | |
| assert data.stops == ["C", "D"] | |