Merge lp:~chipaca/ubuntu-push/nm-primary-connection into lp:ubuntu-push

Proposed by John Lenton
Status: Superseded
Proposed branch: lp:~chipaca/ubuntu-push/nm-primary-connection
Merge into: lp:ubuntu-push
Diff against target: 194 lines (+124/-4)
3 files modified
bus/endpoint.go (+5/-1)
bus/networkmanager/networkmanager.go (+50/-1)
bus/networkmanager/networkmanager_test.go (+69/-2)
To merge this branch: bzr merge lp:~chipaca/ubuntu-push/nm-primary-connection
Reviewer Review Type Date Requested Status
Ubuntu Push Hackers Pending
Review via email: mp+213520@code.launchpad.net

This proposal has been superseded by a proposal from 2014-04-01.

Description of the change

Add the bits to NetworkManager to track the PrimaryConnection.

Also caught a bug in a test of GetState, and fixed it.

To post a comment you must log in.
95. By John Lenton

added a couple more tests to WatchPrimaryConnection

96. By John Lenton

whoops, test name clash

97. By John Lenton

changes *of* PrimaryConnection, not changes *to* it. I think.

Unmerged revisions

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'bus/endpoint.go'
--- bus/endpoint.go 2014-02-21 16:17:28 +0000
+++ bus/endpoint.go 2014-03-31 17:25:45 +0000
@@ -175,7 +175,11 @@
175175
176// unpackOneMsg unpacks the value from the response msg176// unpackOneMsg unpacks the value from the response msg
177func (endp *endpoint) unpackOneMsg(msg *dbus.Message, member string) []interface{} {177func (endp *endpoint) unpackOneMsg(msg *dbus.Message, member string) []interface{} {
178 return msg.AllArgs()178 var varmap map[string]dbus.Variant
179 if err := msg.Args(&varmap); err != nil {
180 return msg.AllArgs()
181 }
182 return []interface{}{varmap}
179}183}
180184
181// unpackMessages unpacks the value from the watch185// unpackMessages unpacks the value from the watch
182186
=== modified file 'bus/networkmanager/networkmanager.go'
--- bus/networkmanager/networkmanager.go 2014-01-21 13:21:19 +0000
+++ bus/networkmanager/networkmanager.go 2014-03-31 17:25:45 +0000
@@ -20,6 +20,8 @@
20package networkmanager20package networkmanager
2121
22import (22import (
23 "launchpad.net/go-dbus/v1"
24
23 "launchpad.net/ubuntu-push/bus"25 "launchpad.net/ubuntu-push/bus"
24 "launchpad.net/ubuntu-push/logger"26 "launchpad.net/ubuntu-push/logger"
25)27)
@@ -41,6 +43,12 @@
41 // WatchState listens for changes to NetworkManager's state, and sends43 // WatchState listens for changes to NetworkManager's state, and sends
42 // them out over the channel returned.44 // them out over the channel returned.
43 WatchState() (<-chan State, error)45 WatchState() (<-chan State, error)
46 // GetPrimaryConnection fetches and returns NetworkManager's current
47 // primary connection.
48 GetPrimaryConnection() string
49 // WatchPrimaryConnection listens for changes to NetworkManager's
50 // Primary Connection, and sends it out over the channel returned.
51 WatchPrimaryConnection() (<-chan string, error)
44}52}
4553
46type networkManager struct {54type networkManager struct {
@@ -68,7 +76,13 @@
68 return Unknown76 return Unknown
69 }77 }
7078
71 return State(s.(uint32))79 v, ok := s.(uint32)
80 if !ok {
81 nm.log.Errorf("Got weird state: %#v", s)
82 return Unknown
83 }
84
85 return State(v)
72}86}
7387
74func (nm *networkManager) WatchState() (<-chan State, error) {88func (nm *networkManager) WatchState() (<-chan State, error) {
@@ -83,3 +97,38 @@
8397
84 return ch, nil98 return ch, nil
85}99}
100
101func (nm *networkManager) GetPrimaryConnection() string {
102 s, err := nm.bus.GetProperty("PrimaryConnection")
103 if err != nil {
104 nm.log.Errorf("Failed gettting current primary connection: %s", err)
105 nm.log.Debugf("Defaulting primary connection to empty")
106 return ""
107 }
108
109 v, ok := s.(dbus.ObjectPath)
110 if !ok {
111 nm.log.Errorf("got weird PrimaryConnection: %#v", s)
112 return ""
113 }
114
115 return string(v)
116}
117
118func (nm *networkManager) WatchPrimaryConnection() (<-chan string, error) {
119 ch := make(chan string)
120 err := nm.bus.WatchSignal("PropertiesChanged",
121 func(ppsi ...interface{}) {
122 pps := ppsi[0].(map[string]dbus.Variant)
123 v, ok := pps["PrimaryConnection"]
124 if ok {
125 ch <- string(v.Value.(dbus.ObjectPath))
126 }
127 }, func() { close(ch) })
128 if err != nil {
129 nm.log.Debugf("Failed to set up the watch: %s", err)
130 return nil, err
131 }
132
133 return ch, nil
134}
86135
=== modified file 'bus/networkmanager/networkmanager_test.go'
--- bus/networkmanager/networkmanager_test.go 2014-02-05 18:17:26 +0000
+++ bus/networkmanager/networkmanager_test.go 2014-03-31 17:25:45 +0000
@@ -17,12 +17,15 @@
17package networkmanager17package networkmanager
1818
19import (19import (
20 "testing"
21
22 "launchpad.net/go-dbus/v1"
20 . "launchpad.net/gocheck"23 . "launchpad.net/gocheck"
24
21 testingbus "launchpad.net/ubuntu-push/bus/testing"25 testingbus "launchpad.net/ubuntu-push/bus/testing"
22 "launchpad.net/ubuntu-push/logger"26 "launchpad.net/ubuntu-push/logger"
23 helpers "launchpad.net/ubuntu-push/testing"27 helpers "launchpad.net/ubuntu-push/testing"
24 "launchpad.net/ubuntu-push/testing/condition"28 "launchpad.net/ubuntu-push/testing/condition"
25 "testing"
26)29)
2730
28// hook up gocheck31// hook up gocheck
@@ -71,7 +74,7 @@
7174
72// GetState returns the right state when dbus works but delivers rubbish values75// GetState returns the right state when dbus works but delivers rubbish values
73func (s *NMSuite) TestGetStateRubbishValues(c *C) {76func (s *NMSuite) TestGetStateRubbishValues(c *C) {
74 nm := New(testingbus.NewTestingEndpoint(nil, condition.Work(false), 42), s.log)77 nm := New(testingbus.NewTestingEndpoint(nil, condition.Work(true), "Unknown"), s.log)
75 state := nm.GetState()78 state := nm.GetState()
76 c.Check(state, Equals, Unknown)79 c.Check(state, Equals, Unknown)
77}80}
@@ -109,3 +112,67 @@
109 _, ok := <-ch112 _, ok := <-ch
110 c.Check(ok, Equals, false)113 c.Check(ok, Equals, false)
111}114}
115
116// GetPrimaryConnection returns the right state when everything works
117func (s *NMSuite) TestGetPrimaryConnection(c *C) {
118 nm := New(testingbus.NewTestingEndpoint(nil, condition.Work(true), dbus.ObjectPath("/a/1")), s.log)
119 con := nm.GetPrimaryConnection()
120 c.Check(con, Equals, "/a/1")
121}
122
123// GetPrimaryConnection returns the right state when dbus fails
124func (s *NMSuite) TestGetPrimaryConnectionFail(c *C) {
125 nm := New(testingbus.NewTestingEndpoint(nil, condition.Work(false)), s.log)
126 con := nm.GetPrimaryConnection()
127 c.Check(con, Equals, "")
128}
129
130// GetPrimaryConnection returns the right state when dbus works but delivers rubbish values
131func (s *NMSuite) TestGetPrimaryConnectionRubbishValues(c *C) {
132 nm := New(testingbus.NewTestingEndpoint(nil, condition.Work(true), "broken"), s.log)
133 con := nm.GetPrimaryConnection()
134 c.Check(con, Equals, "")
135}
136
137// GetPrimaryConnection returns the right state when dbus works but delivers a rubbish structure
138func (s *NMSuite) TestGetPrimaryConnectionRubbishStructure(c *C) {
139 nm := New(testingbus.NewMultiValuedTestingEndpoint(nil, condition.Work(true), []interface{}{}), s.log)
140 con := nm.GetPrimaryConnection()
141 c.Check(con, Equals, "")
142}
143
144func mkPriConMap(priCon string) map[string]dbus.Variant {
145 m := make(map[string]dbus.Variant)
146 m["PrimaryConnection"] = dbus.Variant{dbus.ObjectPath(priCon)}
147 return m
148}
149
150// WatchPrimaryConnection sends a stream of Connections over the channel
151func (s *NMSuite) TestWatchPrimaryConnection(c *C) {
152 tc := testingbus.NewTestingEndpoint(nil, condition.Work(true),
153 mkPriConMap("/a/1"),
154 mkPriConMap("/b/2"),
155 mkPriConMap("/c/3"))
156 nm := New(tc, s.log)
157 ch, err := nm.WatchPrimaryConnection()
158 c.Check(err, IsNil)
159 l := []string{<-ch, <-ch, <-ch}
160 c.Check(l, DeepEquals, []string{"/a/1", "/b/2", "/c/3"})
161}
162
163// WatchPrimaryConnection returns on error if the dbus call fails
164func (s *NMSuite) TestWatchPrimaryConnectionFails(c *C) {
165 nm := New(testingbus.NewTestingEndpoint(nil, condition.Work(false)), s.log)
166 _, err := nm.WatchPrimaryConnection()
167 c.Check(err, NotNil)
168}
169
170// WatchPrimaryConnection calls close on its channel when the watch bails
171func (s *NMSuite) TestWatchClosesOnWatchBail(c *C) {
172 tc := testingbus.NewTestingEndpoint(nil, condition.Work(true))
173 nm := New(tc, s.log)
174 ch, err := nm.WatchPrimaryConnection()
175 c.Check(err, IsNil)
176 _, ok := <-ch
177 c.Check(ok, Equals, false)
178}

Subscribers

People subscribed via source and target branches