Build API: Implement validate_only calls.

Add validate-only support to all existing endpoints and
tests to enforce the setting is respected.
Add is_in validator to help transition some endpoints
to decorator-only validation.
Some cleanup and standardization in the controller tests.

BUG=chromium:987263
TEST=run_tests

Cq-Depend: chromium:1726252
Change-Id: I108dfc1a221847eae47a18f2f60e12d2575c9ea8
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/chromite/+/1726253
Reviewed-by: David Burger <dburger@chromium.org>
Commit-Queue: Alex Klein <saklein@chromium.org>
Tested-by: Alex Klein <saklein@chromium.org>
diff --git a/api/controller/api_unittest.py b/api/controller/api_unittest.py
index 63d136c..34c2bca 100644
--- a/api/controller/api_unittest.py
+++ b/api/controller/api_unittest.py
@@ -7,42 +7,63 @@
 
 from __future__ import print_function
 
+from chromite.api import api_config
 from chromite.api import router
 from chromite.api.controller import api as api_controller
 from chromite.api.gen.chromite.api import api_pb2
 from chromite.lib import cros_test_lib
 
 
-class GetMethodsTest(cros_test_lib.MockTestCase):
+class GetMethodsTest(cros_test_lib.MockTestCase, api_config.ApiConfigMixin):
   """GetMethods tests."""
 
+  def setUp(self):
+    self.request = api_pb2.MethodGetRequest()
+    self.response = api_pb2.MethodGetResponse()
+
   def testGetMethods(self):
     """Simple GetMethods sanity check."""
     methods = ['foo', 'bar']
     self.PatchObject(router.Router, 'ListMethods', return_value=methods)
 
-    request = api_pb2.MethodGetRequest()
-    response = api_pb2.MethodGetResponse()
+    api_controller.GetMethods(self.request, self.response, self.api_config)
 
-    api_controller.GetMethods(request, response)
+    self.assertItemsEqual(methods, [m.method for m in self.response.methods])
 
-    self.assertItemsEqual(methods, [m.method for m in response.methods])
+  def testValidateOnly(self):
+    """Sanity check validate only calls only validate."""
+    patch = self.PatchObject(router.Router, 'ListMethods')
+
+    api_controller.GetMethods(self.request, self.response,
+                              self.validate_only_config)
+
+    patch.assert_not_called()
 
 
-class GetVersionTest(cros_test_lib.MockTestCase):
+class GetVersionTest(cros_test_lib.MockTestCase, api_config.ApiConfigMixin):
   """GetVersion tests."""
 
-  def testGetVersion(self):
-    """Simple GetVersion sanity check."""
+  def setUp(self):
     self.PatchObject(api_controller, 'VERSION_MAJOR', new=1)
     self.PatchObject(api_controller, 'VERSION_MINOR', new=2)
     self.PatchObject(api_controller, 'VERSION_BUG', new=3)
 
-    request = api_pb2.VersionGetRequest()
-    response = api_pb2.VersionGetResponse()
+    self.request = api_pb2.VersionGetRequest()
+    self.response = api_pb2.VersionGetResponse()
 
-    api_controller.GetVersion(request, response)
+  def testGetVersion(self):
+    """Simple GetVersion sanity check."""
+    api_controller.GetVersion(self.request, self.response, self.api_config)
 
-    self.assertEqual(response.version.major, 1)
-    self.assertEqual(response.version.minor, 2)
-    self.assertEqual(response.version.bug, 3)
+    self.assertEqual(self.response.version.major, 1)
+    self.assertEqual(self.response.version.minor, 2)
+    self.assertEqual(self.response.version.bug, 3)
+
+  def testValidateOnly(self):
+    """Sanity check validate only calls only validate."""
+    api_controller.GetVersion(self.request, self.response,
+                              self.validate_only_config)
+
+    self.assertFalse(self.response.version.major)
+    self.assertFalse(self.response.version.minor)
+    self.assertFalse(self.response.version.bug)