ArtifactsService: Add CPE export functionality.

Add the CPE report export to the artifacts service.
Includes the report itself and the warnings as individual artifacts.

BUG=chromium:905037
TEST=run_tests, manually ran endpoint

Change-Id: I1dc5fe22f72528f01c485037ab8f31e07b556f33
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/chromite/+/1709145
Tested-by: Alex Klein <saklein@chromium.org>
Commit-Queue: Alex Klein <saklein@chromium.org>
Reviewed-by: Andrew Lamb <andrewlamb@chromium.org>
Reviewed-by: David Burger <dburger@chromium.org>
diff --git a/api/controller/artifacts_unittest.py b/api/controller/artifacts_unittest.py
index 433e225..10995e2 100644
--- a/api/controller/artifacts_unittest.py
+++ b/api/controller/artifacts_unittest.py
@@ -762,3 +762,45 @@
 
     self.assertTrue(response.artifacts)
     self.assertItemsEqual(expected_files, [a.path for a in response.artifacts])
+
+
+class ExportCpeReportTest(cros_test_lib.MockTempDirTestCase,
+                          api_config.ApiConfigMixin):
+  """ExportCpeReport tests."""
+
+  def setUp(self):
+    self.response = artifacts_pb2.BundleResponse()
+
+  def testValidateOnly(self):
+    """Sanity check validate only calls don't execute."""
+    patch = self.PatchObject(artifacts_svc, 'GenerateCpeReport')
+
+    request = artifacts_pb2.BundleRequest()
+    request.build_target.name = 'board'
+    request.output_dir = self.tempdir
+
+    artifacts.ExportCpeReport(request, self.response, self.validate_only_config)
+
+    patch.assert_not_called()
+
+  def testNoBuildTarget(self):
+    request = artifacts_pb2.BundleRequest()
+    request.output_dir = self.tempdir
+
+    with self.assertRaises(cros_build_lib.DieSystemExit):
+      artifacts.ExportCpeReport(request, self.response, self.api_config)
+
+  def testSuccess(self):
+    """Test success case."""
+    expected = artifacts_svc.CpeResult(
+        report='/output/report.json', warnings='/output/warnings.json')
+    self.PatchObject(artifacts_svc, 'GenerateCpeReport', return_value=expected)
+
+    request = artifacts_pb2.BundleRequest()
+    request.build_target.name = 'board'
+    request.output_dir = self.tempdir
+
+    artifacts.ExportCpeReport(request, self.response, self.api_config)
+
+    for artifact in self.response.artifacts:
+      self.assertIn(artifact.path, [expected.report, expected.warnings])