From 30cb5299cf2793d119950906ef539620aa9569ca Mon Sep 17 00:00:00 2001 From: Peter Bourgon Date: Wed, 9 Sep 2015 12:59:20 +0200 Subject: [PATCH] ParseNetworks belongs in report --- report/networks.go | 19 +++++++++++++++++++ report/networks_test.go | 23 +++++++++++++++++++++++ 2 files changed, 42 insertions(+) diff --git a/report/networks.go b/report/networks.go index a1aa9e6e4..fa0707ab4 100644 --- a/report/networks.go +++ b/report/networks.go @@ -2,11 +2,30 @@ package report import ( "net" + "strings" ) // Networks represent a set of subnets type Networks []*net.IPNet +// ParseNetworks converts a string of space-separated CIDRs to a Networks. +func ParseNetworks(v string) Networks { + set := map[string]struct{}{} + for _, s := range strings.Fields(v) { + _, ipNet, err := net.ParseCIDR(s) + if err != nil { + continue + } + set[ipNet.String()] = struct{}{} + } + nets := Networks{} + for s := range set { + _, ipNet, _ := net.ParseCIDR(s) + nets = append(nets, ipNet) + } + return nets +} + // Interface is exported for testing. type Interface interface { Addrs() ([]net.Addr, error) diff --git a/report/networks_test.go b/report/networks_test.go index 0c18207f3..2d552bd13 100644 --- a/report/networks_test.go +++ b/report/networks_test.go @@ -1,6 +1,7 @@ package report_test import ( + "fmt" "net" "reflect" "testing" @@ -24,6 +25,28 @@ func TestContains(t *testing.T) { } } +func TestParseNetworks(t *testing.T) { + var ( + bignetStr = "10.1.0.1/16" + smallnetStr = "5.6.7.8/32" + bignet = mustParseCIDR(bignetStr) + smallnet = mustParseCIDR(smallnetStr) + ) + for _, tc := range []struct { + input string + want report.Networks + }{ + {"", report.Networks{}}, + {fmt.Sprintf("%s", bignetStr), report.Networks([]*net.IPNet{bignet})}, + {fmt.Sprintf("%s %s", bignetStr, bignetStr), report.Networks([]*net.IPNet{bignet})}, + {fmt.Sprintf("%s foo %s oops %s", smallnetStr, smallnetStr, smallnetStr), report.Networks([]*net.IPNet{smallnet})}, + } { + if want, have := tc.want, report.ParseNetworks(tc.input); !reflect.DeepEqual(want, have) { + t.Error(test.Diff(want, have)) + } + } +} + func mustParseCIDR(s string) *net.IPNet { _, ipNet, err := net.ParseCIDR(s) if err != nil {