From 34fbfc4176517dee2431543cd37c96a0484760a5 Mon Sep 17 00:00:00 2001 From: sfan5 Date: Mon, 25 Mar 2024 19:33:23 +0100 Subject: [PATCH] Add Docker test workflow --- .github/workflows/test.yml | 12 ++++++++++++ mods/default/init.lua | 3 +++ mods/default/test.lua | 38 ++++++++++++++++++++++++++++++++++++++ test/minetest.conf | 3 +++ test/run.sh | 15 +++++++++++++++ test/world.mt | 3 +++ 6 files changed, 74 insertions(+) create mode 100644 .github/workflows/test.yml create mode 100644 mods/default/test.lua create mode 100644 test/minetest.conf create mode 100755 test/run.sh create mode 100644 test/world.mt diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml new file mode 100644 index 0000000..e6b08d9 --- /dev/null +++ b/.github/workflows/test.yml @@ -0,0 +1,12 @@ +name: "Integration test" +on: [push, pull_request] + +jobs: + test: + runs-on: ubuntu-latest + timeout-minutes: 5 + steps: + - uses: actions/checkout@v4 + + - name: docker + run: ./test/run.sh diff --git a/mods/default/init.lua b/mods/default/init.lua index 304ffb2..924aa9b 100644 --- a/mods/default/init.lua +++ b/mods/default/init.lua @@ -1654,3 +1654,6 @@ dofile(modpath .. "/furnace.lua") dofile(modpath .. "/sao.lua") dofile(modpath .. "/mapgen_setup.lua") dofile(modpath .. "/abm.lua") +if minetest.settings:get_bool("minetest_classic_internal_test") then + dofile(modpath .. "/test.lua") +end diff --git a/mods/default/test.lua b/mods/default/test.lua new file mode 100644 index 0000000..1e7f643 --- /dev/null +++ b/mods/default/test.lua @@ -0,0 +1,38 @@ +local function wait_map(callback) + local pos = vector.new(5, 30, 5) + for y = 0, 4 do + assert(minetest.forceload_block( + vector.new(pos.x, y*16, pos.z), true, -1 + )) + end + + local function check() + if minetest.get_node(pos).name ~= "ignore" then + return callback(pos) + end + minetest.after(0, check) + end + check() +end + + +minetest.after(0, function() + wait_map(function(pos) + for x = -1, 1 do + for z = -1, 1 do + minetest.add_node(pos:offset(x, 0, z), {name="default:dirt"}) + end + end + + pos = pos:offset(0, 1, 0) + minetest.add_entity(pos, "default:rat") + minetest.add_entity(pos, "default:oerkki1") + minetest.add_entity(pos, "default:firefly") + default.spawn_mobv2(pos, default.get_mob_dungeon_master()) + + minetest.after(2.5, function() + minetest.request_shutdown() + end) + end) +end) + diff --git a/test/minetest.conf b/test/minetest.conf new file mode 100644 index 0000000..10e33e8 --- /dev/null +++ b/test/minetest.conf @@ -0,0 +1,3 @@ +mg_name = v6 +minetest_classic_internal_test = true +max_forceloaded_blocks = 500 diff --git a/test/run.sh b/test/run.sh new file mode 100755 index 0000000..685fd91 --- /dev/null +++ b/test/run.sh @@ -0,0 +1,15 @@ +#!/bin/bash -e + +[ -f game.conf ] || { echo "Must be run in game root folder." >&2; exit 1; } + +[ -z "$DOCKER_IMAGE" ] && DOCKER_IMAGE="ghcr.io/minetest/minetest:master" +docker run --rm -i \ + -v "$PWD/test/minetest.conf":/etc/minetest/minetest.conf \ + --tmpfs /root/.minetest \ + -v "$PWD":/root/.minetest/games/minetest_classic \ + -v "$PWD/test/world.mt":/root/.minetest/world/world.mt \ + -u 0:0 "$DOCKER_IMAGE" +# -u 0:0 is needed here because MT's image defaults to an unprivileged user +# but all of our mounts are created as root... + +exit 0 diff --git a/test/world.mt b/test/world.mt new file mode 100644 index 0000000..b97f8e3 --- /dev/null +++ b/test/world.mt @@ -0,0 +1,3 @@ +enable_damage = true +creative_mode = false +gameid = minetest_classic