api: Implement ToolchainService/SetupToolchains

It's a fancy pass-through to `cros_setup_toolchains`.

BUG=b:289436363
TEST=./run_tests

Change-Id: Ia5e0dffa002e389a8031e116a3b857b194199b3d
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/chromite/+/4659850
Commit-Queue: Greg Edelston <gredelston@google.com>
Reviewed-by: Jack Rosenthal <jrosenth@chromium.org>
Auto-Submit: Greg Edelston <gredelston@google.com>
Tested-by: Greg Edelston <gredelston@google.com>
diff --git a/api/controller/toolchain_unittest.py b/api/controller/toolchain_unittest.py
index 8ab8c3d..1f4332a 100644
--- a/api/controller/toolchain_unittest.py
+++ b/api/controller/toolchain_unittest.py
@@ -19,6 +19,7 @@
 from chromite.lib import osutils
 from chromite.lib import toolchain as toolchain_lib
 from chromite.lib import toolchain_util
+from chromite.service import toolchain as toolchain_service
 
 
 # pylint: disable=protected-access
@@ -460,3 +461,49 @@
             self.response.nondefault_toolchains,
             ["nondefault-a", "nondefault-b"],
         )
+
+
+class SetupToolchainsTest(cros_test_lib.MockTestCase,
+                          api_config.ApiConfigMixin):
+    """Unit tests for ToolchainService.SetupToolchains."""
+    def setUp(self) -> None:
+        self.response = toolchain_pb2.SetupToolchainsResponse()
+        self.chroot = common_pb2.Chroot(path='/path/to/chroot')
+
+    def test_outside_chroot(self) -> None:
+        """Test the behavior if run from outside the chroot."""
+        self.PatchObject(cros_build_lib, "IsInsideChroot", return_value=False)
+        self.PatchObject(toolchain_service, "setup_toolchains")
+        request = toolchain_pb2.SetupToolchainsRequest(chroot=self.chroot)
+        with self.assertRaises(cros_build_lib.DieSystemExit):
+            toolchain.SetupToolchains(request, self.response, self.api_config)
+
+    def test_with_empty_request(self) -> None:
+        """Test the behavior if the request object is empty."""
+        self.PatchObject(cros_build_lib, "IsInsideChroot", return_value=True)
+        service_mock = self.PatchObject(toolchain_service, "setup_toolchains")
+        request = toolchain_pb2.SetupToolchainsRequest(chroot=self.chroot)
+        toolchain.SetupToolchains(
+            request,
+            self.response,
+            self.api_config,
+        )
+        service_mock.assert_called_once_with(include_boards=[])
+
+    def test_with_boards(self) -> None:
+        """Test the behavior if the request object specifies boards."""
+        self.PatchObject(cros_build_lib, "IsInsideChroot", return_value=True)
+        service_mock = self.PatchObject(toolchain_service, "setup_toolchains")
+        request = toolchain_pb2.SetupToolchainsRequest(
+            chroot=self.chroot,
+            boards=[
+                common_pb2.BuildTarget(name="amd64-generic"),
+                common_pb2.BuildTarget(name="arm-generic"),
+            ])
+        toolchain.SetupToolchains(
+            request,
+            self.response,
+            self.api_config,
+        )
+        service_mock.assert_called_once_with(
+            include_boards=["amd64-generic", "arm-generic"], )