Files

84 lines
1.9 KiB
Go

package transfer
import (
"os"
"path/filepath"
"testing"
)
func TestReadFileRoundTrip(t *testing.T) {
src := filepath.Join(t.TempDir(), "hello.txt")
content := []byte("hello, clip-sync!")
if err := os.WriteFile(src, content, 0644); err != nil {
t.Fatalf("WriteFile: %v", err)
}
f, err := ReadFile(src, "machine-a")
if err != nil {
t.Fatalf("ReadFile: %v", err)
}
if f.Name != "hello.txt" {
t.Errorf("Name = %q, want \"hello.txt\"", f.Name)
}
if f.Mime != "text/plain; charset=utf-8" {
t.Errorf("Mime = %q, want \"text/plain; charset=utf-8\"", f.Mime)
}
decoded, err := f.Decode()
if err != nil {
t.Fatalf("Decode: %v", err)
}
if string(decoded) != string(content) {
t.Errorf("decoded = %q, want %q", decoded, content)
}
}
func TestSaveTo(t *testing.T) {
dir := t.TempDir()
f := &File{Name: "out.bin", Mime: "application/octet-stream", Data: ""}
// Data must be base64-encoded; use a known encoding of "abc".
f.Data = "YWJj"
dest, err := f.SaveTo(dir)
if err != nil {
t.Fatalf("SaveTo: %v", err)
}
got, err := os.ReadFile(dest)
if err != nil {
t.Fatalf("ReadFile: %v", err)
}
if string(got) != "abc" {
t.Errorf("saved = %q, want \"abc\"", got)
}
}
func TestSaveToAvoidsOverwrite(t *testing.T) {
dir := t.TempDir()
f := &File{Name: "out.bin", Data: "eA=="} // base64 "x"
first, err := f.SaveTo(dir)
if err != nil {
t.Fatalf("first SaveTo: %v", err)
}
second, err := f.SaveTo(dir)
if err != nil {
t.Fatalf("second SaveTo: %v", err)
}
if first == second {
t.Errorf("second save overwrote first: %q == %q", first, second)
}
}
func TestSaveToSanitizesPath(t *testing.T) {
dir := t.TempDir()
f := &File{Name: "../../etc/passwd", Data: "eA=="}
dest, err := f.SaveTo(dir)
if err != nil {
t.Fatalf("SaveTo: %v", err)
}
if filepath.Dir(dest) != dir {
t.Errorf("dest dir = %q, want %q (path traversal not sanitized)", filepath.Dir(dest), dir)
}
}