From b4fc72141725c48df3b74423ed5e2c629b206ff5 Mon Sep 17 00:00:00 2001 From: Chip Reed Date: Wed, 5 Jun 2024 06:49:51 +0200 Subject: [PATCH] test that calls without __TAURI_INVOKE_KEY__ fail --- Cargo.lock | 9 +++++ Cargo.toml | 3 +- core/tauri/src/window.rs | 6 ++-- core/tests/invoke-key/Cargo.toml | 15 +++++++++ core/tests/invoke-key/build.rs | 7 ++++ core/tests/invoke-key/index.html | 7 ++++ core/tests/invoke-key/src/main.rs | 24 ++++++++++++++ core/tests/invoke-key/src/subscriber.rs | 44 +++++++++++++++++++++++++ core/tests/invoke-key/tauri.conf.json | 10 ++++++ 9 files changed, 122 insertions(+), 3 deletions(-) create mode 100644 core/tests/invoke-key/Cargo.toml create mode 100644 core/tests/invoke-key/build.rs create mode 100644 core/tests/invoke-key/index.html create mode 100644 core/tests/invoke-key/src/main.rs create mode 100644 core/tests/invoke-key/src/subscriber.rs create mode 100644 core/tests/invoke-key/tauri.conf.json diff --git a/Cargo.lock b/Cargo.lock index 09348f33f..b67e83611 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1921,6 +1921,15 @@ dependencies = [ "cfg-if", ] +[[package]] +name = "invoke-key" +version = "0.1.0" +dependencies = [ + "tauri", + "tauri-build", + "tracing", +] + [[package]] name = "io-lifetimes" version = "1.0.11" diff --git a/Cargo.toml b/Cargo.toml index 7fbfc17fe..0a7d2497c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -13,7 +13,8 @@ members = [ # integration tests "core/tests/restart", "core/tests/app-updater", - "core/tests/uninitialized-ipc" + "core/tests/uninitialized-ipc", + "core/tests/invoke-key" ] exclude = [ diff --git a/core/tauri/src/window.rs b/core/tauri/src/window.rs index 87888b93e..121d9c459 100644 --- a/core/tauri/src/window.rs +++ b/core/tauri/src/window.rs @@ -1569,11 +1569,13 @@ impl Window { return Err(Error::InvokeKey); } None => { + let error = "received ipc message without a __TAURI_INVOKE_KEY__"; + #[cfg(feature = "tracing")] - tracing::error!("received ipc message without a __TAURI_INVOKE_KEY__"); + tracing::error!(error); #[cfg(not(feature = "tracing"))] - eprintln!("received ipc message without a __TAURI_INVOKE_KEY__"); + eprintln!(error); return Err(Error::InvokeKey); } diff --git a/core/tests/invoke-key/Cargo.toml b/core/tests/invoke-key/Cargo.toml new file mode 100644 index 000000000..02fa0c225 --- /dev/null +++ b/core/tests/invoke-key/Cargo.toml @@ -0,0 +1,15 @@ +[package] +name = "invoke-key" +version = "0.1.0" +edition = "2021" + +[build-dependencies] +tauri-build = { path = "../../tauri-build", features = [] } + +[dependencies] +tauri = { path = "../../tauri", features = ["tracing"] } +tracing = "0.1" + +[features] +default = ["custom-protocol"] +custom-protocol = ["tauri/custom-protocol"] diff --git a/core/tests/invoke-key/build.rs b/core/tests/invoke-key/build.rs new file mode 100644 index 000000000..b055ec37c --- /dev/null +++ b/core/tests/invoke-key/build.rs @@ -0,0 +1,7 @@ +// Copyright 2019-2023 Tauri Programme within The Commons Conservancy +// SPDX-License-Identifier: Apache-2.0 +// SPDX-License-Identifier: MIT + +fn main() { + tauri_build::build() +} diff --git a/core/tests/invoke-key/index.html b/core/tests/invoke-key/index.html new file mode 100644 index 000000000..edb8928c8 --- /dev/null +++ b/core/tests/invoke-key/index.html @@ -0,0 +1,7 @@ + diff --git a/core/tests/invoke-key/src/main.rs b/core/tests/invoke-key/src/main.rs new file mode 100644 index 000000000..df8605c64 --- /dev/null +++ b/core/tests/invoke-key/src/main.rs @@ -0,0 +1,24 @@ +// Copyright 2019-2024 Tauri Programme within The Commons Conservancy +// SPDX-License-Identifier: Apache-2.0 +// SPDX-License-Identifier: MIT + +#![cfg_attr(not(debug_assertions), windows_subsystem = "windows")] + +use tauri::{command, generate_context, generate_handler, Builder}; + +mod subscriber; + +#[command] +fn error_if_called() { + std::process::exit(1) +} + +fn main() { + tracing::subscriber::set_global_default(subscriber::InvokeKeyErrorSubscriber) + .expect("unable to set tracing global subscriber"); + + Builder::default() + .invoke_handler(generate_handler![error_if_called]) + .run(generate_context!()) + .expect("error while running tauri application"); +} diff --git a/core/tests/invoke-key/src/subscriber.rs b/core/tests/invoke-key/src/subscriber.rs new file mode 100644 index 000000000..58e69f400 --- /dev/null +++ b/core/tests/invoke-key/src/subscriber.rs @@ -0,0 +1,44 @@ +use std::fmt::Debug; + +use tracing::{ + field::{Field, Visit}, + span::{Attributes, Record}, + Event, Id, Level, Metadata, Subscriber, +}; + +pub struct InvokeKeyErrorSubscriber; + +impl Subscriber for InvokeKeyErrorSubscriber { + fn enabled(&self, metadata: &Metadata<'_>) -> bool { + metadata.is_event() && *metadata.level() == Level::ERROR + } + + fn new_span(&self, _: &Attributes<'_>) -> Id { + // shouldn't be called because we only enable events + unimplemented!() + } + + fn record(&self, _: &Id, _: &Record<'_>) {} + + fn record_follows_from(&self, _: &Id, _: &Id) {} + + fn event(&self, event: &Event<'_>) { + event.record(&mut InvokeKeyExitVisit) + } + + fn enter(&self, _: &Id) {} + + fn exit(&self, _: &Id) {} +} + +struct InvokeKeyExitVisit; + +impl Visit for InvokeKeyExitVisit { + fn record_str(&mut self, field: &Field, value: &str) { + if field.name() == "error" && value == "received ipc message without a __TAURI_INVOKE_KEY__" { + std::process::exit(0) + } + } + + fn record_debug(&mut self, _: &Field, _: &dyn Debug) {} +} diff --git a/core/tests/invoke-key/tauri.conf.json b/core/tests/invoke-key/tauri.conf.json new file mode 100644 index 000000000..49abe447e --- /dev/null +++ b/core/tests/invoke-key/tauri.conf.json @@ -0,0 +1,10 @@ +{ + "$schema": "../../../core/tauri-config-schema/schema.json", + "build": { + "distDir": "index.html", + "devPath": "index.html" + }, + "tauri": { + "windows": [{}] + } +}