Merge lp:~free.ekanayaka/landscape-client/mockify-lib-network-tests into lp:~landscape/landscape-client/trunk

Proposed by Free Ekanayaka
Status: Merged
Approved by: Free Ekanayaka
Approved revision: 844
Merged at revision: 848
Proposed branch: lp:~free.ekanayaka/landscape-client/mockify-lib-network-tests
Merge into: lp:~landscape/landscape-client/trunk
Diff against target: 287 lines (+89/-97)
1 file modified
landscape/lib/tests/test_network.py (+89/-97)
To merge this branch: bzr merge lp:~free.ekanayaka/landscape-client/mockify-lib-network-tests
Reviewer Review Type Date Requested Status
Chad Smith Approve
🤖 Landscape Builder test results Approve
Chris Glass (community) Approve
Review via email: mp+297492@code.launchpad.net

Commit message

Migrate landscape.lib.tests.test_network from mocker to mock.

Description of the change

Migrate landscape.lib.tests.test_network from mocker to mock.

To post a comment you must log in.
Revision history for this message
Chris Glass (tribaal) wrote :

+1

review: Approve
Revision history for this message
🤖 Landscape Builder (landscape-builder) :
review: Abstain (executing tests)
Revision history for this message
🤖 Landscape Builder (landscape-builder) wrote :
review: Approve (test results)
Revision history for this message
Chad Smith (chad.smith) :
Revision history for this message
Chad Smith (chad.smith) wrote :

+1 with nits.

review: Approve
Revision history for this message
Free Ekanayaka (free.ekanayaka) :
844. By Free Ekanayaka

