Merge lp:~gocept/landscape-client/py3-broker-store into lp:~landscape/landscape-client/trunk
- py3-broker-store
- Merge into 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 |
Related bugs: |
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
Daniel Havlik (community) | Approve | ||
🤖 Landscape Builder | test results | Approve | |
Данило Шеган (community) | Approve | ||
Review via email:
|
Commit message
Support python 2 and 3 in landscape.
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.
To post a comment you must log in.
Revision history for this message
![](/+icing/build/overlay/assets/skins/sam/images/close.gif)
🤖 Landscape Builder (landscape-builder) : | # |
review:
Abstain
(executing tests)
- 972. By Steffen Allner
-
PEP-8.
Revision history for this message
![](/+icing/build/overlay/assets/skins/sam/images/close.gif)
🤖 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:/
review:
Approve
(test results)
Revision history for this message
![](/+icing/build/overlay/assets/skins/sam/images/close.gif)
🤖 Landscape Builder (landscape-builder) : | # |
review:
Abstain
(executing tests)
Revision history for this message
![](/+icing/build/overlay/assets/skins/sam/images/close.gif)
🤖 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:/
review:
Approve
(test results)
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 |
Looks good.