Skip to content

Commit e5f8c6e

Browse files
committed
tests: Use Updater bootstrap argument
Update test_updater_toplevel_update to use bootstrap argument by default. This still does not include tests for bootstrap feature specifically but it should prove nothing has broken when the feature was added. Signed-off-by: Jussi Kukkonen <[email protected]>
1 parent eeb48f6 commit e5f8c6e

File tree

1 file changed

+16
-40
lines changed

1 file changed

+16
-40
lines changed

tests/test_updater_top_level_update.py

Lines changed: 16 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55

66
import builtins
77
import datetime
8+
import logging
89
import os
910
import sys
1011
import tempfile
@@ -58,10 +59,6 @@ def setUp(self) -> None:
5859

5960
self.sim = RepositorySimulator()
6061

61-
# boostrap client with initial root metadata
62-
with open(os.path.join(self.metadata_dir, "root.json"), "bw") as f:
63-
f.write(self.sim.signed_roots[0])
64-
6562
if self.dump_dir is not None:
6663
# create test specific dump directory
6764
name = self.id().split(".")[-1]
@@ -71,22 +68,13 @@ def setUp(self) -> None:
7168
def tearDown(self) -> None:
7269
self.temp_dir.cleanup()
7370

74-
def _run_refresh(self) -> Updater:
71+
def _run_refresh(self, skip_bootstrap:bool=False) -> Updater:
7572
"""Create a new Updater instance and refresh"""
76-
if self.dump_dir is not None:
77-
self.sim.write()
78-
79-
updater = Updater(
80-
self.metadata_dir,
81-
"https://example.com/metadata/",
82-
self.targets_dir,
83-
"https://example.com/targets/",
84-
self.sim,
85-
)
73+
updater = self._init_updater(skip_bootstrap)
8674
updater.refresh()
8775
return updater
8876

89-
def _init_updater(self) -> Updater:
77+
def _init_updater(self, skip_bootstrap:bool=False) -> Updater:
9078
"""Create a new Updater instance"""
9179
if self.dump_dir is not None:
9280
self.sim.write()
@@ -97,6 +85,7 @@ def _init_updater(self) -> Updater:
9785
self.targets_dir,
9886
"https://example.com/targets/",
9987
self.sim,
88+
bootstrap=None if skip_bootstrap else self.sim.signed_roots[0]
10089
)
10190

10291
def _assert_files_exist(self, roles: Iterable[str]) -> None:
@@ -122,9 +111,6 @@ def _assert_version_equals(self, role: str, expected_version: int) -> None:
122111
self.assertEqual(md.signed.version, expected_version)
123112

124113
def test_first_time_refresh(self) -> None:
125-
# Metadata dir contains only the mandatory initial root.json
126-
self._assert_files_exist([Root.type])
127-
128114
# Add one more root version to repository so that
129115
# refresh() updates from local trusted root (v1) to
130116
# remote root (v2)
@@ -138,10 +124,11 @@ def test_first_time_refresh(self) -> None:
138124
version = 2 if role == Root.type else None
139125
self._assert_content_equals(role, version)
140126

141-
def test_trusted_root_missing(self) -> None:
142-
os.remove(os.path.join(self.metadata_dir, "root.json"))
127+
def test_cached_root_missing_without_bootstrap(self) -> None:
128+
# Run update without a bootstrap, with empty cache: this fails since there is no
129+
# trusted root
143130
with self.assertRaises(OSError):
144-
self._run_refresh()
131+
self._run_refresh(skip_bootstrap=True)
145132

146133
# Metadata dir is empty
147134
self.assertFalse(os.listdir(self.metadata_dir))
@@ -174,15 +161,15 @@ def test_trusted_root_expired(self) -> None:
174161
self._assert_files_exist(TOP_LEVEL_ROLE_NAMES)
175162
self._assert_content_equals(Root.type, 3)
176163

177-
def test_trusted_root_unsigned(self) -> None:
178-
# Local trusted root is not signed
164+
def test_trusted_root_unsigned_without_bootstrap(self) -> None:
165+
# Cached root is not signed, bootstrap root is not used
179166
root_path = os.path.join(self.metadata_dir, "root.json")
180-
md_root = Metadata.from_file(root_path)
167+
md_root = Metadata.from_bytes(self.sim.signed_roots[0])
181168
md_root.signatures.clear()
182169
md_root.to_file(root_path)
183170

184171
with self.assertRaises(UnsignedMetadataError):
185-
self._run_refresh()
172+
self._run_refresh(skip_bootstrap=True)
186173

187174
# The update failed, no changes in metadata
188175
self._assert_files_exist([Root.type])
@@ -200,10 +187,7 @@ def test_max_root_rotations(self) -> None:
200187
self.sim.root.version += 1
201188
self.sim.publish_root()
202189

203-
md_root = Metadata.from_file(
204-
os.path.join(self.metadata_dir, "root.json")
205-
)
206-
initial_root_version = md_root.signed.version
190+
initial_root_version = 1
207191

208192
updater.refresh()
209193

@@ -708,26 +692,18 @@ def test_load_metadata_from_cache(self, wrapped_open: MagicMock) -> None:
708692
updater = self._run_refresh()
709693
updater.get_targetinfo("non_existent_target")
710694

711-
# Clean up calls to open during refresh()
695+
# Clear statistics for calls and metadata requests
712696
wrapped_open.reset_mock()
713-
# Clean up fetch tracker metadata
714697
self.sim.fetch_tracker.metadata.clear()
715698

716699
# Create a new updater and perform a second update while
717700
# the metadata is already stored in cache (metadata dir)
718-
updater = Updater(
719-
self.metadata_dir,
720-
"https://example.com/metadata/",
721-
self.targets_dir,
722-
"https://example.com/targets/",
723-
self.sim,
724-
)
701+
updater = self._init_updater()
725702
updater.get_targetinfo("non_existent_target")
726703

727704
# Test that metadata is loaded from cache and not downloaded
728705
wrapped_open.assert_has_calls(
729706
[
730-
call(os.path.join(self.metadata_dir, "root.json"), "rb"),
731707
call(os.path.join(self.metadata_dir, "root_history/2.root.json"), "rb"),
732708
call(os.path.join(self.metadata_dir, "timestamp.json"), "rb"),
733709
call(os.path.join(self.metadata_dir, "snapshot.json"), "rb"),

0 commit comments

Comments
 (0)