Merge lp:~gocept/landscape-client/py3-broker-store into lp:~landscape/landscape-client/trunk

Proposed by Steffen Allner
Status: Merged
Approved by: Данило Шеган
Approved revision: 972
Merged at revision: 972
Proposed branch: lp:~gocept/landscape-client/py3-broker-store
Merge into: lp:~landscape/landscape-client/trunk
Diff against target: 332 lines (+59/-55)
2 files modified
landscape/broker/tests/test_store.py (+58/-54)
py3_ready_tests (+1/-1)
To merge this branch: bzr merge lp:~gocept/landscape-client/py3-broker-store
Reviewer Review Type Date Requested Status
Daniel Havlik (community) Approve
🤖 Landscape Builder test results Approve
Данило Шеган (community) Approve
Review via email: mp+320778@code.launchpad.net

Commit message

Support python 2 and 3 in landscape.broker.store module and use bytes where required by schema in tests.

Description of the change

As the diff for the landscape.broker module would be to large, I MP the submodules separately.

Here we have landscape.broker.store, where the tests were failing because bytes were not uses as input when required by a schema.

To post a comment you must log in.
Revision history for this message
🤖 Landscape Builder (landscape-builder) :
review: Abstain (executing tests)
972. By Steffen Allner

PEP-8.

Revision history for this message
Данило Шеган (danilo) wrote :

Looks good.

review: Approve
Revision history for this message
🤖 Landscape Builder (landscape-builder) wrote :

Command: TRIAL_ARGS=-j4 make check
Result: Success
Revno: 971
Branch: lp:~gocept/landscape-client/py3-broker-store
Jenkins: https://ci.lscape.net/job/latch-test-xenial/3711/

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

Command: TRIAL_ARGS=-j4 make check
Result: Success
Revno: 972
Branch: lp:~gocept/landscape-client/py3-broker-store
Jenkins: https://ci.lscape.net/job/latch-test-xenial/3712/

review: Approve (test results)
Revision history for this message
Daniel Havlik (nilo) wrote :

