Skip to content

Commit

Permalink
tests: using net/http/httptest instead of real server + cleaning tear…
Browse files Browse the repository at this point in the history
…down function
  • Loading branch information
rbeuque74 committed May 12, 2018
1 parent d765c95 commit 975c704
Show file tree
Hide file tree
Showing 5 changed files with 101 additions and 93 deletions.
9 changes: 7 additions & 2 deletions plugins/http/http.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,8 @@ func init() {

// HTTPChecker is a plugin to check HTTP service
type HTTPChecker struct {
cfg httpConfig
cfg httpConfig
client *http.Client
}

// Name returns the name of the checker
Expand Down Expand Up @@ -71,7 +72,11 @@ func (c *HTTPChecker) Run(ctx context.Context) plugins.Result {
model.Request = *req

duration := time.Now()
resp, err := http.DefaultClient.Do(req)
client := http.DefaultClient
if c.client != nil {
client = c.client
}
resp, err := client.Do(req)
if err != nil {
model.Err = err
err = fmt.Errorf(plugins.RenderError(c.cfg.templates.ErrRequest, model))
Expand Down
89 changes: 49 additions & 40 deletions plugins/http/http_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,28 +14,27 @@ func TestHTTPServer(t *testing.T) {
srvcfg := FakeTestHTTPServer{
StatusCode: 200,
}
shutdown := NewHTTPServer(t, srvcfg)
defer func() {
ctx, cancelFunc := context.WithTimeout(context.Background(), 200*time.Millisecond)
defer cancelFunc()
shutdown(ctx)
}()
url, httpclient, shutdown := NewHTTPServer(t, srvcfg)
defer shutdown()

time.Sleep(20 * time.Millisecond)

// creating HTTP checker
cfg := map[string]interface{}{
"type": "request",
"url": "http://localhost:8080",
"url": url,
"method": "GET",
"warn": 200,
"crit": 400,
"timeout": 450,
"name": "test-1",
}
checker, err := NewHTTPChecker(cfg, nil)
genChecker, err := NewHTTPChecker(cfg, nil)
assert.Nilf(t, err, "http checker instantiation failed: %q", err)

checker := genChecker.(*HTTPChecker)
checker.client = &httpclient

assert.Equal(t, "HTTP", checker.Name())
assert.Equal(t, "test-1", checker.ServiceName())

Expand All @@ -53,28 +52,27 @@ func TestHTTPServerFails(t *testing.T) {
StatusCode: 200,
Sleep: time.Millisecond * 80,
}
shutdown := NewHTTPServer(t, srvcfg)
defer func() {
ctx, cancelFunc := context.WithTimeout(context.Background(), 200*time.Millisecond)
defer cancelFunc()
shutdown(ctx)
}()
url, httpclient, shutdown := NewHTTPServer(t, srvcfg)
defer shutdown()

time.Sleep(20 * time.Millisecond)

// creating HTTP checker
cfg := map[string]interface{}{
"type": "request",
"url": "http://localhost:8080",
"url": url,
"method": "GET",
"warn": 40,
"crit": 200,
"timeout": 1000,
"name": "test-1",
}
checker, err := NewHTTPChecker(cfg, nil)
genChecker, err := NewHTTPChecker(cfg, nil)
assert.Nilf(t, err, "http checker instantiation failed: %q", err)

checker := genChecker.(*HTTPChecker)
checker.client = &httpclient

ctxRun, cancelFunc1 := context.WithTimeout(context.Background(), time.Second)
defer cancelFunc1()
result := checker.Run(ctxRun)
Expand All @@ -85,9 +83,12 @@ func TestHTTPServerFails(t *testing.T) {
// critical
cfg["warn"] = 10
cfg["crit"] = 50
checker, err = NewHTTPChecker(cfg, nil)
genChecker, err = NewHTTPChecker(cfg, nil)
assert.Nilf(t, err, "http checker instantiation failed: %q", err)

checker = genChecker.(*HTTPChecker)
checker.client = &httpclient

ctxRun, cancelFunc1 = context.WithTimeout(context.Background(), time.Second)
defer cancelFunc1()

Expand All @@ -98,9 +99,12 @@ func TestHTTPServerFails(t *testing.T) {

// bad status code
cfg["code"] = 400
checker, err = NewHTTPChecker(cfg, nil)
genChecker, err = NewHTTPChecker(cfg, nil)
assert.Nilf(t, err, "http checker instantiation failed: %q", err)

checker = genChecker.(*HTTPChecker)
checker.client = &httpclient

ctxRun, cancelFunc1 = context.WithTimeout(context.Background(), time.Second)
defer cancelFunc1()
result = checker.Run(ctxRun)
Expand All @@ -109,23 +113,27 @@ func TestHTTPServerFails(t *testing.T) {

// bad method
cfg["code"] = 200
checker, err = NewHTTPChecker(cfg, nil)
genChecker, err = NewHTTPChecker(cfg, nil)
assert.Nilf(t, err, "http checker instantiation failed: %q", err)

httpChecker := checker.(*HTTPChecker)
httpChecker.cfg.Method = "http not valid method"
checker = genChecker.(*HTTPChecker)
checker.client = &httpclient
checker.cfg.Method = "http not valid method"

ctxRun, cancelFunc1 = context.WithTimeout(context.Background(), time.Second)
defer cancelFunc1()
result = httpChecker.Run(ctxRun)
result = checker.Run(ctxRun)
assert.Equal(t, plugins.STATE_CRITICAL, result.Status)
assert.Equal(t, `net/http: invalid method "http not valid method"`, result.Message)

// conn refused
cfg["url"] = "http://localhost:8081"
checker, err = NewHTTPChecker(cfg, nil)
genChecker, err = NewHTTPChecker(cfg, nil)
assert.Nilf(t, err, "http checker instantiation failed: %q", err)

checker = genChecker.(*HTTPChecker)
checker.client = &httpclient

ctxRun, cancelFunc1 = context.WithTimeout(context.Background(), time.Second)
defer cancelFunc1()

Expand All @@ -140,12 +148,8 @@ func TestHTTPServerFailsTemplating(t *testing.T) {
StatusCode: 200,
Sleep: time.Millisecond * 80,
}
shutdown := NewHTTPServer(t, srvcfg)
defer func() {
ctx, cancelFunc := context.WithTimeout(context.Background(), 200*time.Millisecond)
defer cancelFunc()
shutdown(ctx)
}()
url, httpclient, shutdown := NewHTTPServer(t, srvcfg)
defer shutdown()

time.Sleep(20 * time.Millisecond)

Expand All @@ -156,17 +160,20 @@ func TestHTTPServerFailsTemplating(t *testing.T) {
}
cfg := map[string]interface{}{
"type": "request",
"url": "http://localhost:8080",
"url": url,
"method": "GET",
"warn": 10,
"crit": 50,
"timeout": 1000,
"name": "test-1",
"templates": templatesCfg,
}
checker, err := NewHTTPChecker(cfg, nil)
genChecker, err := NewHTTPChecker(cfg, nil)
assert.Nilf(t, err, "http checker instantiation failed: %q", err)

checker := genChecker.(*HTTPChecker)
checker.client = &httpclient

ctxRun, cancelFunc1 := context.WithTimeout(context.Background(), time.Second)
defer cancelFunc1()

Expand All @@ -177,9 +184,12 @@ func TestHTTPServerFailsTemplating(t *testing.T) {

// bad status code
cfg["code"] = 400
checker, err = NewHTTPChecker(cfg, nil)
genChecker, err = NewHTTPChecker(cfg, nil)
assert.Nilf(t, err, "http checker instantiation failed: %q", err)

checker = genChecker.(*HTTPChecker)
checker.client = &httpclient

ctxRun, cancelFunc1 = context.WithTimeout(context.Background(), time.Second)
defer cancelFunc1()
result = checker.Run(ctxRun)
Expand All @@ -193,12 +203,8 @@ func TestHTTPServerFailsTemplatingJSON(t *testing.T) {
StatusCode: 400,
JSONBody: true,
}
shutdown := NewHTTPServer(t, srvcfg)
defer func() {
ctx, cancelFunc := context.WithTimeout(context.Background(), 200*time.Millisecond)
defer cancelFunc()
shutdown(ctx)
}()
url, httpclient, shutdown := NewHTTPServer(t, srvcfg)
defer shutdown()

time.Sleep(20 * time.Millisecond)

Expand All @@ -208,17 +214,20 @@ func TestHTTPServerFailsTemplatingJSON(t *testing.T) {
}
cfg := map[string]interface{}{
"type": "request",
"url": "http://localhost:8080",
"url": url,
"method": "GET",
"warn": 200,
"crit": 200,
"timeout": 1000,
"name": "test-1",
"templates": templatesCfg,
}
checker, err := NewHTTPChecker(cfg, nil)
genChecker, err := NewHTTPChecker(cfg, nil)
assert.Nilf(t, err, "http checker instantiation failed: %q", err)

checker := genChecker.(*HTTPChecker)
checker.client = &httpclient

ctxRun, cancelFunc1 := context.WithTimeout(context.Background(), time.Second)
defer cancelFunc1()

Expand Down
16 changes: 5 additions & 11 deletions plugins/http/http_utils_test.go
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
package http

import (
"context"
"io"
"net/http"
"net/http/httptest"
"testing"
"time"
)
Expand All @@ -30,15 +30,9 @@ func (s FakeTestHTTPServer) ServeHTTP(respW http.ResponseWriter, req *http.Reque
}
}

func NewHTTPServer(t *testing.T, cfg FakeTestHTTPServer) func(context.Context) error {
srv := http.Server{
Addr: ":8080",
Handler: cfg,
func NewHTTPServer(t *testing.T, serverHandler FakeTestHTTPServer) (string, http.Client, func()) {
ts := httptest.NewServer(serverHandler)
return ts.URL, *ts.Client(), func() {
ts.Close()
}
go func() {
if err := srv.ListenAndServe(); err != nil && err != http.ErrServerClosed {
t.Fatal(err)
}
}()
return srv.Shutdown
}
29 changes: 14 additions & 15 deletions plugins/processes/processes_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,8 @@ import (
"github.com/stretchr/testify/assert"
)

var pids []*os.Process

func startProcesses(t *testing.T) {
func startProcesses(t *testing.T) func() {
var pids []*os.Process
cmd := exec.Command("/bin/sleep", "5", "2", "1")

if err := cmd.Start(); err != nil {
Expand Down Expand Up @@ -49,24 +48,24 @@ func startProcesses(t *testing.T) {
}

pids = append(pids, cmd.Process)
}

func stopProcesses(t *testing.T) {
for _, process := range pids {
if process == nil {
t.Error("process pid is nil")
t.FailNow()
}
if err := process.Kill(); err != nil {
t.Error(err)
t.FailNow()
return func() {
for _, process := range pids {
if process == nil {
t.Error("process pid is nil")
t.FailNow()
}
if err := process.Kill(); err != nil {
t.Error(err)
t.FailNow()
}
}
}
}

func TestProcesses(t *testing.T) {
startProcesses(t)
defer stopProcesses(t)
teardown := startProcesses(t)
defer teardown()

// creating processes checker
cfg := map[string]interface{}{
Expand Down
Loading

0 comments on commit 975c704

Please sign in to comment.