mirror of
https://github.com/akvorado/akvorado.git
synced 2025-12-12 06:24:10 +01:00
tests: add an helper to start/stop components
This commit is contained in:
@@ -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
|
||||
}
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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")
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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{
|
||||
|
||||
@@ -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{}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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!"))
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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()
|
||||
})
|
||||
}
|
||||
|
||||
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user