Skip to content

Commit 7f6ed56

Browse files
committed
deepcopy_integration_test: Be more integrated
1 parent fccee29 commit 7f6ed56

File tree

2 files changed

+51
-36
lines changed

2 files changed

+51
-36
lines changed

pkg/deepcopy/deepcopy_integration_test.go

Lines changed: 48 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -17,34 +17,51 @@ limitations under the License.
1717
package deepcopy_test
1818

1919
import (
20+
"io"
2021
"io/ioutil"
2122
"os"
23+
"sort"
2224

2325
"github.com/google/go-cmp/cmp"
2426
. "github.com/onsi/ginkgo"
2527
. "github.com/onsi/gomega"
26-
"golang.org/x/tools/go/packages"
2728

2829
"sigs.k8s.io/controller-tools/pkg/deepcopy"
30+
"sigs.k8s.io/controller-tools/pkg/genall"
2931
"sigs.k8s.io/controller-tools/pkg/loader"
3032
"sigs.k8s.io/controller-tools/pkg/markers"
3133
)
3234

33-
func packageErrors(pkg *loader.Package, filterKinds ...packages.ErrorKind) error {
34-
toSkip := make(map[packages.ErrorKind]struct{})
35-
for _, errKind := range filterKinds {
36-
toSkip[errKind] = struct{}{}
35+
type outputToMap map[string]*outputFile
36+
37+
// Open implements genall.OutputRule.
38+
func (m outputToMap) Open(_ *loader.Package, path string) (io.WriteCloser, error) {
39+
if _, ok := m[path]; !ok {
40+
m[path] = &outputFile{}
3741
}
38-
var outErr error
39-
packages.Visit([]*packages.Package{pkg.Package}, nil, func(pkgRaw *packages.Package) {
40-
for _, err := range pkgRaw.Errors {
41-
if _, skip := toSkip[err.Kind]; skip {
42-
continue
43-
}
44-
outErr = err
45-
}
46-
})
47-
return outErr
42+
return m[path], nil
43+
}
44+
45+
func (m outputToMap) fileList() []string {
46+
ret := make([]string, 0, len(m))
47+
for path := range m {
48+
ret = append(ret, path)
49+
}
50+
sort.Strings(ret)
51+
return ret
52+
}
53+
54+
type outputFile struct {
55+
contents []byte
56+
}
57+
58+
func (o *outputFile) Write(p []byte) (int, error) {
59+
o.contents = append(o.contents, p...)
60+
return len(p), nil
61+
}
62+
63+
func (o *outputFile) Close() error {
64+
return nil
4865
}
4966

5067
var _ = Describe("CRD Generation From Parsing to CustomResourceDefinition", func() {
@@ -55,28 +72,23 @@ var _ = Describe("CRD Generation From Parsing to CustomResourceDefinition", func
5572
Expect(os.Chdir("./testdata")).To(Succeed()) // go modules are directory-sensitive
5673
defer func() { Expect(os.Chdir(cwd)).To(Succeed()) }()
5774

58-
By("loading the roots")
59-
pkgs, err := loader.LoadRoots(".")
60-
Expect(err).NotTo(HaveOccurred())
61-
Expect(pkgs).To(HaveLen(1))
62-
cronJobPkg := pkgs[0]
75+
output := make(outputToMap)
6376

64-
By("setting up the generation context")
65-
collector := &markers.Collector{Registry: &markers.Registry{}}
66-
Expect(deepcopy.Generator{}.RegisterMarkers(collector.Registry)).To(Succeed())
67-
checker := &loader.TypeChecker{}
68-
ctx := &deepcopy.ObjectGenCtx{
69-
Collector: collector,
70-
Checker: checker,
71-
}
72-
73-
By("requesting that types be generated")
74-
outContents := ctx.GenerateForPackage(cronJobPkg)
77+
By("initializing the runtime")
78+
optionsRegistry := &markers.Registry{}
79+
Expect(optionsRegistry.Register(markers.Must(markers.MakeDefinition("object", markers.DescribesPackage, deepcopy.Generator{})))).To(Succeed())
80+
rt, err := genall.FromOptions(optionsRegistry, []string{"object"})
81+
Expect(err).NotTo(HaveOccurred())
82+
rt.OutputRules = genall.OutputRules{Default: output}
7583

76-
By("checking that no errors occurred along the way (expect for type errors)")
77-
Expect(packageErrors(cronJobPkg, packages.TypeError)).NotTo(HaveOccurred())
84+
By("running the generator and checking for errors")
85+
hadErrs := rt.Run()
7886

7987
By("checking that we got output contents")
88+
Expect(output.fileList()).To(ContainElement("zz_generated.deepcopy.go")) // Don't use HaveKey--the output is too verbose to be usable
89+
outFile := output["zz_generated.deepcopy.go"]
90+
Expect(outFile).NotTo(BeNil())
91+
outContents := outFile.contents
8092
Expect(outContents).NotTo(BeNil())
8193

8294
By("loading the desired code")
@@ -85,5 +97,8 @@ var _ = Describe("CRD Generation From Parsing to CustomResourceDefinition", func
8597

8698
By("comparing the two")
8799
Expect(string(outContents)).To(Equal(string(expectedFile)), "generated code not as expected, check pkg/deepcopy/testdata/README.md for more details.\n\nDiff:\n\n%s", cmp.Diff(outContents, expectedFile))
100+
101+
By("checking for errors")
102+
Expect(hadErrs).To(BeFalse())
88103
})
89104
})

pkg/deepcopy/gen.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -144,7 +144,7 @@ func (d Generator) Generate(ctx *genall.GenerationContext) error {
144144
}
145145

146146
for _, root := range ctx.Roots {
147-
outContents := objGenCtx.GenerateForPackage(root)
147+
outContents := objGenCtx.generateForPackage(root)
148148
if outContents == nil {
149149
continue
150150
}
@@ -186,10 +186,10 @@ import (
186186

187187
}
188188

189-
// GenerateForPackage generates DeepCopy and runtime.Object implementations for
189+
// generateForPackage generates DeepCopy and runtime.Object implementations for
190190
// types in the given package, writing the formatted result to given writer.
191191
// May return nil if source could not be generated.
192-
func (ctx *ObjectGenCtx) GenerateForPackage(root *loader.Package) []byte {
192+
func (ctx *ObjectGenCtx) generateForPackage(root *loader.Package) []byte {
193193
allTypes, err := enabledOnPackage(ctx.Collector, root)
194194
if err != nil {
195195
root.AddError(err)

0 commit comments

Comments
 (0)