Skip to content

Commit 56e6da5

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 d51b19f commit 56e6da5

File tree

1 file changed

+106
-0
lines changed

1 file changed

+106
-0
lines changed

tests/test_updater_validation.py

Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
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_with_targets_setup(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 _new_updater_without_targets_setup(self) -> Updater:
53+
return Updater(
54+
self.metadata_dir,
55+
"https://example.com/metadata/",
56+
fetcher=self.sim,
57+
)
58+
59+
def _new_updater_with_non_existing_metadata_dir(self) -> Updater:
60+
return Updater(
61+
"non_existing_metadata_dir",
62+
"https://example.com/metadata/",
63+
fetcher=self.sim,
64+
)
65+
66+
def test_empty_target_path_validation(self) -> None:
67+
updater = self._new_updater_with_targets_setup()
68+
target_file = updater.get_targetinfo("")
69+
self.assertIsNone(target_file)
70+
71+
def test_empty_targetinfo_validation(self) -> None:
72+
updater = self._new_updater_without_targets_setup()
73+
info = TargetFile(1, {"sha256": ""}, "")
74+
with self.assertRaisesRegex(
75+
ValueError, "target_dir must be set if filepath is not given"
76+
):
77+
updater.download_target(info)
78+
79+
updater = self._new_updater_with_targets_setup()
80+
with self.assertRaisesRegex(FetcherHTTPError, "No target"):
81+
updater.download_target(info)
82+
83+
def test_empty_filepath_validation(self) -> None:
84+
self.sim.add_target("targets", b"content", "targetpath")
85+
self.sim.targets.version += 1
86+
self.sim.update_snapshot()
87+
88+
updater = self._new_updater_with_targets_setup()
89+
target_info = updater.get_targetinfo("targetpath")
90+
with self.assertRaises(securesystemslib.exceptions.StorageError):
91+
updater.download_target(target_info, filepath="")
92+
93+
def test_non_existing_metadata_dir_validation(self) -> None:
94+
with self.assertRaises(FileNotFoundError):
95+
self._new_updater_with_non_existing_metadata_dir()
96+
97+
def test_invalid_target_base_url(self) -> None:
98+
updater = self._new_updater_with_targets_setup()
99+
info = TargetFile(1, {"sha256": ""}, "targetpath")
100+
with self.assertRaises(FetcherHTTPError):
101+
updater.download_target(info, target_base_url="invalid_url")
102+
103+
104+
if __name__ == "__main__":
105+
utils.configure_test_logging(sys.argv)
106+
unittest.main()

0 commit comments

Comments
 (0)