67 lines
1.9 KiB
Go
67 lines
1.9 KiB
Go
package agent
|
|
|
|
import (
|
|
"archive/tar"
|
|
"bytes"
|
|
"context"
|
|
"os"
|
|
"path/filepath"
|
|
"strings"
|
|
"testing"
|
|
)
|
|
|
|
// Several items of one folder go as one tar and land side by side; an entry
|
|
// of none of them is refused.
|
|
func TestShipSeveralInOneTar(t *testing.T) {
|
|
src, dst := t.TempDir(), t.TempDir()
|
|
_ = os.WriteFile(filepath.Join(src, "a.txt"), []byte("A"), 0o644)
|
|
_ = os.MkdirAll(filepath.Join(src, "b"), 0o755)
|
|
_ = os.WriteFile(filepath.Join(src, "b", "c.txt"), []byte("C"), 0o644)
|
|
var buf bytes.Buffer
|
|
items := []shipItem{{filepath.Join(src, "a.txt"), "a.txt"}, {filepath.Join(src, "b"), "b"}}
|
|
if err := packTars(context.Background(), &buf, items, &shipMeter{}); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
u := &unpacker{dir: dst, names: map[string]bool{"a.txt": true, "b": true}}
|
|
if err := u.unpack(tar.NewReader(&buf)); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if b, _ := os.ReadFile(filepath.Join(dst, "b", "c.txt")); string(b) != "C" {
|
|
t.Fatalf("b/c.txt: %q", b)
|
|
}
|
|
if b, _ := os.ReadFile(filepath.Join(dst, "a.txt")); string(b) != "A" {
|
|
t.Fatalf("a.txt: %q", b)
|
|
}
|
|
buf.Reset()
|
|
_ = packTars(context.Background(), &buf, items, &shipMeter{})
|
|
u = &unpacker{dir: t.TempDir(), names: map[string]bool{"a.txt": true}}
|
|
if err := u.unpack(tar.NewReader(&buf)); err == nil || !strings.Contains(err.Error(), "чужой путь") {
|
|
t.Fatalf("b let in: %v", err)
|
|
}
|
|
}
|
|
|
|
func TestRenameTarSeveral(t *testing.T) {
|
|
var src bytes.Buffer
|
|
tw := tar.NewWriter(&src)
|
|
for _, n := range []string{"a", "b/x", "c", "._a"} {
|
|
_ = tw.WriteHeader(&tar.Header{Name: n, Mode: 0o644, Typeflag: tar.TypeReg})
|
|
}
|
|
_ = tw.Close()
|
|
var out bytes.Buffer
|
|
if err := renameTar(&out, &src, map[string]string{"a": "a", "b": "b2"}); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
tr := tar.NewReader(&out)
|
|
var got []string
|
|
for {
|
|
h, err := tr.Next()
|
|
if err != nil {
|
|
break
|
|
}
|
|
got = append(got, h.Name)
|
|
}
|
|
if strings.Join(got, ",") != "a,b2/x" {
|
|
t.Fatalf("entries: %v", got)
|
|
}
|
|
}
|