tests: add an helper to start/stop components

This commit is contained in:
Vincent Bernat
2022-04-13 16:59:01 +02:00
parent b44836aa97
commit ce9bd6a4da
18 changed files with 141 additions and 225 deletions

View File

@@ -25,14 +25,7 @@ func SetupClickHouse(t *testing.T, r *reporter.Reporter) *Component {
if err != nil {
t.Fatalf("New() error:\n%+v", err)
}
if err := c.Start(); err != nil {
t.Fatalf("Start() error:\n%+v", err)
}
t.Cleanup(func() {
if err := c.Stop(); err != nil {
t.Errorf("Stop() error:\n%+v", err)
}
})
helpers.StartStop(t, c)
return c
}
@@ -59,14 +52,6 @@ func NewMock(t *testing.T, r *reporter.Reporter) (*Component, *mocks.MockConn) {
Close().
Return(nil)
if err := c.Start(); err != nil {
t.Fatalf("Start() error:\n%+v", err)
}
t.Cleanup(func() {
if err := c.Stop(); err != nil {
t.Errorf("Stop() error:\n%+v", err)
}
})
helpers.StartStop(t, c)
return c, mock
}

View File

@@ -7,6 +7,7 @@ import (
"gopkg.in/tomb.v2"
"akvorado/common/helpers"
"akvorado/common/reporter"
)
@@ -16,7 +17,7 @@ func TestTerminate(t *testing.T) {
if err != nil {
t.Fatalf("New() error:\n%+v", err)
}
c.Start()
helpers.StartStop(t, c)
select {
case <-c.Terminated():
@@ -75,7 +76,7 @@ func TestTombTracking(t *testing.T) {
}
c.Track(&tomb, "tomb")
c.Start()
helpers.StartStop(t, c)
ch := make(chan bool)
tomb.Go(func() error {

View File

@@ -127,3 +127,27 @@ func CheckExternalService(t *testing.T, name string, dnsCandidates []string, por
return server
}
// StartStop starts a component and stops it on cleanup.
func StartStop(t *testing.T, component interface{}) {
t.Helper()
if starterC, ok := component.(starter); ok {
if err := starterC.Start(); err != nil {
t.Fatalf("Start() error:\n%+v", err)
}
}
t.Cleanup(func() {
if stopperC, ok := component.(stopper); ok {
if err := stopperC.Stop(); err != nil {
t.Errorf("Stop() error:\n%+v", err)
}
}
})
}
type starter interface {
Start() error
}
type stopper interface {
Stop() error
}

View File

@@ -4,7 +4,6 @@ import (
"fmt"
"io/ioutil"
netHTTP "net/http"
"runtime"
"testing"
"akvorado/common/helpers"
@@ -17,15 +16,6 @@ import (
func TestHandler(t *testing.T) {
r := reporter.NewMock(t)
h := http.NewMock(t, r)
defer func() {
h.Stop()
runtime.Gosched()
resp, err := netHTTP.Get(fmt.Sprintf("http://%s/", h.Address))
if err == nil {
t.Errorf("Still able to connect to expvar server after stop")
resp.Body.Close()
}
}()
h.AddHandler("/test",
netHTTP.HandlerFunc(func(w netHTTP.ResponseWriter, r *netHTTP.Request) {
@@ -63,7 +53,6 @@ func TestHandler(t *testing.T) {
func TestGinRouter(t *testing.T) {
r := reporter.NewMock(t)
h := http.NewMock(t, r)
defer h.Stop()
h.GinRouter.GET("/api/v0/test", func(c *gin.Context) {
c.JSON(netHTTP.StatusOK, gin.H{
@@ -89,7 +78,6 @@ func TestGinRouter(t *testing.T) {
func TestGinRouterPanic(t *testing.T) {
r := reporter.NewMock(t)
h := http.NewMock(t, r)
defer h.Stop()
h.GinRouter.GET("/api/v0/test", func(c *gin.Context) {
panic("heeeelp")

View File

@@ -6,6 +6,7 @@ import (
"testing"
"akvorado/common/daemon"
"akvorado/common/helpers"
"akvorado/common/reporter"
)
@@ -19,8 +20,6 @@ func NewMock(t *testing.T, r *reporter.Reporter) *Component {
if err != nil {
t.Fatalf("New() error:\n%+v", err)
}
if err := c.Start(); err != nil {
t.Fatalf("Start() error:\n%+v", err)
}
helpers.StartStop(t, c)
return c
}

View File

@@ -247,10 +247,7 @@ interfaceclassifiers:
if err != nil {
t.Fatalf("New() error:\n%+v", err)
}
if err := c.Start(); err != nil {
t.Fatalf("Start() error:\n%+v", err)
}
defer c.Stop()
helpers.StartStop(t, c)
// Inject twice since otherwise, we get a cache miss
received := make(chan bool)

View File

@@ -47,14 +47,7 @@ func TestCore(t *testing.T) {
if err != nil {
t.Fatalf("New() error:\n%+v", err)
}
if err := c.Start(); err != nil {
t.Fatalf("Start() error:\n%+v", err)
}
defer func() {
if err := c.Stop(); err != nil {
t.Fatalf("Stop() error:\n%+v", err)
}
}()
helpers.StartStop(t, c)
flowMessage := func(exporter string, in, out uint32) *flow.Message {
return &flow.Message{

View File

@@ -29,11 +29,6 @@ func TestFlow(t *testing.T) {
},
}
c := NewMock(t, r, config)
defer func() {
if err := c.Stop(); err != nil {
t.Fatalf("Stop() error:\n%+v", err)
}
}()
// Receive flows
received := []*Message{}

View File

@@ -6,6 +6,7 @@ import (
"testing"
"akvorado/common/daemon"
"akvorado/common/helpers"
"akvorado/common/http"
"akvorado/common/reporter"
"akvorado/inlet/flow/input/udp"
@@ -33,9 +34,7 @@ func NewMock(t *testing.T, r *reporter.Reporter, config Configuration) *Componen
if err != nil {
t.Fatalf("New() error:\n%+v", err)
}
if err := c.Start(); err != nil {
t.Fatalf("Start() error:\n%+v", err)
}
helpers.StartStop(t, c)
return c
}

View File

@@ -46,15 +46,7 @@ func TestDatabaseRefresh(t *testing.T) {
if err != nil {
t.Fatalf("New() error:\n%+v", err)
}
if err := c.Start(); err != nil {
t.Fatalf("Start() error:\n%+v", err)
}
defer func() {
if err := c.Stop(); err != nil {
t.Fatalf("Stop() error:\n%+v", err)
}
}()
helpers.StartStop(t, c)
// Check we did load both databases
gotMetrics := r.GetMetrics("akvorado_inlet_geoip_db_")
@@ -87,13 +79,7 @@ func TestStartWithoutDatabase(t *testing.T) {
if err != nil {
t.Fatalf("New() error:\n%+v", err)
}
if err := c.Start(); err != nil {
t.Fatalf("Start() error:\n%+v", err)
}
if err := c.Stop(); err != nil {
t.Fatalf("Stop() error:\n%+v", err)
}
helpers.StartStop(t, c)
}
func TestStartWithMissingDatabase(t *testing.T) {

View File

@@ -9,6 +9,7 @@ import (
"testing"
"akvorado/common/daemon"
"akvorado/common/helpers"
"akvorado/common/reporter"
)
@@ -27,8 +28,6 @@ func NewMock(t *testing.T, r *reporter.Reporter) *Component {
if err != nil {
t.Fatalf("New() error:\n%+s", err)
}
if err := c.Start(); err != nil {
t.Fatalf("Start() error:\n%+s", err)
}
helpers.StartStop(t, c)
return c
}

View File

@@ -32,14 +32,7 @@ func TestRealKafka(t *testing.T) {
if err != nil {
t.Fatalf("New() error:\n%+v", err)
}
if err := c.Start(); err != nil {
t.Fatalf("Start() error:\n%+v", err)
}
defer func() {
if err := c.Stop(); err != nil {
t.Fatalf("Stop() error:\n%+v", err)
}
}()
helpers.StartStop(t, c)
c.Send("127.0.0.1", []byte("hello world!"))
c.Send("127.0.0.1", []byte("goodbye world!"))

View File

@@ -53,10 +53,6 @@ func TestKafka(t *testing.T) {
if diff := helpers.Diff(gotMetrics, expectedMetrics); diff != "" {
t.Fatalf("Metrics (-got, +want):\n%s", diff)
}
if err := c.Stop(); err != nil {
t.Fatalf("Stop() error:\n%+v", err)
}
}
func TestKafkaMetrics(t *testing.T) {

View File

@@ -9,6 +9,7 @@ import (
"github.com/Shopify/sarama/mocks"
"akvorado/common/daemon"
"akvorado/common/helpers"
"akvorado/common/reporter"
)
@@ -27,9 +28,6 @@ func NewMock(t *testing.T, reporter *reporter.Reporter, configuration Configurat
return mockProducer, nil
}
if err := c.Start(); err != nil {
t.Fatalf("Start() error:\n%+v", err)
}
helpers.StartStop(t, c)
return c, mockProducer
}

View File

@@ -26,11 +26,6 @@ func expectSNMPLookup(t *testing.T, c *Component, exporter string, ifIndex uint,
func TestLookup(t *testing.T) {
r := reporter.NewMock(t)
c := NewMock(t, r, DefaultConfiguration(), Dependencies{Daemon: daemon.NewMock(t)})
defer func() {
if err := c.Stop(); err != nil {
t.Fatalf("Stop() error:\n%+v", err)
}
}()
expectSNMPLookup(t, c, "127.0.0.1", 765, answer{Err: ErrCacheMiss})
time.Sleep(30 * time.Millisecond)
@@ -49,11 +44,6 @@ func TestSNMPCommunities(t *testing.T) {
"127.0.0.2": "private",
}
c := NewMock(t, r, configuration, Dependencies{Daemon: daemon.NewMock(t)})
defer func() {
if err := c.Stop(); err != nil {
t.Fatalf("Stop() error:\n%+v", err)
}
}()
// Use "public" as a community. Should work.
expectSNMPLookup(t, c, "127.0.0.1", 765, answer{Err: ErrCacheMiss})
@@ -75,9 +65,11 @@ func TestSNMPCommunities(t *testing.T) {
}
func TestComponentSaveLoad(t *testing.T) {
r := reporter.NewMock(t)
configuration := DefaultConfiguration()
configuration.CachePersistFile = filepath.Join(t.TempDir(), "cache")
t.Run("save", func(t *testing.T) {
r := reporter.NewMock(t)
c := NewMock(t, r, configuration, Dependencies{Daemon: daemon.NewMock(t)})
expectSNMPLookup(t, c, "127.0.0.1", 765, answer{Err: ErrCacheMiss})
@@ -86,19 +78,16 @@ func TestComponentSaveLoad(t *testing.T) {
ExporterName: "127_0_0_1",
Interface: Interface{Name: "Gi0/0/765", Description: "Interface 765", Speed: 1000},
})
if err := c.Stop(); err != nil {
t.Fatalf("Stop() error:\n%+c", err)
}
})
r = reporter.NewMock(t)
c = NewMock(t, r, configuration, Dependencies{Daemon: daemon.NewMock(t)})
t.Run("load", func(t *testing.T) {
r := reporter.NewMock(t)
c := NewMock(t, r, configuration, Dependencies{Daemon: daemon.NewMock(t)})
expectSNMPLookup(t, c, "127.0.0.1", 765, answer{
ExporterName: "127_0_0_1",
Interface: Interface{Name: "Gi0/0/765", Description: "Interface 765", Speed: 1000},
})
if err := c.Stop(); err != nil {
t.Fatalf("Stop() error:\n%+c", err)
}
})
}
func TestAutoRefresh(t *testing.T) {
@@ -131,11 +120,6 @@ func TestAutoRefresh(t *testing.T) {
Interface: Interface{Name: "Gi0/0/765", Description: "Interface 765", Speed: 1000},
})
// Stop and look at the cache
if err := c.Stop(); err != nil {
t.Fatalf("Stop() error:\n%+v", err)
}
gotMetrics := r.GetMetrics("akvorado_inlet_snmp_cache_")
expectedMetrics := map[string]string{
`expired`: "0",
@@ -185,10 +169,7 @@ func TestStartStopWithMultipleWorkers(t *testing.T) {
r := reporter.NewMock(t)
configuration := DefaultConfiguration()
configuration.Workers = 5
c := NewMock(t, r, configuration, Dependencies{Daemon: daemon.NewMock(t)})
if err := c.Stop(); err != nil {
t.Fatalf("Stop() error:\n%+v", err)
}
NewMock(t, r, configuration, Dependencies{Daemon: daemon.NewMock(t)})
}
type logCoalescePoller struct {
@@ -201,11 +182,12 @@ func (fcp *logCoalescePoller) Poll(ctx context.Context, exporterIP string, _ uin
}
func TestCoalescing(t *testing.T) {
r := reporter.NewMock(t)
c := NewMock(t, r, DefaultConfiguration(), Dependencies{Daemon: daemon.NewMock(t)})
lcp := &logCoalescePoller{
received: []lookupRequest{},
}
r := reporter.NewMock(t)
t.Run("run", func(t *testing.T) {
c := NewMock(t, r, DefaultConfiguration(), Dependencies{Daemon: daemon.NewMock(t)})
c.poller = lcp
// Block dispatcher
@@ -222,6 +204,7 @@ func TestCoalescing(t *testing.T) {
time.Sleep(20 * time.Millisecond)
close(blocker)
time.Sleep(20 * time.Millisecond)
})
gotMetrics := r.GetMetrics("akvorado_inlet_snmp_poller_", "coalesced_count")
expectedMetrics := map[string]string{
@@ -231,10 +214,6 @@ func TestCoalescing(t *testing.T) {
t.Errorf("Metrics (-got, +want):\n%s", diff)
}
if err := c.Stop(); err != nil {
t.Fatalf("Stop() error:\n%+v", err)
}
expectedAccepted := []lookupRequest{
{"127.0.0.1", []uint{766, 767, 768, 769}},
}
@@ -264,11 +243,6 @@ func TestPollerBreaker(t *testing.T) {
configuration := DefaultConfiguration()
configuration.PollerCoalesce = 0
c := NewMock(t, r, configuration, Dependencies{Daemon: daemon.NewMock(t)})
defer func() {
if err := c.Stop(); err != nil {
t.Fatalf("Stop() error:\n%+v", err)
}
}()
if tc.Poller != nil {
c.poller = tc.Poller
}

View File

@@ -8,6 +8,7 @@ import (
"strings"
"testing"
"akvorado/common/helpers"
"akvorado/common/reporter"
)
@@ -48,8 +49,6 @@ func NewMock(t *testing.T, reporter *reporter.Reporter, configuration Configurat
}
// Change the poller to a fake one.
c.poller = newMockPoller("public", c.sc.Put)
if err := c.Start(); err != nil {
t.Fatalf("Start() error:\n%+v", err)
}
helpers.StartStop(t, c)
return c
}

View File

@@ -17,6 +17,7 @@ func TestRealClickHouse(t *testing.T) {
r := reporter.NewMock(t)
chComponent := clickhousedb.SetupClickHouse(t, r)
t.Run("first time", func(t *testing.T) {
configuration := DefaultConfiguration()
ch, err := New(r, configuration, Dependencies{
Daemon: daemon.NewMock(t),
@@ -26,9 +27,7 @@ func TestRealClickHouse(t *testing.T) {
if err != nil {
t.Fatalf("New() error:\n%+v", err)
}
if err := ch.Start(); err != nil {
t.Fatalf("Start() error:\n%+v", err)
}
helpers.StartStop(t, ch)
select {
case <-ch.migrationsDone:
case <-time.After(3 * time.Second):
@@ -61,12 +60,11 @@ func TestRealClickHouse(t *testing.T) {
if diff := helpers.Diff(got, expected); diff != "" {
t.Fatalf("SHOW TABLES (-got, +want):\n%s", diff)
}
if err := ch.Stop(); err != nil {
t.Fatalf("Stop() error:\n%+v", err)
}
})
// Check we can run a second time
ch, err = New(r, configuration, Dependencies{
t.Run("second time", func(t *testing.T) {
configuration := DefaultConfiguration()
ch, err := New(r, configuration, Dependencies{
Daemon: daemon.NewMock(t),
HTTP: http.NewMock(t, r),
ClickHouse: chComponent,
@@ -74,13 +72,11 @@ func TestRealClickHouse(t *testing.T) {
if err != nil {
t.Fatalf("New() error:\n%+v", err)
}
if err := ch.Start(); err != nil {
t.Fatalf("Start() error:\n%+v", err)
}
helpers.StartStop(t, ch)
select {
case <-ch.migrationsDone:
case <-time.After(3 * time.Second):
t.Fatalf("Migrations not done")
}
ch.Stop()
})
}

View File

@@ -66,9 +66,7 @@ func TestTopicCreation(t *testing.T) {
if err != nil {
t.Fatalf("New() error:\n%+v", err)
}
if err := c.Start(); err != nil {
t.Fatalf("Start() error:\n%+v", err)
}
helpers.StartStop(t, c)
adminClient, err := sarama.NewClusterAdminFromClient(client)
if err != nil {
@@ -111,9 +109,7 @@ func TestTopicMorePartitions(t *testing.T) {
if err != nil {
t.Fatalf("New() error:\n%+v", err)
}
if err := c.Start(); err != nil {
t.Fatalf("Start() error:\n%+v", err)
}
helpers.StartStop(t, c)
adminClient, err := sarama.NewClusterAdminFromClient(client)
if err != nil {
@@ -138,9 +134,7 @@ func TestTopicMorePartitions(t *testing.T) {
if err != nil {
t.Fatalf("New() error:\n%+v", err)
}
if err := c.Start(); err != nil {
t.Fatalf("Start() error:\n%+v", err)
}
helpers.StartStop(t, c)
topics, err = adminClient.ListTopics()
if err != nil {