blob: b0f6c77971a79352d3a3f11dbe275e9ba61a622f [file] [log] [blame]
Mike Frysingerf1ba7ad2022-09-12 05:42:57 -04001# Copyright 2019 The ChromiumOS Authors
Alex Kleinc05f3d12019-05-29 14:16:21 -06002# Use of this source code is governed by a BSD-style license that can be
3# found in the LICENSE file.
4
5"""field_handler module tests."""
6
Alex Kleinc05f3d12019-05-29 14:16:21 -06007import os
8
9from chromite.api import field_handler
10from chromite.api.gen.chromite.api import build_api_test_pb2
11from chromite.api.gen.chromiumos import common_pb2
12from chromite.lib import chroot_lib
13from chromite.lib import cros_test_lib
14from chromite.lib import osutils
Joanna Wang92cad812021-11-03 14:52:08 -070015from chromite.lib import remoteexec_util
Alex Kleinc05f3d12019-05-29 14:16:21 -060016
17
18class ChrootHandlerTest(cros_test_lib.TestCase):
Alex Klein1699fab2022-09-08 08:46:06 -060019 """ChrootHandler tests."""
Alex Kleinc05f3d12019-05-29 14:16:21 -060020
Alex Klein1699fab2022-09-08 08:46:06 -060021 def setUp(self):
22 self.path = "/chroot/dir"
23 self.cache_dir = "/cache/dir"
24 self.chrome_dir = "/chrome/dir"
25 self.env = {"FEATURES": "thing", "CHROME_ORIGIN": "LOCAL_SOURCE"}
26 self.expected_chroot = chroot_lib.Chroot(
27 path=self.path,
28 cache_dir=self.cache_dir,
29 chrome_root=self.chrome_dir,
30 env=self.env,
31 )
Alex Kleinc05f3d12019-05-29 14:16:21 -060032
Alex Klein1699fab2022-09-08 08:46:06 -060033 def test_parse_chroot_success(self):
34 """Test successful Chroot message parse."""
35 chroot_msg = common_pb2.Chroot()
36 chroot_msg.path = self.path
37 chroot_msg.cache_dir = self.cache_dir
38 chroot_msg.chrome_dir = self.chrome_dir
39 chroot_msg.env.features.add().feature = "thing"
Alex Kleinc05f3d12019-05-29 14:16:21 -060040
Alex Klein1699fab2022-09-08 08:46:06 -060041 chroot_handler = field_handler.ChrootHandler(clear_field=False)
42 parsed_chroot = chroot_handler.parse_chroot(chroot_msg)
Alex Kleinc05f3d12019-05-29 14:16:21 -060043
Alex Klein1699fab2022-09-08 08:46:06 -060044 self.assertEqual(self.expected_chroot, parsed_chroot)
Alex Kleinc05f3d12019-05-29 14:16:21 -060045
Alex Klein1699fab2022-09-08 08:46:06 -060046 def test_handle_success(self):
47 """Test a successful Chroot message parse from a parent message."""
48 message = build_api_test_pb2.TestRequestMessage()
49 message.chroot.path = self.path
50 message.chroot.cache_dir = self.cache_dir
51 message.chroot.chrome_dir = self.chrome_dir
52 message.chroot.env.features.add().feature = "thing"
Alex Kleinc05f3d12019-05-29 14:16:21 -060053
Alex Klein1699fab2022-09-08 08:46:06 -060054 # First a no-clear parse.
55 chroot_handler = field_handler.ChrootHandler(clear_field=False)
56 chroot = chroot_handler.handle(message)
Alex Kleinc05f3d12019-05-29 14:16:21 -060057
Alex Klein1699fab2022-09-08 08:46:06 -060058 self.assertEqual(self.expected_chroot, chroot)
59 self.assertEqual(message.chroot.path, self.path)
Alex Kleinc05f3d12019-05-29 14:16:21 -060060
Alex Klein1699fab2022-09-08 08:46:06 -060061 # A clear field parse.
62 clear_chroot_handler = field_handler.ChrootHandler(clear_field=True)
63 chroot = clear_chroot_handler.handle(message)
Alex Kleinc05f3d12019-05-29 14:16:21 -060064
Alex Klein1699fab2022-09-08 08:46:06 -060065 self.assertEqual(self.expected_chroot, chroot)
66 self.assertFalse(message.chroot.path)
Alex Kleinc05f3d12019-05-29 14:16:21 -060067
Alex Klein1699fab2022-09-08 08:46:06 -060068 def test_handle_empty_chroot_message(self):
69 """Test handling of an empty chroot message."""
70 message = build_api_test_pb2.TestRequestMessage()
71 empty_chroot = chroot_lib.Chroot()
Alex Kleinc05f3d12019-05-29 14:16:21 -060072
Alex Klein1699fab2022-09-08 08:46:06 -060073 chroot_handler = field_handler.ChrootHandler(clear_field=False)
74 chroot = chroot_handler.handle(message)
Alex Kleinc05f3d12019-05-29 14:16:21 -060075
Alex Klein1699fab2022-09-08 08:46:06 -060076 self.assertEqual(empty_chroot, chroot)
Alex Kleinc05f3d12019-05-29 14:16:21 -060077
78
Joanna Wang92cad812021-11-03 14:52:08 -070079class HandleRemoteexec(cros_test_lib.TempDirTestCase):
Alex Klein1699fab2022-09-08 08:46:06 -060080 """Tests for handling remoteexec."""
Joanna Wang92cad812021-11-03 14:52:08 -070081
Alex Klein1699fab2022-09-08 08:46:06 -060082 def test_handle_remoteexec(self):
83 """Test handling remoteexec when there is a RemoteexecConfig."""
84 reclient_dir = os.path.join(self.tempdir, "cipd/rbe")
85 reproxy_cfg_file = os.path.join(
86 self.tempdir, "reclient_cfgs/reproxy_config.cfg"
87 )
Joanna Wang92cad812021-11-03 14:52:08 -070088
Alex Klein1699fab2022-09-08 08:46:06 -060089 osutils.SafeMakedirs(reclient_dir)
90 osutils.Touch(reproxy_cfg_file, makedirs=True)
91 remoteexec_config = common_pb2.RemoteexecConfig(
92 reclient_dir=reclient_dir, reproxy_cfg_file=reproxy_cfg_file
93 )
94 message = build_api_test_pb2.TestRequestMessage(
95 remoteexec_config=remoteexec_config
96 )
Joanna Wang92cad812021-11-03 14:52:08 -070097
Alex Klein1699fab2022-09-08 08:46:06 -060098 expected = remoteexec_util.Remoteexec(reclient_dir, reproxy_cfg_file)
99 self.assertEqual(expected, field_handler.handle_remoteexec(message))
Joanna Wang92cad812021-11-03 14:52:08 -0700100
Alex Klein1699fab2022-09-08 08:46:06 -0600101 def test_handle_remoteexec_no_config(self):
102 """Test handling remoteexec when there is no RmoteexecConfig."""
103 message = build_api_test_pb2.TestRequestMessage()
104 self.assertIsNone(field_handler.handle_remoteexec(message))
Joanna Wang92cad812021-11-03 14:52:08 -0700105
106
Alex Kleinaae49772019-07-26 10:20:50 -0600107class CopyPathInTest(cros_test_lib.TempDirTestCase):
Alex Klein1699fab2022-09-08 08:46:06 -0600108 """PathHandler tests."""
Alex Kleinc05f3d12019-05-29 14:16:21 -0600109
Alex Klein1699fab2022-09-08 08:46:06 -0600110 def setUp(self):
111 self.source_dir = os.path.join(self.tempdir, "source")
112 self.dest_dir = os.path.join(self.tempdir, "destination")
113 osutils.SafeMakedirs(self.source_dir)
114 osutils.SafeMakedirs(self.dest_dir)
Alex Kleinc05f3d12019-05-29 14:16:21 -0600115
Alex Klein1699fab2022-09-08 08:46:06 -0600116 self.source_file1 = os.path.join(self.source_dir, "file1")
117 self.file1_contents = "file 1"
118 osutils.WriteFile(self.source_file1, self.file1_contents)
Alex Kleinc05f3d12019-05-29 14:16:21 -0600119
Alex Klein1699fab2022-09-08 08:46:06 -0600120 self.file2_contents = "some data"
121 self.source_file2 = os.path.join(self.source_dir, "file2")
122 osutils.WriteFile(self.source_file2, self.file2_contents)
Alex Kleinc05f3d12019-05-29 14:16:21 -0600123
Alex Klein1699fab2022-09-08 08:46:06 -0600124 def _path_checks(self, source_file, dest_file, contents=None):
125 """Set of common checks for the copied files/directories."""
126 # Message should now reflect the new path.
127 self.assertNotEqual(source_file, dest_file)
128 # The new path should be in the destination directory.
129 self.assertStartsWith(dest_file, self.dest_dir)
130 # The new file should exist.
131 self.assertExists(dest_file)
Alex Kleinc05f3d12019-05-29 14:16:21 -0600132
Alex Klein1699fab2022-09-08 08:46:06 -0600133 if contents:
134 # The contents should be the same as the source file.
135 self.assertFileContents(dest_file, contents)
Alex Kleinc05f3d12019-05-29 14:16:21 -0600136
Alex Klein1699fab2022-09-08 08:46:06 -0600137 def test_handle_file(self):
138 """Test handling of a single file."""
139 message = build_api_test_pb2.TestRequestMessage()
140 message.path.path = self.source_file1
141 message.path.location = common_pb2.Path.OUTSIDE
Alex Kleinc05f3d12019-05-29 14:16:21 -0600142
Alex Klein1699fab2022-09-08 08:46:06 -0600143 with field_handler.copy_paths_in(message, self.dest_dir, delete=True):
144 new_path = message.path.path
145 self._path_checks(self.source_file1, new_path, self.file1_contents)
Alex Kleinc05f3d12019-05-29 14:16:21 -0600146
Alex Klein1699fab2022-09-08 08:46:06 -0600147 # The file should have been deleted on exit with delete=True.
148 self.assertNotExists(new_path)
149 # The original should still exist.
150 self.assertExists(self.source_file1)
151 # The path should get reset.
152 self.assertEqual(message.path.path, self.source_file1)
Alex Kleinc05f3d12019-05-29 14:16:21 -0600153
Alex Klein1699fab2022-09-08 08:46:06 -0600154 def test_handle_files(self):
155 """Test handling of multiple files."""
156 message = build_api_test_pb2.TestRequestMessage()
157 message.path.path = self.source_file1
158 message.path.location = common_pb2.Path.OUTSIDE
159 message.another_path.path = self.source_file2
160 message.another_path.location = common_pb2.Path.OUTSIDE
Alex Kleinc05f3d12019-05-29 14:16:21 -0600161
Alex Klein1699fab2022-09-08 08:46:06 -0600162 with field_handler.copy_paths_in(message, self.dest_dir, delete=False):
163 new_path1 = message.path.path
164 new_path2 = message.another_path.path
Alex Kleinc05f3d12019-05-29 14:16:21 -0600165
Alex Klein1699fab2022-09-08 08:46:06 -0600166 self._path_checks(self.source_file1, new_path1, self.file1_contents)
167 self._path_checks(self.source_file2, new_path2, self.file2_contents)
Alex Kleinc05f3d12019-05-29 14:16:21 -0600168
Alex Klein1699fab2022-09-08 08:46:06 -0600169 # The files should still exist with delete=False.
170 self.assertExists(new_path1)
171 self.assertExists(new_path2)
Alex Kleinc05f3d12019-05-29 14:16:21 -0600172
Alex Klein1699fab2022-09-08 08:46:06 -0600173 def test_handle_nested_file(self):
174 """Test the nested path handling."""
175 message = build_api_test_pb2.TestRequestMessage()
176 message.nested_path.path.path = self.source_file1
177 message.nested_path.path.location = common_pb2.Path.OUTSIDE
Alex Kleinaa705412019-06-04 15:00:30 -0600178
Alex Klein1699fab2022-09-08 08:46:06 -0600179 with field_handler.copy_paths_in(message, self.dest_dir):
180 new_path = message.nested_path.path.path
181 self._path_checks(self.source_file1, new_path, self.file1_contents)
Alex Kleinaa705412019-06-04 15:00:30 -0600182
Alex Klein1699fab2022-09-08 08:46:06 -0600183 def test_handle_directory(self):
184 """Test handling of a directory."""
185 message = build_api_test_pb2.TestRequestMessage()
186 message.path.path = self.source_dir
187 message.path.location = common_pb2.Path.OUTSIDE
Alex Kleinc05f3d12019-05-29 14:16:21 -0600188
Alex Klein1699fab2022-09-08 08:46:06 -0600189 with field_handler.copy_paths_in(message, self.dest_dir):
190 new_path = message.path.path
Alex Kleinc05f3d12019-05-29 14:16:21 -0600191
Alex Klein1699fab2022-09-08 08:46:06 -0600192 self._path_checks(self.source_dir, self.dest_dir)
193 # Make sure both directories have the same files.
194 self.assertCountEqual(
195 os.listdir(self.source_dir), os.listdir(new_path)
196 )
Alex Kleinc05f3d12019-05-29 14:16:21 -0600197
Alex Klein1699fab2022-09-08 08:46:06 -0600198 def test_direction(self):
199 """Test the direction argument preventing copies."""
200 message = build_api_test_pb2.TestRequestMessage()
201 message.path.path = self.source_file1
202 message.path.location = common_pb2.Path.INSIDE
Alex Kleinc05f3d12019-05-29 14:16:21 -0600203
Alex Klein1699fab2022-09-08 08:46:06 -0600204 with field_handler.copy_paths_in(message, self.dest_dir, delete=True):
205 self.assertEqual(self.source_file1, message.path.path)
Alex Kleinc05f3d12019-05-29 14:16:21 -0600206
Alex Klein54c891a2023-01-24 10:45:41 -0700207 # It should not be deleting the file when it doesn't need to copy it
208 # even with delete=True.
Alex Klein1699fab2022-09-08 08:46:06 -0600209 self.assertExists(self.source_file1)
Alex Kleinbd6edf82019-07-18 10:30:49 -0600210
Alex Klein1699fab2022-09-08 08:46:06 -0600211 def test_prefix_inside(self):
212 """Test the transfer inside prefix handling."""
213 message = build_api_test_pb2.TestRequestMessage()
214 message.path.path = self.source_dir
215 message.path.location = common_pb2.Path.OUTSIDE
Alex Kleinbd6edf82019-07-18 10:30:49 -0600216
Alex Klein1699fab2022-09-08 08:46:06 -0600217 with field_handler.copy_paths_in(
218 message, self.dest_dir, prefix=self.tempdir
219 ):
220 new_path = message.path.path
221 # The prefix should be removed.
222 self.assertFalse(new_path.startswith(str(self.tempdir)))
Alex Kleinbd6edf82019-07-18 10:30:49 -0600223
Alex Kleinbd6edf82019-07-18 10:30:49 -0600224
Alex Kleinf0717a62019-12-06 09:45:00 -0700225class SyncDirsTest(cros_test_lib.TempDirTestCase):
Alex Klein1699fab2022-09-08 08:46:06 -0600226 """Tests for sync_dirs."""
Alex Kleinf0717a62019-12-06 09:45:00 -0700227
Alex Klein1699fab2022-09-08 08:46:06 -0600228 def setUp(self):
229 D = cros_test_lib.Directory
230 filesystem = (
231 D("chroot", (D("tmp", (D("tempdir", ()),)),)),
232 D(
233 "sources",
234 (
235 D("single_file", ("single_file.txt",)),
236 D(
237 "nested_directories",
238 (
239 "basedir_file.log",
240 D(
241 "nested1",
242 (
243 "nested1.txt",
244 D("nested2", ("nested2.txt",)),
245 ),
246 ),
247 ),
248 ),
249 ),
250 ),
251 )
252 cros_test_lib.CreateOnDiskHierarchy(self.tempdir, filesystem)
Alex Kleinf0717a62019-12-06 09:45:00 -0700253
Alex Klein1699fab2022-09-08 08:46:06 -0600254 self.chroot = os.path.join(self.tempdir, "chroot")
255 self.chroot_tmp = os.path.join(self.chroot, "tmp")
256 self.destination = os.path.join(self.chroot_tmp, "tempdir")
257 self.inside_path = "/tmp/tempdir"
Alex Kleinf0717a62019-12-06 09:45:00 -0700258
Alex Klein1699fab2022-09-08 08:46:06 -0600259 self.single_file_src = os.path.join(
260 self.tempdir, "sources", "single_file"
261 )
262 self.sf_src_file = os.path.join(self.single_file_src, "single_file.txt")
263 self.sf_dest_file = os.path.join(self.destination, "single_file.txt")
Alex Kleinf0717a62019-12-06 09:45:00 -0700264
Alex Klein1699fab2022-09-08 08:46:06 -0600265 self.nested_dirs_src = os.path.join(
266 self.tempdir, "sources", "nested_directories"
267 )
268 self.nested_src_files = (
269 os.path.join(self.nested_dirs_src, "basedir_file.log"),
270 os.path.join(self.nested_dirs_src, "nested1", "nested1.txt"),
271 os.path.join(
272 self.nested_dirs_src, "nested1", "nested2", "nested2.txt"
273 ),
274 )
275 self.nested_dest_files = (
276 os.path.join(self.destination, "basedir_file.log"),
277 os.path.join(self.destination, "nested1", "nested1.txt"),
278 os.path.join(self.destination, "nested1", "nested2", "nested2.txt"),
279 )
Alex Kleinf0717a62019-12-06 09:45:00 -0700280
Alex Klein1699fab2022-09-08 08:46:06 -0600281 self.message = build_api_test_pb2.TestRequestMessage()
Alex Kleinf0717a62019-12-06 09:45:00 -0700282
Alex Klein1699fab2022-09-08 08:46:06 -0600283 def _assertExist(self, files):
284 for f in files:
285 self.assertExists(f)
Alex Kleinf0717a62019-12-06 09:45:00 -0700286
Alex Klein1699fab2022-09-08 08:46:06 -0600287 def _assertNotExist(self, files):
288 for f in files:
289 self.assertNotExists(f)
Alex Kleinf0717a62019-12-06 09:45:00 -0700290
Alex Klein1699fab2022-09-08 08:46:06 -0600291 def testSingleFileTransfer(self):
292 """Single source file syncs."""
293 self.message.synced_dir.dir = self.single_file_src
Alex Kleinf0717a62019-12-06 09:45:00 -0700294
Alex Klein1699fab2022-09-08 08:46:06 -0600295 # Verify source files exist and destination files do not.
296 self.assertExists(self.sf_src_file)
297 self.assertNotExists(self.sf_dest_file)
Alex Kleinf0717a62019-12-06 09:45:00 -0700298
Alex Klein1699fab2022-09-08 08:46:06 -0600299 with field_handler.sync_dirs(
300 self.message, self.destination, self.chroot
301 ):
302 # Verify the prefix is getting correctly stripped.
303 self.assertEqual(self.message.synced_dir.dir, self.inside_path)
304 # Verify the files have all been correctly copied in.
305 self.assertExists(self.sf_dest_file)
Alex Kleinf0717a62019-12-06 09:45:00 -0700306
Alex Klein1699fab2022-09-08 08:46:06 -0600307 self.assertEqual(self.message.synced_dir.dir, self.single_file_src)
308 # Verify the files have all been copied out.
309 self.assertExists(self.sf_src_file)
Alex Kleinf0717a62019-12-06 09:45:00 -0700310
Alex Klein1699fab2022-09-08 08:46:06 -0600311 def testNestedFileSync(self):
312 """Nested directories and files sync."""
313 self.message.synced_dir.dir = self.nested_dirs_src
Alex Kleinf0717a62019-12-06 09:45:00 -0700314
Alex Klein1699fab2022-09-08 08:46:06 -0600315 self._assertExist(self.nested_src_files)
316 self._assertNotExist(self.nested_dest_files)
Alex Kleinf0717a62019-12-06 09:45:00 -0700317
Alex Klein1699fab2022-09-08 08:46:06 -0600318 with field_handler.sync_dirs(
319 self.message, self.destination, self.chroot
320 ):
321 self.assertEqual(self.message.synced_dir.dir, self.inside_path)
322 self._assertExist(self.nested_dest_files)
Alex Kleinf0717a62019-12-06 09:45:00 -0700323
Alex Klein1699fab2022-09-08 08:46:06 -0600324 self.assertEqual(self.message.synced_dir.dir, self.nested_dirs_src)
325 self._assertExist(self.nested_src_files)
Alex Kleinf0717a62019-12-06 09:45:00 -0700326
Alex Klein1699fab2022-09-08 08:46:06 -0600327 def testDeletion(self):
328 """Test file deletions are exported correctly."""
329 self.message.synced_dir.dir = self.nested_dirs_src
Alex Kleinf0717a62019-12-06 09:45:00 -0700330
Alex Klein1699fab2022-09-08 08:46:06 -0600331 deleted_src = os.path.join(
332 self.nested_dirs_src, "nested1", "nested1.txt"
333 )
334 deleted_dest = os.path.join(self.destination, "nested1", "nested1.txt")
Alex Kleinf0717a62019-12-06 09:45:00 -0700335
Alex Klein1699fab2022-09-08 08:46:06 -0600336 self._assertExist(self.nested_src_files)
337 self._assertNotExist(self.nested_dest_files)
Alex Kleinf0717a62019-12-06 09:45:00 -0700338
Alex Klein1699fab2022-09-08 08:46:06 -0600339 with field_handler.sync_dirs(
340 self.message, self.destination, self.chroot
341 ):
342 self._assertExist(self.nested_dest_files)
343 osutils.SafeUnlink(deleted_dest)
Alex Kleinf0717a62019-12-06 09:45:00 -0700344
Alex Klein1699fab2022-09-08 08:46:06 -0600345 self._assertExist(set(self.nested_src_files) - {deleted_src})
346 self.assertNotExists(deleted_src)
Alex Kleinf0717a62019-12-06 09:45:00 -0700347
Alex Klein1699fab2022-09-08 08:46:06 -0600348 def testCreation(self):
349 """Test file creations are exported correctly."""
350 self.message.synced_dir.dir = self.nested_dirs_src
Alex Kleinf0717a62019-12-06 09:45:00 -0700351
Alex Klein1699fab2022-09-08 08:46:06 -0600352 new_src = os.path.join(self.nested_dirs_src, "new_dir", "new_file")
353 new_dest = os.path.join(self.destination, "new_dir", "new_file")
Alex Kleinf0717a62019-12-06 09:45:00 -0700354
Alex Klein1699fab2022-09-08 08:46:06 -0600355 self._assertExist(self.nested_src_files)
356 self._assertNotExist(self.nested_dest_files)
Alex Kleinf0717a62019-12-06 09:45:00 -0700357
Alex Klein1699fab2022-09-08 08:46:06 -0600358 with field_handler.sync_dirs(
359 self.message, self.destination, self.chroot
360 ):
361 self._assertExist(self.nested_dest_files)
362 osutils.Touch(new_dest, makedirs=True)
Alex Kleinf0717a62019-12-06 09:45:00 -0700363
Alex Klein1699fab2022-09-08 08:46:06 -0600364 self._assertExist(self.nested_src_files)
365 self.assertExists(new_src)
Alex Kleinf0717a62019-12-06 09:45:00 -0700366
Alex Klein1699fab2022-09-08 08:46:06 -0600367 def testModification(self):
368 """Test file modifications are exported correctly."""
369 self.message.synced_dir.dir = self.single_file_src
Alex Kleinf0717a62019-12-06 09:45:00 -0700370
Alex Klein1699fab2022-09-08 08:46:06 -0600371 self.assertExists(self.sf_src_file)
372 self.assertNotExists(self.sf_dest_file)
Alex Kleinf0717a62019-12-06 09:45:00 -0700373
Alex Klein1699fab2022-09-08 08:46:06 -0600374 self.assertEqual("", osutils.ReadFile(self.sf_src_file))
375 file_content = "Content!"
Alex Kleinf0717a62019-12-06 09:45:00 -0700376
Alex Klein1699fab2022-09-08 08:46:06 -0600377 with field_handler.sync_dirs(
378 self.message, self.destination, self.chroot
379 ):
380 self.assertExists(self.sf_dest_file)
381 osutils.WriteFile(self.sf_dest_file, file_content)
Alex Kleinf0717a62019-12-06 09:45:00 -0700382
Alex Klein1699fab2022-09-08 08:46:06 -0600383 self.assertExists(self.sf_src_file)
384 self.assertEqual(file_content, osutils.ReadFile(self.sf_src_file))
Alex Kleinf0717a62019-12-06 09:45:00 -0700385
386
Alex Kleinaae49772019-07-26 10:20:50 -0600387class ExtractResultsTest(cros_test_lib.TempDirTestCase):
Alex Klein1699fab2022-09-08 08:46:06 -0600388 """Tests for extract_results."""
Alex Kleinbd6edf82019-07-18 10:30:49 -0600389
Alex Klein1699fab2022-09-08 08:46:06 -0600390 def setUp(self):
391 # Setup the directories.
392 self.chroot_dir = os.path.join(self.tempdir, "chroot")
393 self.source_dir = "/source"
394 self.chroot_source = os.path.join(
395 self.chroot_dir, self.source_dir.lstrip(os.sep)
396 )
397 self.source_dir2 = "/source2"
398 self.chroot_source2 = os.path.join(
399 self.chroot_dir, self.source_dir2.lstrip(os.sep)
400 )
401 self.dest_dir = os.path.join(self.tempdir, "destination")
402 osutils.SafeMakedirs(self.chroot_source)
403 osutils.SafeMakedirs(self.chroot_source2)
404 osutils.SafeMakedirs(self.dest_dir)
Alex Kleinbd6edf82019-07-18 10:30:49 -0600405
Alex Klein1699fab2022-09-08 08:46:06 -0600406 # Two files in the same directory inside the chroot.
407 self.source_file1 = os.path.join(self.chroot_source, "file1")
408 self.source_file1_inside = os.path.join(self.source_dir, "file1")
409 self.file1_contents = "file 1"
410 osutils.WriteFile(self.source_file1, self.file1_contents)
Alex Kleinbd6edf82019-07-18 10:30:49 -0600411
Alex Klein1699fab2022-09-08 08:46:06 -0600412 self.file2_contents = "some data"
413 self.source_file2 = os.path.join(self.chroot_source, "file2")
414 self.source_file2_inside = os.path.join(self.source_dir, "file2")
415 osutils.WriteFile(self.source_file2, self.file2_contents)
Alex Kleinbd6edf82019-07-18 10:30:49 -0600416
Alex Klein1699fab2022-09-08 08:46:06 -0600417 # Third file in a different location.
418 self.file3_contents = "another file"
419 self.source_file3 = os.path.join(self.chroot_source2, "file3")
420 self.source_file3_inside = os.path.join(self.source_dir2, "file3")
421 osutils.WriteFile(self.source_file3, self.file3_contents)
Alex Kleinbd6edf82019-07-18 10:30:49 -0600422
Alex Klein1699fab2022-09-08 08:46:06 -0600423 self.request = build_api_test_pb2.TestRequestMessage()
424 self.request.result_path.path.path = self.dest_dir
425 self.request.result_path.path.location = common_pb2.Path.OUTSIDE
426 self.response = build_api_test_pb2.TestResultMessage()
427 self.chroot = chroot_lib.Chroot(path=self.chroot_dir)
Alex Kleinbd6edf82019-07-18 10:30:49 -0600428
Alex Klein1699fab2022-09-08 08:46:06 -0600429 def _path_checks(self, path, destination, contents=None):
430 self.assertTrue(path)
431 self.assertStartsWith(path, destination)
432 self.assertExists(path)
433 if contents:
434 self.assertFileContents(path, contents)
Alex Kleinbd6edf82019-07-18 10:30:49 -0600435
Alex Klein1699fab2022-09-08 08:46:06 -0600436 def test_single_file(self):
437 """Test a single file.
Alex Klein3164d132020-11-19 15:11:31 -0700438
Alex Klein1699fab2022-09-08 08:46:06 -0600439 Verify:
440 /path/to/chroot/file -> /path/to/destination/file
441 """
442 self.response.artifact.path = self.source_file1_inside
443 self.response.artifact.location = common_pb2.Path.INSIDE
Alex Kleinbd6edf82019-07-18 10:30:49 -0600444
Alex Klein1699fab2022-09-08 08:46:06 -0600445 field_handler.extract_results(self.request, self.response, self.chroot)
Alex Kleinbd6edf82019-07-18 10:30:49 -0600446
Alex Klein1699fab2022-09-08 08:46:06 -0600447 self._path_checks(
448 self.response.artifact.path,
449 self.dest_dir,
450 contents=self.file1_contents,
451 )
Alex Kleinbd6edf82019-07-18 10:30:49 -0600452
Alex Klein1699fab2022-09-08 08:46:06 -0600453 def test_single_directory(self):
454 """Test a single directory.
Alex Klein3164d132020-11-19 15:11:31 -0700455
Alex Klein1699fab2022-09-08 08:46:06 -0600456 Verify:
457 /path/to/chroot/directory/* -> /path/to/destination/directory/*
458 """
459 self.response.artifact.path = self.source_dir
460 self.response.artifact.location = common_pb2.Path.INSIDE
Alex Kleinbd6edf82019-07-18 10:30:49 -0600461
Alex Klein1699fab2022-09-08 08:46:06 -0600462 field_handler.extract_results(self.request, self.response, self.chroot)
Alex Kleinbd6edf82019-07-18 10:30:49 -0600463
Alex Klein1699fab2022-09-08 08:46:06 -0600464 self._path_checks(self.response.artifact.path, self.dest_dir)
465 self.assertCountEqual(
466 os.listdir(self.chroot_source),
467 os.listdir(self.response.artifact.path),
468 )
Alex Kleinbd6edf82019-07-18 10:30:49 -0600469
Alex Klein1699fab2022-09-08 08:46:06 -0600470 def test_multiple_files(self):
471 """Test multiple files.
Alex Klein3164d132020-11-19 15:11:31 -0700472
Alex Klein1699fab2022-09-08 08:46:06 -0600473 Verify:
474 /path/to/chroot/some/path/file1 -> /path/to/destination/file1
475 /path/to/chroot/different/path/file2 -> /path/to/destination/file2
476 etc.
477 """
478 self.response.artifact.path = self.source_file1_inside
479 self.response.artifact.location = common_pb2.Path.INSIDE
480 self.response.nested_artifact.path.path = self.source_file2_inside
481 self.response.nested_artifact.path.location = common_pb2.Path.INSIDE
Alex Kleinbd6edf82019-07-18 10:30:49 -0600482
Alex Klein1699fab2022-09-08 08:46:06 -0600483 artifact3 = self.response.artifacts.add()
484 artifact3.path = self.source_file3_inside
485 artifact3.location = common_pb2.Path.INSIDE
Alex Kleinbd6edf82019-07-18 10:30:49 -0600486
Alex Klein1699fab2022-09-08 08:46:06 -0600487 field_handler.extract_results(self.request, self.response, self.chroot)
Alex Kleinbd6edf82019-07-18 10:30:49 -0600488
Alex Klein1699fab2022-09-08 08:46:06 -0600489 self._path_checks(
490 self.response.artifact.path,
491 self.dest_dir,
492 contents=self.file1_contents,
493 )
494 self._path_checks(
495 self.response.nested_artifact.path.path,
496 self.dest_dir,
497 contents=self.file2_contents,
498 )
Alex Kleinbd6edf82019-07-18 10:30:49 -0600499
Alex Klein1699fab2022-09-08 08:46:06 -0600500 self.assertEqual(1, len(self.response.artifacts))
501 for artifact in self.response.artifacts:
502 self._path_checks(
503 artifact.path, self.dest_dir, contents=self.file3_contents
504 )
Alex Kleinbd6edf82019-07-18 10:30:49 -0600505
Alex Klein1699fab2022-09-08 08:46:06 -0600506 def test_multiple_directories(self):
507 """Test multiple directories.
Alex Klein3164d132020-11-19 15:11:31 -0700508
Alex Klein1699fab2022-09-08 08:46:06 -0600509 Verify:
510 /path/to/chroot/some/directory -> /path/to/destination/directory
511 /path/to/chroot/another/directory2 -> /path/to/destination/directory2
512 etc.
513 """
514 self.response.artifact.path = self.source_dir
515 self.response.artifact.location = common_pb2.Path.INSIDE
516 self.response.nested_artifact.path.path = self.source_dir2
517 self.response.nested_artifact.path.location = common_pb2.Path.INSIDE
Alex Kleinbd6edf82019-07-18 10:30:49 -0600518
Alex Klein1699fab2022-09-08 08:46:06 -0600519 field_handler.extract_results(self.request, self.response, self.chroot)
Alex Kleinbd6edf82019-07-18 10:30:49 -0600520
Alex Klein1699fab2022-09-08 08:46:06 -0600521 self._path_checks(self.response.artifact.path, self.dest_dir)
522 self._path_checks(
523 self.response.nested_artifact.path.path, self.dest_dir
524 )
Alex Kleinbd6edf82019-07-18 10:30:49 -0600525
Alex Klein1699fab2022-09-08 08:46:06 -0600526 expected = os.listdir(self.chroot_source)
527 expected.extend(os.listdir(self.chroot_source2))
528 self.assertCountEqual(expected, os.listdir(self.response.artifact.path))