github.com/powerman/golang-tools@v0.1.11-0.20220410185822-5ad214d8d803/go/packages/packagestest/export_test.go (about) 1 // Copyright 2018 The Go Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 package packagestest_test 6 7 import ( 8 "io/ioutil" 9 "os" 10 "path/filepath" 11 "reflect" 12 "sort" 13 "testing" 14 15 "github.com/powerman/golang-tools/go/packages/packagestest" 16 ) 17 18 var testdata = []packagestest.Module{{ 19 Name: "golang.org/fake1", 20 Files: map[string]interface{}{ 21 "a.go": packagestest.Symlink("testdata/a.go"), // broken symlink 22 "b.go": "invalid file contents", 23 }, 24 Overlay: map[string][]byte{ 25 "b.go": []byte("package fake1"), 26 "c.go": []byte("package fake1"), 27 }, 28 }, { 29 Name: "golang.org/fake2", 30 Files: map[string]interface{}{ 31 "other/a.go": "package fake2", 32 }, 33 }, { 34 Name: "golang.org/fake2/v2", 35 Files: map[string]interface{}{ 36 "other/a.go": "package fake2", 37 }, 38 }, { 39 Name: "golang.org/fake3@v1.0.0", 40 Files: map[string]interface{}{ 41 "other/a.go": "package fake3", 42 }, 43 }, { 44 Name: "golang.org/fake3@v1.1.0", 45 Files: map[string]interface{}{ 46 "other/a.go": "package fake3", 47 }, 48 }} 49 50 type fileTest struct { 51 module, fragment, expect string 52 check func(t *testing.T, exported *packagestest.Exported, filename string) 53 } 54 55 func checkFiles(t *testing.T, exported *packagestest.Exported, tests []fileTest) { 56 for _, test := range tests { 57 expect := filepath.Join(exported.Temp(), filepath.FromSlash(test.expect)) 58 got := exported.File(test.module, test.fragment) 59 if got == "" { 60 t.Errorf("File %v missing from the output", expect) 61 } else if got != expect { 62 t.Errorf("Got file %v, expected %v", got, expect) 63 } 64 if test.check != nil { 65 test.check(t, exported, got) 66 } 67 } 68 } 69 70 func checkLink(expect string) func(t *testing.T, exported *packagestest.Exported, filename string) { 71 expect = filepath.FromSlash(expect) 72 return func(t *testing.T, exported *packagestest.Exported, filename string) { 73 if target, err := os.Readlink(filename); err != nil { 74 t.Errorf("Error checking link %v: %v", filename, err) 75 } else if target != expect { 76 t.Errorf("Link %v does not match, got %v expected %v", filename, target, expect) 77 } 78 } 79 } 80 81 func checkContent(expect string) func(t *testing.T, exported *packagestest.Exported, filename string) { 82 return func(t *testing.T, exported *packagestest.Exported, filename string) { 83 if content, err := exported.FileContents(filename); err != nil { 84 t.Errorf("Error reading %v: %v", filename, err) 85 } else if string(content) != expect { 86 t.Errorf("Content of %v does not match, got %v expected %v", filename, string(content), expect) 87 } 88 } 89 } 90 91 func TestGroupFilesByModules(t *testing.T) { 92 for _, tt := range []struct { 93 testdir string 94 want []packagestest.Module 95 }{ 96 { 97 testdir: "testdata/groups/one", 98 want: []packagestest.Module{ 99 { 100 Name: "testdata/groups/one", 101 Files: map[string]interface{}{ 102 "main.go": true, 103 }, 104 }, 105 { 106 Name: "example.com/extra", 107 Files: map[string]interface{}{ 108 "help.go": true, 109 }, 110 }, 111 }, 112 }, 113 { 114 testdir: "testdata/groups/two", 115 want: []packagestest.Module{ 116 { 117 Name: "testdata/groups/two", 118 Files: map[string]interface{}{ 119 "main.go": true, 120 "expect/yo.go": true, 121 "expect/yo_test.go": true, 122 }, 123 }, 124 { 125 Name: "example.com/extra", 126 Files: map[string]interface{}{ 127 "yo.go": true, 128 "geez/help.go": true, 129 }, 130 }, 131 { 132 Name: "example.com/extra/v2", 133 Files: map[string]interface{}{ 134 "me.go": true, 135 "geez/help.go": true, 136 }, 137 }, 138 { 139 Name: "example.com/tempmod", 140 Files: map[string]interface{}{ 141 "main.go": true, 142 }, 143 }, 144 { 145 Name: "example.com/what@v1.0.0", 146 Files: map[string]interface{}{ 147 "main.go": true, 148 }, 149 }, 150 { 151 Name: "example.com/what@v1.1.0", 152 Files: map[string]interface{}{ 153 "main.go": true, 154 }, 155 }, 156 }, 157 }, 158 } { 159 t.Run(tt.testdir, func(t *testing.T) { 160 got, err := packagestest.GroupFilesByModules(tt.testdir) 161 if err != nil { 162 t.Fatalf("could not group files %v", err) 163 } 164 if len(got) != len(tt.want) { 165 t.Fatalf("%s: wanted %d modules but got %d", tt.testdir, len(tt.want), len(got)) 166 } 167 for i, w := range tt.want { 168 g := got[i] 169 if filepath.FromSlash(g.Name) != filepath.FromSlash(w.Name) { 170 t.Fatalf("%s: wanted module[%d].Name to be %s but got %s", tt.testdir, i, filepath.FromSlash(w.Name), filepath.FromSlash(g.Name)) 171 } 172 for fh := range w.Files { 173 if _, ok := g.Files[fh]; !ok { 174 t.Fatalf("%s, module[%d]: wanted %s but could not find", tt.testdir, i, fh) 175 } 176 } 177 for fh := range g.Files { 178 if _, ok := w.Files[fh]; !ok { 179 t.Fatalf("%s, module[%d]: found unexpected file %s", tt.testdir, i, fh) 180 } 181 } 182 } 183 }) 184 } 185 } 186 187 func TestMustCopyFiles(t *testing.T) { 188 // Create the following test directory structure in a temporary directory. 189 src := map[string]string{ 190 // copies all files under the specified directory. 191 "go.mod": "module example.com", 192 "m.go": "package m", 193 "a/a.go": "package a", 194 // contents from a nested module shouldn't be copied. 195 "nested/go.mod": "module example.com/nested", 196 "nested/m.go": "package nested", 197 "nested/b/b.go": "package b", 198 } 199 200 tmpDir, err := ioutil.TempDir("", t.Name()) 201 if err != nil { 202 t.Fatalf("failed to create a temporary directory: %v", err) 203 } 204 defer os.RemoveAll(tmpDir) 205 206 for fragment, contents := range src { 207 fullpath := filepath.Join(tmpDir, filepath.FromSlash(fragment)) 208 if err := os.MkdirAll(filepath.Dir(fullpath), 0755); err != nil { 209 t.Fatal(err) 210 } 211 if err := ioutil.WriteFile(fullpath, []byte(contents), 0644); err != nil { 212 t.Fatal(err) 213 } 214 } 215 216 copied := packagestest.MustCopyFileTree(tmpDir) 217 var got []string 218 for fragment := range copied { 219 got = append(got, filepath.ToSlash(fragment)) 220 } 221 want := []string{"go.mod", "m.go", "a/a.go"} 222 223 sort.Strings(got) 224 sort.Strings(want) 225 if !reflect.DeepEqual(got, want) { 226 t.Errorf("packagestest.MustCopyFileTree = %v, want %v", got, want) 227 } 228 229 // packagestest.Export is happy. 230 exported := packagestest.Export(t, packagestest.Modules, []packagestest.Module{{ 231 Name: "example.com", 232 Files: packagestest.MustCopyFileTree(tmpDir), 233 }}) 234 defer exported.Cleanup() 235 }