ci: run plugin tests on Windows (#8314)

Plugin package tests previously ran only on Linux, so Windows-
specific failures were never caught. Run them in CI and make the
affected tests portable across platforms.

Signed-off-by: Ville Vesilehto <ville@vesilehto.fi>
This commit is contained in:
Ville Vesilehto
2026-07-19 13:52:23 +03:00
committed by GitHub
parent 96ec17d5c6
commit 077774e0cd
11 changed files with 124 additions and 99 deletions

View File

@@ -83,26 +83,8 @@ func TestZoneReloadSOAChange(t *testing.T) {
func TestZoneReloadByMtime(t *testing.T) {
// Test 1: Basic mtime trigger - file modification should trigger reload
t.Run("BasicMtimeTrigger", func(t *testing.T) {
fileName, rm, err := test.TempFile(".", reloadZoneTest)
if err != nil {
t.Fatalf("Failed to create zone: %s", err)
}
defer rm()
reader, err := os.Open(fileName)
if err != nil {
t.Fatalf("Failed to open zone: %s", err)
}
z, err := Parse(reader, "miek.nl", fileName, 0)
if err != nil {
t.Fatalf("Failed to parse zone: %s", err)
}
reader.Close()
// Enable mtime-based reload
z.ReloadInterval = 10 * time.Millisecond
z.ReloadByMtime = true
z.Reload(&transfer.Transfer{})
z, fileName, cleanup := prepareMtimeZone(t, reloadZoneTest)
defer cleanup()
// Wait for initial load to complete
time.Sleep(20 * time.Millisecond)
@@ -136,26 +118,8 @@ func TestZoneReloadByMtime(t *testing.T) {
// Test 2: No reload when mtime unchanged
t.Run("NoReloadWhenMtimeUnchanged", func(t *testing.T) {
fileName, rm, err := test.TempFile(".", reloadZoneTest)
if err != nil {
t.Fatalf("Failed to create zone: %s", err)
}
defer rm()
reader, err := os.Open(fileName)
if err != nil {
t.Fatalf("Failed to open zone: %s", err)
}
z, err := Parse(reader, "miek.nl", fileName, 0)
if err != nil {
t.Fatalf("Failed to parse zone: %s", err)
}
reader.Close()
// Enable mtime-based reload
z.ReloadInterval = 10 * time.Millisecond
z.ReloadByMtime = true
z.Reload(&transfer.Transfer{})
z, _, cleanup := prepareMtimeZone(t, reloadZoneTest)
defer cleanup()
// Wait for initial load
time.Sleep(20 * time.Millisecond)
@@ -193,26 +157,8 @@ func TestZoneReloadByMtime(t *testing.T) {
// Test 3: Content verification after reload
t.Run("ContentVerificationAfterReload", func(t *testing.T) {
fileName, rm, err := test.TempFile(".", reloadZoneTest)
if err != nil {
t.Fatalf("Failed to create zone: %s", err)
}
defer rm()
reader, err := os.Open(fileName)
if err != nil {
t.Fatalf("Failed to open zone: %s", err)
}
z, err := Parse(reader, "miek.nl", fileName, 0)
if err != nil {
t.Fatalf("Failed to parse zone: %s", err)
}
reader.Close()
// Enable mtime-based reload
z.ReloadInterval = 10 * time.Millisecond
z.ReloadByMtime = true
z.Reload(&transfer.Transfer{})
z, fileName, cleanup := prepareMtimeZone(t, reloadZoneTest)
defer cleanup()
ctx := context.TODO()
@@ -266,26 +212,8 @@ func TestZoneReloadByMtime(t *testing.T) {
// Test 4: File deleted/missing during reload
t.Run("FileMissingDuringReload", func(t *testing.T) {
fileName, rm, err := test.TempFile(".", reloadZoneTest)
if err != nil {
t.Fatalf("Failed to create zone: %s", err)
}
defer rm()
reader, err := os.Open(fileName)
if err != nil {
t.Fatalf("Failed to open zone: %s", err)
}
z, err := Parse(reader, "miek.nl", fileName, 0)
if err != nil {
t.Fatalf("Failed to parse zone: %s", err)
}
reader.Close()
// Enable mtime-based reload
z.ReloadInterval = 10 * time.Millisecond
z.ReloadByMtime = true
z.Reload(&transfer.Transfer{})
z, fileName, cleanup := prepareMtimeZone(t, reloadZoneTest)
defer cleanup()
// Wait for initial load
time.Sleep(20 * time.Millisecond)
@@ -327,6 +255,45 @@ func TestZoneReloadByMtime(t *testing.T) {
})
}
// prepareMtimeZone creates a zone with mtime-based reload enabled.
func prepareMtimeZone(t *testing.T, content string) (*Zone, string, func()) {
t.Helper()
fileName, rm, err := test.TempFile(".", content)
if err != nil {
t.Fatalf("Failed to create zone: %s", err)
}
reader, err := os.Open(fileName)
if err != nil {
rm()
t.Fatalf("Failed to open zone: %s", err)
}
z, err := Parse(reader, "miek.nl", fileName, 0)
reader.Close()
if err != nil {
rm()
t.Fatalf("Failed to parse zone: %s", err)
}
fi, err := os.Stat(fileName)
if err != nil {
rm()
t.Fatalf("Failed to stat zone: %s", err)
}
z.ReloadInterval = 10 * time.Millisecond
z.ReloadByMtime = true
// Parse does not set file_mtime unless ReloadByMtime is already enabled.
// Seed it so the reload loop only opens the file when mtime changes.
z.file_mtime = fi.ModTime()
z.Reload(&transfer.Transfer{})
return z, fileName, func() {
z.OnShutdown()
rm()
}
}
const reloadZoneTest = `miek.nl. 1627 IN SOA linode.atoom.net. miek.miek.nl. 1460175181 14400 3600 604800 14400
miek.nl. 1627 IN NS ext.ns.whyscream.net.
miek.nl. 1627 IN NS omval.tednet.nl.

View File

@@ -72,11 +72,16 @@ func TestPrint(t *testing.T) {
f, err := os.CreateTemp(t.TempDir(), "print_test_tmp")
if err != nil {
t.Error(err)
t.Fatal(err)
}
defer os.Remove(f.Name())
//Redirect the printed results to a tmp file for later comparison
// Redirect Print output to a temp file, then restore stdout and close
// the handle so TempDir cleanup can remove it on Windows.
stdout := os.Stdout
os.Stdout = f
t.Cleanup(func() {
os.Stdout = stdout
f.Close()
})
tree.Print()
/**
@@ -85,12 +90,12 @@ func TestPrint(t *testing.T) {
server3.example.com.
*/
if _, err := f.Seek(0, 0); err != nil {
t.Fatal(err)
}
buf := make([]byte, 256)
f.Seek(0, 0)
_, err = f.Read(buf)
if err != nil {
f.Close()
t.Error(err)
if _, err := f.Read(buf); err != nil {
t.Fatal(err)
}
height := strings.Count(string(buf), ". \n")
//Compare the height of the print with the actual height of the tree