• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 #![warn(rust_2018_idioms)]
2 #![allow(clippy::declare_interior_mutable_const)]
3 #![cfg(all(feature = "full", not(tokio_wasi)))]
4 
5 use futures::future;
6 use std::error::Error;
7 use tokio::runtime::Builder;
8 use tokio::task::{self, block_in_place};
9 
10 mod support {
11     pub mod panic;
12 }
13 use support::panic::test_panic;
14 
15 #[test]
block_in_place_panic_caller() -> Result<(), Box<dyn Error>>16 fn block_in_place_panic_caller() -> Result<(), Box<dyn Error>> {
17     let panic_location_file = test_panic(|| {
18         let rt = Builder::new_current_thread().enable_all().build().unwrap();
19         rt.block_on(async {
20             block_in_place(|| {});
21         });
22     });
23 
24     // The panic location should be in this file
25     assert_eq!(&panic_location_file.unwrap(), file!());
26 
27     Ok(())
28 }
29 
30 #[test]
local_set_spawn_local_panic_caller() -> Result<(), Box<dyn Error>>31 fn local_set_spawn_local_panic_caller() -> Result<(), Box<dyn Error>> {
32     let panic_location_file = test_panic(|| {
33         let _local = task::LocalSet::new();
34 
35         let _ = task::spawn_local(async {});
36     });
37 
38     // The panic location should be in this file
39     assert_eq!(&panic_location_file.unwrap(), file!());
40 
41     Ok(())
42 }
43 
44 #[test]
local_set_block_on_panic_caller() -> Result<(), Box<dyn Error>>45 fn local_set_block_on_panic_caller() -> Result<(), Box<dyn Error>> {
46     let panic_location_file = test_panic(|| {
47         let rt = Builder::new_current_thread().enable_all().build().unwrap();
48         let local = task::LocalSet::new();
49 
50         rt.block_on(async {
51             local.block_on(&rt, future::pending::<()>());
52         });
53     });
54 
55     // The panic location should be in this file
56     assert_eq!(&panic_location_file.unwrap(), file!());
57 
58     Ok(())
59 }
60 
61 #[test]
spawn_panic_caller() -> Result<(), Box<dyn Error>>62 fn spawn_panic_caller() -> Result<(), Box<dyn Error>> {
63     let panic_location_file = test_panic(|| {
64         tokio::spawn(future::pending::<()>());
65     });
66 
67     // The panic location should be in this file
68     assert_eq!(&panic_location_file.unwrap(), file!());
69 
70     Ok(())
71 }
72 
73 #[test]
local_key_sync_scope_panic_caller() -> Result<(), Box<dyn Error>>74 fn local_key_sync_scope_panic_caller() -> Result<(), Box<dyn Error>> {
75     tokio::task_local! {
76         static NUMBER: u32;
77     }
78 
79     let panic_location_file = test_panic(|| {
80         NUMBER.sync_scope(1, || {
81             NUMBER.with(|_| {
82                 NUMBER.sync_scope(1, || {});
83             });
84         });
85     });
86 
87     // The panic location should be in this file
88     assert_eq!(&panic_location_file.unwrap(), file!());
89 
90     Ok(())
91 }
92 
93 #[test]
local_key_with_panic_caller() -> Result<(), Box<dyn Error>>94 fn local_key_with_panic_caller() -> Result<(), Box<dyn Error>> {
95     tokio::task_local! {
96         static NUMBER: u32;
97     }
98 
99     let panic_location_file = test_panic(|| {
100         NUMBER.with(|_| {});
101     });
102 
103     // The panic location should be in this file
104     assert_eq!(&panic_location_file.unwrap(), file!());
105 
106     Ok(())
107 }
108 
109 #[test]
local_key_get_panic_caller() -> Result<(), Box<dyn Error>>110 fn local_key_get_panic_caller() -> Result<(), Box<dyn Error>> {
111     tokio::task_local! {
112         static NUMBER: u32;
113     }
114 
115     let panic_location_file = test_panic(|| {
116         NUMBER.get();
117     });
118 
119     // The panic location should be in this file
120     assert_eq!(&panic_location_file.unwrap(), file!());
121 
122     Ok(())
123 }
124