Left: | ||
Right: |
LEFT | RIGHT |
---|---|
1 package firewaller_test | 1 package firewaller_test |
2 | 2 |
3 import ( | 3 import ( |
4 "fmt" | |
4 . "launchpad.net/gocheck" | 5 . "launchpad.net/gocheck" |
5 "launchpad.net/juju-core/environs" | |
6 "launchpad.net/juju-core/environs/dummy" | 6 "launchpad.net/juju-core/environs/dummy" |
7 "launchpad.net/juju-core/log" | |
7 "launchpad.net/juju-core/state/testing" | 8 "launchpad.net/juju-core/state/testing" |
8 coretesting "launchpad.net/juju-core/testing" | 9 coretesting "launchpad.net/juju-core/testing" |
9 "launchpad.net/juju-core/worker/firewaller" | 10 "launchpad.net/juju-core/worker/firewaller" |
10 "sort" | 11 "sort" |
12 "strings" | |
11 stdtesting "testing" | 13 stdtesting "testing" |
12 "time" | 14 "time" |
13 ) | 15 ) |
14 | 16 |
15 func TestPackage(t *stdtesting.T) { | 17 func TestPackage(t *stdtesting.T) { |
16 coretesting.ZkTestPackage(t) | 18 coretesting.ZkTestPackage(t) |
17 } | 19 } |
18 | 20 |
21 // hooLogger allows the grabbing of debug log statements | |
22 // to compare them inside the tests. | |
23 type hookLogger struct { | |
24 event chan string | |
25 oldTarget log.Logger | |
26 } | |
27 | |
28 var logHook *hookLogger | |
29 | |
30 const prefix = "JUJU:DEBUG firewaller: " | |
31 | |
32 func (h *hookLogger) Output(calldepth int, s string) error { | |
33 err := h.oldTarget.Output(calldepth, s) | |
34 if strings.HasPrefix(s, prefix) { | |
35 h.event <- s[len(prefix):] | |
36 } | |
37 return err | |
38 } | |
39 | |
40 func setUpLogHook() { | |
41 logHook = &hookLogger{ | |
42 event: make(chan string, 30), | |
43 oldTarget: log.Target, | |
44 } | |
45 log.Target = logHook | |
46 } | |
47 | |
48 func tearDownLogHook() { | |
49 log.Target = logHook.oldTarget | |
50 } | |
51 | |
52 // assertEvents asserts that the expected events are received from | |
53 // the firewaller, in no particular order. | |
54 func assertEvents(c *C, expect []string) { | |
55 var got []string | |
56 for _ = range expect { | |
57 select { | |
58 case e := <-logHook.event: | |
59 got = append(got, e) | |
60 case <-time.After(500 * time.Millisecond): | |
61 c.Fatalf("expected %q; timed out after %q", expect, got) | |
62 } | |
63 } | |
64 select { | |
65 case e := <-logHook.event: | |
66 got = append(got, e) | |
67 c.Fatalf("expected %q; too many events %q ", expect, got) | |
68 case <-time.After(100 * time.Millisecond): | |
69 } | |
70 sort.Strings(expect) | |
71 sort.Strings(got) | |
72 c.Assert(got, DeepEquals, expect) | |
73 } | |
74 | |
19 type FirewallerSuite struct { | 75 type FirewallerSuite struct { |
20 coretesting.LoggingSuite | 76 coretesting.LoggingSuite |
21 testing.StateSuite | 77 testing.StateSuite |
22 » environ environs.Environ | 78 » op <-chan dummy.Operation |
23 » op <-chan dummy.Operation | |
24 } | 79 } |
25 | 80 |
26 var _ = Suite(&FirewallerSuite{}) | 81 var _ = Suite(&FirewallerSuite{}) |
27 | 82 |
28 func (s *FirewallerSuite) SetUpTest(c *C) { | 83 func (s *FirewallerSuite) SetUpTest(c *C) { |
29 s.LoggingSuite.SetUpTest(c) | 84 s.LoggingSuite.SetUpTest(c) |
30 | 85 |
31 op := make(chan dummy.Operation, 500) | 86 op := make(chan dummy.Operation, 500) |
32 dummy.Listen(op) | 87 dummy.Listen(op) |
33 s.op = op | 88 s.op = op |
34 | 89 |
35 var err error | |
36 s.environ, err = environs.NewEnviron(map[string]interface{}{ | |
37 "type": "dummy", | |
38 "zookeeper": true, | |
39 "name": "testing", | |
40 }) | |
41 c.Assert(err, IsNil) | |
42 err = s.environ.Bootstrap(false) | |
43 c.Assert(err, IsNil) | |
44 | |
45 // Sanity check | |
46 info, err := s.environ.StateInfo() | |
47 c.Assert(err, IsNil) | |
48 c.Assert(info, DeepEquals, s.StateInfo(c)) | |
49 | |
50 s.StateSuite.SetUpTest(c) | 90 s.StateSuite.SetUpTest(c) |
51 } | 91 } |
52 | 92 |
53 func (s *FirewallerSuite) TearDownTest(c *C) { | 93 func (s *FirewallerSuite) TearDownTest(c *C) { |
54 dummy.Reset() | 94 dummy.Reset() |
55 s.StateSuite.TearDownTest(c) | |
56 s.LoggingSuite.TearDownTest(c) | 95 s.LoggingSuite.TearDownTest(c) |
57 } | 96 } |
58 | 97 |
59 func (s *FirewallerSuite) TestStartStop(c *C) { | 98 func (s *FirewallerSuite) TestStartStop(c *C) { |
60 » fw, err := firewaller.NewFirewaller(s.environ) | 99 » fw, err := firewaller.NewFirewaller(s.State) |
61 c.Assert(err, IsNil) | 100 c.Assert(err, IsNil) |
62 c.Assert(fw.Stop(), IsNil) | 101 c.Assert(fw.Stop(), IsNil) |
63 } | 102 } |
64 | 103 |
65 func (s *FirewallerSuite) TestAddRemoveMachine(c *C) { | 104 func (s *FirewallerSuite) TestAddRemoveMachine(c *C) { |
66 » fw, err := firewaller.NewFirewaller(s.environ) | 105 » fw, err := firewaller.NewFirewaller(s.State) |
67 c.Assert(err, IsNil) | 106 c.Assert(err, IsNil) |
107 | |
108 setUpLogHook() | |
109 defer tearDownLogHook() | |
68 | 110 |
69 m1, err := s.State.AddMachine() | 111 m1, err := s.State.AddMachine() |
70 c.Assert(err, IsNil) | 112 c.Assert(err, IsNil) |
71 m2, err := s.State.AddMachine() | 113 m2, err := s.State.AddMachine() |
72 c.Assert(err, IsNil) | 114 c.Assert(err, IsNil) |
73 m3, err := s.State.AddMachine() | 115 m3, err := s.State.AddMachine() |
74 c.Assert(err, IsNil) | 116 c.Assert(err, IsNil) |
75 time.Sleep(100 * time.Millisecond) | |
76 | 117 |
77 » addedMachines := []int{m1.Id(), m2.Id(), m3.Id()} | 118 » assertEvents(c, []string{ |
78 » allMachines := fw.AllMachines() | 119 » » fmt.Sprint("started tracking machine ", m1.Id()), |
79 » sort.Ints(addedMachines) | 120 » » fmt.Sprint("started tracking machine ", m2.Id()), |
80 » sort.Ints(allMachines) | 121 » » fmt.Sprint("started tracking machine ", m3.Id()), |
81 » c.Assert(addedMachines, DeepEquals, allMachines) | 122 » }) |
rog
2012/07/18 12:26:39
c.Assert(allMachines, DeepEquals, addedMachines)
TheMue
2012/07/18 16:26:40
Done.
| |
82 | 123 |
83 err = s.State.RemoveMachine(m2.Id()) | 124 err = s.State.RemoveMachine(m2.Id()) |
84 c.Assert(err, IsNil) | 125 c.Assert(err, IsNil) |
85 time.Sleep(100 * time.Millisecond) | |
86 | 126 |
87 » addedMachines = []int{m1.Id(), m3.Id()} | 127 » assertEvents(c, []string{ |
88 » allMachines = fw.AllMachines() | 128 » » fmt.Sprint("stopped tracking machine ", m2.Id()), |
89 » sort.Ints(addedMachines) | 129 » }) |
90 » sort.Ints(allMachines) | |
91 » c.Assert(addedMachines, DeepEquals, allMachines) | |
rog
2012/07/18 12:26:39
c.Assert(allMachines, DeepEquals, addedMachines)
TheMue
2012/07/18 16:26:40
Done.
| |
92 | 130 |
93 c.Assert(fw.Stop(), IsNil) | 131 c.Assert(fw.Stop(), IsNil) |
94 } | 132 } |
95 | 133 |
96 func (s *FirewallerSuite) TestFirewallerStopOnStateClose(c *C) { | 134 func (s *FirewallerSuite) TestFirewallerStopOnStateClose(c *C) { |
97 » fw, err := firewaller.NewFirewaller(s.environ) | 135 » fw, err := firewaller.NewFirewaller(s.State) |
98 c.Assert(err, IsNil) | 136 c.Assert(err, IsNil) |
99 fw.CloseState() | 137 fw.CloseState() |
100 c.Check(fw.Wait(), ErrorMatches, ".* zookeeper is closing") | 138 c.Check(fw.Wait(), ErrorMatches, ".* zookeeper is closing") |
101 c.Assert(fw.Stop(), ErrorMatches, ".* zookeeper is closing") | 139 c.Assert(fw.Stop(), ErrorMatches, ".* zookeeper is closing") |
102 } | 140 } |
LEFT | RIGHT |