|
10 | 10 | //! * `s06_*`: Rackscale (distributed) tests |
11 | 11 |
|
12 | 12 | use rexpect::errors::*; |
| 13 | +use rexpect::process::signal::SIGTERM; |
13 | 14 | use rexpect::process::wait::WaitStatus; |
14 | 15 |
|
15 | | -use testutils::builder::BuildArgs; |
| 16 | +use testutils::builder::{BuildArgs, Machine}; |
16 | 17 | use testutils::helpers::{ |
17 | 18 | setup_network, setup_shmem, spawn_dcm, spawn_nrk, SHMEM_PATH, SHMEM_SIZE, |
18 | 19 | }; |
19 | | -use testutils::runner_args::{check_for_successful_exit, RunnerArgs}; |
| 20 | +use testutils::runner_args::{check_for_successful_exit, wait_for_sigterm, RunnerArgs}; |
20 | 21 |
|
21 | 22 | #[cfg(not(feature = "baremetal"))] |
22 | 23 | #[test] |
@@ -479,3 +480,117 @@ fn s06_rackscale_shmem_multiinstance() { |
479 | 480 |
|
480 | 481 | let _ignore = remove_file(SHMEM_PATH); |
481 | 482 | } |
| 483 | + |
| 484 | +#[cfg(not(feature = "baremetal"))] |
| 485 | +#[test] |
| 486 | +fn s06_rackscale_shmem_userspace_multicore_test() { |
| 487 | + rackscale_userspace_multicore_test(true); |
| 488 | +} |
| 489 | + |
| 490 | +#[cfg(not(feature = "baremetal"))] |
| 491 | +#[test] |
| 492 | +fn s06_rackscale_ethernet_userspace_multicore_test() { |
| 493 | + rackscale_userspace_multicore_test(false); |
| 494 | +} |
| 495 | + |
| 496 | +#[cfg(not(feature = "baremetal"))] |
| 497 | +fn rackscale_userspace_multicore_test(is_shmem: bool) { |
| 498 | + use std::fs::remove_file; |
| 499 | + use std::sync::Arc; |
| 500 | + use std::thread::sleep; |
| 501 | + use std::time::Duration; |
| 502 | + |
| 503 | + // Setup ivshmem file |
| 504 | + setup_shmem(SHMEM_PATH, SHMEM_SIZE); |
| 505 | + |
| 506 | + setup_network(2); |
| 507 | + let timeout = 30_000; |
| 508 | + |
| 509 | + let machine = Machine::determine(); |
| 510 | + let client_num_cores: usize = machine.max_cores() - 1; |
| 511 | + |
| 512 | + // Create build for both controller and client |
| 513 | + let build = Arc::new( |
| 514 | + BuildArgs::default() |
| 515 | + .module("init") |
| 516 | + .user_feature("test-scheduler-smp") |
| 517 | + .kernel_feature("shmem") |
| 518 | + .kernel_feature("ethernet") |
| 519 | + .kernel_feature("rackscale") |
| 520 | + .release() |
| 521 | + .build(), |
| 522 | + ); |
| 523 | + |
| 524 | + // Run DCM and controller in separate thread |
| 525 | + let build1 = build.clone(); |
| 526 | + let controller = std::thread::spawn(move || { |
| 527 | + let controller_cmd = if is_shmem { |
| 528 | + "mode=controller transport=shmem" |
| 529 | + } else { |
| 530 | + "mode=controller transport=ethernet" |
| 531 | + }; |
| 532 | + let cmdline_controller = RunnerArgs::new_with_build("userspace-smp", &build1) |
| 533 | + .timeout(timeout) |
| 534 | + .cmd(controller_cmd) |
| 535 | + .shmem_size(SHMEM_SIZE as usize) |
| 536 | + .shmem_path(SHMEM_PATH) |
| 537 | + .tap("tap0") |
| 538 | + .no_network_setup() |
| 539 | + .workers(2) |
| 540 | + .use_vmxnet3(); |
| 541 | + |
| 542 | + let mut output = String::new(); |
| 543 | + let mut qemu_run = || -> Result<WaitStatus> { |
| 544 | + let mut dcm = spawn_dcm(1, timeout)?; |
| 545 | + let mut p = spawn_nrk(&cmdline_controller)?; |
| 546 | + |
| 547 | + //output += p.exp_string("Finished sending requests!")?.as_str(); |
| 548 | + output += p.exp_eof()?.as_str(); |
| 549 | + |
| 550 | + dcm.send_control('c')?; |
| 551 | + p.process.exit() |
| 552 | + }; |
| 553 | + |
| 554 | + let _ignore = qemu_run(); |
| 555 | + }); |
| 556 | + |
| 557 | + // Run client in separate thead. Wait a bit to make sure DCM and controller started |
| 558 | + let build2 = build.clone(); |
| 559 | + let _client = std::thread::spawn(move || { |
| 560 | + sleep(Duration::from_millis(5_000)); |
| 561 | + let client_cmd = if is_shmem { |
| 562 | + "mode=client transport=shmem" |
| 563 | + } else { |
| 564 | + "mode=client transport=ethernet" |
| 565 | + }; |
| 566 | + let cmdline_client = RunnerArgs::new_with_build("userspace-smp", &build2) |
| 567 | + .timeout(timeout) |
| 568 | + .cmd(client_cmd) |
| 569 | + .shmem_size(SHMEM_SIZE as usize) |
| 570 | + .shmem_path(SHMEM_PATH) |
| 571 | + .tap("tap2") |
| 572 | + .no_network_setup() |
| 573 | + .workers(2) |
| 574 | + .cores(client_num_cores) |
| 575 | + .memory(4096) |
| 576 | + .use_vmxnet3(); |
| 577 | + |
| 578 | + let mut output = String::new(); |
| 579 | + let mut qemu_run = || -> Result<WaitStatus> { |
| 580 | + let mut p = spawn_nrk(&cmdline_client)?; |
| 581 | + |
| 582 | + for _i in 0..client_num_cores { |
| 583 | + let r = p.exp_regex(r#"init: Hello from core (\d+)"#)?; |
| 584 | + output += r.0.as_str(); |
| 585 | + output += r.1.as_str(); |
| 586 | + } |
| 587 | + p.process.kill(SIGTERM) |
| 588 | + }; |
| 589 | + |
| 590 | + wait_for_sigterm(&cmdline_client, qemu_run(), output); |
| 591 | + }); |
| 592 | + |
| 593 | + controller.join().unwrap(); |
| 594 | + |
| 595 | + let _ignore = remove_file(SHMEM_PATH); |
| 596 | +} |
0 commit comments