Skip to content

Commit 644546f

Browse files
committed
tests: Add sentry-tower test
1 parent 3999e46 commit 644546f

File tree

2 files changed

+81
-0
lines changed

2 files changed

+81
-0
lines changed

sentry/Cargo.toml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,9 +67,11 @@ tokio = { version = "1.0", features = ["rt"] }
6767
sentry-anyhow = { version = "0.23.0", path = "../sentry-anyhow" }
6868
sentry-log = { version = "0.23.0", path = "../sentry-log" }
6969
sentry-slog = { version = "0.23.0", path = "../sentry-slog" }
70+
sentry-tower = { version = "0.23.0", path = "../sentry-tower" }
7071
sentry-tracing = { version = "0.23.0", path = "../sentry-tracing" }
7172
log_ = { package = "log", version = "0.4.8", features = ["std"] }
7273
slog_ = { package = "slog", version = "2.5.2" }
74+
tower_ = { package = "tower", version = "0.4", features = ["util"] }
7375
tracing_ = { package = "tracing", version = "0.1" }
7476
tracing-subscriber = { version = "0.2", features = ["fmt", "tracing-log"] }
7577
actix-web = { version = "3", default-features = false }

sentry/tests/test_tower.rs

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
#![cfg(feature = "test")]
2+
3+
use std::sync::Arc;
4+
5+
use sentry::{
6+
protocol::{Breadcrumb, Level},
7+
test::TestTransport,
8+
ClientOptions, Hub,
9+
};
10+
use sentry_tower::SentryLayer;
11+
use tower_::{ServiceBuilder, ServiceExt};
12+
13+
#[test]
14+
fn test_tower_hub() {
15+
// Create a fake transport for new hubs
16+
let transport = TestTransport::new();
17+
let opts = ClientOptions {
18+
dsn: Some("https://[email protected]/1".parse().unwrap()),
19+
transport: Some(Arc::new(transport.clone())),
20+
..Default::default()
21+
};
22+
23+
let events = sentry::test::with_captured_events(|| {
24+
// This breadcrumb should be in all subsequent requests
25+
sentry::add_breadcrumb(Breadcrumb {
26+
message: Some("Starting service...".to_owned()),
27+
level: Level::Info,
28+
..Default::default()
29+
});
30+
sentry::capture_message("Started service", Level::Info);
31+
32+
let hub = Arc::new(Hub::with(|hub| Hub::new_from_top(hub)));
33+
hub.bind_client(Some(Arc::new(opts.into())));
34+
35+
let service = ServiceBuilder::new()
36+
.layer(SentryLayer::new(hub))
37+
.service_fn(|req: String| async move {
38+
// This breadcrumb should not be seen in any other hub
39+
sentry::add_breadcrumb(Breadcrumb {
40+
message: Some(format!("Got request with arg: {}", req)),
41+
level: Level::Info,
42+
..Default::default()
43+
});
44+
sentry::capture_message("Request failed", Level::Error);
45+
Err::<(), _>(format!("Can't greet {}, sorry.", req))
46+
});
47+
48+
let rt = tokio::runtime::Builder::new_current_thread()
49+
.enable_all()
50+
.build()
51+
.unwrap();
52+
let res = rt.block_on(service.oneshot("World".to_owned()));
53+
54+
assert_eq!(res, Err("Can't greet World, sorry.".to_owned()));
55+
});
56+
57+
assert_eq!(events.len(), 1);
58+
let event = events.into_iter().next().unwrap();
59+
assert_eq!(event.message, Some("Started service".into()));
60+
assert_eq!(event.breadcrumbs.len(), 1);
61+
assert_eq!(
62+
event.breadcrumbs[0].message,
63+
Some("Starting service...".into())
64+
);
65+
66+
let events = transport.fetch_and_clear_events();
67+
assert_eq!(events.len(), 1);
68+
let event = events.into_iter().next().unwrap();
69+
assert_eq!(event.message, Some("Request failed".into()));
70+
assert_eq!(event.breadcrumbs.len(), 2);
71+
assert_eq!(
72+
event.breadcrumbs[0].message,
73+
Some("Starting service...".into())
74+
);
75+
assert_eq!(
76+
event.breadcrumbs[1].message,
77+
Some("Got request with arg: World".into())
78+
);
79+
}

0 commit comments

Comments
 (0)