Skip to content

Commit

Permalink
first pass at tests (#218)
Browse files Browse the repository at this point in the history
* added FakeRoundTripper and container rename test
* tests: run in circleci, added TestRoutingFrom
  • Loading branch information
mattatcha committed Dec 31, 2016
1 parent fc355d6 commit 6c88eec
Show file tree
Hide file tree
Showing 3 changed files with 190 additions and 4 deletions.
13 changes: 10 additions & 3 deletions Makefile
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
NAME=logspout
VERSION=$(shell cat VERSION)

dev:
@docker history $(NAME):dev &> /dev/null \
|| docker build -f Dockerfile.dev -t $(NAME):dev .
build-dev:
docker build -f Dockerfile.dev -t $(NAME):dev .

dev: build-dev
@docker run --rm \
-e DEBUG=true \
-v /var/run/docker.sock:/var/run/docker.sock \
Expand All @@ -17,6 +18,12 @@ build:
docker build -t $(NAME):$(VERSION) .
docker save $(NAME):$(VERSION) | gzip -9 > build/$(NAME)_$(VERSION).tgz

test: build-dev
docker run \
-v /var/run/docker.sock:/var/run/docker.sock \
-v $(PWD):/go/src/github.com/gliderlabs/logspout \
$(NAME):dev go test -v ./router/...

release:
rm -rf release && mkdir release
go get github.com/progrium/gh-release/...
Expand Down
2 changes: 1 addition & 1 deletion circle.yml
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ dependencies:

test:
override:
- /bin/true
- make test

deployment:
release:
Expand Down
179 changes: 179 additions & 0 deletions router/pump_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,179 @@
package router

import (
"bytes"
"encoding/json"
"io/ioutil"
"log"
"net"
"net/http"
"os"
"testing"

docker "github.com/fsouza/go-dockerclient"
)

func TestIgnoreContainer(t *testing.T) {
os.Setenv("EXCLUDE_LABEL", "exclude")
defer os.Unsetenv("EXCLUDE_LABEL")
containers := []struct {
in *docker.Config
out bool
}{
{&docker.Config{Env: []string{"foo", "bar"}}, false},
{&docker.Config{Env: []string{"LOGSPOUT=ignore"}}, true},
{&docker.Config{Env: []string{"LOGSPOUT=IGNORE"}}, true},
{&docker.Config{Env: []string{"LOGSPOUT=foo"}}, false},
{&docker.Config{Labels: map[string]string{"exclude": "true"}}, true},
{&docker.Config{Labels: map[string]string{"exclude": "false"}}, false},
}

for _, conf := range containers {
if actual := ignoreContainer(&docker.Container{Config: conf.in}); actual != conf.out {
t.Errorf("expected %v got %v", conf.out, actual)
}
}
}

func TestLogsPumpName(t *testing.T) {
p := &LogsPump{}
if name := p.Name(); name != "pump" {
t.Error("name should be 'pump' got:", name)
}
}

func TestContainerRename(t *testing.T) {
container := &docker.Container{
ID: "8dfafdbc3a40",
Name: "bar",
}
client := newTestClient(&FakeRoundTripper{message: container, status: http.StatusOK})
p := &LogsPump{
client: &client,
pumps: make(map[string]*containerPump),
routes: make(map[chan *update]struct{}),
}
container = &docker.Container{
ID: "8dfafdbc3a40",
Name: "foo",
}
p.pumps["8dfafdbc3a40"] = newContainerPump(container, os.Stdout, os.Stderr)
if name := p.pumps["8dfafdbc3a40"].container.Name; name != "foo" {
t.Errorf("containerPump should have name: 'foo' got name: '%s'", name)
}

p.rename(&docker.APIEvents{ID: "8dfafdbc3a40"})
if name := p.pumps["8dfafdbc3a40"].container.Name; name != "bar" {
t.Errorf("containerPump should have name: 'bar' got name: %s", name)
}
}

func TestNewContainerPump(t *testing.T) {
container := &docker.Container{
ID: "8dfafdbc3a40",
}
pump := newContainerPump(container, os.Stdout, os.Stderr)
if pump == nil {
t.Error("pump nil")
return
}
}
func TestContainerPump(t *testing.T) {
container := &docker.Container{
ID: "8dfafdbc3a40",
}
pump := newContainerPump(container, os.Stdout, os.Stderr)
logstream, route := make(chan *Message), &Route{}
go func() {
for msg := range logstream {
t.Logf("message: %+v", msg)
}
}()
pump.add(logstream, route)
if pump.logstreams[logstream] != route {
t.Error("expected pump to contain logstream matching route")
}
pump.send(&Message{Data: "test data"})

pump.remove(logstream)
if pump.logstreams[logstream] != nil {
t.Error("logstream should have been removed")
}
}

func TestPumpSendTimeout(t *testing.T) {
container := &docker.Container{
ID: "8dfafdbc3a40",
}
pump := newContainerPump(container, os.Stdout, os.Stderr)
ch, route := make(chan *Message), &Route{}
pump.add(ch, route)
pump.send(&Message{Data: "hellooo"})
if pump.logstreams[ch] != nil {
t.Error("expected logstream to be removed after timeout")
}

}

func TestRoutingFrom(t *testing.T) {
container := &docker.Container{
ID: "8dfafdbc3a40",
}
p := &LogsPump{
pumps: make(map[string]*containerPump),
routes: make(map[chan *update]struct{}),
}

if p.RoutingFrom(container.ID) != false {
t.Errorf("expected RoutingFrom to return 'false'")
}

p.pumps[container.ID] = nil
if p.RoutingFrom(container.ID) != true {
t.Errorf("expected RoutingFrom to return 'true'")
}
if p.RoutingFrom("") != false {
t.Errorf("expected RoutingFrom to return 'false'")
}
if p.RoutingFrom("foo") != false {
t.Errorf("expected RoutingFrom to return 'false'")
}
}

type FakeRoundTripper struct {
message interface{}
status int
header map[string]string
requests []*http.Request
}

func (rt *FakeRoundTripper) RoundTrip(r *http.Request) (*http.Response, error) {
b, err := json.Marshal(rt.message)
if err != nil {
log.Fatal(err.Error())
}

body := bytes.NewReader(b)
rt.requests = append(rt.requests, r)
res := &http.Response{
StatusCode: rt.status,
Body: ioutil.NopCloser(body),
Header: make(http.Header),
}
for k, v := range rt.header {
res.Header.Set(k, v)
}
return res, nil
}
func (rt *FakeRoundTripper) Reset() {
rt.requests = nil
}

func newTestClient(rt *FakeRoundTripper) docker.Client {
endpoint := "http://localhost:4243"
client, _ := docker.NewClient(endpoint)
client.HTTPClient = &http.Client{Transport: rt}
client.Dialer = &net.Dialer{}
client.SkipServerVersionCheck = true
return *client
}

0 comments on commit 6c88eec

Please sign in to comment.