Merge lp:~pedronis/ubuntu-push/pluggable-tracker into lp:ubuntu-push

Proposed by Samuele Pedroni
Status: Merged
Approved by: Samuele Pedroni
Approved revision: 47
Merged at revision: 45
Proposed branch: lp:~pedronis/ubuntu-push/pluggable-tracker
Merge into: lp:ubuntu-push
Prerequisite: lp:~pedronis/ubuntu-push/acceptanceclient-flags
Diff against target: 367 lines (+153/-80)
5 files modified
server/dev/server.go (+2/-1)
server/session/session.go (+7/-33)
server/session/session_test.go (+12/-46)
server/session/tracker.go (+66/-0)
server/session/tracker_test.go (+66/-0)
To merge this branch: bzr merge lp:~pedronis/ubuntu-push/pluggable-tracker
Reviewer Review Type Date Requested Status
John Lenton (community) Approve
Review via email: mp+201652@code.launchpad.net

Commit message

make the tracker used by the session for logging pluggable

Description of the change

make the tracker used by the session for logging pluggable

To post a comment you must log in.
Revision history for this message
John Lenton (chipaca) wrote :

Nice one.

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'server/dev/server.go'
2--- server/dev/server.go 2014-01-13 15:21:11 +0000
3+++ server/dev/server.go 2014-01-14 19:07:52 +0000
4@@ -69,7 +69,8 @@
5 }
6 logger.Infof("listening for devices on %v", lst.Addr())
7 err = lst.AcceptLoop(func(conn net.Conn) error {
8- return session.Session(conn, broker, cfg, logger)
9+ track := session.NewTracker(logger)
10+ return session.Session(conn, broker, cfg, track)
11 }, logger)
12 if err != nil {
13 logger.Fatalf("accepting device connections: %v", err)
14
15=== modified file 'server/session/session.go'
16--- server/session/session.go 2014-01-14 19:07:52 +0000
17+++ server/session/session.go 2014-01-14 19:07:52 +0000
18@@ -18,7 +18,6 @@
19 package session
20
21 import (
22- "launchpad.net/ubuntu-push/logger"
23 "launchpad.net/ubuntu-push/protocol"
24 "launchpad.net/ubuntu-push/server/broker"
25 "net"
26@@ -109,48 +108,23 @@
27 }
28 }
29
30-var sessionsEpoch = time.Date(2013, 1, 1, 0, 0, 0, 0, time.UTC).UnixNano()
31-
32-// sessionTracker logs session events.
33-type sessionTracker struct {
34- logger.Logger
35- sessionId int64 // xxx use timeuuid later
36-}
37-
38-func (trk *sessionTracker) start(conn interface {
39- RemoteAddr() net.Addr
40-}) {
41- trk.sessionId = time.Now().UnixNano() - sessionsEpoch
42- trk.Debugf("session(%x) connected %v", trk.sessionId, conn.RemoteAddr())
43-}
44-
45-func (trk *sessionTracker) registered(sess broker.BrokerSession) {
46- trk.Infof("session(%x) registered %v", trk.sessionId, sess.DeviceId())
47-}
48-
49-func (trk *sessionTracker) end(err error) error {
50- trk.Debugf("session(%x) ended with: %v", trk.sessionId, err)
51- return err
52-}
53-
54 // Session manages the session with a client.
55-func Session(conn net.Conn, brkr broker.Broker, cfg SessionConfig, logger logger.Logger) error {
56+func Session(conn net.Conn, brkr broker.Broker, cfg SessionConfig, track SessionTracker) error {
57 defer conn.Close()
58- track := sessionTracker{Logger: logger}
59- track.start(conn)
60+ track.Start(conn)
61 v, err := protocol.ReadWireFormatVersion(conn, cfg.ExchangeTimeout())
62 if err != nil {
63- return track.end(err)
64+ return track.End(err)
65 }
66 if v != protocol.ProtocolWireVersion {
67- return track.end(&broker.ErrAbort{"unexpected wire format version"})
68+ return track.End(&broker.ErrAbort{"unexpected wire format version"})
69 }
70 proto := protocol.NewProtocol0(conn)
71 sess, err := sessionStart(proto, brkr, cfg)
72 if err != nil {
73- return track.end(err)
74+ return track.End(err)
75 }
76- track.registered(sess)
77+ track.Registered(sess)
78 defer brkr.Unregister(sess)
79- return track.end(sessionLoop(proto, sess, cfg))
80+ return track.End(sessionLoop(proto, sess, cfg))
81 }
82
83=== modified file 'server/session/session_test.go'
84--- server/session/session_test.go 2014-01-13 15:21:11 +0000
85+++ server/session/session_test.go 2014-01-14 19:07:52 +0000
86@@ -423,42 +423,6 @@
87 c.Check(err, Equals, io.EOF)
88 }
89
90-type testRemoteAddrable struct{}
91-
92-func (tra *testRemoteAddrable) RemoteAddr() net.Addr {
93- return &net.TCPAddr{net.IPv4(127, 0, 0, 1), 9999, ""}
94-}
95-
96-func (s *sessionSuite) TestSessionTrackStart(c *C) {
97- buf := &bytes.Buffer{}
98- logger := logger.NewSimpleLogger(buf, "debug")
99- track := sessionTracker{Logger: logger}
100- track.start(&testRemoteAddrable{})
101- c.Check(track.sessionId, Not(Equals), 0)
102- regExpected := fmt.Sprintf(`.* DEBUG session\(%x\) connected 127\.0\.0\.1:9999\n`, track.sessionId)
103- c.Check(buf.String(), Matches, regExpected)
104-}
105-
106-func (s *sessionSuite) TestSessionTrackRegistered(c *C) {
107- buf := &bytes.Buffer{}
108- logger := logger.NewSimpleLogger(buf, "debug")
109- track := sessionTracker{Logger: logger}
110- track.start(&testRemoteAddrable{})
111- track.registered(&testBrokerSession{deviceId: "DEV-ID"})
112- regExpected := fmt.Sprintf(`.*connected.*\n.* INFO session\(%x\) registered DEV-ID\n`, track.sessionId)
113- c.Check(buf.String(), Matches, regExpected)
114-}
115-
116-func (s *sessionSuite) TestSessionTrackEnd(c *C) {
117- buf := &bytes.Buffer{}
118- logger := logger.NewSimpleLogger(buf, "debug")
119- track := sessionTracker{Logger: logger}
120- track.start(&testRemoteAddrable{})
121- track.end(&broker.ErrAbort{})
122- regExpected := fmt.Sprintf(`.*connected.*\n.* DEBUG session\(%x\) ended with: session aborted \(\)\n`, track.sessionId)
123- c.Check(buf.String(), Matches, regExpected)
124-}
125-
126 func serverClientWire() (srv net.Conn, cli net.Conn, lst net.Listener) {
127 lst, err := net.Listen("tcp", "127.0.0.1:0")
128 if err != nil {
129@@ -504,14 +468,14 @@
130
131 func (s *sessionSuite) TestSessionWire(c *C) {
132 buf := &bytes.Buffer{}
133- logger := logger.NewSimpleLogger(buf, "debug")
134+ track := NewTracker(logger.NewSimpleLogger(buf, "debug"))
135 errCh := make(chan error, 1)
136 srv, cli, lst := serverClientWire()
137 defer lst.Close()
138 remSrv := &rememberDeadlineConn{srv, make([]string, 0, 2)}
139 brkr := newTestBroker()
140 go func() {
141- errCh <- Session(remSrv, brkr, cfg5msPingInterval, logger)
142+ errCh <- Session(remSrv, brkr, cfg5msPingInterval, track)
143 }()
144 io.WriteString(cli, "\x00")
145 io.WriteString(cli, "\x00\x20{\"T\":\"connect\",\"DeviceId\":\"DEV\"}")
146@@ -531,13 +495,14 @@
147 }
148
149 func (s *sessionSuite) TestSessionWireTimeout(c *C) {
150+ nopTrack := NewTracker(nopLogger)
151 errCh := make(chan error, 1)
152 srv, cli, lst := serverClientWire()
153 defer lst.Close()
154 remSrv := &rememberDeadlineConn{srv, make([]string, 0, 2)}
155 brkr := newTestBroker()
156 go func() {
157- errCh <- Session(remSrv, brkr, cfg5msPingInterval2msExchangeTout, nopLogger)
158+ errCh <- Session(remSrv, brkr, cfg5msPingInterval2msExchangeTout, nopTrack)
159 }()
160 err := <-errCh
161 c.Check(err, FitsTypeOf, &net.OpError{})
162@@ -547,13 +512,13 @@
163
164 func (s *sessionSuite) TestSessionWireWrongVersion(c *C) {
165 buf := &bytes.Buffer{}
166- logger := logger.NewSimpleLogger(buf, "debug")
167+ track := NewTracker(logger.NewSimpleLogger(buf, "debug"))
168 errCh := make(chan error, 1)
169 srv, cli, lst := serverClientWire()
170 defer lst.Close()
171 brkr := newTestBroker()
172 go func() {
173- errCh <- Session(srv, brkr, cfg5msPingInterval, logger)
174+ errCh <- Session(srv, brkr, cfg5msPingInterval, track)
175 }()
176 io.WriteString(cli, "\x10")
177 err := <-errCh
178@@ -566,13 +531,13 @@
179
180 func (s *sessionSuite) TestSessionWireEarlyClose(c *C) {
181 buf := &bytes.Buffer{}
182- logger := logger.NewSimpleLogger(buf, "debug")
183+ track := NewTracker(logger.NewSimpleLogger(buf, "debug"))
184 errCh := make(chan error, 1)
185 srv, cli, lst := serverClientWire()
186 defer lst.Close()
187 brkr := newTestBroker()
188 go func() {
189- errCh <- Session(srv, brkr, cfg5msPingInterval, logger)
190+ errCh <- Session(srv, brkr, cfg5msPingInterval, track)
191 }()
192 cli.Close()
193 err := <-errCh
194@@ -584,13 +549,13 @@
195
196 func (s *sessionSuite) TestSessionWireEarlyClose2(c *C) {
197 buf := &bytes.Buffer{}
198- logger := logger.NewSimpleLogger(buf, "debug")
199+ track := NewTracker(logger.NewSimpleLogger(buf, "debug"))
200 errCh := make(chan error, 1)
201 srv, cli, lst := serverClientWire()
202 defer lst.Close()
203 brkr := newTestBroker()
204 go func() {
205- errCh <- Session(srv, brkr, cfg5msPingInterval, logger)
206+ errCh <- Session(srv, brkr, cfg5msPingInterval, track)
207 }()
208 io.WriteString(cli, "\x00")
209 io.WriteString(cli, "\x00")
210@@ -602,13 +567,14 @@
211 }
212
213 func (s *sessionSuite) TestSessionWireTimeout2(c *C) {
214+ nopTrack := NewTracker(nopLogger)
215 errCh := make(chan error, 1)
216 srv, cli, lst := serverClientWire()
217 defer lst.Close()
218 remSrv := &rememberDeadlineConn{srv, make([]string, 0, 2)}
219 brkr := newTestBroker()
220 go func() {
221- errCh <- Session(remSrv, brkr, cfg5msPingInterval2msExchangeTout, nopLogger)
222+ errCh <- Session(remSrv, brkr, cfg5msPingInterval2msExchangeTout, nopTrack)
223 }()
224 io.WriteString(cli, "\x00")
225 io.WriteString(cli, "\x00")
226
227=== added file 'server/session/tracker.go'
228--- server/session/tracker.go 1970-01-01 00:00:00 +0000
229+++ server/session/tracker.go 2014-01-14 19:07:52 +0000
230@@ -0,0 +1,66 @@
231+/*
232+ Copyright 2013-2014 Canonical Ltd.
233+
234+ This program is free software: you can redistribute it and/or modify it
235+ under the terms of the GNU General Public License version 3, as published
236+ by the Free Software Foundation.
237+
238+ This program is distributed in the hope that it will be useful, but
239+ WITHOUT ANY WARRANTY; without even the implied warranties of
240+ MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR
241+ PURPOSE. See the GNU General Public License for more details.
242+
243+ You should have received a copy of the GNU General Public License along
244+ with this program. If not, see <http://www.gnu.org/licenses/>.
245+*/
246+
247+package session
248+
249+import (
250+ "launchpad.net/ubuntu-push/logger"
251+ "launchpad.net/ubuntu-push/server/broker"
252+ "net"
253+ "time"
254+)
255+
256+// SessionTracker logs session events.
257+type SessionTracker interface {
258+ logger.Logger
259+ // Session got started.
260+ Start(WithRemoteAddr)
261+ // Session got registered with broker as sess BrokerSession.
262+ Registered(sess broker.BrokerSession)
263+ // Session got ended with error err (can be nil).
264+ End(error) error
265+}
266+
267+// WithRemoteAddr can report a remote address.
268+type WithRemoteAddr interface {
269+ RemoteAddr() net.Addr
270+}
271+
272+var sessionsEpoch = time.Date(2013, 1, 1, 0, 0, 0, 0, time.UTC).UnixNano()
273+
274+// Tracker implements SessionTracker simply.
275+type tracker struct {
276+ logger.Logger
277+ sessionId int64 // xxx use timeuuid later
278+}
279+
280+func NewTracker(logger logger.Logger) SessionTracker {
281+ return &tracker{Logger: logger}
282+}
283+
284+func (trk *tracker) Start(conn WithRemoteAddr) {
285+ trk.sessionId = time.Now().UnixNano() - sessionsEpoch
286+ trk.Debugf("session(%x) connected %v", trk.sessionId, conn.RemoteAddr())
287+}
288+
289+func (trk *tracker) Registered(sess broker.BrokerSession) {
290+ trk.Infof("session(%x) registered %v", trk.sessionId, sess.DeviceId())
291+}
292+
293+func (trk *tracker) End(err error) error {
294+ trk.Debugf("session(%x) ended with: %v", trk.sessionId, err)
295+ return err
296+}
297
298=== added file 'server/session/tracker_test.go'
299--- server/session/tracker_test.go 1970-01-01 00:00:00 +0000
300+++ server/session/tracker_test.go 2014-01-14 19:07:52 +0000
301@@ -0,0 +1,66 @@
302+/*
303+ Copyright 2013-2014 Canonical Ltd.
304+
305+ This program is free software: you can redistribute it and/or modify it
306+ under the terms of the GNU General Public License version 3, as published
307+ by the Free Software Foundation.
308+
309+ This program is distributed in the hope that it will be useful, but
310+ WITHOUT ANY WARRANTY; without even the implied warranties of
311+ MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR
312+ PURPOSE. See the GNU General Public License for more details.
313+
314+ You should have received a copy of the GNU General Public License along
315+ with this program. If not, see <http://www.gnu.org/licenses/>.
316+*/
317+
318+package session
319+
320+import (
321+ "bytes"
322+ "fmt"
323+ . "launchpad.net/gocheck"
324+ "launchpad.net/ubuntu-push/logger"
325+ "launchpad.net/ubuntu-push/server/broker"
326+ "net"
327+)
328+
329+type trackerSuite struct{}
330+
331+var _ = Suite(&trackerSuite{})
332+
333+type testRemoteAddrable struct{}
334+
335+func (tra *testRemoteAddrable) RemoteAddr() net.Addr {
336+ return &net.TCPAddr{net.IPv4(127, 0, 0, 1), 9999, ""}
337+}
338+
339+func (s *sessionSuite) TestSessionTrackStart(c *C) {
340+ buf := &bytes.Buffer{}
341+ logger := logger.NewSimpleLogger(buf, "debug")
342+ track := NewTracker(logger)
343+ track.Start(&testRemoteAddrable{})
344+ c.Check(track.(*tracker).sessionId, Not(Equals), 0)
345+ regExpected := fmt.Sprintf(`.* DEBUG session\(%x\) connected 127\.0\.0\.1:9999\n`, track.(*tracker).sessionId)
346+ c.Check(buf.String(), Matches, regExpected)
347+}
348+
349+func (s *sessionSuite) TestSessionTrackRegistered(c *C) {
350+ buf := &bytes.Buffer{}
351+ logger := logger.NewSimpleLogger(buf, "debug")
352+ track := NewTracker(logger)
353+ track.Start(&testRemoteAddrable{})
354+ track.Registered(&testBrokerSession{deviceId: "DEV-ID"})
355+ regExpected := fmt.Sprintf(`.*connected.*\n.* INFO session\(%x\) registered DEV-ID\n`, track.(*tracker).sessionId)
356+ c.Check(buf.String(), Matches, regExpected)
357+}
358+
359+func (s *sessionSuite) TestSessionTrackEnd(c *C) {
360+ buf := &bytes.Buffer{}
361+ logger := logger.NewSimpleLogger(buf, "debug")
362+ track := NewTracker(logger)
363+ track.Start(&testRemoteAddrable{})
364+ track.End(&broker.ErrAbort{})
365+ regExpected := fmt.Sprintf(`.*connected.*\n.* DEBUG session\(%x\) ended with: session aborted \(\)\n`, track.(*tracker).sessionId)
366+ c.Check(buf.String(), Matches, regExpected)
367+}

Subscribers

People subscribed via source and target branches