diff --git a/pkg/controller/controller_test.go b/pkg/controller/controller_test.go index e4ccd7970b..2194220e31 100644 --- a/pkg/controller/controller_test.go +++ b/pkg/controller/controller_test.go @@ -18,9 +18,11 @@ package controller_test import ( "fmt" + rt "runtime" . "github.com/onsi/ginkgo" . "github.com/onsi/gomega" + "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/controller" "sigs.k8s.io/controller-runtime/pkg/manager" @@ -90,6 +92,27 @@ var _ = Describe("controller.Controller", func() { close(done) }) + + It("should not leak goroutines when stop", func(done Done) { + // TODO(directxman12): After closing the proper leaks on watch this must be reduced to 0 + // The leaks currently come from the event-related code (as in corev1.Event). + threshold := 3 + + m, err := manager.New(cfg, manager.Options{}) + Expect(err).NotTo(HaveOccurred()) + + _, err = controller.New("new-controller", m, controller.Options{Reconciler: rec}) + Expect(err).NotTo(HaveOccurred()) + + startGoroutines := rt.NumGoroutine() + s := make(chan struct{}) + close(s) + + Expect(m.Start(s)).NotTo(HaveOccurred()) + Expect(rt.NumGoroutine() - startGoroutines).To(BeNumerically("<=", threshold)) + + close(done) + }) }) }) diff --git a/pkg/manager/manager_test.go b/pkg/manager/manager_test.go index 738cac7c8a..253be418ba 100644 --- a/pkg/manager/manager_test.go +++ b/pkg/manager/manager_test.go @@ -21,11 +21,13 @@ import ( "io/ioutil" "net" "net/http" + rt "runtime" "github.com/go-logr/logr" . "github.com/onsi/ginkgo" . "github.com/onsi/gomega" "github.com/prometheus/client_golang/prometheus" + "k8s.io/apimachinery/pkg/api/meta" "k8s.io/apimachinery/pkg/runtime" "k8s.io/client-go/rest" @@ -747,6 +749,23 @@ var _ = Describe("manger.Manager", func() { }) }) + It("should not leak goroutines when stop", func(done Done) { + // TODO(directxman12): After closing the proper leaks on watch this must be reduced to 0 + // The leaks currently come from the event-related code (as in corev1.Event). + threshold := 3 + + m, err := New(cfg, Options{}) + Expect(err).NotTo(HaveOccurred()) + startGoruntime := rt.NumGoroutine() + + s := make(chan struct{}) + close(s) + Expect(m.Start(s)).NotTo(HaveOccurred()) + + Expect(rt.NumGoroutine() - startGoruntime).To(BeNumerically("<=", threshold)) + close(done) + }) + It("should provide a function to get the Config", func() { m, err := New(cfg, Options{}) Expect(err).NotTo(HaveOccurred())