Skip to content
This repository was archived by the owner on Oct 26, 2021. It is now read-only.

Commit 807a54f

Browse files
committed
tests: move common code to tests/common/mod.rs
This lets other integration tests use these common consts/functions. Signed-off-by: Will Woods <[email protected]>
1 parent b5a728f commit 807a54f

File tree

2 files changed

+121
-116
lines changed

2 files changed

+121
-116
lines changed

tests/common/mod.rs

Lines changed: 119 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,119 @@
1+
use std::io::Write;
2+
use std::path::Path;
3+
use std::process::{Command, Stdio};
4+
use std::time::Duration;
5+
use process_control::{ChildExt, Output, Timeout};
6+
7+
pub const CRATE: &str = env!("CARGO_MANIFEST_DIR");
8+
pub const KEEP_BIN: &str = env!("CARGO_BIN_EXE_enarx-keepldr");
9+
pub const OUT_DIR: &str = env!("OUT_DIR");
10+
pub const TEST_BINS_OUT: &str = "bin";
11+
pub const TIMEOUT_SECS: u64 = 10;
12+
pub const MAX_ASSERT_ELEMENTS: usize = 100;
13+
14+
pub fn assert_eq_slices(expected_output: &[u8], output: &[u8], what: &str) {
15+
let max_len = usize::min(output.len(), expected_output.len());
16+
let max_len = max_len.min(MAX_ASSERT_ELEMENTS);
17+
assert_eq!(
18+
output[..max_len],
19+
expected_output[..max_len],
20+
"Expected contents of {} differs",
21+
what
22+
);
23+
assert_eq!(
24+
output.len(),
25+
expected_output.len(),
26+
"Expected length of {} differs",
27+
what
28+
);
29+
assert_eq!(
30+
output, expected_output,
31+
"Expected contents of {} differs",
32+
what
33+
);
34+
}
35+
36+
/// Returns a handle to a child process through which output (stdout, stderr) can
37+
/// be accessed.
38+
pub fn run_test<'a>(
39+
bin: &str,
40+
status: i32,
41+
input: impl Into<Option<&'a [u8]>>,
42+
expected_stdout: impl Into<Option<&'a [u8]>>,
43+
expected_stderr: impl Into<Option<&'a [u8]>>,
44+
) -> Output {
45+
let expected_stdout = expected_stdout.into();
46+
let expected_stderr = expected_stderr.into();
47+
let bin_path = Path::new(CRATE).join(OUT_DIR).join(TEST_BINS_OUT).join(bin);
48+
49+
let mut child = Command::new(&String::from(KEEP_BIN))
50+
.current_dir(CRATE)
51+
.arg("exec")
52+
.arg(bin_path)
53+
.stdin(Stdio::piped())
54+
.stdout(Stdio::piped())
55+
.stderr(Stdio::piped())
56+
.spawn()
57+
.unwrap_or_else(|e| panic!("failed to run `{}`: {:#?}", bin, e));
58+
59+
if let Some(input) = input.into() {
60+
child
61+
.stdin
62+
.as_mut()
63+
.unwrap()
64+
.write_all(input)
65+
.expect("failed to write stdin to child");
66+
67+
drop(child.stdin.take());
68+
}
69+
70+
let output = child
71+
.with_output_timeout(Duration::from_secs(TIMEOUT_SECS))
72+
.terminating()
73+
.wait()
74+
.unwrap_or_else(|e| panic!("failed to run `{}`: {:#?}", bin, e))
75+
.unwrap_or_else(|| panic!("process `{}` timed out", bin));
76+
77+
let exit_status = output.status.code().unwrap_or_else(|| {
78+
panic!(
79+
"process `{}` terminated by signal {:?}",
80+
bin,
81+
output.status.signal()
82+
)
83+
});
84+
85+
// Output potential error messages
86+
if expected_stderr.is_none() && !output.stderr.is_empty() {
87+
let _ = std::io::stderr().write_all(&output.stderr);
88+
}
89+
90+
if let Some(expected_stdout) = expected_stdout {
91+
if output.stdout.len() < MAX_ASSERT_ELEMENTS && expected_stdout.len() < MAX_ASSERT_ELEMENTS
92+
{
93+
assert_eq!(
94+
output.stdout, expected_stdout,
95+
"Expected contents of stdout output differs"
96+
);
97+
} else {
98+
assert_eq_slices(expected_stdout, &output.stdout, "stdout output");
99+
}
100+
}
101+
102+
if let Some(expected_stderr) = expected_stderr {
103+
if output.stderr.len() < MAX_ASSERT_ELEMENTS && expected_stderr.len() < MAX_ASSERT_ELEMENTS
104+
{
105+
assert_eq!(
106+
output.stderr, expected_stderr,
107+
"Expected contents of stderr output differs."
108+
);
109+
} else {
110+
assert_eq_slices(expected_stderr, &output.stderr, "stderr output");
111+
}
112+
}
113+
114+
if exit_status != status as i64 {
115+
assert_eq!(exit_status, status as i64, "Expected exit status differs.");
116+
}
117+
118+
output
119+
}

tests/integration_tests.rs

