Skip to content

Commit

Permalink
Add tests for filtering.
Browse files Browse the repository at this point in the history
  • Loading branch information
Tom Wilkie committed Sep 4, 2015
1 parent 7361444 commit ba37eb7
Show file tree
Hide file tree
Showing 6 changed files with 53 additions and 8 deletions.
4 changes: 2 additions & 2 deletions app/router.go
Original file line number Diff line number Diff line change
Expand Up @@ -164,8 +164,8 @@ var topologyRegistry = map[string]topologyView{
parent: "containers",
renderer: render.ContainerImageRenderer,
options: optionParams{"system": {
{"show", "Show system containers", true, nop},
{"hide", "Hide system containers", false, render.FilterSystem},
{"show", "Show system containers", false, nop},
{"hide", "Hide system containers", true, render.FilterSystem},
}},
},
"hosts": {
Expand Down
8 changes: 4 additions & 4 deletions render/render.go
Original file line number Diff line number Diff line change
Expand Up @@ -172,14 +172,14 @@ func ColorConnected(r Renderer) Renderer {
// Filter removes nodes from a view based on a predicate.
type Filter struct {
Renderer
f func(RenderableNode) bool
FilterFunc func(RenderableNode) bool
}

// Render implements Renderer
func (f Filter) Render(rpt report.Report) RenderableNodes {
output := RenderableNodes{}
for id, node := range f.Renderer.Render(rpt) {
if f.f(node) {
if f.FilterFunc(node) {
output[id] = node
}
}
Expand Down Expand Up @@ -207,7 +207,7 @@ const IsConnected = "is_connected"
func FilterUnconnected(r Renderer) Renderer {
return Filter{
Renderer: ColorConnected(r),
f: func(node RenderableNode) bool {
FilterFunc: func(node RenderableNode) bool {
_, ok := node.Metadata[IsConnected]
return ok
},
Expand All @@ -218,7 +218,7 @@ func FilterUnconnected(r Renderer) Renderer {
func FilterSystem(r Renderer) Renderer {
return Filter{
Renderer: r,
f: func(node RenderableNode) bool {
FilterFunc: func(node RenderableNode) bool {
containerName := node.Metadata[docker.ContainerName]
if _, ok := systemContainerNames[containerName]; ok {
return false
Expand Down
24 changes: 23 additions & 1 deletion render/render_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -187,7 +187,29 @@ func TestFilterRender(t *testing.T) {
}
have := expected.Sterilize(renderer.Render(report.MakeReport()))
if !reflect.DeepEqual(want, have) {
t.Errorf("want %+v, have %+v", want, have)
t.Error(test.Diff(want, have))
}
}

func TestFilterRender2(t *testing.T) {
// Test adjacencies are removed for filtered nodes.
renderer := render.Filter{
FilterFunc: func(node render.RenderableNode) bool {
return node.ID != "bar"
},
Renderer: mockRenderer{RenderableNodes: render.RenderableNodes{
"foo": {ID: "foo", Node: report.MakeNode().WithAdjacent("bar")},
"bar": {ID: "bar", Node: report.MakeNode().WithAdjacent("foo")},
"baz": {ID: "baz", Node: report.MakeNode()},
}},
}
want := render.RenderableNodes{
"foo": {ID: "foo", Node: report.MakeNode()},
"baz": {ID: "baz", Node: report.MakeNode()},
}
have := expected.Sterilize(renderer.Render(report.MakeReport()))
if !reflect.DeepEqual(want, have) {
t.Error(test.Diff(want, have))
}
}

Expand Down
9 changes: 9 additions & 0 deletions render/renderable_node.go
Original file line number Diff line number Diff line change
Expand Up @@ -125,6 +125,15 @@ func (rn RenderableNode) Copy() RenderableNode {
// RenderableNodes is a set of RenderableNodes
type RenderableNodes map[string]RenderableNode

// Copy produces a deep copy of the RenderableNodes
func (rns RenderableNodes) Copy() RenderableNodes {
result := RenderableNodes{}
for key, value := range rns {
result[key] = value.Copy()
}
return result
}

// Merge merges two sets of RenderableNodes, returning a new set.
func (rns RenderableNodes) Merge(other RenderableNodes) RenderableNodes {
result := RenderableNodes{}
Expand Down
2 changes: 1 addition & 1 deletion render/topologies.go
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,7 @@ var ContainerRenderer = MakeReduce(
// but we need to be careful to ensure we only include each edge once, by only
// including the ProcessRenderer once.
Renderer: Filter{
f: func(n RenderableNode) bool {
FilterFunc: func(n RenderableNode) bool {
_, inContainer := n.Node.Metadata[docker.ContainerID]
_, isConnected := n.Node.Metadata[IsConnected]
return inContainer || isConnected
Expand Down
14 changes: 14 additions & 0 deletions render/topologies_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import (
"reflect"
"testing"

"github.com/weaveworks/scope/probe/docker"
"github.com/weaveworks/scope/render"
"github.com/weaveworks/scope/render/expected"
"github.com/weaveworks/scope/test"
Expand Down Expand Up @@ -33,6 +34,19 @@ func TestContainerRenderer(t *testing.T) {
}
}

func TestContainerFilterRenderer(t *testing.T) {
// tag on of the containers in the topology and ensure
// it is filtered out correctly.
input := test.Report.Copy()
input.Container.Nodes[test.ClientContainerNodeID].Metadata[docker.LabelPrefix+"works.weave.role"] = "system"
have := expected.Sterilize(render.FilterSystem(render.ContainerRenderer).Render(input))
want := expected.RenderedContainers.Copy()
delete(want, test.ClientContainerID)
if !reflect.DeepEqual(want, have) {
t.Error(test.Diff(want, have))
}
}

func TestContainerImageRenderer(t *testing.T) {
have := expected.Sterilize(render.ContainerImageRenderer.Render(test.Report))
want := expected.RenderedContainerImages
Expand Down

0 comments on commit ba37eb7

Please sign in to comment.