NixOS VM tests: Difference between revisions

imported>Olafklingt
move haskellforall example from nix.dev here
6543 (talk | contribs)
pictures just describe things better sometime
 
(8 intermediate revisions by 7 users not shown)
Line 1: Line 1:
WARNING: this page is mostly outdated as https://nixos.org/manual/nixos/stable/#chap-developing-the-test-driver mentions that  <code>pkgs.nixosTest</code>, <code>testing-python.nix</code> and <code>make-test-python.nix</code> are outdated. Beside the documentation, you may also like https://nix.dev/tutorials/nixos/integration-testing-using-virtual-machines.html
The primary documentation for the [https://nixos.org/manual/nixos/stable/index.html#sec-nixos-tests NixOS VM testing framework] is in [https://nixos.org/manual/nixos/stable/index.html#sec-nixos-tests the NixOS manual], and in [https://nixos.org/manual/nixpkgs/unstable/#tester-runNixOSTest the Nixpkgs manual]. A tutorial can be found at [https://nix.dev/tutorials/nixos/integration-testing-using-virtual-machines].
The primary documentation for the [https://nixos.org/manual/nixos/stable/index.html#sec-nixos-tests NixOS VM testing framework] is in [https://nixos.org/manual/nixos/stable/index.html#sec-nixos-tests the NixOS manual], and in [https://nixos.org/manual/nixpkgs/unstable/#tester-runNixOSTest the Nixpkgs manual]. A tutorial can be found at [https://nix.dev/tutorials/nixos/integration-testing-using-virtual-machines].


The test infrastructure entry point is nixos/lib/testing.nix. Alternatively, for out-of-tree tests you can invoke it via Nixpkgs as the nixosTest function, which reuses your already evaluated Nixpkgs to generate your node configurations.
The test infrastructure entry point is nixos/lib/testing.nix. Alternatively, for out-of-tree tests you can invoke it via Nixpkgs as the nixosTest function, which reuses your already evaluated Nixpkgs to generate your node configurations.
The test infra relies on the qemu build-vm code to generate virtual machines.
The test infra relies on the qemu build-vm code to generate virtual machines.


It will generate a test driver (a wrapper of nixos/lib/test-driver/test-driver.py) in charge of creating the network.
It will generate a test driver (a wrapper of nixos/lib/test-driver/test-driver.py) in charge of creating the network.
Line 11: Line 16:
The wrapper `bin/nixos-run-vms` is in charge to start the driver with the correct VM script as arguments.
The wrapper `bin/nixos-run-vms` is in charge to start the driver with the correct VM script as arguments.


Once the driver is loaded, depending on the environment variables `tests` it will run in an interactive mode or run some perl code (`testScript`).
Once the driver is loaded, depending on the environment variables `tests` it will run in an interactive mode or run some python code (`test_script()`).
In interactive mode, you can run `start_all` followed by `join_all` to start and keep the VM alive
In interactive mode, you can run `start_all()` to start and keep the VM alive


== Connecting to an interactive VM via SSH ==
Add this to your test config:
interactive.sshBackdoor.enable = true;
Now you can connect to this VM via (on linux):
ssh -o User=root vsock/3
If you are on MacOS or have multiple VMs look at the shell output that do run the interactive tests:
[[File:Screenshot of interactive test just started.png|none|thumb|444x444px|Screenshot of just started nixos test for meilisearch (interactive)]]


== How to debug tests ? ==
== How to debug tests ? ==
Line 25: Line 40:
== I don't see any prompt ? (qemu window pitch black) ==
== I don't see any prompt ? (qemu window pitch black) ==


Check the output for `malformed JSON string, neither array, object, number, string or atom, at character offset 0 (before "\x{0}\x{0}\x{0}\x{0}...") at /nix/store/1hkp2n6hz3ybf2rvkjkwrzgbjkrrakzl-update-users-groups.pl line 11`.
Check the output for  
 
<code>malformed JSON string, neither array, object, number, string or atom, at character offset 0 (before "\x{0}\x{0}\x{0}\x{0}...") at /nix/store/1hkp2n6hz3ybf2rvkjkwrzgbjkrrakzl-update-users-groups.pl line 11`</code>
 
You should purge the state present in rm -rf /tmp/vm-state-<VM_NAME>
You should purge the state present in rm -rf /tmp/vm-state-<VM_NAME>


Line 369: Line 387:
   (0.00 seconds)
   (0.00 seconds)
   /nix/store/bx7z3imvxxpwkkza10vb23czhw7873w2-vm-test-run-unnamed
   /nix/store/bx7z3imvxxpwkkza10vb23czhw7873w2-vm-test-run-unnamed
[[Category:NixOS]]