//go:build linux || freebsd // +build linux freebsd package webdav import ( "net/url" "path/filepath" "testing" "codeberg.org/petrbalvin/goget/internal/core" "codeberg.org/petrbalvin/goget/internal/output" ) // TestSaveWebDAVResume verifies the partial-progress sidecar written // by streamWebDAVBody on context cancellation. The ETag and // Last-Modified headers are preserved so the next --resume attempt // can send a matching If-Range and either continue or restart // cleanly depending on the server's view of the file. func TestSaveWebDAVResume(t *testing.T) { tmp := t.TempDir() out := filepath.Join(tmp, "file.bin") u, _ := url.Parse("webdav://host/file.bin") req := &core.DownloadRequest{ URL: u, Output: out, Resume: true, } resumed := true saveWebDAVResume(req, 8192, 1<<20, `"etag-abc"`, "Mon, 01 Jan 2026 00:00:00 GMT", resumed) meta, err := output.LoadResumeMetadata(out) if err != nil { t.Fatalf("LoadResumeMetadata: %v", err) } if meta == nil { t.Fatal("expected resume metadata, got nil") } if meta.Downloaded != 8192 { t.Errorf("Downloaded = %d, want 8192", meta.Downloaded) } if meta.Total != 1<<20 { t.Errorf("Total = %d, want %d", meta.Total, 1<<20) } if meta.ETag != `"etag-abc"` { t.Errorf("ETag = %q", meta.ETag) } if meta.LastModified != "Mon, 01 Jan 2026 00:00:00 GMT" { t.Errorf("LastModified = %q", meta.LastModified) } // Resume=false must short-circuit the save. out2 := filepath.Join(tmp, "noresume.bin") req.Resume = false saveWebDAVResume(req, 4096, 1000, "", "", false) if _, err := output.LoadResumeMetadata(out2); err != nil { t.Fatalf("LoadResumeMetadata (noresume): %v", err) } }