Skip to content
This repository was archived by the owner on Dec 29, 2022. It is now read-only.

Commit 98e9bda

Browse files
committed
Added a timeout to the integration tests
1 parent 4b8265d commit 98e9bda

File tree

2 files changed

+143
-107
lines changed

2 files changed

+143
-107
lines changed

tests/support/harness.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,8 @@ pub fn read_message<R: Read>(reader: &mut BufReader<R>) -> io::Result<String> {
6464
pub fn expect_messages<R: Read>(reader: &mut BufReader<R>, expected: &[&ExpectedMessage]) {
6565
let mut results: Vec<String> = Vec::new();
6666
while results.len() < expected.len() {
67-
results.push(read_message(reader).unwrap());
67+
let msg = read_message(reader).unwrap();
68+
results.push(msg);
6869
}
6970

7071
println!(
@@ -161,4 +162,4 @@ impl RlsHandle {
161162
pub fn expect_messages(&mut self, expected: &[&ExpectedMessage]) {
162163
expect_messages(&mut self.stdout, expected);
163164
}
164-
}
165+
}

tests/tests.rs

Lines changed: 140 additions & 105 deletions
Original file line numberDiff line numberDiff line change
@@ -13,119 +13,154 @@ extern crate cargo;
1313
#[macro_use]
1414
extern crate serde_json;
1515

16+
use std::sync::{Arc, Condvar, Mutex};
17+
use std::thread;
18+
use std::time::Duration;
19+
1620
mod support;
1721
use support::{basic_bin_manifest, project};
1822
use support::harness::{ExpectedMessage, RlsHandle};
1923

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+
2051
#[test]
2152
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+
});
5083
}
5184

5285
#[test]
5386
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+
}
107142
}
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

Comments
 (0)