updates to service dependency resolution to allow for multithreaded startup, also improved tests to validate service boot ordering for expected outcomes
This commit is contained in:
parent
f687115522
commit
05247524d7
2 changed files with 121 additions and 31 deletions
|
@ -220,7 +220,7 @@ class TestServices:
|
|||
assert default_service == my_service
|
||||
assert custom_service and custom_service != my_service
|
||||
|
||||
def test_services_dependencies(self):
|
||||
def test_services_dependency(self):
|
||||
# given
|
||||
service_a = CoreService()
|
||||
service_a.name = "a"
|
||||
|
@ -238,20 +238,34 @@ class TestServices:
|
|||
service_d.dependencies = ()
|
||||
service_e.dependencies = ()
|
||||
services = [service_a, service_b, service_c, service_d, service_e]
|
||||
expected1 = {service_a.name, service_b.name, service_c.name, service_d.name}
|
||||
expected2 = [service_e]
|
||||
|
||||
# when
|
||||
results = []
|
||||
permutations = itertools.permutations(services)
|
||||
for permutation in permutations:
|
||||
permutation = list(permutation)
|
||||
result = ServiceDependencies(permutation).boot_order()
|
||||
results.append(result)
|
||||
results = ServiceDependencies(permutation).boot_order()
|
||||
# then
|
||||
for result in results:
|
||||
result_set = {x.name for x in result}
|
||||
if len(result) == 4:
|
||||
a_index = result.index(service_a)
|
||||
b_index = result.index(service_b)
|
||||
c_index = result.index(service_c)
|
||||
d_index = result.index(service_d)
|
||||
assert b_index < a_index
|
||||
assert b_index < c_index
|
||||
assert d_index < c_index
|
||||
assert result_set == expected1
|
||||
elif len(result) == 1:
|
||||
assert expected2 == result
|
||||
else:
|
||||
raise ValueError(
|
||||
f"unexpected result: {results}, perm({permutation})"
|
||||
)
|
||||
|
||||
# then
|
||||
for result in results:
|
||||
assert len(result) == len(services)
|
||||
|
||||
def test_services_missing_dependency(self):
|
||||
def test_services_dependency_missing(self):
|
||||
# given
|
||||
service_a = CoreService()
|
||||
service_a.name = "a"
|
||||
|
@ -271,7 +285,7 @@ class TestServices:
|
|||
with pytest.raises(ValueError):
|
||||
ServiceDependencies(permutation).boot_order()
|
||||
|
||||
def test_services_dependencies_cycle(self):
|
||||
def test_services_dependency_cycle(self):
|
||||
# given
|
||||
service_a = CoreService()
|
||||
service_a.name = "a"
|
||||
|
@ -291,7 +305,7 @@ class TestServices:
|
|||
with pytest.raises(ValueError):
|
||||
ServiceDependencies(permutation).boot_order()
|
||||
|
||||
def test_services_common_dependency(self):
|
||||
def test_services_dependency_common(self):
|
||||
# given
|
||||
service_a = CoreService()
|
||||
service_a.name = "a"
|
||||
|
@ -299,18 +313,64 @@ class TestServices:
|
|||
service_b.name = "b"
|
||||
service_c = CoreService()
|
||||
service_c.name = "c"
|
||||
service_b.dependencies = (service_a.name,)
|
||||
service_c.dependencies = (service_a.name, service_b.name)
|
||||
services = [service_a, service_b, service_c]
|
||||
service_d = CoreService()
|
||||
service_d.name = "d"
|
||||
service_a.dependencies = (service_b.name,)
|
||||
service_c.dependencies = (service_d.name, service_b.name)
|
||||
services = [service_a, service_b, service_c, service_d]
|
||||
expected = {service_a.name, service_b.name, service_c.name, service_d.name}
|
||||
|
||||
# when
|
||||
results = []
|
||||
permutations = itertools.permutations(services)
|
||||
for permutation in permutations:
|
||||
permutation = list(permutation)
|
||||
result = ServiceDependencies(permutation).boot_order()
|
||||
results.append(result)
|
||||
results = ServiceDependencies(permutation).boot_order()
|
||||
|
||||
# then
|
||||
for result in results:
|
||||
assert result == [service_a, service_b, service_c]
|
||||
# then
|
||||
for result in results:
|
||||
assert len(result) == 4
|
||||
result_set = {x.name for x in result}
|
||||
a_index = result.index(service_a)
|
||||
b_index = result.index(service_b)
|
||||
c_index = result.index(service_c)
|
||||
d_index = result.index(service_d)
|
||||
assert b_index < a_index
|
||||
assert d_index < c_index
|
||||
assert b_index < c_index
|
||||
assert expected == result_set
|
||||
|
||||
def test_services_dependency_common2(self):
|
||||
# given
|
||||
service_a = CoreService()
|
||||
service_a.name = "a"
|
||||
service_b = CoreService()
|
||||
service_b.name = "b"
|
||||
service_c = CoreService()
|
||||
service_c.name = "c"
|
||||
service_d = CoreService()
|
||||
service_d.name = "d"
|
||||
service_a.dependencies = (service_b.name,)
|
||||
service_b.dependencies = (service_c.name, service_d.name)
|
||||
service_c.dependencies = (service_d.name,)
|
||||
services = [service_a, service_b, service_c, service_d]
|
||||
expected = {service_a.name, service_b.name, service_c.name, service_d.name}
|
||||
|
||||
# when
|
||||
permutations = itertools.permutations(services)
|
||||
for permutation in permutations:
|
||||
permutation = list(permutation)
|
||||
results = ServiceDependencies(permutation).boot_order()
|
||||
|
||||
# then
|
||||
for result in results:
|
||||
assert len(result) == 4
|
||||
result_set = {x.name for x in result}
|
||||
a_index = result.index(service_a)
|
||||
b_index = result.index(service_b)
|
||||
c_index = result.index(service_c)
|
||||
d_index = result.index(service_d)
|
||||
assert b_index < a_index
|
||||
assert c_index < b_index
|
||||
assert d_index < b_index
|
||||
assert d_index < c_index
|
||||
assert expected == result_set
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue