Skip to content

Commit 5479563

Browse files
committed
Add tests for Updater input validation
This test covers `targetinfo`, `target_path`, `target_base_url`, `metadata_dir` and `filepath` input validation of the `Updater` methods Signed-off-by: Ivana Atanasova <[email protected]>
1 parent 45cf607 commit 5479563

File tree

1 file changed

+103
-0
lines changed

1 file changed

+103
-0
lines changed

tests/test_updater_validation.py

Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
1+
#!/usr/bin/env python
2+
3+
# Copyright 2022, New York University and the TUF contributors
4+
# SPDX-License-Identifier: MIT OR Apache-2.0
5+
6+
"""Test ngclient Updater validations.
7+
"""
8+
9+
import os
10+
import sys
11+
import tempfile
12+
import unittest
13+
14+
import securesystemslib.exceptions
15+
16+
from tests import utils
17+
from tests.repository_simulator import RepositorySimulator
18+
from tuf import unittest_toolbox
19+
from tuf.api.metadata import TargetFile
20+
from tuf.exceptions import FetcherHTTPError
21+
from tuf.ngclient import Updater
22+
23+
24+
class TestUpdater(unittest_toolbox.Modified_TestCase):
25+
"""Test ngclient Updater input validation."""
26+
27+
def setUp(self) -> None:
28+
# pylint: disable-next=consider-using-with
29+
self.temp_dir = tempfile.TemporaryDirectory()
30+
self.metadata_dir = os.path.join(self.temp_dir.name, "metadata")
31+
self.targets_dir = os.path.join(self.temp_dir.name, "targets")
32+
os.mkdir(self.metadata_dir)
33+
os.mkdir(self.targets_dir)
34+
35+
# Setup the repository, bootstrap client root.json
36+
self.sim = RepositorySimulator()
37+
with open(os.path.join(self.metadata_dir, "root.json"), "bw") as f:
38+
f.write(self.sim.signed_roots[0])
39+
40+
def tearDown(self) -> None:
41+
self.temp_dir.cleanup()
42+
43+
def _new_updater(self) -> Updater:
44+
return Updater(
45+
self.metadata_dir,
46+
"https://example.com/metadata/",
47+
self.targets_dir,
48+
"https://example.com/targets/",
49+
fetcher=self.sim,
50+
)
51+
52+
def test_empty_target_path_validation(self) -> None:
53+
updater = self._new_updater()
54+
target_file = updater.get_targetinfo("")
55+
self.assertIsNone(target_file)
56+
57+
def test_empty_targetinfo_validation(self) -> None:
58+
# Initialize Updater without targets setup
59+
updater = Updater(
60+
self.metadata_dir,
61+
"https://example.com/metadata/",
62+
fetcher=self.sim,
63+
)
64+
info = TargetFile(1, {"sha256": ""}, "")
65+
with self.assertRaisesRegex(
66+
ValueError, "target_dir must be set if filepath is not given"
67+
):
68+
updater.download_target(info)
69+
70+
updater = self._new_updater()
71+
with self.assertRaisesRegex(FetcherHTTPError, "No target"):
72+
updater.download_target(info)
73+
74+
def test_empty_filepath_validation(self) -> None:
75+
self.sim.add_target("targets", b"content", "targetpath")
76+
self.sim.targets.version += 1
77+
self.sim.update_snapshot()
78+
79+
updater = self._new_updater()
80+
target_info = updater.get_targetinfo("targetpath")
81+
assert target_info is not None
82+
with self.assertRaises(securesystemslib.exceptions.StorageError):
83+
updater.download_target(target_info, filepath="")
84+
85+
def test_non_existing_metadata_dir_validation(self) -> None:
86+
with self.assertRaises(FileNotFoundError):
87+
# Initialize Updater with non-existing metadata_dir
88+
Updater(
89+
"non_existing_metadata_dir",
90+
"https://example.com/metadata/",
91+
fetcher=self.sim,
92+
)
93+
94+
def test_invalid_target_base_url(self) -> None:
95+
updater = self._new_updater()
96+
info = TargetFile(1, {"sha256": ""}, "targetpath")
97+
with self.assertRaises(FetcherHTTPError):
98+
updater.download_target(info, target_base_url="invalid_url")
99+
100+
101+
if __name__ == "__main__":
102+
utils.configure_test_logging(sys.argv)
103+
unittest.main()

0 commit comments

Comments
 (0)