add tests for events

This commit is contained in:
Victor Vieux 2014-11-25 02:14:29 +00:00
parent 0872d4f549
commit f7fed9a7bd
3 changed files with 78 additions and 13 deletions

View File

@ -4,7 +4,6 @@ import (
"bytes"
"encoding/json"
"fmt"
"io"
"io/ioutil"
"net/http"
"net/url"
@ -221,17 +220,15 @@ func deleteContainer(c *context, w http.ResponseWriter, r *http.Request) {
// GET /events
func getEvents(c *context, w http.ResponseWriter, r *http.Request) {
c.eventsHandler.Lock()
c.eventsHandler.ws[r.RemoteAddr] = w
c.eventsHandler.cs[r.RemoteAddr] = make(chan struct{})
c.eventsHandler.Unlock()
c.eventsHandler.Add(r.RemoteAddr, w)
w.Header().Set("Content-Type", "application/json")
if f, ok := w.(http.Flusher); ok {
f.Flush()
}
<-c.eventsHandler.cs[r.RemoteAddr]
c.eventsHandler.Wait(r.RemoteAddr)
}
// GET /_ping
@ -351,13 +348,10 @@ func createRouter(c *context, enableCors bool) (*mux.Router, error) {
func ListenAndServe(c *cluster.Cluster, s *scheduler.Scheduler, addr, version string) error {
context := &context{
cluster: c,
scheduler: s,
version: version,
eventsHandler: &eventsHandler{
ws: make(map[string]io.Writer),
cs: make(map[string]chan struct{}),
},
cluster: c,
scheduler: s,
version: version,
eventsHandler: NewEventsHandler(),
}
c.Events(context.eventsHandler)
r, err := createRouter(context, false)

View File

@ -15,6 +15,24 @@ type eventsHandler struct {
cs map[string]chan struct{}
}
func NewEventsHandler() *eventsHandler {
return &eventsHandler{
ws: make(map[string]io.Writer),
cs: make(map[string]chan struct{}),
}
}
func (eh *eventsHandler) Add(remoteAddr string, w io.Writer) {
eh.Lock()
eh.ws[remoteAddr] = w
eh.cs[remoteAddr] = make(chan struct{})
eh.Unlock()
}
func (eh *eventsHandler) Wait(remoteAddr string) {
<-eh.cs[remoteAddr]
}
func (eh *eventsHandler) Handle(e *cluster.Event) error {
eh.RLock()

53
api/events_test.go Normal file
View File

@ -0,0 +1,53 @@
package api
import (
"fmt"
"testing"
"github.com/docker/swarm/cluster"
"github.com/stretchr/testify/assert"
)
type FakeWriter struct {
Tmp []byte
}
func (fw *FakeWriter) Write(p []byte) (n int, err error) {
fw.Tmp = append(fw.Tmp, p...)
return len(p), nil
}
func TestHandle(t *testing.T) {
eh := NewEventsHandler()
assert.Equal(t, eh.Size(), 0)
fw := &FakeWriter{Tmp: []byte{}}
eh.Add("test", fw)
assert.Equal(t, eh.Size(), 1)
event := &cluster.Event{
NodeName: "node_name",
NodeID: "node_id",
NodeAddr: "node_addr",
NodeIP: "node_ip",
}
event.Event.Status = "status"
event.Event.Id = "id"
event.Event.From = "from"
event.Event.Time = 0
assert.NoError(t, eh.Handle(event))
str := fmt.Sprintf("{%q:%q,%q:%q,%q:%q,%q:%d,%q:%q,%q:%q,%q:%q,%q:%q}",
"status", "status",
"id", "id",
"from", "from node:node_name",
"time", 0,
"node_name", "node_name",
"node_id", "node_id",
"node_addr", "node_addr",
"node_ip", "node_ip")
assert.Equal(t, str, string(fw.Tmp))
}