См. также архитектуру фейков в контексте reactor: NET_REACTOR.md.
- Красный — пишем unit-тесты на русском (
TEST_CASE/SECTION) с фейками ОС/сети; тест падает. - Зелёный — минимальная реализация в
include/netlib/. - Рефакторинг — без изменения поведения, пока тесты зелёные.
Новая фича без unit-тестов на фейках не мержится. Интеграция с реальным epoll/сокетами — отдельный слой, после unit.
┌─────────────────────┐
│ integration (мало) │ реальный epoll, loopback TCP
├─────────────────────┤
│ unit (много) │ fake_socket + fake_reactor
└─────────────────────┘
| Слой | Где | Зависимости |
|---|---|---|
| Unit | tests/unit/** |
tests/fakes/**, без sys/epoll.h в сценариях |
| Integration | tests/integration/** |
netlib::netlib, Linux/POSIX |
Имитирует сокеты: fd, буферы RX/TX, пары «клиент↔сервер», connect / EAGAIN, EOF.
Тесты управляют данными явно:
fake.push_rx(client_fd, "hello");
fake.trigger_readable(client_fd);Имитирует epoll: регистрация readable/writable, trigger(fd, event), poll_once.
Связан с fake_socket_backend: при try_send данные попадают к peer и планируется readable.
- Живут только в
tests/fakes/; не вinclude/netlib/. - Прод-код зависит от абстракций
socket_backend,reactor_backend. - Юниты не включают
posix_socket.hpp/epollнапрямую.
// event_loop: reactor подставляется (по умолчанию epoll)
event_loop loop{sched, std::make_unique<detail::epoll_reactor>()};
// tcp_socket / tcp_acceptor: socket_backend&
tcp_socket sock{fake_sockets};Для тестов — test_context: thread_pool + scheduler + event_loop на фейках.
tests/
├── fakes/ # fake_reactor, fake_socket_backend, test_context
├── unit/ # один файл ≈ одна фича, много сценариев
│ └── net/
└── integration/ # бывшие tcp_echo, eventfd, …
Формат: "<тип> <действие> <условие>".
Примеры:
"async_read_some возвращает данные если они уже в буфере""async_read_some вызывает on_eof при нулевом чтении""async_connect завершается при trigger writable и SO_ERROR=0"
Чем больше граничных сценариев на фичу — тем лучше.
netlib_unit_tests— только unit + fakes.netlib_integration_tests— POSIX/Linux интеграция.NETLIB_BUILD_TESTSвключает оба.
- Unit-тесты написаны до или вместе с кодом, падают без реализации
- Сценарии: успех, ошибка, пустой/граничный ввод, отмена/закрытие
- Фейки, без реальной сети в unit
- Интеграционный тест (если затронут I/O), помечен
integration -
ctest/ CI зелёный
См. ARCHITECTURE.md, ROADMAP.md.