1
// Copyright 2014 Canonical Ltd.
2
// Licensed under the AGPLv3, see LICENCE file for details.
9
jc "github.com/juju/testing/checkers"
10
gc "gopkg.in/check.v1"
12
"github.com/juju/juju/network"
13
"github.com/juju/juju/testing"
16
type PortSetSuite struct {
19
portRange1 network.PortRange
20
portRange2 network.PortRange
21
portRange3 network.PortRange
22
portRange4 network.PortRange
25
var _ = gc.Suite(&PortSetSuite{})
27
func (s *PortSetSuite) SetUpTest(c *gc.C) {
28
s.BaseSuite.SetUpTest(c)
30
portRange1, err := network.ParsePortRange("8000-8099/tcp")
31
c.Assert(err, jc.ErrorIsNil)
32
portRange2, err := network.ParsePortRange("80/tcp")
33
c.Assert(err, jc.ErrorIsNil)
34
portRange3, err := network.ParsePortRange("79-81/tcp")
35
c.Assert(err, jc.ErrorIsNil)
36
portRange4, err := network.ParsePortRange("5000-5123/udp")
37
c.Assert(err, jc.ErrorIsNil)
39
s.portRange1 = portRange1
40
s.portRange2 = portRange2
41
s.portRange3 = portRange3
42
s.portRange4 = portRange4
45
func (s *PortSetSuite) getPorts(start, end int) []int {
47
for i := start; i <= end; i++ {
48
result = append(result, i)
53
func (s *PortSetSuite) checkPortSet(c *gc.C, ports network.PortSet, protocol string, expected ...int) {
54
var sexpected []string
55
for _, port := range expected {
56
sexpected = append(sexpected, strconv.Itoa(port))
58
values := ports.PortStrings(protocol)
60
c.Check(values, jc.SameContents, sexpected)
63
func (s *PortSetSuite) checkPortSetTCP(c *gc.C, ports network.PortSet, expected ...int) {
64
c.Check(ports.Protocols(), jc.SameContents, []string{"tcp"})
65
s.checkPortSet(c, ports, "tcp", expected...)
68
func (s *PortSetSuite) checkPorts(c *gc.C, ports []network.Port, protocol string, expected ...int) {
70
for _, port := range ports {
71
c.Check(port.Protocol, gc.Equals, protocol)
72
found = append(found, port.Number)
74
c.Check(found, jc.SameContents, expected)
77
func (s *PortSetSuite) TestNewPortSet(c *gc.C) {
78
portSet := network.NewPortSet(s.portRange1)
79
c.Assert(portSet.IsEmpty(), jc.IsFalse)
81
s.checkPortSetTCP(c, portSet, s.getPorts(8000, 8099)...)
84
func (s *PortSetSuite) TestPortSetUnion(c *gc.C) {
85
portSet1 := network.NewPortSet(s.portRange2)
86
portSet2 := network.NewPortSet(s.portRange3)
87
result := portSet1.Union(portSet2)
89
s.checkPortSetTCP(c, result, 79, 80, 81)
92
func (s *PortSetSuite) TestPortSetIntersection(c *gc.C) {
93
s.portRange2.ToPort = 83
94
portSet1 := network.NewPortSet(s.portRange2)
95
portSet2 := network.NewPortSet(s.portRange3)
96
result := portSet1.Intersection(portSet2)
98
s.checkPortSetTCP(c, result, 80, 81)
101
func (s *PortSetSuite) TestPortSetIntersectionEmpty(c *gc.C) {
102
portSet1 := network.NewPortSet(s.portRange1)
103
portSet2 := network.NewPortSet(s.portRange2)
104
result := portSet1.Intersection(portSet2)
105
isEmpty := result.IsEmpty()
107
c.Check(isEmpty, jc.IsTrue)
110
func (s *PortSetSuite) TestPortSetDifference(c *gc.C) {
111
s.portRange2.ToPort = 83
112
portSet1 := network.NewPortSet(s.portRange2)
113
portSet2 := network.NewPortSet(s.portRange3)
114
result := portSet1.Difference(portSet2)
116
s.checkPortSetTCP(c, result, 82, 83)
119
func (s *PortSetSuite) TestPortSetDifferenceEmpty(c *gc.C) {
120
portSet1 := network.NewPortSet(s.portRange2)
121
result := portSet1.Difference(portSet1)
122
isEmpty := result.IsEmpty()
124
c.Check(isEmpty, jc.IsTrue)
127
func (s *PortSetSuite) TestPortSetSize(c *gc.C) {
128
portSet := network.NewPortSet(s.portRange1)
129
c.Assert(portSet.Size(), gc.Equals, 100)
132
func (s *PortSetSuite) TestPortSetIsEmpty(c *gc.C) {
133
portSet := network.NewPortSet()
134
c.Assert(portSet.IsEmpty(), jc.IsTrue)
137
func (s *PortSetSuite) TestPortSetIsNotEmpty(c *gc.C) {
138
portSet := network.NewPortSet(s.portRange2)
139
c.Assert(portSet.IsEmpty(), jc.IsFalse)
142
func (s *PortSetSuite) TestPortSetAdd(c *gc.C) {
143
portSet := network.NewPortSet(s.portRange2)
144
c.Check(portSet.IsEmpty(), jc.IsFalse)
145
portSet.Add("tcp", 81)
147
s.checkPortSetTCP(c, portSet, 80, 81)
150
func (s *PortSetSuite) TestPortSetAddRanges(c *gc.C) {
151
s.portRange2.ToPort = 83
152
portSet := network.NewPortSet(s.portRange2)
153
c.Check(portSet.IsEmpty(), jc.IsFalse)
154
portSet.AddRanges(s.portRange3)
156
s.checkPortSetTCP(c, portSet, s.getPorts(79, 83)...)
159
func (s *PortSetSuite) TestPortSetRemove(c *gc.C) {
160
portSet := network.NewPortSet(s.portRange2)
161
portSet.Remove("tcp", 80)
163
c.Assert(portSet.Ports(), gc.HasLen, 0)
166
func (s *PortSetSuite) TestPortSetRemoveRanges(c *gc.C) {
167
portSet := network.NewPortSet(s.portRange1)
168
portSet.RemoveRanges(
170
network.PortRange{7000, 8049, "tcp"},
171
network.PortRange{8051, 8074, "tcp"},
172
network.PortRange{8080, 9000, "tcp"},
175
s.checkPortSetTCP(c, portSet, 8050, 8075, 8076, 8077, 8078, 8079)
178
func (s *PortSetSuite) TestPortSetContains(c *gc.C) {
179
portSet := network.NewPortSet(s.portRange2)
180
isfound := portSet.Contains("tcp", 80)
182
c.Assert(isfound, jc.IsTrue)
185
func (s *PortSetSuite) TestPortSetContainsNotFound(c *gc.C) {
186
portSet := network.NewPortSet(s.portRange2)
187
isfound := portSet.Contains("tcp", 81)
189
c.Assert(isfound, jc.IsFalse)
192
func (s *PortSetSuite) TestPortSetContainsRangesSingleMatch(c *gc.C) {
193
portSet := network.NewPortSet(s.portRange1)
194
isfound := portSet.ContainsRanges(network.PortRange{8080, 8080, "tcp"})
196
c.Assert(isfound, jc.IsTrue)
199
func (s *PortSetSuite) TestPortSetContainsRangesSingleNoMatch(c *gc.C) {
200
portSet := network.NewPortSet(s.portRange1)
201
isfound := portSet.ContainsRanges(s.portRange2)
203
c.Assert(isfound, jc.IsFalse)
206
func (s *PortSetSuite) TestPortSetContainsRangesOverlapping(c *gc.C) {
207
portSet := network.NewPortSet(s.portRange1)
208
isfound := portSet.ContainsRanges(network.PortRange{7000, 8049, "tcp"})
210
c.Assert(isfound, jc.IsFalse)
213
func (s *PortSetSuite) TestPortSetValues(c *gc.C) {
214
portSet := network.NewPortSet(s.portRange3)
215
ports := portSet.Values()
217
s.checkPorts(c, ports, "tcp", 79, 80, 81)
220
func (s *PortSetSuite) TestPortSetProtocols(c *gc.C) {
221
portSet := network.NewPortSet(s.portRange2, s.portRange4)
222
protocols := portSet.Protocols()
224
c.Check(protocols, jc.SameContents, []string{"tcp", "udp"})
227
func (s *PortSetSuite) TestPortSetPorts(c *gc.C) {
228
portSet := network.NewPortSet(s.portRange3)
229
ports := portSet.Ports()
231
s.checkPorts(c, ports, "tcp", 79, 80, 81)
234
func (s *PortSetSuite) TestPortSetPortNumbers(c *gc.C) {
235
portSet := network.NewPortSet(s.portRange3)
236
ports := portSet.PortNumbers("tcp")
238
c.Check(ports, jc.SameContents, []int{79, 80, 81})
241
func (s *PortSetSuite) TestPortSetPortStrings(c *gc.C) {
242
portSet := network.NewPortSet(s.portRange3)
243
ports := portSet.PortStrings("tcp")
245
c.Check(ports, jc.SameContents, []string{"79", "80", "81"})