Merge lp:~chipaca/ubuntu-push/session-refactor-001 into lp:ubuntu-push/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
Reviewer Review Type Date Requested Status
Ubuntu Push Hackers Pending
Review via email: mp+249493@code.launchpad.net
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
=== modified file 'client/client.go'
--- client/client.go 2015-01-26 21:00:27 +0000
+++ client/client.go 2015-02-12 14:33:25 +0000
@@ -116,7 +116,7 @@
116 systemImageInfo *systemimage.InfoResult116 systemImageInfo *systemimage.InfoResult
117 connCh chan bool117 connCh chan bool
118 hasConnectivity bool118 hasConnectivity bool
119 session *session.ClientSession119 session session.ClientSession
120 sessionConnectedCh chan uint32120 sessionConnectedCh chan uint32
121 pushService PushService121 pushService PushService
122 postalService PostalService122 postalService PostalService
@@ -483,11 +483,11 @@
483 accountshandler()483 accountshandler()
484 case state := <-client.connCh:484 case state := <-client.connCh:
485 connhandler(state)485 connhandler(state)
486 case bcast := <-client.session.BroadcastCh:486 case bcast := <-client.session.GetBroadcastCh():
487 bcasthandler(bcast)487 bcasthandler(bcast)
488 case aucast := <-client.session.NotificationsCh:488 case aucast := <-client.session.GetNotificationsCh():
489 ucasthandler(aucast)489 ucasthandler(aucast)
490 case err := <-client.session.ErrCh:490 case err := <-client.session.GetErrCh():
491 errhandler(err)491 errhandler(err)
492 case count := <-client.sessionConnectedCh:492 case count := <-client.sessionConnectedCh:
493 client.log.Debugf("session connected after %d attempts", count)493 client.log.Debugf("session connected after %d attempts", count)
494494
=== modified file 'client/client_test.go'
--- client/client_test.go 2015-02-06 13:09:16 +0000
+++ client/client_test.go 2015-02-12 14:33:25 +0000
@@ -528,7 +528,7 @@
528func (cs *clientSuite) TestDerivePollerSetup(c *C) {528func (cs *clientSuite) TestDerivePollerSetup(c *C) {
529 cs.writeTestConfig(map[string]interface{}{})529 cs.writeTestConfig(map[string]interface{}{})
530 cli := NewPushClient(cs.configPath, cs.leveldbPath)530 cli := NewPushClient(cs.configPath, cs.leveldbPath)
531 cli.session = new(session.ClientSession)531 cli.session = new(session.ConcreteSession)
532 err := cli.configure()532 err := cli.configure()
533 c.Assert(err, IsNil)533 c.Assert(err, IsNil)
534 expected := &poller.PollerSetup{534 expected := &poller.PollerSetup{
@@ -1031,8 +1031,9 @@
1031 cli.log = cs.log1031 cli.log = cs.log
1032 cli.systemImageInfo = siInfoRes1032 cli.systemImageInfo = siInfoRes
1033 c.Assert(cli.initSessionAndPoller(), IsNil)1033 c.Assert(cli.initSessionAndPoller(), IsNil)
1034 cli.session.BroadcastCh = make(chan *session.BroadcastNotification, 1)1034 bcastCh := make(chan *session.BroadcastNotification, 1)
1035 cli.session.BroadcastCh <- &session.BroadcastNotification{}1035 cli.session.SetChForTesting(bcastCh, nil, nil)
1036 bcastCh <- &session.BroadcastNotification{}
10361037
1037 ch := make(chan bool, 1)1038 ch := make(chan bool, 1)
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)
@@ -1044,8 +1045,9 @@
1044 cli.log = cs.log1045 cli.log = cs.log
1045 cli.systemImageInfo = siInfoRes1046 cli.systemImageInfo = siInfoRes
1046 c.Assert(cli.initSessionAndPoller(), IsNil)1047 c.Assert(cli.initSessionAndPoller(), IsNil)
1047 cli.session.NotificationsCh = make(chan session.AddressedNotification, 1)1048 notifCh := make(chan session.AddressedNotification, 1)
1048 cli.session.NotificationsCh <- session.AddressedNotification{}1049 cli.session.SetChForTesting(nil, notifCh, nil)
1050 notifCh <- session.AddressedNotification{}
10491051
1050 ch := make(chan bool, 1)1052 ch := make(chan bool, 1)
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)
@@ -1057,8 +1059,9 @@
1057 cli.log = cs.log1059 cli.log = cs.log
1058 cli.systemImageInfo = siInfoRes1060 cli.systemImageInfo = siInfoRes
1059 c.Assert(cli.initSessionAndPoller(), IsNil)1061 c.Assert(cli.initSessionAndPoller(), IsNil)
1060 cli.session.ErrCh = make(chan error, 1)1062 errCh := make(chan error, 1)
1061 cli.session.ErrCh <- nil1063 cli.session.SetChForTesting(nil, nil, errCh)
1064 errCh <- nil
10621065
1063 ch := make(chan bool, 1)1066 ch := make(chan bool, 1)
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)
@@ -1137,8 +1140,9 @@
11371140
1138 c.Assert(cli.initSessionAndPoller(), IsNil)1141 c.Assert(cli.initSessionAndPoller(), IsNil)
11391142
1140 cli.session.BroadcastCh = make(chan *session.BroadcastNotification)1143 bcastCh := make(chan *session.BroadcastNotification)
1141 cli.session.ErrCh = make(chan error)1144 errCh := make(chan error)
1145 cli.session.SetChForTesting(bcastCh, nil, errCh)
11421146
1143 // we use tick() to make sure things have been through the1147 // we use tick() to make sure things have been through the
1144 // event loop at least once before looking at things;1148 // event loop at least once before looking at things;
@@ -1165,12 +1169,12 @@
11651169
1166 // * session.BroadcastCh to the notifications handler1170 // * session.BroadcastCh to the notifications handler
1167 c.Check(d.bcastCount, Equals, 0)1171 c.Check(d.bcastCount, Equals, 0)
1168 cli.session.BroadcastCh <- positiveBroadcastNotification1172 bcastCh <- positiveBroadcastNotification
1169 tick()1173 tick()
1170 c.Check(d.bcastCount, Equals, 1)1174 c.Check(d.bcastCount, Equals, 1)
11711175
1172 // * session.ErrCh to the error handler1176 // * session.ErrCh to the error handler
1173 cli.session.ErrCh <- nil1177 errCh <- nil
1174 tick()1178 tick()
1175 c.Check(cs.log.Captured(), Matches, "(?ms).*session exited.*")1179 c.Check(cs.log.Captured(), Matches, "(?ms).*session exited.*")
1176}1180}
11771181
=== modified file 'client/session/session.go'
--- client/session/session.go 2015-01-22 11:05:37 +0000
+++ client/session/session.go 2015-02-12 14:33:25 +0000
@@ -120,8 +120,20 @@
120 AddresseeChecker AddresseeChecking120 AddresseeChecker AddresseeChecking
121}121}
122122
123// ClientSession holds a client<->server session and its configuration.123type ClientSession interface {
124type ClientSession struct {124 State() ClientSessionState
125 Close()
126 AutoRedial(done chan uint32)
127 ClearCookie()
128 Dial() error
129 GetBroadcastCh() chan *BroadcastNotification
130 GetNotificationsCh() chan AddressedNotification
131 GetErrCh() chan error
132 SetChForTesting(chan *BroadcastNotification, chan AddressedNotification, chan error)
133}
134
135// ConcreteSession holds a client<->server session and its configuration.
136type ConcreteSession struct {
125 // configuration137 // configuration
126 DeviceId string138 DeviceId string
127 ClientSessionConfig139 ClientSessionConfig
@@ -157,13 +169,13 @@
157 // autoredial knobs169 // autoredial knobs
158 shouldDelayP *uint32170 shouldDelayP *uint32
159 lastAutoRedial time.Time171 lastAutoRedial time.Time
160 redialDelay func(*ClientSession) time.Duration172 redialDelay func(*ConcreteSession) time.Duration
161 redialJitter func(time.Duration) time.Duration173 redialJitter func(time.Duration) time.Duration
162 redialDelays []time.Duration174 redialDelays []time.Duration
163 redialDelaysIdx int175 redialDelaysIdx int
164}176}
165177
166func redialDelay(sess *ClientSession) time.Duration {178func redialDelay(sess *ConcreteSession) time.Duration {
167 if sess.ShouldDelay() {179 if sess.ShouldDelay() {
168 t := sess.redialDelays[sess.redialDelaysIdx]180 t := sess.redialDelays[sess.redialDelaysIdx]
169 if len(sess.redialDelays) > sess.redialDelaysIdx+1 {181 if len(sess.redialDelays) > sess.redialDelaysIdx+1 {
@@ -178,7 +190,13 @@
178190
179func NewSession(serverAddrSpec string, conf ClientSessionConfig,191func NewSession(serverAddrSpec string, conf ClientSessionConfig,
180 deviceId string, seenStateFactory func() (seenstate.SeenState, error),192 deviceId string, seenStateFactory func() (seenstate.SeenState, error),
181 log logger.Logger) (*ClientSession, error) {193 log logger.Logger) (ClientSession, error) {
194 return newSession(serverAddrSpec, conf, deviceId, seenStateFactory, log)
195}
196
197func newSession(serverAddrSpec string, conf ClientSessionConfig,
198 deviceId string, seenStateFactory func() (seenstate.SeenState, error),
199 log logger.Logger) (*ConcreteSession, error) {
182 state := uint32(Disconnected)200 state := uint32(Disconnected)
183 seenState, err := seenStateFactory()201 seenState, err := seenStateFactory()
184 if err != nil {202 if err != nil {
@@ -191,7 +209,7 @@
191 getHost = gethosts.New(deviceId, hostsEndpoint, conf.ExchangeTimeout)209 getHost = gethosts.New(deviceId, hostsEndpoint, conf.ExchangeTimeout)
192 }210 }
193 var shouldDelay uint32 = 0211 var shouldDelay uint32 = 0
194 sess := &ClientSession{212 sess := &ConcreteSession{
195 ClientSessionConfig: conf,213 ClientSessionConfig: conf,
196 getHost: getHost,214 getHost: getHost,
197 fallbackHosts: fallbackHosts,215 fallbackHosts: fallbackHosts,
@@ -218,59 +236,83 @@
218 return sess, nil236 return sess, nil
219}237}
220238
221func (sess *ClientSession) ShouldDelay() bool {239func (sess *ConcreteSession) GetBroadcastCh() chan *BroadcastNotification {
240 return sess.BroadcastCh
241}
242func (sess *ConcreteSession) GetNotificationsCh() chan AddressedNotification {
243 return sess.NotificationsCh
244}
245func (sess *ConcreteSession) GetErrCh() chan error {
246 return sess.ErrCh
247}
248func (sess *ConcreteSession) SetChForTesting(bch chan *BroadcastNotification, nch chan AddressedNotification, ech chan error) {
249 // abusing connLock a bit
250 sess.connLock.Lock()
251 defer sess.connLock.Unlock()
252 if bch != nil {
253 sess.BroadcastCh = bch
254 }
255 if nch != nil {
256 sess.NotificationsCh = nch
257 }
258 if ech != nil {
259 sess.ErrCh = ech
260 }
261}
262
263func (sess *ConcreteSession) ShouldDelay() bool {
222 return atomic.LoadUint32(sess.shouldDelayP) != 0264 return atomic.LoadUint32(sess.shouldDelayP) != 0
223}265}
224266
225func (sess *ClientSession) setShouldDelay() {267func (sess *ConcreteSession) setShouldDelay() {
226 atomic.StoreUint32(sess.shouldDelayP, uint32(1))268 atomic.StoreUint32(sess.shouldDelayP, uint32(1))
227}269}
228270
229func (sess *ClientSession) clearShouldDelay() {271func (sess *ConcreteSession) clearShouldDelay() {
230 atomic.StoreUint32(sess.shouldDelayP, uint32(0))272 atomic.StoreUint32(sess.shouldDelayP, uint32(0))
231}273}
232274
233func (sess *ClientSession) State() ClientSessionState {275func (sess *ConcreteSession) State() ClientSessionState {
234 return ClientSessionState(atomic.LoadUint32(sess.stateP))276 return ClientSessionState(atomic.LoadUint32(sess.stateP))
235}277}
236278
237func (sess *ClientSession) setState(state ClientSessionState) {279func (sess *ConcreteSession) setState(state ClientSessionState) {
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)
239 atomic.StoreUint32(sess.stateP, uint32(state))281 atomic.StoreUint32(sess.stateP, uint32(state))
240}282}
241283
242func (sess *ClientSession) setConnection(conn net.Conn) {284func (sess *ConcreteSession) setConnection(conn net.Conn) {
243 sess.connLock.Lock()285 sess.connLock.Lock()
244 defer sess.connLock.Unlock()286 defer sess.connLock.Unlock()
245 sess.Connection = conn287 sess.Connection = conn
246}288}
247289
248func (sess *ClientSession) getConnection() net.Conn {290func (sess *ConcreteSession) getConnection() net.Conn {
249 sess.connLock.RLock()291 sess.connLock.RLock()
250 defer sess.connLock.RUnlock()292 defer sess.connLock.RUnlock()
251 return sess.Connection293 return sess.Connection
252}294}
253295
254func (sess *ClientSession) setCookie(cookie string) {296func (sess *ConcreteSession) setCookie(cookie string) {
255 sess.connLock.Lock()297 sess.connLock.Lock()
256 defer sess.connLock.Unlock()298 defer sess.connLock.Unlock()
257 sess.cookie = cookie299 sess.cookie = cookie
258}300}
259301
260func (sess *ClientSession) getCookie() string {302func (sess *ConcreteSession) getCookie() string {
261 sess.connLock.RLock()303 sess.connLock.RLock()
262 defer sess.connLock.RUnlock()304 defer sess.connLock.RUnlock()
263 return sess.cookie305 return sess.cookie
264}306}
265307
266func (sess *ClientSession) ClearCookie() {308func (sess *ConcreteSession) ClearCookie() {
267 sess.connLock.Lock()309 sess.connLock.Lock()
268 defer sess.connLock.Unlock()310 defer sess.connLock.Unlock()
269 sess.cookie = ""311 sess.cookie = ""
270}312}
271313
272// getHosts sets deliveryHosts possibly querying a remote endpoint314// getHosts sets deliveryHosts possibly querying a remote endpoint
273func (sess *ClientSession) getHosts() error {315func (sess *ConcreteSession) getHosts() error {
274 if sess.getHost != nil {316 if sess.getHost != nil {
275 if sess.deliveryHosts != nil && sess.timeSince(sess.deliveryHostsTimestamp) < sess.HostsCachingExpiryTime {317 if sess.deliveryHosts != nil && sess.timeSince(sess.deliveryHostsTimestamp) < sess.HostsCachingExpiryTime {
276 return nil318 return nil
@@ -294,7 +336,7 @@
294336
295// addAuthorization gets the authorization blob to send to the server337// addAuthorization gets the authorization blob to send to the server
296// and adds it to the session.338// and adds it to the session.
297func (sess *ClientSession) addAuthorization() error {339func (sess *ConcreteSession) addAuthorization() error {
298 if sess.AuthGetter != nil {340 if sess.AuthGetter != nil {
299 sess.Log.Debugf("adding authorization")341 sess.Log.Debugf("adding authorization")
300 sess.auth = sess.AuthGetter(sess.AuthURL)342 sess.auth = sess.AuthGetter(sess.AuthURL)
@@ -302,13 +344,13 @@
302 return nil344 return nil
303}345}
304346
305func (sess *ClientSession) resetHosts() {347func (sess *ConcreteSession) resetHosts() {
306 sess.deliveryHosts = nil348 sess.deliveryHosts = nil
307}349}
308350
309// startConnectionAttempt/nextHostToTry help connect iterating over candidate hosts351// startConnectionAttempt/nextHostToTry help connect iterating over candidate hosts
310352
311func (sess *ClientSession) startConnectionAttempt() {353func (sess *ConcreteSession) startConnectionAttempt() {
312 if sess.timeSince(sess.lastAttemptTimestamp) > sess.ExpectAllRepairedTime {354 if sess.timeSince(sess.lastAttemptTimestamp) > sess.ExpectAllRepairedTime {
313 sess.tryHost = 0355 sess.tryHost = 0
314 }356 }
@@ -319,7 +361,7 @@
319 sess.lastAttemptTimestamp = time.Now()361 sess.lastAttemptTimestamp = time.Now()
320}362}
321363
322func (sess *ClientSession) nextHostToTry() string {364func (sess *ConcreteSession) nextHostToTry() string {
323 if sess.leftToTry == 0 {365 if sess.leftToTry == 0 {
324 return ""366 return ""
325 }367 }
@@ -331,7 +373,7 @@
331373
332// we reached the Started state, we can retry with the same host if we374// we reached the Started state, we can retry with the same host if we
333// have to retry again375// have to retry again
334func (sess *ClientSession) started() {376func (sess *ConcreteSession) started() {
335 sess.tryHost--377 sess.tryHost--
336 if sess.tryHost == -1 {378 if sess.tryHost == -1 {
337 sess.tryHost = len(sess.deliveryHosts) - 1379 sess.tryHost = len(sess.deliveryHosts) - 1
@@ -341,7 +383,7 @@
341383
342// connect to a server using the configuration in the ClientSession384// connect to a server using the configuration in the ClientSession
343// and set up the connection.385// and set up the connection.
344func (sess *ClientSession) connect() error {386func (sess *ConcreteSession) connect() error {
345 sess.setShouldDelay()387 sess.setShouldDelay()
346 sess.startConnectionAttempt()388 sess.startConnectionAttempt()
347 var err error389 var err error
@@ -363,7 +405,7 @@
363 return nil405 return nil
364}406}
365407
366func (sess *ClientSession) stopRedial() {408func (sess *ConcreteSession) stopRedial() {
367 sess.retrierLock.Lock()409 sess.retrierLock.Lock()
368 defer sess.retrierLock.Unlock()410 defer sess.retrierLock.Unlock()
369 if sess.retrier != nil {411 if sess.retrier != nil {
@@ -372,7 +414,7 @@
372 }414 }
373}415}
374416
375func (sess *ClientSession) AutoRedial(doneCh chan uint32) {417func (sess *ConcreteSession) AutoRedial(doneCh chan uint32) {
376 sess.stopRedial()418 sess.stopRedial()
377 if time.Since(sess.lastAutoRedial) < 2*time.Second {419 if time.Since(sess.lastAutoRedial) < 2*time.Second {
378 sess.setShouldDelay()420 sess.setShouldDelay()
@@ -398,12 +440,12 @@
398 }()440 }()
399}441}
400442
401func (sess *ClientSession) Close() {443func (sess *ConcreteSession) Close() {
402 sess.stopRedial()444 sess.stopRedial()
403 sess.doClose()445 sess.doClose()
404}446}
405447
406func (sess *ClientSession) doClose() {448func (sess *ConcreteSession) doClose() {
407 sess.connLock.Lock()449 sess.connLock.Lock()
408 defer sess.connLock.Unlock()450 defer sess.connLock.Unlock()
409 if sess.Connection != nil {451 if sess.Connection != nil {
@@ -417,7 +459,7 @@
417}459}
418460
419// handle "ping" messages461// handle "ping" messages
420func (sess *ClientSession) handlePing() error {462func (sess *ConcreteSession) handlePing() error {
421 err := sess.proto.WriteMessage(protocol.PingPongMsg{Type: "pong"})463 err := sess.proto.WriteMessage(protocol.PingPongMsg{Type: "pong"})
422 if err == nil {464 if err == nil {
423 sess.Log.Debugf("ping.")465 sess.Log.Debugf("ping.")
@@ -429,7 +471,7 @@
429 return err471 return err
430}472}
431473
432func (sess *ClientSession) decodeBroadcast(bcast *serverMsg) *BroadcastNotification {474func (sess *ConcreteSession) decodeBroadcast(bcast *serverMsg) *BroadcastNotification {
433 decoded := make([]map[string]interface{}, 0)475 decoded := make([]map[string]interface{}, 0)
434 for _, p := range bcast.Payloads {476 for _, p := range bcast.Payloads {
435 var v map[string]interface{}477 var v map[string]interface{}
@@ -447,7 +489,7 @@
447}489}
448490
449// handle "broadcast" messages491// handle "broadcast" messages
450func (sess *ClientSession) handleBroadcast(bcast *serverMsg) error {492func (sess *ConcreteSession) handleBroadcast(bcast *serverMsg) error {
451 err := sess.SeenState.SetLevel(bcast.ChanId, bcast.TopLevel)493 err := sess.SeenState.SetLevel(bcast.ChanId, bcast.TopLevel)
452 if err != nil {494 if err != nil {
453 sess.setState(Error)495 sess.setState(Error)
@@ -478,7 +520,7 @@
478}520}
479521
480// handle "notifications" messages522// handle "notifications" messages
481func (sess *ClientSession) handleNotifications(ucast *serverMsg) error {523func (sess *ConcreteSession) handleNotifications(ucast *serverMsg) error {
482 notifs, err := sess.SeenState.FilterBySeen(ucast.Notifications)524 notifs, err := sess.SeenState.FilterBySeen(ucast.Notifications)
483 if err != nil {525 if err != nil {
484 sess.setState(Error)526 sess.setState(Error)
@@ -512,7 +554,7 @@
512}554}
513555
514// handle "connbroken" messages556// handle "connbroken" messages
515func (sess *ClientSession) handleConnBroken(connBroken *serverMsg) error {557func (sess *ConcreteSession) handleConnBroken(connBroken *serverMsg) error {
516 sess.setState(Error)558 sess.setState(Error)
517 reason := connBroken.Reason559 reason := connBroken.Reason
518 err := fmt.Errorf("server broke connection: %s", reason)560 err := fmt.Errorf("server broke connection: %s", reason)
@@ -525,7 +567,7 @@
525}567}
526568
527// handle "setparams" messages569// handle "setparams" messages
528func (sess *ClientSession) handleSetParams(setParams *serverMsg) error {570func (sess *ConcreteSession) handleSetParams(setParams *serverMsg) error {
529 if setParams.SetCookie != "" {571 if setParams.SetCookie != "" {
530 sess.setCookie(setParams.SetCookie)572 sess.setCookie(setParams.SetCookie)
531 }573 }
@@ -533,7 +575,7 @@
533}575}
534576
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.
536func (sess *ClientSession) loop() error {578func (sess *ConcreteSession) loop() error {
537 var err error579 var err error
538 var recv serverMsg580 var recv serverMsg
539 sess.setState(Running)581 sess.setState(Running)
@@ -571,7 +613,7 @@
571}613}
572614
573// Call this when you've connected and want to start looping.615// Call this when you've connected and want to start looping.
574func (sess *ClientSession) start() error {616func (sess *ConcreteSession) start() error {
575 conn := sess.getConnection()617 conn := sess.getConnection()
576 err := conn.SetDeadline(time.Now().Add(sess.ExchangeTimeout))618 err := conn.SetDeadline(time.Now().Add(sess.ExchangeTimeout))
577 if err != nil {619 if err != nil {
@@ -634,7 +676,7 @@
634676
635// run calls connect, and if it works it calls start, and if it works677// run calls connect, and if it works it calls start, and if it works
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.
637func (sess *ClientSession) run(closer func(), authChecker, hostGetter, connecter, starter, looper func() error) error {679func (sess *ConcreteSession) run(closer func(), authChecker, hostGetter, connecter, starter, looper func() error) error {
638 closer()680 closer()
639 if err := authChecker(); err != nil {681 if err := authChecker(); err != nil {
640 return err682 return err
@@ -656,7 +698,7 @@
656}698}
657699
658// This Jitter returns a random time.Duration somewhere in [-spread, spread].700// This Jitter returns a random time.Duration somewhere in [-spread, spread].
659func (sess *ClientSession) Jitter(spread time.Duration) time.Duration {701func (sess *ConcreteSession) Jitter(spread time.Duration) time.Duration {
660 if spread < 0 {702 if spread < 0 {
661 panic("spread must be non-negative")703 panic("spread must be non-negative")
662 }704 }
@@ -666,7 +708,7 @@
666708
667// Dial takes the session from newly created (or newly disconnected)709// Dial takes the session from newly created (or newly disconnected)
668// to running the main loop.710// to running the main loop.
669func (sess *ClientSession) Dial() error {711func (sess *ConcreteSession) Dial() error {
670 if sess.Protocolator == nil {712 if sess.Protocolator == nil {
671 // a missing protocolator means you've willfully overridden713 // a missing protocolator means you've willfully overridden
672 // it; returning an error here would prompt AutoRedial to just714 // it; returning an error here would prompt AutoRedial to just
673715
=== modified file 'client/session/session_test.go'
--- client/session/session_test.go 2015-02-02 16:49:46 +0000
+++ client/session/session_test.go 2015-02-12 14:33:25 +0000
@@ -169,20 +169,20 @@
169169
170/////170/////
171171
172type clientSessionSuite struct {172type ConcreteSessionSuite struct {
173 log *helpers.TestLogger173 log *helpers.TestLogger
174 lvls func() (seenstate.SeenState, error)174 lvls func() (seenstate.SeenState, error)
175}175}
176176
177func (cs *clientSessionSuite) SetUpTest(c *C) {177func (cs *ConcreteSessionSuite) SetUpTest(c *C) {
178 cs.log = helpers.NewTestLogger(c, "debug")178 cs.log = helpers.NewTestLogger(c, "debug")
179}179}
180180
181// in-memory level map testing181// in-memory level map testing
182var _ = Suite(&clientSessionSuite{lvls: seenstate.NewSeenState})182var _ = Suite(&ConcreteSessionSuite{lvls: seenstate.NewSeenState})
183183
184// sqlite level map testing184// sqlite level map testing
185type clientSqlevelsSessionSuite struct{ clientSessionSuite }185type clientSqlevelsSessionSuite struct{ ConcreteSessionSuite }
186186
187var _ = Suite(&clientSqlevelsSessionSuite{})187var _ = Suite(&clientSqlevelsSessionSuite{})
188188
@@ -194,7 +194,7 @@
194 parseServerAddrSpec() tests194 parseServerAddrSpec() tests
195****************************************************************/195****************************************************************/
196196
197func (cs *clientSessionSuite) TestParseServerAddrSpec(c *C) {197func (cs *ConcreteSessionSuite) TestParseServerAddrSpec(c *C) {
198 hEp, fallbackHosts := parseServerAddrSpec("http://foo/hosts")198 hEp, fallbackHosts := parseServerAddrSpec("http://foo/hosts")
199 c.Check(hEp, Equals, "http://foo/hosts")199 c.Check(hEp, Equals, "http://foo/hosts")
200 c.Check(fallbackHosts, IsNil)200 c.Check(fallbackHosts, IsNil)
@@ -209,13 +209,13 @@
209}209}
210210
211/****************************************************************211/****************************************************************
212 NewSession() tests212 newSession() tests
213****************************************************************/213****************************************************************/
214214
215var dummyConf = ClientSessionConfig{}215var dummyConf = ClientSessionConfig{}
216216
217func (cs *clientSessionSuite) TestNewSessionPlainWorks(c *C) {217func (cs *ConcreteSessionSuite) TestnewSessionPlainWorks(c *C) {
218 sess, err := NewSession("foo:443", dummyConf, "", cs.lvls, cs.log)218 sess, err := newSession("foo:443", dummyConf, "", cs.lvls, cs.log)
219 c.Check(sess, NotNil)219 c.Check(sess, NotNil)
220 c.Check(err, IsNil)220 c.Check(err, IsNil)
221 c.Check(sess.fallbackHosts, DeepEquals, []string{"foo:443"})221 c.Check(sess.fallbackHosts, DeepEquals, []string{"foo:443"})
@@ -228,8 +228,8 @@
228 c.Check(sess.State(), Equals, Disconnected)228 c.Check(sess.State(), Equals, Disconnected)
229}229}
230230
231func (cs *clientSessionSuite) TestNewSessionHostEndpointWorks(c *C) {231func (cs *ConcreteSessionSuite) TestnewSessionHostEndpointWorks(c *C) {
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)
233 c.Assert(err, IsNil)233 c.Assert(err, IsNil)
234 c.Check(sess.getHost, NotNil)234 c.Check(sess.getHost, NotNil)
235}235}
@@ -237,25 +237,25 @@
237var certfile string = helpers.SourceRelative("../../server/acceptance/ssl/testing.cert")237var certfile string = helpers.SourceRelative("../../server/acceptance/ssl/testing.cert")
238var pem, _ = ioutil.ReadFile(certfile)238var pem, _ = ioutil.ReadFile(certfile)
239239
240func (cs *clientSessionSuite) TestNewSessionPEMWorks(c *C) {240func (cs *ConcreteSessionSuite) TestnewSessionPEMWorks(c *C) {
241 conf := ClientSessionConfig{PEM: pem}241 conf := ClientSessionConfig{PEM: pem}
242 sess, err := NewSession("", conf, "wah", cs.lvls, cs.log)242 sess, err := newSession("", conf, "wah", cs.lvls, cs.log)
243 c.Check(sess, NotNil)243 c.Check(sess, NotNil)
244 c.Assert(err, IsNil)244 c.Assert(err, IsNil)
245 c.Check(sess.TLS.RootCAs, NotNil)245 c.Check(sess.TLS.RootCAs, NotNil)
246}246}
247247
248func (cs *clientSessionSuite) TestNewSessionBadPEMFileContentFails(c *C) {248func (cs *ConcreteSessionSuite) TestnewSessionBadPEMFileContentFails(c *C) {
249 badpem := []byte("This is not the PEM you're looking for.")249 badpem := []byte("This is not the PEM you're looking for.")
250 conf := ClientSessionConfig{PEM: badpem}250 conf := ClientSessionConfig{PEM: badpem}
251 sess, err := NewSession("", conf, "wah", cs.lvls, cs.log)251 sess, err := newSession("", conf, "wah", cs.lvls, cs.log)
252 c.Check(sess, IsNil)252 c.Check(sess, IsNil)
253 c.Check(err, NotNil)253 c.Check(err, NotNil)
254}254}
255255
256func (cs *clientSessionSuite) TestNewSessionBadSeenStateFails(c *C) {256func (cs *ConcreteSessionSuite) TestnewSessionBadSeenStateFails(c *C) {
257 ferr := func() (seenstate.SeenState, error) { return nil, errors.New("Busted.") }257 ferr := func() (seenstate.SeenState, error) { return nil, errors.New("Busted.") }
258 sess, err := NewSession("", dummyConf, "wah", ferr, cs.log)258 sess, err := newSession("", dummyConf, "wah", ferr, cs.log)
259 c.Check(sess, IsNil)259 c.Check(sess, IsNil)
260 c.Assert(err, NotNil)260 c.Assert(err, NotNil)
261}261}
@@ -264,9 +264,9 @@
264 getHosts() tests264 getHosts() tests
265****************************************************************/265****************************************************************/
266266
267func (cs *clientSessionSuite) TestGetHostsFallback(c *C) {267func (cs *ConcreteSessionSuite) TestGetHostsFallback(c *C) {
268 fallback := []string{"foo:443", "bar:443"}268 fallback := []string{"foo:443", "bar:443"}
269 sess := &ClientSession{fallbackHosts: fallback}269 sess := &ConcreteSession{fallbackHosts: fallback}
270 err := sess.getHosts()270 err := sess.getHosts()
271 c.Assert(err, IsNil)271 c.Assert(err, IsNil)
272 c.Check(sess.deliveryHosts, DeepEquals, fallback)272 c.Check(sess.deliveryHosts, DeepEquals, fallback)
@@ -282,16 +282,16 @@
282 return &gethosts.Host{thg.domain, thg.hosts}, thg.err282 return &gethosts.Host{thg.domain, thg.hosts}, thg.err
283}283}
284284
285func (cs *clientSessionSuite) TestGetHostsRemote(c *C) {285func (cs *ConcreteSessionSuite) TestGetHostsRemote(c *C) {
286 hostGetter := &testHostGetter{"example.com", []string{"foo:443", "bar:443"}, nil}286 hostGetter := &testHostGetter{"example.com", []string{"foo:443", "bar:443"}, nil}
287 sess := &ClientSession{getHost: hostGetter, timeSince: time.Since}287 sess := &ConcreteSession{getHost: hostGetter, timeSince: time.Since}
288 err := sess.getHosts()288 err := sess.getHosts()
289 c.Assert(err, IsNil)289 c.Assert(err, IsNil)
290 c.Check(sess.deliveryHosts, DeepEquals, []string{"foo:443", "bar:443"})290 c.Check(sess.deliveryHosts, DeepEquals, []string{"foo:443", "bar:443"})
291}291}
292292
293func (cs *clientSessionSuite) TestGetHostsRemoteError(c *C) {293func (cs *ConcreteSessionSuite) TestGetHostsRemoteError(c *C) {
294 sess, err := NewSession("", dummyConf, "", cs.lvls, cs.log)294 sess, err := newSession("", dummyConf, "", cs.lvls, cs.log)
295 c.Assert(err, IsNil)295 c.Assert(err, IsNil)
296 hostsErr := errors.New("failed")296 hostsErr := errors.New("failed")
297 hostGetter := &testHostGetter{"", nil, hostsErr}297 hostGetter := &testHostGetter{"", nil, hostsErr}
@@ -302,9 +302,9 @@
302 c.Check(sess.State(), Equals, Error)302 c.Check(sess.State(), Equals, Error)
303}303}
304304
305func (cs *clientSessionSuite) TestGetHostsRemoteCaching(c *C) {305func (cs *ConcreteSessionSuite) TestGetHostsRemoteCaching(c *C) {
306 hostGetter := &testHostGetter{"example.com", []string{"foo:443", "bar:443"}, nil}306 hostGetter := &testHostGetter{"example.com", []string{"foo:443", "bar:443"}, nil}
307 sess := &ClientSession{307 sess := &ConcreteSession{
308 getHost: hostGetter,308 getHost: hostGetter,
309 ClientSessionConfig: ClientSessionConfig{309 ClientSessionConfig: ClientSessionConfig{
310 HostsCachingExpiryTime: 2 * time.Hour,310 HostsCachingExpiryTime: 2 * time.Hour,
@@ -327,9 +327,9 @@
327 c.Check(sess.deliveryHosts, DeepEquals, []string{"baz:443"})327 c.Check(sess.deliveryHosts, DeepEquals, []string{"baz:443"})
328}328}
329329
330func (cs *clientSessionSuite) TestGetHostsRemoteCachingReset(c *C) {330func (cs *ConcreteSessionSuite) TestGetHostsRemoteCachingReset(c *C) {
331 hostGetter := &testHostGetter{"example.com", []string{"foo:443", "bar:443"}, nil}331 hostGetter := &testHostGetter{"example.com", []string{"foo:443", "bar:443"}, nil}
332 sess := &ClientSession{332 sess := &ConcreteSession{
333 getHost: hostGetter,333 getHost: hostGetter,
334 ClientSessionConfig: ClientSessionConfig{334 ClientSessionConfig: ClientSessionConfig{
335 HostsCachingExpiryTime: 2 * time.Hour,335 HostsCachingExpiryTime: 2 * time.Hour,
@@ -354,9 +354,9 @@
354 addAuthorization() tests354 addAuthorization() tests
355****************************************************************/355****************************************************************/
356356
357func (cs *clientSessionSuite) TestAddAuthorizationAddsAuthorization(c *C) {357func (cs *ConcreteSessionSuite) TestAddAuthorizationAddsAuthorization(c *C) {
358 url := "xyzzy://"358 url := "xyzzy://"
359 sess := &ClientSession{Log: cs.log}359 sess := &ConcreteSession{Log: cs.log}
360 sess.AuthGetter = func(url string) string { return url + " auth'ed" }360 sess.AuthGetter = func(url string) string { return url + " auth'ed" }
361 sess.AuthURL = url361 sess.AuthURL = url
362 c.Assert(sess.auth, Equals, "")362 c.Assert(sess.auth, Equals, "")
@@ -365,8 +365,8 @@
365 c.Check(sess.auth, Equals, "xyzzy:// auth'ed")365 c.Check(sess.auth, Equals, "xyzzy:// auth'ed")
366}366}
367367
368func (cs *clientSessionSuite) TestAddAuthorizationSkipsIfUnset(c *C) {368func (cs *ConcreteSessionSuite) TestAddAuthorizationSkipsIfUnset(c *C) {
369 sess := &ClientSession{Log: cs.log}369 sess := &ConcreteSession{Log: cs.log}
370 sess.AuthGetter = nil370 sess.AuthGetter = nil
371 c.Assert(sess.auth, Equals, "")371 c.Assert(sess.auth, Equals, "")
372 err := sess.addAuthorization()372 err := sess.addAuthorization()
@@ -378,9 +378,9 @@
378 startConnectionAttempt()/nextHostToTry()/started tests378 startConnectionAttempt()/nextHostToTry()/started tests
379****************************************************************/379****************************************************************/
380380
381func (cs *clientSessionSuite) TestStartConnectionAttempt(c *C) {381func (cs *ConcreteSessionSuite) TestStartConnectionAttempt(c *C) {
382 since := time.Since(time.Time{})382 since := time.Since(time.Time{})
383 sess := &ClientSession{383 sess := &ConcreteSession{
384 ClientSessionConfig: ClientSessionConfig{384 ClientSessionConfig: ClientSessionConfig{
385 ExpectAllRepairedTime: 10 * time.Second,385 ExpectAllRepairedTime: 10 * time.Second,
386 },386 },
@@ -402,9 +402,9 @@
402 sess.tryHost = 2402 sess.tryHost = 2
403}403}
404404
405func (cs *clientSessionSuite) TestStartConnectionAttemptNoHostsPanic(c *C) {405func (cs *ConcreteSessionSuite) TestStartConnectionAttemptNoHostsPanic(c *C) {
406 since := time.Since(time.Time{})406 since := time.Since(time.Time{})
407 sess := &ClientSession{407 sess := &ConcreteSession{
408 ClientSessionConfig: ClientSessionConfig{408 ClientSessionConfig: ClientSessionConfig{
409 ExpectAllRepairedTime: 10 * time.Second,409 ExpectAllRepairedTime: 10 * time.Second,
410 },410 },
@@ -415,8 +415,8 @@
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")
416}416}
417417
418func (cs *clientSessionSuite) TestNextHostToTry(c *C) {418func (cs *ConcreteSessionSuite) TestNextHostToTry(c *C) {
419 sess := &ClientSession{419 sess := &ConcreteSession{
420 deliveryHosts: []string{"foo:443", "bar:443", "baz:443"},420 deliveryHosts: []string{"foo:443", "bar:443", "baz:443"},
421 tryHost: 0,421 tryHost: 0,
422 leftToTry: 3,422 leftToTry: 3,
@@ -438,8 +438,8 @@
438 c.Check(sess.tryHost, Equals, 1)438 c.Check(sess.tryHost, Equals, 1)
439}439}
440440
441func (cs *clientSessionSuite) TestStarted(c *C) {441func (cs *ConcreteSessionSuite) TestStarted(c *C) {
442 sess, err := NewSession("", dummyConf, "", cs.lvls, cs.log)442 sess, err := newSession("", dummyConf, "", cs.lvls, cs.log)
443 c.Assert(err, IsNil)443 c.Assert(err, IsNil)
444444
445 sess.deliveryHosts = []string{"foo:443", "bar:443", "baz:443"}445 sess.deliveryHosts = []string{"foo:443", "bar:443", "baz:443"}
@@ -457,8 +457,8 @@
457 connect() tests457 connect() tests
458****************************************************************/458****************************************************************/
459459
460func (cs *clientSessionSuite) TestConnectFailsWithNoAddress(c *C) {460func (cs *ConcreteSessionSuite) TestConnectFailsWithNoAddress(c *C) {
461 sess, err := NewSession("", dummyConf, "wah", cs.lvls, cs.log)461 sess, err := newSession("", dummyConf, "wah", cs.lvls, cs.log)
462 c.Assert(err, IsNil)462 c.Assert(err, IsNil)
463 sess.deliveryHosts = []string{"nowhere"}463 sess.deliveryHosts = []string{"nowhere"}
464 sess.clearShouldDelay()464 sess.clearShouldDelay()
@@ -468,11 +468,11 @@
468 c.Check(sess.State(), Equals, Error)468 c.Check(sess.State(), Equals, Error)
469}469}
470470
471func (cs *clientSessionSuite) TestConnectConnects(c *C) {471func (cs *ConcreteSessionSuite) TestConnectConnects(c *C) {
472 srv, err := net.Listen("tcp", "localhost:0")472 srv, err := net.Listen("tcp", "localhost:0")
473 c.Assert(err, IsNil)473 c.Assert(err, IsNil)
474 defer srv.Close()474 defer srv.Close()
475 sess, err := NewSession("", dummyConf, "wah", cs.lvls, cs.log)475 sess, err := newSession("", dummyConf, "wah", cs.lvls, cs.log)
476 c.Assert(err, IsNil)476 c.Assert(err, IsNil)
477 sess.deliveryHosts = []string{srv.Addr().String()}477 sess.deliveryHosts = []string{srv.Addr().String()}
478 sess.clearShouldDelay()478 sess.clearShouldDelay()
@@ -483,11 +483,11 @@
483 c.Check(sess.State(), Equals, Connected)483 c.Check(sess.State(), Equals, Connected)
484}484}
485485
486func (cs *clientSessionSuite) TestConnectSecondConnects(c *C) {486func (cs *ConcreteSessionSuite) TestConnectSecondConnects(c *C) {
487 srv, err := net.Listen("tcp", "localhost:0")487 srv, err := net.Listen("tcp", "localhost:0")
488 c.Assert(err, IsNil)488 c.Assert(err, IsNil)
489 defer srv.Close()489 defer srv.Close()
490 sess, err := NewSession("", dummyConf, "wah", cs.lvls, cs.log)490 sess, err := newSession("", dummyConf, "wah", cs.lvls, cs.log)
491 c.Assert(err, IsNil)491 c.Assert(err, IsNil)
492 sess.deliveryHosts = []string{"nowhere", srv.Addr().String()}492 sess.deliveryHosts = []string{"nowhere", srv.Addr().String()}
493 sess.clearShouldDelay()493 sess.clearShouldDelay()
@@ -499,10 +499,10 @@
499 c.Check(sess.tryHost, Equals, 0)499 c.Check(sess.tryHost, Equals, 0)
500}500}
501501
502func (cs *clientSessionSuite) TestConnectConnectFail(c *C) {502func (cs *ConcreteSessionSuite) TestConnectConnectFail(c *C) {
503 srv, err := net.Listen("tcp", "localhost:0")503 srv, err := net.Listen("tcp", "localhost:0")
504 c.Assert(err, IsNil)504 c.Assert(err, IsNil)
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)
506 srv.Close()506 srv.Close()
507 c.Assert(err, IsNil)507 c.Assert(err, IsNil)
508 sess.deliveryHosts = []string{srv.Addr().String()}508 sess.deliveryHosts = []string{srv.Addr().String()}
@@ -517,8 +517,8 @@
517 Close() tests517 Close() tests
518****************************************************************/518****************************************************************/
519519
520func (cs *clientSessionSuite) TestClose(c *C) {520func (cs *ConcreteSessionSuite) TestClose(c *C) {
521 sess, err := NewSession("", dummyConf, "wah", cs.lvls, cs.log)521 sess, err := newSession("", dummyConf, "wah", cs.lvls, cs.log)
522 c.Assert(err, IsNil)522 c.Assert(err, IsNil)
523 sess.Connection = &testConn{Name: "TestClose"}523 sess.Connection = &testConn{Name: "TestClose"}
524 sess.Close()524 sess.Close()
@@ -526,8 +526,8 @@
526 c.Check(sess.State(), Equals, Disconnected)526 c.Check(sess.State(), Equals, Disconnected)
527}527}
528528
529func (cs *clientSessionSuite) TestCloseTwice(c *C) {529func (cs *ConcreteSessionSuite) TestCloseTwice(c *C) {
530 sess, err := NewSession("", dummyConf, "wah", cs.lvls, cs.log)530 sess, err := newSession("", dummyConf, "wah", cs.lvls, cs.log)
531 c.Assert(err, IsNil)531 c.Assert(err, IsNil)
532 sess.Connection = &testConn{Name: "TestCloseTwice"}532 sess.Connection = &testConn{Name: "TestCloseTwice"}
533 sess.Close()533 sess.Close()
@@ -537,8 +537,8 @@
537 c.Check(sess.State(), Equals, Disconnected)537 c.Check(sess.State(), Equals, Disconnected)
538}538}
539539
540func (cs *clientSessionSuite) TestCloseFails(c *C) {540func (cs *ConcreteSessionSuite) TestCloseFails(c *C) {
541 sess, err := NewSession("", dummyConf, "wah", cs.lvls, cs.log)541 sess, err := newSession("", dummyConf, "wah", cs.lvls, cs.log)
542 c.Assert(err, IsNil)542 c.Assert(err, IsNil)
543 sess.Connection = &testConn{Name: "TestCloseFails", CloseCondition: condition.Work(false)}543 sess.Connection = &testConn{Name: "TestCloseFails", CloseCondition: condition.Work(false)}
544 sess.Close()544 sess.Close()
@@ -551,8 +551,8 @@
551func (*derp) Redial() uint32 { return 0 }551func (*derp) Redial() uint32 { return 0 }
552func (d *derp) Stop() { d.stopped = true }552func (d *derp) Stop() { d.stopped = true }
553553
554func (cs *clientSessionSuite) TestCloseStopsRetrier(c *C) {554func (cs *ConcreteSessionSuite) TestCloseStopsRetrier(c *C) {
555 sess, err := NewSession("", dummyConf, "wah", cs.lvls, cs.log)555 sess, err := newSession("", dummyConf, "wah", cs.lvls, cs.log)
556 c.Assert(err, IsNil)556 c.Assert(err, IsNil)
557 ar := new(derp)557 ar := new(derp)
558 sess.retrier = ar558 sess.retrier = ar
@@ -567,9 +567,9 @@
567 AutoRedial() tests567 AutoRedial() tests
568****************************************************************/568****************************************************************/
569569
570func (cs *clientSessionSuite) TestAutoRedialWorks(c *C) {570func (cs *ConcreteSessionSuite) TestAutoRedialWorks(c *C) {
571 // checks that AutoRedial sets up a retrier and tries redialing it571 // checks that AutoRedial sets up a retrier and tries redialing it
572 sess, err := NewSession("", dummyConf, "wah", cs.lvls, cs.log)572 sess, err := newSession("", dummyConf, "wah", cs.lvls, cs.log)
573 c.Assert(err, IsNil)573 c.Assert(err, IsNil)
574 ar := new(derp)574 ar := new(derp)
575 sess.retrier = ar575 sess.retrier = ar
@@ -578,9 +578,9 @@
578 c.Check(ar.stopped, Equals, true)578 c.Check(ar.stopped, Equals, true)
579}579}
580580
581func (cs *clientSessionSuite) TestAutoRedialStopsRetrier(c *C) {581func (cs *ConcreteSessionSuite) TestAutoRedialStopsRetrier(c *C) {
582 // checks that AutoRedial stops the previous retrier582 // checks that AutoRedial stops the previous retrier
583 sess, err := NewSession("", dummyConf, "wah", cs.lvls, cs.log)583 sess, err := newSession("", dummyConf, "wah", cs.lvls, cs.log)
584 c.Assert(err, IsNil)584 c.Assert(err, IsNil)
585 ch := make(chan uint32)585 ch := make(chan uint32)
586 c.Check(sess.retrier, IsNil)586 c.Check(sess.retrier, IsNil)
@@ -590,19 +590,19 @@
590 c.Check(<-ch, Not(Equals), 0)590 c.Check(<-ch, Not(Equals), 0)
591}591}
592592
593func (cs *clientSessionSuite) TestAutoRedialCallsRedialDelay(c *C) {593func (cs *ConcreteSessionSuite) TestAutoRedialCallsRedialDelay(c *C) {
594 sess, err := NewSession("", dummyConf, "wah", cs.lvls, cs.log)594 sess, err := newSession("", dummyConf, "wah", cs.lvls, cs.log)
595 c.Assert(err, IsNil)595 c.Assert(err, IsNil)
596 flag := false596 flag := false
597 sess.redialDelay = func(sess *ClientSession) time.Duration { flag = true; return 0 }597 sess.redialDelay = func(sess *ConcreteSession) time.Duration { flag = true; return 0 }
598 sess.AutoRedial(nil)598 sess.AutoRedial(nil)
599 c.Check(flag, Equals, true)599 c.Check(flag, Equals, true)
600}600}
601601
602func (cs *clientSessionSuite) TestAutoRedialSetsRedialDelayIfTooQuick(c *C) {602func (cs *ConcreteSessionSuite) TestAutoRedialSetsRedialDelayIfTooQuick(c *C) {
603 sess, err := NewSession("", dummyConf, "wah", cs.lvls, cs.log)603 sess, err := newSession("", dummyConf, "wah", cs.lvls, cs.log)
604 c.Assert(err, IsNil)604 c.Assert(err, IsNil)
605 sess.redialDelay = func(sess *ClientSession) time.Duration { return 0 }605 sess.redialDelay = func(sess *ConcreteSession) time.Duration { return 0 }
606 sess.AutoRedial(nil)606 sess.AutoRedial(nil)
607 c.Check(sess.ShouldDelay(), Equals, false)607 c.Check(sess.ShouldDelay(), Equals, false)
608 sess.stopRedial()608 sess.stopRedial()
@@ -616,7 +616,7 @@
616****************************************************************/616****************************************************************/
617617
618type msgSuite struct {618type msgSuite struct {
619 sess *ClientSession619 sess *ConcreteSession
620 upCh chan interface{}620 upCh chan interface{}
621 downCh chan interface{}621 downCh chan interface{}
622 errCh chan error622 errCh chan error
@@ -629,7 +629,7 @@
629 conf := ClientSessionConfig{629 conf := ClientSessionConfig{
630 ExchangeTimeout: time.Millisecond,630 ExchangeTimeout: time.Millisecond,
631 }631 }
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"))
633 c.Assert(err, IsNil)633 c.Assert(err, IsNil)
634 s.sess.Connection = &testConn{Name: "TestHandle*"}634 s.sess.Connection = &testConn{Name: "TestHandle*"}
635 s.errCh = make(chan error, 1)635 s.errCh = make(chan error, 1)
@@ -1167,8 +1167,8 @@
1167/****************************************************************1167/****************************************************************
1168 start() tests1168 start() tests
1169****************************************************************/1169****************************************************************/
1170func (cs *clientSessionSuite) TestStartFailsIfSetDeadlineFails(c *C) {1170func (cs *ConcreteSessionSuite) TestStartFailsIfSetDeadlineFails(c *C) {
1171 sess, err := NewSession("", dummyConf, "wah", cs.lvls, cs.log)1171 sess, err := newSession("", dummyConf, "wah", cs.lvls, cs.log)
1172 c.Assert(err, IsNil)1172 c.Assert(err, IsNil)
1173 sess.Connection = &testConn{Name: "TestStartFailsIfSetDeadlineFails",1173 sess.Connection = &testConn{Name: "TestStartFailsIfSetDeadlineFails",
1174 DeadlineCondition: condition.Work(false)} // setdeadline will fail1174 DeadlineCondition: condition.Work(false)} // setdeadline will fail
@@ -1177,8 +1177,8 @@
1177 c.Check(sess.State(), Equals, Error)1177 c.Check(sess.State(), Equals, Error)
1178}1178}
11791179
1180func (cs *clientSessionSuite) TestStartFailsIfWriteFails(c *C) {1180func (cs *ConcreteSessionSuite) TestStartFailsIfWriteFails(c *C) {
1181 sess, err := NewSession("", dummyConf, "wah", cs.lvls, cs.log)1181 sess, err := newSession("", dummyConf, "wah", cs.lvls, cs.log)
1182 c.Assert(err, IsNil)1182 c.Assert(err, IsNil)
1183 sess.Connection = &testConn{Name: "TestStartFailsIfWriteFails",1183 sess.Connection = &testConn{Name: "TestStartFailsIfWriteFails",
1184 WriteCondition: condition.Work(false)} // write will fail1184 WriteCondition: condition.Work(false)} // write will fail
@@ -1187,8 +1187,8 @@
1187 c.Check(sess.State(), Equals, Error)1187 c.Check(sess.State(), Equals, Error)
1188}1188}
11891189
1190func (cs *clientSessionSuite) TestStartFailsIfGetLevelsFails(c *C) {1190func (cs *ConcreteSessionSuite) TestStartFailsIfGetLevelsFails(c *C) {
1191 sess, err := NewSession("", dummyConf, "wah", cs.lvls, cs.log)1191 sess, err := newSession("", dummyConf, "wah", cs.lvls, cs.log)
1192 c.Assert(err, IsNil)1192 c.Assert(err, IsNil)
1193 sess.SeenState = &brokenSeenState{}1193 sess.SeenState = &brokenSeenState{}
1194 sess.Connection = &testConn{Name: "TestStartConnectMessageFails"}1194 sess.Connection = &testConn{Name: "TestStartConnectMessageFails"}
@@ -1207,8 +1207,8 @@
1207 c.Check(err, ErrorMatches, "broken.")1207 c.Check(err, ErrorMatches, "broken.")
1208}1208}
12091209
1210func (cs *clientSessionSuite) TestStartConnectMessageFails(c *C) {1210func (cs *ConcreteSessionSuite) TestStartConnectMessageFails(c *C) {
1211 sess, err := NewSession("", dummyConf, "wah", cs.lvls, cs.log)1211 sess, err := newSession("", dummyConf, "wah", cs.lvls, cs.log)
1212 c.Assert(err, IsNil)1212 c.Assert(err, IsNil)
1213 sess.Connection = &testConn{Name: "TestStartConnectMessageFails"}1213 sess.Connection = &testConn{Name: "TestStartConnectMessageFails"}
1214 errCh := make(chan error, 1)1214 errCh := make(chan error, 1)
@@ -1234,8 +1234,8 @@
1234 c.Check(sess.State(), Equals, Error)1234 c.Check(sess.State(), Equals, Error)
1235}1235}
12361236
1237func (cs *clientSessionSuite) TestStartConnackReadError(c *C) {1237func (cs *ConcreteSessionSuite) TestStartConnackReadError(c *C) {
1238 sess, err := NewSession("", dummyConf, "wah", cs.lvls, cs.log)1238 sess, err := newSession("", dummyConf, "wah", cs.lvls, cs.log)
1239 c.Assert(err, IsNil)1239 c.Assert(err, IsNil)
1240 sess.Connection = &testConn{Name: "TestStartConnackReadError"}1240 sess.Connection = &testConn{Name: "TestStartConnackReadError"}
1241 errCh := make(chan error, 1)1241 errCh := make(chan error, 1)
@@ -1258,8 +1258,8 @@
1258 c.Check(sess.State(), Equals, Error)1258 c.Check(sess.State(), Equals, Error)
1259}1259}
12601260
1261func (cs *clientSessionSuite) TestStartBadConnack(c *C) {1261func (cs *ConcreteSessionSuite) TestStartBadConnack(c *C) {
1262 sess, err := NewSession("", dummyConf, "wah", cs.lvls, cs.log)1262 sess, err := newSession("", dummyConf, "wah", cs.lvls, cs.log)
1263 c.Assert(err, IsNil)1263 c.Assert(err, IsNil)
1264 sess.Connection = &testConn{Name: "TestStartBadConnack"}1264 sess.Connection = &testConn{Name: "TestStartBadConnack"}
1265 errCh := make(chan error, 1)1265 errCh := make(chan error, 1)
@@ -1282,8 +1282,8 @@
1282 c.Check(sess.State(), Equals, Error)1282 c.Check(sess.State(), Equals, Error)
1283}1283}
12841284
1285func (cs *clientSessionSuite) TestStartNotConnack(c *C) {1285func (cs *ConcreteSessionSuite) TestStartNotConnack(c *C) {
1286 sess, err := NewSession("", dummyConf, "wah", cs.lvls, cs.log)1286 sess, err := newSession("", dummyConf, "wah", cs.lvls, cs.log)
1287 c.Assert(err, IsNil)1287 c.Assert(err, IsNil)
1288 sess.Connection = &testConn{Name: "TestStartBadConnack"}1288 sess.Connection = &testConn{Name: "TestStartBadConnack"}
1289 errCh := make(chan error, 1)1289 errCh := make(chan error, 1)
@@ -1306,7 +1306,7 @@
1306 c.Check(sess.State(), Equals, Error)1306 c.Check(sess.State(), Equals, Error)
1307}1307}
13081308
1309func (cs *clientSessionSuite) TestStartWorks(c *C) {1309func (cs *ConcreteSessionSuite) TestStartWorks(c *C) {
1310 info := map[string]interface{}{1310 info := map[string]interface{}{
1311 "foo": 1,1311 "foo": 1,
1312 "bar": "baz",1312 "bar": "baz",
@@ -1314,7 +1314,7 @@
1314 conf := ClientSessionConfig{1314 conf := ClientSessionConfig{
1315 Info: info,1315 Info: info,
1316 }1316 }
1317 sess, err := NewSession("", conf, "wah", cs.lvls, cs.log)1317 sess, err := newSession("", conf, "wah", cs.lvls, cs.log)
1318 c.Assert(err, IsNil)1318 c.Assert(err, IsNil)
1319 sess.Connection = &testConn{Name: "TestStartWorks"}1319 sess.Connection = &testConn{Name: "TestStartWorks"}
1320 sess.setCookie("COOKIE")1320 sess.setCookie("COOKIE")
@@ -1350,8 +1350,8 @@
1350 run() tests1350 run() tests
1351****************************************************************/1351****************************************************************/
13521352
1353func (cs *clientSessionSuite) TestRunBailsIfAuthCheckFails(c *C) {1353func (cs *ConcreteSessionSuite) TestRunBailsIfAuthCheckFails(c *C) {
1354 sess, err := NewSession("", dummyConf, "wah", cs.lvls, cs.log)1354 sess, err := newSession("", dummyConf, "wah", cs.lvls, cs.log)
1355 c.Assert(err, IsNil)1355 c.Assert(err, IsNil)
1356 failure := errors.New("TestRunBailsIfAuthCheckFails")1356 failure := errors.New("TestRunBailsIfAuthCheckFails")
1357 has_closed := false1357 has_closed := false
@@ -1366,8 +1366,8 @@
1366 c.Check(has_closed, Equals, true)1366 c.Check(has_closed, Equals, true)
1367}1367}
13681368
1369func (cs *clientSessionSuite) TestRunBailsIfHostGetterFails(c *C) {1369func (cs *ConcreteSessionSuite) TestRunBailsIfHostGetterFails(c *C) {
1370 sess, err := NewSession("", dummyConf, "wah", cs.lvls, cs.log)1370 sess, err := newSession("", dummyConf, "wah", cs.lvls, cs.log)
1371 c.Assert(err, IsNil)1371 c.Assert(err, IsNil)
1372 failure := errors.New("TestRunBailsIfHostGetterFails")1372 failure := errors.New("TestRunBailsIfHostGetterFails")
1373 has_closed := false1373 has_closed := false
@@ -1382,8 +1382,8 @@
1382 c.Check(has_closed, Equals, true)1382 c.Check(has_closed, Equals, true)
1383}1383}
13841384
1385func (cs *clientSessionSuite) TestRunBailsIfConnectFails(c *C) {1385func (cs *ConcreteSessionSuite) TestRunBailsIfConnectFails(c *C) {
1386 sess, err := NewSession("", dummyConf, "wah", cs.lvls, cs.log)1386 sess, err := newSession("", dummyConf, "wah", cs.lvls, cs.log)
1387 c.Assert(err, IsNil)1387 c.Assert(err, IsNil)
1388 failure := errors.New("TestRunBailsIfConnectFails")1388 failure := errors.New("TestRunBailsIfConnectFails")
1389 err = sess.run(1389 err = sess.run(
@@ -1396,8 +1396,8 @@
1396 c.Check(err, Equals, failure)1396 c.Check(err, Equals, failure)
1397}1397}
13981398
1399func (cs *clientSessionSuite) TestRunBailsIfStartFails(c *C) {1399func (cs *ConcreteSessionSuite) TestRunBailsIfStartFails(c *C) {
1400 sess, err := NewSession("", dummyConf, "wah", cs.lvls, cs.log)1400 sess, err := newSession("", dummyConf, "wah", cs.lvls, cs.log)
1401 c.Assert(err, IsNil)1401 c.Assert(err, IsNil)
1402 failure := errors.New("TestRunBailsIfStartFails")1402 failure := errors.New("TestRunBailsIfStartFails")
1403 err = sess.run(1403 err = sess.run(
@@ -1410,8 +1410,8 @@
1410 c.Check(err, Equals, failure)1410 c.Check(err, Equals, failure)
1411}1411}
14121412
1413func (cs *clientSessionSuite) TestRunRunsEvenIfLoopFails(c *C) {1413func (cs *ConcreteSessionSuite) TestRunRunsEvenIfLoopFails(c *C) {
1414 sess, err := NewSession("", dummyConf, "wah", cs.lvls, cs.log)1414 sess, err := newSession("", dummyConf, "wah", cs.lvls, cs.log)
1415 c.Assert(err, IsNil)1415 c.Assert(err, IsNil)
1416 // just to make a point: until here we haven't set ErrCh & BroadcastCh (no1416 // just to make a point: until here we haven't set ErrCh & BroadcastCh (no
1417 // biggie if this stops being true)1417 // biggie if this stops being true)
@@ -1441,8 +1441,8 @@
1441 Jitter() tests1441 Jitter() tests
1442****************************************************************/1442****************************************************************/
14431443
1444func (cs *clientSessionSuite) TestJitter(c *C) {1444func (cs *ConcreteSessionSuite) TestJitter(c *C) {
1445 sess, err := NewSession("", dummyConf, "wah", cs.lvls, cs.log)1445 sess, err := newSession("", dummyConf, "wah", cs.lvls, cs.log)
1446 c.Assert(err, IsNil)1446 c.Assert(err, IsNil)
1447 num_tries := 20 // should do the math1447 num_tries := 20 // should do the math
1448 spread := time.Second //1448 spread := time.Second //
@@ -1472,9 +1472,9 @@
1472 Dial() tests1472 Dial() tests
1473****************************************************************/1473****************************************************************/
14741474
1475func (cs *clientSessionSuite) TestDialPanics(c *C) {1475func (cs *ConcreteSessionSuite) TestDialPanics(c *C) {
1476 // one last unhappy test1476 // one last unhappy test
1477 sess, err := NewSession("", dummyConf, "wah", cs.lvls, cs.log)1477 sess, err := newSession("", dummyConf, "wah", cs.lvls, cs.log)
1478 c.Assert(err, IsNil)1478 c.Assert(err, IsNil)
1479 sess.Protocolator = nil1479 sess.Protocolator = nil
1480 c.Check(sess.Dial, PanicMatches, ".*protocol constructor.")1480 c.Check(sess.Dial, PanicMatches, ".*protocol constructor.")
@@ -1488,7 +1488,7 @@
1488 }1488 }
1489)1489)
14901490
1491func (cs *clientSessionSuite) TestDialBadServerName(c *C) {1491func (cs *ConcreteSessionSuite) TestDialBadServerName(c *C) {
1492 // a borked server name1492 // a borked server name
1493 lst, err := tls.Listen("tcp", "localhost:0", helpers.TestTLSServerConfig)1493 lst, err := tls.Listen("tcp", "localhost:0", helpers.TestTLSServerConfig)
1494 c.Assert(err, IsNil)1494 c.Assert(err, IsNil)
@@ -1506,7 +1506,7 @@
1506 }))1506 }))
1507 defer ts.Close()1507 defer ts.Close()
15081508
1509 sess, err := NewSession(ts.URL, dialTestConf, "wah", cs.lvls, cs.log)1509 sess, err := newSession(ts.URL, dialTestConf, "wah", cs.lvls, cs.log)
1510 c.Assert(err, IsNil)1510 c.Assert(err, IsNil)
1511 tconn := &testConn{}1511 tconn := &testConn{}
1512 sess.Connection = tconn1512 sess.Connection = tconn
@@ -1533,7 +1533,7 @@
1533 c.Check(sess.State(), Equals, Error)1533 c.Check(sess.State(), Equals, Error)
1534}1534}
15351535
1536func (cs *clientSessionSuite) TestDialWorks(c *C) {1536func (cs *ConcreteSessionSuite) TestDialWorks(c *C) {
1537 // happy path thoughts1537 // happy path thoughts
1538 lst, err := tls.Listen("tcp", "localhost:0", helpers.TestTLSServerConfig)1538 lst, err := tls.Listen("tcp", "localhost:0", helpers.TestTLSServerConfig)
1539 c.Assert(err, IsNil)1539 c.Assert(err, IsNil)
@@ -1551,7 +1551,7 @@
1551 }))1551 }))
1552 defer ts.Close()1552 defer ts.Close()
15531553
1554 sess, err := NewSession(ts.URL, dialTestConf, "wah", cs.lvls, cs.log)1554 sess, err := newSession(ts.URL, dialTestConf, "wah", cs.lvls, cs.log)
1555 c.Assert(err, IsNil)1555 c.Assert(err, IsNil)
1556 tconn := &testConn{CloseCondition: condition.Fail2Work(10)}1556 tconn := &testConn{CloseCondition: condition.Fail2Work(10)}
1557 sess.Connection = tconn1557 sess.Connection = tconn
@@ -1634,11 +1634,11 @@
1634 c.Check(<-sess.ErrCh, Equals, failure)1634 c.Check(<-sess.ErrCh, Equals, failure)
1635}1635}
16361636
1637func (cs *clientSessionSuite) TestDialWorksDirect(c *C) {1637func (cs *ConcreteSessionSuite) TestDialWorksDirect(c *C) {
1638 // happy path thoughts1638 // happy path thoughts
1639 lst, err := tls.Listen("tcp", "localhost:0", helpers.TestTLSServerConfig)1639 lst, err := tls.Listen("tcp", "localhost:0", helpers.TestTLSServerConfig)
1640 c.Assert(err, IsNil)1640 c.Assert(err, IsNil)
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)
1642 c.Assert(err, IsNil)1642 c.Assert(err, IsNil)
1643 defer sess.Close()1643 defer sess.Close()
16441644
@@ -1658,8 +1658,8 @@
1658 redialDelay() tests1658 redialDelay() tests
1659****************************************************************/1659****************************************************************/
16601660
1661func (cs *clientSessionSuite) TestShouldDelay(c *C) {1661func (cs *ConcreteSessionSuite) TestShouldDelay(c *C) {
1662 sess, err := NewSession("foo:443", dummyConf, "", cs.lvls, cs.log)1662 sess, err := newSession("foo:443", dummyConf, "", cs.lvls, cs.log)
1663 c.Assert(err, IsNil)1663 c.Assert(err, IsNil)
1664 c.Check(sess.ShouldDelay(), Equals, false)1664 c.Check(sess.ShouldDelay(), Equals, false)
1665 sess.setShouldDelay()1665 sess.setShouldDelay()
@@ -1668,8 +1668,8 @@
1668 c.Check(sess.ShouldDelay(), Equals, false)1668 c.Check(sess.ShouldDelay(), Equals, false)
1669}1669}
16701670
1671func (cs *clientSessionSuite) TestRedialDelay(c *C) {1671func (cs *ConcreteSessionSuite) TestRedialDelay(c *C) {
1672 sess, err := NewSession("foo:443", dummyConf, "", cs.lvls, cs.log)1672 sess, err := newSession("foo:443", dummyConf, "", cs.lvls, cs.log)
1673 c.Assert(err, IsNil)1673 c.Assert(err, IsNil)
1674 sess.redialDelays = []time.Duration{17, 42}1674 sess.redialDelays = []time.Duration{17, 42}
1675 n := 01675 n := 0
@@ -1693,8 +1693,8 @@
1693 ClearCookie() tests1693 ClearCookie() tests
1694****************************************************************/1694****************************************************************/
16951695
1696func (cs *clientSessionSuite) TestClearCookie(c *C) {1696func (cs *ConcreteSessionSuite) TestClearCookie(c *C) {
1697 sess, err := NewSession("foo:443", dummyConf, "", cs.lvls, cs.log)1697 sess, err := newSession("foo:443", dummyConf, "", cs.lvls, cs.log)
1698 c.Assert(err, IsNil)1698 c.Assert(err, IsNil)
1699 c.Check(sess.getCookie(), Equals, "")1699 c.Check(sess.getCookie(), Equals, "")
1700 sess.setCookie("COOKIE")1700 sess.setCookie("COOKIE")

Subscribers

People subscribed via source and target branches