aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--.gitignore5
-rw-r--r--flake.nix47
-rw-r--r--test/interactive/configuration.nix60
-rw-r--r--test/interactive/hakurei.nix25
-rw-r--r--test/interactive/vm.nix55
5 files changed, 191 insertions, 1 deletions
diff --git a/.gitignore b/.gitignore
index 0fbb8ee9..fbc14bdf 100644
--- a/.gitignore
+++ b/.gitignore
@@ -29,4 +29,7 @@ go.work.sum
/cmd/hakurei/LICENSE
# release
-/dist/hakurei-* \ No newline at end of file
+/dist/hakurei-*
+
+# interactive nixos vm
+nixos.qcow2 \ No newline at end of file
diff --git a/flake.nix b/flake.nix
index b4f9e39d..556f7762 100644
--- a/flake.nix
+++ b/flake.nix
@@ -159,6 +159,53 @@
default = pkgs.mkShell { buildInputs = hakurei.targetPkgs; };
withPackage = pkgs.mkShell { buildInputs = [ hakurei ] ++ hakurei.targetPkgs; };
+ vm =
+ let
+ nixos = nixpkgs.lib.nixosSystem {
+ inherit system;
+ modules = [
+ {
+ environment = {
+ systemPackages = [
+ (pkgs.buildFHSEnv {
+ pname = "hakurei-fhs";
+ inherit (hakurei) version;
+ targetPkgs = _: hakurei.targetPkgs;
+ extraOutputsToInstall = [ "dev" ];
+ profile = ''
+ export PKG_CONFIG_PATH="/usr/share/pkgconfig:$PKG_CONFIG_PATH"
+ '';
+ })
+ ];
+
+ hakurei =
+ let
+ # this is used for interactive vm testing during development, where tests might be broken
+ package = self.packages.${pkgs.system}.hakurei.override {
+ buildGoModule = previousArgs: pkgs.pkgsStatic.buildGoModule (previousArgs // { doCheck = false; });
+ };
+ in
+ {
+ inherit package;
+ hsuPackage = self.packages.${pkgs.system}.hsu.override { hakurei = package; };
+ };
+ };
+ }
+
+ ./test/interactive/configuration.nix
+ ./test/interactive/vm.nix
+ ./test/interactive/hakurei.nix
+
+ self.nixosModules.hakurei
+ self.inputs.home-manager.nixosModules.home-manager
+ ];
+ };
+ in
+ pkgs.mkShell {
+ buildInputs = [ nixos.config.system.build.vm ];
+ shellHook = "exec run-nixos-vm $@";
+ };
+
generateDoc =
let
inherit (pkgs) lib;
diff --git a/test/interactive/configuration.nix b/test/interactive/configuration.nix
new file mode 100644
index 00000000..49c90343
--- /dev/null
+++ b/test/interactive/configuration.nix
@@ -0,0 +1,60 @@
+{ pkgs, ... }:
+{
+ system.stateVersion = "23.05";
+
+ users.users = {
+ alice = {
+ isNormalUser = true;
+ description = "Alice Foobar";
+ password = "foobar";
+ uid = 1000;
+ extraGroups = [ "wheel" ];
+ };
+ untrusted = {
+ isNormalUser = true;
+ description = "Untrusted user";
+ password = "foobar";
+ uid = 1001;
+ };
+ };
+
+ home-manager.users.alice.home.stateVersion = "24.11";
+
+ security = {
+ sudo.wheelNeedsPassword = false;
+ rtkit.enable = true;
+ };
+
+ services = {
+ getty.autologinUser = "alice";
+ pipewire = {
+ enable = true;
+ alsa.enable = true;
+ alsa.support32Bit = true;
+ pulse.enable = true;
+ jack.enable = true;
+ };
+ };
+
+ environment.variables = {
+ SWAYSOCK = "/tmp/sway-ipc.sock";
+ WLR_RENDERER = "pixman";
+ };
+
+ programs = {
+ sway.enable = true;
+
+ bash.loginShellInit = ''
+ if [ "$(tty)" = "/dev/tty1" ]; then
+ set -e
+
+ mkdir -p ~/.config/sway
+ (sed s/Mod4/Mod1/ /etc/sway/config &&
+ echo 'output * bg ${pkgs.nixos-artwork.wallpapers.simple-light-gray.gnomeFilePath} fill') > ~/.config/sway/config
+
+ sway --validate
+ systemd-cat --identifier=session sway && touch /tmp/sway-exit-ok
+ fi
+ '';
+ };
+}
diff --git a/test/interactive/hakurei.nix b/test/interactive/hakurei.nix
new file mode 100644
index 00000000..3c96b3c9
--- /dev/null
+++ b/test/interactive/hakurei.nix
@@ -0,0 +1,25 @@
+{ pkgs, ... }:
+{
+ environment.hakurei = {
+ enable = true;
+ stateDir = "/var/lib/hakurei";
+ users.alice = 0;
+ apps = {
+ "cat.gensokyo.extern.foot.noEnablements" = {
+ name = "ne-foot";
+ identity = 1;
+ shareUid = true;
+ verbose = true;
+ share = pkgs.foot;
+ packages = [ pkgs.foot ];
+ command = "foot";
+ capability = {
+ dbus = false;
+ pulse = false;
+ };
+ };
+ };
+
+ extraHomeConfig.home.stateVersion = "23.05";
+ };
+}
diff --git a/test/interactive/vm.nix b/test/interactive/vm.nix
new file mode 100644
index 00000000..c1239a64
--- /dev/null
+++ b/test/interactive/vm.nix
@@ -0,0 +1,55 @@
+{
+ virtualisation.vmVariant.virtualisation = {
+ memorySize = 4096;
+ qemu.options = [
+ "-vga none -device virtio-gpu-pci"
+ "-smp 8"
+ ];
+
+ mountHostNixStore = true;
+ writableStore = true;
+ writableStoreUseTmpfs = false;
+
+ sharedDirectories = {
+ cwd = {
+ target = "/mnt/.ro-cwd";
+ source = ''"$OLDPWD"'';
+ securityModel = "none";
+ };
+ };
+
+ fileSystems = {
+ "/mnt/.ro-cwd".options = [
+ "ro"
+ "noatime"
+ ];
+ "/mnt/cwd".overlay = {
+ lowerdir = [ "/mnt/.ro-cwd" ];
+ upperdir = "/tmp/.cwd/upper";
+ workdir = "/tmp/.cwd/work";
+ };
+
+ "/mnt/src".overlay = {
+ lowerdir = [ ../.. ];
+ upperdir = "/tmp/.src/upper";
+ workdir = "/tmp/.src/work";
+ };
+ };
+ };
+
+ systemd.services = {
+ logrotate-checkconf.enable = false;
+ hakurei-src-fix-ownership = {
+ wantedBy = [ "multi-user.target" ];
+ wants = [ "mnt-src.mount" ];
+ after = [ "mnt-src.mount" ];
+ serviceConfig = {
+ Type = "oneshot";
+ RemainAfterExit = true;
+ };
+ script = ''
+ chown -R alice:users /mnt/src/
+ '';
+ };
+ };
+}