package com.ruoyi.device.bts;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertTrue;
import java.time.Duration;
import java.util.Set;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import org.junit.jupiter.api.Test;
class BtsTcpTransportTest
{
@Test
void framesRequestsAndSerializesConcurrentExchanges() throws Exception
{
try (ScriptedBtsTcpSimulator simulator = new ScriptedBtsTcpSimulator();
BtsTcpTransport transport = new BtsTcpTransport("127.0.0.1", simulator.port(), Duration.ofSeconds(1), Duration.ofSeconds(2)))
{
ExecutorService callers = Executors.newFixedThreadPool(2);
try
{
simulator.enqueue("first_resp");
simulator.enqueue("second_resp");
Callable first = () -> transport.exchange("first");
Callable second = () -> transport.exchange("second");
Future firstResult = callers.submit(first);
Future secondResult = callers.submit(second);
Set responses = Set.of(firstResult.get(), secondResult.get());
assertEquals(Set.of("first_resp", "second_resp"), responses);
assertEquals(2, simulator.requests().size());
assertTrue(simulator.requests().stream().allMatch(request -> request.startsWith("")));
}
finally
{
callers.shutdownNow();
}
}
}
}