42
42
self.assertTrue(config.force_smart_update)
45
class PackageReporterTest(LandscapeTest):
47
helpers = [AptFacadeHelper, SimpleRepositoryHelper, BrokerServiceHelper]
52
self.store = PackageStore(self.makeFile())
53
self.config = PackageReporterConfiguration()
54
self.reporter = PackageReporter(
55
self.store, self.facade, self.remote, self.config)
56
self.config.data_path = self.makeDir()
57
os.mkdir(self.config.package_directory)
59
result = super(PackageReporterTest, self).setUp()
60
return result.addCallback(set_up)
62
def _install_deb_file(self, path):
63
"""Fake the the given deb file is installed in the system."""
65
deb = apt_inst.DebFile(deb_file)
66
control = deb.control.extractdata("control")
68
lines = control.splitlines()
69
lines.insert(1, "Status: install ok installed")
70
status = "\n".join(lines)
71
append_file(self.dpkg_status, status + "\n\n")
73
def _add_package_to_deb_dir(self, path, name, version="1.0"):
74
"""Add fake package information to a directory.
76
There will only be basic information about the package
77
available, so that get_packages() have something to return.
78
There won't be an actual package in the dir.
80
package_stanza = textwrap.dedent("""
90
Description: description
94
os.path.join(path, "Packages"),
95
package_stanza % {"name": name, "version": version})
97
def set_pkg1_upgradable(self):
98
self._add_package_to_deb_dir(
99
self.repository_dir, "name1", version="version2")
101
def set_pkg1_installed(self):
102
self._install_deb_file(os.path.join(self.repository_dir, PKGNAME1))
45
class PackageReporterTestMixin(object):
104
47
def test_set_package_ids_with_all_known(self):
105
48
self.store.add_hash_id_request(["hash1", "hash2"])
1228
1171
result = self.reporter.detect_packages_changes()
1229
1172
return result.addCallback(got_result)
1231
def disabled_test_detect_packages_changes_with_locked(self):
1233
If Smart indicates locked packages we didn't know about, report
1236
message_store = self.broker_service.message_store
1237
message_store.set_accepted_types(["packages"])
1239
self.facade.set_package_lock("name1")
1240
self.facade.set_package_lock("name2", ">=", "version2")
1242
self.store.set_hash_ids({HASH1: 1, HASH2: 2})
1243
self.store.add_available([1, 2])
1245
def got_result(result):
1246
self.assertMessages(message_store.get_pending_messages(),
1247
[{"type": "packages", "locked": [1, 2]}])
1248
self.assertEqual(sorted(self.store.get_locked()), [1, 2])
1250
result = self.reporter.detect_packages_changes()
1251
return result.addCallback(got_result)
1253
def disabled_test_detect_packages_changes_with_locked_and_ranges(self):
1255
Ranges are used when reporting changes to 3 or more locked packages
1256
having consecutive ids.
1258
message_store = self.broker_service.message_store
1259
message_store.set_accepted_types(["packages"])
1261
self.facade.set_package_lock("name1")
1262
self.facade.set_package_lock("name2", ">=", "version2")
1263
self.facade.set_package_lock("name3", "<", "version4")
1265
self.store.set_hash_ids({HASH1: 1, HASH2: 2, HASH3: 3})
1266
self.store.add_available([1, 2, 3])
1268
def got_result(result):
1269
self.assertMessages(message_store.get_pending_messages(),
1270
[{"type": "packages", "locked": [(1, 3)]}])
1271
self.assertEqual(sorted(self.store.get_locked()), [1, 2, 3])
1273
result = self.reporter.detect_packages_changes()
1274
return result.addCallback(got_result)
1276
def disabled_test_detect_packages_changes_with_locked_with_unknown_hash(self):
1278
Locked packages whose hashes are unknown don't get reported.
1280
self.facade.set_package_lock("name1")
1282
def got_result(result):
1283
self.assertEqual(self.store.get_locked(), [])
1285
result = self.reporter.detect_packages_changes()
1286
return result.addCallback(got_result)
1288
def disabled_test_detect_packages_changes_with_locked_and_previously_known(self):
1290
We don't report locked packages we already know about.
1292
message_store = self.broker_service.message_store
1293
message_store.set_accepted_types(["packages"])
1295
self.facade.set_package_lock("name1")
1296
self.facade.set_package_lock("name2", ">=", "version2")
1298
self.store.set_hash_ids({HASH1: 1, HASH2: 2})
1299
self.store.add_available([1, 2])
1300
self.store.add_locked([1])
1302
def got_result(result):
1303
self.assertMessages(message_store.get_pending_messages(),
1304
[{"type": "packages", "locked": [2]}])
1306
self.assertEqual(sorted(self.store.get_locked()), [1, 2])
1308
result = self.reporter.detect_packages_changes()
1309
return result.addCallback(got_result)
1311
def disabled_test_detect_packages_changes_with_not_locked(self):
1313
We report when a package was previously locked and isn't anymore.
1315
message_store = self.broker_service.message_store
1316
message_store.set_accepted_types(["packages"])
1318
self.store.set_hash_ids({HASH1: 1})
1319
self.store.add_available([1])
1320
self.store.add_locked([1])
1322
def got_result(result):
1323
self.assertMessages(message_store.get_pending_messages(),
1324
[{"type": "packages", "not-locked": [1]}])
1325
self.assertEqual(self.store.get_locked(), [])
1327
result = self.reporter.detect_packages_changes()
1328
return result.addCallback(got_result)
1330
1174
def test_detect_packages_changes_with_not_locked_and_ranges(self):
1332
1176
Ranges are used when reporting changes to 3 or more not locked packages
1348
1192
result = self.reporter.detect_packages_changes()
1349
1193
return result.addCallback(got_result)
1351
def disabled_test_detect_package_locks_changes_with_create_locks(self):
1353
If Smart indicates package locks we didn't know about, report
1356
message_store = self.broker_service.message_store
1357
message_store.set_accepted_types(["package-locks"])
1359
self.facade.set_package_lock("name")
1361
logging_mock = self.mocker.replace("logging.info")
1362
logging_mock("Queuing message with changes in known package locks:"
1363
" 1 created, 0 deleted.")
1364
self.mocker.replay()
1366
def got_result(result):
1367
self.assertMessages(message_store.get_pending_messages(),
1368
[{"type": "package-locks",
1369
"created": [("name", "", "")]}])
1370
self.assertEqual(self.store.get_package_locks(),
1373
result = self.reporter.detect_package_locks_changes()
1374
return result.addCallback(got_result)
1376
def disabled_test_detect_package_locks_changes_with_already_known_locks(self):
1378
We don't report changes about locks we already know about.
1380
message_store = self.broker_service.message_store
1381
message_store.set_accepted_types(["package-locks"])
1383
self.facade.set_package_lock("name1")
1384
self.facade.set_package_lock("name2", "<", "1.2")
1386
self.store.add_package_locks([("name1", "", "")])
1388
logging_mock = self.mocker.replace("logging.info")
1389
logging_mock("Queuing message with changes in known package locks:"
1390
" 1 created, 0 deleted.")
1391
self.mocker.replay()
1393
def got_result(result):
1394
self.assertMessages(message_store.get_pending_messages(),
1395
[{"type": "package-locks",
1396
"created": [("name2", "<", "1.2")]}])
1397
self.assertEqual(sorted(self.store.get_package_locks()),
1399
("name2", "<", "1.2")])
1401
result = self.reporter.detect_package_locks_changes()
1402
return result.addCallback(got_result)
1404
def disabled_test_detect_package_locks_changes_with_deleted_locks(self):
1406
If Smart indicates newly unset package locks, report them to the
1409
message_store = self.broker_service.message_store
1410
message_store.set_accepted_types(["package-locks"])
1412
self.store.add_package_locks([("name1", "", "")])
1414
logging_mock = self.mocker.replace("logging.info")
1415
logging_mock("Queuing message with changes in known package locks:"
1416
" 0 created, 1 deleted.")
1417
self.mocker.replay()
1419
def got_result(result):
1420
self.assertMessages(message_store.get_pending_messages(),
1421
[{"type": "package-locks",
1422
"deleted": [("name1", "", "")]}])
1423
self.assertEqual(self.store.get_package_locks(), [])
1425
result = self.reporter.detect_package_locks_changes()
1426
return result.addCallback(got_result)
1428
def disabled_test_detect_package_locks_changes_with_locked_already_known(self):
1430
If we didn't detect any change in the package locks, we don't send any
1431
message, and we return a deferred resulting in C{False}.
1433
message_store = self.broker_service.message_store
1434
message_store.set_accepted_types(["package-locks"])
1436
self.facade.set_package_lock("name1")
1437
self.store.add_package_locks([("name1", "", "")])
1439
def got_result(result):
1440
self.assertFalse(result)
1441
self.assertMessages(message_store.get_pending_messages(), [])
1443
result = self.reporter.detect_packages_changes()
1444
return result.addCallback(got_result)
1446
1195
def test_detect_changes_considers_packages_and_locks_changes(self):
1448
1197
The L{PackageReporter.detect_changes} method considers both package and
1628
1377
return deferred
1380
class PackageReporterSmartTest(LandscapeTest, PackageReporterTestMixin):
1382
helpers = [SmartFacadeHelper, SimpleRepositoryHelper, BrokerServiceHelper]
1386
def set_up(ignored):
1387
self.store = PackageStore(self.makeFile())
1388
self.config = PackageReporterConfiguration()
1389
self.reporter = PackageReporter(
1390
self.store, self.facade, self.remote, self.config)
1391
self.config.data_path = self.makeDir()
1392
os.mkdir(self.config.package_directory)
1394
result = super(PackageReporterSmartTest, self).setUp()
1395
return result.addCallback(set_up)
1398
class PackageReporterAptTest(LandscapeTest, PackageReporterTestMixin):
1400
helpers = [AptFacadeHelper, SimpleRepositoryHelper, BrokerServiceHelper]
1404
def set_up(ignored):
1405
self.store = PackageStore(self.makeFile())
1406
self.config = PackageReporterConfiguration()
1407
self.reporter = PackageReporter(
1408
self.store, self.facade, self.remote, self.config)
1409
self.config.data_path = self.makeDir()
1410
os.mkdir(self.config.package_directory)
1412
result = super(PackageReporterAptTest, self).setUp()
1413
return result.addCallback(set_up)
1415
def _install_deb_file(self, path):
1416
"""Fake the the given deb file is installed in the system."""
1417
deb_file = open(path)
1418
deb = apt_inst.DebFile(deb_file)
1419
control = deb.control.extractdata("control")
1421
lines = control.splitlines()
1422
lines.insert(1, "Status: install ok installed")
1423
status = "\n".join(lines)
1424
append_file(self.dpkg_status, status + "\n\n")
1426
def _add_package_to_deb_dir(self, path, name, version="1.0"):
1427
"""Add fake package information to a directory.
1429
There will only be basic information about the package
1430
available, so that get_packages() have something to return.
1431
There won't be an actual package in the dir.
1433
package_stanza = textwrap.dedent("""
1437
Installed-Size: 1234
1441
Version: %(version)s
1443
Description: description
1447
os.path.join(path, "Packages"),
1448
package_stanza % {"name": name, "version": version})
1450
def set_pkg1_upgradable(self):
1451
self._add_package_to_deb_dir(
1452
self.repository_dir, "name1", version="version2")
1454
def set_pkg1_installed(self):
1455
self._install_deb_file(os.path.join(self.repository_dir, PKGNAME1))
1457
def disabled_test_detect_packages_changes_with_locked(self):
1459
If Smart indicates locked packages we didn't know about, report
1462
message_store = self.broker_service.message_store
1463
message_store.set_accepted_types(["packages"])
1465
self.facade.set_package_lock("name1")
1466
self.facade.set_package_lock("name2", ">=", "version2")
1468
self.store.set_hash_ids({HASH1: 1, HASH2: 2})
1469
self.store.add_available([1, 2])
1471
def got_result(result):
1472
self.assertMessages(message_store.get_pending_messages(),
1473
[{"type": "packages", "locked": [1, 2]}])
1474
self.assertEqual(sorted(self.store.get_locked()), [1, 2])
1476
result = self.reporter.detect_packages_changes()
1477
return result.addCallback(got_result)
1479
def disabled_test_detect_packages_changes_with_locked_and_ranges(self):
1481
Ranges are used when reporting changes to 3 or more locked packages
1482
having consecutive ids.
1484
message_store = self.broker_service.message_store
1485
message_store.set_accepted_types(["packages"])
1487
self.facade.set_package_lock("name1")
1488
self.facade.set_package_lock("name2", ">=", "version2")
1489
self.facade.set_package_lock("name3", "<", "version4")
1491
self.store.set_hash_ids({HASH1: 1, HASH2: 2, HASH3: 3})
1492
self.store.add_available([1, 2, 3])
1494
def got_result(result):
1495
self.assertMessages(message_store.get_pending_messages(),
1496
[{"type": "packages", "locked": [(1, 3)]}])
1497
self.assertEqual(sorted(self.store.get_locked()), [1, 2, 3])
1499
result = self.reporter.detect_packages_changes()
1500
return result.addCallback(got_result)
1502
def disabled_test_detect_packages_changes_with_locked_with_unknown_hash(self):
1504
Locked packages whose hashes are unknown don't get reported.
1506
self.facade.set_package_lock("name1")
1508
def got_result(result):
1509
self.assertEqual(self.store.get_locked(), [])
1511
result = self.reporter.detect_packages_changes()
1512
return result.addCallback(got_result)
1514
def disabled_test_detect_packages_changes_with_locked_and_previously_known(self):
1516
We don't report locked packages we already know about.
1518
message_store = self.broker_service.message_store
1519
message_store.set_accepted_types(["packages"])
1521
self.facade.set_package_lock("name1")
1522
self.facade.set_package_lock("name2", ">=", "version2")
1524
self.store.set_hash_ids({HASH1: 1, HASH2: 2})
1525
self.store.add_available([1, 2])
1526
self.store.add_locked([1])
1528
def got_result(result):
1529
self.assertMessages(message_store.get_pending_messages(),
1530
[{"type": "packages", "locked": [2]}])
1532
self.assertEqual(sorted(self.store.get_locked()), [1, 2])
1534
result = self.reporter.detect_packages_changes()
1535
return result.addCallback(got_result)
1537
def disabled_test_detect_packages_changes_with_not_locked(self):
1539
We report when a package was previously locked and isn't anymore.
1541
message_store = self.broker_service.message_store
1542
message_store.set_accepted_types(["packages"])
1544
self.store.set_hash_ids({HASH1: 1})
1545
self.store.add_available([1])
1546
self.store.add_locked([1])
1548
def got_result(result):
1549
self.assertMessages(message_store.get_pending_messages(),
1550
[{"type": "packages", "not-locked": [1]}])
1551
self.assertEqual(self.store.get_locked(), [])
1553
result = self.reporter.detect_packages_changes()
1554
return result.addCallback(got_result)
1556
def disabled_test_detect_package_locks_changes_with_create_locks(self):
1558
If Smart indicates package locks we didn't know about, report
1561
message_store = self.broker_service.message_store
1562
message_store.set_accepted_types(["package-locks"])
1564
self.facade.set_package_lock("name")
1566
logging_mock = self.mocker.replace("logging.info")
1567
logging_mock("Queuing message with changes in known package locks:"
1568
" 1 created, 0 deleted.")
1569
self.mocker.replay()
1571
def got_result(result):
1572
self.assertMessages(message_store.get_pending_messages(),
1573
[{"type": "package-locks",
1574
"created": [("name", "", "")]}])
1575
self.assertEqual(self.store.get_package_locks(),
1578
result = self.reporter.detect_package_locks_changes()
1579
return result.addCallback(got_result)
1581
def disabled_test_detect_package_locks_changes_with_already_known_locks(self):
1583
We don't report changes about locks we already know about.
1585
message_store = self.broker_service.message_store
1586
message_store.set_accepted_types(["package-locks"])
1588
self.facade.set_package_lock("name1")
1589
self.facade.set_package_lock("name2", "<", "1.2")
1591
self.store.add_package_locks([("name1", "", "")])
1593
logging_mock = self.mocker.replace("logging.info")
1594
logging_mock("Queuing message with changes in known package locks:"
1595
" 1 created, 0 deleted.")
1596
self.mocker.replay()
1598
def got_result(result):
1599
self.assertMessages(message_store.get_pending_messages(),
1600
[{"type": "package-locks",
1601
"created": [("name2", "<", "1.2")]}])
1602
self.assertEqual(sorted(self.store.get_package_locks()),
1604
("name2", "<", "1.2")])
1606
result = self.reporter.detect_package_locks_changes()
1607
return result.addCallback(got_result)
1609
def disabled_test_detect_package_locks_changes_with_deleted_locks(self):
1611
If Smart indicates newly unset package locks, report them to the
1614
message_store = self.broker_service.message_store
1615
message_store.set_accepted_types(["package-locks"])
1617
self.store.add_package_locks([("name1", "", "")])
1619
logging_mock = self.mocker.replace("logging.info")
1620
logging_mock("Queuing message with changes in known package locks:"
1621
" 0 created, 1 deleted.")
1622
self.mocker.replay()
1624
def got_result(result):
1625
self.assertMessages(message_store.get_pending_messages(),
1626
[{"type": "package-locks",
1627
"deleted": [("name1", "", "")]}])
1628
self.assertEqual(self.store.get_package_locks(), [])
1630
result = self.reporter.detect_package_locks_changes()
1631
return result.addCallback(got_result)
1633
def disabled_test_detect_package_locks_changes_with_locked_already_known(self):
1635
If we didn't detect any change in the package locks, we don't send any
1636
message, and we return a deferred resulting in C{False}.
1638
message_store = self.broker_service.message_store
1639
message_store.set_accepted_types(["package-locks"])
1641
self.facade.set_package_lock("name1")
1642
self.store.add_package_locks([("name1", "", "")])
1644
def got_result(result):
1645
self.assertFalse(result)
1646
self.assertMessages(message_store.get_pending_messages(), [])
1648
result = self.reporter.detect_packages_changes()
1649
return result.addCallback(got_result)
1631
1652
class GlobalPackageReporterTestMixin(object):
1633
1654
def test_store_messages(self):