...
1
2
3
4
5
6
7 package testfiles
8
9 import (
10 "io"
11 "io/fs"
12 "os"
13 "path/filepath"
14 "strings"
15 "testing"
16
17 "golang.org/x/tools/txtar"
18 )
19
20
21
22 func CopyDirToTmp(t testing.TB, srcdir string) string {
23 dst := t.TempDir()
24 if err := CopyFS(dst, os.DirFS(srcdir)); err != nil {
25 t.Fatal(err)
26 }
27 return dst
28 }
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50 func CopyFS(dstdir string, src fs.FS) error {
51 if err := copyFS(dstdir, src); err != nil {
52 return err
53 }
54
55
56 var rename []string
57 err := fs.WalkDir(os.DirFS(dstdir), ".", func(path string, d fs.DirEntry, err error) error {
58 if err != nil {
59 return err
60 }
61 if strings.HasSuffix(path, ".test") {
62 rename = append(rename, path)
63 }
64 return nil
65 })
66 if err != nil {
67 return err
68 }
69
70
71
72 for i := len(rename) - 1; i >= 0; i-- {
73 oldpath := filepath.Join(dstdir, rename[i])
74 newpath := strings.TrimSuffix(oldpath, ".test")
75 if err != os.Rename(oldpath, newpath) {
76 return err
77 }
78 }
79 return nil
80 }
81
82
83
84 func copyFS(dstdir string, src fs.FS) error {
85 return fs.WalkDir(src, ".", func(path string, d fs.DirEntry, err error) error {
86 if err != nil {
87 return err
88 }
89 newpath := filepath.Join(dstdir, path)
90 if d.IsDir() {
91 return os.MkdirAll(newpath, 0777)
92 }
93 r, err := src.Open(path)
94 if err != nil {
95 return err
96 }
97 defer r.Close()
98
99 w, err := os.Create(newpath)
100 if err != nil {
101 return err
102 }
103 defer w.Close()
104 _, err = io.Copy(w, r)
105 return err
106 })
107 }
108
109
110
111
112 func ExtractTxtar(dstdir string, ar *txtar.Archive) error {
113 for _, file := range ar.Files {
114 name := filepath.Join(dstdir, file.Name)
115 if err := os.MkdirAll(filepath.Dir(name), 0777); err != nil {
116 return err
117 }
118 if err := os.WriteFile(name, file.Data, 0666); err != nil {
119 return err
120 }
121 }
122 return nil
123 }
124
125
126
127
128 func ExtractTxtarToTmp(t testing.TB, archive string) string {
129 ar, err := txtar.ParseFile(archive)
130 if err != nil {
131 t.Fatal(err)
132 }
133
134 dir := t.TempDir()
135 err = ExtractTxtar(dir, ar)
136 if err != nil {
137 t.Fatal(err)
138 }
139 return dir
140 }
141
View as plain text