tangle


git clone https://radroots.dev/git/tangle.git
Log | Files | Refs | README | LICENSE

commit e429592e588e0e57721b66c66f7df0898c092023
parent d05f5d169c85a0207db6faaae0065d0f6d0ad52c
Author: triesap <tyson@radroots.org>
Date:   Sun, 14 Jun 2026 18:20:03 -0700

runtime: prove count privacy refusals

Diffstat:
Mcrates/tangle_runtime/tests/phase2_acceptance_targets.rs | 39+++++++++++++++++++++++++++++++++++++++
1 file changed, 39 insertions(+), 0 deletions(-)

diff --git a/crates/tangle_runtime/tests/phase2_acceptance_targets.rs b/crates/tangle_runtime/tests/phase2_acceptance_targets.rs @@ -863,6 +863,13 @@ async fn websocket_private_and_hidden_groups_do_not_leak_through_query_count_or_ 1, ) .await; + assert_count_closed( + &mut observer, + "private-public-broad-count", + json!({"kinds":[1], "#h":["PrivateSocket"], "limit":500}), + "restricted: count filters are too broad or expensive", + ) + .await; assert_empty_req( &mut observer, "private-public-query", @@ -975,6 +982,13 @@ async fn websocket_private_and_hidden_groups_do_not_leak_through_query_count_or_ 1, ) .await; + assert_count_closed( + &mut observer, + "hidden-public-broad-count", + json!({"kinds":[1], "#h":["HiddenSocket"], "limit":500}), + "restricted: count filters are too broad or expensive", + ) + .await; assert_empty_req( &mut observer, "hidden-public-query", @@ -989,6 +1003,18 @@ async fn websocket_private_and_hidden_groups_do_not_leak_through_query_count_or_ ) .await; + let metrics = wait_for_http_ok(address, "/metricsz", None).await; + for private_value in [ + "PrivateSocket", + "HiddenSocket", + "private harvest", + "hidden harvest", + "private-public-broad-count", + "hidden-public-broad-count", + ] { + assert!(!metrics.contains(private_value)); + } + shutdown.request_shutdown(); read_websocket_close(&mut owner_writer).await; read_websocket_close(&mut owner_reader).await; @@ -1994,6 +2020,19 @@ async fn assert_count_message( ); } +async fn assert_count_closed( + socket: &mut TestWebSocket, + subscription_id: &str, + filter: Value, + message: &str, +) { + send_client_value(socket, json!(["COUNT", subscription_id, filter])).await; + assert_eq!( + read_relay_value(socket).await, + json!(["CLOSED", subscription_id, message]) + ); +} + async fn assert_empty_req(socket: &mut TestWebSocket, subscription_id: &str, filter: Value) { send_client_value(socket, json!(["REQ", subscription_id, filter])).await; assert_eq!(