Address review comments

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'landscape/lib/tests/test_network.py'
2--- landscape/lib/tests/test_network.py 2013-05-20 07:57:13 +0000
3+++ landscape/lib/tests/test_network.py 2016-06-15 17:38:36 +0000
4@@ -1,29 +1,27 @@
5 import array
6+import socket
7+
8+from mock import patch, ANY
9+
10 from cStringIO import StringIO
11-import socket
12 from subprocess import Popen, PIPE
13 from landscape.tests.helpers import LandscapeTest
14
15 from landscape.lib.network import (
16 get_network_traffic, get_active_device_info, get_active_interfaces,
17 get_fqdn, get_network_interface_speed)
18-from landscape.tests.mocker import ANY
19
20
21 class NetworkInfoTest(LandscapeTest):
22
23- def test_get_active_device_info(self):
24+ @patch("landscape.lib.network.get_network_interface_speed")
25+ def test_get_active_device_info(self, mock_get_network_interface_speed):
26 """
27 Device info returns a sequence of information about active
28 network devices, compare and verify the output against
29 that returned by ifconfig.
30 """
31- mock_get_network_interface_speed = self.mocker.replace(
32- get_network_interface_speed)
33- mock_get_network_interface_speed(ANY, ANY)
34- self.mocker.result((100, True))
35- self.mocker.count(min=1, max=None)
36- self.mocker.replay()
37+ mock_get_network_interface_speed.return_value = (100, True)
38
39 device_info = get_active_device_info()
40 result = Popen(["/sbin/ifconfig"], stdout=PIPE).communicate()[0]
41@@ -52,35 +50,37 @@
42 self.assertEqual(100, device["speed"])
43 self.assertEqual(True, device["duplex"])
44
45+ self.assertTrue(mock_get_network_interface_speed.call_count >= 1)
46+ mock_get_network_interface_speed.assert_called_with(ANY, ANY)
47+
48 def test_skip_loopback(self):
49 """The C{lo} interface is not reported by L{get_active_device_info}."""
50 device_info = get_active_device_info()
51 interfaces = [i["interface"] for i in device_info]
52 self.assertNotIn("lo", interfaces)
53
54- def test_skip_vlan(self):
55+ @patch("landscape.lib.network.get_active_interfaces")
56+ def test_skip_vlan(self, mock_get_active_interfaces):
57 """VLAN interfaces are not reported by L{get_active_device_info}."""
58- mock_get_active_interfaces = self.mocker.replace(get_active_interfaces)
59- mock_get_active_interfaces(ANY)
60- self.mocker.passthrough(
61- result_callback=lambda result: list(result) + ["eth0.1"])
62- self.mocker.replay()
63+ mock_get_active_interfaces.side_effect = lambda sock: (
64+ list(get_active_interfaces(sock)) + ["eth0.1"])
65 device_info = get_active_device_info()
66+ mock_get_active_interfaces.assert_called_with(ANY)
67 interfaces = [i["interface"] for i in device_info]
68 self.assertNotIn("eth0.1", interfaces)
69
70- def test_skip_alias(self):
71+ @patch("landscape.lib.network.get_active_interfaces")
72+ def test_skip_alias(self, mock_get_active_interfaces):
73 """Interface aliases are not reported by L{get_active_device_info}."""
74- mock_get_active_interfaces = self.mocker.replace(get_active_interfaces)
75- mock_get_active_interfaces(ANY)
76- self.mocker.passthrough(
77- result_callback=lambda result: list(result) + ["eth0:foo"])
78- self.mocker.replay()
79+ mock_get_active_interfaces.side_effect = lambda sock: (
80+ list(get_active_interfaces(sock)) + ["eth0:foo"])
81 device_info = get_active_device_info()
82 interfaces = [i["interface"] for i in device_info]
83 self.assertNotIn("eth0:foo", interfaces)
84
85- def test_duplicate_network_interfaces(self):
86+ @patch("struct.unpack")
87+ @patch("fcntl.ioctl")
88+ def test_duplicate_network_interfaces(self, mock_ioctl, mock_unpack):
89 """
90 L{get_active_interfaces} doesn't return duplicate network interfaces.
91 The call to C{fcntl.ioctl} might return the same interface several
92@@ -112,36 +112,33 @@
93 "\x00\xac\x13\x02A")
94
95 fake_array = array.array("B", response + "\0" * 4855)
96- mock_array = self.mocker.replace("array")
97- mock_array.array("B", ANY)
98- self.mocker.result(fake_array)
99-
100- mock_ioctl = self.mocker.replace("fcntl")
101- mock_ioctl.ioctl(ANY, ANY, ANY)
102- self.mocker.result(0)
103-
104- mock_unpack = self.mocker.replace("struct")
105- mock_unpack.unpack("iL", ANY)
106- self.mocker.result((280, 38643456))
107-
108- self.mocker.replay()
109-
110- sock = socket.socket(
111- socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_IP)
112+
113+ with patch("array.array") as mock_array:
114+ mock_array.return_value = fake_array
115+ mock_ioctl.return_value = 0
116+ mock_unpack.return_value = (280, 38643456)
117+
118+ sock = socket.socket(
119+ socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_IP)
120+ interfaces = list(get_active_interfaces(sock))
121+
122+ mock_array.assert_called_with("B", ANY)
123+ mock_ioctl.assert_called_with(ANY, ANY, ANY)
124+ mock_unpack.assert_called_with("iL", ANY)
125+
126 self.assertEqual(
127 ["lo", "eth1:pub", "br1:metadata", "br1:0", "br1", "br1:priv"],
128- list(get_active_interfaces(sock)))
129+ interfaces)
130
131- def test_get_network_traffic(self):
132+ @patch("__builtin__.open")
133+ def test_get_network_traffic(self, mock_open):
134 """
135 Network traffic is assessed via reading /proc/net/dev, verify
136 the parsed output against a known sample.
137 """
138- open_mock = self.mocker.replace("__builtin__.open")
139- open_mock("/proc/net/dev", "r")
140- self.mocker.result(StringIO(test_proc_net_dev_output))
141- self.mocker.replay()
142+ mock_open.return_value = StringIO(test_proc_net_dev_output)
143 traffic = get_network_traffic()
144+ mock_open.assert_called_with("/proc/net/dev", "r")
145 self.assertEqual(traffic, test_proc_net_dev_parsed)
146
147
148@@ -214,46 +211,45 @@
149
150 class NetworkInterfaceSpeedTest(LandscapeTest):
151
152- def test_get_network_interface_speed(self):
153+ @patch("struct.unpack")
154+ @patch("fcntl.ioctl")
155+ def test_get_network_interface_speed(self, mock_ioctl, mock_unpack):
156 """
157 The link speed is reported as unpacked from the ioctl() call.
158 """
159 sock = socket.socket(
160 socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_IP)
161 # ioctl always succeeds
162- mock_ioctl = self.mocker.replace("fcntl")
163- mock_ioctl.ioctl(ANY, ANY, ANY)
164- self.mocker.result(0)
165-
166- mock_unpack = self.mocker.replace("struct")
167- mock_unpack.unpack("12xHB28x", ANY)
168- self.mocker.result((100, False))
169-
170- self.mocker.replay()
171-
172- self.assertEqual((100, False),
173- get_network_interface_speed(sock, "eth0"))
174-
175- def test_get_network_interface_speed_unplugged(self):
176+ mock_unpack.return_value = (100, False)
177+
178+ result = get_network_interface_speed(sock, "eth0")
179+
180+ mock_ioctl.assert_called_with(ANY, ANY, ANY)
181+ mock_unpack.assert_called_with("12xHB28x", ANY)
182+
183+ self.assertEqual((100, False), result)
184+
185+ @patch("struct.unpack")
186+ @patch("fcntl.ioctl")
187+ def test_unplugged(self, mock_ioctl, mock_unpack):
188 """
189 The link speed for an unplugged interface is reported as 0.
190 """
191 sock = socket.socket(
192 socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_IP)
193+
194 # ioctl always succeeds
195- mock_ioctl = self.mocker.replace("fcntl")
196- mock_ioctl.ioctl(ANY, ANY, ANY)
197- self.mocker.result((0, False))
198-
199- mock_unpack = self.mocker.replace("struct")
200- mock_unpack.unpack("12xHB28x", ANY)
201- self.mocker.result((65535, False))
202-
203- self.mocker.replay()
204-
205- self.assertEqual((0, False), get_network_interface_speed(sock, "eth0"))
206-
207- def test_get_network_interface_speed_not_supported(self):
208+ mock_unpack.return_value = (65535, False)
209+
210+ result = get_network_interface_speed(sock, "eth0")
211+
212+ mock_ioctl.assert_called_with(ANY, ANY, ANY)
213+ mock_unpack.assert_called_with("12xHB28x", ANY)
214+
215+ self.assertEqual((0, False), result)
216+
217+ @patch("fcntl.ioctl")
218+ def test_get_network_interface_speed_not_supported(self, mock_ioctl):
219 """
220 Some drivers do not report the needed interface speed. In this case
221 an C{IOError} with errno 95 is raised ("Operation not supported").
222@@ -266,16 +262,16 @@
223 theerror.message = "Operation not supported"
224
225 # ioctl always raises
226- mock_ioctl = self.mocker.replace("fcntl")
227- mock_ioctl.ioctl(ANY, ANY, ANY)
228- self.mocker.throw(theerror)
229-
230- self.mocker.replay()
231-
232- self.assertEqual((-1, False),
233- get_network_interface_speed(sock, "eth0"))
234-
235- def test_get_network_interface_speed_not_permitted(self):
236+ mock_ioctl.side_effect = theerror
237+
238+ result = get_network_interface_speed(sock, "eth0")
239+
240+ mock_ioctl.assert_called_with(ANY, ANY, ANY)
241+
242+ self.assertEqual((-1, False), result)
243+
244+ @patch("fcntl.ioctl")
245+ def test_get_network_interface_speed_not_permitted(self, mock_ioctl):
246 """
247 In some cases (lucid seems to be affected), the ioctl() call is not
248 allowed for non-root users. In that case we intercept the error and
249@@ -288,16 +284,16 @@
250 theerror.message = "Operation not permitted"
251
252 # ioctl always raises
253- mock_ioctl = self.mocker.replace("fcntl")
254- mock_ioctl.ioctl(ANY, ANY, ANY)
255- self.mocker.throw(theerror)
256-
257- self.mocker.replay()
258-
259- self.assertEqual((-1, False),
260- get_network_interface_speed(sock, "eth0"))
261-
262- def test_get_network_interface_speed_other_io_error(self):
263+ mock_ioctl.side_effect = theerror
264+
265+ result = get_network_interface_speed(sock, "eth0")
266+
267+ mock_ioctl.assert_called_with(ANY, ANY, ANY)
268+
269+ self.assertEqual((-1, False), result)
270+
271+ @patch("fcntl.ioctl")
272+ def test_get_network_interface_speed_other_io_error(self, mock_ioctl):
273 """
274 In case we get an IOError that is not "Operation not permitted", the
275 exception should be raised.
276@@ -309,10 +305,6 @@
277 theerror.message = "Whatever"
278
279 # ioctl always raises
280- mock_ioctl = self.mocker.replace("fcntl")
281- mock_ioctl.ioctl(ANY, ANY, ANY)
282- self.mocker.throw(theerror)
283-
284- self.mocker.replay()
285+ mock_ioctl.side_effect = theerror
286
287 self.assertRaises(IOError, get_network_interface_speed, sock, "eth0")

Subscribers

People subscribed via source and target branches

to all changes: