98 lines
2.6 KiB
Python
Raw Normal View History

2024-10-30 20:22:09 -03:00
from dataclasses import dataclass
from pathlib import Path
2024-11-01 18:07:08 -03:00
from typing import Optional, List, Tuple, Union, Sequence
2024-10-30 20:22:09 -03:00
2024-11-01 18:07:08 -03:00
from benchmarks.core.network import FileSharingNetwork, Node
2024-10-30 20:22:09 -03:00
from benchmarks.core.utils import Sampler
from benchmarks.experiments.static_experiment import StaticDisseminationExperiment
@dataclass
class MockHandle:
path: Path
2024-11-01 18:07:08 -03:00
name: str
2024-10-30 20:22:09 -03:00
def mock_sampler(elements: List[int]) -> Sampler:
return lambda _: iter(elements)
2024-11-01 18:07:08 -03:00
class MockNode(Node[MockHandle, str]):
2024-10-30 20:22:09 -03:00
2024-11-01 18:07:08 -03:00
def __init__(self) -> None:
self.seeding: Optional[Tuple[MockHandle, Path]] = None
2024-10-30 20:22:09 -03:00
self.leeching: Optional[MockHandle] = None
2024-11-01 18:07:08 -03:00
def seed(
self,
file: Path,
handle: Union[str, MockHandle]
) -> MockHandle:
if isinstance(handle, MockHandle):
self.seeding = (handle, file)
else:
self.seeding = (MockHandle(name=handle, path=file), file)
return self.seeding[0]
2024-10-30 20:22:09 -03:00
def leech(self, handle: MockHandle):
self.leeching = handle
2024-11-01 18:07:08 -03:00
class MockFileSharingNetwork(FileSharingNetwork[MockHandle, str]):
2024-10-30 20:22:09 -03:00
2024-11-01 18:07:08 -03:00
def __init__(self, n: int) -> None:
2024-10-30 20:22:09 -03:00
self._nodes = [MockNode() for _ in range(n)]
@property
2024-11-01 18:07:08 -03:00
def nodes(self) -> Sequence[Node[MockHandle, str]]:
2024-10-30 20:22:09 -03:00
return self._nodes
def test_should_place_seeders():
network = MockFileSharingNetwork(n=13)
file = Path('/path/to/data')
seeder_indexes = [9, 6, 3]
experiment = StaticDisseminationExperiment(
seeders=3,
sampler=mock_sampler(seeder_indexes),
network=network,
2024-11-01 18:07:08 -03:00
generator=lambda: ('data', Path('/path/to/data')),
2024-10-30 20:22:09 -03:00
)
experiment.run()
actual_seeders = set()
for index, node in enumerate(network.nodes):
if node.seeding is not None:
actual_seeders.add(index)
2024-11-01 18:07:08 -03:00
assert node.seeding[0] == MockHandle(name='data', path=file)
2024-10-30 20:22:09 -03:00
assert actual_seeders == set(seeder_indexes)
def test_should_place_leechers():
network = MockFileSharingNetwork(n=13)
file = Path('/path/to/data')
seeder_indexes = [9, 6, 3]
experiment = StaticDisseminationExperiment(
seeders=3,
sampler=mock_sampler(seeder_indexes),
network=network,
2024-11-01 18:07:08 -03:00
generator=lambda: ('data', Path('/path/to/data')),
2024-10-30 20:22:09 -03:00
)
experiment.run()
actual_leechers = set()
for index, node in enumerate(network.nodes):
if node.leeching is not None:
assert node.leeching.path == file
2024-11-01 18:07:08 -03:00
assert node.leeching.name == 'data'
2024-10-30 20:22:09 -03:00
assert node.seeding is None
actual_leechers.add(index)
assert actual_leechers == set(range(13)) - set(seeder_indexes)