Files
weave-scope/probe/appclient/multi_client_test.go
Bryan Boreham 96f51c47af probe: Eliminate Publisher interface from app_client
Simplification: everything now implements Publish(Report), and we do
away with writing/reading/writing in the MultiAppClient.
2018-06-19 22:51:25 +00:00

118 lines
2.5 KiB
Go

package appclient_test
import (
"io"
"net/url"
"runtime"
"testing"
"github.com/weaveworks/scope/common/xfer"
"github.com/weaveworks/scope/probe/appclient"
"github.com/weaveworks/scope/report"
)
type mockClient struct {
id string
count int
stopped int
publish int
}
func (c *mockClient) Details() (xfer.Details, error) {
return xfer.Details{ID: c.id}, nil
}
func (c *mockClient) ControlConnection() {
c.count++
}
func (c *mockClient) Target() url.URL {
return url.URL{}
}
func (c *mockClient) ReTarget(_ url.URL) {
}
func (c *mockClient) Stop() {
c.stopped++
}
func (c *mockClient) Publish(io.Reader, bool) error {
c.publish++
return nil
}
func (c *mockClient) PipeConnection(_ string, _ xfer.Pipe) {}
func (c *mockClient) PipeClose(_ string) error { return nil }
var (
a1 = &mockClient{id: "1"} // hostname a, app id 1
a2 = &mockClient{id: "2"} // hostname a, app id 2
b2 = &mockClient{id: "2"} // hostname b, app id 2 (duplicate)
b3 = &mockClient{id: "3"} // hostname b, app id 3
factory = func(hostname string, url url.URL) (appclient.AppClient, error) {
switch url.Host {
case "a1":
return a1, nil
case "a2":
return a2, nil
case "b2":
return b2, nil
case "b3":
return b3, nil
}
panic(url.Host)
}
)
func TestMultiClient(t *testing.T) {
var (
expect = func(i, j int) {
if i != j {
_, file, line, _ := runtime.Caller(1)
t.Fatalf("%s:%d: %d != %d", file, line, i, j)
}
}
)
mp := appclient.NewMultiAppClient(factory, false)
defer mp.Stop()
// Add two hostnames with overlapping apps, check we don't add the same app twice
mp.Set("a", []url.URL{{Host: "a1"}, {Host: "a2"}})
mp.Set("b", []url.URL{{Host: "b2"}, {Host: "b3"}})
expect(a1.count, 1)
expect(a2.count+b2.count, 1)
expect(b3.count, 1)
// Now drop the overlap, check we don't remove the app
mp.Set("b", []url.URL{{Host: "b3"}})
expect(a1.count, 1)
expect(a2.count+b2.count, 1)
expect(b3.count, 1)
// Now check we remove apps
mp.Set("b", []url.URL{})
expect(b3.stopped, 1)
}
func TestMultiClientPublish(t *testing.T) {
mp := appclient.NewMultiAppClient(factory, false)
defer mp.Stop()
sum := func() int { return a1.publish + a2.publish + b2.publish + b3.publish }
mp.Set("a", []url.URL{{Host: "a1"}, {Host: "a2"}})
mp.Set("b", []url.URL{{Host: "b2"}, {Host: "b3"}})
rpt := report.MakeReport()
for i := 1; i < 10; i++ {
if err := mp.Publish(rpt); err != nil {
t.Error(err)
}
if want, have := 3*i, sum(); want != have {
t.Errorf("want %d, have %d", want, have)
}
}
}