Merge lp:~chipaca/ubuntu-push/session-refactor-001 into lp:ubuntu-push/automatic
- session-refactor-001
- Merge into automatic
Proposed by
John Lenton
Status: | Work in progress |
---|---|
Proposed branch: | lp:~chipaca/ubuntu-push/session-refactor-001 |
Merge into: | lp:ubuntu-push/automatic |
Diff against target: |
1093 lines (+207/-161) 4 files modified
client/client.go (+4/-4) client/client_test.go (+15/-11) client/session/session.go (+80/-38) client/session/session_test.go (+108/-108) |
To merge this branch: | bzr merge lp:~chipaca/ubuntu-push/session-refactor-001 |
Related bugs: |
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
Ubuntu Push Hackers | Pending | ||
Review via email: mp+249493@code.launchpad.net |
Commit message
Description of the change
To post a comment you must log in.
Unmerged revisions
- 366. By John Lenton
-
protect the chs with a lock. any lock will do.
- 365. By John Lenton
-
added SetChForTesting, for testing
- 364. By John Lenton
-
first step
- 363. By John Lenton
-
Merged explicit-
check-for- oversize- webcheck- response- bodies into session-refactor.
Preview Diff
[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1 | === modified file 'client/client.go' | |||
2 | --- client/client.go 2015-01-26 21:00:27 +0000 | |||
3 | +++ client/client.go 2015-02-12 14:33:25 +0000 | |||
4 | @@ -116,7 +116,7 @@ | |||
5 | 116 | systemImageInfo *systemimage.InfoResult | 116 | systemImageInfo *systemimage.InfoResult |
6 | 117 | connCh chan bool | 117 | connCh chan bool |
7 | 118 | hasConnectivity bool | 118 | hasConnectivity bool |
9 | 119 | session *session.ClientSession | 119 | session session.ClientSession |
10 | 120 | sessionConnectedCh chan uint32 | 120 | sessionConnectedCh chan uint32 |
11 | 121 | pushService PushService | 121 | pushService PushService |
12 | 122 | postalService PostalService | 122 | postalService PostalService |
13 | @@ -483,11 +483,11 @@ | |||
14 | 483 | accountshandler() | 483 | accountshandler() |
15 | 484 | case state := <-client.connCh: | 484 | case state := <-client.connCh: |
16 | 485 | connhandler(state) | 485 | connhandler(state) |
18 | 486 | case bcast := <-client.session.BroadcastCh: | 486 | case bcast := <-client.session.GetBroadcastCh(): |
19 | 487 | bcasthandler(bcast) | 487 | bcasthandler(bcast) |
21 | 488 | case aucast := <-client.session.NotificationsCh: | 488 | case aucast := <-client.session.GetNotificationsCh(): |
22 | 489 | ucasthandler(aucast) | 489 | ucasthandler(aucast) |
24 | 490 | case err := <-client.session.ErrCh: | 490 | case err := <-client.session.GetErrCh(): |
25 | 491 | errhandler(err) | 491 | errhandler(err) |
26 | 492 | case count := <-client.sessionConnectedCh: | 492 | case count := <-client.sessionConnectedCh: |
27 | 493 | client.log.Debugf("session connected after %d attempts", count) | 493 | client.log.Debugf("session connected after %d attempts", count) |
28 | 494 | 494 | ||
29 | === modified file 'client/client_test.go' | |||
30 | --- client/client_test.go 2015-02-06 13:09:16 +0000 | |||
31 | +++ client/client_test.go 2015-02-12 14:33:25 +0000 | |||
32 | @@ -528,7 +528,7 @@ | |||
33 | 528 | func (cs *clientSuite) TestDerivePollerSetup(c *C) { | 528 | func (cs *clientSuite) TestDerivePollerSetup(c *C) { |
34 | 529 | cs.writeTestConfig(map[string]interface{}{}) | 529 | cs.writeTestConfig(map[string]interface{}{}) |
35 | 530 | cli := NewPushClient(cs.configPath, cs.leveldbPath) | 530 | cli := NewPushClient(cs.configPath, cs.leveldbPath) |
37 | 531 | cli.session = new(session.ClientSession) | 531 | cli.session = new(session.ConcreteSession) |
38 | 532 | err := cli.configure() | 532 | err := cli.configure() |
39 | 533 | c.Assert(err, IsNil) | 533 | c.Assert(err, IsNil) |
40 | 534 | expected := &poller.PollerSetup{ | 534 | expected := &poller.PollerSetup{ |
41 | @@ -1031,8 +1031,9 @@ | |||
42 | 1031 | cli.log = cs.log | 1031 | cli.log = cs.log |
43 | 1032 | cli.systemImageInfo = siInfoRes | 1032 | cli.systemImageInfo = siInfoRes |
44 | 1033 | c.Assert(cli.initSessionAndPoller(), IsNil) | 1033 | c.Assert(cli.initSessionAndPoller(), IsNil) |
47 | 1034 | cli.session.BroadcastCh = make(chan *session.BroadcastNotification, 1) | 1034 | bcastCh := make(chan *session.BroadcastNotification, 1) |
48 | 1035 | cli.session.BroadcastCh <- &session.BroadcastNotification{} | 1035 | cli.session.SetChForTesting(bcastCh, nil, nil) |
49 | 1036 | bcastCh <- &session.BroadcastNotification{} | ||
50 | 1036 | 1037 | ||
51 | 1037 | ch := make(chan bool, 1) | 1038 | ch := make(chan bool, 1) |
52 | 1038 | go cli.doLoop(nopConn, func(_ *session.BroadcastNotification) error { ch <- true; return nil }, nopUcast, nopError, nopUnregister, nopAcct) | 1039 | go cli.doLoop(nopConn, func(_ *session.BroadcastNotification) error { ch <- true; return nil }, nopUcast, nopError, nopUnregister, nopAcct) |
53 | @@ -1044,8 +1045,9 @@ | |||
54 | 1044 | cli.log = cs.log | 1045 | cli.log = cs.log |
55 | 1045 | cli.systemImageInfo = siInfoRes | 1046 | cli.systemImageInfo = siInfoRes |
56 | 1046 | c.Assert(cli.initSessionAndPoller(), IsNil) | 1047 | c.Assert(cli.initSessionAndPoller(), IsNil) |
59 | 1047 | cli.session.NotificationsCh = make(chan session.AddressedNotification, 1) | 1048 | notifCh := make(chan session.AddressedNotification, 1) |
60 | 1048 | cli.session.NotificationsCh <- session.AddressedNotification{} | 1049 | cli.session.SetChForTesting(nil, notifCh, nil) |
61 | 1050 | notifCh <- session.AddressedNotification{} | ||
62 | 1049 | 1051 | ||
63 | 1050 | ch := make(chan bool, 1) | 1052 | ch := make(chan bool, 1) |
64 | 1051 | go cli.doLoop(nopConn, nopBcast, func(session.AddressedNotification) error { ch <- true; return nil }, nopError, nopUnregister, nopAcct) | 1053 | go cli.doLoop(nopConn, nopBcast, func(session.AddressedNotification) error { ch <- true; return nil }, nopError, nopUnregister, nopAcct) |
65 | @@ -1057,8 +1059,9 @@ | |||
66 | 1057 | cli.log = cs.log | 1059 | cli.log = cs.log |
67 | 1058 | cli.systemImageInfo = siInfoRes | 1060 | cli.systemImageInfo = siInfoRes |
68 | 1059 | c.Assert(cli.initSessionAndPoller(), IsNil) | 1061 | c.Assert(cli.initSessionAndPoller(), IsNil) |
71 | 1060 | cli.session.ErrCh = make(chan error, 1) | 1062 | errCh := make(chan error, 1) |
72 | 1061 | cli.session.ErrCh <- nil | 1063 | cli.session.SetChForTesting(nil, nil, errCh) |
73 | 1064 | errCh <- nil | ||
74 | 1062 | 1065 | ||
75 | 1063 | ch := make(chan bool, 1) | 1066 | ch := make(chan bool, 1) |
76 | 1064 | go cli.doLoop(nopConn, nopBcast, nopUcast, func(error) { ch <- true }, nopUnregister, nopAcct) | 1067 | go cli.doLoop(nopConn, nopBcast, nopUcast, func(error) { ch <- true }, nopUnregister, nopAcct) |
77 | @@ -1137,8 +1140,9 @@ | |||
78 | 1137 | 1140 | ||
79 | 1138 | c.Assert(cli.initSessionAndPoller(), IsNil) | 1141 | c.Assert(cli.initSessionAndPoller(), IsNil) |
80 | 1139 | 1142 | ||
83 | 1140 | cli.session.BroadcastCh = make(chan *session.BroadcastNotification) | 1143 | bcastCh := make(chan *session.BroadcastNotification) |
84 | 1141 | cli.session.ErrCh = make(chan error) | 1144 | errCh := make(chan error) |
85 | 1145 | cli.session.SetChForTesting(bcastCh, nil, errCh) | ||
86 | 1142 | 1146 | ||
87 | 1143 | // we use tick() to make sure things have been through the | 1147 | // we use tick() to make sure things have been through the |
88 | 1144 | // event loop at least once before looking at things; | 1148 | // event loop at least once before looking at things; |
89 | @@ -1165,12 +1169,12 @@ | |||
90 | 1165 | 1169 | ||
91 | 1166 | // * session.BroadcastCh to the notifications handler | 1170 | // * session.BroadcastCh to the notifications handler |
92 | 1167 | c.Check(d.bcastCount, Equals, 0) | 1171 | c.Check(d.bcastCount, Equals, 0) |
94 | 1168 | cli.session.BroadcastCh <- positiveBroadcastNotification | 1172 | bcastCh <- positiveBroadcastNotification |
95 | 1169 | tick() | 1173 | tick() |
96 | 1170 | c.Check(d.bcastCount, Equals, 1) | 1174 | c.Check(d.bcastCount, Equals, 1) |
97 | 1171 | 1175 | ||
98 | 1172 | // * session.ErrCh to the error handler | 1176 | // * session.ErrCh to the error handler |
100 | 1173 | cli.session.ErrCh <- nil | 1177 | errCh <- nil |
101 | 1174 | tick() | 1178 | tick() |
102 | 1175 | c.Check(cs.log.Captured(), Matches, "(?ms).*session exited.*") | 1179 | c.Check(cs.log.Captured(), Matches, "(?ms).*session exited.*") |
103 | 1176 | } | 1180 | } |
104 | 1177 | 1181 | ||
105 | === modified file 'client/session/session.go' | |||
106 | --- client/session/session.go 2015-01-22 11:05:37 +0000 | |||
107 | +++ client/session/session.go 2015-02-12 14:33:25 +0000 | |||
108 | @@ -120,8 +120,20 @@ | |||
109 | 120 | AddresseeChecker AddresseeChecking | 120 | AddresseeChecker AddresseeChecking |
110 | 121 | } | 121 | } |
111 | 122 | 122 | ||
114 | 123 | // ClientSession holds a client<->server session and its configuration. | 123 | type ClientSession interface { |
115 | 124 | type ClientSession struct { | 124 | State() ClientSessionState |
116 | 125 | Close() | ||
117 | 126 | AutoRedial(done chan uint32) | ||
118 | 127 | ClearCookie() | ||
119 | 128 | Dial() error | ||
120 | 129 | GetBroadcastCh() chan *BroadcastNotification | ||
121 | 130 | GetNotificationsCh() chan AddressedNotification | ||
122 | 131 | GetErrCh() chan error | ||
123 | 132 | SetChForTesting(chan *BroadcastNotification, chan AddressedNotification, chan error) | ||
124 | 133 | } | ||
125 | 134 | |||
126 | 135 | // ConcreteSession holds a client<->server session and its configuration. | ||
127 | 136 | type ConcreteSession struct { | ||
128 | 125 | // configuration | 137 | // configuration |
129 | 126 | DeviceId string | 138 | DeviceId string |
130 | 127 | ClientSessionConfig | 139 | ClientSessionConfig |
131 | @@ -157,13 +169,13 @@ | |||
132 | 157 | // autoredial knobs | 169 | // autoredial knobs |
133 | 158 | shouldDelayP *uint32 | 170 | shouldDelayP *uint32 |
134 | 159 | lastAutoRedial time.Time | 171 | lastAutoRedial time.Time |
136 | 160 | redialDelay func(*ClientSession) time.Duration | 172 | redialDelay func(*ConcreteSession) time.Duration |
137 | 161 | redialJitter func(time.Duration) time.Duration | 173 | redialJitter func(time.Duration) time.Duration |
138 | 162 | redialDelays []time.Duration | 174 | redialDelays []time.Duration |
139 | 163 | redialDelaysIdx int | 175 | redialDelaysIdx int |
140 | 164 | } | 176 | } |
141 | 165 | 177 | ||
143 | 166 | func redialDelay(sess *ClientSession) time.Duration { | 178 | func redialDelay(sess *ConcreteSession) time.Duration { |
144 | 167 | if sess.ShouldDelay() { | 179 | if sess.ShouldDelay() { |
145 | 168 | t := sess.redialDelays[sess.redialDelaysIdx] | 180 | t := sess.redialDelays[sess.redialDelaysIdx] |
146 | 169 | if len(sess.redialDelays) > sess.redialDelaysIdx+1 { | 181 | if len(sess.redialDelays) > sess.redialDelaysIdx+1 { |
147 | @@ -178,7 +190,13 @@ | |||
148 | 178 | 190 | ||
149 | 179 | func NewSession(serverAddrSpec string, conf ClientSessionConfig, | 191 | func NewSession(serverAddrSpec string, conf ClientSessionConfig, |
150 | 180 | deviceId string, seenStateFactory func() (seenstate.SeenState, error), | 192 | deviceId string, seenStateFactory func() (seenstate.SeenState, error), |
152 | 181 | log logger.Logger) (*ClientSession, error) { | 193 | log logger.Logger) (ClientSession, error) { |
153 | 194 | return newSession(serverAddrSpec, conf, deviceId, seenStateFactory, log) | ||
154 | 195 | } | ||
155 | 196 | |||
156 | 197 | func newSession(serverAddrSpec string, conf ClientSessionConfig, | ||
157 | 198 | deviceId string, seenStateFactory func() (seenstate.SeenState, error), | ||
158 | 199 | log logger.Logger) (*ConcreteSession, error) { | ||
159 | 182 | state := uint32(Disconnected) | 200 | state := uint32(Disconnected) |
160 | 183 | seenState, err := seenStateFactory() | 201 | seenState, err := seenStateFactory() |
161 | 184 | if err != nil { | 202 | if err != nil { |
162 | @@ -191,7 +209,7 @@ | |||
163 | 191 | getHost = gethosts.New(deviceId, hostsEndpoint, conf.ExchangeTimeout) | 209 | getHost = gethosts.New(deviceId, hostsEndpoint, conf.ExchangeTimeout) |
164 | 192 | } | 210 | } |
165 | 193 | var shouldDelay uint32 = 0 | 211 | var shouldDelay uint32 = 0 |
167 | 194 | sess := &ClientSession{ | 212 | sess := &ConcreteSession{ |
168 | 195 | ClientSessionConfig: conf, | 213 | ClientSessionConfig: conf, |
169 | 196 | getHost: getHost, | 214 | getHost: getHost, |
170 | 197 | fallbackHosts: fallbackHosts, | 215 | fallbackHosts: fallbackHosts, |
171 | @@ -218,59 +236,83 @@ | |||
172 | 218 | return sess, nil | 236 | return sess, nil |
173 | 219 | } | 237 | } |
174 | 220 | 238 | ||
176 | 221 | func (sess *ClientSession) ShouldDelay() bool { | 239 | func (sess *ConcreteSession) GetBroadcastCh() chan *BroadcastNotification { |
177 | 240 | return sess.BroadcastCh | ||
178 | 241 | } | ||
179 | 242 | func (sess *ConcreteSession) GetNotificationsCh() chan AddressedNotification { | ||
180 | 243 | return sess.NotificationsCh | ||
181 | 244 | } | ||
182 | 245 | func (sess *ConcreteSession) GetErrCh() chan error { | ||
183 | 246 | return sess.ErrCh | ||
184 | 247 | } | ||
185 | 248 | func (sess *ConcreteSession) SetChForTesting(bch chan *BroadcastNotification, nch chan AddressedNotification, ech chan error) { | ||
186 | 249 | // abusing connLock a bit | ||
187 | 250 | sess.connLock.Lock() | ||
188 | 251 | defer sess.connLock.Unlock() | ||
189 | 252 | if bch != nil { | ||
190 | 253 | sess.BroadcastCh = bch | ||
191 | 254 | } | ||
192 | 255 | if nch != nil { | ||
193 | 256 | sess.NotificationsCh = nch | ||
194 | 257 | } | ||
195 | 258 | if ech != nil { | ||
196 | 259 | sess.ErrCh = ech | ||
197 | 260 | } | ||
198 | 261 | } | ||
199 | 262 | |||
200 | 263 | func (sess *ConcreteSession) ShouldDelay() bool { | ||
201 | 222 | return atomic.LoadUint32(sess.shouldDelayP) != 0 | 264 | return atomic.LoadUint32(sess.shouldDelayP) != 0 |
202 | 223 | } | 265 | } |
203 | 224 | 266 | ||
205 | 225 | func (sess *ClientSession) setShouldDelay() { | 267 | func (sess *ConcreteSession) setShouldDelay() { |
206 | 226 | atomic.StoreUint32(sess.shouldDelayP, uint32(1)) | 268 | atomic.StoreUint32(sess.shouldDelayP, uint32(1)) |
207 | 227 | } | 269 | } |
208 | 228 | 270 | ||
210 | 229 | func (sess *ClientSession) clearShouldDelay() { | 271 | func (sess *ConcreteSession) clearShouldDelay() { |
211 | 230 | atomic.StoreUint32(sess.shouldDelayP, uint32(0)) | 272 | atomic.StoreUint32(sess.shouldDelayP, uint32(0)) |
212 | 231 | } | 273 | } |
213 | 232 | 274 | ||
215 | 233 | func (sess *ClientSession) State() ClientSessionState { | 275 | func (sess *ConcreteSession) State() ClientSessionState { |
216 | 234 | return ClientSessionState(atomic.LoadUint32(sess.stateP)) | 276 | return ClientSessionState(atomic.LoadUint32(sess.stateP)) |
217 | 235 | } | 277 | } |
218 | 236 | 278 | ||
220 | 237 | func (sess *ClientSession) setState(state ClientSessionState) { | 279 | func (sess *ConcreteSession) setState(state ClientSessionState) { |
221 | 238 | sess.Log.Debugf("session.setState: %s -> %s", ClientSessionState(atomic.LoadUint32(sess.stateP)), state) | 280 | sess.Log.Debugf("session.setState: %s -> %s", ClientSessionState(atomic.LoadUint32(sess.stateP)), state) |
222 | 239 | atomic.StoreUint32(sess.stateP, uint32(state)) | 281 | atomic.StoreUint32(sess.stateP, uint32(state)) |
223 | 240 | } | 282 | } |
224 | 241 | 283 | ||
226 | 242 | func (sess *ClientSession) setConnection(conn net.Conn) { | 284 | func (sess *ConcreteSession) setConnection(conn net.Conn) { |
227 | 243 | sess.connLock.Lock() | 285 | sess.connLock.Lock() |
228 | 244 | defer sess.connLock.Unlock() | 286 | defer sess.connLock.Unlock() |
229 | 245 | sess.Connection = conn | 287 | sess.Connection = conn |
230 | 246 | } | 288 | } |
231 | 247 | 289 | ||
233 | 248 | func (sess *ClientSession) getConnection() net.Conn { | 290 | func (sess *ConcreteSession) getConnection() net.Conn { |
234 | 249 | sess.connLock.RLock() | 291 | sess.connLock.RLock() |
235 | 250 | defer sess.connLock.RUnlock() | 292 | defer sess.connLock.RUnlock() |
236 | 251 | return sess.Connection | 293 | return sess.Connection |
237 | 252 | } | 294 | } |
238 | 253 | 295 | ||
240 | 254 | func (sess *ClientSession) setCookie(cookie string) { | 296 | func (sess *ConcreteSession) setCookie(cookie string) { |
241 | 255 | sess.connLock.Lock() | 297 | sess.connLock.Lock() |
242 | 256 | defer sess.connLock.Unlock() | 298 | defer sess.connLock.Unlock() |
243 | 257 | sess.cookie = cookie | 299 | sess.cookie = cookie |
244 | 258 | } | 300 | } |
245 | 259 | 301 | ||
247 | 260 | func (sess *ClientSession) getCookie() string { | 302 | func (sess *ConcreteSession) getCookie() string { |
248 | 261 | sess.connLock.RLock() | 303 | sess.connLock.RLock() |
249 | 262 | defer sess.connLock.RUnlock() | 304 | defer sess.connLock.RUnlock() |
250 | 263 | return sess.cookie | 305 | return sess.cookie |
251 | 264 | } | 306 | } |
252 | 265 | 307 | ||
254 | 266 | func (sess *ClientSession) ClearCookie() { | 308 | func (sess *ConcreteSession) ClearCookie() { |
255 | 267 | sess.connLock.Lock() | 309 | sess.connLock.Lock() |
256 | 268 | defer sess.connLock.Unlock() | 310 | defer sess.connLock.Unlock() |
257 | 269 | sess.cookie = "" | 311 | sess.cookie = "" |
258 | 270 | } | 312 | } |
259 | 271 | 313 | ||
260 | 272 | // getHosts sets deliveryHosts possibly querying a remote endpoint | 314 | // getHosts sets deliveryHosts possibly querying a remote endpoint |
262 | 273 | func (sess *ClientSession) getHosts() error { | 315 | func (sess *ConcreteSession) getHosts() error { |
263 | 274 | if sess.getHost != nil { | 316 | if sess.getHost != nil { |
264 | 275 | if sess.deliveryHosts != nil && sess.timeSince(sess.deliveryHostsTimestamp) < sess.HostsCachingExpiryTime { | 317 | if sess.deliveryHosts != nil && sess.timeSince(sess.deliveryHostsTimestamp) < sess.HostsCachingExpiryTime { |
265 | 276 | return nil | 318 | return nil |
266 | @@ -294,7 +336,7 @@ | |||
267 | 294 | 336 | ||
268 | 295 | // addAuthorization gets the authorization blob to send to the server | 337 | // addAuthorization gets the authorization blob to send to the server |
269 | 296 | // and adds it to the session. | 338 | // and adds it to the session. |
271 | 297 | func (sess *ClientSession) addAuthorization() error { | 339 | func (sess *ConcreteSession) addAuthorization() error { |
272 | 298 | if sess.AuthGetter != nil { | 340 | if sess.AuthGetter != nil { |
273 | 299 | sess.Log.Debugf("adding authorization") | 341 | sess.Log.Debugf("adding authorization") |
274 | 300 | sess.auth = sess.AuthGetter(sess.AuthURL) | 342 | sess.auth = sess.AuthGetter(sess.AuthURL) |
275 | @@ -302,13 +344,13 @@ | |||
276 | 302 | return nil | 344 | return nil |
277 | 303 | } | 345 | } |
278 | 304 | 346 | ||
280 | 305 | func (sess *ClientSession) resetHosts() { | 347 | func (sess *ConcreteSession) resetHosts() { |
281 | 306 | sess.deliveryHosts = nil | 348 | sess.deliveryHosts = nil |
282 | 307 | } | 349 | } |
283 | 308 | 350 | ||
284 | 309 | // startConnectionAttempt/nextHostToTry help connect iterating over candidate hosts | 351 | // startConnectionAttempt/nextHostToTry help connect iterating over candidate hosts |
285 | 310 | 352 | ||
287 | 311 | func (sess *ClientSession) startConnectionAttempt() { | 353 | func (sess *ConcreteSession) startConnectionAttempt() { |
288 | 312 | if sess.timeSince(sess.lastAttemptTimestamp) > sess.ExpectAllRepairedTime { | 354 | if sess.timeSince(sess.lastAttemptTimestamp) > sess.ExpectAllRepairedTime { |
289 | 313 | sess.tryHost = 0 | 355 | sess.tryHost = 0 |
290 | 314 | } | 356 | } |
291 | @@ -319,7 +361,7 @@ | |||
292 | 319 | sess.lastAttemptTimestamp = time.Now() | 361 | sess.lastAttemptTimestamp = time.Now() |
293 | 320 | } | 362 | } |
294 | 321 | 363 | ||
296 | 322 | func (sess *ClientSession) nextHostToTry() string { | 364 | func (sess *ConcreteSession) nextHostToTry() string { |
297 | 323 | if sess.leftToTry == 0 { | 365 | if sess.leftToTry == 0 { |
298 | 324 | return "" | 366 | return "" |
299 | 325 | } | 367 | } |
300 | @@ -331,7 +373,7 @@ | |||
301 | 331 | 373 | ||
302 | 332 | // we reached the Started state, we can retry with the same host if we | 374 | // we reached the Started state, we can retry with the same host if we |
303 | 333 | // have to retry again | 375 | // have to retry again |
305 | 334 | func (sess *ClientSession) started() { | 376 | func (sess *ConcreteSession) started() { |
306 | 335 | sess.tryHost-- | 377 | sess.tryHost-- |
307 | 336 | if sess.tryHost == -1 { | 378 | if sess.tryHost == -1 { |
308 | 337 | sess.tryHost = len(sess.deliveryHosts) - 1 | 379 | sess.tryHost = len(sess.deliveryHosts) - 1 |
309 | @@ -341,7 +383,7 @@ | |||
310 | 341 | 383 | ||
311 | 342 | // connect to a server using the configuration in the ClientSession | 384 | // connect to a server using the configuration in the ClientSession |
312 | 343 | // and set up the connection. | 385 | // and set up the connection. |
314 | 344 | func (sess *ClientSession) connect() error { | 386 | func (sess *ConcreteSession) connect() error { |
315 | 345 | sess.setShouldDelay() | 387 | sess.setShouldDelay() |
316 | 346 | sess.startConnectionAttempt() | 388 | sess.startConnectionAttempt() |
317 | 347 | var err error | 389 | var err error |
318 | @@ -363,7 +405,7 @@ | |||
319 | 363 | return nil | 405 | return nil |
320 | 364 | } | 406 | } |
321 | 365 | 407 | ||
323 | 366 | func (sess *ClientSession) stopRedial() { | 408 | func (sess *ConcreteSession) stopRedial() { |
324 | 367 | sess.retrierLock.Lock() | 409 | sess.retrierLock.Lock() |
325 | 368 | defer sess.retrierLock.Unlock() | 410 | defer sess.retrierLock.Unlock() |
326 | 369 | if sess.retrier != nil { | 411 | if sess.retrier != nil { |
327 | @@ -372,7 +414,7 @@ | |||
328 | 372 | } | 414 | } |
329 | 373 | } | 415 | } |
330 | 374 | 416 | ||
332 | 375 | func (sess *ClientSession) AutoRedial(doneCh chan uint32) { | 417 | func (sess *ConcreteSession) AutoRedial(doneCh chan uint32) { |
333 | 376 | sess.stopRedial() | 418 | sess.stopRedial() |
334 | 377 | if time.Since(sess.lastAutoRedial) < 2*time.Second { | 419 | if time.Since(sess.lastAutoRedial) < 2*time.Second { |
335 | 378 | sess.setShouldDelay() | 420 | sess.setShouldDelay() |
336 | @@ -398,12 +440,12 @@ | |||
337 | 398 | }() | 440 | }() |
338 | 399 | } | 441 | } |
339 | 400 | 442 | ||
341 | 401 | func (sess *ClientSession) Close() { | 443 | func (sess *ConcreteSession) Close() { |
342 | 402 | sess.stopRedial() | 444 | sess.stopRedial() |
343 | 403 | sess.doClose() | 445 | sess.doClose() |
344 | 404 | } | 446 | } |
345 | 405 | 447 | ||
347 | 406 | func (sess *ClientSession) doClose() { | 448 | func (sess *ConcreteSession) doClose() { |
348 | 407 | sess.connLock.Lock() | 449 | sess.connLock.Lock() |
349 | 408 | defer sess.connLock.Unlock() | 450 | defer sess.connLock.Unlock() |
350 | 409 | if sess.Connection != nil { | 451 | if sess.Connection != nil { |
351 | @@ -417,7 +459,7 @@ | |||
352 | 417 | } | 459 | } |
353 | 418 | 460 | ||
354 | 419 | // handle "ping" messages | 461 | // handle "ping" messages |
356 | 420 | func (sess *ClientSession) handlePing() error { | 462 | func (sess *ConcreteSession) handlePing() error { |
357 | 421 | err := sess.proto.WriteMessage(protocol.PingPongMsg{Type: "pong"}) | 463 | err := sess.proto.WriteMessage(protocol.PingPongMsg{Type: "pong"}) |
358 | 422 | if err == nil { | 464 | if err == nil { |
359 | 423 | sess.Log.Debugf("ping.") | 465 | sess.Log.Debugf("ping.") |
360 | @@ -429,7 +471,7 @@ | |||
361 | 429 | return err | 471 | return err |
362 | 430 | } | 472 | } |
363 | 431 | 473 | ||
365 | 432 | func (sess *ClientSession) decodeBroadcast(bcast *serverMsg) *BroadcastNotification { | 474 | func (sess *ConcreteSession) decodeBroadcast(bcast *serverMsg) *BroadcastNotification { |
366 | 433 | decoded := make([]map[string]interface{}, 0) | 475 | decoded := make([]map[string]interface{}, 0) |
367 | 434 | for _, p := range bcast.Payloads { | 476 | for _, p := range bcast.Payloads { |
368 | 435 | var v map[string]interface{} | 477 | var v map[string]interface{} |
369 | @@ -447,7 +489,7 @@ | |||
370 | 447 | } | 489 | } |
371 | 448 | 490 | ||
372 | 449 | // handle "broadcast" messages | 491 | // handle "broadcast" messages |
374 | 450 | func (sess *ClientSession) handleBroadcast(bcast *serverMsg) error { | 492 | func (sess *ConcreteSession) handleBroadcast(bcast *serverMsg) error { |
375 | 451 | err := sess.SeenState.SetLevel(bcast.ChanId, bcast.TopLevel) | 493 | err := sess.SeenState.SetLevel(bcast.ChanId, bcast.TopLevel) |
376 | 452 | if err != nil { | 494 | if err != nil { |
377 | 453 | sess.setState(Error) | 495 | sess.setState(Error) |
378 | @@ -478,7 +520,7 @@ | |||
379 | 478 | } | 520 | } |
380 | 479 | 521 | ||
381 | 480 | // handle "notifications" messages | 522 | // handle "notifications" messages |
383 | 481 | func (sess *ClientSession) handleNotifications(ucast *serverMsg) error { | 523 | func (sess *ConcreteSession) handleNotifications(ucast *serverMsg) error { |
384 | 482 | notifs, err := sess.SeenState.FilterBySeen(ucast.Notifications) | 524 | notifs, err := sess.SeenState.FilterBySeen(ucast.Notifications) |
385 | 483 | if err != nil { | 525 | if err != nil { |
386 | 484 | sess.setState(Error) | 526 | sess.setState(Error) |
387 | @@ -512,7 +554,7 @@ | |||
388 | 512 | } | 554 | } |
389 | 513 | 555 | ||
390 | 514 | // handle "connbroken" messages | 556 | // handle "connbroken" messages |
392 | 515 | func (sess *ClientSession) handleConnBroken(connBroken *serverMsg) error { | 557 | func (sess *ConcreteSession) handleConnBroken(connBroken *serverMsg) error { |
393 | 516 | sess.setState(Error) | 558 | sess.setState(Error) |
394 | 517 | reason := connBroken.Reason | 559 | reason := connBroken.Reason |
395 | 518 | err := fmt.Errorf("server broke connection: %s", reason) | 560 | err := fmt.Errorf("server broke connection: %s", reason) |
396 | @@ -525,7 +567,7 @@ | |||
397 | 525 | } | 567 | } |
398 | 526 | 568 | ||
399 | 527 | // handle "setparams" messages | 569 | // handle "setparams" messages |
401 | 528 | func (sess *ClientSession) handleSetParams(setParams *serverMsg) error { | 570 | func (sess *ConcreteSession) handleSetParams(setParams *serverMsg) error { |
402 | 529 | if setParams.SetCookie != "" { | 571 | if setParams.SetCookie != "" { |
403 | 530 | sess.setCookie(setParams.SetCookie) | 572 | sess.setCookie(setParams.SetCookie) |
404 | 531 | } | 573 | } |
405 | @@ -533,7 +575,7 @@ | |||
406 | 533 | } | 575 | } |
407 | 534 | 576 | ||
408 | 535 | // loop runs the session with the server, emits a stream of events. | 577 | // loop runs the session with the server, emits a stream of events. |
410 | 536 | func (sess *ClientSession) loop() error { | 578 | func (sess *ConcreteSession) loop() error { |
411 | 537 | var err error | 579 | var err error |
412 | 538 | var recv serverMsg | 580 | var recv serverMsg |
413 | 539 | sess.setState(Running) | 581 | sess.setState(Running) |
414 | @@ -571,7 +613,7 @@ | |||
415 | 571 | } | 613 | } |
416 | 572 | 614 | ||
417 | 573 | // Call this when you've connected and want to start looping. | 615 | // Call this when you've connected and want to start looping. |
419 | 574 | func (sess *ClientSession) start() error { | 616 | func (sess *ConcreteSession) start() error { |
420 | 575 | conn := sess.getConnection() | 617 | conn := sess.getConnection() |
421 | 576 | err := conn.SetDeadline(time.Now().Add(sess.ExchangeTimeout)) | 618 | err := conn.SetDeadline(time.Now().Add(sess.ExchangeTimeout)) |
422 | 577 | if err != nil { | 619 | if err != nil { |
423 | @@ -634,7 +676,7 @@ | |||
424 | 634 | 676 | ||
425 | 635 | // run calls connect, and if it works it calls start, and if it works | 677 | // run calls connect, and if it works it calls start, and if it works |
426 | 636 | // it runs loop in a goroutine, and ships its return value over ErrCh. | 678 | // it runs loop in a goroutine, and ships its return value over ErrCh. |
428 | 637 | func (sess *ClientSession) run(closer func(), authChecker, hostGetter, connecter, starter, looper func() error) error { | 679 | func (sess *ConcreteSession) run(closer func(), authChecker, hostGetter, connecter, starter, looper func() error) error { |
429 | 638 | closer() | 680 | closer() |
430 | 639 | if err := authChecker(); err != nil { | 681 | if err := authChecker(); err != nil { |
431 | 640 | return err | 682 | return err |
432 | @@ -656,7 +698,7 @@ | |||
433 | 656 | } | 698 | } |
434 | 657 | 699 | ||
435 | 658 | // This Jitter returns a random time.Duration somewhere in [-spread, spread]. | 700 | // This Jitter returns a random time.Duration somewhere in [-spread, spread]. |
437 | 659 | func (sess *ClientSession) Jitter(spread time.Duration) time.Duration { | 701 | func (sess *ConcreteSession) Jitter(spread time.Duration) time.Duration { |
438 | 660 | if spread < 0 { | 702 | if spread < 0 { |
439 | 661 | panic("spread must be non-negative") | 703 | panic("spread must be non-negative") |
440 | 662 | } | 704 | } |
441 | @@ -666,7 +708,7 @@ | |||
442 | 666 | 708 | ||
443 | 667 | // Dial takes the session from newly created (or newly disconnected) | 709 | // Dial takes the session from newly created (or newly disconnected) |
444 | 668 | // to running the main loop. | 710 | // to running the main loop. |
446 | 669 | func (sess *ClientSession) Dial() error { | 711 | func (sess *ConcreteSession) Dial() error { |
447 | 670 | if sess.Protocolator == nil { | 712 | if sess.Protocolator == nil { |
448 | 671 | // a missing protocolator means you've willfully overridden | 713 | // a missing protocolator means you've willfully overridden |
449 | 672 | // it; returning an error here would prompt AutoRedial to just | 714 | // it; returning an error here would prompt AutoRedial to just |
450 | 673 | 715 | ||
451 | === modified file 'client/session/session_test.go' | |||
452 | --- client/session/session_test.go 2015-02-02 16:49:46 +0000 | |||
453 | +++ client/session/session_test.go 2015-02-12 14:33:25 +0000 | |||
454 | @@ -169,20 +169,20 @@ | |||
455 | 169 | 169 | ||
456 | 170 | ///// | 170 | ///// |
457 | 171 | 171 | ||
459 | 172 | type clientSessionSuite struct { | 172 | type ConcreteSessionSuite struct { |
460 | 173 | log *helpers.TestLogger | 173 | log *helpers.TestLogger |
461 | 174 | lvls func() (seenstate.SeenState, error) | 174 | lvls func() (seenstate.SeenState, error) |
462 | 175 | } | 175 | } |
463 | 176 | 176 | ||
465 | 177 | func (cs *clientSessionSuite) SetUpTest(c *C) { | 177 | func (cs *ConcreteSessionSuite) SetUpTest(c *C) { |
466 | 178 | cs.log = helpers.NewTestLogger(c, "debug") | 178 | cs.log = helpers.NewTestLogger(c, "debug") |
467 | 179 | } | 179 | } |
468 | 180 | 180 | ||
469 | 181 | // in-memory level map testing | 181 | // in-memory level map testing |
471 | 182 | var _ = Suite(&clientSessionSuite{lvls: seenstate.NewSeenState}) | 182 | var _ = Suite(&ConcreteSessionSuite{lvls: seenstate.NewSeenState}) |
472 | 183 | 183 | ||
473 | 184 | // sqlite level map testing | 184 | // sqlite level map testing |
475 | 185 | type clientSqlevelsSessionSuite struct{ clientSessionSuite } | 185 | type clientSqlevelsSessionSuite struct{ ConcreteSessionSuite } |
476 | 186 | 186 | ||
477 | 187 | var _ = Suite(&clientSqlevelsSessionSuite{}) | 187 | var _ = Suite(&clientSqlevelsSessionSuite{}) |
478 | 188 | 188 | ||
479 | @@ -194,7 +194,7 @@ | |||
480 | 194 | parseServerAddrSpec() tests | 194 | parseServerAddrSpec() tests |
481 | 195 | ****************************************************************/ | 195 | ****************************************************************/ |
482 | 196 | 196 | ||
484 | 197 | func (cs *clientSessionSuite) TestParseServerAddrSpec(c *C) { | 197 | func (cs *ConcreteSessionSuite) TestParseServerAddrSpec(c *C) { |
485 | 198 | hEp, fallbackHosts := parseServerAddrSpec("http://foo/hosts") | 198 | hEp, fallbackHosts := parseServerAddrSpec("http://foo/hosts") |
486 | 199 | c.Check(hEp, Equals, "http://foo/hosts") | 199 | c.Check(hEp, Equals, "http://foo/hosts") |
487 | 200 | c.Check(fallbackHosts, IsNil) | 200 | c.Check(fallbackHosts, IsNil) |
488 | @@ -209,13 +209,13 @@ | |||
489 | 209 | } | 209 | } |
490 | 210 | 210 | ||
491 | 211 | /**************************************************************** | 211 | /**************************************************************** |
493 | 212 | NewSession() tests | 212 | newSession() tests |
494 | 213 | ****************************************************************/ | 213 | ****************************************************************/ |
495 | 214 | 214 | ||
496 | 215 | var dummyConf = ClientSessionConfig{} | 215 | var dummyConf = ClientSessionConfig{} |
497 | 216 | 216 | ||
500 | 217 | func (cs *clientSessionSuite) TestNewSessionPlainWorks(c *C) { | 217 | func (cs *ConcreteSessionSuite) TestnewSessionPlainWorks(c *C) { |
501 | 218 | sess, err := NewSession("foo:443", dummyConf, "", cs.lvls, cs.log) | 218 | sess, err := newSession("foo:443", dummyConf, "", cs.lvls, cs.log) |
502 | 219 | c.Check(sess, NotNil) | 219 | c.Check(sess, NotNil) |
503 | 220 | c.Check(err, IsNil) | 220 | c.Check(err, IsNil) |
504 | 221 | c.Check(sess.fallbackHosts, DeepEquals, []string{"foo:443"}) | 221 | c.Check(sess.fallbackHosts, DeepEquals, []string{"foo:443"}) |
505 | @@ -228,8 +228,8 @@ | |||
506 | 228 | c.Check(sess.State(), Equals, Disconnected) | 228 | c.Check(sess.State(), Equals, Disconnected) |
507 | 229 | } | 229 | } |
508 | 230 | 230 | ||
511 | 231 | func (cs *clientSessionSuite) TestNewSessionHostEndpointWorks(c *C) { | 231 | func (cs *ConcreteSessionSuite) TestnewSessionHostEndpointWorks(c *C) { |
512 | 232 | sess, err := NewSession("http://foo/hosts", dummyConf, "wah", cs.lvls, cs.log) | 232 | sess, err := newSession("http://foo/hosts", dummyConf, "wah", cs.lvls, cs.log) |
513 | 233 | c.Assert(err, IsNil) | 233 | c.Assert(err, IsNil) |
514 | 234 | c.Check(sess.getHost, NotNil) | 234 | c.Check(sess.getHost, NotNil) |
515 | 235 | } | 235 | } |
516 | @@ -237,25 +237,25 @@ | |||
517 | 237 | var certfile string = helpers.SourceRelative("../../server/acceptance/ssl/testing.cert") | 237 | var certfile string = helpers.SourceRelative("../../server/acceptance/ssl/testing.cert") |
518 | 238 | var pem, _ = ioutil.ReadFile(certfile) | 238 | var pem, _ = ioutil.ReadFile(certfile) |
519 | 239 | 239 | ||
521 | 240 | func (cs *clientSessionSuite) TestNewSessionPEMWorks(c *C) { | 240 | func (cs *ConcreteSessionSuite) TestnewSessionPEMWorks(c *C) { |
522 | 241 | conf := ClientSessionConfig{PEM: pem} | 241 | conf := ClientSessionConfig{PEM: pem} |
524 | 242 | sess, err := NewSession("", conf, "wah", cs.lvls, cs.log) | 242 | sess, err := newSession("", conf, "wah", cs.lvls, cs.log) |
525 | 243 | c.Check(sess, NotNil) | 243 | c.Check(sess, NotNil) |
526 | 244 | c.Assert(err, IsNil) | 244 | c.Assert(err, IsNil) |
527 | 245 | c.Check(sess.TLS.RootCAs, NotNil) | 245 | c.Check(sess.TLS.RootCAs, NotNil) |
528 | 246 | } | 246 | } |
529 | 247 | 247 | ||
531 | 248 | func (cs *clientSessionSuite) TestNewSessionBadPEMFileContentFails(c *C) { | 248 | func (cs *ConcreteSessionSuite) TestnewSessionBadPEMFileContentFails(c *C) { |
532 | 249 | badpem := []byte("This is not the PEM you're looking for.") | 249 | badpem := []byte("This is not the PEM you're looking for.") |
533 | 250 | conf := ClientSessionConfig{PEM: badpem} | 250 | conf := ClientSessionConfig{PEM: badpem} |
535 | 251 | sess, err := NewSession("", conf, "wah", cs.lvls, cs.log) | 251 | sess, err := newSession("", conf, "wah", cs.lvls, cs.log) |
536 | 252 | c.Check(sess, IsNil) | 252 | c.Check(sess, IsNil) |
537 | 253 | c.Check(err, NotNil) | 253 | c.Check(err, NotNil) |
538 | 254 | } | 254 | } |
539 | 255 | 255 | ||
541 | 256 | func (cs *clientSessionSuite) TestNewSessionBadSeenStateFails(c *C) { | 256 | func (cs *ConcreteSessionSuite) TestnewSessionBadSeenStateFails(c *C) { |
542 | 257 | ferr := func() (seenstate.SeenState, error) { return nil, errors.New("Busted.") } | 257 | ferr := func() (seenstate.SeenState, error) { return nil, errors.New("Busted.") } |
544 | 258 | sess, err := NewSession("", dummyConf, "wah", ferr, cs.log) | 258 | sess, err := newSession("", dummyConf, "wah", ferr, cs.log) |
545 | 259 | c.Check(sess, IsNil) | 259 | c.Check(sess, IsNil) |
546 | 260 | c.Assert(err, NotNil) | 260 | c.Assert(err, NotNil) |
547 | 261 | } | 261 | } |
548 | @@ -264,9 +264,9 @@ | |||
549 | 264 | getHosts() tests | 264 | getHosts() tests |
550 | 265 | ****************************************************************/ | 265 | ****************************************************************/ |
551 | 266 | 266 | ||
553 | 267 | func (cs *clientSessionSuite) TestGetHostsFallback(c *C) { | 267 | func (cs *ConcreteSessionSuite) TestGetHostsFallback(c *C) { |
554 | 268 | fallback := []string{"foo:443", "bar:443"} | 268 | fallback := []string{"foo:443", "bar:443"} |
556 | 269 | sess := &ClientSession{fallbackHosts: fallback} | 269 | sess := &ConcreteSession{fallbackHosts: fallback} |
557 | 270 | err := sess.getHosts() | 270 | err := sess.getHosts() |
558 | 271 | c.Assert(err, IsNil) | 271 | c.Assert(err, IsNil) |
559 | 272 | c.Check(sess.deliveryHosts, DeepEquals, fallback) | 272 | c.Check(sess.deliveryHosts, DeepEquals, fallback) |
560 | @@ -282,16 +282,16 @@ | |||
561 | 282 | return &gethosts.Host{thg.domain, thg.hosts}, thg.err | 282 | return &gethosts.Host{thg.domain, thg.hosts}, thg.err |
562 | 283 | } | 283 | } |
563 | 284 | 284 | ||
565 | 285 | func (cs *clientSessionSuite) TestGetHostsRemote(c *C) { | 285 | func (cs *ConcreteSessionSuite) TestGetHostsRemote(c *C) { |
566 | 286 | hostGetter := &testHostGetter{"example.com", []string{"foo:443", "bar:443"}, nil} | 286 | hostGetter := &testHostGetter{"example.com", []string{"foo:443", "bar:443"}, nil} |
568 | 287 | sess := &ClientSession{getHost: hostGetter, timeSince: time.Since} | 287 | sess := &ConcreteSession{getHost: hostGetter, timeSince: time.Since} |
569 | 288 | err := sess.getHosts() | 288 | err := sess.getHosts() |
570 | 289 | c.Assert(err, IsNil) | 289 | c.Assert(err, IsNil) |
571 | 290 | c.Check(sess.deliveryHosts, DeepEquals, []string{"foo:443", "bar:443"}) | 290 | c.Check(sess.deliveryHosts, DeepEquals, []string{"foo:443", "bar:443"}) |
572 | 291 | } | 291 | } |
573 | 292 | 292 | ||
576 | 293 | func (cs *clientSessionSuite) TestGetHostsRemoteError(c *C) { | 293 | func (cs *ConcreteSessionSuite) TestGetHostsRemoteError(c *C) { |
577 | 294 | sess, err := NewSession("", dummyConf, "", cs.lvls, cs.log) | 294 | sess, err := newSession("", dummyConf, "", cs.lvls, cs.log) |
578 | 295 | c.Assert(err, IsNil) | 295 | c.Assert(err, IsNil) |
579 | 296 | hostsErr := errors.New("failed") | 296 | hostsErr := errors.New("failed") |
580 | 297 | hostGetter := &testHostGetter{"", nil, hostsErr} | 297 | hostGetter := &testHostGetter{"", nil, hostsErr} |
581 | @@ -302,9 +302,9 @@ | |||
582 | 302 | c.Check(sess.State(), Equals, Error) | 302 | c.Check(sess.State(), Equals, Error) |
583 | 303 | } | 303 | } |
584 | 304 | 304 | ||
586 | 305 | func (cs *clientSessionSuite) TestGetHostsRemoteCaching(c *C) { | 305 | func (cs *ConcreteSessionSuite) TestGetHostsRemoteCaching(c *C) { |
587 | 306 | hostGetter := &testHostGetter{"example.com", []string{"foo:443", "bar:443"}, nil} | 306 | hostGetter := &testHostGetter{"example.com", []string{"foo:443", "bar:443"}, nil} |
589 | 307 | sess := &ClientSession{ | 307 | sess := &ConcreteSession{ |
590 | 308 | getHost: hostGetter, | 308 | getHost: hostGetter, |
591 | 309 | ClientSessionConfig: ClientSessionConfig{ | 309 | ClientSessionConfig: ClientSessionConfig{ |
592 | 310 | HostsCachingExpiryTime: 2 * time.Hour, | 310 | HostsCachingExpiryTime: 2 * time.Hour, |
593 | @@ -327,9 +327,9 @@ | |||
594 | 327 | c.Check(sess.deliveryHosts, DeepEquals, []string{"baz:443"}) | 327 | c.Check(sess.deliveryHosts, DeepEquals, []string{"baz:443"}) |
595 | 328 | } | 328 | } |
596 | 329 | 329 | ||
598 | 330 | func (cs *clientSessionSuite) TestGetHostsRemoteCachingReset(c *C) { | 330 | func (cs *ConcreteSessionSuite) TestGetHostsRemoteCachingReset(c *C) { |
599 | 331 | hostGetter := &testHostGetter{"example.com", []string{"foo:443", "bar:443"}, nil} | 331 | hostGetter := &testHostGetter{"example.com", []string{"foo:443", "bar:443"}, nil} |
601 | 332 | sess := &ClientSession{ | 332 | sess := &ConcreteSession{ |
602 | 333 | getHost: hostGetter, | 333 | getHost: hostGetter, |
603 | 334 | ClientSessionConfig: ClientSessionConfig{ | 334 | ClientSessionConfig: ClientSessionConfig{ |
604 | 335 | HostsCachingExpiryTime: 2 * time.Hour, | 335 | HostsCachingExpiryTime: 2 * time.Hour, |
605 | @@ -354,9 +354,9 @@ | |||
606 | 354 | addAuthorization() tests | 354 | addAuthorization() tests |
607 | 355 | ****************************************************************/ | 355 | ****************************************************************/ |
608 | 356 | 356 | ||
610 | 357 | func (cs *clientSessionSuite) TestAddAuthorizationAddsAuthorization(c *C) { | 357 | func (cs *ConcreteSessionSuite) TestAddAuthorizationAddsAuthorization(c *C) { |
611 | 358 | url := "xyzzy://" | 358 | url := "xyzzy://" |
613 | 359 | sess := &ClientSession{Log: cs.log} | 359 | sess := &ConcreteSession{Log: cs.log} |
614 | 360 | sess.AuthGetter = func(url string) string { return url + " auth'ed" } | 360 | sess.AuthGetter = func(url string) string { return url + " auth'ed" } |
615 | 361 | sess.AuthURL = url | 361 | sess.AuthURL = url |
616 | 362 | c.Assert(sess.auth, Equals, "") | 362 | c.Assert(sess.auth, Equals, "") |
617 | @@ -365,8 +365,8 @@ | |||
618 | 365 | c.Check(sess.auth, Equals, "xyzzy:// auth'ed") | 365 | c.Check(sess.auth, Equals, "xyzzy:// auth'ed") |
619 | 366 | } | 366 | } |
620 | 367 | 367 | ||
623 | 368 | func (cs *clientSessionSuite) TestAddAuthorizationSkipsIfUnset(c *C) { | 368 | func (cs *ConcreteSessionSuite) TestAddAuthorizationSkipsIfUnset(c *C) { |
624 | 369 | sess := &ClientSession{Log: cs.log} | 369 | sess := &ConcreteSession{Log: cs.log} |
625 | 370 | sess.AuthGetter = nil | 370 | sess.AuthGetter = nil |
626 | 371 | c.Assert(sess.auth, Equals, "") | 371 | c.Assert(sess.auth, Equals, "") |
627 | 372 | err := sess.addAuthorization() | 372 | err := sess.addAuthorization() |
628 | @@ -378,9 +378,9 @@ | |||
629 | 378 | startConnectionAttempt()/nextHostToTry()/started tests | 378 | startConnectionAttempt()/nextHostToTry()/started tests |
630 | 379 | ****************************************************************/ | 379 | ****************************************************************/ |
631 | 380 | 380 | ||
633 | 381 | func (cs *clientSessionSuite) TestStartConnectionAttempt(c *C) { | 381 | func (cs *ConcreteSessionSuite) TestStartConnectionAttempt(c *C) { |
634 | 382 | since := time.Since(time.Time{}) | 382 | since := time.Since(time.Time{}) |
636 | 383 | sess := &ClientSession{ | 383 | sess := &ConcreteSession{ |
637 | 384 | ClientSessionConfig: ClientSessionConfig{ | 384 | ClientSessionConfig: ClientSessionConfig{ |
638 | 385 | ExpectAllRepairedTime: 10 * time.Second, | 385 | ExpectAllRepairedTime: 10 * time.Second, |
639 | 386 | }, | 386 | }, |
640 | @@ -402,9 +402,9 @@ | |||
641 | 402 | sess.tryHost = 2 | 402 | sess.tryHost = 2 |
642 | 403 | } | 403 | } |
643 | 404 | 404 | ||
645 | 405 | func (cs *clientSessionSuite) TestStartConnectionAttemptNoHostsPanic(c *C) { | 405 | func (cs *ConcreteSessionSuite) TestStartConnectionAttemptNoHostsPanic(c *C) { |
646 | 406 | since := time.Since(time.Time{}) | 406 | since := time.Since(time.Time{}) |
648 | 407 | sess := &ClientSession{ | 407 | sess := &ConcreteSession{ |
649 | 408 | ClientSessionConfig: ClientSessionConfig{ | 408 | ClientSessionConfig: ClientSessionConfig{ |
650 | 409 | ExpectAllRepairedTime: 10 * time.Second, | 409 | ExpectAllRepairedTime: 10 * time.Second, |
651 | 410 | }, | 410 | }, |
652 | @@ -415,8 +415,8 @@ | |||
653 | 415 | c.Check(sess.startConnectionAttempt, PanicMatches, "should have got hosts from config or remote at this point") | 415 | c.Check(sess.startConnectionAttempt, PanicMatches, "should have got hosts from config or remote at this point") |
654 | 416 | } | 416 | } |
655 | 417 | 417 | ||
658 | 418 | func (cs *clientSessionSuite) TestNextHostToTry(c *C) { | 418 | func (cs *ConcreteSessionSuite) TestNextHostToTry(c *C) { |
659 | 419 | sess := &ClientSession{ | 419 | sess := &ConcreteSession{ |
660 | 420 | deliveryHosts: []string{"foo:443", "bar:443", "baz:443"}, | 420 | deliveryHosts: []string{"foo:443", "bar:443", "baz:443"}, |
661 | 421 | tryHost: 0, | 421 | tryHost: 0, |
662 | 422 | leftToTry: 3, | 422 | leftToTry: 3, |
663 | @@ -438,8 +438,8 @@ | |||
664 | 438 | c.Check(sess.tryHost, Equals, 1) | 438 | c.Check(sess.tryHost, Equals, 1) |
665 | 439 | } | 439 | } |
666 | 440 | 440 | ||
669 | 441 | func (cs *clientSessionSuite) TestStarted(c *C) { | 441 | func (cs *ConcreteSessionSuite) TestStarted(c *C) { |
670 | 442 | sess, err := NewSession("", dummyConf, "", cs.lvls, cs.log) | 442 | sess, err := newSession("", dummyConf, "", cs.lvls, cs.log) |
671 | 443 | c.Assert(err, IsNil) | 443 | c.Assert(err, IsNil) |
672 | 444 | 444 | ||
673 | 445 | sess.deliveryHosts = []string{"foo:443", "bar:443", "baz:443"} | 445 | sess.deliveryHosts = []string{"foo:443", "bar:443", "baz:443"} |
674 | @@ -457,8 +457,8 @@ | |||
675 | 457 | connect() tests | 457 | connect() tests |
676 | 458 | ****************************************************************/ | 458 | ****************************************************************/ |
677 | 459 | 459 | ||
680 | 460 | func (cs *clientSessionSuite) TestConnectFailsWithNoAddress(c *C) { | 460 | func (cs *ConcreteSessionSuite) TestConnectFailsWithNoAddress(c *C) { |
681 | 461 | sess, err := NewSession("", dummyConf, "wah", cs.lvls, cs.log) | 461 | sess, err := newSession("", dummyConf, "wah", cs.lvls, cs.log) |
682 | 462 | c.Assert(err, IsNil) | 462 | c.Assert(err, IsNil) |
683 | 463 | sess.deliveryHosts = []string{"nowhere"} | 463 | sess.deliveryHosts = []string{"nowhere"} |
684 | 464 | sess.clearShouldDelay() | 464 | sess.clearShouldDelay() |
685 | @@ -468,11 +468,11 @@ | |||
686 | 468 | c.Check(sess.State(), Equals, Error) | 468 | c.Check(sess.State(), Equals, Error) |
687 | 469 | } | 469 | } |
688 | 470 | 470 | ||
690 | 471 | func (cs *clientSessionSuite) TestConnectConnects(c *C) { | 471 | func (cs *ConcreteSessionSuite) TestConnectConnects(c *C) { |
691 | 472 | srv, err := net.Listen("tcp", "localhost:0") | 472 | srv, err := net.Listen("tcp", "localhost:0") |
692 | 473 | c.Assert(err, IsNil) | 473 | c.Assert(err, IsNil) |
693 | 474 | defer srv.Close() | 474 | defer srv.Close() |
695 | 475 | sess, err := NewSession("", dummyConf, "wah", cs.lvls, cs.log) | 475 | sess, err := newSession("", dummyConf, "wah", cs.lvls, cs.log) |
696 | 476 | c.Assert(err, IsNil) | 476 | c.Assert(err, IsNil) |
697 | 477 | sess.deliveryHosts = []string{srv.Addr().String()} | 477 | sess.deliveryHosts = []string{srv.Addr().String()} |
698 | 478 | sess.clearShouldDelay() | 478 | sess.clearShouldDelay() |
699 | @@ -483,11 +483,11 @@ | |||
700 | 483 | c.Check(sess.State(), Equals, Connected) | 483 | c.Check(sess.State(), Equals, Connected) |
701 | 484 | } | 484 | } |
702 | 485 | 485 | ||
704 | 486 | func (cs *clientSessionSuite) TestConnectSecondConnects(c *C) { | 486 | func (cs *ConcreteSessionSuite) TestConnectSecondConnects(c *C) { |
705 | 487 | srv, err := net.Listen("tcp", "localhost:0") | 487 | srv, err := net.Listen("tcp", "localhost:0") |
706 | 488 | c.Assert(err, IsNil) | 488 | c.Assert(err, IsNil) |
707 | 489 | defer srv.Close() | 489 | defer srv.Close() |
709 | 490 | sess, err := NewSession("", dummyConf, "wah", cs.lvls, cs.log) | 490 | sess, err := newSession("", dummyConf, "wah", cs.lvls, cs.log) |
710 | 491 | c.Assert(err, IsNil) | 491 | c.Assert(err, IsNil) |
711 | 492 | sess.deliveryHosts = []string{"nowhere", srv.Addr().String()} | 492 | sess.deliveryHosts = []string{"nowhere", srv.Addr().String()} |
712 | 493 | sess.clearShouldDelay() | 493 | sess.clearShouldDelay() |
713 | @@ -499,10 +499,10 @@ | |||
714 | 499 | c.Check(sess.tryHost, Equals, 0) | 499 | c.Check(sess.tryHost, Equals, 0) |
715 | 500 | } | 500 | } |
716 | 501 | 501 | ||
718 | 502 | func (cs *clientSessionSuite) TestConnectConnectFail(c *C) { | 502 | func (cs *ConcreteSessionSuite) TestConnectConnectFail(c *C) { |
719 | 503 | srv, err := net.Listen("tcp", "localhost:0") | 503 | srv, err := net.Listen("tcp", "localhost:0") |
720 | 504 | c.Assert(err, IsNil) | 504 | c.Assert(err, IsNil) |
722 | 505 | sess, err := NewSession(srv.Addr().String(), dummyConf, "wah", cs.lvls, cs.log) | 505 | sess, err := newSession(srv.Addr().String(), dummyConf, "wah", cs.lvls, cs.log) |
723 | 506 | srv.Close() | 506 | srv.Close() |
724 | 507 | c.Assert(err, IsNil) | 507 | c.Assert(err, IsNil) |
725 | 508 | sess.deliveryHosts = []string{srv.Addr().String()} | 508 | sess.deliveryHosts = []string{srv.Addr().String()} |
726 | @@ -517,8 +517,8 @@ | |||
727 | 517 | Close() tests | 517 | Close() tests |
728 | 518 | ****************************************************************/ | 518 | ****************************************************************/ |
729 | 519 | 519 | ||
732 | 520 | func (cs *clientSessionSuite) TestClose(c *C) { | 520 | func (cs *ConcreteSessionSuite) TestClose(c *C) { |
733 | 521 | sess, err := NewSession("", dummyConf, "wah", cs.lvls, cs.log) | 521 | sess, err := newSession("", dummyConf, "wah", cs.lvls, cs.log) |
734 | 522 | c.Assert(err, IsNil) | 522 | c.Assert(err, IsNil) |
735 | 523 | sess.Connection = &testConn{Name: "TestClose"} | 523 | sess.Connection = &testConn{Name: "TestClose"} |
736 | 524 | sess.Close() | 524 | sess.Close() |
737 | @@ -526,8 +526,8 @@ | |||
738 | 526 | c.Check(sess.State(), Equals, Disconnected) | 526 | c.Check(sess.State(), Equals, Disconnected) |
739 | 527 | } | 527 | } |
740 | 528 | 528 | ||
743 | 529 | func (cs *clientSessionSuite) TestCloseTwice(c *C) { | 529 | func (cs *ConcreteSessionSuite) TestCloseTwice(c *C) { |
744 | 530 | sess, err := NewSession("", dummyConf, "wah", cs.lvls, cs.log) | 530 | sess, err := newSession("", dummyConf, "wah", cs.lvls, cs.log) |
745 | 531 | c.Assert(err, IsNil) | 531 | c.Assert(err, IsNil) |
746 | 532 | sess.Connection = &testConn{Name: "TestCloseTwice"} | 532 | sess.Connection = &testConn{Name: "TestCloseTwice"} |
747 | 533 | sess.Close() | 533 | sess.Close() |
748 | @@ -537,8 +537,8 @@ | |||
749 | 537 | c.Check(sess.State(), Equals, Disconnected) | 537 | c.Check(sess.State(), Equals, Disconnected) |
750 | 538 | } | 538 | } |
751 | 539 | 539 | ||
754 | 540 | func (cs *clientSessionSuite) TestCloseFails(c *C) { | 540 | func (cs *ConcreteSessionSuite) TestCloseFails(c *C) { |
755 | 541 | sess, err := NewSession("", dummyConf, "wah", cs.lvls, cs.log) | 541 | sess, err := newSession("", dummyConf, "wah", cs.lvls, cs.log) |
756 | 542 | c.Assert(err, IsNil) | 542 | c.Assert(err, IsNil) |
757 | 543 | sess.Connection = &testConn{Name: "TestCloseFails", CloseCondition: condition.Work(false)} | 543 | sess.Connection = &testConn{Name: "TestCloseFails", CloseCondition: condition.Work(false)} |
758 | 544 | sess.Close() | 544 | sess.Close() |
759 | @@ -551,8 +551,8 @@ | |||
760 | 551 | func (*derp) Redial() uint32 { return 0 } | 551 | func (*derp) Redial() uint32 { return 0 } |
761 | 552 | func (d *derp) Stop() { d.stopped = true } | 552 | func (d *derp) Stop() { d.stopped = true } |
762 | 553 | 553 | ||
765 | 554 | func (cs *clientSessionSuite) TestCloseStopsRetrier(c *C) { | 554 | func (cs *ConcreteSessionSuite) TestCloseStopsRetrier(c *C) { |
766 | 555 | sess, err := NewSession("", dummyConf, "wah", cs.lvls, cs.log) | 555 | sess, err := newSession("", dummyConf, "wah", cs.lvls, cs.log) |
767 | 556 | c.Assert(err, IsNil) | 556 | c.Assert(err, IsNil) |
768 | 557 | ar := new(derp) | 557 | ar := new(derp) |
769 | 558 | sess.retrier = ar | 558 | sess.retrier = ar |
770 | @@ -567,9 +567,9 @@ | |||
771 | 567 | AutoRedial() tests | 567 | AutoRedial() tests |
772 | 568 | ****************************************************************/ | 568 | ****************************************************************/ |
773 | 569 | 569 | ||
775 | 570 | func (cs *clientSessionSuite) TestAutoRedialWorks(c *C) { | 570 | func (cs *ConcreteSessionSuite) TestAutoRedialWorks(c *C) { |
776 | 571 | // checks that AutoRedial sets up a retrier and tries redialing it | 571 | // checks that AutoRedial sets up a retrier and tries redialing it |
778 | 572 | sess, err := NewSession("", dummyConf, "wah", cs.lvls, cs.log) | 572 | sess, err := newSession("", dummyConf, "wah", cs.lvls, cs.log) |
779 | 573 | c.Assert(err, IsNil) | 573 | c.Assert(err, IsNil) |
780 | 574 | ar := new(derp) | 574 | ar := new(derp) |
781 | 575 | sess.retrier = ar | 575 | sess.retrier = ar |
782 | @@ -578,9 +578,9 @@ | |||
783 | 578 | c.Check(ar.stopped, Equals, true) | 578 | c.Check(ar.stopped, Equals, true) |
784 | 579 | } | 579 | } |
785 | 580 | 580 | ||
787 | 581 | func (cs *clientSessionSuite) TestAutoRedialStopsRetrier(c *C) { | 581 | func (cs *ConcreteSessionSuite) TestAutoRedialStopsRetrier(c *C) { |
788 | 582 | // checks that AutoRedial stops the previous retrier | 582 | // checks that AutoRedial stops the previous retrier |
790 | 583 | sess, err := NewSession("", dummyConf, "wah", cs.lvls, cs.log) | 583 | sess, err := newSession("", dummyConf, "wah", cs.lvls, cs.log) |
791 | 584 | c.Assert(err, IsNil) | 584 | c.Assert(err, IsNil) |
792 | 585 | ch := make(chan uint32) | 585 | ch := make(chan uint32) |
793 | 586 | c.Check(sess.retrier, IsNil) | 586 | c.Check(sess.retrier, IsNil) |
794 | @@ -590,19 +590,19 @@ | |||
795 | 590 | c.Check(<-ch, Not(Equals), 0) | 590 | c.Check(<-ch, Not(Equals), 0) |
796 | 591 | } | 591 | } |
797 | 592 | 592 | ||
800 | 593 | func (cs *clientSessionSuite) TestAutoRedialCallsRedialDelay(c *C) { | 593 | func (cs *ConcreteSessionSuite) TestAutoRedialCallsRedialDelay(c *C) { |
801 | 594 | sess, err := NewSession("", dummyConf, "wah", cs.lvls, cs.log) | 594 | sess, err := newSession("", dummyConf, "wah", cs.lvls, cs.log) |
802 | 595 | c.Assert(err, IsNil) | 595 | c.Assert(err, IsNil) |
803 | 596 | flag := false | 596 | flag := false |
805 | 597 | sess.redialDelay = func(sess *ClientSession) time.Duration { flag = true; return 0 } | 597 | sess.redialDelay = func(sess *ConcreteSession) time.Duration { flag = true; return 0 } |
806 | 598 | sess.AutoRedial(nil) | 598 | sess.AutoRedial(nil) |
807 | 599 | c.Check(flag, Equals, true) | 599 | c.Check(flag, Equals, true) |
808 | 600 | } | 600 | } |
809 | 601 | 601 | ||
812 | 602 | func (cs *clientSessionSuite) TestAutoRedialSetsRedialDelayIfTooQuick(c *C) { | 602 | func (cs *ConcreteSessionSuite) TestAutoRedialSetsRedialDelayIfTooQuick(c *C) { |
813 | 603 | sess, err := NewSession("", dummyConf, "wah", cs.lvls, cs.log) | 603 | sess, err := newSession("", dummyConf, "wah", cs.lvls, cs.log) |
814 | 604 | c.Assert(err, IsNil) | 604 | c.Assert(err, IsNil) |
816 | 605 | sess.redialDelay = func(sess *ClientSession) time.Duration { return 0 } | 605 | sess.redialDelay = func(sess *ConcreteSession) time.Duration { return 0 } |
817 | 606 | sess.AutoRedial(nil) | 606 | sess.AutoRedial(nil) |
818 | 607 | c.Check(sess.ShouldDelay(), Equals, false) | 607 | c.Check(sess.ShouldDelay(), Equals, false) |
819 | 608 | sess.stopRedial() | 608 | sess.stopRedial() |
820 | @@ -616,7 +616,7 @@ | |||
821 | 616 | ****************************************************************/ | 616 | ****************************************************************/ |
822 | 617 | 617 | ||
823 | 618 | type msgSuite struct { | 618 | type msgSuite struct { |
825 | 619 | sess *ClientSession | 619 | sess *ConcreteSession |
826 | 620 | upCh chan interface{} | 620 | upCh chan interface{} |
827 | 621 | downCh chan interface{} | 621 | downCh chan interface{} |
828 | 622 | errCh chan error | 622 | errCh chan error |
829 | @@ -629,7 +629,7 @@ | |||
830 | 629 | conf := ClientSessionConfig{ | 629 | conf := ClientSessionConfig{ |
831 | 630 | ExchangeTimeout: time.Millisecond, | 630 | ExchangeTimeout: time.Millisecond, |
832 | 631 | } | 631 | } |
834 | 632 | s.sess, err = NewSession("", conf, "wah", seenstate.NewSeenState, helpers.NewTestLogger(c, "debug")) | 632 | s.sess, err = newSession("", conf, "wah", seenstate.NewSeenState, helpers.NewTestLogger(c, "debug")) |
835 | 633 | c.Assert(err, IsNil) | 633 | c.Assert(err, IsNil) |
836 | 634 | s.sess.Connection = &testConn{Name: "TestHandle*"} | 634 | s.sess.Connection = &testConn{Name: "TestHandle*"} |
837 | 635 | s.errCh = make(chan error, 1) | 635 | s.errCh = make(chan error, 1) |
838 | @@ -1167,8 +1167,8 @@ | |||
839 | 1167 | /**************************************************************** | 1167 | /**************************************************************** |
840 | 1168 | start() tests | 1168 | start() tests |
841 | 1169 | ****************************************************************/ | 1169 | ****************************************************************/ |
844 | 1170 | func (cs *clientSessionSuite) TestStartFailsIfSetDeadlineFails(c *C) { | 1170 | func (cs *ConcreteSessionSuite) TestStartFailsIfSetDeadlineFails(c *C) { |
845 | 1171 | sess, err := NewSession("", dummyConf, "wah", cs.lvls, cs.log) | 1171 | sess, err := newSession("", dummyConf, "wah", cs.lvls, cs.log) |
846 | 1172 | c.Assert(err, IsNil) | 1172 | c.Assert(err, IsNil) |
847 | 1173 | sess.Connection = &testConn{Name: "TestStartFailsIfSetDeadlineFails", | 1173 | sess.Connection = &testConn{Name: "TestStartFailsIfSetDeadlineFails", |
848 | 1174 | DeadlineCondition: condition.Work(false)} // setdeadline will fail | 1174 | DeadlineCondition: condition.Work(false)} // setdeadline will fail |
849 | @@ -1177,8 +1177,8 @@ | |||
850 | 1177 | c.Check(sess.State(), Equals, Error) | 1177 | c.Check(sess.State(), Equals, Error) |
851 | 1178 | } | 1178 | } |
852 | 1179 | 1179 | ||
855 | 1180 | func (cs *clientSessionSuite) TestStartFailsIfWriteFails(c *C) { | 1180 | func (cs *ConcreteSessionSuite) TestStartFailsIfWriteFails(c *C) { |
856 | 1181 | sess, err := NewSession("", dummyConf, "wah", cs.lvls, cs.log) | 1181 | sess, err := newSession("", dummyConf, "wah", cs.lvls, cs.log) |
857 | 1182 | c.Assert(err, IsNil) | 1182 | c.Assert(err, IsNil) |
858 | 1183 | sess.Connection = &testConn{Name: "TestStartFailsIfWriteFails", | 1183 | sess.Connection = &testConn{Name: "TestStartFailsIfWriteFails", |
859 | 1184 | WriteCondition: condition.Work(false)} // write will fail | 1184 | WriteCondition: condition.Work(false)} // write will fail |
860 | @@ -1187,8 +1187,8 @@ | |||
861 | 1187 | c.Check(sess.State(), Equals, Error) | 1187 | c.Check(sess.State(), Equals, Error) |
862 | 1188 | } | 1188 | } |
863 | 1189 | 1189 | ||
866 | 1190 | func (cs *clientSessionSuite) TestStartFailsIfGetLevelsFails(c *C) { | 1190 | func (cs *ConcreteSessionSuite) TestStartFailsIfGetLevelsFails(c *C) { |
867 | 1191 | sess, err := NewSession("", dummyConf, "wah", cs.lvls, cs.log) | 1191 | sess, err := newSession("", dummyConf, "wah", cs.lvls, cs.log) |
868 | 1192 | c.Assert(err, IsNil) | 1192 | c.Assert(err, IsNil) |
869 | 1193 | sess.SeenState = &brokenSeenState{} | 1193 | sess.SeenState = &brokenSeenState{} |
870 | 1194 | sess.Connection = &testConn{Name: "TestStartConnectMessageFails"} | 1194 | sess.Connection = &testConn{Name: "TestStartConnectMessageFails"} |
871 | @@ -1207,8 +1207,8 @@ | |||
872 | 1207 | c.Check(err, ErrorMatches, "broken.") | 1207 | c.Check(err, ErrorMatches, "broken.") |
873 | 1208 | } | 1208 | } |
874 | 1209 | 1209 | ||
877 | 1210 | func (cs *clientSessionSuite) TestStartConnectMessageFails(c *C) { | 1210 | func (cs *ConcreteSessionSuite) TestStartConnectMessageFails(c *C) { |
878 | 1211 | sess, err := NewSession("", dummyConf, "wah", cs.lvls, cs.log) | 1211 | sess, err := newSession("", dummyConf, "wah", cs.lvls, cs.log) |
879 | 1212 | c.Assert(err, IsNil) | 1212 | c.Assert(err, IsNil) |
880 | 1213 | sess.Connection = &testConn{Name: "TestStartConnectMessageFails"} | 1213 | sess.Connection = &testConn{Name: "TestStartConnectMessageFails"} |
881 | 1214 | errCh := make(chan error, 1) | 1214 | errCh := make(chan error, 1) |
882 | @@ -1234,8 +1234,8 @@ | |||
883 | 1234 | c.Check(sess.State(), Equals, Error) | 1234 | c.Check(sess.State(), Equals, Error) |
884 | 1235 | } | 1235 | } |
885 | 1236 | 1236 | ||
888 | 1237 | func (cs *clientSessionSuite) TestStartConnackReadError(c *C) { | 1237 | func (cs *ConcreteSessionSuite) TestStartConnackReadError(c *C) { |
889 | 1238 | sess, err := NewSession("", dummyConf, "wah", cs.lvls, cs.log) | 1238 | sess, err := newSession("", dummyConf, "wah", cs.lvls, cs.log) |
890 | 1239 | c.Assert(err, IsNil) | 1239 | c.Assert(err, IsNil) |
891 | 1240 | sess.Connection = &testConn{Name: "TestStartConnackReadError"} | 1240 | sess.Connection = &testConn{Name: "TestStartConnackReadError"} |
892 | 1241 | errCh := make(chan error, 1) | 1241 | errCh := make(chan error, 1) |
893 | @@ -1258,8 +1258,8 @@ | |||
894 | 1258 | c.Check(sess.State(), Equals, Error) | 1258 | c.Check(sess.State(), Equals, Error) |
895 | 1259 | } | 1259 | } |
896 | 1260 | 1260 | ||
899 | 1261 | func (cs *clientSessionSuite) TestStartBadConnack(c *C) { | 1261 | func (cs *ConcreteSessionSuite) TestStartBadConnack(c *C) { |
900 | 1262 | sess, err := NewSession("", dummyConf, "wah", cs.lvls, cs.log) | 1262 | sess, err := newSession("", dummyConf, "wah", cs.lvls, cs.log) |
901 | 1263 | c.Assert(err, IsNil) | 1263 | c.Assert(err, IsNil) |
902 | 1264 | sess.Connection = &testConn{Name: "TestStartBadConnack"} | 1264 | sess.Connection = &testConn{Name: "TestStartBadConnack"} |
903 | 1265 | errCh := make(chan error, 1) | 1265 | errCh := make(chan error, 1) |
904 | @@ -1282,8 +1282,8 @@ | |||
905 | 1282 | c.Check(sess.State(), Equals, Error) | 1282 | c.Check(sess.State(), Equals, Error) |
906 | 1283 | } | 1283 | } |
907 | 1284 | 1284 | ||
910 | 1285 | func (cs *clientSessionSuite) TestStartNotConnack(c *C) { | 1285 | func (cs *ConcreteSessionSuite) TestStartNotConnack(c *C) { |
911 | 1286 | sess, err := NewSession("", dummyConf, "wah", cs.lvls, cs.log) | 1286 | sess, err := newSession("", dummyConf, "wah", cs.lvls, cs.log) |
912 | 1287 | c.Assert(err, IsNil) | 1287 | c.Assert(err, IsNil) |
913 | 1288 | sess.Connection = &testConn{Name: "TestStartBadConnack"} | 1288 | sess.Connection = &testConn{Name: "TestStartBadConnack"} |
914 | 1289 | errCh := make(chan error, 1) | 1289 | errCh := make(chan error, 1) |
915 | @@ -1306,7 +1306,7 @@ | |||
916 | 1306 | c.Check(sess.State(), Equals, Error) | 1306 | c.Check(sess.State(), Equals, Error) |
917 | 1307 | } | 1307 | } |
918 | 1308 | 1308 | ||
920 | 1309 | func (cs *clientSessionSuite) TestStartWorks(c *C) { | 1309 | func (cs *ConcreteSessionSuite) TestStartWorks(c *C) { |
921 | 1310 | info := map[string]interface{}{ | 1310 | info := map[string]interface{}{ |
922 | 1311 | "foo": 1, | 1311 | "foo": 1, |
923 | 1312 | "bar": "baz", | 1312 | "bar": "baz", |
924 | @@ -1314,7 +1314,7 @@ | |||
925 | 1314 | conf := ClientSessionConfig{ | 1314 | conf := ClientSessionConfig{ |
926 | 1315 | Info: info, | 1315 | Info: info, |
927 | 1316 | } | 1316 | } |
929 | 1317 | sess, err := NewSession("", conf, "wah", cs.lvls, cs.log) | 1317 | sess, err := newSession("", conf, "wah", cs.lvls, cs.log) |
930 | 1318 | c.Assert(err, IsNil) | 1318 | c.Assert(err, IsNil) |
931 | 1319 | sess.Connection = &testConn{Name: "TestStartWorks"} | 1319 | sess.Connection = &testConn{Name: "TestStartWorks"} |
932 | 1320 | sess.setCookie("COOKIE") | 1320 | sess.setCookie("COOKIE") |
933 | @@ -1350,8 +1350,8 @@ | |||
934 | 1350 | run() tests | 1350 | run() tests |
935 | 1351 | ****************************************************************/ | 1351 | ****************************************************************/ |
936 | 1352 | 1352 | ||
939 | 1353 | func (cs *clientSessionSuite) TestRunBailsIfAuthCheckFails(c *C) { | 1353 | func (cs *ConcreteSessionSuite) TestRunBailsIfAuthCheckFails(c *C) { |
940 | 1354 | sess, err := NewSession("", dummyConf, "wah", cs.lvls, cs.log) | 1354 | sess, err := newSession("", dummyConf, "wah", cs.lvls, cs.log) |
941 | 1355 | c.Assert(err, IsNil) | 1355 | c.Assert(err, IsNil) |
942 | 1356 | failure := errors.New("TestRunBailsIfAuthCheckFails") | 1356 | failure := errors.New("TestRunBailsIfAuthCheckFails") |
943 | 1357 | has_closed := false | 1357 | has_closed := false |
944 | @@ -1366,8 +1366,8 @@ | |||
945 | 1366 | c.Check(has_closed, Equals, true) | 1366 | c.Check(has_closed, Equals, true) |
946 | 1367 | } | 1367 | } |
947 | 1368 | 1368 | ||
950 | 1369 | func (cs *clientSessionSuite) TestRunBailsIfHostGetterFails(c *C) { | 1369 | func (cs *ConcreteSessionSuite) TestRunBailsIfHostGetterFails(c *C) { |
951 | 1370 | sess, err := NewSession("", dummyConf, "wah", cs.lvls, cs.log) | 1370 | sess, err := newSession("", dummyConf, "wah", cs.lvls, cs.log) |
952 | 1371 | c.Assert(err, IsNil) | 1371 | c.Assert(err, IsNil) |
953 | 1372 | failure := errors.New("TestRunBailsIfHostGetterFails") | 1372 | failure := errors.New("TestRunBailsIfHostGetterFails") |
954 | 1373 | has_closed := false | 1373 | has_closed := false |
955 | @@ -1382,8 +1382,8 @@ | |||
956 | 1382 | c.Check(has_closed, Equals, true) | 1382 | c.Check(has_closed, Equals, true) |
957 | 1383 | } | 1383 | } |
958 | 1384 | 1384 | ||
961 | 1385 | func (cs *clientSessionSuite) TestRunBailsIfConnectFails(c *C) { | 1385 | func (cs *ConcreteSessionSuite) TestRunBailsIfConnectFails(c *C) { |
962 | 1386 | sess, err := NewSession("", dummyConf, "wah", cs.lvls, cs.log) | 1386 | sess, err := newSession("", dummyConf, "wah", cs.lvls, cs.log) |
963 | 1387 | c.Assert(err, IsNil) | 1387 | c.Assert(err, IsNil) |
964 | 1388 | failure := errors.New("TestRunBailsIfConnectFails") | 1388 | failure := errors.New("TestRunBailsIfConnectFails") |
965 | 1389 | err = sess.run( | 1389 | err = sess.run( |
966 | @@ -1396,8 +1396,8 @@ | |||
967 | 1396 | c.Check(err, Equals, failure) | 1396 | c.Check(err, Equals, failure) |
968 | 1397 | } | 1397 | } |
969 | 1398 | 1398 | ||
972 | 1399 | func (cs *clientSessionSuite) TestRunBailsIfStartFails(c *C) { | 1399 | func (cs *ConcreteSessionSuite) TestRunBailsIfStartFails(c *C) { |
973 | 1400 | sess, err := NewSession("", dummyConf, "wah", cs.lvls, cs.log) | 1400 | sess, err := newSession("", dummyConf, "wah", cs.lvls, cs.log) |
974 | 1401 | c.Assert(err, IsNil) | 1401 | c.Assert(err, IsNil) |
975 | 1402 | failure := errors.New("TestRunBailsIfStartFails") | 1402 | failure := errors.New("TestRunBailsIfStartFails") |
976 | 1403 | err = sess.run( | 1403 | err = sess.run( |
977 | @@ -1410,8 +1410,8 @@ | |||
978 | 1410 | c.Check(err, Equals, failure) | 1410 | c.Check(err, Equals, failure) |
979 | 1411 | } | 1411 | } |
980 | 1412 | 1412 | ||
983 | 1413 | func (cs *clientSessionSuite) TestRunRunsEvenIfLoopFails(c *C) { | 1413 | func (cs *ConcreteSessionSuite) TestRunRunsEvenIfLoopFails(c *C) { |
984 | 1414 | sess, err := NewSession("", dummyConf, "wah", cs.lvls, cs.log) | 1414 | sess, err := newSession("", dummyConf, "wah", cs.lvls, cs.log) |
985 | 1415 | c.Assert(err, IsNil) | 1415 | c.Assert(err, IsNil) |
986 | 1416 | // just to make a point: until here we haven't set ErrCh & BroadcastCh (no | 1416 | // just to make a point: until here we haven't set ErrCh & BroadcastCh (no |
987 | 1417 | // biggie if this stops being true) | 1417 | // biggie if this stops being true) |
988 | @@ -1441,8 +1441,8 @@ | |||
989 | 1441 | Jitter() tests | 1441 | Jitter() tests |
990 | 1442 | ****************************************************************/ | 1442 | ****************************************************************/ |
991 | 1443 | 1443 | ||
994 | 1444 | func (cs *clientSessionSuite) TestJitter(c *C) { | 1444 | func (cs *ConcreteSessionSuite) TestJitter(c *C) { |
995 | 1445 | sess, err := NewSession("", dummyConf, "wah", cs.lvls, cs.log) | 1445 | sess, err := newSession("", dummyConf, "wah", cs.lvls, cs.log) |
996 | 1446 | c.Assert(err, IsNil) | 1446 | c.Assert(err, IsNil) |
997 | 1447 | num_tries := 20 // should do the math | 1447 | num_tries := 20 // should do the math |
998 | 1448 | spread := time.Second // | 1448 | spread := time.Second // |
999 | @@ -1472,9 +1472,9 @@ | |||
1000 | 1472 | Dial() tests | 1472 | Dial() tests |
1001 | 1473 | ****************************************************************/ | 1473 | ****************************************************************/ |
1002 | 1474 | 1474 | ||
1004 | 1475 | func (cs *clientSessionSuite) TestDialPanics(c *C) { | 1475 | func (cs *ConcreteSessionSuite) TestDialPanics(c *C) { |
1005 | 1476 | // one last unhappy test | 1476 | // one last unhappy test |
1007 | 1477 | sess, err := NewSession("", dummyConf, "wah", cs.lvls, cs.log) | 1477 | sess, err := newSession("", dummyConf, "wah", cs.lvls, cs.log) |
1008 | 1478 | c.Assert(err, IsNil) | 1478 | c.Assert(err, IsNil) |
1009 | 1479 | sess.Protocolator = nil | 1479 | sess.Protocolator = nil |
1010 | 1480 | c.Check(sess.Dial, PanicMatches, ".*protocol constructor.") | 1480 | c.Check(sess.Dial, PanicMatches, ".*protocol constructor.") |
1011 | @@ -1488,7 +1488,7 @@ | |||
1012 | 1488 | } | 1488 | } |
1013 | 1489 | ) | 1489 | ) |
1014 | 1490 | 1490 | ||
1016 | 1491 | func (cs *clientSessionSuite) TestDialBadServerName(c *C) { | 1491 | func (cs *ConcreteSessionSuite) TestDialBadServerName(c *C) { |
1017 | 1492 | // a borked server name | 1492 | // a borked server name |
1018 | 1493 | lst, err := tls.Listen("tcp", "localhost:0", helpers.TestTLSServerConfig) | 1493 | lst, err := tls.Listen("tcp", "localhost:0", helpers.TestTLSServerConfig) |
1019 | 1494 | c.Assert(err, IsNil) | 1494 | c.Assert(err, IsNil) |
1020 | @@ -1506,7 +1506,7 @@ | |||
1021 | 1506 | })) | 1506 | })) |
1022 | 1507 | defer ts.Close() | 1507 | defer ts.Close() |
1023 | 1508 | 1508 | ||
1025 | 1509 | sess, err := NewSession(ts.URL, dialTestConf, "wah", cs.lvls, cs.log) | 1509 | sess, err := newSession(ts.URL, dialTestConf, "wah", cs.lvls, cs.log) |
1026 | 1510 | c.Assert(err, IsNil) | 1510 | c.Assert(err, IsNil) |
1027 | 1511 | tconn := &testConn{} | 1511 | tconn := &testConn{} |
1028 | 1512 | sess.Connection = tconn | 1512 | sess.Connection = tconn |
1029 | @@ -1533,7 +1533,7 @@ | |||
1030 | 1533 | c.Check(sess.State(), Equals, Error) | 1533 | c.Check(sess.State(), Equals, Error) |
1031 | 1534 | } | 1534 | } |
1032 | 1535 | 1535 | ||
1034 | 1536 | func (cs *clientSessionSuite) TestDialWorks(c *C) { | 1536 | func (cs *ConcreteSessionSuite) TestDialWorks(c *C) { |
1035 | 1537 | // happy path thoughts | 1537 | // happy path thoughts |
1036 | 1538 | lst, err := tls.Listen("tcp", "localhost:0", helpers.TestTLSServerConfig) | 1538 | lst, err := tls.Listen("tcp", "localhost:0", helpers.TestTLSServerConfig) |
1037 | 1539 | c.Assert(err, IsNil) | 1539 | c.Assert(err, IsNil) |
1038 | @@ -1551,7 +1551,7 @@ | |||
1039 | 1551 | })) | 1551 | })) |
1040 | 1552 | defer ts.Close() | 1552 | defer ts.Close() |
1041 | 1553 | 1553 | ||
1043 | 1554 | sess, err := NewSession(ts.URL, dialTestConf, "wah", cs.lvls, cs.log) | 1554 | sess, err := newSession(ts.URL, dialTestConf, "wah", cs.lvls, cs.log) |
1044 | 1555 | c.Assert(err, IsNil) | 1555 | c.Assert(err, IsNil) |
1045 | 1556 | tconn := &testConn{CloseCondition: condition.Fail2Work(10)} | 1556 | tconn := &testConn{CloseCondition: condition.Fail2Work(10)} |
1046 | 1557 | sess.Connection = tconn | 1557 | sess.Connection = tconn |
1047 | @@ -1634,11 +1634,11 @@ | |||
1048 | 1634 | c.Check(<-sess.ErrCh, Equals, failure) | 1634 | c.Check(<-sess.ErrCh, Equals, failure) |
1049 | 1635 | } | 1635 | } |
1050 | 1636 | 1636 | ||
1052 | 1637 | func (cs *clientSessionSuite) TestDialWorksDirect(c *C) { | 1637 | func (cs *ConcreteSessionSuite) TestDialWorksDirect(c *C) { |
1053 | 1638 | // happy path thoughts | 1638 | // happy path thoughts |
1054 | 1639 | lst, err := tls.Listen("tcp", "localhost:0", helpers.TestTLSServerConfig) | 1639 | lst, err := tls.Listen("tcp", "localhost:0", helpers.TestTLSServerConfig) |
1055 | 1640 | c.Assert(err, IsNil) | 1640 | c.Assert(err, IsNil) |
1057 | 1641 | sess, err := NewSession(lst.Addr().String(), dialTestConf, "wah", cs.lvls, cs.log) | 1641 | sess, err := newSession(lst.Addr().String(), dialTestConf, "wah", cs.lvls, cs.log) |
1058 | 1642 | c.Assert(err, IsNil) | 1642 | c.Assert(err, IsNil) |
1059 | 1643 | defer sess.Close() | 1643 | defer sess.Close() |
1060 | 1644 | 1644 | ||
1061 | @@ -1658,8 +1658,8 @@ | |||
1062 | 1658 | redialDelay() tests | 1658 | redialDelay() tests |
1063 | 1659 | ****************************************************************/ | 1659 | ****************************************************************/ |
1064 | 1660 | 1660 | ||
1067 | 1661 | func (cs *clientSessionSuite) TestShouldDelay(c *C) { | 1661 | func (cs *ConcreteSessionSuite) TestShouldDelay(c *C) { |
1068 | 1662 | sess, err := NewSession("foo:443", dummyConf, "", cs.lvls, cs.log) | 1662 | sess, err := newSession("foo:443", dummyConf, "", cs.lvls, cs.log) |
1069 | 1663 | c.Assert(err, IsNil) | 1663 | c.Assert(err, IsNil) |
1070 | 1664 | c.Check(sess.ShouldDelay(), Equals, false) | 1664 | c.Check(sess.ShouldDelay(), Equals, false) |
1071 | 1665 | sess.setShouldDelay() | 1665 | sess.setShouldDelay() |
1072 | @@ -1668,8 +1668,8 @@ | |||
1073 | 1668 | c.Check(sess.ShouldDelay(), Equals, false) | 1668 | c.Check(sess.ShouldDelay(), Equals, false) |
1074 | 1669 | } | 1669 | } |
1075 | 1670 | 1670 | ||
1078 | 1671 | func (cs *clientSessionSuite) TestRedialDelay(c *C) { | 1671 | func (cs *ConcreteSessionSuite) TestRedialDelay(c *C) { |
1079 | 1672 | sess, err := NewSession("foo:443", dummyConf, "", cs.lvls, cs.log) | 1672 | sess, err := newSession("foo:443", dummyConf, "", cs.lvls, cs.log) |
1080 | 1673 | c.Assert(err, IsNil) | 1673 | c.Assert(err, IsNil) |
1081 | 1674 | sess.redialDelays = []time.Duration{17, 42} | 1674 | sess.redialDelays = []time.Duration{17, 42} |
1082 | 1675 | n := 0 | 1675 | n := 0 |
1083 | @@ -1693,8 +1693,8 @@ | |||
1084 | 1693 | ClearCookie() tests | 1693 | ClearCookie() tests |
1085 | 1694 | ****************************************************************/ | 1694 | ****************************************************************/ |
1086 | 1695 | 1695 | ||
1089 | 1696 | func (cs *clientSessionSuite) TestClearCookie(c *C) { | 1696 | func (cs *ConcreteSessionSuite) TestClearCookie(c *C) { |
1090 | 1697 | sess, err := NewSession("foo:443", dummyConf, "", cs.lvls, cs.log) | 1697 | sess, err := newSession("foo:443", dummyConf, "", cs.lvls, cs.log) |
1091 | 1698 | c.Assert(err, IsNil) | 1698 | c.Assert(err, IsNil) |
1092 | 1699 | c.Check(sess.getCookie(), Equals, "") | 1699 | c.Check(sess.getCookie(), Equals, "") |
1093 | 1700 | sess.setCookie("COOKIE") | 1700 | sess.setCookie("COOKIE") |