blob: 23186cc47d64d96f232db216b9927385b606627a [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 [
Alex Klein68b270c2023-04-14 14:42:50 -060025 "https://storage.googleapis.com/chromiumos-sdk/"
26 "cros-sdk-123.tar.xz",
Alex Klein1699fab2022-09-08 08:46:06 -060027 ],
28 cros_sdk.GetArchStageTarballs("123"),
29 )
Mike Frysingerdaf57b82019-11-23 17:26:51 -050030
Alex Klein1699fab2022-09-08 08:46:06 -060031 def testFetchRemoteTarballsEmpty(self):
32 """Test FetchRemoteTarballs with no results."""
33 m = self.PatchObject(retry_util, "RunCurl")
34 with self.assertRaises(ValueError):
35 cros_sdk.FetchRemoteTarballs(self.tempdir, [])
36 m.return_value = cros_build_lib.CompletedProcess(stdout=b"Foo: bar\n")
37 with self.assertRaises(ValueError):
38 cros_sdk.FetchRemoteTarballs(self.tempdir, ["gs://x.tar"])
Mike Frysingerdaf57b82019-11-23 17:26:51 -050039
Alex Klein1699fab2022-09-08 08:46:06 -060040 def testFetchRemoteTarballsSuccess(self):
41 """Test FetchRemoteTarballs with a successful download."""
42 curl = cros_build_lib.CompletedProcess(
43 stdout=(b"HTTP/1.0 200\n" b"Foo: bar\n" b"Content-Length: 100\n")
44 )
45 self.PatchObject(retry_util, "RunCurl", return_value=curl)
46 self.assertEqual(
47 os.path.join(self.tempdir, "tar"),
48 cros_sdk.FetchRemoteTarballs(self.tempdir, ["gs://x/tar"]),
49 )
Mike Frysingerdaf57b82019-11-23 17:26:51 -050050
51
Mike Frysinger5f5c70b2022-07-19 12:55:21 -040052class CrosSdkParserCommandLineTest(cros_test_lib.MockTestCase):
Alex Klein1699fab2022-09-08 08:46:06 -060053 """Tests involving the CLI."""
Mike Frysinger5f5c70b2022-07-19 12:55:21 -040054
Alex Klein1699fab2022-09-08 08:46:06 -060055 # pylint: disable=protected-access
Mike Frysinger5f5c70b2022-07-19 12:55:21 -040056
Alex Klein1699fab2022-09-08 08:46:06 -060057 # A typical sys.argv[0] that cros_sdk sees.
58 ARGV0 = "/home/chronos/chromiumos/chromite/bin/cros_sdk"
Mike Frysinger5f5c70b2022-07-19 12:55:21 -040059
Alex Klein1699fab2022-09-08 08:46:06 -060060 def setUp(self):
61 self.parser, _ = cros_sdk._CreateParser("1", "2")
Mike Frysinger5f5c70b2022-07-19 12:55:21 -040062
Alex Klein1699fab2022-09-08 08:46:06 -060063 def testSudoCommand(self):
64 """Verify basic sudo command building works."""
65 # Stabilize the env for testing.
66 for v in (
67 constants.CHROOT_ENVIRONMENT_ALLOWLIST + constants.ENV_PASSTHRU
68 ):
69 os.environ[v] = "value"
70 os.environ["PATH"] = "path"
Mike Frysinger5f5c70b2022-07-19 12:55:21 -040071
Alex Klein1699fab2022-09-08 08:46:06 -060072 cmd = cros_sdk._SudoCommand()
73 assert cmd[0] == "sudo"
74 assert "CHROMEOS_SUDO_PATH=path" in cmd
75 rlimits = [x for x in cmd if x.startswith("CHROMEOS_SUDO_RLIMITS=")]
76 assert len(rlimits) == 1
Mike Frysinger5f5c70b2022-07-19 12:55:21 -040077
Alex Klein1699fab2022-09-08 08:46:06 -060078 # Spot check some pass thru vars.
79 assert "GIT_AUTHOR_EMAIL=value" in cmd
80 assert "https_proxy=value" in cmd
Mike Frysinger5f5c70b2022-07-19 12:55:21 -040081
Alex Klein1699fab2022-09-08 08:46:06 -060082 # Make sure we only pass vars after `sudo`.
83 for i in range(1, len(cmd)):
84 assert "=" in cmd[i]
85 v = cmd[i].split("=", 1)[0]
86 assert re.match(r"^[A-Za-z0-9_]+$", v) is not None
Mike Frysinger5f5c70b2022-07-19 12:55:21 -040087
Alex Klein1699fab2022-09-08 08:46:06 -060088 def testReexecCommand(self):
89 """Verify reexec command line building."""
90 # Stub sudo logic since we tested it above already.
91 self.PatchObject(cros_sdk, "_SudoCommand", return_value=["sudo"])
92 opts = self.parser.parse_args([])
93 new_cmd = cros_sdk._BuildReExecCommand([self.ARGV0], opts)
94 assert new_cmd == ["sudo", "--", sys.executable, self.ARGV0]
Mike Frysinger5f5c70b2022-07-19 12:55:21 -040095
Alex Klein1699fab2022-09-08 08:46:06 -060096 def testReexecCommandStrace(self):
97 """Verify reexec command line building w/strace."""
98 # Stub sudo logic since we tested it above already.
99 self.PatchObject(cros_sdk, "_SudoCommand", return_value=["sudo"])
Mike Frysinger5f5c70b2022-07-19 12:55:21 -0400100
Alex Klein1699fab2022-09-08 08:46:06 -0600101 # Strace args passed, but not enabled.
102 opts = self.parser.parse_args(["--strace-arguments=-s4096 -v"])
103 new_cmd = cros_sdk._BuildReExecCommand([self.ARGV0], opts)
104 assert new_cmd == ["sudo", "--", sys.executable, self.ARGV0]
Mike Frysinger5f5c70b2022-07-19 12:55:21 -0400105
Alex Klein1699fab2022-09-08 08:46:06 -0600106 # Strace enabled.
107 opts = self.parser.parse_args(["--strace"])
108 new_cmd = cros_sdk._BuildReExecCommand([self.ARGV0], opts)
109 assert new_cmd == [
110 "sudo",
111 "--",
112 "strace",
113 "--",
114 sys.executable,
115 self.ARGV0,
116 ]
Mike Frysinger5f5c70b2022-07-19 12:55:21 -0400117
Alex Klein1699fab2022-09-08 08:46:06 -0600118 # Strace enabled w/args.
119 opts = self.parser.parse_args(
120 ["--strace", "--strace-arguments=-s4096 -v"]
121 )
122 new_cmd = cros_sdk._BuildReExecCommand([self.ARGV0], opts)
123 assert new_cmd == [
124 "sudo",
125 "--",
126 "strace",
127 "-s4096",
128 "-v",
129 "--",
130 sys.executable,
131 self.ARGV0,
132 ]