5
from landscape.tests.helpers import LandscapeTest
7
from landscape.package.store import PackageStore, UnknownHashIDRequest
10
class PackageStoreTest(LandscapeTest):
13
super(PackageStoreTest, self).setUp()
15
self.filename = self.makeFile()
16
self.store1 = PackageStore(self.filename)
17
self.store2 = PackageStore(self.filename)
19
def test_wb_transactional_commits(self):
20
mock_db = self.mocker.replace(self.store1._db)
23
self.store1.set_hash_ids({})
25
def test_wb_transactional_rolls_back(self):
26
mock_db = self.mocker.replace(self.store1._db)
29
self.assertRaises(Exception, self.store1.set_hash_ids, None)
31
def test_set_and_get_hash_id(self):
32
self.store1.set_hash_ids({"ha\x00sh1": 123, "ha\x00sh2": 456})
33
self.assertEquals(self.store2.get_hash_id("ha\x00sh1"), 123)
34
self.assertEquals(self.store2.get_hash_id("ha\x00sh2"), 456)
36
def test_get_id_hash(self):
37
self.store1.set_hash_ids({"hash1": 123, "hash2": 456})
38
self.assertEquals(self.store2.get_id_hash(123), "hash1")
39
self.assertEquals(self.store2.get_id_hash(456), "hash2")
41
def test_get_unexistent_hash(self):
42
self.assertEquals(self.store1.get_hash_id("hash1"), None)
44
def test_get_unexistent_id(self):
45
self.assertEquals(self.store1.get_id_hash(123), None)
47
def test_overwrite_id_hash(self):
48
self.store1.set_hash_ids({"hash1": 123})
49
self.store2.set_hash_ids({"hash2": 123})
50
self.assertEquals(self.store1.get_hash_id("hash1"), None)
51
self.assertEquals(self.store1.get_hash_id("hash2"), 123)
53
def test_overwrite_hash_id(self):
54
self.store1.set_hash_ids({"hash1": 123})
55
self.store2.set_hash_ids({"hash1": 456})
56
self.assertEquals(self.store1.get_id_hash(123), None)
57
self.assertEquals(self.store1.get_id_hash(456), "hash1")
59
def test_set_hash_ids_timing(self):
60
"""Setting 20k hashes must take less than 5 seconds."""
61
hashes = dict((str(i), i) for i in range(20000))
63
self.store1.set_hash_ids(hashes)
64
self.assertTrue(time.time()-started < 5,
65
"Setting 20k hashes took more than 5 seconds.")
67
def test_add_and_get_available_packages(self):
68
self.store1.add_available([1, 2])
69
self.assertEquals(self.store2.get_available(), [1, 2])
71
def test_add_available_conflicting(self):
72
"""Adding the same available pacakge id twice is fine."""
73
self.store1.add_available([1])
74
self.store1.add_available([1])
75
self.assertEquals(self.store2.get_available(), [1])
77
def test_add_available_timing(self):
78
"""Adding 20k ids must take less than 5 seconds."""
80
self.store1.add_available(range(20000))
81
self.assertTrue(time.time()-started < 5,
82
"Adding 20k available ids took more than 5 seconds.")
84
def test_remove_available(self):
85
self.store1.add_available([1, 2, 3, 4])
86
self.store1.remove_available([2, 3])
87
self.assertEquals(self.store2.get_available(), [1, 4])
89
def test_remove_available_timing(self):
90
self.store1.add_available(range(20000))
92
self.store1.remove_available(range(20000))
93
self.assertTrue(time.time()-started < 5,
94
"Removing 20k available ids took more than 5 seconds.")
96
def test_clear_available(self):
97
self.store1.add_available([1, 2, 3, 4])
98
self.store1.clear_available()
99
self.assertEquals(self.store2.get_available(), [])
101
def test_add_and_get_available_upgrades_packages(self):
102
self.store1.add_available_upgrades([1, 2])
103
self.assertEquals(self.store2.get_available_upgrades(), [1, 2])
105
def test_add_available_upgrades_conflicting(self):
106
"""Adding the same available_upgrades pacakge id twice is fine."""
107
self.store1.add_available_upgrades([1])
108
self.store1.add_available_upgrades([1])
109
self.assertEquals(self.store2.get_available_upgrades(), [1])
111
def test_add_available_upgrades_timing(self):
112
"""Adding 20k ids must take less than 5 seconds."""
113
started = time.time()
114
self.store1.add_available_upgrades(range(20000))
115
self.assertTrue(time.time()-started < 5,
116
"Adding 20k available upgrades ids took "
117
"more than 5 seconds.")
119
def test_remove_available_upgrades(self):
120
self.store1.add_available_upgrades([1, 2, 3, 4])
121
self.store1.remove_available_upgrades([2, 3])
122
self.assertEquals(self.store2.get_available_upgrades(), [1, 4])
124
def test_remove_available_upgrades_timing(self):
125
self.store1.add_available_upgrades(range(20000))
126
started = time.time()
127
self.store1.remove_available_upgrades(range(20000))
128
self.assertTrue(time.time()-started < 5,
129
"Removing 20k available upgrades ids took "
130
"more than 5 seconds.")
132
def test_clear_available_upgrades(self):
133
self.store1.add_available_upgrades([1, 2, 3, 4])
134
self.store1.clear_available_upgrades()
135
self.assertEquals(self.store2.get_available_upgrades(), [])
137
def test_add_and_get_installed_packages(self):
138
self.store1.add_installed([1, 2])
139
self.assertEquals(self.store2.get_installed(), [1, 2])
141
def test_add_installed_conflicting(self):
142
"""Adding the same installed pacakge id twice is fine."""
143
self.store1.add_installed([1])
144
self.store1.add_installed([1])
145
self.assertEquals(self.store2.get_installed(), [1])
147
def test_add_installed_timing(self):
148
"""Adding 20k ids must take less than 5 seconds."""
149
started = time.time()
150
self.store1.add_installed(range(20000))
151
self.assertTrue(time.time()-started < 5,
152
"Adding 20k installed ids took more than 5 seconds.")
154
def test_remove_installed(self):
155
self.store1.add_installed([1, 2, 3, 4])
156
self.store1.remove_installed([2, 3])
157
self.assertEquals(self.store2.get_installed(), [1, 4])
159
def test_remove_installed_timing(self):
160
self.store1.add_installed(range(20000))
161
started = time.time()
162
self.store1.remove_installed(range(20000))
163
self.assertTrue(time.time()-started < 5,
164
"Removing 20k installed ids took more than 5 seconds.")
166
def test_clear_installed(self):
167
self.store1.add_installed([1, 2, 3, 4])
168
self.store1.clear_installed()
169
self.assertEquals(self.store2.get_installed(), [])
171
def test_add_hash_id_request(self):
172
hashes = ("ha\x00sh1", "ha\x00sh2")
173
request1 = self.store1.add_hash_id_request(hashes)
174
request2 = self.store2.get_hash_id_request(request1.id)
175
self.assertEquals(request1.id, request2.id)
176
self.assertEquals(request1.hashes, list(hashes))
177
self.assertEquals(request2.hashes, list(hashes))
179
def test_iter_hash_id_requests(self):
180
hashes1 = ["ha\x00sh1", "ha\x00sh2"]
181
hashes2 = ["ha\x00sh3", "ha\x00sh4"]
182
request1 = self.store1.add_hash_id_request(hashes1)
183
request2 = self.store1.add_hash_id_request(hashes2)
184
hashes = [hash for request in self.store2.iter_hash_id_requests()
185
for hash in request.hashes]
186
self.assertEquals(hashes, hashes1 + hashes2)
188
def test_get_initial_hash_id_request_timestamp(self):
189
time_mock = self.mocker.replace("time.time")
191
self.mocker.result(123)
195
request1 = self.store1.add_hash_id_request(["hash1"])
196
request2 = self.store2.get_hash_id_request(request1.id)
198
self.assertEquals(request2.timestamp, 123)
200
# We handle mocker explicitly so that our hacked time()
201
# won't break Twisted's internals.
206
def test_update_hash_id_request_timestamp(self):
207
request1 = self.store1.add_hash_id_request(["hash1"])
208
request2 = self.store2.get_hash_id_request(request1.id)
210
request1.timestamp = 456
212
self.assertEquals(request2.timestamp, 456)
214
def test_default_hash_id_request_message_id(self):
215
request = self.store1.add_hash_id_request(["hash1"])
216
self.assertEquals(request.message_id, None)
218
def test_update_hash_id_request_message_id(self):
219
request1 = self.store1.add_hash_id_request(["hash1"])
220
request2 = self.store2.get_hash_id_request(request1.id)
222
request1.message_id = 456
224
self.assertEquals(request2.message_id, 456)
226
def test_get_hash_id_request_with_unknown_request_id(self):
227
self.assertRaises(UnknownHashIDRequest,
228
self.store1.get_hash_id_request, 123)
230
def test_remove_hash_id_request(self):
231
request = self.store1.add_hash_id_request(["hash1"])
233
self.assertRaises(UnknownHashIDRequest,
234
self.store1.get_hash_id_request, request.id)
236
def test_add_task(self):
237
data = {"answer": 42}
238
task = self.store1.add_task("reporter", data)
239
self.assertEquals(type(task.id), int)
240
self.assertEquals(task.queue, "reporter")
241
self.assertEquals(task.data, data)
243
def test_get_next_task(self):
244
task1 = self.store1.add_task("reporter", [1])
245
task2 = self.store1.add_task("reporter", [2])
246
task3 = self.store1.add_task("changer", [3])
248
task = self.store2.get_next_task("reporter")
249
self.assertEquals(task.id, task1.id)
250
self.assertEquals(task.data, [1])
252
task = self.store2.get_next_task("changer")
253
self.assertEquals(task.id, task3.id)
254
self.assertEquals(task.data, [3])
256
task = self.store2.get_next_task("reporter")
257
self.assertEquals(task.id, task1.id)
258
self.assertEquals(task.data, [1])
262
task = self.store2.get_next_task("reporter")
263
self.assertEquals(task.id, task2.id)
264
self.assertEquals(task.data, [2])
268
task = self.store2.get_next_task("reporter")
269
self.assertEquals(task, None)
271
def test_get_task_timestamp(self):
272
time_mock = self.mocker.replace("time.time")
274
self.mocker.result(123)
278
self.store1.add_task("reporter", [1])
279
task = self.store2.get_next_task("reporter")
281
self.assertEquals(task.timestamp, 123)
283
# We handle mocker explicitly so that our hacked time()
284
# won't break Twisted's internals.
289
def test_next_tasks_ordered_by_timestamp(self):
290
time_mock = self.mocker.replace("time.time")
292
self.mocker.result(222)
294
self.mocker.result(111)
298
task1 = self.store1.add_task("reporter", [1])
299
task2 = self.store1.add_task("reporter", [2])
301
task = self.store2.get_next_task("reporter")
302
self.assertEquals(task.timestamp, 111)
306
task = self.store2.get_next_task("reporter")
307
self.assertEquals(task.timestamp, 222)
309
# We handle mocker explicitly so that our hacked time()
310
# won't break Twisted's internals.
315
def test_clear_hash_id_requests(self):
316
request1 = self.store1.add_hash_id_request(["hash1"])
317
request2 = self.store1.add_hash_id_request(["hash2"])
318
self.store1.clear_hash_id_requests()
319
self.assertRaises(UnknownHashIDRequest,
320
self.store1.get_hash_id_request, request1.id)
321
self.assertRaises(UnknownHashIDRequest,
322
self.store1.get_hash_id_request, request2.id)
324
def test_clear_tasks(self):
325
data = {"answer": 42}
326
task = self.store1.add_task("reporter", data)
327
self.assertEquals(type(task.id), int)
328
self.assertEquals(task.queue, "reporter")
329
self.assertEquals(task.data, data)
330
self.store1.clear_tasks()
331
task = self.store2.get_next_task("reporter")
332
self.assertEquals(task, None)
334
def test_clear_tasks_except_1_task(self):
335
data = {"answer": 42}
336
task = self.store1.add_task("reporter", data)
337
data = {"answer": 43}
338
task2 = self.store1.add_task("reporter", data)
339
self.store1.clear_tasks(except_tasks=(task2,))
340
task = self.store2.get_next_task("reporter")
341
self.assertEquals(task.id, task2.id)
343
task = self.store2.get_next_task("reporter")
344
self.assertEquals(task, None)
346
def test_clear_tasks_except_2_tasks(self):
347
data = {"answer": 42}
348
task = self.store1.add_task("reporter", data)
349
data = {"answer": 43}
350
task2 = self.store1.add_task("reporter", data)
351
data = {"answer": 44}
352
task3 = self.store1.add_task("reporter", data)
353
self.store1.clear_tasks(except_tasks=(task2, task3))
354
task = self.store2.get_next_task("reporter")
355
self.assertEquals(task.id, task2.id)
357
task = self.store2.get_next_task("reporter")
358
self.assertEquals(task.id, task3.id)
360
task = self.store2.get_next_task("reporter")
361
self.assertEquals(task, None)
363
def test_parallel_database_access(self):
367
func1.store1 = PackageStore(self.filename)
368
func1.store1.add_task("reporter", "data")
369
func1.store1.add_task("reporter", "data")
370
func1.task = func1.store1.get_next_task("reporter")
373
func2.store2 = PackageStore(self.filename)
375
func2.store2.add_task("reporter", "data")
379
for func in [func1, func2]:
380
thread = threading.Thread(target=func)
384
self.assertEquals(error, [])