instrument main() for tests (#1399)

This commit is contained in:
mmetc 2022-04-01 11:17:45 +02:00 committed by GitHub
parent b202e387cf
commit dad22a6aba
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
10 changed files with 77 additions and 26 deletions

4
.gitignore vendored
View file

@ -7,8 +7,9 @@
*~
.pc
# Test binary, built with `go test -c`
# Test binaries, built with `go test -c`
*.test
*.cover
# Output of the go coverage tool, specifically when used with LiteIDE
*.out
@ -20,7 +21,6 @@
# Dependency directories (remove the comment below to include it)
# vendor/
# crowdsec binaries
cmd/crowdsec-cli/cscli
cmd/crowdsec/crowdsec

View file

@ -109,9 +109,15 @@ clean: testclean
cscli: goversion
@GOARCH=$(GOARCH) GOOS=$(GOOS) $(MAKE) -C $(CSCLI_FOLDER) build --no-print-directory
cscli-bincover: goversion
@GOARCH=$(GOARCH) GOOS=$(GOOS) $(MAKE) -C $(CSCLI_FOLDER) build-bincover --no-print-directory
crowdsec: goversion
@GOARCH=$(GOARCH) GOOS=$(GOOS) $(MAKE) -C $(CROWDSEC_FOLDER) build --no-print-directory
crowdsec-bincover: goversion
@GOARCH=$(GOARCH) GOOS=$(GOOS) $(MAKE) -C $(CROWDSEC_FOLDER) build-bincover --no-print-directory
http-plugin: goversion
@GOARCH=$(GOARCH) GOOS=$(GOOS) $(MAKE) -C $(HTTP_PLUGIN_FOLDER) build --no-print-directory

View file

@ -4,7 +4,10 @@ GOBUILD=$(GOCMD) build
GOCLEAN=$(GOCMD) clean
GOTEST=$(GOCMD) test
GOGET=$(GOCMD) get
BINARY_NAME=cscli
# names longer than 15 chars break 'pgrep'
BINARY_NAME_COVER=$(BINARY_NAME).cover
PREFIX?="/"
BIN_PREFIX = $(PREFIX)"/usr/local/bin/"
@ -14,6 +17,9 @@ all: clean build
build: clean
@$(GOBUILD) $(LD_OPTS) -o $(BINARY_NAME) -v
build-bincover: clean
$(GOTEST) . -tags testrunmain -coverpkg=all -covermode=atomic $(LD_OPTS) -c -o $(BINARY_NAME_COVER)
static: clean
@$(GOBUILD) $(LD_OPTS_STATIC) -o $(BINARY_NAME) -v -a -tags netgo
@ -30,4 +36,4 @@ uninstall:
@$(RM) -r $(BIN_PREFIX)$(BINARY_NAME)
clean:
@$(RM) $(BINARY_NAME)
@$(RM) $(BINARY_NAME) $(BINARY_NAME_COVER)

View file

@ -0,0 +1,13 @@
//go:build testrunmain
package main
import (
"github.com/confluentinc/bincover"
"testing"
)
func TestBincoverRunMain(t *testing.T) {
bincover.RunTest(main)
}

View file

@ -6,6 +6,8 @@ GOTEST=$(GOCMD) test
GOGET=$(GOCMD) get
CROWDSEC_BIN=crowdsec
# names longer than 15 chars break 'pgrep'
CROWDSEC_BIN_COVER=$(CROWDSEC_BIN).cover
PREFIX?="/"
CFG_PREFIX = $(PREFIX)"/etc/crowdsec/config/"
BIN_PREFIX = $(PREFIX)"/usr/local/bin/"
@ -20,6 +22,9 @@ all: clean test build
build: clean
$(GOBUILD) $(LD_OPTS) -o $(CROWDSEC_BIN) -v
build-bincover: clean
$(GOTEST) . -tags testrunmain -coverpkg=all -covermode=atomic $(LD_OPTS) -c -o $(CROWDSEC_BIN_COVER)
static: clean
$(GOBUILD) $(LD_OPTS_STATIC) -o $(CROWDSEC_BIN) -v -a -tags netgo
@ -27,7 +32,7 @@ test:
$(GOTEST) $(LD_OPTS) -v ./...
clean:
@$(RM) $(CROWDSEC_BIN)
@$(RM) $(CROWDSEC_BIN) $(CROWDSEC_BIN).test $(CROWDSEC_BIN_COVER)
.PHONY: install
install: install-conf install-bin

View file

@ -266,6 +266,8 @@ func main() {
defer types.CatchPanic("crowdsec/main")
log.Debugf("os.Args: %v", os.Args)
// Handle command line arguments
flags = &Flags{}
flags.Parse()
@ -301,8 +303,10 @@ func main() {
go registerPrometheus(cConfig.Prometheus)
}
if err := Serve(cConfig); err != nil {
log.Fatalf(err.Error())
if rc, err := Serve(cConfig); err != nil {
if err != nil {
log.Errorf(err.Error())
os.Exit(rc)
}
}
}

13
cmd/crowdsec/main_test.go Normal file
View file

@ -0,0 +1,13 @@
//go:build testrunmain
package main
import (
"github.com/confluentinc/bincover"
"testing"
)
func TestBincoverRunMain(t *testing.T) {
bincover.RunTest(main)
}

View file

@ -177,10 +177,11 @@ func shutdown(sig os.Signal, cConfig *csconfig.Config) error {
return nil
}
func HandleSignals(cConfig *csconfig.Config) {
func HandleSignals(cConfig *csconfig.Config) int {
signalChan := make(chan os.Signal, 1)
signal.Notify(signalChan,
syscall.SIGHUP,
syscall.SIGINT,
syscall.SIGTERM)
exitChan := make(chan int)
@ -198,8 +199,8 @@ func HandleSignals(cConfig *csconfig.Config) {
if err := reloadHandler(s, cConfig); err != nil {
log.Fatalf("Reload handler failure : %s", err)
}
// kill -SIGTERM XXXX
case syscall.SIGTERM:
// ctrl+C, kill -SIGINT XXXX, kill -SIGTERM XXXX
case syscall.SIGINT, syscall.SIGTERM:
log.Warningf("SIGTERM received, shutting down")
if err := shutdown(s, cConfig); err != nil {
log.Fatalf("failed shutdown : %s", err)
@ -211,10 +212,10 @@ func HandleSignals(cConfig *csconfig.Config) {
code := <-exitChan
log.Warningf("Crowdsec service shutting down")
os.Exit(code)
return code
}
func Serve(cConfig *csconfig.Config) error {
func Serve(cConfig *csconfig.Config) (int, error) {
acquisTomb = tomb.Tomb{}
parsersTomb = tomb.Tomb{}
bucketsTomb = tomb.Tomb{}
@ -225,7 +226,7 @@ func Serve(cConfig *csconfig.Config) error {
if !cConfig.DisableAPI {
apiServer, err := initAPIServer(cConfig)
if err != nil {
return errors.Wrap(err, "api server init")
return 1, errors.Wrap(err, "api server init")
}
if !flags.TestMode {
serveAPIServer(apiServer)
@ -235,7 +236,7 @@ func Serve(cConfig *csconfig.Config) error {
if !cConfig.DisableAgent {
csParsers, err := initCrowdsec(cConfig)
if err != nil {
return errors.Wrap(err, "crowdsec init")
return 1, errors.Wrap(err, "crowdsec init")
}
/* if it's just linting, we're done */
if !flags.TestMode {
@ -254,18 +255,17 @@ func Serve(cConfig *csconfig.Config) error {
log.Errorf("Failed to notify(sent: %v): %v", sent, err)
}
/*wait for signals*/
HandleSignals(cConfig)
} else {
for {
select {
case <-apiTomb.Dead():
log.Infof("api shutdown")
os.Exit(0)
case <-crowdsecTomb.Dead():
log.Infof("crowdsec shutdown")
os.Exit(0)
}
return HandleSignals(cConfig), nil
}
for {
select {
case <-apiTomb.Dead():
log.Infof("api shutdown")
os.Exit(0)
case <-crowdsecTomb.Dead():
log.Infof("crowdsec shutdown")
os.Exit(0)
}
}
return nil
}

1
go.mod
View file

@ -78,6 +78,7 @@ require (
github.com/asaskevich/govalidator v0.0.0-20200907205600-7a23bdc65eef // indirect
github.com/beorn7/perks v1.0.1 // indirect
github.com/cespare/xxhash/v2 v2.1.2 // indirect
github.com/confluentinc/bincover v0.2.0 // indirect
github.com/containerd/containerd v1.4.3 // indirect
github.com/cpuguy83/go-md2man/v2 v2.0.1 // indirect
github.com/creack/pty v1.1.11 // indirect

3
go.sum
View file

@ -172,6 +172,8 @@ github.com/cockroachdb/apd v1.1.0 h1:3LFP3629v+1aKXU5Q37mxmRxX/pIu1nijXydLShEq5I
github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ=
github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8=
github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI=
github.com/confluentinc/bincover v0.2.0 h1:WSS3MqzwJbosCLMOuF3tJ0pMpALzBfrm80Tb+/3gbQs=
github.com/confluentinc/bincover v0.2.0/go.mod h1:qeI1wx0RxdGTZtrJY0HVlgJ4NqC/X2Z+fHbvy87tgHE=
github.com/containerd/containerd v1.4.3 h1:ijQT13JedHSHrQGWFcGEwzcNKrAGIiZ+jSD5QQG07SY=
github.com/containerd/containerd v1.4.3/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA=
github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
@ -1539,6 +1541,7 @@ gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.2.7/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=