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) } }