К содержимому
BlueTraktor

Инструменты и локальные тесты

Создание проекта, проверка окружения, preview, inspection и синтетический TestHost.

Создание проекта

Выполняйте new из неизмененного распакованного SDK. Он проверяет хеши файлов, копирует только перечисленные публичные исходники и меняет ID в manifest и Rust. Существующий каталог не перезаписывается. Имя crate и binary остается community-starter; имя BTP определяется вашим plugin ID.

PROJECT-PROVENANCE.json отмечает производный проект. SOURCE-MANIFEST.json фиксирует его исходное состояние, а не подпись издателя. После ваших правок он не является хешем текущих исходников. Для следующего нового плагина снова используйте чистый SDK.

bash
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. Существующий файл не перезаписывается; сложную форму проверяйте в изолированной установке.

bash
python3 btp.py preview settings-preview.html

Осмотр BTP без запуска

inspect читает ограниченный snapshot файла, ограничивает распаковку по времени, окну zstd и размеру, проверяет четыре уникальных regular-файла, базовую идентичность, платформу, статический ELF и ограниченные JSON-объекты схем. Печатает SHA-256. Символические ссылки, traversal, дубли и лишние файлы отклоняются.

trustVerified: false означает, что доверие НЕ проверено. Это структурный помощник для ordinary BTP, не полная валидация контракта, лицензии или подписи. Политику и схему проверяет целевой Manager. Подписанные официальные пакеты с дополнительными файлами проверяйте там.

bash
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.

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 или производственные данные.

rust
#[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.
bash
cargo test --workspace --locked
python3 -m unittest test_build.py test_btp.py