Benjamin Gordon | 2d7bf58 | 2017-07-12 10:11:26 -0600 | [diff] [blame] | 1 | # Copyright 2017 The Chromium OS Authors. All rights reserved. |
| 2 | # Use of this source code is governed by a BSD-style license that can be |
| 3 | # found in the LICENSE file. |
| 4 | |
| 5 | """Tests for cros_sdk.""" |
| 6 | |
Chris McDonald | 59650c3 | 2021-07-20 15:29:28 -0600 | [diff] [blame] | 7 | import logging |
Benjamin Gordon | 2d7bf58 | 2017-07-12 10:11:26 -0600 | [diff] [blame] | 8 | import os |
Mike Frysinger | 5f5c70b | 2022-07-19 12:55:21 -0400 | [diff] [blame] | 9 | import re |
Mike Frysinger | 66d32cd | 2019-12-17 14:55:29 -0500 | [diff] [blame] | 10 | import subprocess |
Mike Frysinger | 5f5c70b | 2022-07-19 12:55:21 -0400 | [diff] [blame] | 11 | import sys |
Mike Frysinger | edc0491 | 2019-11-16 01:30:43 -0500 | [diff] [blame] | 12 | import unittest |
Benjamin Gordon | 2d7bf58 | 2017-07-12 10:11:26 -0600 | [diff] [blame] | 13 | |
Mike Frysinger | 5f5c70b | 2022-07-19 12:55:21 -0400 | [diff] [blame] | 14 | from chromite.lib import constants |
Benjamin Gordon | 2d7bf58 | 2017-07-12 10:11:26 -0600 | [diff] [blame] | 15 | from chromite.lib import cros_build_lib |
Benjamin Gordon | 7464523 | 2018-05-04 17:40:42 -0600 | [diff] [blame] | 16 | from chromite.lib import cros_sdk_lib |
Benjamin Gordon | 2d7bf58 | 2017-07-12 10:11:26 -0600 | [diff] [blame] | 17 | from chromite.lib import cros_test_lib |
| 18 | from chromite.lib import osutils |
Mike Frysinger | daf57b8 | 2019-11-23 17:26:51 -0500 | [diff] [blame] | 19 | from chromite.lib import retry_util |
Benjamin Gordon | 2d7bf58 | 2017-07-12 10:11:26 -0600 | [diff] [blame] | 20 | from chromite.lib import sudo |
Mike Frysinger | daf57b8 | 2019-11-23 17:26:51 -0500 | [diff] [blame] | 21 | from chromite.scripts import cros_sdk |
Benjamin Gordon | 2d7bf58 | 2017-07-12 10:11:26 -0600 | [diff] [blame] | 22 | |
| 23 | |
Mike Frysinger | edc0491 | 2019-11-16 01:30:43 -0500 | [diff] [blame] | 24 | # This long decorator triggers a false positive in the docstring test. |
| 25 | # https://github.com/PyCQA/pylint/issues/3077 |
| 26 | # pylint: disable=bad-docstring-quotes |
Alex Klein | 1699fab | 2022-09-08 08:46:06 -0600 | [diff] [blame] | 27 | @unittest.skipIf( |
| 28 | cros_build_lib.IsInsideChroot(), "Tests only make sense outside the chroot" |
| 29 | ) |
Benjamin Gordon | 03c56e4 | 2017-09-11 15:48:39 -0400 | [diff] [blame] | 30 | class CrosSdkPrerequisitesTest(cros_test_lib.TempDirTestCase): |
Alex Klein | 1699fab | 2022-09-08 08:46:06 -0600 | [diff] [blame] | 31 | """Tests for required packages on the host machine. |
Benjamin Gordon | 03c56e4 | 2017-09-11 15:48:39 -0400 | [diff] [blame] | 32 | |
Alex Klein | 1699fab | 2022-09-08 08:46:06 -0600 | [diff] [blame] | 33 | These are not real unit tests. If these tests fail, it means your machine is |
| 34 | missing necessary commands to support image-backed chroots. Run cros_sdk in |
| 35 | a terminal to get info about what you need to install. |
| 36 | """ |
Benjamin Gordon | 03c56e4 | 2017-09-11 15:48:39 -0400 | [diff] [blame] | 37 | |
Alex Klein | 1699fab | 2022-09-08 08:46:06 -0600 | [diff] [blame] | 38 | def testLvmCommandsPresent(self): |
| 39 | """Check for commands from the lvm2 package.""" |
| 40 | with sudo.SudoKeepAlive(): |
| 41 | cmd = ["lvs", "--version"] |
| 42 | result = cros_build_lib.run(cmd, check=False) |
| 43 | self.assertEqual(result.returncode, 0) |
Benjamin Gordon | 03c56e4 | 2017-09-11 15:48:39 -0400 | [diff] [blame] | 44 | |
Alex Klein | 1699fab | 2022-09-08 08:46:06 -0600 | [diff] [blame] | 45 | def testThinProvisioningToolsPresent(self): |
| 46 | """Check for commands from the thin-provisioning-tools package.""" |
| 47 | with sudo.SudoKeepAlive(): |
| 48 | cmd = ["thin_check", "-V"] |
| 49 | result = cros_build_lib.run(cmd, check=False) |
| 50 | self.assertEqual(result.returncode, 0) |
Benjamin Gordon | 03c56e4 | 2017-09-11 15:48:39 -0400 | [diff] [blame] | 51 | |
Alex Klein | 1699fab | 2022-09-08 08:46:06 -0600 | [diff] [blame] | 52 | def testLosetupCommandPresent(self): |
| 53 | """Check for commands from the mount package.""" |
| 54 | with sudo.SudoKeepAlive(): |
| 55 | cmd = ["losetup", "--help"] |
| 56 | result = cros_build_lib.run(cmd, check=False) |
| 57 | self.assertEqual(result.returncode, 0) |
Benjamin Gordon | 03c56e4 | 2017-09-11 15:48:39 -0400 | [diff] [blame] | 58 | |
| 59 | |
Mike Frysinger | daf57b8 | 2019-11-23 17:26:51 -0500 | [diff] [blame] | 60 | class CrosSdkUtilsTest(cros_test_lib.MockTempDirTestCase): |
Alex Klein | 1699fab | 2022-09-08 08:46:06 -0600 | [diff] [blame] | 61 | """Tests for misc util funcs.""" |
Mike Frysinger | daf57b8 | 2019-11-23 17:26:51 -0500 | [diff] [blame] | 62 | |
Alex Klein | 1699fab | 2022-09-08 08:46:06 -0600 | [diff] [blame] | 63 | def testGetArchStageTarballs(self): |
| 64 | """Basic test of GetArchStageTarballs.""" |
| 65 | self.assertCountEqual( |
| 66 | [ |
| 67 | "https://storage.googleapis.com/chromiumos-sdk/cros-sdk-123.tar.xz", |
| 68 | ], |
| 69 | cros_sdk.GetArchStageTarballs("123"), |
| 70 | ) |
Mike Frysinger | daf57b8 | 2019-11-23 17:26:51 -0500 | [diff] [blame] | 71 | |
Alex Klein | 1699fab | 2022-09-08 08:46:06 -0600 | [diff] [blame] | 72 | def testFetchRemoteTarballsEmpty(self): |
| 73 | """Test FetchRemoteTarballs with no results.""" |
| 74 | m = self.PatchObject(retry_util, "RunCurl") |
| 75 | with self.assertRaises(ValueError): |
| 76 | cros_sdk.FetchRemoteTarballs(self.tempdir, []) |
| 77 | m.return_value = cros_build_lib.CompletedProcess(stdout=b"Foo: bar\n") |
| 78 | with self.assertRaises(ValueError): |
| 79 | cros_sdk.FetchRemoteTarballs(self.tempdir, ["gs://x.tar"]) |
Mike Frysinger | daf57b8 | 2019-11-23 17:26:51 -0500 | [diff] [blame] | 80 | |
Alex Klein | 1699fab | 2022-09-08 08:46:06 -0600 | [diff] [blame] | 81 | def testFetchRemoteTarballsSuccess(self): |
| 82 | """Test FetchRemoteTarballs with a successful download.""" |
| 83 | curl = cros_build_lib.CompletedProcess( |
| 84 | stdout=(b"HTTP/1.0 200\n" b"Foo: bar\n" b"Content-Length: 100\n") |
| 85 | ) |
| 86 | self.PatchObject(retry_util, "RunCurl", return_value=curl) |
| 87 | self.assertEqual( |
| 88 | os.path.join(self.tempdir, "tar"), |
| 89 | cros_sdk.FetchRemoteTarballs(self.tempdir, ["gs://x/tar"]), |
| 90 | ) |
Mike Frysinger | daf57b8 | 2019-11-23 17:26:51 -0500 | [diff] [blame] | 91 | |
| 92 | |
Mike Frysinger | 5f5c70b | 2022-07-19 12:55:21 -0400 | [diff] [blame] | 93 | class CrosSdkParserCommandLineTest(cros_test_lib.MockTestCase): |
Alex Klein | 1699fab | 2022-09-08 08:46:06 -0600 | [diff] [blame] | 94 | """Tests involving the CLI.""" |
Mike Frysinger | 5f5c70b | 2022-07-19 12:55:21 -0400 | [diff] [blame] | 95 | |
Alex Klein | 1699fab | 2022-09-08 08:46:06 -0600 | [diff] [blame] | 96 | # pylint: disable=protected-access |
Mike Frysinger | 5f5c70b | 2022-07-19 12:55:21 -0400 | [diff] [blame] | 97 | |
Alex Klein | 1699fab | 2022-09-08 08:46:06 -0600 | [diff] [blame] | 98 | # A typical sys.argv[0] that cros_sdk sees. |
| 99 | ARGV0 = "/home/chronos/chromiumos/chromite/bin/cros_sdk" |
Mike Frysinger | 5f5c70b | 2022-07-19 12:55:21 -0400 | [diff] [blame] | 100 | |
Alex Klein | 1699fab | 2022-09-08 08:46:06 -0600 | [diff] [blame] | 101 | def setUp(self): |
| 102 | self.parser, _ = cros_sdk._CreateParser("1", "2") |
Mike Frysinger | 5f5c70b | 2022-07-19 12:55:21 -0400 | [diff] [blame] | 103 | |
Alex Klein | 1699fab | 2022-09-08 08:46:06 -0600 | [diff] [blame] | 104 | def testSudoCommand(self): |
| 105 | """Verify basic sudo command building works.""" |
| 106 | # Stabilize the env for testing. |
| 107 | for v in ( |
| 108 | constants.CHROOT_ENVIRONMENT_ALLOWLIST + constants.ENV_PASSTHRU |
| 109 | ): |
| 110 | os.environ[v] = "value" |
| 111 | os.environ["PATH"] = "path" |
Mike Frysinger | 5f5c70b | 2022-07-19 12:55:21 -0400 | [diff] [blame] | 112 | |
Alex Klein | 1699fab | 2022-09-08 08:46:06 -0600 | [diff] [blame] | 113 | cmd = cros_sdk._SudoCommand() |
| 114 | assert cmd[0] == "sudo" |
| 115 | assert "CHROMEOS_SUDO_PATH=path" in cmd |
| 116 | rlimits = [x for x in cmd if x.startswith("CHROMEOS_SUDO_RLIMITS=")] |
| 117 | assert len(rlimits) == 1 |
Mike Frysinger | 5f5c70b | 2022-07-19 12:55:21 -0400 | [diff] [blame] | 118 | |
Alex Klein | 1699fab | 2022-09-08 08:46:06 -0600 | [diff] [blame] | 119 | # Spot check some pass thru vars. |
| 120 | assert "GIT_AUTHOR_EMAIL=value" in cmd |
| 121 | assert "https_proxy=value" in cmd |
Mike Frysinger | 5f5c70b | 2022-07-19 12:55:21 -0400 | [diff] [blame] | 122 | |
Alex Klein | 1699fab | 2022-09-08 08:46:06 -0600 | [diff] [blame] | 123 | # Make sure we only pass vars after `sudo`. |
| 124 | for i in range(1, len(cmd)): |
| 125 | assert "=" in cmd[i] |
| 126 | v = cmd[i].split("=", 1)[0] |
| 127 | assert re.match(r"^[A-Za-z0-9_]+$", v) is not None |
Mike Frysinger | 5f5c70b | 2022-07-19 12:55:21 -0400 | [diff] [blame] | 128 | |
Alex Klein | 1699fab | 2022-09-08 08:46:06 -0600 | [diff] [blame] | 129 | def testReexecCommand(self): |
| 130 | """Verify reexec command line building.""" |
| 131 | # Stub sudo logic since we tested it above already. |
| 132 | self.PatchObject(cros_sdk, "_SudoCommand", return_value=["sudo"]) |
| 133 | opts = self.parser.parse_args([]) |
| 134 | new_cmd = cros_sdk._BuildReExecCommand([self.ARGV0], opts) |
| 135 | assert new_cmd == ["sudo", "--", sys.executable, self.ARGV0] |
Mike Frysinger | 5f5c70b | 2022-07-19 12:55:21 -0400 | [diff] [blame] | 136 | |
Alex Klein | 1699fab | 2022-09-08 08:46:06 -0600 | [diff] [blame] | 137 | def testReexecCommandStrace(self): |
| 138 | """Verify reexec command line building w/strace.""" |
| 139 | # Stub sudo logic since we tested it above already. |
| 140 | self.PatchObject(cros_sdk, "_SudoCommand", return_value=["sudo"]) |
Mike Frysinger | 5f5c70b | 2022-07-19 12:55:21 -0400 | [diff] [blame] | 141 | |
Alex Klein | 1699fab | 2022-09-08 08:46:06 -0600 | [diff] [blame] | 142 | # Strace args passed, but not enabled. |
| 143 | opts = self.parser.parse_args(["--strace-arguments=-s4096 -v"]) |
| 144 | new_cmd = cros_sdk._BuildReExecCommand([self.ARGV0], opts) |
| 145 | assert new_cmd == ["sudo", "--", sys.executable, self.ARGV0] |
Mike Frysinger | 5f5c70b | 2022-07-19 12:55:21 -0400 | [diff] [blame] | 146 | |
Alex Klein | 1699fab | 2022-09-08 08:46:06 -0600 | [diff] [blame] | 147 | # Strace enabled. |
| 148 | opts = self.parser.parse_args(["--strace"]) |
| 149 | new_cmd = cros_sdk._BuildReExecCommand([self.ARGV0], opts) |
| 150 | assert new_cmd == [ |
| 151 | "sudo", |
| 152 | "--", |
| 153 | "strace", |
| 154 | "--", |
| 155 | sys.executable, |
| 156 | self.ARGV0, |
| 157 | ] |
Mike Frysinger | 5f5c70b | 2022-07-19 12:55:21 -0400 | [diff] [blame] | 158 | |
Alex Klein | 1699fab | 2022-09-08 08:46:06 -0600 | [diff] [blame] | 159 | # Strace enabled w/args. |
| 160 | opts = self.parser.parse_args( |
| 161 | ["--strace", "--strace-arguments=-s4096 -v"] |
| 162 | ) |
| 163 | new_cmd = cros_sdk._BuildReExecCommand([self.ARGV0], opts) |
| 164 | assert new_cmd == [ |
| 165 | "sudo", |
| 166 | "--", |
| 167 | "strace", |
| 168 | "-s4096", |
| 169 | "-v", |
| 170 | "--", |
| 171 | sys.executable, |
| 172 | self.ARGV0, |
| 173 | ] |
Mike Frysinger | 5f5c70b | 2022-07-19 12:55:21 -0400 | [diff] [blame] | 174 | |
| 175 | |
Alex Klein | 1699fab | 2022-09-08 08:46:06 -0600 | [diff] [blame] | 176 | @unittest.skipIf( |
| 177 | cros_build_lib.IsInsideChroot(), "Tests only make sense outside the chroot" |
| 178 | ) |
Mike Frysinger | edc0491 | 2019-11-16 01:30:43 -0500 | [diff] [blame] | 179 | @unittest.skip( |
Alex Klein | 1699fab | 2022-09-08 08:46:06 -0600 | [diff] [blame] | 180 | "These are triggering hangs inside lvm when run through run_tests. " |
| 181 | "https://crbug.com/764335" |
| 182 | ) |
Benjamin Gordon | 2d7bf58 | 2017-07-12 10:11:26 -0600 | [diff] [blame] | 183 | class CrosSdkSnapshotTest(cros_test_lib.TempDirTestCase): |
Alex Klein | 1699fab | 2022-09-08 08:46:06 -0600 | [diff] [blame] | 184 | """Tests for the snapshot functionality in cros_sdk.""" |
Benjamin Gordon | 2d7bf58 | 2017-07-12 10:11:26 -0600 | [diff] [blame] | 185 | |
Alex Klein | 1699fab | 2022-09-08 08:46:06 -0600 | [diff] [blame] | 186 | def setUp(self): |
| 187 | with sudo.SudoKeepAlive(): |
| 188 | # Create just enough of a chroot to fool cros_sdk into accepting it. |
| 189 | self.chroot = os.path.join(self.tempdir, "chroot") |
| 190 | cros_sdk_lib.MountChroot(self.chroot, create=True) |
| 191 | logging.debug("Chroot mounted on %s", self.chroot) |
Benjamin Gordon | 2d7bf58 | 2017-07-12 10:11:26 -0600 | [diff] [blame] | 192 | |
Alex Klein | 1699fab | 2022-09-08 08:46:06 -0600 | [diff] [blame] | 193 | chroot_etc = os.path.join(self.chroot, "etc") |
| 194 | osutils.SafeMakedirsNonRoot(chroot_etc) |
Benjamin Gordon | 2d7bf58 | 2017-07-12 10:11:26 -0600 | [diff] [blame] | 195 | |
Alex Klein | 1699fab | 2022-09-08 08:46:06 -0600 | [diff] [blame] | 196 | self.chroot_version_file = os.path.join( |
| 197 | chroot_etc, "cros_chroot_version" |
| 198 | ) |
| 199 | osutils.Touch(self.chroot_version_file, makedirs=True) |
Benjamin Gordon | 2d7bf58 | 2017-07-12 10:11:26 -0600 | [diff] [blame] | 200 | |
Alex Klein | 1699fab | 2022-09-08 08:46:06 -0600 | [diff] [blame] | 201 | def tearDown(self): |
| 202 | with sudo.SudoKeepAlive(): |
| 203 | cros_sdk_lib.CleanupChrootMount(self.chroot, delete=True) |
Benjamin Gordon | 2d7bf58 | 2017-07-12 10:11:26 -0600 | [diff] [blame] | 204 | |
Alex Klein | 1699fab | 2022-09-08 08:46:06 -0600 | [diff] [blame] | 205 | def _crosSdk(self, args): |
| 206 | cmd = ["cros_sdk", "--chroot", self.chroot] |
| 207 | cmd.extend(args) |
Benjamin Gordon | 2d7bf58 | 2017-07-12 10:11:26 -0600 | [diff] [blame] | 208 | |
Alex Klein | 1699fab | 2022-09-08 08:46:06 -0600 | [diff] [blame] | 209 | try: |
| 210 | result = cros_build_lib.run( |
| 211 | cmd, |
| 212 | print_cmd=False, |
| 213 | stdout=True, |
| 214 | check=False, |
| 215 | stderr=subprocess.STDOUT, |
| 216 | ) |
| 217 | except cros_build_lib.RunCommandError as e: |
| 218 | raise SystemExit("Running %r failed!: %s" % (cmd, e)) |
Benjamin Gordon | 2d7bf58 | 2017-07-12 10:11:26 -0600 | [diff] [blame] | 219 | |
Alex Klein | 1699fab | 2022-09-08 08:46:06 -0600 | [diff] [blame] | 220 | return result.returncode, result.stdout |
Benjamin Gordon | 2d7bf58 | 2017-07-12 10:11:26 -0600 | [diff] [blame] | 221 | |
Alex Klein | 1699fab | 2022-09-08 08:46:06 -0600 | [diff] [blame] | 222 | def testSnapshotsRequireImage(self): |
| 223 | code, output = self._crosSdk(["--snapshot-list", "--nouse-image"]) |
| 224 | self.assertNotEqual(code, 0) |
| 225 | self.assertIn("Snapshot operations are not compatible with", output) |
Benjamin Gordon | 2d7bf58 | 2017-07-12 10:11:26 -0600 | [diff] [blame] | 226 | |
Alex Klein | 1699fab | 2022-09-08 08:46:06 -0600 | [diff] [blame] | 227 | code, output = self._crosSdk( |
| 228 | ["--snapshot-delete", "test", "--nouse-image"] |
| 229 | ) |
| 230 | self.assertNotEqual(code, 0) |
| 231 | self.assertIn("Snapshot operations are not compatible with", output) |
Benjamin Gordon | 2d7bf58 | 2017-07-12 10:11:26 -0600 | [diff] [blame] | 232 | |
Alex Klein | 1699fab | 2022-09-08 08:46:06 -0600 | [diff] [blame] | 233 | code, output = self._crosSdk( |
| 234 | ["--snapshot-create", "test", "--nouse-image"] |
| 235 | ) |
| 236 | self.assertNotEqual(code, 0) |
| 237 | self.assertIn("Snapshot operations are not compatible with", output) |
Benjamin Gordon | 2d7bf58 | 2017-07-12 10:11:26 -0600 | [diff] [blame] | 238 | |
Alex Klein | 1699fab | 2022-09-08 08:46:06 -0600 | [diff] [blame] | 239 | code, output = self._crosSdk( |
| 240 | ["--snapshot-restore", "test", "--nouse-image"] |
| 241 | ) |
| 242 | self.assertNotEqual(code, 0) |
| 243 | self.assertIn("Snapshot operations are not compatible with", output) |
Benjamin Gordon | 2d7bf58 | 2017-07-12 10:11:26 -0600 | [diff] [blame] | 244 | |
Alex Klein | 1699fab | 2022-09-08 08:46:06 -0600 | [diff] [blame] | 245 | def testSnapshotWithDeleteChroot(self): |
| 246 | code, output = self._crosSdk(["--delete", "--snapshot-list"]) |
| 247 | self.assertNotEqual(code, 0) |
| 248 | self.assertIn("Trying to enter or snapshot the chroot", output) |
Benjamin Gordon | 2d7bf58 | 2017-07-12 10:11:26 -0600 | [diff] [blame] | 249 | |
Alex Klein | 1699fab | 2022-09-08 08:46:06 -0600 | [diff] [blame] | 250 | code, output = self._crosSdk(["--delete", "--snapshot-delete", "test"]) |
| 251 | self.assertNotEqual(code, 0) |
| 252 | self.assertIn("Trying to enter or snapshot the chroot", output) |
Benjamin Gordon | 2d7bf58 | 2017-07-12 10:11:26 -0600 | [diff] [blame] | 253 | |
Alex Klein | 1699fab | 2022-09-08 08:46:06 -0600 | [diff] [blame] | 254 | code, output = self._crosSdk(["--delete", "--snapshot-create", "test"]) |
| 255 | self.assertNotEqual(code, 0) |
| 256 | self.assertIn("Trying to enter or snapshot the chroot", output) |
Benjamin Gordon | 2d7bf58 | 2017-07-12 10:11:26 -0600 | [diff] [blame] | 257 | |
Alex Klein | 1699fab | 2022-09-08 08:46:06 -0600 | [diff] [blame] | 258 | code, output = self._crosSdk(["--delete", "--snapshot-restore", "test"]) |
| 259 | self.assertNotEqual(code, 0) |
| 260 | self.assertIn("Trying to enter or snapshot the chroot", output) |
Benjamin Gordon | 2d7bf58 | 2017-07-12 10:11:26 -0600 | [diff] [blame] | 261 | |
Alex Klein | 1699fab | 2022-09-08 08:46:06 -0600 | [diff] [blame] | 262 | def testEmptySnapshotList(self): |
| 263 | code, output = self._crosSdk(["--snapshot-list"]) |
| 264 | self.assertEqual(code, 0) |
| 265 | self.assertEqual(output, "") |
Benjamin Gordon | 2d7bf58 | 2017-07-12 10:11:26 -0600 | [diff] [blame] | 266 | |
Alex Klein | 1699fab | 2022-09-08 08:46:06 -0600 | [diff] [blame] | 267 | def testOneSnapshot(self): |
| 268 | code, _ = self._crosSdk(["--snapshot-create", "test"]) |
| 269 | self.assertEqual(code, 0) |
Benjamin Gordon | 2d7bf58 | 2017-07-12 10:11:26 -0600 | [diff] [blame] | 270 | |
Alex Klein | 1699fab | 2022-09-08 08:46:06 -0600 | [diff] [blame] | 271 | code, output = self._crosSdk(["--snapshot-list"]) |
| 272 | self.assertEqual(code, 0) |
| 273 | self.assertEqual(output.strip(), "test") |
Benjamin Gordon | 2d7bf58 | 2017-07-12 10:11:26 -0600 | [diff] [blame] | 274 | |
Alex Klein | 1699fab | 2022-09-08 08:46:06 -0600 | [diff] [blame] | 275 | def testMultipleSnapshots(self): |
| 276 | code, _ = self._crosSdk(["--snapshot-create", "test"]) |
| 277 | self.assertEqual(code, 0) |
| 278 | code, _ = self._crosSdk(["--snapshot-create", "test2"]) |
| 279 | self.assertEqual(code, 0) |
Benjamin Gordon | 2d7bf58 | 2017-07-12 10:11:26 -0600 | [diff] [blame] | 280 | |
Alex Klein | 1699fab | 2022-09-08 08:46:06 -0600 | [diff] [blame] | 281 | code, output = self._crosSdk(["--snapshot-list"]) |
| 282 | self.assertEqual(code, 0) |
| 283 | self.assertSetEqual(set(output.strip().split("\n")), {"test", "test2"}) |
Benjamin Gordon | 2d7bf58 | 2017-07-12 10:11:26 -0600 | [diff] [blame] | 284 | |
Alex Klein | 1699fab | 2022-09-08 08:46:06 -0600 | [diff] [blame] | 285 | def testCantCreateSameSnapshotTwice(self): |
| 286 | code, _ = self._crosSdk(["--snapshot-create", "test"]) |
| 287 | self.assertEqual(code, 0) |
| 288 | code, _ = self._crosSdk(["--snapshot-create", "test"]) |
| 289 | self.assertNotEqual(code, 0) |
Benjamin Gordon | 2d7bf58 | 2017-07-12 10:11:26 -0600 | [diff] [blame] | 290 | |
Alex Klein | 1699fab | 2022-09-08 08:46:06 -0600 | [diff] [blame] | 291 | code, output = self._crosSdk(["--snapshot-list"]) |
| 292 | self.assertEqual(code, 0) |
| 293 | self.assertEqual(output.strip(), "test") |
Benjamin Gordon | 2d7bf58 | 2017-07-12 10:11:26 -0600 | [diff] [blame] | 294 | |
Alex Klein | 1699fab | 2022-09-08 08:46:06 -0600 | [diff] [blame] | 295 | def testCreateSnapshotMountsAsNeeded(self): |
| 296 | with sudo.SudoKeepAlive(): |
| 297 | cros_sdk_lib.CleanupChrootMount(self.chroot) |
Benjamin Gordon | 2d7bf58 | 2017-07-12 10:11:26 -0600 | [diff] [blame] | 298 | |
Alex Klein | 1699fab | 2022-09-08 08:46:06 -0600 | [diff] [blame] | 299 | code, _ = self._crosSdk(["--snapshot-create", "test"]) |
| 300 | self.assertEqual(code, 0) |
| 301 | self.assertExists(self.chroot_version_file) |
Benjamin Gordon | 2d7bf58 | 2017-07-12 10:11:26 -0600 | [diff] [blame] | 302 | |
Alex Klein | 1699fab | 2022-09-08 08:46:06 -0600 | [diff] [blame] | 303 | code, output = self._crosSdk(["--snapshot-list"]) |
| 304 | self.assertEqual(code, 0) |
| 305 | self.assertEqual(output.strip(), "test") |
Benjamin Gordon | 2d7bf58 | 2017-07-12 10:11:26 -0600 | [diff] [blame] | 306 | |
Alex Klein | 1699fab | 2022-09-08 08:46:06 -0600 | [diff] [blame] | 307 | def testDeleteGoodSnapshot(self): |
| 308 | code, _ = self._crosSdk(["--snapshot-create", "test"]) |
| 309 | self.assertEqual(code, 0) |
| 310 | code, _ = self._crosSdk(["--snapshot-create", "test2"]) |
| 311 | self.assertEqual(code, 0) |
Benjamin Gordon | 2d7bf58 | 2017-07-12 10:11:26 -0600 | [diff] [blame] | 312 | |
Alex Klein | 1699fab | 2022-09-08 08:46:06 -0600 | [diff] [blame] | 313 | code, _ = self._crosSdk(["--snapshot-delete", "test"]) |
| 314 | self.assertEqual(code, 0) |
Benjamin Gordon | 2d7bf58 | 2017-07-12 10:11:26 -0600 | [diff] [blame] | 315 | |
Alex Klein | 1699fab | 2022-09-08 08:46:06 -0600 | [diff] [blame] | 316 | code, output = self._crosSdk(["--snapshot-list"]) |
| 317 | self.assertEqual(code, 0) |
| 318 | self.assertEqual(output.strip(), "test2") |
Benjamin Gordon | 2d7bf58 | 2017-07-12 10:11:26 -0600 | [diff] [blame] | 319 | |
Alex Klein | 1699fab | 2022-09-08 08:46:06 -0600 | [diff] [blame] | 320 | def testDeleteMissingSnapshot(self): |
| 321 | code, _ = self._crosSdk(["--snapshot-create", "test"]) |
| 322 | self.assertEqual(code, 0) |
| 323 | code, _ = self._crosSdk(["--snapshot-create", "test2"]) |
| 324 | self.assertEqual(code, 0) |
Benjamin Gordon | 2d7bf58 | 2017-07-12 10:11:26 -0600 | [diff] [blame] | 325 | |
Alex Klein | 1699fab | 2022-09-08 08:46:06 -0600 | [diff] [blame] | 326 | code, _ = self._crosSdk(["--snapshot-delete", "test3"]) |
| 327 | self.assertEqual(code, 0) |
Benjamin Gordon | 2d7bf58 | 2017-07-12 10:11:26 -0600 | [diff] [blame] | 328 | |
Alex Klein | 1699fab | 2022-09-08 08:46:06 -0600 | [diff] [blame] | 329 | code, output = self._crosSdk(["--snapshot-list"]) |
| 330 | self.assertEqual(code, 0) |
| 331 | self.assertSetEqual(set(output.strip().split("\n")), {"test", "test2"}) |
Benjamin Gordon | 2d7bf58 | 2017-07-12 10:11:26 -0600 | [diff] [blame] | 332 | |
Alex Klein | 1699fab | 2022-09-08 08:46:06 -0600 | [diff] [blame] | 333 | def testDeleteAndCreateSnapshot(self): |
| 334 | code, _ = self._crosSdk(["--snapshot-create", "test"]) |
| 335 | self.assertEqual(code, 0) |
| 336 | code, _ = self._crosSdk(["--snapshot-create", "test2"]) |
| 337 | self.assertEqual(code, 0) |
Benjamin Gordon | 2d7bf58 | 2017-07-12 10:11:26 -0600 | [diff] [blame] | 338 | |
Alex Klein | 1699fab | 2022-09-08 08:46:06 -0600 | [diff] [blame] | 339 | code, _ = self._crosSdk( |
| 340 | ["--snapshot-create", "test", "--snapshot-delete", "test"] |
| 341 | ) |
| 342 | self.assertEqual(code, 0) |
Benjamin Gordon | 2d7bf58 | 2017-07-12 10:11:26 -0600 | [diff] [blame] | 343 | |
Alex Klein | 1699fab | 2022-09-08 08:46:06 -0600 | [diff] [blame] | 344 | code, output = self._crosSdk(["--snapshot-list"]) |
| 345 | self.assertEqual(code, 0) |
| 346 | self.assertSetEqual(set(output.strip().split("\n")), {"test", "test2"}) |
Benjamin Gordon | 2d7bf58 | 2017-07-12 10:11:26 -0600 | [diff] [blame] | 347 | |
Alex Klein | 1699fab | 2022-09-08 08:46:06 -0600 | [diff] [blame] | 348 | def testRestoreSnapshot(self): |
| 349 | with sudo.SudoKeepAlive(): |
| 350 | test_file = os.path.join(self.chroot, "etc", "test_file") |
| 351 | osutils.Touch(test_file) |
Benjamin Gordon | 2d7bf58 | 2017-07-12 10:11:26 -0600 | [diff] [blame] | 352 | |
Alex Klein | 1699fab | 2022-09-08 08:46:06 -0600 | [diff] [blame] | 353 | code, _ = self._crosSdk(["--snapshot-create", "test"]) |
| 354 | self.assertEqual(code, 0) |
Benjamin Gordon | 2d7bf58 | 2017-07-12 10:11:26 -0600 | [diff] [blame] | 355 | |
Alex Klein | 1699fab | 2022-09-08 08:46:06 -0600 | [diff] [blame] | 356 | osutils.SafeUnlink(test_file) |
Benjamin Gordon | 2d7bf58 | 2017-07-12 10:11:26 -0600 | [diff] [blame] | 357 | |
Alex Klein | 1699fab | 2022-09-08 08:46:06 -0600 | [diff] [blame] | 358 | code, _ = self._crosSdk(["--snapshot-restore", "test"]) |
| 359 | self.assertEqual(code, 0) |
| 360 | self.assertTrue(cros_sdk_lib.MountChroot(self.chroot, create=False)) |
| 361 | self.assertExists(test_file) |
Benjamin Gordon | 2d7bf58 | 2017-07-12 10:11:26 -0600 | [diff] [blame] | 362 | |
Alex Klein | 1699fab | 2022-09-08 08:46:06 -0600 | [diff] [blame] | 363 | code, output = self._crosSdk(["--snapshot-list"]) |
| 364 | self.assertEqual(code, 0) |
| 365 | self.assertEqual(output, "") |
Benjamin Gordon | 2d7bf58 | 2017-07-12 10:11:26 -0600 | [diff] [blame] | 366 | |
Alex Klein | 1699fab | 2022-09-08 08:46:06 -0600 | [diff] [blame] | 367 | def testRestoreAndCreateSnapshot(self): |
| 368 | with sudo.SudoKeepAlive(): |
| 369 | test_file = os.path.join(self.chroot, "etc", "test_file") |
| 370 | osutils.Touch(test_file) |
Benjamin Gordon | 2d7bf58 | 2017-07-12 10:11:26 -0600 | [diff] [blame] | 371 | |
Alex Klein | 1699fab | 2022-09-08 08:46:06 -0600 | [diff] [blame] | 372 | code, _ = self._crosSdk(["--snapshot-create", "test"]) |
| 373 | self.assertEqual(code, 0) |
Benjamin Gordon | 2d7bf58 | 2017-07-12 10:11:26 -0600 | [diff] [blame] | 374 | |
Alex Klein | 1699fab | 2022-09-08 08:46:06 -0600 | [diff] [blame] | 375 | osutils.SafeUnlink(test_file) |
Benjamin Gordon | 2d7bf58 | 2017-07-12 10:11:26 -0600 | [diff] [blame] | 376 | |
Alex Klein | 1699fab | 2022-09-08 08:46:06 -0600 | [diff] [blame] | 377 | code, _ = self._crosSdk( |
| 378 | ["--snapshot-restore", "test", "--snapshot-create", "test"] |
| 379 | ) |
| 380 | self.assertEqual(code, 0) |
| 381 | self.assertTrue(cros_sdk_lib.MountChroot(self.chroot, create=False)) |
| 382 | self.assertExists(test_file) |
Benjamin Gordon | 2d7bf58 | 2017-07-12 10:11:26 -0600 | [diff] [blame] | 383 | |
Alex Klein | 1699fab | 2022-09-08 08:46:06 -0600 | [diff] [blame] | 384 | code, output = self._crosSdk(["--snapshot-list"]) |
| 385 | self.assertEqual(code, 0) |
| 386 | self.assertEqual(output.strip(), "test") |
Benjamin Gordon | 2d7bf58 | 2017-07-12 10:11:26 -0600 | [diff] [blame] | 387 | |
Alex Klein | 1699fab | 2022-09-08 08:46:06 -0600 | [diff] [blame] | 388 | def testDeleteCantRestoreSameSnapshot(self): |
| 389 | code, _ = self._crosSdk(["--snapshot-create", "test"]) |
| 390 | self.assertEqual(code, 0) |
Benjamin Gordon | 2d7bf58 | 2017-07-12 10:11:26 -0600 | [diff] [blame] | 391 | |
Alex Klein | 1699fab | 2022-09-08 08:46:06 -0600 | [diff] [blame] | 392 | code, _ = self._crosSdk( |
| 393 | ["--snapshot-delete", "test", "--snapshot-restore", "test"] |
| 394 | ) |
| 395 | self.assertNotEqual(code, 0) |
Benjamin Gordon | 2d7bf58 | 2017-07-12 10:11:26 -0600 | [diff] [blame] | 396 | |
Alex Klein | 1699fab | 2022-09-08 08:46:06 -0600 | [diff] [blame] | 397 | code, output = self._crosSdk(["--snapshot-list"]) |
| 398 | self.assertEqual(code, 0) |
| 399 | self.assertEqual(output.strip(), "test") |
Benjamin Gordon | 2d7bf58 | 2017-07-12 10:11:26 -0600 | [diff] [blame] | 400 | |
Alex Klein | 1699fab | 2022-09-08 08:46:06 -0600 | [diff] [blame] | 401 | def testCantRestoreInvalidSnapshot(self): |
| 402 | with sudo.SudoKeepAlive(): |
| 403 | test_file = os.path.join(self.chroot, "etc", "test_file") |
| 404 | osutils.Touch(test_file) |
Benjamin Gordon | 2d7bf58 | 2017-07-12 10:11:26 -0600 | [diff] [blame] | 405 | |
Alex Klein | 1699fab | 2022-09-08 08:46:06 -0600 | [diff] [blame] | 406 | code, _ = self._crosSdk(["--snapshot-restore", "test"]) |
| 407 | self.assertNotEqual(code, 0) |
| 408 | # Failed restore leaves the existing snapshot in place. |
| 409 | self.assertExists(test_file) |
Benjamin Gordon | 2d7bf58 | 2017-07-12 10:11:26 -0600 | [diff] [blame] | 410 | |
Alex Klein | 1699fab | 2022-09-08 08:46:06 -0600 | [diff] [blame] | 411 | def testRestoreSnapshotMountsAsNeeded(self): |
| 412 | with sudo.SudoKeepAlive(): |
| 413 | test_file = os.path.join(self.chroot, "etc", "test_file") |
| 414 | osutils.Touch(test_file) |
Benjamin Gordon | 2d7bf58 | 2017-07-12 10:11:26 -0600 | [diff] [blame] | 415 | |
Alex Klein | 1699fab | 2022-09-08 08:46:06 -0600 | [diff] [blame] | 416 | code, _ = self._crosSdk(["--snapshot-create", "test"]) |
| 417 | self.assertEqual(code, 0) |
Benjamin Gordon | 2d7bf58 | 2017-07-12 10:11:26 -0600 | [diff] [blame] | 418 | |
Alex Klein | 1699fab | 2022-09-08 08:46:06 -0600 | [diff] [blame] | 419 | osutils.SafeUnlink(test_file) |
Benjamin Gordon | 2d7bf58 | 2017-07-12 10:11:26 -0600 | [diff] [blame] | 420 | |
Alex Klein | 1699fab | 2022-09-08 08:46:06 -0600 | [diff] [blame] | 421 | cros_sdk_lib.CleanupChrootMount(self.chroot) |
Benjamin Gordon | 2d7bf58 | 2017-07-12 10:11:26 -0600 | [diff] [blame] | 422 | |
Alex Klein | 1699fab | 2022-09-08 08:46:06 -0600 | [diff] [blame] | 423 | code, _ = self._crosSdk(["--snapshot-restore", "test"]) |
| 424 | self.assertEqual(code, 0) |
| 425 | self.assertExists(test_file) |
Benjamin Gordon | 2d7bf58 | 2017-07-12 10:11:26 -0600 | [diff] [blame] | 426 | |
Alex Klein | 1699fab | 2022-09-08 08:46:06 -0600 | [diff] [blame] | 427 | code, output = self._crosSdk(["--snapshot-list"]) |
| 428 | self.assertEqual(code, 0) |
| 429 | self.assertEqual(output, "") |