Skip to content

Commit 5fd1d2e

Browse files
committed
Add test for console_vm precondition check
Signed-off-by: Guvenc Gulce <[email protected]>
1 parent 12a4dcb commit 5fd1d2e

File tree

2 files changed

+53
-7
lines changed

2 files changed

+53
-7
lines changed

feos/services/vm-service/src/dispatcher_handlers.rs

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -441,8 +441,7 @@ pub(crate) async fn handle_stream_vm_console_command(
441441
Err(e) => {
442442
if output_tx.send(Err(e.into())).await.is_err() {
443443
warn!(
444-
"StreamConsole: Client for {} disconnected before error could be sent.",
445-
vm_id_str
444+
"StreamConsole: Client for {vm_id_str} disconnected before error could be sent."
446445
);
447446
}
448447
return;
@@ -457,8 +456,7 @@ pub(crate) async fn handle_stream_vm_console_command(
457456
.into();
458457
if output_tx.send(Err(status)).await.is_err() {
459458
warn!(
460-
"StreamConsole: Client for {} disconnected before precondition error could be sent.",
461-
vm_id_str
459+
"StreamConsole: Client for {vm_id_str} disconnected before precondition error could be sent."
462460
);
463461
}
464462
return;

feos/tests/integration_tests.rs

Lines changed: 51 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,10 @@ use feos_proto::{
1212
ListImagesRequest, PullImageRequest, WatchImageStatusRequest,
1313
},
1414
vm_service::{
15-
vm_service_client::VmServiceClient, CpuConfig, CreateVmRequest, DeleteVmRequest,
16-
GetVmRequest, MemoryConfig, PauseVmRequest, PingVmRequest, ResumeVmRequest,
17-
ShutdownVmRequest, StartVmRequest, StreamVmEventsRequest, VmConfig, VmEvent, VmState,
15+
stream_vm_console_request as console_input, vm_service_client::VmServiceClient,
16+
AttachConsoleMessage, CpuConfig, CreateVmRequest, DeleteVmRequest, GetVmRequest,
17+
MemoryConfig, PauseVmRequest, PingVmRequest, ResumeVmRequest, ShutdownVmRequest,
18+
StartVmRequest, StreamVmConsoleRequest, StreamVmEventsRequest, VmConfig, VmEvent, VmState,
1819
VmStateChangedEvent,
1920
},
2021
};
@@ -293,6 +294,53 @@ async fn test_create_and_start_vm() -> Result<()> {
293294
let result = vm_client.resume_vm(resume_req.clone()).await;
294295
assert!(result.is_err(), "ResumeVm should fail when VM is Stopped");
295296

297+
info!(
298+
"Calling StreamVmConsole in Stopped state for vm_id: {}, expecting error",
299+
&vm_id
300+
);
301+
let (console_tx, console_rx) = tokio::sync::mpsc::channel(1);
302+
let console_stream = tokio_stream::wrappers::ReceiverStream::new(console_rx);
303+
304+
let attach_payload = console_input::Payload::Attach(AttachConsoleMessage {
305+
vm_id: vm_id.clone(),
306+
});
307+
let attach_input = StreamVmConsoleRequest {
308+
payload: Some(attach_payload),
309+
};
310+
311+
console_tx
312+
.send(attach_input)
313+
.await
314+
.expect("Failed to send attach message");
315+
316+
let response = vm_client.stream_vm_console(console_stream).await;
317+
assert!(
318+
response.is_ok(),
319+
"StreamVmConsole should establish stream successfully"
320+
);
321+
322+
let mut output_stream = response.unwrap().into_inner();
323+
324+
let stream_result = output_stream.next().await;
325+
match stream_result {
326+
Some(Err(status)) => {
327+
info!(
328+
"Received expected error from console stream: {}",
329+
status.message()
330+
);
331+
assert!(
332+
status.message().contains("Invalid VM state")
333+
|| status.message().contains("Stopped"),
334+
"Error should be about invalid VM state, got: {}",
335+
status.message()
336+
);
337+
}
338+
Some(Ok(_)) => {
339+
panic!("StreamVmConsole should fail when VM is Stopped, but got success response")
340+
}
341+
None => panic!("StreamVmConsole stream ended unexpectedly without error"),
342+
}
343+
296344
info!("Sending StartVm request again for vm_id: {}", &vm_id);
297345
vm_client.start_vm(start_req).await?;
298346

0 commit comments

Comments
 (0)