Skip to content

Commit ceeb909

Browse files
committed
Add test for overlapping contexts
1 parent 5d43929 commit ceeb909

File tree

1 file changed

+42
-0
lines changed

1 file changed

+42
-0
lines changed

opentelemetry/src/context.rs

+42
Original file line numberDiff line numberDiff line change
@@ -413,4 +413,46 @@ mod tests {
413413
true
414414
}));
415415
}
416+
417+
#[test]
418+
#[ignore = "overlapping contexts are not supported yet"]
419+
fn overlapping_contexts() {
420+
#[derive(Debug, PartialEq)]
421+
struct ValueA(&'static str);
422+
#[derive(Debug, PartialEq)]
423+
struct ValueB(u64);
424+
425+
let outer_guard = Context::new().with_value(ValueA("a")).attach();
426+
427+
// Only value `a` is set
428+
let current = Context::current();
429+
assert_eq!(current.get(), Some(&ValueA("a")));
430+
assert_eq!(current.get::<ValueB>(), None);
431+
432+
let inner_guard = Context::current_with_value(ValueB(42)).attach();
433+
// Both values are set in inner context
434+
let current = Context::current();
435+
assert_eq!(current.get(), Some(&ValueA("a")));
436+
assert_eq!(current.get(), Some(&ValueB(42)));
437+
438+
assert!(Context::map_current(|cx| {
439+
assert_eq!(cx.get(), Some(&ValueA("a")));
440+
assert_eq!(cx.get(), Some(&ValueB(42)));
441+
true
442+
}));
443+
444+
drop(outer_guard);
445+
446+
// `inner_guard` is still alive so both `ValueA` and `ValueB` should still be accessible
447+
let current = Context::current();
448+
assert_eq!(current.get(), Some(&ValueA("a")));
449+
assert_eq!(current.get(), Some(&ValueB(42)));
450+
451+
drop(inner_guard);
452+
453+
// Both guards are dropped and neither value should be accessible.
454+
let current = Context::current();
455+
assert_eq!(current.get::<ValueA>(), None);
456+
assert_eq!(current.get::<ValueB>(), None);
457+
}
416458
}

0 commit comments

Comments
 (0)