Инструменты и локальные тесты
Создание проекта, проверка окружения, preview, inspection и синтетический TestHost.
Создание проекта
Выполняйте new из неизмененного распакованного SDK. Он проверяет хеши файлов, копирует только перечисленные публичные исходники и меняет ID в manifest и Rust. Существующий каталог не перезаписывается. Имя crate и binary остается community-starter; имя BTP определяется вашим plugin ID.
PROJECT-PROVENANCE.json отмечает производный проект. SOURCE-MANIFEST.json фиксирует его исходное состояние, а не подпись издателя. После ваших правок он не является хешем текущих исходников. Для следующего нового плагина снова используйте чистый SDK.
python3 btp.py new ../temperature-plugin --id io.example.temperature
cd ../temperature-plugin
python3 btp.py doctorПроверка окружения
doctor показывает найденные cargo, rustc, rustup, zstd, cross и cargo-zigbuild, версию Rust, поля config и известные платформы. Он ничего не устанавливает и не доказывает наличие рабочего linker, Docker, Rust target или совместимого сервера.
Предпросмотр настроек
Откройте полученный локальный HTML. Это статический макет config.schema.json без сети и скриптов: defaults, числовые границы, boolean, enum и массивы. Он не исполняет UI schema, не подгружает серверы и не заменяет форму BlueTraktor. Существующий файл не перезаписывается; сложную форму проверяйте в изолированной установке.
python3 btp.py preview settings-preview.htmlОсмотр BTP без запуска
inspect читает ограниченный snapshot файла, ограничивает распаковку по времени, окну zstd и размеру, проверяет четыре уникальных regular-файла, базовую идентичность, платформу, статический ELF и ограниченные JSON-объекты схем. Печатает SHA-256. Символические ссылки, traversal, дубли и лишние файлы отклоняются.
trustVerified: false означает, что доверие НЕ проверено. Это структурный помощник для ordinary BTP, не полная валидация контракта, лицензии или подписи. Политику и схему проверяет целевой Manager. Подписанные официальные пакеты с дополнительными файлами проверяйте там.
python3 btp.py inspect dist/io.example.temperature-0.1.0-linux-aarch64-debian.btpЛокальный тестовый хост
TestHost работает внутри тестового процесса. Он не запускает BTP, не даёт sandbox и не имитирует проверку grants: ответы задаёт сам тест. Такие тесты запускаются локально либо заданием «Тесты» в студии. Удалённая сборочная среда студии не является настоящей установкой BlueTraktor с оборудованием. Включите test-host только в dev-dependencies starter/Cargo.toml.
[dev-dependencies]
bluetraktor-plugin-sdk = { path = "../crates/bluetraktor-plugin-sdk", features = ["test-host"] }
tokio = { version = "1", features = ["macros", "rt", "test-util"] }Проверяем настоящий PluginClient
json отвечает на разовое чтение; accepted(true/false) на публикацию; subscription передает событие; error задает безопасный код ошибки. Через operation проверяйте точный путь и payload. Удаление TestRequest без ответа имитирует потерянный ответ. host.stop прерывает ожидающие запросы и запрещает новые. Не передавайте реальные credentials или производственные данные.
#[tokio::test]
async fn numeric_string() {
use bluetraktor_plugin_sdk::testing::{TestHost, TestOperation};
let mut host = TestHost::new();
let client = host.client.clone();
let (result, _) = tokio::join!(
client.resolve_usepi("source", vec!["value".into()]),
async {
let request = host.next().await.unwrap();
assert!(matches!(&request.operation,
TestOperation::ResolveUsepi(r) if r.server_id == "source"
&& r.path == ["value"]));
request.json(&"42.5");
}
);
assert_eq!(result.unwrap(), br#""42.5""#);
}Проверки перед выпуском
- JSON number и numeric string, неверный тип, ноль, границы payload, overflow и неверный config.
- Snapshot отсутствующего листа, Update, неверный epoch/revision, Reset, Lagged, Cancelled.
- Переполнение очереди, задержка ответа, остановка во время ожидания и отказ доступа.
- Не повторять автоматически MQTT после неопределенного таймаута: операция могла выполниться.
- macOS проверяет переносимую логику. Linux отдельно проверяет socket transport; isolated systemd-стенд нужен для реального sandbox, quotas и start/stop/restart.
cargo test --workspace --locked
python3 -m unittest test_build.py test_btp.py