api: Add BinhostService controller.

TEST=./run_tests api/controller/binhost_unittest
BUG=chromium:920418,b:127691580

Change-Id: I2fcf34944dbfd3b7bb9d9aeafb12322f69b5e722
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/chromite/+/1538445
Tested-by: Evan Hernandez <evanhernandez@chromium.org>
Reviewed-by: Lann Martin <lannm@chromium.org>
diff --git a/api/controller/binhost_unittest.py b/api/controller/binhost_unittest.py
new file mode 100644
index 0000000..7da19ed
--- /dev/null
+++ b/api/controller/binhost_unittest.py
@@ -0,0 +1,72 @@
+# -*- coding: utf-8 -*-
+# Copyright 2019 The Chromium OS Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+"""Unittests for Binhost operations."""
+
+from __future__ import print_function
+
+import mock
+
+from chromite.api.controller import binhost
+from chromite.api.gen.chromite.api import binhost_pb2
+from chromite.lib import cros_test_lib
+from chromite.service import binhost as binhost_service
+
+class PrepareBinhostUploadsTest(cros_test_lib.MockTestCase):
+  """Unittests for PrepareBinhostUploads."""
+
+  def setUp(self):
+    self.PatchObject(binhost_service, 'GetPrebuiltsRoot',
+                     return_value='/build/target/packages')
+    self.PatchObject(binhost_service, 'GetPrebuiltsFiles',
+                     return_value=['foo.tbz2', 'bar.tbz2'])
+    self.PatchObject(binhost_service, 'UpdatePackageIndex',
+                     return_value='/build/target/packages/Packages')
+
+  def testPrepareBinhostUploads(self):
+    """PrepareBinhostUploads returns Packages and tar files."""
+    input_proto = binhost_pb2.PrepareBinhostUploadsRequest()
+    input_proto.build_target.name = 'target'
+    input_proto.uri = 'gs://chromeos-prebuilt/target'
+    output_proto = binhost_pb2.PrepareBinhostUploadsResponse()
+    binhost.PrepareBinhostUploads(input_proto, output_proto)
+    self.assertEqual(output_proto.uploads_dir, '/build/target/packages')
+    self.assertItemsEqual(
+        [ut.path for ut in output_proto.upload_targets],
+        ['Packages', 'foo.tbz2', 'bar.tbz2'])
+
+  def testPrepareBinhostUploadsNonGsUri(self):
+    """PrepareBinhostUploads dies when URI does not point to GS."""
+    input_proto = binhost_pb2.PrepareBinhostUploadsRequest()
+    input_proto.build_target.name = 'target'
+    input_proto.uri = 'https://foo.bar'
+    output_proto = binhost_pb2.PrepareBinhostUploadsResponse()
+    with self.assertRaises(ValueError):
+      binhost.PrepareBinhostUploads(input_proto, output_proto)
+
+
+class SetBinhostTest(cros_test_lib.MockTestCase):
+  """Unittests for SetBinhost."""
+
+  def testSetBinhost(self):
+    """SetBinhost calls service with correct args."""
+    set_binhost = self.PatchObject(binhost_service, 'SetBinhost',
+                                   return_value='/path/to/BINHOST.conf')
+
+    input_proto = binhost_pb2.SetBinhostRequest()
+    input_proto.build_target.name = 'target'
+    input_proto.private = True
+    input_proto.key = binhost_pb2.POSTSUBMIT_BINHOST
+    input_proto.uri = 'gs://chromeos-prebuilt/target'
+
+    output_proto = binhost_pb2.SetBinhostResponse()
+
+    binhost.SetBinhost(input_proto, output_proto)
+
+    self.assertEqual(output_proto.output_file, '/path/to/BINHOST.conf')
+    self.assertEqual(
+        set_binhost.call_args_list,
+        [mock.call('target', 'POSTSUBMIT_BINHOST',
+                   'gs://chromeos-prebuilt/target', private=True)])