blob: 665d1e2deba00d63378e49a97ba057b86ee84aaf [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
Brian Norris5c637c42023-05-04 18:07:48 -070013from chromite.lib import cros_build_lib
Alex Kleinc05f3d12019-05-29 14:16:21 -060014from chromite.lib import cros_test_lib
15from chromite.lib import osutils
Joanna Wang92cad812021-11-03 14:52:08 -070016from chromite.lib import remoteexec_util
Alex Kleinc05f3d12019-05-29 14:16:21 -060017
18
19class ChrootHandlerTest(cros_test_lib.TestCase):
Alex Klein1699fab2022-09-08 08:46:06 -060020 """ChrootHandler tests."""
Alex Kleinc05f3d12019-05-29 14:16:21 -060021
Alex Klein1699fab2022-09-08 08:46:06 -060022 def setUp(self):
23 self.path = "/chroot/dir"
24 self.cache_dir = "/cache/dir"
25 self.chrome_dir = "/chrome/dir"
26 self.env = {"FEATURES": "thing", "CHROME_ORIGIN": "LOCAL_SOURCE"}
27 self.expected_chroot = chroot_lib.Chroot(
28 path=self.path,
29 cache_dir=self.cache_dir,
30 chrome_root=self.chrome_dir,
31 env=self.env,
32 )
Alex Kleinc05f3d12019-05-29 14:16:21 -060033
Alex Klein1699fab2022-09-08 08:46:06 -060034 def test_parse_chroot_success(self):
35 """Test successful Chroot message parse."""
36 chroot_msg = common_pb2.Chroot()
37 chroot_msg.path = self.path
38 chroot_msg.cache_dir = self.cache_dir
39 chroot_msg.chrome_dir = self.chrome_dir
40 chroot_msg.env.features.add().feature = "thing"
Alex Kleinc05f3d12019-05-29 14:16:21 -060041
Alex Klein1699fab2022-09-08 08:46:06 -060042 chroot_handler = field_handler.ChrootHandler(clear_field=False)
43 parsed_chroot = chroot_handler.parse_chroot(chroot_msg)
Alex Kleinc05f3d12019-05-29 14:16:21 -060044
Alex Klein1699fab2022-09-08 08:46:06 -060045 self.assertEqual(self.expected_chroot, parsed_chroot)
Alex Kleinc05f3d12019-05-29 14:16:21 -060046
Alex Klein1699fab2022-09-08 08:46:06 -060047 def test_handle_success(self):
48 """Test a successful Chroot message parse from a parent message."""
49 message = build_api_test_pb2.TestRequestMessage()
50 message.chroot.path = self.path
51 message.chroot.cache_dir = self.cache_dir
52 message.chroot.chrome_dir = self.chrome_dir
53 message.chroot.env.features.add().feature = "thing"
Alex Kleinc05f3d12019-05-29 14:16:21 -060054
Alex Klein1699fab2022-09-08 08:46:06 -060055 # First a no-clear parse.
56 chroot_handler = field_handler.ChrootHandler(clear_field=False)
57 chroot = chroot_handler.handle(message)
Alex Kleinc05f3d12019-05-29 14:16:21 -060058
Alex Klein1699fab2022-09-08 08:46:06 -060059 self.assertEqual(self.expected_chroot, chroot)
60 self.assertEqual(message.chroot.path, self.path)
Alex Kleinc05f3d12019-05-29 14:16:21 -060061
Alex Klein1699fab2022-09-08 08:46:06 -060062 # A clear field parse.
63 clear_chroot_handler = field_handler.ChrootHandler(clear_field=True)
64 chroot = clear_chroot_handler.handle(message)
Alex Kleinc05f3d12019-05-29 14:16:21 -060065
Alex Klein1699fab2022-09-08 08:46:06 -060066 self.assertEqual(self.expected_chroot, chroot)
67 self.assertFalse(message.chroot.path)
Alex Kleinc05f3d12019-05-29 14:16:21 -060068
Alex Klein1699fab2022-09-08 08:46:06 -060069 def test_handle_empty_chroot_message(self):
70 """Test handling of an empty chroot message."""
71 message = build_api_test_pb2.TestRequestMessage()
72 empty_chroot = chroot_lib.Chroot()
Alex Kleinc05f3d12019-05-29 14:16:21 -060073
Alex Klein1699fab2022-09-08 08:46:06 -060074 chroot_handler = field_handler.ChrootHandler(clear_field=False)
75 chroot = chroot_handler.handle(message)
Alex Kleinc05f3d12019-05-29 14:16:21 -060076
Alex Klein1699fab2022-09-08 08:46:06 -060077 self.assertEqual(empty_chroot, chroot)
Alex Kleinc05f3d12019-05-29 14:16:21 -060078
79
Joanna Wang92cad812021-11-03 14:52:08 -070080class HandleRemoteexec(cros_test_lib.TempDirTestCase):
Alex Klein1699fab2022-09-08 08:46:06 -060081 """Tests for handling remoteexec."""
Joanna Wang92cad812021-11-03 14:52:08 -070082
Alex Klein1699fab2022-09-08 08:46:06 -060083 def test_handle_remoteexec(self):
84 """Test handling remoteexec when there is a RemoteexecConfig."""
85 reclient_dir = os.path.join(self.tempdir, "cipd/rbe")
86 reproxy_cfg_file = os.path.join(
87 self.tempdir, "reclient_cfgs/reproxy_config.cfg"
88 )
Joanna Wang92cad812021-11-03 14:52:08 -070089
Alex Klein1699fab2022-09-08 08:46:06 -060090 osutils.SafeMakedirs(reclient_dir)
91 osutils.Touch(reproxy_cfg_file, makedirs=True)
92 remoteexec_config = common_pb2.RemoteexecConfig(
93 reclient_dir=reclient_dir, reproxy_cfg_file=reproxy_cfg_file
94 )
95 message = build_api_test_pb2.TestRequestMessage(
96 remoteexec_config=remoteexec_config
97 )
Joanna Wang92cad812021-11-03 14:52:08 -070098
Alex Klein1699fab2022-09-08 08:46:06 -060099 expected = remoteexec_util.Remoteexec(reclient_dir, reproxy_cfg_file)
100 self.assertEqual(expected, field_handler.handle_remoteexec(message))
Joanna Wang92cad812021-11-03 14:52:08 -0700101
Alex Klein1699fab2022-09-08 08:46:06 -0600102 def test_handle_remoteexec_no_config(self):
103 """Test handling remoteexec when there is no RmoteexecConfig."""
104 message = build_api_test_pb2.TestRequestMessage()
105 self.assertIsNone(field_handler.handle_remoteexec(message))
Joanna Wang92cad812021-11-03 14:52:08 -0700106
107
Brian Norris5c637c42023-05-04 18:07:48 -0700108class CopyPathInTest(cros_test_lib.MockTempDirTestCase):
Alex Klein1699fab2022-09-08 08:46:06 -0600109 """PathHandler tests."""
Alex Kleinc05f3d12019-05-29 14:16:21 -0600110
Alex Klein1699fab2022-09-08 08:46:06 -0600111 def setUp(self):
Brian Norris5c637c42023-05-04 18:07:48 -0700112 self.PatchObject(cros_build_lib, "IsInsideChroot", return_value=False)
113
114 self.chroot = chroot_lib.Chroot(
115 path=self.tempdir / "chroot",
116 out_path=self.tempdir / "out",
117 )
118
119 self.source_dir = os.path.join(self.chroot.path, "source")
120 self.dest_dir = os.path.join(self.chroot.path, "destination")
Alex Klein1699fab2022-09-08 08:46:06 -0600121 osutils.SafeMakedirs(self.source_dir)
122 osutils.SafeMakedirs(self.dest_dir)
Brian Norris5c637c42023-05-04 18:07:48 -0700123 osutils.SafeMakedirs(self.chroot.out_path)
Alex Kleinc05f3d12019-05-29 14:16:21 -0600124
Alex Klein1699fab2022-09-08 08:46:06 -0600125 self.source_file1 = os.path.join(self.source_dir, "file1")
126 self.file1_contents = "file 1"
127 osutils.WriteFile(self.source_file1, self.file1_contents)
Alex Kleinc05f3d12019-05-29 14:16:21 -0600128
Alex Klein1699fab2022-09-08 08:46:06 -0600129 self.file2_contents = "some data"
130 self.source_file2 = os.path.join(self.source_dir, "file2")
131 osutils.WriteFile(self.source_file2, self.file2_contents)
Alex Kleinc05f3d12019-05-29 14:16:21 -0600132
Alex Klein1699fab2022-09-08 08:46:06 -0600133 def _path_checks(self, source_file, dest_file, contents=None):
134 """Set of common checks for the copied files/directories."""
135 # Message should now reflect the new path.
136 self.assertNotEqual(source_file, dest_file)
137 # The new path should be in the destination directory.
138 self.assertStartsWith(dest_file, self.dest_dir)
139 # The new file should exist.
140 self.assertExists(dest_file)
Alex Kleinc05f3d12019-05-29 14:16:21 -0600141
Alex Klein1699fab2022-09-08 08:46:06 -0600142 if contents:
143 # The contents should be the same as the source file.
144 self.assertFileContents(dest_file, contents)
Alex Kleinc05f3d12019-05-29 14:16:21 -0600145
Alex Klein1699fab2022-09-08 08:46:06 -0600146 def test_handle_file(self):
147 """Test handling of a single file."""
148 message = build_api_test_pb2.TestRequestMessage()
149 message.path.path = self.source_file1
150 message.path.location = common_pb2.Path.OUTSIDE
Alex Kleinc05f3d12019-05-29 14:16:21 -0600151
Alex Klein1699fab2022-09-08 08:46:06 -0600152 with field_handler.copy_paths_in(message, self.dest_dir, delete=True):
153 new_path = message.path.path
154 self._path_checks(self.source_file1, new_path, self.file1_contents)
Alex Kleinc05f3d12019-05-29 14:16:21 -0600155
Alex Klein1699fab2022-09-08 08:46:06 -0600156 # The file should have been deleted on exit with delete=True.
157 self.assertNotExists(new_path)
158 # The original should still exist.
159 self.assertExists(self.source_file1)
160 # The path should get reset.
161 self.assertEqual(message.path.path, self.source_file1)
Alex Kleinc05f3d12019-05-29 14:16:21 -0600162
Alex Klein1699fab2022-09-08 08:46:06 -0600163 def test_handle_files(self):
164 """Test handling of multiple files."""
165 message = build_api_test_pb2.TestRequestMessage()
166 message.path.path = self.source_file1
167 message.path.location = common_pb2.Path.OUTSIDE
168 message.another_path.path = self.source_file2
169 message.another_path.location = common_pb2.Path.OUTSIDE
Alex Kleinc05f3d12019-05-29 14:16:21 -0600170
Alex Klein1699fab2022-09-08 08:46:06 -0600171 with field_handler.copy_paths_in(message, self.dest_dir, delete=False):
172 new_path1 = message.path.path
173 new_path2 = message.another_path.path
Alex Kleinc05f3d12019-05-29 14:16:21 -0600174
Alex Klein1699fab2022-09-08 08:46:06 -0600175 self._path_checks(self.source_file1, new_path1, self.file1_contents)
176 self._path_checks(self.source_file2, new_path2, self.file2_contents)
Alex Kleinc05f3d12019-05-29 14:16:21 -0600177
Alex Klein1699fab2022-09-08 08:46:06 -0600178 # The files should still exist with delete=False.
179 self.assertExists(new_path1)
180 self.assertExists(new_path2)
Alex Kleinc05f3d12019-05-29 14:16:21 -0600181
Alex Klein1699fab2022-09-08 08:46:06 -0600182 def test_handle_nested_file(self):
183 """Test the nested path handling."""
184 message = build_api_test_pb2.TestRequestMessage()
185 message.nested_path.path.path = self.source_file1
186 message.nested_path.path.location = common_pb2.Path.OUTSIDE
Alex Kleinaa705412019-06-04 15:00:30 -0600187
Alex Klein1699fab2022-09-08 08:46:06 -0600188 with field_handler.copy_paths_in(message, self.dest_dir):
189 new_path = message.nested_path.path.path
190 self._path_checks(self.source_file1, new_path, self.file1_contents)
Alex Kleinaa705412019-06-04 15:00:30 -0600191
Alex Klein1699fab2022-09-08 08:46:06 -0600192 def test_handle_directory(self):
193 """Test handling of a directory."""
194 message = build_api_test_pb2.TestRequestMessage()
195 message.path.path = self.source_dir
196 message.path.location = common_pb2.Path.OUTSIDE
Alex Kleinc05f3d12019-05-29 14:16:21 -0600197
Alex Klein1699fab2022-09-08 08:46:06 -0600198 with field_handler.copy_paths_in(message, self.dest_dir):
199 new_path = message.path.path
Alex Kleinc05f3d12019-05-29 14:16:21 -0600200
Alex Klein1699fab2022-09-08 08:46:06 -0600201 self._path_checks(self.source_dir, self.dest_dir)
202 # Make sure both directories have the same files.
203 self.assertCountEqual(
204 os.listdir(self.source_dir), os.listdir(new_path)
205 )
Alex Kleinc05f3d12019-05-29 14:16:21 -0600206
Alex Klein1699fab2022-09-08 08:46:06 -0600207 def test_direction(self):
208 """Test the direction argument preventing copies."""
209 message = build_api_test_pb2.TestRequestMessage()
210 message.path.path = self.source_file1
211 message.path.location = common_pb2.Path.INSIDE
Alex Kleinc05f3d12019-05-29 14:16:21 -0600212
Alex Klein1699fab2022-09-08 08:46:06 -0600213 with field_handler.copy_paths_in(message, self.dest_dir, delete=True):
214 self.assertEqual(self.source_file1, message.path.path)
Alex Kleinc05f3d12019-05-29 14:16:21 -0600215
Alex Klein54c891a2023-01-24 10:45:41 -0700216 # It should not be deleting the file when it doesn't need to copy it
217 # even with delete=True.
Alex Klein1699fab2022-09-08 08:46:06 -0600218 self.assertExists(self.source_file1)
Alex Kleinbd6edf82019-07-18 10:30:49 -0600219
Brian Norris5c637c42023-05-04 18:07:48 -0700220 def test_inside_chroot(self):
221 """Test the transfer inside chroot handling."""
Alex Klein1699fab2022-09-08 08:46:06 -0600222 message = build_api_test_pb2.TestRequestMessage()
223 message.path.path = self.source_dir
224 message.path.location = common_pb2.Path.OUTSIDE
Alex Kleinbd6edf82019-07-18 10:30:49 -0600225
Alex Klein1699fab2022-09-08 08:46:06 -0600226 with field_handler.copy_paths_in(
Brian Norris5c637c42023-05-04 18:07:48 -0700227 message, self.dest_dir, chroot=self.chroot
Alex Klein1699fab2022-09-08 08:46:06 -0600228 ):
229 new_path = message.path.path
230 # The prefix should be removed.
231 self.assertFalse(new_path.startswith(str(self.tempdir)))
Alex Kleinbd6edf82019-07-18 10:30:49 -0600232
Alex Kleinbd6edf82019-07-18 10:30:49 -0600233
Brian Norris5c637c42023-05-04 18:07:48 -0700234class SyncDirsTest(cros_test_lib.MockTempDirTestCase):
Alex Klein1699fab2022-09-08 08:46:06 -0600235 """Tests for sync_dirs."""
Alex Kleinf0717a62019-12-06 09:45:00 -0700236
Alex Klein1699fab2022-09-08 08:46:06 -0600237 def setUp(self):
Brian Norris5c637c42023-05-04 18:07:48 -0700238 self.PatchObject(cros_build_lib, "IsInsideChroot", return_value=False)
239
Alex Klein1699fab2022-09-08 08:46:06 -0600240 D = cros_test_lib.Directory
241 filesystem = (
Alex Klein1699fab2022-09-08 08:46:06 -0600242 D(
243 "sources",
244 (
245 D("single_file", ("single_file.txt",)),
246 D(
247 "nested_directories",
248 (
249 "basedir_file.log",
250 D(
251 "nested1",
252 (
253 "nested1.txt",
254 D("nested2", ("nested2.txt",)),
255 ),
256 ),
257 ),
258 ),
259 ),
260 ),
261 )
262 cros_test_lib.CreateOnDiskHierarchy(self.tempdir, filesystem)
Alex Kleinf0717a62019-12-06 09:45:00 -0700263
Brian Norris5c637c42023-05-04 18:07:48 -0700264 self.chroot = chroot_lib.Chroot(
265 path=self.tempdir / "chroot",
266 out_path=self.tempdir / "out",
267 )
268 self.destination = os.path.join(self.chroot.tmp, "tempdir")
269 osutils.SafeMakedirs(self.chroot.path)
270 osutils.SafeMakedirs(self.destination)
Alex Klein1699fab2022-09-08 08:46:06 -0600271 self.inside_path = "/tmp/tempdir"
Alex Kleinf0717a62019-12-06 09:45:00 -0700272
Alex Klein1699fab2022-09-08 08:46:06 -0600273 self.single_file_src = os.path.join(
274 self.tempdir, "sources", "single_file"
275 )
276 self.sf_src_file = os.path.join(self.single_file_src, "single_file.txt")
277 self.sf_dest_file = os.path.join(self.destination, "single_file.txt")
Alex Kleinf0717a62019-12-06 09:45:00 -0700278
Alex Klein1699fab2022-09-08 08:46:06 -0600279 self.nested_dirs_src = os.path.join(
280 self.tempdir, "sources", "nested_directories"
281 )
282 self.nested_src_files = (
283 os.path.join(self.nested_dirs_src, "basedir_file.log"),
284 os.path.join(self.nested_dirs_src, "nested1", "nested1.txt"),
285 os.path.join(
286 self.nested_dirs_src, "nested1", "nested2", "nested2.txt"
287 ),
288 )
289 self.nested_dest_files = (
290 os.path.join(self.destination, "basedir_file.log"),
291 os.path.join(self.destination, "nested1", "nested1.txt"),
292 os.path.join(self.destination, "nested1", "nested2", "nested2.txt"),
293 )
Alex Kleinf0717a62019-12-06 09:45:00 -0700294
Alex Klein1699fab2022-09-08 08:46:06 -0600295 self.message = build_api_test_pb2.TestRequestMessage()
Alex Kleinf0717a62019-12-06 09:45:00 -0700296
Alex Klein1699fab2022-09-08 08:46:06 -0600297 def _assertExist(self, files):
298 for f in files:
299 self.assertExists(f)
Alex Kleinf0717a62019-12-06 09:45:00 -0700300
Alex Klein1699fab2022-09-08 08:46:06 -0600301 def _assertNotExist(self, files):
302 for f in files:
303 self.assertNotExists(f)
Alex Kleinf0717a62019-12-06 09:45:00 -0700304
Alex Klein1699fab2022-09-08 08:46:06 -0600305 def testSingleFileTransfer(self):
306 """Single source file syncs."""
307 self.message.synced_dir.dir = self.single_file_src
Alex Kleinf0717a62019-12-06 09:45:00 -0700308
Alex Klein1699fab2022-09-08 08:46:06 -0600309 # Verify source files exist and destination files do not.
310 self.assertExists(self.sf_src_file)
311 self.assertNotExists(self.sf_dest_file)
Alex Kleinf0717a62019-12-06 09:45:00 -0700312
Alex Klein1699fab2022-09-08 08:46:06 -0600313 with field_handler.sync_dirs(
314 self.message, self.destination, self.chroot
315 ):
316 # Verify the prefix is getting correctly stripped.
317 self.assertEqual(self.message.synced_dir.dir, self.inside_path)
318 # Verify the files have all been correctly copied in.
319 self.assertExists(self.sf_dest_file)
Alex Kleinf0717a62019-12-06 09:45:00 -0700320
Alex Klein1699fab2022-09-08 08:46:06 -0600321 self.assertEqual(self.message.synced_dir.dir, self.single_file_src)
322 # Verify the files have all been copied out.
323 self.assertExists(self.sf_src_file)
Alex Kleinf0717a62019-12-06 09:45:00 -0700324
Alex Klein1699fab2022-09-08 08:46:06 -0600325 def testNestedFileSync(self):
326 """Nested directories and files sync."""
327 self.message.synced_dir.dir = self.nested_dirs_src
Alex Kleinf0717a62019-12-06 09:45:00 -0700328
Alex Klein1699fab2022-09-08 08:46:06 -0600329 self._assertExist(self.nested_src_files)
330 self._assertNotExist(self.nested_dest_files)
Alex Kleinf0717a62019-12-06 09:45:00 -0700331
Alex Klein1699fab2022-09-08 08:46:06 -0600332 with field_handler.sync_dirs(
333 self.message, self.destination, self.chroot
334 ):
335 self.assertEqual(self.message.synced_dir.dir, self.inside_path)
336 self._assertExist(self.nested_dest_files)
Alex Kleinf0717a62019-12-06 09:45:00 -0700337
Alex Klein1699fab2022-09-08 08:46:06 -0600338 self.assertEqual(self.message.synced_dir.dir, self.nested_dirs_src)
339 self._assertExist(self.nested_src_files)
Alex Kleinf0717a62019-12-06 09:45:00 -0700340
Alex Klein1699fab2022-09-08 08:46:06 -0600341 def testDeletion(self):
342 """Test file deletions are exported correctly."""
343 self.message.synced_dir.dir = self.nested_dirs_src
Alex Kleinf0717a62019-12-06 09:45:00 -0700344
Alex Klein1699fab2022-09-08 08:46:06 -0600345 deleted_src = os.path.join(
346 self.nested_dirs_src, "nested1", "nested1.txt"
347 )
348 deleted_dest = os.path.join(self.destination, "nested1", "nested1.txt")
Alex Kleinf0717a62019-12-06 09:45:00 -0700349
Alex Klein1699fab2022-09-08 08:46:06 -0600350 self._assertExist(self.nested_src_files)
351 self._assertNotExist(self.nested_dest_files)
Alex Kleinf0717a62019-12-06 09:45:00 -0700352
Alex Klein1699fab2022-09-08 08:46:06 -0600353 with field_handler.sync_dirs(
354 self.message, self.destination, self.chroot
355 ):
356 self._assertExist(self.nested_dest_files)
357 osutils.SafeUnlink(deleted_dest)
Alex Kleinf0717a62019-12-06 09:45:00 -0700358
Alex Klein1699fab2022-09-08 08:46:06 -0600359 self._assertExist(set(self.nested_src_files) - {deleted_src})
360 self.assertNotExists(deleted_src)
Alex Kleinf0717a62019-12-06 09:45:00 -0700361
Alex Klein1699fab2022-09-08 08:46:06 -0600362 def testCreation(self):
363 """Test file creations are exported correctly."""
364 self.message.synced_dir.dir = self.nested_dirs_src
Alex Kleinf0717a62019-12-06 09:45:00 -0700365
Alex Klein1699fab2022-09-08 08:46:06 -0600366 new_src = os.path.join(self.nested_dirs_src, "new_dir", "new_file")
367 new_dest = os.path.join(self.destination, "new_dir", "new_file")
Alex Kleinf0717a62019-12-06 09:45:00 -0700368
Alex Klein1699fab2022-09-08 08:46:06 -0600369 self._assertExist(self.nested_src_files)
370 self._assertNotExist(self.nested_dest_files)
Alex Kleinf0717a62019-12-06 09:45:00 -0700371
Alex Klein1699fab2022-09-08 08:46:06 -0600372 with field_handler.sync_dirs(
373 self.message, self.destination, self.chroot
374 ):
375 self._assertExist(self.nested_dest_files)
376 osutils.Touch(new_dest, makedirs=True)
Alex Kleinf0717a62019-12-06 09:45:00 -0700377
Alex Klein1699fab2022-09-08 08:46:06 -0600378 self._assertExist(self.nested_src_files)
379 self.assertExists(new_src)
Alex Kleinf0717a62019-12-06 09:45:00 -0700380
Alex Klein1699fab2022-09-08 08:46:06 -0600381 def testModification(self):
382 """Test file modifications are exported correctly."""
383 self.message.synced_dir.dir = self.single_file_src
Alex Kleinf0717a62019-12-06 09:45:00 -0700384
Alex Klein1699fab2022-09-08 08:46:06 -0600385 self.assertExists(self.sf_src_file)
386 self.assertNotExists(self.sf_dest_file)
Alex Kleinf0717a62019-12-06 09:45:00 -0700387
Alex Klein1699fab2022-09-08 08:46:06 -0600388 self.assertEqual("", osutils.ReadFile(self.sf_src_file))
389 file_content = "Content!"
Alex Kleinf0717a62019-12-06 09:45:00 -0700390
Alex Klein1699fab2022-09-08 08:46:06 -0600391 with field_handler.sync_dirs(
392 self.message, self.destination, self.chroot
393 ):
394 self.assertExists(self.sf_dest_file)
395 osutils.WriteFile(self.sf_dest_file, file_content)
Alex Kleinf0717a62019-12-06 09:45:00 -0700396
Alex Klein1699fab2022-09-08 08:46:06 -0600397 self.assertExists(self.sf_src_file)
398 self.assertEqual(file_content, osutils.ReadFile(self.sf_src_file))
Alex Kleinf0717a62019-12-06 09:45:00 -0700399
400
Brian Norris5c637c42023-05-04 18:07:48 -0700401class ExtractResultsTest(cros_test_lib.MockTempDirTestCase):
Alex Klein1699fab2022-09-08 08:46:06 -0600402 """Tests for extract_results."""
Alex Kleinbd6edf82019-07-18 10:30:49 -0600403
Alex Klein1699fab2022-09-08 08:46:06 -0600404 def setUp(self):
Brian Norris5c637c42023-05-04 18:07:48 -0700405 self.PatchObject(cros_build_lib, "IsInsideChroot", return_value=False)
406
Alex Klein1699fab2022-09-08 08:46:06 -0600407 # Setup the directories.
408 self.chroot_dir = os.path.join(self.tempdir, "chroot")
409 self.source_dir = "/source"
410 self.chroot_source = os.path.join(
411 self.chroot_dir, self.source_dir.lstrip(os.sep)
412 )
413 self.source_dir2 = "/source2"
414 self.chroot_source2 = os.path.join(
415 self.chroot_dir, self.source_dir2.lstrip(os.sep)
416 )
417 self.dest_dir = os.path.join(self.tempdir, "destination")
418 osutils.SafeMakedirs(self.chroot_source)
419 osutils.SafeMakedirs(self.chroot_source2)
420 osutils.SafeMakedirs(self.dest_dir)
Alex Kleinbd6edf82019-07-18 10:30:49 -0600421
Alex Klein1699fab2022-09-08 08:46:06 -0600422 # Two files in the same directory inside the chroot.
423 self.source_file1 = os.path.join(self.chroot_source, "file1")
424 self.source_file1_inside = os.path.join(self.source_dir, "file1")
425 self.file1_contents = "file 1"
426 osutils.WriteFile(self.source_file1, self.file1_contents)
Alex Kleinbd6edf82019-07-18 10:30:49 -0600427
Alex Klein1699fab2022-09-08 08:46:06 -0600428 self.file2_contents = "some data"
429 self.source_file2 = os.path.join(self.chroot_source, "file2")
430 self.source_file2_inside = os.path.join(self.source_dir, "file2")
431 osutils.WriteFile(self.source_file2, self.file2_contents)
Alex Kleinbd6edf82019-07-18 10:30:49 -0600432
Alex Klein1699fab2022-09-08 08:46:06 -0600433 # Third file in a different location.
434 self.file3_contents = "another file"
435 self.source_file3 = os.path.join(self.chroot_source2, "file3")
436 self.source_file3_inside = os.path.join(self.source_dir2, "file3")
437 osutils.WriteFile(self.source_file3, self.file3_contents)
Alex Kleinbd6edf82019-07-18 10:30:49 -0600438
Alex Klein1699fab2022-09-08 08:46:06 -0600439 self.request = build_api_test_pb2.TestRequestMessage()
440 self.request.result_path.path.path = self.dest_dir
441 self.request.result_path.path.location = common_pb2.Path.OUTSIDE
442 self.response = build_api_test_pb2.TestResultMessage()
Brian Norris5c637c42023-05-04 18:07:48 -0700443 self.chroot = chroot_lib.Chroot(
444 path=self.chroot_dir, out_path=self.tempdir / "out"
445 )
446 osutils.SafeMakedirs(self.chroot.tmp)
Alex Kleinbd6edf82019-07-18 10:30:49 -0600447
Alex Klein1699fab2022-09-08 08:46:06 -0600448 def _path_checks(self, path, destination, contents=None):
449 self.assertTrue(path)
450 self.assertStartsWith(path, destination)
451 self.assertExists(path)
452 if contents:
453 self.assertFileContents(path, contents)
Alex Kleinbd6edf82019-07-18 10:30:49 -0600454
Alex Klein1699fab2022-09-08 08:46:06 -0600455 def test_single_file(self):
456 """Test a single file.
Alex Klein3164d132020-11-19 15:11:31 -0700457
Alex Klein1699fab2022-09-08 08:46:06 -0600458 Verify:
459 /path/to/chroot/file -> /path/to/destination/file
460 """
461 self.response.artifact.path = self.source_file1_inside
462 self.response.artifact.location = common_pb2.Path.INSIDE
Alex Kleinbd6edf82019-07-18 10:30:49 -0600463
Alex Klein1699fab2022-09-08 08:46:06 -0600464 field_handler.extract_results(self.request, self.response, self.chroot)
Alex Kleinbd6edf82019-07-18 10:30:49 -0600465
Alex Klein1699fab2022-09-08 08:46:06 -0600466 self._path_checks(
467 self.response.artifact.path,
468 self.dest_dir,
469 contents=self.file1_contents,
470 )
Alex Kleinbd6edf82019-07-18 10:30:49 -0600471
Brian Norris5c637c42023-05-04 18:07:48 -0700472 def test_tmp_file(self):
473 """Test a file in chroot's /tmp."""
474 contents = "tmpfile contents"
475 tmpfile = os.path.join(self.chroot.tmp, "file")
476 tmpfile_inside = "/tmp/file"
477 osutils.WriteFile(tmpfile, contents)
478
479 self.response.artifact.path = tmpfile_inside
480 self.response.artifact.location = common_pb2.Path.INSIDE
481
482 field_handler.extract_results(self.request, self.response, self.chroot)
483
484 self._path_checks(
485 self.response.artifact.path,
486 self.dest_dir,
487 contents=contents,
488 )
489
Alex Klein1699fab2022-09-08 08:46:06 -0600490 def test_single_directory(self):
491 """Test a single directory.
Alex Klein3164d132020-11-19 15:11:31 -0700492
Alex Klein1699fab2022-09-08 08:46:06 -0600493 Verify:
494 /path/to/chroot/directory/* -> /path/to/destination/directory/*
495 """
496 self.response.artifact.path = self.source_dir
497 self.response.artifact.location = common_pb2.Path.INSIDE
Alex Kleinbd6edf82019-07-18 10:30:49 -0600498
Alex Klein1699fab2022-09-08 08:46:06 -0600499 field_handler.extract_results(self.request, self.response, self.chroot)
Alex Kleinbd6edf82019-07-18 10:30:49 -0600500
Alex Klein1699fab2022-09-08 08:46:06 -0600501 self._path_checks(self.response.artifact.path, self.dest_dir)
502 self.assertCountEqual(
503 os.listdir(self.chroot_source),
504 os.listdir(self.response.artifact.path),
505 )
Alex Kleinbd6edf82019-07-18 10:30:49 -0600506
Alex Klein1699fab2022-09-08 08:46:06 -0600507 def test_multiple_files(self):
508 """Test multiple files.
Alex Klein3164d132020-11-19 15:11:31 -0700509
Alex Klein1699fab2022-09-08 08:46:06 -0600510 Verify:
511 /path/to/chroot/some/path/file1 -> /path/to/destination/file1
512 /path/to/chroot/different/path/file2 -> /path/to/destination/file2
513 etc.
514 """
515 self.response.artifact.path = self.source_file1_inside
516 self.response.artifact.location = common_pb2.Path.INSIDE
517 self.response.nested_artifact.path.path = self.source_file2_inside
518 self.response.nested_artifact.path.location = common_pb2.Path.INSIDE
Alex Kleinbd6edf82019-07-18 10:30:49 -0600519
Alex Klein1699fab2022-09-08 08:46:06 -0600520 artifact3 = self.response.artifacts.add()
521 artifact3.path = self.source_file3_inside
522 artifact3.location = common_pb2.Path.INSIDE
Alex Kleinbd6edf82019-07-18 10:30:49 -0600523
Alex Klein1699fab2022-09-08 08:46:06 -0600524 field_handler.extract_results(self.request, self.response, self.chroot)
Alex Kleinbd6edf82019-07-18 10:30:49 -0600525
Alex Klein1699fab2022-09-08 08:46:06 -0600526 self._path_checks(
527 self.response.artifact.path,
528 self.dest_dir,
529 contents=self.file1_contents,
530 )
531 self._path_checks(
532 self.response.nested_artifact.path.path,
533 self.dest_dir,
534 contents=self.file2_contents,
535 )
Alex Kleinbd6edf82019-07-18 10:30:49 -0600536
Alex Klein1699fab2022-09-08 08:46:06 -0600537 self.assertEqual(1, len(self.response.artifacts))
538 for artifact in self.response.artifacts:
539 self._path_checks(
540 artifact.path, self.dest_dir, contents=self.file3_contents
541 )
Alex Kleinbd6edf82019-07-18 10:30:49 -0600542
Alex Klein1699fab2022-09-08 08:46:06 -0600543 def test_multiple_directories(self):
544 """Test multiple directories.
Alex Klein3164d132020-11-19 15:11:31 -0700545
Alex Klein1699fab2022-09-08 08:46:06 -0600546 Verify:
547 /path/to/chroot/some/directory -> /path/to/destination/directory
548 /path/to/chroot/another/directory2 -> /path/to/destination/directory2
549 etc.
550 """
551 self.response.artifact.path = self.source_dir
552 self.response.artifact.location = common_pb2.Path.INSIDE
553 self.response.nested_artifact.path.path = self.source_dir2
554 self.response.nested_artifact.path.location = common_pb2.Path.INSIDE
Alex Kleinbd6edf82019-07-18 10:30:49 -0600555
Alex Klein1699fab2022-09-08 08:46:06 -0600556 field_handler.extract_results(self.request, self.response, self.chroot)
Alex Kleinbd6edf82019-07-18 10:30:49 -0600557
Alex Klein1699fab2022-09-08 08:46:06 -0600558 self._path_checks(self.response.artifact.path, self.dest_dir)
559 self._path_checks(
560 self.response.nested_artifact.path.path, self.dest_dir
561 )
Alex Kleinbd6edf82019-07-18 10:30:49 -0600562
Alex Klein1699fab2022-09-08 08:46:06 -0600563 expected = os.listdir(self.chroot_source)
564 expected.extend(os.listdir(self.chroot_source2))
565 self.assertCountEqual(expected, os.listdir(self.response.artifact.path))