diff --git a/src/python/grpcio/grpc/experimental/aio/__init__.py b/src/python/grpcio/grpc/experimental/aio/__init__.py index 3613908a961..634795e7cc3 100644 --- a/src/python/grpcio/grpc/experimental/aio/__init__.py +++ b/src/python/grpcio/grpc/experimental/aio/__init__.py @@ -36,6 +36,7 @@ from ._server import server from ._base_server import Server, ServicerContext from ._typing import ChannelArgumentType from ._channel import insecure_channel, secure_channel +from ._metadata import Metadata ################################### __all__ ################################# @@ -68,4 +69,5 @@ __all__ = ( 'BaseError', 'UsageError', 'InternalError', + 'Metadata', ) diff --git a/src/python/grpcio_tests/tests/tests.json b/src/python/grpcio_tests/tests/tests.json index c595a4d1bab..196e9f08b0a 100644 --- a/src/python/grpcio_tests/tests/tests.json +++ b/src/python/grpcio_tests/tests/tests.json @@ -60,7 +60,6 @@ "unit._metadata_code_details_test.MetadataCodeDetailsTest", "unit._metadata_flags_test.MetadataFlagsTest", "unit._metadata_test.MetadataTest", - "unit._metadata_test.MetadataTypeTest", "unit._reconnect_test.ReconnectTest", "unit._resource_exhausted_test.ResourceExhaustedTest", "unit._rpc_test.RPCTest", diff --git a/src/python/grpcio_tests/tests/unit/_metadata_test.py b/src/python/grpcio_tests/tests/unit/_metadata_test.py index 054d54cd932..3e7717b04c7 100644 --- a/src/python/grpcio_tests/tests/unit/_metadata_test.py +++ b/src/python/grpcio_tests/tests/unit/_metadata_test.py @@ -19,7 +19,6 @@ import logging import grpc from grpc import _channel -from grpc.experimental.aio._metadata import Metadata from tests.unit import test_common from tests.unit.framework.common import test_constants @@ -238,108 +237,6 @@ class MetadataTest(unittest.TestCase): call.trailing_metadata())) -class MetadataTypeTest(unittest.TestCase): - """Tests for the metadata type""" - - _DEFAULT_DATA = (("key1", "value1"), ("key2", "value2")) - _MULTI_ENTRY_DATA = (("key1", "value1"), ("key1", "other value 1"), - ("key2", "value2")) - - def test_init_metadata(self): - test_cases = { - "emtpy": (), - "with-single-data": self._DEFAULT_DATA, - "with-multi-data": self._MULTI_ENTRY_DATA, - } - for case, args in test_cases.items(): - with self.subTest(case=case): - metadata = Metadata(*args) - self.assertEqual(len(metadata), len(args)) - - def test_get_item(self): - metadata = Metadata(("key", "value1"), ("key", "value2"), - ("key2", "other value")) - self.assertEqual(metadata["key"], "value1") - self.assertEqual(metadata["key2"], "other value") - self.assertEqual(metadata.get("key"), "value1") - self.assertEqual(metadata.get("key2"), "other value") - - with self.assertRaises(KeyError): - metadata["key not found"] - self.assertIsNone(metadata.get("key not found")) - - def test_add_value(self): - metadata = Metadata() - metadata.add("key", "value") - metadata.add("key", "second value") - metadata.add("key2", "value2") - - self.assertEqual(metadata["key"], "value") - self.assertEqual(metadata["key2"], "value2") - - def test_get_all_items(self): - metadata = Metadata(*self._MULTI_ENTRY_DATA) - self.assertEqual(metadata.get_all("key1"), ["value1", "other value 1"]) - self.assertEqual(metadata.get_all("key2"), ["value2"]) - self.assertEqual(metadata.get_all("non existing key"), []) - - def test_container(self): - metadata = Metadata(*self._MULTI_ENTRY_DATA) - self.assertIn("key1", metadata) - - def test_equals(self): - metadata = Metadata() - for key, value in self._DEFAULT_DATA: - metadata.add(key, value) - metadata2 = Metadata(*self._DEFAULT_DATA) - - self.assertEqual(metadata, metadata2) - self.assertNotEqual(metadata, "foo") - - def test_repr(self): - metadata = Metadata(*self._DEFAULT_DATA) - expected = "Metadata({0!r})".format(self._DEFAULT_DATA) - self.assertEqual(repr(metadata), expected) - - def test_set(self): - metadata = Metadata(*self._MULTI_ENTRY_DATA) - override_value = "override value" - for _ in range(3): - metadata["key1"] = override_value - - self.assertEqual(metadata["key1"], override_value) - self.assertEqual(metadata.get_all("key1"), - [override_value, "other value 1"]) - - empty_metadata = Metadata() - for _ in range(3): - empty_metadata["key"] = override_value - - self.assertEqual(empty_metadata["key"], override_value) - self.assertEqual(empty_metadata.get_all("key"), [override_value]) - - def test_set_all(self): - metadata = Metadata(*self._DEFAULT_DATA) - metadata.set_all("key", ["value1", b"new value 2"]) - - self.assertEqual(metadata["key"], "value1") - self.assertEqual(metadata.get_all("key"), ["value1", b"new value 2"]) - - def test_delete_values(self): - metadata = Metadata(*self._MULTI_ENTRY_DATA) - del metadata["key1"] - self.assertEqual(metadata.get("key1"), "other value 1") - - metadata.delete_all("key1") - self.assertNotIn("key1", metadata) - - metadata.delete_all("key2") - self.assertEqual(len(metadata), 0) - - with self.assertRaises(KeyError): - del metadata["other key"] - - if __name__ == '__main__': logging.basicConfig() unittest.main(verbosity=2) diff --git a/src/python/grpcio_tests/tests_aio/tests.json b/src/python/grpcio_tests/tests_aio/tests.json index b2b53a3ad65..84dbf02b937 100644 --- a/src/python/grpcio_tests/tests_aio/tests.json +++ b/src/python/grpcio_tests/tests_aio/tests.json @@ -3,6 +3,7 @@ "health_check.health_servicer_test.HealthServicerTest", "interop.local_interop_test.InsecureLocalInteropTest", "interop.local_interop_test.SecureLocalInteropTest", + "unit._metadata_test.TestTypeMetadata", "unit.abort_test.TestAbort", "unit.aio_rpc_error_test.TestAioRpcError", "unit.call_test.TestStreamStreamCall", diff --git a/src/python/grpcio_tests/tests_aio/unit/_metadata_test.py b/src/python/grpcio_tests/tests_aio/unit/_metadata_test.py new file mode 100644 index 00000000000..4b63ed92107 --- /dev/null +++ b/src/python/grpcio_tests/tests_aio/unit/_metadata_test.py @@ -0,0 +1,125 @@ +# Copyright 2020 gRPC authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""Tests for the metadata abstraction that's used in the asynchronous driver.""" +import logging +import unittest + +from grpc.experimental.aio._metadata import Metadata + + +class TestTypeMetadata(unittest.TestCase): + """Tests for the metadata type""" + + _DEFAULT_DATA = (("key1", "value1"), ("key2", "value2")) + _MULTI_ENTRY_DATA = (("key1", "value1"), ("key1", "other value 1"), + ("key2", "value2")) + + def test_init_metadata(self): + test_cases = { + "emtpy": (), + "with-single-data": self._DEFAULT_DATA, + "with-multi-data": self._MULTI_ENTRY_DATA, + } + for case, args in test_cases.items(): + with self.subTest(case=case): + metadata = Metadata(*args) + self.assertEqual(len(metadata), len(args)) + + def test_get_item(self): + metadata = Metadata(("key", "value1"), ("key", "value2"), + ("key2", "other value")) + self.assertEqual(metadata["key"], "value1") + self.assertEqual(metadata["key2"], "other value") + self.assertEqual(metadata.get("key"), "value1") + self.assertEqual(metadata.get("key2"), "other value") + + with self.assertRaises(KeyError): + metadata["key not found"] + self.assertIsNone(metadata.get("key not found")) + + def test_add_value(self): + metadata = Metadata() + metadata.add("key", "value") + metadata.add("key", "second value") + metadata.add("key2", "value2") + + self.assertEqual(metadata["key"], "value") + self.assertEqual(metadata["key2"], "value2") + + def test_get_all_items(self): + metadata = Metadata(*self._MULTI_ENTRY_DATA) + self.assertEqual(metadata.get_all("key1"), ["value1", "other value 1"]) + self.assertEqual(metadata.get_all("key2"), ["value2"]) + self.assertEqual(metadata.get_all("non existing key"), []) + + def test_container(self): + metadata = Metadata(*self._MULTI_ENTRY_DATA) + self.assertIn("key1", metadata) + + def test_equals(self): + metadata = Metadata() + for key, value in self._DEFAULT_DATA: + metadata.add(key, value) + metadata2 = Metadata(*self._DEFAULT_DATA) + + self.assertEqual(metadata, metadata2) + self.assertNotEqual(metadata, "foo") + + def test_repr(self): + metadata = Metadata(*self._DEFAULT_DATA) + expected = "Metadata({0!r})".format(self._DEFAULT_DATA) + self.assertEqual(repr(metadata), expected) + + def test_set(self): + metadata = Metadata(*self._MULTI_ENTRY_DATA) + override_value = "override value" + for _ in range(3): + metadata["key1"] = override_value + + self.assertEqual(metadata["key1"], override_value) + self.assertEqual(metadata.get_all("key1"), + [override_value, "other value 1"]) + + empty_metadata = Metadata() + for _ in range(3): + empty_metadata["key"] = override_value + + self.assertEqual(empty_metadata["key"], override_value) + self.assertEqual(empty_metadata.get_all("key"), [override_value]) + + def test_set_all(self): + metadata = Metadata(*self._DEFAULT_DATA) + metadata.set_all("key", ["value1", b"new value 2"]) + + self.assertEqual(metadata["key"], "value1") + self.assertEqual(metadata.get_all("key"), ["value1", b"new value 2"]) + + def test_delete_values(self): + metadata = Metadata(*self._MULTI_ENTRY_DATA) + del metadata["key1"] + self.assertEqual(metadata.get("key1"), "other value 1") + + metadata.delete_all("key1") + self.assertNotIn("key1", metadata) + + metadata.delete_all("key2") + self.assertEqual(len(metadata), 0) + + with self.assertRaises(KeyError): + del metadata["other key"] + + +if __name__ == '__main__': + logging.basicConfig() + unittest.main(verbosity=2)