@@ -21,7 +21,7 @@ import (
21
21
"os"
22
22
"path/filepath"
23
23
"reflect"
24
- "sort "
24
+ "strings "
25
25
"testing"
26
26
27
27
"github.com/bazelbuild/rules_go/go/tools/gazelle/packages"
@@ -31,78 +31,159 @@ func tempDir() (string, error) {
31
31
return ioutil .TempDir (os .Getenv ("TEST_TMPDIR" ), "walk_test" )
32
32
}
33
33
34
- func TestWalkSimple (t * testing.T ) {
35
- dir , err := tempDir ()
34
+ type fileSpec struct {
35
+ path , content string
36
+ }
37
+
38
+ func checkFiles (t * testing.T , files []fileSpec , want []* build.Package ) {
39
+ dir , err := createFiles (files )
36
40
if err != nil {
37
- t .Fatalf ("tempDir () failed with %v; want success" , err )
41
+ t .Fatalf ("createFiles () failed with %v; want success" , err )
38
42
}
39
43
defer os .RemoveAll (dir )
40
44
41
- fname := filepath . Join (dir , "lib.go" )
42
- if err := ioutil . WriteFile ( fname , [] byte ( "package lib" ), 0600 ); err != nil {
43
- t .Fatalf ( `ioutil.WriteFile (%q, "package lib", 0600 ) failed with %v; want success` , fname , err )
45
+ got , err := walkPackages (dir )
46
+ if err != nil {
47
+ t .Errorf ( "walkPackages (%q) failed with %v; want success" , dir , err )
44
48
}
49
+ checkPackages (t , got , want )
50
+ }
45
51
46
- var n int
47
- err = packages .Walk (build .Default , dir , func (pkg * build.Package ) error {
48
- if got , want := pkg .Name , "lib" ; got != want {
49
- t .Errorf ("pkg.Name = %q; want %q" , got , want )
52
+ func createFiles (files []fileSpec ) (string , error ) {
53
+ dir , err := tempDir ()
54
+ if err != nil {
55
+ return "" , err
56
+ }
57
+ for _ , f := range files {
58
+ path := filepath .Join (dir , f .path )
59
+ if strings .HasSuffix (f .path , "/" ) {
60
+ if err := os .MkdirAll (path , 0700 ); err != nil {
61
+ return dir , err
62
+ }
63
+ continue
64
+ }
65
+ if err := os .MkdirAll (filepath .Dir (path ), 0700 ); err != nil {
66
+ return "" , err
67
+ }
68
+ if err := ioutil .WriteFile (path , []byte (f .content ), 0600 ); err != nil {
69
+ return "" , err
50
70
}
51
- n ++
71
+ }
72
+ return dir , nil
73
+ }
74
+
75
+ func walkPackages (root string ) ([]* build.Package , error ) {
76
+ var pkgs []* build.Package
77
+ err := packages .Walk (build .Default , root , func (pkg * build.Package ) error {
78
+ pkgs = append (pkgs , pkg )
52
79
return nil
53
80
})
54
81
if err != nil {
55
- t . Errorf ( "packages.Walk(build.Default, %q, func) failed with %v; want success" , dir , err )
82
+ return nil , err
56
83
}
57
- if got , want := n , 1 ; got != want {
58
- t .Errorf ("n = %d; want %d" , got , want )
84
+ return pkgs , nil
85
+ }
86
+
87
+ func checkPackages (t * testing.T , got []* build.Package , want []* build.Package ) {
88
+ if len (got ) != len (want ) {
89
+ t .Fatalf ("got %d packages; want %d" , len (got ), len (want ))
90
+ }
91
+ for i := 0 ; i < len (got ); i ++ {
92
+ checkPackage (t , got [i ], want [i ])
59
93
}
60
94
}
61
95
62
- func TestWalkNested (t * testing.T ) {
63
- dir , err := tempDir ()
64
- if err != nil {
65
- t .Fatalf ("tempDir() failed with %v; want success" , err )
96
+ func checkPackage (t * testing.T , got , want * build.Package ) {
97
+ if ! reflect .DeepEqual (got .Name , want .Name ) {
98
+ t .Errorf ("got package name %q; want %q" , got .Name , want .Name )
66
99
}
67
- defer os .RemoveAll (dir )
100
+ if ! reflect .DeepEqual (got .GoFiles , want .GoFiles ) {
101
+ t .Errorf ("in package %q, got GoFiles %v; want %v" , got .Name , got .GoFiles , want .GoFiles )
102
+ }
103
+ if ! reflect .DeepEqual (got .CgoFiles , want .CgoFiles ) {
104
+ t .Errorf ("in package %q, got CgoFiles %v; want %v" , got .Name , got .CgoFiles , want .CgoFiles )
105
+ }
106
+ if ! reflect .DeepEqual (got .CFiles , want .CFiles ) {
107
+ t .Errorf ("in package %q, got CFiles %v; want %v" , got .Name , got .CFiles , want .CFiles )
108
+ }
109
+ if ! reflect .DeepEqual (got .TestGoFiles , want .TestGoFiles ) {
110
+ t .Errorf ("in package %q, got TestGoFiles %v; want %v" , got .Name , got .TestGoFiles , want .TestGoFiles )
111
+ }
112
+ if ! reflect .DeepEqual (got .XTestGoFiles , want .XTestGoFiles ) {
113
+ t .Errorf ("in package %q, got XTestGoFiles %v; want %v" , got .Name , got .XTestGoFiles , want .XTestGoFiles )
114
+ }
115
+ }
68
116
69
- for _ , p := range []struct {
70
- path , content string
71
- }{
117
+ func TestWalkEmpty (t * testing.T ) {
118
+ files := []fileSpec {
119
+ {path : "a/foo.c" },
120
+ {path : "b/" },
121
+ }
122
+ want := []* build.Package {}
123
+ checkFiles (t , files , want )
124
+ }
125
+
126
+ func TestWalkSimple (t * testing.T ) {
127
+ files := []fileSpec {{path : "lib.go" , content : "package lib" }}
128
+ want := []* build.Package {
129
+ {
130
+ Name : "lib" ,
131
+ GoFiles : []string {"lib.go" },
132
+ },
133
+ }
134
+ checkFiles (t , files , want )
135
+ }
136
+
137
+ func TestWalkNested (t * testing.T ) {
138
+ files := []fileSpec {
72
139
{path : "a/foo.go" , content : "package a" },
73
140
{path : "b/c/bar.go" , content : "package c" },
74
141
{path : "b/d/baz.go" , content : "package main" },
75
- } {
76
- path := filepath .Join (dir , p .path )
77
- if err := os .MkdirAll (filepath .Dir (path ), 0700 ); err != nil {
78
- t .Fatalf ("os.MkdirAll(%q, 0700) failed with %v; want success" , filepath .Dir (path ), err )
79
- }
80
- if err := ioutil .WriteFile (path , []byte (p .content ), 0600 ); err != nil {
81
- t .Fatalf ("ioutil.WriteFile(%q, %q, 0600) failed with %v; want success" , path , p .content , err )
82
- }
83
142
}
143
+ want := []* build.Package {
144
+ {
145
+ Name : "a" ,
146
+ GoFiles : []string {"foo.go" },
147
+ },
148
+ {
149
+ Name : "c" ,
150
+ GoFiles : []string {"bar.go" },
151
+ },
152
+ {
153
+ Name : "main" ,
154
+ GoFiles : []string {"baz.go" },
155
+ },
156
+ }
157
+ checkFiles (t , files , want )
158
+ }
84
159
85
- var dirs , pkgs []string
86
- err = packages .Walk (build .Default , dir , func (pkg * build.Package ) error {
87
- rel , err := filepath .Rel (dir , pkg .Dir )
88
- if err != nil {
89
- t .Errorf ("filepath.Rel(%q, %q) failed with %v; want success" , dir , pkg .Dir , err )
90
- return err
91
- }
92
- dirs = append (dirs , filepath .ToSlash (rel ))
93
- pkgs = append (pkgs , pkg .Name )
94
- return nil
95
- })
96
- if err != nil {
97
- t .Errorf ("packages.Walk(build.Default, %q, func) failed with %v; want success" , dir , err )
160
+ func TestMultiplePackagesWithDefault (t * testing.T ) {
161
+ files := []fileSpec {
162
+ {path : "a/a.go" , content : "package a" },
163
+ {path : "a/b.go" , content : "package b" },
98
164
}
165
+ want := []* build.Package {
166
+ {
167
+ Name : "a" ,
168
+ GoFiles : []string {"a.go" },
169
+ },
170
+ }
171
+ checkFiles (t , files , want )
172
+ }
99
173
100
- sort .Strings (dirs )
101
- if got , want := dirs , []string {"a" , "b/c" , "b/d" }; ! reflect .DeepEqual (got , want ) {
102
- t .Errorf ("pkgs = %q; want %q" , got , want )
174
+ func TestMultiplePackagesWithoutDefault (t * testing.T ) {
175
+ files := []fileSpec {
176
+ {path : "a/b.go" , content : "package b" },
177
+ {path : "a/c.go" , content : "package c" },
178
+ }
179
+ dir , err := createFiles (files )
180
+ if err != nil {
181
+ t .Fatalf ("createFiles() failed with %v; want success" , err )
103
182
}
104
- sort .Strings (pkgs )
105
- if got , want := pkgs , []string {"a" , "c" , "main" }; ! reflect .DeepEqual (got , want ) {
106
- t .Errorf ("pkgs = %q; want %q" , got , want )
183
+ defer os .RemoveAll (dir )
184
+
185
+ _ , err = walkPackages (dir )
186
+ if _ , ok := err .(* build.MultiplePackageError ); ! ok {
187
+ t .Errorf ("got %v; want MultiplePackageError" , err )
107
188
}
108
189
}
0 commit comments