84 lines
1.9 KiB
Go
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)
|
|
}
|
|
}
|