blob: 52f226646a253e117d6ed96be553053a43e6dfce [file] [log] [blame]
Mike Frysingerf1ba7ad2022-09-12 05:42:57 -04001# Copyright 2017 The ChromiumOS Authors
Benjamin Gordon2d7bf582017-07-12 10:11:26 -06002# 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
Benjamin Gordon2d7bf582017-07-12 10:11:26 -06007import os
Mike Frysinger5f5c70b2022-07-19 12:55:21 -04008import re
Mike Frysinger5f5c70b2022-07-19 12:55:21 -04009import sys
Benjamin Gordon2d7bf582017-07-12 10:11:26 -060010
Mike Frysinger5f5c70b2022-07-19 12:55:21 -040011from chromite.lib import constants
Benjamin Gordon2d7bf582017-07-12 10:11:26 -060012from chromite.lib import cros_build_lib
Benjamin Gordon2d7bf582017-07-12 10:11:26 -060013from chromite.lib import cros_test_lib
Mike Frysingerdaf57b82019-11-23 17:26:51 -050014from chromite.lib import retry_util
Mike Frysingerdaf57b82019-11-23 17:26:51 -050015from chromite.scripts import cros_sdk
Benjamin Gordon2d7bf582017-07-12 10:11:26 -060016
17
Mike Frysingerdaf57b82019-11-23 17:26:51 -050018class CrosSdkUtilsTest(cros_test_lib.MockTempDirTestCase):
Alex Klein1699fab2022-09-08 08:46:06 -060019 """Tests for misc util funcs."""
Mike Frysingerdaf57b82019-11-23 17:26:51 -050020
Alex Klein1699fab2022-09-08 08:46:06 -060021 def testGetArchStageTarballs(self):
22 """Basic test of GetArchStageTarballs."""
23 self.assertCountEqual(
24 [
25 "https://storage.googleapis.com/chromiumos-sdk/cros-sdk-123.tar.xz",
26 ],
27 cros_sdk.GetArchStageTarballs("123"),
28 )
Mike Frysingerdaf57b82019-11-23 17:26:51 -050029
Alex Klein1699fab2022-09-08 08:46:06 -060030 def testFetchRemoteTarballsEmpty(self):
31 """Test FetchRemoteTarballs with no results."""
32 m = self.PatchObject(retry_util, "RunCurl")
33 with self.assertRaises(ValueError):
34 cros_sdk.FetchRemoteTarballs(self.tempdir, [])
35 m.return_value = cros_build_lib.CompletedProcess(stdout=b"Foo: bar\n")
36 with self.assertRaises(ValueError):
37 cros_sdk.FetchRemoteTarballs(self.tempdir, ["gs://x.tar"])
Mike Frysingerdaf57b82019-11-23 17:26:51 -050038
Alex Klein1699fab2022-09-08 08:46:06 -060039 def testFetchRemoteTarballsSuccess(self):
40 """Test FetchRemoteTarballs with a successful download."""
41 curl = cros_build_lib.CompletedProcess(
42 stdout=(b"HTTP/1.0 200\n" b"Foo: bar\n" b"Content-Length: 100\n")
43 )
44 self.PatchObject(retry_util, "RunCurl", return_value=curl)
45 self.assertEqual(
46 os.path.join(self.tempdir, "tar"),
47 cros_sdk.FetchRemoteTarballs(self.tempdir, ["gs://x/tar"]),
48 )
Mike Frysingerdaf57b82019-11-23 17:26:51 -050049
50
Mike Frysinger5f5c70b2022-07-19 12:55:21 -040051class CrosSdkParserCommandLineTest(cros_test_lib.MockTestCase):
Alex Klein1699fab2022-09-08 08:46:06 -060052 """Tests involving the CLI."""
Mike Frysinger5f5c70b2022-07-19 12:55:21 -040053
Alex Klein1699fab2022-09-08 08:46:06 -060054 # pylint: disable=protected-access
Mike Frysinger5f5c70b2022-07-19 12:55:21 -040055
Alex Klein1699fab2022-09-08 08:46:06 -060056 # A typical sys.argv[0] that cros_sdk sees.
57 ARGV0 = "/home/chronos/chromiumos/chromite/bin/cros_sdk"
Mike Frysinger5f5c70b2022-07-19 12:55:21 -040058
Alex Klein1699fab2022-09-08 08:46:06 -060059 def setUp(self):
60 self.parser, _ = cros_sdk._CreateParser("1", "2")
Mike Frysinger5f5c70b2022-07-19 12:55:21 -040061
Alex Klein1699fab2022-09-08 08:46:06 -060062 def testSudoCommand(self):
63 """Verify basic sudo command building works."""
64 # Stabilize the env for testing.
65 for v in (
66 constants.CHROOT_ENVIRONMENT_ALLOWLIST + constants.ENV_PASSTHRU
67 ):
68 os.environ[v] = "value"
69 os.environ["PATH"] = "path"
Mike Frysinger5f5c70b2022-07-19 12:55:21 -040070
Alex Klein1699fab2022-09-08 08:46:06 -060071 cmd = cros_sdk._SudoCommand()
72 assert cmd[0] == "sudo"
73 assert "CHROMEOS_SUDO_PATH=path" in cmd
74 rlimits = [x for x in cmd if x.startswith("CHROMEOS_SUDO_RLIMITS=")]
75 assert len(rlimits) == 1
Mike Frysinger5f5c70b2022-07-19 12:55:21 -040076
Alex Klein1699fab2022-09-08 08:46:06 -060077 # Spot check some pass thru vars.
78 assert "GIT_AUTHOR_EMAIL=value" in cmd
79 assert "https_proxy=value" in cmd
Mike Frysinger5f5c70b2022-07-19 12:55:21 -040080
Alex Klein1699fab2022-09-08 08:46:06 -060081 # Make sure we only pass vars after `sudo`.
82 for i in range(1, len(cmd)):
83 assert "=" in cmd[i]
84 v = cmd[i].split("=", 1)[0]
85 assert re.match(r"^[A-Za-z0-9_]+$", v) is not None
Mike Frysinger5f5c70b2022-07-19 12:55:21 -040086
Alex Klein1699fab2022-09-08 08:46:06 -060087 def testReexecCommand(self):
88 """Verify reexec command line building."""
89 # Stub sudo logic since we tested it above already.
90 self.PatchObject(cros_sdk, "_SudoCommand", return_value=["sudo"])
91 opts = self.parser.parse_args([])
92 new_cmd = cros_sdk._BuildReExecCommand([self.ARGV0], opts)
93 assert new_cmd == ["sudo", "--", sys.executable, self.ARGV0]
Mike Frysinger5f5c70b2022-07-19 12:55:21 -040094
Alex Klein1699fab2022-09-08 08:46:06 -060095 def testReexecCommandStrace(self):
96 """Verify reexec command line building w/strace."""
97 # Stub sudo logic since we tested it above already.
98 self.PatchObject(cros_sdk, "_SudoCommand", return_value=["sudo"])
Mike Frysinger5f5c70b2022-07-19 12:55:21 -040099
Alex Klein1699fab2022-09-08 08:46:06 -0600100 # Strace args passed, but not enabled.
101 opts = self.parser.parse_args(["--strace-arguments=-s4096 -v"])
102 new_cmd = cros_sdk._BuildReExecCommand([self.ARGV0], opts)
103 assert new_cmd == ["sudo", "--", sys.executable, self.ARGV0]
Mike Frysinger5f5c70b2022-07-19 12:55:21 -0400104
Alex Klein1699fab2022-09-08 08:46:06 -0600105 # Strace enabled.
106 opts = self.parser.parse_args(["--strace"])
107 new_cmd = cros_sdk._BuildReExecCommand([self.ARGV0], opts)
108 assert new_cmd == [
109 "sudo",
110 "--",
111 "strace",
112 "--",
113 sys.executable,
114 self.ARGV0,
115 ]
Mike Frysinger5f5c70b2022-07-19 12:55:21 -0400116
Alex Klein1699fab2022-09-08 08:46:06 -0600117 # Strace enabled w/args.
118 opts = self.parser.parse_args(
119 ["--strace", "--strace-arguments=-s4096 -v"]
120 )
121 new_cmd = cros_sdk._BuildReExecCommand([self.ARGV0], opts)
122 assert new_cmd == [
123 "sudo",
124 "--",
125 "strace",
126 "-s4096",
127 "-v",
128 "--",
129 sys.executable,
130 self.ARGV0,
131 ]