49
49
self.config = PackageReporterConfiguration()
50
50
self.reporter = PackageReporter(self.store, self.facade, self.remote,
52
self.config.data_path = self.makeDir()
53
os.mkdir(self.config.package_directory)
53
55
def set_pkg2_upgrades_pkg1(self):
54
56
previous = self.Facade.channels_reloaded
136
138
(196610, u"name1 = version1-release1"),
138
140
u"prerequirename1 = prerequireversion1"),
139
(262148, u"requirename1 = requireversion1"),
142
u"requirename1 = requireversion1"),
140
143
(393224, u"name1 < version1-release1"),
142
145
u"conflictsname1 = conflictsversion1")],
258
261
# Let's say fetch_async is successful
259
262
hash_id_db_url = self.config.package_hash_id_url + "uuid_codename_arch"
260
fetch_async_mock = self.mocker.replace("landscape.lib.fetch.fetch_async")
263
fetch_async_mock = self.mocker.replace("landscape.lib."
261
265
fetch_async_mock(hash_id_db_url, cainfo=None)
262
266
fetch_async_result = Deferred()
263
267
fetch_async_result.callback("hash-ids")
399
404
# Check fetch_async is called with the default url
400
405
hash_id_db_url = "http://fake.url/path/hash-id-databases/" \
401
406
"uuid_codename_arch"
402
fetch_async_mock = self.mocker.replace("landscape.lib.fetch.fetch_async")
407
fetch_async_mock = self.mocker.replace("landscape.lib."
403
409
fetch_async_mock(hash_id_db_url, cainfo=None)
404
410
fetch_async_result = Deferred()
405
411
fetch_async_result.callback("hash-ids")
431
437
# Let's say fetch_async fails
432
438
hash_id_db_url = self.config.package_hash_id_url + "uuid_codename_arch"
433
fetch_async_mock = self.mocker.replace("landscape.lib.fetch.fetch_async")
439
fetch_async_mock = self.mocker.replace("landscape.lib."
434
441
fetch_async_mock(hash_id_db_url, cainfo=None)
435
442
fetch_async_result = Deferred()
436
443
fetch_async_result.errback(FetchError("fetch error"))
448
455
# We shouldn't have any hash=>id database
449
456
def callback(ignored):
450
hash_id_db_filename = os.path.join(self.config.data_path, "package",
451
"hash-id", "uuid_codename_arch")
457
hash_id_db_filename = os.path.join(
458
self.config.data_path, "package", "hash-id",
459
"uuid_codename_arch")
452
460
self.assertEquals(os.path.exists(hash_id_db_filename), False)
453
461
result.addCallback(callback)
479
487
# We shouldn't have any hash=>id database
480
488
def callback(ignored):
481
hash_id_db_filename = os.path.join(self.config.data_path, "package",
482
"hash-id", "uuid_codename_arch")
489
hash_id_db_filename = os.path.join(
490
self.config.data_path, "package", "hash-id",
491
"uuid_codename_arch")
483
492
self.assertEquals(os.path.exists(hash_id_db_filename), False)
484
493
result.addCallback(callback)
503
512
# Check fetch_async is called with the default url
504
513
hash_id_db_url = "http://fake.url/path/hash-id-databases/" \
505
514
"uuid_codename_arch"
506
fetch_async_mock = self.mocker.replace("landscape.lib.fetch.fetch_async")
515
fetch_async_mock = self.mocker.replace("landscape.lib."
507
517
fetch_async_mock(hash_id_db_url, cainfo=self.config.ssl_public_key)
508
518
fetch_async_result = Deferred()
509
519
fetch_async_result.callback("hash-ids")
584
594
self.assertFalse(self.reporter._apt_sources_have_changed())
585
595
self.reporter.sources_list_filename = self.makeFile("foo")
586
596
self.assertTrue(self.reporter._apt_sources_have_changed())
587
os.utime(self.reporter.sources_list_filename, (-1, time.time() - 1799));
597
os.utime(self.reporter.sources_list_filename, (-1, time.time() - 1799))
588
598
self.assertTrue(self.reporter._apt_sources_have_changed())
589
os.utime(self.reporter.sources_list_filename, (-1, time.time() - 1800));
599
os.utime(self.reporter.sources_list_filename, (-1, time.time() - 1800))
590
600
self.assertFalse(self.reporter._apt_sources_have_changed())
592
602
def test_wb_apt_sources_have_changed_with_directory(self):
709
719
reactor.callWhenRunning(do_test)
722
def test_run_smart_update_touches_stamp_file(self):
724
The L{PackageReporter.run_smart_update} method touches a stamp file
725
after running the smart-update wrapper.
727
self.reporter.sources_list_filename = "/I/Dont/Exist"
728
self.reporter.smart_update_filename = "/bin/true"
729
deferred = Deferred()
733
result = self.reporter.run_smart_update()
735
def callback(ignored):
737
os.path.exists(self.config.smart_update_stamp_filename))
738
result.addCallback(callback)
739
result.chainDeferred(deferred)
741
reactor.callWhenRunning(do_test)
712
744
def test_remove_expired_hash_id_request(self):
713
745
request = self.store.add_hash_id_request(["hash1"])
714
746
request.message_id = 9999
898
930
self.assertEquals(sorted(self.store.get_available()), [1, 2, 3])
900
result = self.reporter.detect_changes()
932
result = self.reporter.detect_packages_changes()
901
933
return result.addCallback(got_result)
903
def test_detect_changes_with_available_and_unknown_hash(self):
935
def test_detect_packages_changes_with_available_and_unknown_hash(self):
904
936
message_store = self.broker_service.message_store
905
937
message_store.set_accepted_types(["packages"])
913
945
self.assertEquals(sorted(self.store.get_available()), [1, 3])
915
result = self.reporter.detect_changes()
947
result = self.reporter.detect_packages_changes()
916
948
return result.addCallback(got_result)
918
def test_detect_changes_with_available_and_previously_known(self):
950
def test_detect_packages_changes_with_available_and_previously_known(self):
919
951
message_store = self.broker_service.message_store
920
952
message_store.set_accepted_types(["packages"])
929
961
self.assertEquals(sorted(self.store.get_available()), [1, 2, 3])
931
result = self.reporter.detect_changes()
963
result = self.reporter.detect_packages_changes()
932
964
return result.addCallback(got_result)
934
def test_detect_changes_with_not_available(self):
966
def test_detect_packages_changes_with_not_available(self):
935
967
message_store = self.broker_service.message_store
936
968
message_store.set_accepted_types(["packages"])
949
981
self.assertEquals(self.store.get_available(), [])
951
result = self.reporter.detect_changes()
983
result = self.reporter.detect_packages_changes()
952
984
return result.addCallback(got_result)
954
def test_detect_changes_with_installed(self):
986
def test_detect_packages_changes_with_installed(self):
955
987
message_store = self.broker_service.message_store
956
988
message_store.set_accepted_types(["packages"])
967
999
self.assertEquals(self.store.get_installed(), [1])
969
result = self.reporter.detect_changes()
1001
result = self.reporter.detect_packages_changes()
970
1002
return result.addCallback(got_result)
972
def test_detect_changes_with_installed_already_known(self):
1004
def test_detect_packages_changes_with_installed_already_known(self):
973
1005
message_store = self.broker_service.message_store
974
1006
message_store.set_accepted_types(["packages"])
980
1012
self.set_pkg1_installed()
982
1014
def got_result(result):
1015
self.assertFalse(result)
983
1016
self.assertMessages(message_store.get_pending_messages(), [])
985
result = self.reporter.detect_changes()
1018
result = self.reporter.detect_packages_changes()
986
1019
return result.addCallback(got_result)
988
def test_detect_changes_with_not_installed(self):
1021
def test_detect_packages_changes_with_not_installed(self):
989
1022
message_store = self.broker_service.message_store
990
1023
message_store.set_accepted_types(["packages"])
994
1027
self.store.add_installed([1])
996
1029
def got_result(result):
1030
self.assertTrue(result)
997
1031
self.assertMessages(message_store.get_pending_messages(),
998
1032
[{"type": "packages", "not-installed": [1]}])
1000
1034
self.assertEquals(self.store.get_installed(), [])
1002
result = self.reporter.detect_changes()
1036
result = self.reporter.detect_packages_changes()
1003
1037
return result.addCallback(got_result)
1005
def test_detect_changes_with_upgrade_but_not_installed(self):
1039
def test_detect_packages_changes_with_upgrade_but_not_installed(self):
1006
1040
message_store = self.broker_service.message_store
1007
1041
message_store.set_accepted_types(["packages"])
1014
1048
def got_result(result):
1015
1049
self.assertMessages(message_store.get_pending_messages(), [])
1017
result = self.reporter.detect_changes()
1051
result = self.reporter.detect_packages_changes()
1018
1052
return result.addCallback(got_result)
1020
def test_detect_changes_with_upgrade(self):
1054
def test_detect_packages_changes_with_upgrade(self):
1021
1055
message_store = self.broker_service.message_store
1022
1056
message_store.set_accepted_types(["packages"])
1036
1070
self.assertEquals(self.store.get_available_upgrades(), [2])
1038
result = self.reporter.detect_changes()
1072
result = self.reporter.detect_packages_changes()
1039
1073
return result.addCallback(got_result)
1041
def test_detect_changes_with_not_upgrade(self):
1075
def test_detect_packages_changes_with_not_upgrade(self):
1042
1076
message_store = self.broker_service.message_store
1043
1077
message_store.set_accepted_types(["packages"])
1054
1088
self.assertEquals(self.store.get_available_upgrades(), [])
1056
result = self.reporter.detect_changes()
1090
result = self.reporter.detect_packages_changes()
1057
1091
return result.addCallback(got_result)
1059
def test_detect_changes_with_locked(self):
1093
def test_detect_packages_changes_with_locked(self):
1061
1095
If Smart indicates locked packages we didn't know about, report
1062
1096
them to the server.
1075
1109
[{"type": "packages", "locked": [1, 2]}])
1076
1110
self.assertEquals(sorted(self.store.get_locked()), [1, 2])
1078
result = self.reporter.detect_changes()
1112
result = self.reporter.detect_packages_changes()
1079
1113
return result.addCallback(got_result)
1081
def test_detect_changes_with_locked_and_ranges(self):
1115
def test_detect_packages_changes_with_locked_and_ranges(self):
1083
1117
Ranges are used when reporting changes to 3 or more locked packages
1084
1118
having consecutive ids.
1098
1132
[{"type": "packages", "locked": [(1, 3)]}])
1099
1133
self.assertEquals(sorted(self.store.get_locked()), [1, 2, 3])
1101
result = self.reporter.detect_changes()
1135
result = self.reporter.detect_packages_changes()
1102
1136
return result.addCallback(got_result)
1104
def test_detect_changes_with_locked_with_unknown_hash(self):
1138
def test_detect_packages_changes_with_locked_with_unknown_hash(self):
1106
1140
Locked packages whose hashes are unknown don't get reported.
1110
1144
def got_result(result):
1111
1145
self.assertEquals(self.store.get_locked(), [])
1113
result = self.reporter.detect_changes()
1147
result = self.reporter.detect_packages_changes()
1114
1148
return result.addCallback(got_result)
1116
def test_detect_changes_with_locked_and_previously_known(self):
1150
def test_detect_packages_changes_with_locked_and_previously_known(self):
1118
1152
We don't report locked packages we already know about.
1134
1168
self.assertEquals(sorted(self.store.get_locked()), [1, 2])
1136
result = self.reporter.detect_changes()
1170
result = self.reporter.detect_packages_changes()
1137
1171
return result.addCallback(got_result)
1139
def test_detect_changes_with_not_locked(self):
1173
def test_detect_packages_changes_with_not_locked(self):
1141
1175
We report when a package was previously locked and isn't anymore.
1152
1186
[{"type": "packages", "not-locked": [1]}])
1153
1187
self.assertEquals(self.store.get_locked(), [])
1155
result = self.reporter.detect_changes()
1189
result = self.reporter.detect_packages_changes()
1156
1190
return result.addCallback(got_result)
1158
def test_detect_changes_with_not_locked_and_ranges(self):
1192
def test_detect_packages_changes_with_not_locked_and_ranges(self):
1160
1194
Ranges are used when reporting changes to 3 or more not locked packages
1161
1195
having consecutive ids.
1173
1207
[{"type": "packages", "not-locked": [(1, 3)]}])
1174
1208
self.assertEquals(sorted(self.store.get_locked()), [])
1176
result = self.reporter.detect_changes()
1210
result = self.reporter.detect_packages_changes()
1177
1211
return result.addCallback(got_result)
1179
1213
def test_detect_package_locks_changes_with_create_locks(self):
1253
1287
result = self.reporter.detect_package_locks_changes()
1254
1288
return result.addCallback(got_result)
1290
def test_detect_package_locks_changes_with_locked_already_known(self):
1292
If we didn't detect any change in the package locks, we don't send any
1293
message, and we return a deferred resulting in C{False}.
1295
message_store = self.broker_service.message_store
1296
message_store.set_accepted_types(["package-locks"])
1298
self.facade.set_package_lock("name1")
1299
self.store.add_package_locks([("name1", "", "")])
1301
def got_result(result):
1302
self.assertFalse(result)
1303
self.assertMessages(message_store.get_pending_messages(), [])
1305
result = self.reporter.detect_packages_changes()
1306
return result.addCallback(got_result)
1308
def test_detect_changes_considers_packages_and_locks_changes(self):
1310
The L{PackageReporter.detect_changes} method considers both package and
1311
package locks changes. It also releases smart locks by calling the
1312
L{SmartFacade.deinit} method.
1314
reporter_mock = self.mocker.patch(self.reporter)
1315
reporter_mock.detect_packages_changes()
1316
self.mocker.result(succeed(True))
1317
reporter_mock.detect_package_locks_changes()
1318
self.mocker.result(succeed(True))
1320
facade_mock = self.mocker.patch(self.facade)
1321
facade_mock.deinit()
1323
self.mocker.replay()
1324
return self.reporter.detect_changes()
1326
def test_detect_changes_fires_package_data_changed(self):
1328
The L{PackageReporter.detect_changes} method fires an event of
1329
type 'package-data-changed' if we detected something has changed
1330
with respect to our previous run.
1332
reporter_mock = self.mocker.patch(self.reporter)
1333
reporter_mock.detect_packages_changes()
1334
self.mocker.result(succeed(False))
1335
reporter_mock.detect_package_locks_changes()
1336
self.mocker.result(succeed(True))
1337
self.mocker.replay()
1339
deferred = Deferred()
1340
callback = lambda: deferred.callback(None)
1341
self.broker_service.reactor.call_on("package-data-changed", callback)
1342
self.reporter.detect_changes()
1256
1345
def test_run(self):
1257
1346
reporter_mock = self.mocker.patch(self.reporter)
1259
1348
self.mocker.order()
1261
results = [Deferred() for i in range(8)]
1350
results = [Deferred() for i in range(7)]
1263
1352
reporter_mock.run_smart_update()
1264
1353
self.mocker.result(results[0])
1352
1438
self.assertEquals(self.store.get_installed(), [2])
1353
1439
self.assertEquals(self.store.get_locked(), [3])
1354
1440
self.assertEquals(self.store.get_package_locks(), [("name1", "", "")])
1355
self.assertEquals(self.store.get_hash_id_request(request1.id).id, request1.id)
1441
self.assertEquals(self.store.get_hash_id_request(request1.id).id,
1357
1444
self.store.add_task("reporter", {"type": "resynchronize"})
1368
1455
# But the other data should.
1369
1456
self.assertEquals(self.store.get_available_upgrades(), [])
1371
# After running the resychronize task, detect_changes is called,
1372
# and the existing known hashes are made available.
1458
# After running the resychronize task, detect_packages_changes is
1459
# called, and the existing known hashes are made available.
1373
1460
self.assertEquals(self.store.get_available(), [3, 4])
1374
1461
self.assertEquals(self.store.get_installed(), [])
1375
1462
self.assertEquals(self.store.get_locked(), [3])