+1

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'landscape/broker/tests/test_store.py'
2--- landscape/broker/tests/test_store.py 2017-03-13 13:09:24 +0000
3+++ landscape/broker/tests/test_store.py 2017-03-23 09:53:29 +0000
4@@ -1,6 +1,9 @@
5 import os
6 import mock
7
8+
9+from twisted.python.compat import intToBytes
10+
11 from landscape.lib.persist import Persist
12 from landscape.broker.store import MessageStore
13 from landscape.schema import InvalidError, Message, Int, Bytes, Unicode
14@@ -95,7 +98,7 @@
15 """
16 Deleting old messages should avoid deleting held messages.
17 """
18- self.store.add({"type": "unaccepted", "data": "blah"})
19+ self.store.add({"type": "unaccepted", "data": b"blah"})
20 self.store.add({"type": "empty"})
21 self.store.set_pending_offset(1)
22 self.store.delete_old_messages()
23@@ -108,9 +111,9 @@
24 def test_delete_all_messages(self):
25 """Resetting the message store means removing *ALL* messages."""
26 self.store.set_accepted_types(["empty"])
27- self.store.add({"type": "unaccepted", "data": "blah"})
28+ self.store.add({"type": "unaccepted", "data": b"blah"})
29 self.store.add({"type": "empty"})
30- self.store.add({"type": "unaccepted", "data": "blah"})
31+ self.store.add({"type": "unaccepted", "data": b"blah"})
32 self.store.add({"type": "empty"})
33 self.store.set_pending_offset(2)
34 self.store.delete_all_messages()
35@@ -119,37 +122,37 @@
36 self.assertEqual(self.store.get_pending_messages(), [])
37
38 def test_one_message(self):
39- self.store.add(dict(type="data", data="A thing"))
40+ self.store.add(dict(type="data", data=b"A thing"))
41 messages = self.store.get_pending_messages(200)
42 self.assertMessages(messages,
43 [{"type": "data",
44- "data": "A thing",
45- "api": "3.2"}])
46+ "data": b"A thing",
47+ "api": b"3.2"}])
48
49 def test_max_pending(self):
50 for i in range(10):
51- self.store.add(dict(type="data", data=str(i)))
52+ self.store.add(dict(type="data", data=intToBytes(i)))
53 il = [m["data"] for m in self.store.get_pending_messages(5)]
54- self.assertEqual(il, map(str, [0, 1, 2, 3, 4]))
55+ self.assertEqual(il, [intToBytes(i) for i in[0, 1, 2, 3, 4]])
56
57 def test_offset(self):
58 self.store.set_pending_offset(5)
59 for i in range(15):
60- self.store.add(dict(type="data", data=str(i)))
61+ self.store.add(dict(type="data", data=intToBytes(i)))
62 il = [m["data"] for m in self.store.get_pending_messages(5)]
63- self.assertEqual(il, map(str, [5, 6, 7, 8, 9]))
64+ self.assertEqual(il, [intToBytes(i) for i in [5, 6, 7, 8, 9]])
65
66 def test_exercise_multi_dir(self):
67 for i in range(35):
68- self.store.add(dict(type="data", data=str(i)))
69+ self.store.add(dict(type="data", data=intToBytes(i)))
70 il = [m["data"] for m in self.store.get_pending_messages(50)]
71- self.assertEqual(il, map(str, range(35)))
72+ self.assertEqual(il, [intToBytes(i) for i in range(35)])
73
74 def test_wb_clean_up_empty_directories(self):
75 for i in range(60):
76- self.store.add(dict(type="data", data=str(i)))
77+ self.store.add(dict(type="data", data=intToBytes(i)))
78 il = [m["data"] for m in self.store.get_pending_messages(60)]
79- self.assertEqual(il, map(str, range(60)))
80+ self.assertEqual(il, [intToBytes(i) for i in range(60)])
81 self.assertEqual(set(os.listdir(self.temp_dir)), set(["0", "1", "2"]))
82
83 self.store.set_pending_offset(60)
84@@ -159,62 +162,63 @@
85 def test_unaccepted(self):
86 for i in range(10):
87 self.store.add(dict(type=["data", "unaccepted"][i % 2],
88- data=str(i)))
89+ data=intToBytes(i)))
90 il = [m["data"] for m in self.store.get_pending_messages(20)]
91- self.assertEqual(il, map(str, [0, 2, 4, 6, 8]))
92+ self.assertEqual(il, [intToBytes(i) for i in [0, 2, 4, 6, 8]])
93
94 def test_unaccepted_with_offset(self):
95 for i in range(10):
96 self.store.add(dict(type=["data", "unaccepted"][i % 2],
97- data=str(i)))
98+ data=intToBytes(i)))
99 self.store.set_pending_offset(2)
100 il = [m["data"] for m in self.store.get_pending_messages(20)]
101- self.assertEqual(il, map(str, [4, 6, 8]))
102+ self.assertEqual(il, [intToBytes(i) for i in [4, 6, 8]])
103
104 def test_unaccepted_reaccepted(self):
105 for i in range(10):
106 self.store.add(dict(type=["data", "unaccepted"][i % 2],
107- data=str(i)))
108+ data=intToBytes(i)))
109 self.store.set_pending_offset(2)
110 il = [m["data"] for m in self.store.get_pending_messages(2)]
111 self.store.set_accepted_types(["data", "unaccepted"])
112 il = [m["data"] for m in self.store.get_pending_messages(20)]
113- self.assertEqual(il, map(str, [4, 6, 8, 1, 3, 5, 7, 9]))
114+ self.assertEqual(il, [intToBytes(i) for i in [4, 6, 8, 1, 3, 5, 7, 9]])
115
116 def test_accepted_unaccepted(self):
117 for i in range(10):
118 self.store.add(dict(type=["data", "unaccepted"][i % 2],
119- data=str(i)))
120+ data=intToBytes(i)))
121 # Setting pending offset here means that the first two
122 # messages, even though becoming unaccepted now, were already
123 # accepted before, so they shouldn't be marked for hold.
124 self.store.set_pending_offset(2)
125 self.store.set_accepted_types(["unaccepted"])
126 il = [m["data"] for m in self.store.get_pending_messages(20)]
127- self.assertEqual(il, map(str, [1, 3, 5, 7, 9]))
128+ self.assertEqual(il, [intToBytes(i) for i in [1, 3, 5, 7, 9]])
129 self.store.set_accepted_types(["data", "unaccepted"])
130 il = [m["data"] for m in self.store.get_pending_messages(20)]
131- self.assertEqual(il, map(str, [1, 3, 5, 7, 9, 4, 6, 8]))
132+ self.assertEqual(il, [intToBytes(i) for i in [1, 3, 5, 7, 9, 4, 6, 8]])
133
134 def test_accepted_unaccepted_old(self):
135 for i in range(10):
136 self.store.add(dict(type=["data", "unaccepted"][i % 2],
137- data=str(i)))
138+ data=intToBytes(i)))
139 self.store.set_pending_offset(2)
140 self.store.set_accepted_types(["unaccepted"])
141 il = [m["data"] for m in self.store.get_pending_messages(20)]
142- self.assertEqual(il, map(str, [1, 3, 5, 7, 9]))
143+ self.assertEqual(il, [intToBytes(i) for i in [1, 3, 5, 7, 9]])
144 # Now, if the server asks us to go back and process
145 # previously accepted messages that are now unaccepted,
146 # they should be put on hold.
147 self.store.set_pending_offset(0)
148 il = [m["data"] for m in self.store.get_pending_messages(20)]
149- self.assertEqual(il, map(str, [1, 3, 5, 7, 9]))
150+ self.assertEqual(il, [intToBytes(i) for i in [1, 3, 5, 7, 9]])
151 # When the server starts accepting them again, these old
152 # messages will also be delivered.
153 self.store.set_accepted_types(["data", "unaccepted"])
154 il = [m["data"] for m in self.store.get_pending_messages(20)]
155- self.assertEqual(il, map(str, [1, 3, 5, 7, 9, 0, 2, 4, 6, 8]))
156+ self.assertEqual(il, [intToBytes(i)
157+ for i in [1, 3, 5, 7, 9, 0, 2, 4, 6, 8]])
158
159 def test_wb_handle_broken_messages(self):
160 self.log_helper.ignore_errors(ValueError)
161@@ -250,8 +254,8 @@
162
163 def test_wb_delete_messages_with_broken(self):
164 self.log_helper.ignore_errors(ValueError)
165- self.store.add({"type": "data", "data": "1"})
166- self.store.add({"type": "data", "data": "2"})
167+ self.store.add({"type": "data", "data": b"1"})
168+ self.store.add({"type": "data", "data": b"2"})
169
170 filename = os.path.join(self.temp_dir, "0", "0")
171 self.assertTrue(os.path.isfile(filename))
172@@ -261,8 +265,8 @@
173
174 messages = self.store.get_pending_messages()
175
176- self.assertEqual(messages, [{"type": "data", "data": "2",
177- "api": "3.2"}])
178+ self.assertEqual(messages, [{"type": "data", "data": b"2",
179+ "api": b"3.2"}])
180
181 self.store.set_pending_offset(len(messages))
182
183@@ -291,20 +295,20 @@
184 mock_open.assert_called_with(mock.ANY, "wb")
185 mocked_file.write.assert_called_once_with(mock.ANY)
186 self.assertEqual(self.store.get_pending_messages(),
187- [{"type": "data", "data": 1, "api": "3.2"}])
188+ [{"type": "data", "data": 1, "api": b"3.2"}])
189
190 def test_get_server_api_default(self):
191 """
192 By default the initial server API version is 3.2.
193 """
194- self.assertEqual("3.2", self.store.get_server_api())
195+ self.assertEqual(b"3.2", self.store.get_server_api())
196
197 def test_set_server_api(self):
198 """
199 It's possible to change the server API version.
200 """
201- self.store.set_server_api("3.3")
202- self.assertEqual("3.3", self.store.get_server_api())
203+ self.store.set_server_api(b"3.3")
204+ self.assertEqual(b"3.3", self.store.get_server_api())
205
206 def test_default_api_on_messages(self):
207 """
208@@ -312,23 +316,23 @@
209 """
210 self.store.add({"type": "empty"})
211 self.assertEqual(self.store.get_pending_messages(),
212- [{"type": "empty", "api": "3.2"}])
213+ [{"type": "empty", "api": b"3.2"}])
214
215 def test_custom_api_on_store(self):
216 """
217 It's possible to change the server API version attached to outgoing
218 messages.
219 """
220- self.store.set_server_api("3.3")
221+ self.store.set_server_api(b"3.3")
222 self.store.add({"type": "empty"})
223 self.assertEqual(self.store.get_pending_messages(),
224- [{"type": "empty", "api": "3.3"}])
225+ [{"type": "empty", "api": b"3.3"}])
226
227 def test_custom_api_on_messages(self):
228- self.store.set_server_api("3.3")
229- self.store.add({"type": "empty", "api": "3.2"})
230+ self.store.set_server_api(b"3.3")
231+ self.store.add({"type": "empty", "api": b"3.2"})
232 self.assertEqual(self.store.get_pending_messages(),
233- [{"type": "empty", "api": "3.2"}])
234+ [{"type": "empty", "api": b"3.2"}])
235
236 def test_coercion(self):
237 """
238@@ -344,7 +348,7 @@
239 If a custom 'api' key is specified in the message, it should
240 not be considered during schema verification.
241 """
242- self.store.add({"type": "empty", "api": "whatever"})
243+ self.store.add({"type": "empty", "api": b"whatever"})
244
245 def test_message_is_actually_coerced(self):
246 """
247@@ -354,25 +358,25 @@
248 self.store.add_schema(Message("data", {"data": Unicode()}))
249 self.store.add({"type": "data",
250 "data": u"\N{HIRAGANA LETTER A}".encode("utf-8"),
251- "api": "3.2"})
252+ "api": b"3.2"})
253 self.assertEqual(self.store.get_pending_messages(),
254- [{"type": "data", "api": "3.2",
255+ [{"type": "data", "api": b"3.2",
256 "data": u"\N{HIRAGANA LETTER A}"}])
257
258 def test_message_is_coerced_to_its_api_schema(self):
259 """
260 A message gets coerced to the schema of the API its targeted to.
261 """
262- self.store.set_server_api("3.3")
263+ self.store.set_server_api(b"3.3")
264 # Add a new schema for the 'data' message type, with a slightly
265 # different definition.
266- self.store.add_schema(Message("data", {"data": Int()}, api="3.3"))
267+ self.store.add_schema(Message("data", {"data": Int()}, api=b"3.3"))
268
269 # The message is coerced against the new schema.
270 self.store.add({"type": "data", "data": 123})
271 self.assertEqual(
272 self.store.get_pending_messages(),
273- [{"type": "data", "api": "3.3", "data": 123}])
274+ [{"type": "data", "api": b"3.3", "data": 123}])
275
276 def test_message_is_coerced_to_highest_compatible_api_schema(self):
277 """
278@@ -381,21 +385,21 @@
279 """
280 # Add a new schema for the 'data' message type, with a slightly
281 # different definition.
282- self.store.set_server_api("3.2")
283- self.store.add_schema(Message("data", {"data": Int()}, api="3.3"))
284+ self.store.set_server_api(b"3.2")
285+ self.store.add_schema(Message("data", {"data": Int()}, api=b"3.3"))
286
287 # The message is coerced against the older schema.
288- self.store.add({"type": "data", "data": "foo"})
289+ self.store.add({"type": "data", "data": b"foo"})
290 self.assertEqual(
291 self.store.get_pending_messages(),
292- [{"type": "data", "api": "3.2", "data": "foo"}])
293+ [{"type": "data", "api": b"3.2", "data": b"foo"}])
294
295 def test_count_pending_messages(self):
296 """It is possible to get the total number of pending messages."""
297 self.assertEqual(self.store.count_pending_messages(), 0)
298 self.store.add({"type": "empty"})
299 self.assertEqual(self.store.count_pending_messages(), 1)
300- self.store.add({"type": "data", "data": "yay"})
301+ self.store.add({"type": "data", "data": b"yay"})
302 self.assertEqual(self.store.count_pending_messages(), 2)
303
304 def test_commit(self):
305@@ -433,7 +437,7 @@
306 fh.write("bpickle will break reading this")
307
308 # And hold the second one.
309- self.store.add({"type": "data", "data": "A thing"})
310+ self.store.add({"type": "data", "data": b"A thing"})
311
312 self.store.add({"type": "empty"})
313 self.store.add({"type": "empty"})
314@@ -452,7 +456,7 @@
315
316 def test_is_pending_with_held_message(self):
317 self.store.set_accepted_types(["empty"])
318- id = self.store.add({"type": "data", "data": "A thing"})
319+ id = self.store.add({"type": "data", "data": b"A thing"})
320
321 # Add another normal message and increment the pending offset
322 # to make the held message stay "behind" in the queue.
323
324=== modified file 'py3_ready_tests'
325--- py3_ready_tests 2017-03-23 07:28:20 +0000
326+++ py3_ready_tests 2017-03-23 09:53:29 +0000
327@@ -9,4 +9,4 @@
328
329
330
331-
332+landscape.broker.tests.test_store

Subscribers

People subscribed via source and target branches

to all changes: