nomos-specs/mixnet/test_client.py

59 lines
2.0 KiB
Python
Raw Normal View History

2024-01-25 09:04:55 +00:00
import asyncio
2024-01-23 01:46:00 +00:00
from datetime import datetime
import numpy
2024-01-25 09:04:55 +00:00
from mixnet.client import mixclient_emitter
2024-02-05 06:47:36 +00:00
from mixnet.node import PacketQueue
2024-01-23 01:46:00 +00:00
from mixnet.packet import PacketBuilder
from mixnet.poisson import poisson_mean_interval_sec
2024-02-05 06:47:36 +00:00
from mixnet.test_mixnet import TestMixnet
2024-01-25 09:04:55 +00:00
from mixnet.test_utils import with_test_timeout
2024-02-05 06:47:36 +00:00
from mixnet.utils import random_bytes
2024-01-23 01:46:00 +00:00
2024-02-05 06:47:36 +00:00
class TestMixClient(TestMixnet):
2024-01-25 09:04:55 +00:00
@with_test_timeout(100)
async def test_mixclient_emitter(self):
2024-02-05 06:47:36 +00:00
mixnet, _ = self.init()
2024-01-25 09:04:55 +00:00
real_packet_queue: PacketQueue = asyncio.Queue()
outbound_socket: PacketQueue = asyncio.Queue()
2024-01-23 01:46:00 +00:00
emission_rate_per_min = 30
redundancy = 3
2024-01-25 09:04:55 +00:00
_ = asyncio.create_task(
mixclient_emitter(
mixnet,
emission_rate_per_min,
redundancy,
real_packet_queue,
outbound_socket,
)
2024-01-23 01:46:00 +00:00
)
# Create packets. At least two packets are expected to be generated from a 3500-byte msg
2024-02-05 06:47:36 +00:00
builder = PacketBuilder.real(random_bytes(3500), mixnet)
2024-01-23 01:46:00 +00:00
# Schedule two packets to the mix client without any interval
packet, route = builder.next()
2024-01-25 09:04:55 +00:00
await real_packet_queue.put((route[0].addr, packet))
2024-01-23 01:46:00 +00:00
packet, route = builder.next()
2024-01-25 09:04:55 +00:00
await real_packet_queue.put((route[0].addr, packet))
2024-01-23 01:46:00 +00:00
# Calculate intervals between packet emissions from the mix client
intervals = []
ts = datetime.now()
for _ in range(30):
2024-01-25 09:04:55 +00:00
_ = await outbound_socket.get()
2024-01-23 01:46:00 +00:00
now = datetime.now()
intervals.append((now - ts).total_seconds())
ts = now
# Check if packets were emitted at the Poisson emission_rate
# If emissions follow the Poisson distribution with a rate `lambda`,
# a mean interval between emissions must be `1/lambda`.
self.assertAlmostEqual(
float(numpy.mean(intervals)),
poisson_mean_interval_sec(emission_rate_per_min),
delta=1.0,
)