feat: initial goget release — modern IPv6-first download utility
This commit is contained in:
@@ -0,0 +1,129 @@
|
||||
//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)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user