Lines changed: 2 additions & 116 deletions
Original file line numberDiff line numberDiff line change
@@ -6,130 +6,16 @@ use std::io::{Read, Write};
66
use std::mem::{size_of, MaybeUninit};
77
use std::os::unix::ffi::OsStrExt;
88
use std::os::unix::net::{UnixListener, UnixStream};
9-
use std::path::Path;
10-
use std::process::{Command, Stdio};
119
use std::slice::from_raw_parts_mut;
1210
use std::thread;
1311
use std::time::Duration;
1412

15-
use process_control::{ChildExt, Output, Timeout};
1613
use serial_test::serial;
1714
use std::sync::Arc;
1815
use tempdir::TempDir;
1916

20-
const CRATE: &str = env!("CARGO_MANIFEST_DIR");
21-
const KEEP_BIN: &str = env!("CARGO_BIN_EXE_enarx-keepldr");
22-
const OUT_DIR: &str = env!("OUT_DIR");
23-
const TEST_BINS_OUT: &str = "bin";
24-
const TIMEOUT_SECS: u64 = 10;
25-
const MAX_ASSERT_ELEMENTS: usize = 100;
26-
27-
fn assert_eq_slices(expected_output: &[u8], output: &[u8], what: &str) {
28-
let max_len = usize::min(output.len(), expected_output.len());
29-
let max_len = max_len.min(MAX_ASSERT_ELEMENTS);
30-
assert_eq!(
31-
output[..max_len],
32-
expected_output[..max_len],
33-
"Expected contents of {} differs",
34-
what
35-
);
36-
assert_eq!(
37-
output.len(),
38-
expected_output.len(),
39-
"Expected length of {} differs",
40-
what
41-
);
42-
assert_eq!(
43-
output, expected_output,
44-
"Expected contents of {} differs",
45-
what
46-
);
47-
}
48-
49-
/// Returns a handle to a child process through which output (stdout, stderr) can
50-
/// be accessed.
51-
fn run_test<'a>(
52-
bin: &str,
53-
status: i32,
54-
input: impl Into<Option<&'a [u8]>>,
55-
expected_stdout: impl Into<Option<&'a [u8]>>,
56-
expected_stderr: impl Into<Option<&'a [u8]>>,
57-
) -> Output {
58-
let expected_stdout = expected_stdout.into();
59-
let expected_stderr = expected_stderr.into();
60-
let bin_path = Path::new(CRATE).join(OUT_DIR).join(TEST_BINS_OUT).join(bin);
61-
62-
let mut child = Command::new(&String::from(KEEP_BIN))
63-
.current_dir(CRATE)
64-
.arg("exec")
65-
.arg(bin_path)
66-
.stdin(Stdio::piped())
67-
.stdout(Stdio::piped())
68-
.stderr(Stdio::piped())
69-
.spawn()
70-
.unwrap_or_else(|e| panic!("failed to run `{}`: {:#?}", bin, e));
71-
72-
if let Some(input) = input.into() {
73-
child
74-
.stdin
75-
.as_mut()
76-
.unwrap()
77-
.write_all(input)
78-
.expect("failed to write stdin to child");
79-
80-
drop(child.stdin.take());
81-
}
82-
83-
let output = child
84-
.with_output_timeout(Duration::from_secs(TIMEOUT_SECS))
85-
.terminating()
86-
.wait()
87-
.unwrap_or_else(|e| panic!("failed to run `{}`: {:#?}", bin, e))
88-
.unwrap_or_else(|| panic!("process `{}` timed out", bin));
89-
90-
let exit_status = output.status.code().unwrap_or_else(|| {
91-
panic!(
92-
"process `{}` terminated by signal {:?}",
93-
bin,
94-
output.status.signal()
95-
)
96-
});
97-
98-
// Output potential error messages
99-
if expected_stderr.is_none() && !output.stderr.is_empty() {
100-
let _ = std::io::stderr().write_all(&output.stderr);
101-
}
102-
103-
if let Some(expected_stdout) = expected_stdout {
104-
if output.stdout.len() < MAX_ASSERT_ELEMENTS && expected_stdout.len() < MAX_ASSERT_ELEMENTS
105-
{
106-
assert_eq!(
107-
output.stdout, expected_stdout,
108-
"Expected contents of stdout output differs"
109-
);
110-
} else {
111-
assert_eq_slices(expected_stdout, &output.stdout, "stdout output");
112-
}
113-
}
114-
115-
if let Some(expected_stderr) = expected_stderr {
116-
if output.stderr.len() < MAX_ASSERT_ELEMENTS && expected_stderr.len() < MAX_ASSERT_ELEMENTS
117-
{
118-
assert_eq!(
119-
output.stderr, expected_stderr,
120-
"Expected contents of stderr output differs."
121-
);
122-
} else {
123-
assert_eq_slices(expected_stderr, &output.stderr, "stderr output");
124-
}
125-
}
126-
127-
if exit_status != status as i64 {
128-
assert_eq!(exit_status, status as i64, "Expected exit status differs.");
129-
}
130-
131-
output
132-
}
17+
mod common;
18+
use common::{run_test, assert_eq_slices};
13319

13420
fn read_item<T: Copy>(mut rdr: impl Read) -> std::io::Result<T> {
13521
let mut item = MaybeUninit::uninit();

0 commit comments

Comments
 (0)