LEFT | RIGHT |
(no file at all) | |
| 1 package state_test |
| 2 |
| 3 import ( |
| 4 . "launchpad.net/gocheck" |
| 5 "launchpad.net/juju/go/state" |
| 6 "time" |
| 7 ) |
| 8 |
| 9 func (s *StateSuite) TestServiceWatchConfig(c *C) { |
| 10 dummy, _ := addDummyCharm(c, s.st) |
| 11 wordpress, err := s.st.AddService("wordpress", dummy) |
| 12 c.Assert(err, IsNil) |
| 13 c.Assert(wordpress.Name(), Equals, "wordpress") |
| 14 |
| 15 config, err := wordpress.Config() |
| 16 c.Assert(err, IsNil) |
| 17 c.Assert(config.Keys(), HasLen, 0) |
| 18 configWatcher := wordpress.WatchConfig() |
| 19 |
| 20 // Two change events. |
| 21 config.Set("foo", "bar") |
| 22 config.Set("baz", "yadda") |
| 23 _, err = config.Write() |
| 24 c.Assert(err, IsNil) |
| 25 time.Sleep(100 * time.Millisecond) |
| 26 config.Delete("foo") |
| 27 _, err = config.Write() |
| 28 c.Assert(err, IsNil) |
| 29 |
| 30 var expectedChanges = []map[string]interface{}{ |
| 31 {}, |
| 32 {"foo": "bar", "baz": "yadda"}, |
| 33 {"baz": "yadda"}, |
| 34 } |
| 35 for _, want := range expectedChanges { |
| 36 select { |
| 37 case got, ok := <-configWatcher.Changes(): |
| 38 c.Assert(ok, Equals, true) |
| 39 c.Assert(got.Map(), DeepEquals, want) |
| 40 case <-time.After(200 * time.Millisecond): |
| 41 c.Fatalf("didn't get change: %#v", want) |
| 42 } |
| 43 } |
| 44 |
| 45 select { |
| 46 case got, _ := <-configWatcher.Changes(): |
| 47 c.Fatalf("got unexpected change: %#v", got) |
| 48 case <-time.After(100 * time.Millisecond): |
| 49 } |
| 50 |
| 51 err = configWatcher.Stop() |
| 52 c.Assert(err, IsNil) |
| 53 } |
| 54 |
| 55 func (s *StateSuite) TestServiceWatchConfigIllegalData(c *C) { |
| 56 dummy, _ := addDummyCharm(c, s.st) |
| 57 wordpress, err := s.st.AddService("wordpress", dummy) |
| 58 c.Assert(err, IsNil) |
| 59 c.Assert(wordpress.Name(), Equals, "wordpress") |
| 60 configWatcher := wordpress.WatchConfig() |
| 61 |
| 62 // Receive empty change after service adding. |
| 63 select { |
| 64 case got, ok := <-configWatcher.Changes(): |
| 65 c.Assert(ok, Equals, true) |
| 66 c.Assert(got.Map(), DeepEquals, map[string]interface{}{}) |
| 67 case <-time.After(100 * time.Millisecond): |
| 68 c.Fatalf("unexpected timeout") |
| 69 } |
| 70 |
| 71 // Set config to illegal data. |
| 72 _, err = s.zkConn.Set("/services/service-0000000000/config", "---", -1) |
| 73 c.Assert(err, IsNil) |
| 74 |
| 75 select { |
| 76 case _, ok := <-configWatcher.Changes(): |
| 77 c.Assert(ok, Equals, false) |
| 78 case <-time.After(100 * time.Millisecond): |
| 79 } |
| 80 |
| 81 err = configWatcher.Stop() |
| 82 c.Assert(err, ErrorMatches, "YAML error: .*") |
| 83 } |
| 84 |
| 85 func (s *StateSuite) TestUnitWatchNeedsUpgrade(c *C) { |
| 86 dummy, _ := addDummyCharm(c, s.st) |
| 87 wordpress, err := s.st.AddService("wordpress", dummy) |
| 88 c.Assert(err, IsNil) |
| 89 c.Assert(wordpress.Name(), Equals, "wordpress") |
| 90 unit, err := wordpress.AddUnit() |
| 91 c.Assert(err, IsNil) |
| 92 needsUpgradeWatcher := unit.WatchNeedsUpgrade() |
| 93 |
| 94 go func() { |
| 95 time.Sleep(50 * time.Millisecond) |
| 96 err = unit.SetNeedsUpgrade() |
| 97 c.Assert(err, IsNil) |
| 98 time.Sleep(50 * time.Millisecond) |
| 99 err = unit.ClearNeedsUpgrade() |
| 100 c.Assert(err, IsNil) |
| 101 time.Sleep(50 * time.Millisecond) |
| 102 err = unit.SetNeedsUpgrade() |
| 103 c.Assert(err, IsNil) |
| 104 }() |
| 105 |
| 106 var expectedChanges = []bool{ |
| 107 true, |
| 108 false, |
| 109 true, |
| 110 } |
| 111 for _, want := range expectedChanges { |
| 112 select { |
| 113 case got, ok := <-needsUpgradeWatcher.Changes(): |
| 114 c.Assert(ok, Equals, true) |
| 115 c.Assert(got, Equals, want) |
| 116 case <-time.After(200 * time.Millisecond): |
| 117 c.Fatalf("didn't get change: %#v", want) |
| 118 } |
| 119 } |
| 120 |
| 121 select { |
| 122 case got, _ := <-needsUpgradeWatcher.Changes(): |
| 123 c.Fatalf("got unexpected change: %#v", got) |
| 124 case <-time.After(100 * time.Millisecond): |
| 125 } |
| 126 |
| 127 err = needsUpgradeWatcher.Stop() |
| 128 c.Assert(err, IsNil) |
| 129 } |
| 130 |
| 131 func (s *StateSuite) TestUnitWatchResolved(c *C) { |
| 132 dummy, _ := addDummyCharm(c, s.st) |
| 133 wordpress, err := s.st.AddService("wordpress", dummy) |
| 134 c.Assert(err, IsNil) |
| 135 c.Assert(wordpress.Name(), Equals, "wordpress") |
| 136 unit, err := wordpress.AddUnit() |
| 137 c.Assert(err, IsNil) |
| 138 resolvedWatcher := unit.WatchResolved() |
| 139 |
| 140 go func() { |
| 141 time.Sleep(50 * time.Millisecond) |
| 142 err = unit.SetResolved(state.ResolvedRetryHooks) |
| 143 c.Assert(err, IsNil) |
| 144 time.Sleep(50 * time.Millisecond) |
| 145 err = unit.ClearResolved() |
| 146 c.Assert(err, IsNil) |
| 147 time.Sleep(50 * time.Millisecond) |
| 148 err = unit.SetResolved(state.ResolvedNoHooks) |
| 149 c.Assert(err, IsNil) |
| 150 }() |
| 151 |
| 152 var expectedChanges = []state.ResolvedMode{ |
| 153 state.ResolvedRetryHooks, |
| 154 state.ResolvedNone, |
| 155 state.ResolvedNoHooks, |
| 156 } |
| 157 for _, want := range expectedChanges { |
| 158 select { |
| 159 case got, ok := <-resolvedWatcher.Changes(): |
| 160 c.Assert(ok, Equals, true) |
| 161 c.Assert(got, Equals, want) |
| 162 case <-time.After(200 * time.Millisecond): |
| 163 c.Fatalf("didn't get change: %#v", want) |
| 164 } |
| 165 } |
| 166 |
| 167 select { |
| 168 case got, _ := <-resolvedWatcher.Changes(): |
| 169 c.Fatalf("got unexpected change: %#v", got) |
| 170 case <-time.After(100 * time.Millisecond): |
| 171 } |
| 172 |
| 173 err = resolvedWatcher.Stop() |
| 174 c.Assert(err, IsNil) |
| 175 } |
LEFT | RIGHT |