Как я делал тестовое задание по работе с TTY
Недавно выполнил тестовое задание на позицию C/C++ разработчика (прошивки) — реализовал компактный AT‑сервер для Linux, который слушает tty и отвечает на AT‑команды.
Задача была простой по описанию, но интересной по содержанию: словарь ожиданий хранится в простом файле (CSV или формат expect=answer), синтаксис шаблонов ограничен — точка “.” соответствует одному символу, “*” — ноль или любое количество символов. Ключевое требование: нельзя использовать библиотеку регулярных выражений.
Реализация оказалась хорошим упражнением в чистом C++ и низкоуровневой работе с POSIX: пришлось настраивать “termios” для работы с tty в raw‑режиме, корректно обрабатывать CR/LF и управлять таймаутами чтения. Самый интересный вызов — написать собственный движок сопоставления шаблонов: - “\.” — одиночный символ; - “*” — ноль или более любых символов.
Чтобы избежать экспоненциального поведения, сделал рекурсивный матчинг с мемоизацией и аккуратной обработкой жадности. Основные трудности: перекрывающиеся шаблоны (когда несколько ожиданий подходят), случаи с пустыми строками, и корректная обработка ECHO (команда “ATE0/1”) и ответа на “AT+CPIN” с параметрами.
Тестирование тоже потребовало внимания: в тестах использовал псевдо‑tty (pty) и вспомогательные классы для временных TTY, чтобы имитировать реальное устройство без физического модема. Пара проблем, с которыми сталкивался: буферизация/задержки ввода, гонки между чтением и обработкой, и нечёткие граничные случаи с переводами строк — все это хорошо воспроизводится только при интеграционных тестах.
Сборка и тесты — через CMake/CTest, добавил набор юнит‑тестов для “PatternMatcher”, “ConfigParser” и симуляции tty. Это помогло быстро локализовать ошибки в логике матчера и в управлении терминалом.
Что вынес из задачи: работа с низкоуровневым POSIX‑API и написание собственного простого парсер‑движка даёт глубокое понимание, как обрабатываются реальные AT‑команды в прошивке; тесты с эмуляцией TTY — необходимы для надёжности; а простая, удобная конфигурация в формате expect=answer делает проект легко расширяемым.
ссылка на сам проект: https://github.com/semens901/AT-Server