|
13 | 13 | import shutil |
14 | 14 | import tempfile |
15 | 15 | import unittest |
| 16 | +import copy |
16 | 17 |
|
17 | 18 | from datetime import datetime, timedelta |
18 | 19 | from dateutil.relativedelta import relativedelta |
@@ -42,6 +43,10 @@ def setUpModule(): |
42 | 43 | import_ed25519_privatekey_from_file |
43 | 44 | ) |
44 | 45 |
|
| 46 | + from securesystemslib.keys import ( |
| 47 | + format_keyval_to_metadata |
| 48 | + ) |
| 49 | + |
45 | 50 | logger = logging.getLogger(__name__) |
46 | 51 |
|
47 | 52 |
|
@@ -215,12 +220,14 @@ def test_metadata_snapshot(self): |
215 | 220 | snapshot = Metadata.from_json_file(snapshot_path) |
216 | 221 |
|
217 | 222 | # Create a dict representing what we expect the updated data to be |
218 | | - fileinfo = snapshot.signed.meta |
| 223 | + fileinfo = copy.deepcopy(snapshot.signed.meta) |
219 | 224 | hashes = {'sha256': 'c2986576f5fdfd43944e2b19e775453b96748ec4fe2638a6d2f32f1310967095'} |
220 | 225 | fileinfo['role1.json']['version'] = 2 |
221 | 226 | fileinfo['role1.json']['hashes'] = hashes |
222 | 227 | fileinfo['role1.json']['length'] = 123 |
223 | 228 |
|
| 229 | + |
| 230 | + self.assertNotEqual(snapshot.signed.meta, fileinfo) |
224 | 231 | snapshot.signed.update('role1', 2, 123, hashes) |
225 | 232 | self.assertEqual(snapshot.signed.meta, fileinfo) |
226 | 233 |
|
@@ -250,14 +257,73 @@ def test_metadata_timestamp(self): |
250 | 257 | self.assertEqual(timestamp.signed.expires, datetime(2036, 1, 3, 0, 0)) |
251 | 258 |
|
252 | 259 | hashes = {'sha256': '0ae9664468150a9aa1e7f11feecb32341658eb84292851367fea2da88e8a58dc'} |
253 | | - fileinfo = timestamp.signed.meta['snapshot.json'] |
| 260 | + fileinfo = copy.deepcopy(timestamp.signed.meta['snapshot.json']) |
254 | 261 | fileinfo['hashes'] = hashes |
255 | 262 | fileinfo['version'] = 2 |
256 | 263 | fileinfo['length'] = 520 |
| 264 | + |
| 265 | + self.assertNotEqual(timestamp.signed.meta['snapshot.json'], fileinfo) |
257 | 266 | timestamp.signed.update(2, 520, hashes) |
258 | 267 | self.assertEqual(timestamp.signed.meta['snapshot.json'], fileinfo) |
259 | 268 |
|
260 | 269 |
|
| 270 | + def test_metadata_root(self): |
| 271 | + root_path = os.path.join( |
| 272 | + self.repo_dir, 'metadata', 'root.json') |
| 273 | + root = Metadata.from_json_file(root_path) |
| 274 | + |
| 275 | + # Add a second key to root role |
| 276 | + root_key2 = import_ed25519_publickey_from_file( |
| 277 | + os.path.join(self.keystore_dir, 'root_key2.pub')) |
| 278 | + |
| 279 | + keyid = root_key2['keyid'] |
| 280 | + key_metadata = format_keyval_to_metadata( |
| 281 | + root_key2['keytype'], root_key2['scheme'], root_key2['keyval']) |
| 282 | + |
| 283 | + # Assert that root does not contain the new key |
| 284 | + self.assertNotIn(keyid, root.signed.roles['root']['keyids']) |
| 285 | + self.assertNotIn(keyid, root.signed.keys) |
| 286 | + |
| 287 | + # Add new root key |
| 288 | + root.signed.add_key('root', keyid, key_metadata) |
| 289 | + |
| 290 | + # Assert that key is added |
| 291 | + self.assertIn(keyid, root.signed.roles['root']['keyids']) |
| 292 | + self.assertIn(keyid, root.signed.keys) |
| 293 | + |
| 294 | + # Remove the key |
| 295 | + root.signed.remove_key('root', keyid) |
| 296 | + |
| 297 | + # Assert that root does not contain the new key anymore |
| 298 | + self.assertNotIn(keyid, root.signed.roles['root']['keyids']) |
| 299 | + self.assertNotIn(keyid, root.signed.keys) |
| 300 | + |
| 301 | + |
| 302 | + |
| 303 | + def test_metadata_targets(self): |
| 304 | + targets_path = os.path.join( |
| 305 | + self.repo_dir, 'metadata', 'targets.json') |
| 306 | + targets = Metadata.from_json_file(targets_path) |
| 307 | + |
| 308 | + # Create a fileinfo dict representing what we expect the updated data to be |
| 309 | + filename = 'file2.txt' |
| 310 | + hashes = { |
| 311 | + "sha256": "141f740f53781d1ca54b8a50af22cbf74e44c21a998fa2a8a05aaac2c002886b", |
| 312 | + "sha512": "ef5beafa16041bcdd2937140afebd485296cd54f7348ecd5a4d035c09759608de467a7ac0eb58753d0242df873c305e8bffad2454aa48f44480f15efae1cacd0" |
| 313 | + }, |
| 314 | + |
| 315 | + fileinfo = { |
| 316 | + 'hashes': hashes, |
| 317 | + 'length': 28 |
| 318 | + } |
| 319 | + |
| 320 | + # Assert that data is not aleady equal |
| 321 | + self.assertNotEqual(targets.signed.targets[filename], fileinfo) |
| 322 | + # Update an already existing fileinfo |
| 323 | + targets.signed.update(filename, fileinfo) |
| 324 | + # Verify that data is updated |
| 325 | + self.assertEqual(targets.signed.targets[filename], fileinfo) |
| 326 | + |
261 | 327 | # Run unit test. |
262 | 328 | if __name__ == '__main__': |
263 | 329 | utils.configure_test_logging(sys.argv) |
|
0 commit comments