@@ -13,119 +13,154 @@ extern crate cargo;
13
13
#[ macro_use]
14
14
extern crate serde_json;
15
15
16
+ use std:: sync:: { Arc , Condvar , Mutex } ;
17
+ use std:: thread;
18
+ use std:: time:: Duration ;
19
+
16
20
mod support;
17
21
use support:: { basic_bin_manifest, project} ;
18
22
use support:: harness:: { ExpectedMessage , RlsHandle } ;
19
23
24
+ fn timeout < F > ( dur : Duration , func : F )
25
+ where F : FnOnce ( ) + Send + ' static {
26
+ let pair = Arc :: new ( ( Mutex :: new ( false ) , Condvar :: new ( ) ) ) ;
27
+ let pair2 = pair. clone ( ) ;
28
+
29
+ thread:: spawn ( move || {
30
+ let & ( ref lock, ref cvar) = & * pair2;
31
+ func ( ) ;
32
+ let mut finished = lock. lock ( ) . unwrap ( ) ;
33
+ * finished = true ;
34
+ // We notify the condvar that the value has changed.
35
+ cvar. notify_one ( ) ;
36
+ } ) ;
37
+
38
+ // Wait for the test to finish.
39
+ let & ( ref lock, ref cvar) = & * pair;
40
+ let mut finished = lock. lock ( ) . unwrap ( ) ;
41
+ // As long as the value inside the `Mutex` is false, we wait.
42
+ while !* finished {
43
+ let result = cvar. wait_timeout ( finished, dur) . unwrap ( ) ;
44
+ if result. 1 . timed_out ( ) {
45
+ panic ! ( "Timed out" )
46
+ }
47
+ finished = result. 0
48
+ }
49
+ }
50
+
20
51
#[ test]
21
52
fn test_infer_bin ( ) {
22
- let p = project ( "simple_workspace" )
23
- . file ( "Cargo.toml" , & basic_bin_manifest ( "foo" ) )
24
- . file ( "src/main.rs" , r#"
25
- struct UnusedBin;
26
- fn main() {
27
- println!("Hello world!");
28
- }
29
- "# )
30
- . build ( ) ;
31
-
32
- let root_path = p. root ( ) ;
33
- let rls_child = p. rls ( ) . spawn ( ) . unwrap ( ) ;
34
- let mut rls = RlsHandle :: new ( rls_child) ;
35
-
36
- rls. request ( 0 , "initialize" , json ! ( {
37
- "rootPath" : root_path,
38
- "capabilities" : { }
39
- } ) ) . unwrap ( ) ;
40
-
41
- rls. expect_messages ( & [
42
- ExpectedMessage :: new ( Some ( 0 ) ) . expect_contains ( "capabilities" ) ,
43
- ExpectedMessage :: new ( None ) . expect_contains ( "beginBuild" ) ,
44
- ExpectedMessage :: new ( None ) . expect_contains ( "diagnosticsBegin" ) ,
45
- ExpectedMessage :: new ( None ) . expect_contains ( "struct is never used: `UnusedBin`" ) ,
46
- ExpectedMessage :: new ( None ) . expect_contains ( "diagnosticsEnd" )
47
- ] ) ;
48
-
49
- rls. shutdown_exit ( ) ;
53
+ timeout ( Duration :: from_secs ( 300 ) , ||{
54
+ let p = project ( "simple_workspace" )
55
+ . file ( "Cargo.toml" , & basic_bin_manifest ( "foo" ) )
56
+ . file ( "src/main.rs" , r#"
57
+ struct UnusedBin;
58
+ fn main() {
59
+ println!("Hello world!");
60
+ }
61
+ "# )
62
+ . build ( ) ;
63
+
64
+ let root_path = p. root ( ) ;
65
+ let rls_child = p. rls ( ) . spawn ( ) . unwrap ( ) ;
66
+ let mut rls = RlsHandle :: new ( rls_child) ;
67
+
68
+ rls. request ( 0 , "initialize" , json ! ( {
69
+ "rootPath" : root_path,
70
+ "capabilities" : { }
71
+ } ) ) . unwrap ( ) ;
72
+
73
+ rls. expect_messages ( & [
74
+ ExpectedMessage :: new ( Some ( 0 ) ) . expect_contains ( "capabilities" ) ,
75
+ ExpectedMessage :: new ( None ) . expect_contains ( "beginBuild" ) ,
76
+ ExpectedMessage :: new ( None ) . expect_contains ( "diagnosticsBegin" ) ,
77
+ ExpectedMessage :: new ( None ) . expect_contains ( "struct is never used: `UnusedBin`" ) ,
78
+ ExpectedMessage :: new ( None ) . expect_contains ( "diagnosticsEnd" )
79
+ ] ) ;
80
+
81
+ rls. shutdown_exit ( ) ;
82
+ } ) ;
50
83
}
51
84
52
85
#[ test]
53
86
fn test_simple_workspace ( ) {
54
- let p = project ( "simple_workspace" )
55
- . file ( "Cargo.toml" , r#"
56
- [workspace]
57
- members = [
58
- "member_lib",
59
- "member_bin",
60
- ]
61
- "# )
62
- . file ( "Cargo.lock" , r#"
63
- [root]
64
- name = "member_lib"
65
- version = "0.1.0"
66
-
67
- [[package]]
68
- name = "member_bin"
69
- version = "0.1.0"
70
- dependencies = [
71
- "member_lib 0.1.0",
72
- ]
73
- "# )
74
- . file ( "member_bin/Cargo.toml" , r#"
75
- [package]
76
- name = "member_bin"
77
- version = "0.1.0"
78
- authors = ["Igor Matuszewski <[email protected] >"]
79
-
80
- [dependencies]
81
- member_lib = { path = "../member_lib" }
82
- "# )
83
- . file ( "member_bin/src/main.rs" , r#"
84
- extern crate member_lib;
85
-
86
- fn main() {
87
- let a = member_lib::MemberLibStruct;
88
- }
89
- "# )
90
- . file ( "member_lib/Cargo.toml" , r#"
91
- [package]
92
- name = "member_lib"
93
- version = "0.1.0"
94
- authors = ["Igor Matuszewski <[email protected] >"]
95
-
96
- [dependencies]
97
- "# )
98
- . file ( "member_lib/src/lib.rs" , r#"
99
- pub struct MemberLibStruct;
100
-
101
- struct Unused;
102
-
103
- #[cfg(test)]
104
- mod tests {
105
- #[test]
106
- fn it_works() {
87
+ timeout ( Duration :: from_secs ( 300 ) , ||{
88
+ let p = project ( "simple_workspace" )
89
+ . file ( "Cargo.toml" , r#"
90
+ [workspace]
91
+ members = [
92
+ "member_lib",
93
+ "member_bin",
94
+ ]
95
+ "# )
96
+ . file ( "Cargo.lock" , r#"
97
+ [root]
98
+ name = "member_lib"
99
+ version = "0.1.0"
100
+
101
+ [[package]]
102
+ name = "member_bin"
103
+ version = "0.1.0"
104
+ dependencies = [
105
+ "member_lib 0.1.0",
106
+ ]
107
+ "# )
108
+ . file ( "member_bin/Cargo.toml" , r#"
109
+ [package]
110
+ name = "member_bin"
111
+ version = "0.1.0"
112
+ authors = ["Igor Matuszewski <[email protected] >"]
113
+
114
+ [dependencies]
115
+ member_lib = { path = "../member_lib" }
116
+ "# )
117
+ . file ( "member_bin/src/main.rs" , r#"
118
+ extern crate member_lib;
119
+
120
+ fn main() {
121
+ let a = member_lib::MemberLibStruct;
122
+ }
123
+ "# )
124
+ . file ( "member_lib/Cargo.toml" , r#"
125
+ [package]
126
+ name = "member_lib"
127
+ version = "0.1.0"
128
+ authors = ["Igor Matuszewski <[email protected] >"]
129
+
130
+ [dependencies]
131
+ "# )
132
+ . file ( "member_lib/src/lib.rs" , r#"
133
+ pub struct MemberLibStruct;
134
+
135
+ struct Unused;
136
+
137
+ #[cfg(test)]
138
+ mod tests {
139
+ #[test]
140
+ fn it_works() {
141
+ }
107
142
}
108
- }
109
- "# )
110
- . build ( ) ;
111
-
112
- let root_path = p. root ( ) ;
113
- let rls_child = p . rls ( ) . spawn ( ) . unwrap ( ) ;
114
- let mut rls = RlsHandle :: new ( rls_child ) ;
115
-
116
- rls . request ( 0 , "initialize" , json ! ( {
117
- "rootPath ": root_path ,
118
- "capabilities" : { }
119
- } ) ) . unwrap ( ) ;
120
-
121
- rls . expect_messages ( & [
122
- ExpectedMessage :: new ( Some ( 0 ) ) . expect_contains ( "capabilities " ) ,
123
- ExpectedMessage :: new ( None ) . expect_contains ( "beginBuild " ) ,
124
- ExpectedMessage :: new ( None ) . expect_contains ( "diagnosticsBegin " ) ,
125
- ExpectedMessage :: new ( None ) . expect_contains ( "publishDiagnostics" ) ,
126
- ExpectedMessage :: new ( None ) . expect_contains ( "publishDiagnostics" ) ,
127
- ExpectedMessage :: new ( None ) . expect_contains ( "diagnosticsEnd" )
128
- ] ) ;
129
-
130
- rls . shutdown_exit ( ) ;
131
- }
143
+ "# )
144
+ . build ( ) ;
145
+
146
+ let root_path = p . root ( ) ;
147
+ let rls_child = p. rls ( ) . spawn ( ) . unwrap ( ) ;
148
+ let mut rls = RlsHandle :: new ( rls_child ) ;
149
+
150
+ rls . request ( 0 , "initialize" , json ! ( {
151
+ "rootPath" : root_path ,
152
+ "capabilities ": { }
153
+ } ) ) . unwrap ( ) ;
154
+
155
+ rls . expect_messages ( & [
156
+ ExpectedMessage :: new ( Some ( 0 ) ) . expect_contains ( "capabilities" ) ,
157
+ ExpectedMessage :: new ( None ) . expect_contains ( "beginBuild " ) ,
158
+ ExpectedMessage :: new ( None ) . expect_contains ( "diagnosticsBegin " ) ,
159
+ ExpectedMessage :: new ( None ) . expect_contains ( "publishDiagnostics " ) ,
160
+ ExpectedMessage :: new ( None ) . expect_contains ( "publishDiagnostics" ) ,
161
+ ExpectedMessage :: new ( None ) . expect_contains ( "diagnosticsEnd" )
162
+ ] ) ;
163
+
164
+ rls . shutdown_exit ( ) ;
165
+ } ) ;
166
+ }
0 commit comments