Index: appengine/config_service/services_test.py |
diff --git a/appengine/config_service/services_test.py b/appengine/config_service/services_test.py |
new file mode 100755 |
index 0000000000000000000000000000000000000000..8727ad5f815f070d815a7d82c1777fee3d2e4794 |
--- /dev/null |
+++ b/appengine/config_service/services_test.py |
@@ -0,0 +1,115 @@ |
+#!/usr/bin/env python |
+# Copyright 2015 The Swarming Authors. All rights reserved. |
+# Use of this source code is governed by the Apache v2.0 license that can be |
+# found in the LICENSE file. |
+ |
+from test_env import future |
+import test_env |
+test_env.setup_test_env() |
+ |
+import mock |
+ |
+from components import net |
+from test_support import test_case |
+ |
+from proto import service_config_pb2 |
+import common |
+import services |
+import storage |
+ |
+ |
+class ProjectsTestCase(test_case.TestCase): |
+ def setUp(self): |
+ super(ProjectsTestCase, self).setUp() |
+ self.mock(storage, 'get_self_config_async', mock.Mock()) |
+ storage.get_self_config_async.return_value = future( |
+ service_config_pb2.ServicesCfg( |
+ services=[ |
+ service_config_pb2.Service( |
+ id='foo', metadata_url='https://foo.com/metadata'), |
+ service_config_pb2.Service(id='metadataless'), |
+ ] |
+ )) |
+ |
+ def test_dict_to_dynamic_metadata(self): |
+ with self.assertRaises(services.DynamicMetadataError): |
+ services._dict_to_dynamic_metadata([]) |
+ |
+ self.assertEqual( |
+ services._dict_to_dynamic_metadata({ |
+ 'validation': { |
+ 'url': 'https://a.com/validate', |
+ 'patterns': [ |
+ {'config_set': 'projects/foo', 'path': 'bar.cfg'}, |
+ {'config_set': 'regex:services/.+', 'path': 'regex:.+'}, |
+ ] |
+ } |
+ }), |
+ service_config_pb2.ServiceDynamicMetadata( |
+ validation=service_config_pb2.Validator( |
+ url='https://a.com/validate', |
+ patterns=[ |
+ service_config_pb2.ConfigPattern( |
+ config_set='projects/foo', path='bar.cfg'), |
+ service_config_pb2.ConfigPattern( |
+ config_set='regex:services/.+', path='regex:.+'), |
+ ] |
+ ) |
+ ) |
+ ) |
+ |
+ def test_get_metadata_async(self): |
+ self.mock(storage, 'get_self_config_async', mock.Mock()) |
+ storage.get_self_config_async.return_value = future( |
+ service_config_pb2.ServicesCfg( |
+ services=[ |
+ service_config_pb2.Service( |
+ id='foo', metadata_url='https://foo.com/metadata') |
+ ] |
+ )) |
+ |
+ self.mock(net, 'json_request_async', mock.Mock()) |
+ net.json_request_async.return_value = future({ |
+ 'validation': { |
+ 'url': 'https://a.com/validate', |
+ 'patterns': [ |
+ {'config_set': 'projects/foo', 'path': 'bar.cfg'}, |
+ {'config_set': 'regex:services/.+', 'path': 'regex:.+'}, |
+ ] |
+ } |
+ }) |
+ |
+ metadata = services.get_metadata_async('foo').get_result() |
+ self.assertEqual( |
+ metadata, |
+ service_config_pb2.ServiceDynamicMetadata( |
+ validation=service_config_pb2.Validator( |
+ url='https://a.com/validate', |
+ patterns=[ |
+ service_config_pb2.ConfigPattern( |
+ config_set='projects/foo', path='bar.cfg'), |
+ service_config_pb2.ConfigPattern( |
+ config_set='regex:services/.+', path='regex:.+'), |
+ ] |
+ ) |
+ ) |
+ ) |
+ |
+ net.json_request_async.assert_called_once_with( |
+ 'https://foo.com/metadata', scopes=net.EMAIL_SCOPE) |
+ |
+ storage.get_self_config_async.assert_called_once_with( |
+ common.SERVICES_REGISTRY_FILENAME, service_config_pb2.ServicesCfg) |
+ |
+ def test_get_metadata_async_not_found(self): |
+ with self.assertRaises(services.ServiceNotFoundError): |
+ services.get_metadata_async('non-existent').get_result() |
+ |
+ def test_get_metadata_async_no_metadata(self): |
+ metadata = services.get_metadata_async('metadataless').get_result() |
+ self.assertIsNotNone(metadata) |
+ self.assertFalse(metadata.validation.patterns) |
+ |
+ |
+if __name__ == '__main__': |
+ test_env.main() |