diff options
Diffstat (limited to 'tvix/boot/tests/default.nix')
-rw-r--r-- | tvix/boot/tests/default.nix | 138 |
1 files changed, 138 insertions, 0 deletions
diff --git a/tvix/boot/tests/default.nix b/tvix/boot/tests/default.nix new file mode 100644 index 0000000000..d16dba79f1 --- /dev/null +++ b/tvix/boot/tests/default.nix @@ -0,0 +1,138 @@ +{ depot, pkgs, lib, ... }: + +let + # Seed a tvix-store with the tvix docs, then start a VM, ask it to list all + # files in /nix/store, and ensure the store path is present, which acts as a + # nice smoketest. + mkBootTest = + { blobServiceAddr ? "memory://" + , directoryServiceAddr ? "memory://" + , pathInfoServiceAddr ? "memory://" + + + # The path to import. + , path + + # Whether the path should be imported as a closure. + # If false, importPathName must be specified. + , isClosure ? false + , importPathName ? null + + # The cmdline to pass to the VM. + # Defaults to tvix.find, which lists all files in the store. + , vmCmdline ? "tvix.find" + # The string we expect to find in the VM output. + # Defaults the value of `path` (the store path we upload). + , assertVMOutput ? path + }: + + assert isClosure -> importPathName == null; + assert (!isClosure) -> importPathName != null; + + pkgs.stdenv.mkDerivation { + name = "run-vm"; + + __structuredAttrs = true; + exportReferencesGraph.closure = [ path ]; + + nativeBuildInputs = [ + depot.tvix.store + depot.tvix.boot.runVM + ]; + buildCommand = '' + touch $out + + # Start the tvix daemon, listening on a unix socket. + BLOB_SERVICE_ADDR=${blobServiceAddr} \ + DIRECTORY_SERVICE_ADDR=${directoryServiceAddr} \ + PATH_INFO_SERVICE_ADDR=${pathInfoServiceAddr} \ + tvix-store \ + --otlp=false \ + daemon -l $PWD/tvix-store.sock & + + # Wait for the socket to be created. + while [ ! -e $PWD/tvix-store.sock ]; do sleep 1; done + + # Export env vars so that subsequent tvix-store commands will talk to + # our tvix-store daemon over the unix socket. + export BLOB_SERVICE_ADDR=grpc+unix://$PWD/tvix-store.sock + export DIRECTORY_SERVICE_ADDR=grpc+unix://$PWD/tvix-store.sock + export PATH_INFO_SERVICE_ADDR=grpc+unix://$PWD/tvix-store.sock + '' + lib.optionalString (!isClosure) '' + echo "Importing ${path} into tvix-store with name ${importPathName}…" + cp -R ${path} ${importPathName} + outpath=$(tvix-store import ${importPathName}) + + echo "imported to $outpath" + '' + lib.optionalString (isClosure) '' + echo "Copying closure ${path}…" + # This picks up the `closure` key in `$NIX_ATTRS_JSON_FILE` automatically. + tvix-store --otlp=false copy + '' + '' + # Invoke a VM using tvix as the backing store, ensure the outpath appears in its listing. + echo "Starting VM…" + + CH_CMDLINE="${vmCmdline}" run-tvix-vm 2>&1 | tee output.txt + grep "${assertVMOutput}" output.txt + ''; + requiredSystemFeatures = [ "kvm" ]; + }; + + systemFor = sys: (depot.ops.nixos.nixosFor sys).system; + + testSystem = systemFor ({ modulesPath, pkgs, ... }: { + # Set some options necessary to evaluate. + boot.loader.systemd-boot.enable = true; + # TODO: figure out how to disable this without causing eval to fail + fileSystems."/" = { + device = "/dev/root"; + fsType = "tmpfs"; + }; + + services.getty.helpLine = "Onwards and upwards."; + systemd.services.do-shutdown = { + after = [ "getty.target" ]; + description = "Shut down again"; + wantedBy = [ "multi-user.target" ]; + serviceConfig.Type = "oneshot"; + script = "/run/current-system/sw/bin/systemctl poweroff --when=+10s"; + }; + + # Don't warn about stateVersion. + system.stateVersion = "24.05"; + }); + +in +depot.nix.readTree.drvTargets +{ + docs-memory = (mkBootTest { + path = ../../docs; + importPathName = "docs"; + }); + docs-sled = (mkBootTest { + blobServiceAddr = "sled://$PWD/blobs.sled"; + directoryServiceAddr = "sled://$PWD/directories.sled"; + pathInfoServiceAddr = "sled://$PWD/pathinfo.sled"; + path = ../../docs; + importPathName = "docs"; + }); + docs-objectstore-local = (mkBootTest { + blobServiceAddr = "objectstore+file://$PWD/blobs"; + path = ../../docs; + importPathName = "docs"; + }); + + closure-tvix = (mkBootTest { + blobServiceAddr = "objectstore+file://$PWD/blobs"; + path = depot.tvix.store; + isClosure = true; + }); + + closure-nixos = (mkBootTest { + blobServiceAddr = "objectstore+file://$PWD/blobs"; + path = testSystem; + isClosure = true; + vmCmdline = "init=${testSystem}/init panic=-1"; # reboot immediately on panic + assertVMOutput = "Onwards and upwards."; + }); +} |