Перейти к основному содержимому
Нормативная версия документации - английская

Эта страница переведена с английского языковой моделью. При любом расхождении верен английский оригинал.

Внутри процесса

С фичей testing подключённый брокер может работать с файлом потока или каналом в памяти, и тестовая обвязка запускает на нём рабочее приложение без изменений.

Один подключённый брокер, два транспорта: клиент через connect, файл или канал в памяти через connect_in_processConnectedFileBrokerConnectedStdioBrokerКлиент: файл .ssили каналыпроцессаФайл или каналв памятиОбвязка считаетдоставки в работедля settle()Только вживую: байтыфайла .ss, маяки,перезапуск, два брокерана одном файле, строкибез ключа, завершениеработы всего процессаВ памяти: журнал наключ с номера один,конец, воспроизведение,перемотки и отказы,метка конца, loopback,конвертБез фичи testing связь - это только клиент:тот же размер и никакой второй ветви
Схема текстом
  1. ConnectedFileBroker ConnectedStdioBroker → Клиент: файл .ss или каналы процесса: connect
  2. ConnectedFileBroker ConnectedStdioBroker → Файл или канал в памяти: connect_in_process
  3. Файл или канал в памяти → Обвязка считает доставки в работе для settle()
  4. Только вживую: байты файла .ss, маяки, перезапуск, два брокера на одном файле, строки без ключа, завершение работы всего процесса
  5. В памяти: журнал на ключ с номера один, конец, воспроизведение, перемотки и отказы, метка конца, loopback, конверт
  6. Без фичи testing связь - это только клиент: тот же размер и никакой второй ветви

TestApp::start подключает каждый брокер через connect_in_process вместо connect. Подключённый брокер, его подписки, издатели и доставки - те же типы, а транспорт в памяти у каждого из них - собственный вариант. Поэтому дескрипторы сервиса, политики публикации и обработчики с перемоткой работают без изменений.

Внутрипроцессный транспорт читает настройки рабочего брокера, и своих настроек у него нет. Сообщение проходит через те же шаги, что и настоящее: проверку ключа потока, конверт и отказ от пустой строки в канале. Поэтому он отвергает то же, что отвергают файл потока и канал.

Файл в памяти хранит журнал на каждый ключ потока с нумерацией от единицы. Живая подписка начинает с конца журнала, воспроизведение читает журнал и завершается на его конце, а перемотка разрешается по журналу с теми же отказами, что и на файле. Все клоны брокера делят один файл, а новый брокер начинает с пустого. Канал в памяти принимает то, что подаёт тест, как строки стандартного ввода, и записывает то, что пишет сервис. Строка возвращается к собственным подпискам сервиса только при loopback.

Обвязка считает доставки в работе на каждом транспорте, поэтому tb.settle() возвращается, когда каждая подписка обработала всё, что до неё дошло. То, что относится к настоящему транспорту, проверяется вживую: на файле потока во временном каталоге или со ступенью, запущенной дочерним процессом.

Без фичи testing у связи один вариант. Компилятор проверяет, что её размер в точности равен размеру дескрипторов клиента, которые она оборачивает. Поэтому в рабочей сборке нет ни второго транспорта, ни ветви к нему.