diff --git a/flake.nix b/flake.nix index 64222f5..9eda8d5 100644 --- a/flake.nix +++ b/flake.nix @@ -225,7 +225,7 @@ packages.${system} = let testSuite = import ./tests/tests.nix { - inherit pkgs lib; + inherit pkgs lib inputs; config = self.nixosConfigurations.muffin.config; }; in diff --git a/tests/minecraft.nix b/tests/minecraft.nix new file mode 100644 index 0000000..9b9c9df --- /dev/null +++ b/tests/minecraft.nix @@ -0,0 +1,118 @@ +{ + config, + lib, + pkgs, + inputs, + ... +}: +let + # Create pkgs with nix-minecraft overlay and unfree packages allowed + testPkgs = import inputs.nixpkgs { + system = pkgs.system; + config.allowUnfreePredicate = pkg: builtins.elem (lib.getName pkg) [ "minecraft-server" ]; + overlays = [ inputs.nix-minecraft.overlay ]; + }; + + # Create a wrapper module that imports the actual minecraft service + minecraftService = + { config, ... }: + let + # Import the minecraft service configuration + serviceConfig = import ../services/minecraft.nix { + inherit lib config; + pkgs = testPkgs; + service_configs = { + minecraft = { + server_name = "main"; + parent_dir = "/var/lib/minecraft"; + }; + https = { + domain = "test.local"; + }; + }; + username = "testuser"; + }; + in + { + imports = [ serviceConfig ]; + # Override nixpkgs config to prevent conflicts in test environment + nixpkgs.config = lib.mkForce { + allowUnfreePredicate = pkg: builtins.elem (lib.getName pkg) [ "minecraft-server" ]; + }; + }; +in +testPkgs.testers.runNixOSTest { + name = "minecraft server startup test"; + + nodes.machine = + { ... }: + { + imports = [ + inputs.nix-minecraft.nixosModules.minecraft-servers + minecraftService + ]; + + # Enable caddy service (required by minecraft service) + services.caddy.enable = true; + + # Disable the ZFS mount dependency service in test environment + systemd.services."minecraft-server-main_mounts".enable = lib.mkForce false; + + # Remove service dependencies that require ZFS + systemd.services.minecraft-server-main = { + wants = lib.mkForce [ ]; + after = lib.mkForce [ ]; + requires = lib.mkForce [ ]; + }; + + # Test-specific overrides only - reduce memory for testing + services.minecraft-servers.servers.main.jvmOpts = lib.mkForce "-Xmx1G -Xms1G"; + + # Create test user + users.users.testuser = { + isNormalUser = true; + uid = 1000; + extraGroups = [ "minecraft" ]; + }; + }; + + testScript = '' + start_all() + machine.wait_for_unit("multi-user.target") + + # Wait for minecraft service to be available + machine.wait_for_unit("minecraft-server-main.service") + + # Check that the service is active and not failed + machine.succeed("systemctl is-active minecraft-server-main.service") + + # Wait for the server to fully start up - minecraft with mods can take longer + machine.sleep(60) + + # Verify the service hasn't crashed after startup + machine.succeed("systemctl is-active minecraft-server-main.service") + + # Check that the minecraft process is running + machine.succeed("pgrep -f minecraft") + + # Verify the server port is listening + machine.wait_for_open_port(25565) + + # Check that minecraft data directory was created + machine.succeed("test -d /var/lib/minecraft/main") + + # Verify server.properties was created + machine.succeed("test -f /var/lib/minecraft/main/server.properties") + + # Check that mods directory exists and contains the expected mods + machine.succeed("test -d /var/lib/minecraft/main/mods") + machine.succeed("ls /var/lib/minecraft/main/mods | grep -q fabric-api") + machine.succeed("ls /var/lib/minecraft/main/mods | grep -q ferritecore") + machine.succeed("ls /var/lib/minecraft/main/mods | grep -q lithium") + + # Check that there are no critical errors in the logs + machine.succeed("! journalctl -u minecraft-server-main.service --no-pager | grep -i 'error\\|exception\\|failed'") + + print("Minecraft server with specific mods started successfully!") + ''; +} diff --git a/tests/tests.nix b/tests/tests.nix index d729c74..e2b6e5e 100644 --- a/tests/tests.nix +++ b/tests/tests.nix @@ -3,11 +3,12 @@ lib, pkgs, ... -}: +}@args: let - handleTest = file: import file { inherit config lib pkgs; }; + handleTest = file: import file (args); in { zfsTest = handleTest ./zfs.nix; testTest = handleTest ./testTest.nix; + minecraftTest = handleTest ./minecraft.nix; }