1*bb4ee6a4SAndroid Build Coastguard Worker // Copyright 2023 The ChromiumOS Authors
2*bb4ee6a4SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*bb4ee6a4SAndroid Build Coastguard Worker // found in the LICENSE file.
4*bb4ee6a4SAndroid Build Coastguard Worker
5*bb4ee6a4SAndroid Build Coastguard Worker //! Testing vmm-swap
6*bb4ee6a4SAndroid Build Coastguard Worker
7*bb4ee6a4SAndroid Build Coastguard Worker #![cfg(any(target_os = "android", target_os = "linux"))]
8*bb4ee6a4SAndroid Build Coastguard Worker
9*bb4ee6a4SAndroid Build Coastguard Worker use std::time::Duration;
10*bb4ee6a4SAndroid Build Coastguard Worker use std::time::Instant;
11*bb4ee6a4SAndroid Build Coastguard Worker
12*bb4ee6a4SAndroid Build Coastguard Worker use anyhow::bail;
13*bb4ee6a4SAndroid Build Coastguard Worker use base::test_utils::call_test_with_sudo;
14*bb4ee6a4SAndroid Build Coastguard Worker use fixture::vm::Config;
15*bb4ee6a4SAndroid Build Coastguard Worker use fixture::vm::TestVm;
16*bb4ee6a4SAndroid Build Coastguard Worker use swap::SwapState;
17*bb4ee6a4SAndroid Build Coastguard Worker use swap::SwapStatus;
18*bb4ee6a4SAndroid Build Coastguard Worker
19*bb4ee6a4SAndroid Build Coastguard Worker const SWAP_STATE_CHANGE_TIMEOUT: Duration = Duration::from_secs(2);
20*bb4ee6a4SAndroid Build Coastguard Worker const SWAP_FILE_PATH: &str = "/tmp/swap_test";
21*bb4ee6a4SAndroid Build Coastguard Worker
get_swap_state(vm: &mut TestVm) -> SwapState22*bb4ee6a4SAndroid Build Coastguard Worker fn get_swap_state(vm: &mut TestVm) -> SwapState {
23*bb4ee6a4SAndroid Build Coastguard Worker let output = vm.swap_command("status").unwrap();
24*bb4ee6a4SAndroid Build Coastguard Worker let status = serde_json::from_slice::<SwapStatus>(&output).unwrap();
25*bb4ee6a4SAndroid Build Coastguard Worker status.state
26*bb4ee6a4SAndroid Build Coastguard Worker }
27*bb4ee6a4SAndroid Build Coastguard Worker
wait_until_swap_state_change( vm: &mut TestVm, state: SwapState, transition_state: &[SwapState], timeout: Duration, ) -> anyhow::Result<()>28*bb4ee6a4SAndroid Build Coastguard Worker fn wait_until_swap_state_change(
29*bb4ee6a4SAndroid Build Coastguard Worker vm: &mut TestVm,
30*bb4ee6a4SAndroid Build Coastguard Worker state: SwapState,
31*bb4ee6a4SAndroid Build Coastguard Worker transition_state: &[SwapState],
32*bb4ee6a4SAndroid Build Coastguard Worker timeout: Duration,
33*bb4ee6a4SAndroid Build Coastguard Worker ) -> anyhow::Result<()> {
34*bb4ee6a4SAndroid Build Coastguard Worker let start = Instant::now();
35*bb4ee6a4SAndroid Build Coastguard Worker loop {
36*bb4ee6a4SAndroid Build Coastguard Worker let current_state = get_swap_state(vm);
37*bb4ee6a4SAndroid Build Coastguard Worker if current_state == state {
38*bb4ee6a4SAndroid Build Coastguard Worker return Ok(());
39*bb4ee6a4SAndroid Build Coastguard Worker }
40*bb4ee6a4SAndroid Build Coastguard Worker if start.elapsed() > timeout {
41*bb4ee6a4SAndroid Build Coastguard Worker bail!(
42*bb4ee6a4SAndroid Build Coastguard Worker "state change timeout: current: {:?}, target: {:?}",
43*bb4ee6a4SAndroid Build Coastguard Worker current_state,
44*bb4ee6a4SAndroid Build Coastguard Worker state
45*bb4ee6a4SAndroid Build Coastguard Worker );
46*bb4ee6a4SAndroid Build Coastguard Worker }
47*bb4ee6a4SAndroid Build Coastguard Worker if !transition_state.contains(¤t_state) {
48*bb4ee6a4SAndroid Build Coastguard Worker bail!(
49*bb4ee6a4SAndroid Build Coastguard Worker "unexpected state while waiting: current: {:?}, target: {:?}",
50*bb4ee6a4SAndroid Build Coastguard Worker current_state,
51*bb4ee6a4SAndroid Build Coastguard Worker state
52*bb4ee6a4SAndroid Build Coastguard Worker );
53*bb4ee6a4SAndroid Build Coastguard Worker }
54*bb4ee6a4SAndroid Build Coastguard Worker std::thread::sleep(Duration::from_millis(100));
55*bb4ee6a4SAndroid Build Coastguard Worker }
56*bb4ee6a4SAndroid Build Coastguard Worker }
57*bb4ee6a4SAndroid Build Coastguard Worker
create_tmpfs_file_in_guest(vm: &mut TestVm, size: usize)58*bb4ee6a4SAndroid Build Coastguard Worker fn create_tmpfs_file_in_guest(vm: &mut TestVm, size: usize) {
59*bb4ee6a4SAndroid Build Coastguard Worker vm.exec_in_guest("mount -t tmpfs -o size=64m /dev/shm /tmp")
60*bb4ee6a4SAndroid Build Coastguard Worker .unwrap();
61*bb4ee6a4SAndroid Build Coastguard Worker vm.exec_in_guest(&format!(
62*bb4ee6a4SAndroid Build Coastguard Worker "head -c {} /dev/urandom > {}",
63*bb4ee6a4SAndroid Build Coastguard Worker size, SWAP_FILE_PATH
64*bb4ee6a4SAndroid Build Coastguard Worker ))
65*bb4ee6a4SAndroid Build Coastguard Worker .unwrap();
66*bb4ee6a4SAndroid Build Coastguard Worker }
67*bb4ee6a4SAndroid Build Coastguard Worker
load_checksum_tmpfs_file(vm: &mut TestVm) -> String68*bb4ee6a4SAndroid Build Coastguard Worker fn load_checksum_tmpfs_file(vm: &mut TestVm) -> String {
69*bb4ee6a4SAndroid Build Coastguard Worker // Use checksum to validate that the RAM on the guest is not broken. Sending the whole content
70*bb4ee6a4SAndroid Build Coastguard Worker // does not work due to the protocol of the connection between host and guest.
71*bb4ee6a4SAndroid Build Coastguard Worker vm.exec_in_guest(&format!("cat {} | sha256sum", SWAP_FILE_PATH))
72*bb4ee6a4SAndroid Build Coastguard Worker .unwrap()
73*bb4ee6a4SAndroid Build Coastguard Worker .stdout
74*bb4ee6a4SAndroid Build Coastguard Worker }
75*bb4ee6a4SAndroid Build Coastguard Worker
76*bb4ee6a4SAndroid Build Coastguard Worker #[ignore = "Only to be called by swap_enabled"]
77*bb4ee6a4SAndroid Build Coastguard Worker #[test]
swap_enabled_impl()78*bb4ee6a4SAndroid Build Coastguard Worker fn swap_enabled_impl() {
79*bb4ee6a4SAndroid Build Coastguard Worker let mut config = Config::new();
80*bb4ee6a4SAndroid Build Coastguard Worker config = config.extra_args(vec!["--swap".to_string(), ".".to_string()]);
81*bb4ee6a4SAndroid Build Coastguard Worker let mut vm = TestVm::new_sudo(config).unwrap();
82*bb4ee6a4SAndroid Build Coastguard Worker
83*bb4ee6a4SAndroid Build Coastguard Worker assert_eq!(get_swap_state(&mut vm), SwapState::Ready);
84*bb4ee6a4SAndroid Build Coastguard Worker vm.swap_command("enable").unwrap();
85*bb4ee6a4SAndroid Build Coastguard Worker assert_eq!(get_swap_state(&mut vm), SwapState::Pending);
86*bb4ee6a4SAndroid Build Coastguard Worker vm.swap_command("trim").unwrap();
87*bb4ee6a4SAndroid Build Coastguard Worker wait_until_swap_state_change(
88*bb4ee6a4SAndroid Build Coastguard Worker &mut vm,
89*bb4ee6a4SAndroid Build Coastguard Worker SwapState::Pending,
90*bb4ee6a4SAndroid Build Coastguard Worker &[SwapState::TrimInProgress],
91*bb4ee6a4SAndroid Build Coastguard Worker SWAP_STATE_CHANGE_TIMEOUT,
92*bb4ee6a4SAndroid Build Coastguard Worker )
93*bb4ee6a4SAndroid Build Coastguard Worker .unwrap();
94*bb4ee6a4SAndroid Build Coastguard Worker vm.swap_command("out").unwrap();
95*bb4ee6a4SAndroid Build Coastguard Worker wait_until_swap_state_change(
96*bb4ee6a4SAndroid Build Coastguard Worker &mut vm,
97*bb4ee6a4SAndroid Build Coastguard Worker SwapState::Active,
98*bb4ee6a4SAndroid Build Coastguard Worker &[SwapState::SwapOutInProgress],
99*bb4ee6a4SAndroid Build Coastguard Worker SWAP_STATE_CHANGE_TIMEOUT,
100*bb4ee6a4SAndroid Build Coastguard Worker )
101*bb4ee6a4SAndroid Build Coastguard Worker .unwrap();
102*bb4ee6a4SAndroid Build Coastguard Worker vm.swap_command("disable").unwrap();
103*bb4ee6a4SAndroid Build Coastguard Worker wait_until_swap_state_change(
104*bb4ee6a4SAndroid Build Coastguard Worker &mut vm,
105*bb4ee6a4SAndroid Build Coastguard Worker SwapState::Ready,
106*bb4ee6a4SAndroid Build Coastguard Worker &[SwapState::SwapInInProgress],
107*bb4ee6a4SAndroid Build Coastguard Worker SWAP_STATE_CHANGE_TIMEOUT,
108*bb4ee6a4SAndroid Build Coastguard Worker )
109*bb4ee6a4SAndroid Build Coastguard Worker .unwrap();
110*bb4ee6a4SAndroid Build Coastguard Worker }
111*bb4ee6a4SAndroid Build Coastguard Worker
112*bb4ee6a4SAndroid Build Coastguard Worker #[test]
swap_enabled()113*bb4ee6a4SAndroid Build Coastguard Worker fn swap_enabled() {
114*bb4ee6a4SAndroid Build Coastguard Worker call_test_with_sudo("swap_enabled_impl");
115*bb4ee6a4SAndroid Build Coastguard Worker }
116*bb4ee6a4SAndroid Build Coastguard Worker
117*bb4ee6a4SAndroid Build Coastguard Worker #[ignore = "Only to be called by swap_out_multiple_times"]
118*bb4ee6a4SAndroid Build Coastguard Worker #[test]
swap_out_multiple_times_impl()119*bb4ee6a4SAndroid Build Coastguard Worker fn swap_out_multiple_times_impl() {
120*bb4ee6a4SAndroid Build Coastguard Worker let mut config = Config::new();
121*bb4ee6a4SAndroid Build Coastguard Worker config = config.extra_args(vec!["--swap".to_string(), ".".to_string()]);
122*bb4ee6a4SAndroid Build Coastguard Worker let mut vm = TestVm::new_sudo(config).unwrap();
123*bb4ee6a4SAndroid Build Coastguard Worker
124*bb4ee6a4SAndroid Build Coastguard Worker assert_eq!(get_swap_state(&mut vm), SwapState::Ready);
125*bb4ee6a4SAndroid Build Coastguard Worker vm.swap_command("enable").unwrap();
126*bb4ee6a4SAndroid Build Coastguard Worker assert_eq!(get_swap_state(&mut vm), SwapState::Pending);
127*bb4ee6a4SAndroid Build Coastguard Worker vm.swap_command("trim").unwrap();
128*bb4ee6a4SAndroid Build Coastguard Worker wait_until_swap_state_change(
129*bb4ee6a4SAndroid Build Coastguard Worker &mut vm,
130*bb4ee6a4SAndroid Build Coastguard Worker SwapState::Pending,
131*bb4ee6a4SAndroid Build Coastguard Worker &[SwapState::TrimInProgress],
132*bb4ee6a4SAndroid Build Coastguard Worker SWAP_STATE_CHANGE_TIMEOUT,
133*bb4ee6a4SAndroid Build Coastguard Worker )
134*bb4ee6a4SAndroid Build Coastguard Worker .unwrap();
135*bb4ee6a4SAndroid Build Coastguard Worker vm.swap_command("out").unwrap();
136*bb4ee6a4SAndroid Build Coastguard Worker wait_until_swap_state_change(
137*bb4ee6a4SAndroid Build Coastguard Worker &mut vm,
138*bb4ee6a4SAndroid Build Coastguard Worker SwapState::Active,
139*bb4ee6a4SAndroid Build Coastguard Worker &[SwapState::SwapOutInProgress],
140*bb4ee6a4SAndroid Build Coastguard Worker SWAP_STATE_CHANGE_TIMEOUT,
141*bb4ee6a4SAndroid Build Coastguard Worker )
142*bb4ee6a4SAndroid Build Coastguard Worker .unwrap();
143*bb4ee6a4SAndroid Build Coastguard Worker vm.swap_command("enable").unwrap();
144*bb4ee6a4SAndroid Build Coastguard Worker assert_eq!(get_swap_state(&mut vm), SwapState::Pending);
145*bb4ee6a4SAndroid Build Coastguard Worker vm.swap_command("trim").unwrap();
146*bb4ee6a4SAndroid Build Coastguard Worker wait_until_swap_state_change(
147*bb4ee6a4SAndroid Build Coastguard Worker &mut vm,
148*bb4ee6a4SAndroid Build Coastguard Worker SwapState::Pending,
149*bb4ee6a4SAndroid Build Coastguard Worker &[SwapState::TrimInProgress],
150*bb4ee6a4SAndroid Build Coastguard Worker SWAP_STATE_CHANGE_TIMEOUT,
151*bb4ee6a4SAndroid Build Coastguard Worker )
152*bb4ee6a4SAndroid Build Coastguard Worker .unwrap();
153*bb4ee6a4SAndroid Build Coastguard Worker vm.swap_command("out").unwrap();
154*bb4ee6a4SAndroid Build Coastguard Worker wait_until_swap_state_change(
155*bb4ee6a4SAndroid Build Coastguard Worker &mut vm,
156*bb4ee6a4SAndroid Build Coastguard Worker SwapState::Active,
157*bb4ee6a4SAndroid Build Coastguard Worker &[SwapState::SwapOutInProgress],
158*bb4ee6a4SAndroid Build Coastguard Worker SWAP_STATE_CHANGE_TIMEOUT,
159*bb4ee6a4SAndroid Build Coastguard Worker )
160*bb4ee6a4SAndroid Build Coastguard Worker .unwrap();
161*bb4ee6a4SAndroid Build Coastguard Worker vm.swap_command("enable").unwrap();
162*bb4ee6a4SAndroid Build Coastguard Worker assert_eq!(get_swap_state(&mut vm), SwapState::Pending);
163*bb4ee6a4SAndroid Build Coastguard Worker vm.swap_command("disable").unwrap();
164*bb4ee6a4SAndroid Build Coastguard Worker wait_until_swap_state_change(
165*bb4ee6a4SAndroid Build Coastguard Worker &mut vm,
166*bb4ee6a4SAndroid Build Coastguard Worker SwapState::Ready,
167*bb4ee6a4SAndroid Build Coastguard Worker &[SwapState::SwapInInProgress],
168*bb4ee6a4SAndroid Build Coastguard Worker SWAP_STATE_CHANGE_TIMEOUT,
169*bb4ee6a4SAndroid Build Coastguard Worker )
170*bb4ee6a4SAndroid Build Coastguard Worker .unwrap();
171*bb4ee6a4SAndroid Build Coastguard Worker }
172*bb4ee6a4SAndroid Build Coastguard Worker
173*bb4ee6a4SAndroid Build Coastguard Worker #[test]
swap_out_multiple_times()174*bb4ee6a4SAndroid Build Coastguard Worker fn swap_out_multiple_times() {
175*bb4ee6a4SAndroid Build Coastguard Worker call_test_with_sudo("swap_out_multiple_times_impl");
176*bb4ee6a4SAndroid Build Coastguard Worker }
177*bb4ee6a4SAndroid Build Coastguard Worker
178*bb4ee6a4SAndroid Build Coastguard Worker #[ignore = "Only to be called by swap_disabled_without_swapped_out"]
179*bb4ee6a4SAndroid Build Coastguard Worker #[test]
swap_disabled_without_swapped_out_impl()180*bb4ee6a4SAndroid Build Coastguard Worker fn swap_disabled_without_swapped_out_impl() {
181*bb4ee6a4SAndroid Build Coastguard Worker let mut config = Config::new();
182*bb4ee6a4SAndroid Build Coastguard Worker config = config.extra_args(vec!["--swap".to_string(), ".".to_string()]);
183*bb4ee6a4SAndroid Build Coastguard Worker let mut vm = TestVm::new_sudo(config).unwrap();
184*bb4ee6a4SAndroid Build Coastguard Worker
185*bb4ee6a4SAndroid Build Coastguard Worker assert_eq!(get_swap_state(&mut vm), SwapState::Ready);
186*bb4ee6a4SAndroid Build Coastguard Worker vm.swap_command("enable").unwrap();
187*bb4ee6a4SAndroid Build Coastguard Worker assert_eq!(get_swap_state(&mut vm), SwapState::Pending);
188*bb4ee6a4SAndroid Build Coastguard Worker vm.swap_command("disable").unwrap();
189*bb4ee6a4SAndroid Build Coastguard Worker wait_until_swap_state_change(
190*bb4ee6a4SAndroid Build Coastguard Worker &mut vm,
191*bb4ee6a4SAndroid Build Coastguard Worker SwapState::Ready,
192*bb4ee6a4SAndroid Build Coastguard Worker &[SwapState::SwapInInProgress],
193*bb4ee6a4SAndroid Build Coastguard Worker SWAP_STATE_CHANGE_TIMEOUT,
194*bb4ee6a4SAndroid Build Coastguard Worker )
195*bb4ee6a4SAndroid Build Coastguard Worker .unwrap();
196*bb4ee6a4SAndroid Build Coastguard Worker }
197*bb4ee6a4SAndroid Build Coastguard Worker
198*bb4ee6a4SAndroid Build Coastguard Worker #[test]
swap_disabled_without_swapped_out()199*bb4ee6a4SAndroid Build Coastguard Worker fn swap_disabled_without_swapped_out() {
200*bb4ee6a4SAndroid Build Coastguard Worker call_test_with_sudo("swap_disabled_without_swapped_out_impl");
201*bb4ee6a4SAndroid Build Coastguard Worker }
202*bb4ee6a4SAndroid Build Coastguard Worker
203*bb4ee6a4SAndroid Build Coastguard Worker #[ignore = "Only to be called by stopped_with_swap_enabled"]
204*bb4ee6a4SAndroid Build Coastguard Worker #[test]
stopped_with_swap_enabled_impl()205*bb4ee6a4SAndroid Build Coastguard Worker fn stopped_with_swap_enabled_impl() {
206*bb4ee6a4SAndroid Build Coastguard Worker let mut config = Config::new();
207*bb4ee6a4SAndroid Build Coastguard Worker config = config.extra_args(vec!["--swap".to_string(), ".".to_string()]);
208*bb4ee6a4SAndroid Build Coastguard Worker let mut vm = TestVm::new_sudo(config).unwrap();
209*bb4ee6a4SAndroid Build Coastguard Worker
210*bb4ee6a4SAndroid Build Coastguard Worker assert_eq!(get_swap_state(&mut vm), SwapState::Ready);
211*bb4ee6a4SAndroid Build Coastguard Worker vm.swap_command("enable").unwrap();
212*bb4ee6a4SAndroid Build Coastguard Worker assert_eq!(get_swap_state(&mut vm), SwapState::Pending);
213*bb4ee6a4SAndroid Build Coastguard Worker vm.swap_command("trim").unwrap();
214*bb4ee6a4SAndroid Build Coastguard Worker wait_until_swap_state_change(
215*bb4ee6a4SAndroid Build Coastguard Worker &mut vm,
216*bb4ee6a4SAndroid Build Coastguard Worker SwapState::Pending,
217*bb4ee6a4SAndroid Build Coastguard Worker &[SwapState::TrimInProgress],
218*bb4ee6a4SAndroid Build Coastguard Worker SWAP_STATE_CHANGE_TIMEOUT,
219*bb4ee6a4SAndroid Build Coastguard Worker )
220*bb4ee6a4SAndroid Build Coastguard Worker .unwrap();
221*bb4ee6a4SAndroid Build Coastguard Worker vm.swap_command("out").unwrap();
222*bb4ee6a4SAndroid Build Coastguard Worker wait_until_swap_state_change(
223*bb4ee6a4SAndroid Build Coastguard Worker &mut vm,
224*bb4ee6a4SAndroid Build Coastguard Worker SwapState::Active,
225*bb4ee6a4SAndroid Build Coastguard Worker &[SwapState::SwapOutInProgress],
226*bb4ee6a4SAndroid Build Coastguard Worker SWAP_STATE_CHANGE_TIMEOUT,
227*bb4ee6a4SAndroid Build Coastguard Worker )
228*bb4ee6a4SAndroid Build Coastguard Worker .unwrap();
229*bb4ee6a4SAndroid Build Coastguard Worker // dropping TestVm sends crosvm stop command and wait until the process exits.
230*bb4ee6a4SAndroid Build Coastguard Worker }
231*bb4ee6a4SAndroid Build Coastguard Worker
232*bb4ee6a4SAndroid Build Coastguard Worker #[test]
stopped_with_swap_enabled()233*bb4ee6a4SAndroid Build Coastguard Worker fn stopped_with_swap_enabled() {
234*bb4ee6a4SAndroid Build Coastguard Worker call_test_with_sudo("stopped_with_swap_enabled_impl");
235*bb4ee6a4SAndroid Build Coastguard Worker }
236*bb4ee6a4SAndroid Build Coastguard Worker
237*bb4ee6a4SAndroid Build Coastguard Worker #[ignore = "Only to be called by memory_contents_preserved_while_vmm_swap_enabled"]
238*bb4ee6a4SAndroid Build Coastguard Worker #[test]
memory_contents_preserved_while_vmm_swap_enabled_impl()239*bb4ee6a4SAndroid Build Coastguard Worker fn memory_contents_preserved_while_vmm_swap_enabled_impl() {
240*bb4ee6a4SAndroid Build Coastguard Worker let mut config = Config::new();
241*bb4ee6a4SAndroid Build Coastguard Worker config = config.extra_args(vec!["--swap".to_string(), ".".to_string()]);
242*bb4ee6a4SAndroid Build Coastguard Worker let mut vm = TestVm::new_sudo(config).unwrap();
243*bb4ee6a4SAndroid Build Coastguard Worker create_tmpfs_file_in_guest(&mut vm, 1024 * 1024);
244*bb4ee6a4SAndroid Build Coastguard Worker let checksum = load_checksum_tmpfs_file(&mut vm);
245*bb4ee6a4SAndroid Build Coastguard Worker
246*bb4ee6a4SAndroid Build Coastguard Worker assert_eq!(get_swap_state(&mut vm), SwapState::Ready);
247*bb4ee6a4SAndroid Build Coastguard Worker vm.swap_command("enable").unwrap();
248*bb4ee6a4SAndroid Build Coastguard Worker assert_eq!(get_swap_state(&mut vm), SwapState::Pending);
249*bb4ee6a4SAndroid Build Coastguard Worker
250*bb4ee6a4SAndroid Build Coastguard Worker assert_eq!(load_checksum_tmpfs_file(&mut vm), checksum);
251*bb4ee6a4SAndroid Build Coastguard Worker }
252*bb4ee6a4SAndroid Build Coastguard Worker
253*bb4ee6a4SAndroid Build Coastguard Worker #[test]
memory_contents_preserved_while_vmm_swap_enabled()254*bb4ee6a4SAndroid Build Coastguard Worker fn memory_contents_preserved_while_vmm_swap_enabled() {
255*bb4ee6a4SAndroid Build Coastguard Worker call_test_with_sudo("memory_contents_preserved_while_vmm_swap_enabled_impl");
256*bb4ee6a4SAndroid Build Coastguard Worker }
257*bb4ee6a4SAndroid Build Coastguard Worker
258*bb4ee6a4SAndroid Build Coastguard Worker #[ignore = "Only to be called by memory_contents_preserved_after_vmm_swap_out"]
259*bb4ee6a4SAndroid Build Coastguard Worker #[test]
memory_contents_preserved_after_vmm_swap_out_impl()260*bb4ee6a4SAndroid Build Coastguard Worker fn memory_contents_preserved_after_vmm_swap_out_impl() {
261*bb4ee6a4SAndroid Build Coastguard Worker let mut config = Config::new();
262*bb4ee6a4SAndroid Build Coastguard Worker config = config.extra_args(vec!["--swap".to_string(), ".".to_string()]);
263*bb4ee6a4SAndroid Build Coastguard Worker let mut vm = TestVm::new_sudo(config).unwrap();
264*bb4ee6a4SAndroid Build Coastguard Worker create_tmpfs_file_in_guest(&mut vm, 1024 * 1024);
265*bb4ee6a4SAndroid Build Coastguard Worker let checksum = load_checksum_tmpfs_file(&mut vm);
266*bb4ee6a4SAndroid Build Coastguard Worker
267*bb4ee6a4SAndroid Build Coastguard Worker assert_eq!(get_swap_state(&mut vm), SwapState::Ready);
268*bb4ee6a4SAndroid Build Coastguard Worker vm.swap_command("enable").unwrap();
269*bb4ee6a4SAndroid Build Coastguard Worker assert_eq!(get_swap_state(&mut vm), SwapState::Pending);
270*bb4ee6a4SAndroid Build Coastguard Worker vm.swap_command("trim").unwrap();
271*bb4ee6a4SAndroid Build Coastguard Worker wait_until_swap_state_change(
272*bb4ee6a4SAndroid Build Coastguard Worker &mut vm,
273*bb4ee6a4SAndroid Build Coastguard Worker SwapState::Pending,
274*bb4ee6a4SAndroid Build Coastguard Worker &[SwapState::TrimInProgress],
275*bb4ee6a4SAndroid Build Coastguard Worker SWAP_STATE_CHANGE_TIMEOUT,
276*bb4ee6a4SAndroid Build Coastguard Worker )
277*bb4ee6a4SAndroid Build Coastguard Worker .unwrap();
278*bb4ee6a4SAndroid Build Coastguard Worker vm.swap_command("out").unwrap();
279*bb4ee6a4SAndroid Build Coastguard Worker wait_until_swap_state_change(
280*bb4ee6a4SAndroid Build Coastguard Worker &mut vm,
281*bb4ee6a4SAndroid Build Coastguard Worker SwapState::Active,
282*bb4ee6a4SAndroid Build Coastguard Worker &[SwapState::SwapOutInProgress],
283*bb4ee6a4SAndroid Build Coastguard Worker SWAP_STATE_CHANGE_TIMEOUT,
284*bb4ee6a4SAndroid Build Coastguard Worker )
285*bb4ee6a4SAndroid Build Coastguard Worker .unwrap();
286*bb4ee6a4SAndroid Build Coastguard Worker
287*bb4ee6a4SAndroid Build Coastguard Worker assert_eq!(load_checksum_tmpfs_file(&mut vm), checksum);
288*bb4ee6a4SAndroid Build Coastguard Worker }
289*bb4ee6a4SAndroid Build Coastguard Worker
290*bb4ee6a4SAndroid Build Coastguard Worker #[test]
memory_contents_preserved_after_vmm_swap_out()291*bb4ee6a4SAndroid Build Coastguard Worker fn memory_contents_preserved_after_vmm_swap_out() {
292*bb4ee6a4SAndroid Build Coastguard Worker call_test_with_sudo("memory_contents_preserved_after_vmm_swap_out_impl");
293*bb4ee6a4SAndroid Build Coastguard Worker }
294*bb4ee6a4SAndroid Build Coastguard Worker
295*bb4ee6a4SAndroid Build Coastguard Worker #[ignore = "Only to be called by memory_contents_preserved_after_vmm_swap_disabled"]
296*bb4ee6a4SAndroid Build Coastguard Worker #[test]
memory_contents_preserved_after_vmm_swap_disabled_impl()297*bb4ee6a4SAndroid Build Coastguard Worker fn memory_contents_preserved_after_vmm_swap_disabled_impl() {
298*bb4ee6a4SAndroid Build Coastguard Worker let mut config = Config::new();
299*bb4ee6a4SAndroid Build Coastguard Worker config = config.extra_args(vec!["--swap".to_string(), ".".to_string()]);
300*bb4ee6a4SAndroid Build Coastguard Worker let mut vm = TestVm::new_sudo(config).unwrap();
301*bb4ee6a4SAndroid Build Coastguard Worker create_tmpfs_file_in_guest(&mut vm, 1024 * 1024);
302*bb4ee6a4SAndroid Build Coastguard Worker let checksum = load_checksum_tmpfs_file(&mut vm);
303*bb4ee6a4SAndroid Build Coastguard Worker
304*bb4ee6a4SAndroid Build Coastguard Worker assert_eq!(get_swap_state(&mut vm), SwapState::Ready);
305*bb4ee6a4SAndroid Build Coastguard Worker vm.swap_command("enable").unwrap();
306*bb4ee6a4SAndroid Build Coastguard Worker assert_eq!(get_swap_state(&mut vm), SwapState::Pending);
307*bb4ee6a4SAndroid Build Coastguard Worker vm.swap_command("trim").unwrap();
308*bb4ee6a4SAndroid Build Coastguard Worker wait_until_swap_state_change(
309*bb4ee6a4SAndroid Build Coastguard Worker &mut vm,
310*bb4ee6a4SAndroid Build Coastguard Worker SwapState::Pending,
311*bb4ee6a4SAndroid Build Coastguard Worker &[SwapState::TrimInProgress],
312*bb4ee6a4SAndroid Build Coastguard Worker SWAP_STATE_CHANGE_TIMEOUT,
313*bb4ee6a4SAndroid Build Coastguard Worker )
314*bb4ee6a4SAndroid Build Coastguard Worker .unwrap();
315*bb4ee6a4SAndroid Build Coastguard Worker vm.swap_command("out").unwrap();
316*bb4ee6a4SAndroid Build Coastguard Worker wait_until_swap_state_change(
317*bb4ee6a4SAndroid Build Coastguard Worker &mut vm,
318*bb4ee6a4SAndroid Build Coastguard Worker SwapState::Active,
319*bb4ee6a4SAndroid Build Coastguard Worker &[SwapState::SwapOutInProgress],
320*bb4ee6a4SAndroid Build Coastguard Worker SWAP_STATE_CHANGE_TIMEOUT,
321*bb4ee6a4SAndroid Build Coastguard Worker )
322*bb4ee6a4SAndroid Build Coastguard Worker .unwrap();
323*bb4ee6a4SAndroid Build Coastguard Worker vm.swap_command("disable").unwrap();
324*bb4ee6a4SAndroid Build Coastguard Worker wait_until_swap_state_change(
325*bb4ee6a4SAndroid Build Coastguard Worker &mut vm,
326*bb4ee6a4SAndroid Build Coastguard Worker SwapState::Ready,
327*bb4ee6a4SAndroid Build Coastguard Worker &[SwapState::SwapInInProgress],
328*bb4ee6a4SAndroid Build Coastguard Worker SWAP_STATE_CHANGE_TIMEOUT,
329*bb4ee6a4SAndroid Build Coastguard Worker )
330*bb4ee6a4SAndroid Build Coastguard Worker .unwrap();
331*bb4ee6a4SAndroid Build Coastguard Worker
332*bb4ee6a4SAndroid Build Coastguard Worker assert_eq!(load_checksum_tmpfs_file(&mut vm), checksum);
333*bb4ee6a4SAndroid Build Coastguard Worker }
334*bb4ee6a4SAndroid Build Coastguard Worker
335*bb4ee6a4SAndroid Build Coastguard Worker #[test]
memory_contents_preserved_after_vmm_swap_disabled()336*bb4ee6a4SAndroid Build Coastguard Worker fn memory_contents_preserved_after_vmm_swap_disabled() {
337*bb4ee6a4SAndroid Build Coastguard Worker call_test_with_sudo("memory_contents_preserved_after_vmm_swap_disabled_impl");
338*bb4ee6a4SAndroid Build Coastguard Worker }
339