//go:build linux || freebsd // +build linux freebsd package file import ( "bytes" "context" "net/url" "os" "path/filepath" "testing" "codeberg.org/petrbalvin/goget/internal/core" ) func TestDownloadFile(t *testing.T) { tmp := t.TempDir() src := filepath.Join(tmp, "src.txt") dst := filepath.Join(tmp, "dst.txt") os.WriteFile(src, []byte("hello world"), 0644) proto := NewProtocol() u := &url.URL{Scheme: "file", Path: src} result, err := proto.Download(context.Background(), &core.DownloadRequest{ URL: u, Output: dst, }) if err != nil { t.Fatal(err) } if result.BytesDownloaded != 11 { t.Errorf("bytes = %d, want 11", result.BytesDownloaded) } data, _ := os.ReadFile(dst) if string(data) != "hello world" { t.Errorf("content = %q, want %q", data, "hello world") } } func TestDownloadFileToWriter(t *testing.T) { tmp := t.TempDir() src := filepath.Join(tmp, "src.txt") os.WriteFile(src, []byte("test"), 0644) var buf bytes.Buffer proto := NewProtocol() u := &url.URL{Scheme: "file", Path: src} _, err := proto.Download(context.Background(), &core.DownloadRequest{ URL: u, Output: "-", Writer: &buf, }) if err != nil { t.Fatal(err) } if buf.String() != "test" { t.Errorf("content = %q, want %q", buf.String(), "test") } } func TestDownloadFileNotFound(t *testing.T) { proto := NewProtocol() u := &url.URL{Scheme: "file", Path: "/nonexistent/path"} _, err := proto.Download(context.Background(), &core.DownloadRequest{ URL: u, Output: "/tmp/out", }) if err == nil { t.Error("expected error for nonexistent file") } } func TestDownloadDirectory(t *testing.T) { tmp := t.TempDir() srcDir := filepath.Join(tmp, "srcdir") dstDir := filepath.Join(tmp, "dstdir") os.MkdirAll(filepath.Join(srcDir, "sub"), 0755) os.WriteFile(filepath.Join(srcDir, "a.txt"), []byte("a"), 0644) os.WriteFile(filepath.Join(srcDir, "sub/b.txt"), []byte("b"), 0644) proto := NewProtocol() u := &url.URL{Scheme: "file", Path: srcDir} result, err := proto.Download(context.Background(), &core.DownloadRequest{ URL: u, Output: dstDir, }) if err != nil { t.Fatal(err) } if result.ChunksCount != 2 { t.Errorf("files = %d, want 2", result.ChunksCount) } if result.BytesDownloaded != 2 { t.Errorf("bytes = %d, want 2", result.BytesDownloaded) } // Verify files exist if _, err := os.Stat(filepath.Join(dstDir, "a.txt")); err != nil { t.Error("a.txt not found") } if _, err := os.Stat(filepath.Join(dstDir, "sub", "b.txt")); err != nil { t.Error("sub/b.txt not found") } } func TestResumeFile(t *testing.T) { tmp := t.TempDir() src := filepath.Join(tmp, "src.txt") dst := filepath.Join(tmp, "dst.txt") os.WriteFile(src, []byte("hello world"), 0644) os.WriteFile(dst, []byte("hello"), 0644) // partial: 5 bytes proto := NewProtocol() u := &url.URL{Scheme: "file", Path: src} result, err := proto.Download(context.Background(), &core.DownloadRequest{ URL: u, Output: dst, Resume: true, }) if err != nil { t.Fatal(err) } if !result.Resumed { t.Error("expected Resumed=true") } if result.BytesDownloaded != 11 { t.Errorf("bytes = %d, want 11", result.BytesDownloaded) } }