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 » }) |
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) | |
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 |