From e2dcbf531001985df5035dfa26ee8865a3ab835a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=B4=AB=E6=99=B4?= Date: Fri, 25 Jun 2021 10:46:09 +0800 Subject: [PATCH] [skip ci] Verify connection interface issues (#6095) Signed-off-by: wangting0128 --- tests20/python_client/base/client_base.py | 24 +++--- tests20/python_client/common/code_mapping.py | 9 +-- tests20/python_client/common/common_type.py | 12 +++ tests20/python_client/requirements.txt | 2 +- .../testcases/test_connection.py | 76 +++++++++---------- tests20/python_client/testcases/test_query.py | 29 ++++--- 6 files changed, 83 insertions(+), 69 deletions(-) diff --git a/tests20/python_client/base/client_base.py b/tests20/python_client/base/client_base.py index 9a64c0d56a..5257c499f6 100644 --- a/tests20/python_client/base/client_base.py +++ b/tests20/python_client/base/client_base.py @@ -63,8 +63,14 @@ class Base: try: """ Drop collection before disconnect """ - if self.collection_wrap is not None and self.collection_wrap.collection is not None: - self.collection_wrap.drop() + # if self.collection_wrap is not None and self.collection_wrap.collection is not None: + # self.collection_wrap.drop() + if self.collection_wrap is not None: + collection_list = self.utility_wrap.list_collections()[0] + for i in collection_list: + collection_wrap = ApiCollectionWrapper() + collection_wrap.init_collection(name=i) + collection_wrap.drop() except Exception as e: pass @@ -115,21 +121,17 @@ class TestcaseBase(Base): def _connect(self): """ Add an connection and create the connect """ - self.connection_wrap.add_connection(default={"host": param_info.param_host, "port": param_info.param_port}) - res, is_succ = self.connection_wrap.connect(alias='default') - if not is_succ: - raise res - log.info("_connect: Connected") + res, is_succ = self.connection_wrap.connect(alias=DefaultConfig.DEFAULT_USING, host=param_info.param_host, + port=param_info.param_port) return res - def init_collection_wrap(self, name=None, schema=None, check_task=None, **kwargs): + def init_collection_wrap(self, name=None, schema=None, check_task=None, check_items=None, **kwargs): name = cf.gen_unique_str('coll_') if name is None else name schema = cf.gen_default_collection_schema() if schema is None else schema - if self.connection_wrap.get_connection(alias='default')[0] is None: + if self.connection_wrap.get_connection(alias=DefaultConfig.DEFAULT_USING)[0] is None: self._connect() collection_w = ApiCollectionWrapper() - collection_w.init_collection(name=name, schema=schema, - check_task=check_task, **kwargs) + collection_w.init_collection(name=name, schema=schema, check_task=check_task, check_items=check_items, **kwargs) return collection_w def init_partition_wrap(self, collection_wrap=None, name=None, description=None, diff --git a/tests20/python_client/common/code_mapping.py b/tests20/python_client/common/code_mapping.py index f7806c6a0e..3182f0f408 100644 --- a/tests20/python_client/common/code_mapping.py +++ b/tests20/python_client/common/code_mapping.py @@ -1,4 +1,5 @@ from enum import Enum +from pymilvus_orm.exceptions import ExceptionsMessage class ErrorCode(Enum): @@ -10,12 +11,6 @@ ErrorMessage = {ErrorCode.ErrorOk: "", ErrorCode.Error: "is illegal"} -class ConnectionErrorMessage: - NoHostPort = "connection configuration must contain 'host' and 'port'" - HostType = "Type of 'host' must be str!" - PortType = "Type of port type must be str or int!" - NotHostPort = "Connection configuration must be contained host and port" - AliasExist = "alias of '%s' already creating connections, but the configure is not the same as passed in." - AliasNotExist = "You need to pass in the configuration of the connection named '%s'" +class ConnectionErrorMessage(ExceptionsMessage): FailConnect = "Fail connecting to server on %s:%s. Timeout" ConnectExist = "The connection named %s already creating, but passed parameters don't match the configured parameters" diff --git a/tests20/python_client/common/common_type.py b/tests20/python_client/common/common_type.py index 5d5f339adb..b3e78ac2ec 100644 --- a/tests20/python_client/common/common_type.py +++ b/tests20/python_client/common/common_type.py @@ -63,6 +63,18 @@ get_invalid_strs = [ "%$#", "a".join("a" for i in range(256))] + +get_not_string = [ + [], + {}, + None, + (1, ), + 1, + 1.0, + [1, "2", 3] +] + + get_dict_without_host_port = [ {"host": "host"}, {"port": "port"}, diff --git a/tests20/python_client/requirements.txt b/tests20/python_client/requirements.txt index 3f0c4f6086..5e94e506c5 100644 --- a/tests20/python_client/requirements.txt +++ b/tests20/python_client/requirements.txt @@ -12,7 +12,7 @@ pytest-print==0.2.1 pytest-level==0.1.1 pytest-xdist==2.2.1 pytest-parallel -pymilvus-orm==2.0a1.dev33 +pymilvus-orm==2.0a1.dev57 pytest-rerunfailures==9.1.1 git+https://github.com/Projectplace/pytest-tags ndg-httpsclient diff --git a/tests20/python_client/testcases/test_connection.py b/tests20/python_client/testcases/test_connection.py index 40e7b61dc8..09fae75a93 100644 --- a/tests20/python_client/testcases/test_connection.py +++ b/tests20/python_client/testcases/test_connection.py @@ -1,7 +1,6 @@ import pytest -import os - from pymilvus_orm.default_config import DefaultConfig + from base.client_base import TestcaseBase from utils.util_log import test_log as log import common.common_type as ct @@ -26,7 +25,7 @@ class TestConnectionParams(TestcaseBase): # check param of **kwargs self.connection_wrap.add_connection(_kwargs=data, check_task=ct.CheckTasks.err_res, - check_items={ct.err_code: -1, ct.err_msg: cem.NoHostPort}) + check_items={ct.err_code: 0, ct.err_msg: cem.NoHostPort}) # get addr of default alias self.connection_wrap.get_connection_addr(alias=DefaultConfig.DEFAULT_USING, check_task=ct.CheckTasks.ccr, @@ -50,11 +49,10 @@ class TestConnectionParams(TestcaseBase): # No check for **kwargs self.connection_wrap.connect(alias=DefaultConfig.DEFAULT_USING, _kwargs=[1, 2], check_task=ct.CheckTasks.err_res, - check_items={ct.err_code: -1, ct.err_msg: cem.NotHostPort}) + check_items={ct.err_code: 0, ct.err_msg: cem.NoHostPort}) - @pytest.mark.xfail(reason="Feature #5725") @pytest.mark.tags(ct.CaseLabel.L3) - @pytest.mark.parametrize("alias", ct.get_invalid_strs) + @pytest.mark.parametrize("alias", ct.get_not_string) def test_connection_connect_alias_param_check(self, alias): """ target: test connect passes wrong params of alias @@ -62,13 +60,12 @@ class TestConnectionParams(TestcaseBase): expected: assert response is error """ - # No check for alias - res = self.connection_wrap.connect(alias=alias) - log.info(res[0]) + # check for alias + self.connection_wrap.connect(alias=alias, check_task=ct.CheckTasks.err_res, + check_items={ct.err_code: 0, ct.err_msg: cem.AliasType % type(alias)}) - @pytest.mark.xfail(reason="Feature #5725") - @pytest.mark.parametrize("alias", ct.get_invalid_strs) @pytest.mark.tags(ct.CaseLabel.L3) + @pytest.mark.parametrize("alias", ct.get_not_string) def test_connection_get_alias_param_check(self, alias): """ target: test get connection passes wrong params of alias @@ -76,13 +73,12 @@ class TestConnectionParams(TestcaseBase): expected: assert response is error """ - # not check for alias - res = self.connection_wrap.get_connection(alias=alias) - log.info(res[0]) + # check for alias + self.connection_wrap.get_connection(alias=alias, check_task=ct.CheckTasks.err_res, + check_items={ct.err_code: 0, ct.err_msg: cem.AliasType % type(alias)}) - @pytest.mark.xfail(reason="Feature #5725") - @pytest.mark.parametrize("alias", ct.get_invalid_strs) @pytest.mark.tags(ct.CaseLabel.L3) + @pytest.mark.parametrize("alias", ct.get_not_string) def test_connection_get_addr_alias_param_check(self, alias): """ target: test get connection addr passes wrong params of alias @@ -90,13 +86,12 @@ class TestConnectionParams(TestcaseBase): expected: assert response is error """ - # not check for alias - res = self.connection_wrap.get_connection_addr(alias=alias) - log.info(res[0]) + # check for alias + self.connection_wrap.get_connection_addr(alias=alias, check_task=ct.CheckTasks.err_res, + check_items={ct.err_code: 0, ct.err_msg: cem.AliasType % type(alias)}) - @pytest.mark.xfail(reason="Feature #5725") - @pytest.mark.parametrize("alias", ct.get_invalid_strs) @pytest.mark.tags(ct.CaseLabel.L3) + @pytest.mark.parametrize("alias", ct.get_not_string) def test_connection_remove_alias_param_check(self, alias): """ target: test remove connection passes wrong params of alias @@ -104,14 +99,13 @@ class TestConnectionParams(TestcaseBase): expected: assert response is error """ - # not check for alias + # check for alias self._connect() - res = self.connection_wrap.remove_connection(alias=alias) - log.info(res[0]) + self.connection_wrap.remove_connection(alias=alias, check_task=ct.CheckTasks.err_res, + check_items={ct.err_code: 0, ct.err_msg: cem.AliasType % type(alias)}) - @pytest.mark.xfail(reason="Feature #5725") - @pytest.mark.parametrize("alias", ct.get_invalid_strs) @pytest.mark.tags(ct.CaseLabel.L3) + @pytest.mark.parametrize("alias", ct.get_not_string) def test_connection_disconnect_alias_param_check(self, alias): """ target: test disconnect passes wrong params of alias @@ -119,10 +113,10 @@ class TestConnectionParams(TestcaseBase): expected: assert response is error """ - # not check for alias + # check for alias self._connect() - res = self.connection_wrap.disconnect(alias=alias) - log.info(res[0]) + self.connection_wrap.disconnect(alias=alias, check_task=ct.CheckTasks.err_res, + check_items={ct.err_code: 0, ct.err_msg: cem.AliasType % type(alias)}) class TestConnectionOperation(TestcaseBase): @@ -146,7 +140,7 @@ class TestConnectionOperation(TestcaseBase): alias2={"port": "-1", "host": "hostlocal"}, testing=data, check_task=ct.CheckTasks.err_res, - check_items={ct.err_code: -1, ct.err_msg: err_msg}) + check_items={ct.err_code: 0, ct.err_msg: err_msg}) # list all connections and check the response self.connection_wrap.list_connections(check_task=ct.CheckTasks.ccr, @@ -293,10 +287,10 @@ class TestConnectionOperation(TestcaseBase): self.connection_wrap.connect(alias="test_alias_name", host=host, port=port, check_task=ct.CheckTasks.ccr) # add connection with diff params after that alias has been created - err_msg = cem.AliasExist % "test_alias_name" + err_msg = cem.ConnDiffConf % "test_alias_name" self.connection_wrap.add_connection(test_alias_name={"host": "localhost", "port": "1"}, check_task=ct.CheckTasks.err_res, - check_items={ct.err_code: -1, ct.err_msg: err_msg}) + check_items={ct.err_code: 0, ct.err_msg: err_msg}) # add connection with the same params self.connection_wrap.add_connection(test_alias_name={"host": host, "port": port}) @@ -313,10 +307,10 @@ class TestConnectionOperation(TestcaseBase): check_task=ct.CheckTasks.ccr) # add connection after that alias has been created - err_msg = cem.AliasExist % "test_alias_name" + err_msg = cem.ConnDiffConf % DefaultConfig.DEFAULT_USING self.connection_wrap.add_connection(default={"host": "localhost", "port": "1"}, check_task=ct.CheckTasks.err_res, - check_items={ct.err_code: -1, ct.err_msg: err_msg}) + check_items={ct.err_code: 0, ct.err_msg: err_msg}) # add connection with the same params self.connection_wrap.add_connection(test_alias_name={"host": host, "port": port}) @@ -380,9 +374,9 @@ class TestConnectionOperation(TestcaseBase): """ # create connection that param of alias is not exist - err_msg = cem.AliasNotExist % ct.Not_Exist + err_msg = cem.ConnLackConf % ct.Not_Exist self.connection_wrap.connect(alias=ct.Not_Exist, check_task=ct.CheckTasks.err_res, - check_items={ct.err_code: -1, ct.err_msg: err_msg}) + check_items={ct.err_code: 0, ct.err_msg: err_msg}) # list all connections and check the response self.connection_wrap.list_connections(check_task=ct.CheckTasks.ccr, @@ -469,10 +463,10 @@ class TestConnectionOperation(TestcaseBase): assert res_obj1 == res_obj2 # connect twice with the different params - err_msg = cem.ConnectExist % "default" + err_msg = cem.ConnDiffConf % "default" self.connection_wrap.connect(alias=connect_name, host="host", port=port, check_task=ct.CheckTasks.err_res, - check_items={ct.err_code: -1, ct.err_msg: err_msg}) + check_items={ct.err_code: 0, ct.err_msg: err_msg}) @pytest.mark.tags(ct.CaseLabel.L2) @pytest.mark.parametrize("connect_name", [DefaultConfig.DEFAULT_USING, "test_alias_nme"]) @@ -511,8 +505,8 @@ class TestConnectionOperation(TestcaseBase): # created connection with wrong connect name self.connection_wrap.connect(alias=connect_name, ip=host, port=port, check_task=ct.CheckTasks.err_res, - check_items={ct.err_code: -1, - ct.err_msg: "Param is not complete. Please invoke as follow:"}) + check_items={ct.err_code: 0, + ct.err_msg: cem.NoHostPort}) # list all connections and check the response self.connection_wrap.list_connections(check_task=ct.CheckTasks.ccr, @@ -710,7 +704,7 @@ class TestConnectionOperation(TestcaseBase): # init collection failed self.collection_wrap.init_collection(name=collection_name, schema=schema, check_task=ct.CheckTasks.err_res, check_items={ct.err_code: 0, - ct.err_msg: "object has no attribute 'has_collection'"}, + ct.err_msg: cem.ConnectFirst}, _using=ct.Not_Exist) @pytest.mark.tags(ct.CaseLabel.L1) diff --git a/tests20/python_client/testcases/test_query.py b/tests20/python_client/testcases/test_query.py index c9158385aa..e3c6469cfb 100644 --- a/tests20/python_client/testcases/test_query.py +++ b/tests20/python_client/testcases/test_query.py @@ -1,5 +1,8 @@ import pytest +from pymilvus_orm.default_config import DefaultConfig + from base.client_base import TestcaseBase +from common.code_mapping import ConnectionErrorMessage as cem from common import common_func as cf from common import common_type as ct from common.common_type import CaseLabel, CheckTasks @@ -422,7 +425,7 @@ class TestQueryBase(TestcaseBase): check_items=CheckTasks.err_res, check_task=error) -@pytest.mark.skip(reason="waiting for debug") +# @pytest.mark.skip(reason="waiting for debug") class TestQueryOperation(TestcaseBase): """ ****************************************************************** @@ -430,19 +433,27 @@ class TestQueryOperation(TestcaseBase): ****************************************************************** """ - def test_query_without_connection(self): + @pytest.mark.tags(ct.CaseLabel.L3) + @pytest.mark.parametrize("collection_name", [cf.gen_unique_str(prefix)]) + def test_query_without_connection(self, collection_name): """ target: test query without connection method: close connect and query expected: raise exception """ - c_name = cf.gen_unique_str(prefix) - collection_w = self.init_collection_wrap(name=c_name) - self.connection_wrap.remove_connection(ct.default_alias) - res_list, _ = self.connection_wrap.list_connections() - assert ct.default_alias not in res_list - error = {ct.err_code: 1, ct.err_msg: 'should create connect first'} - collection_w.query(default_term_expr, check_task=CheckTasks.err_res, check_items=error) + + # init a collection with default connection + collection_w = self.init_collection_wrap(name=collection_name) + + # remove default connection + self.connection_wrap.remove_connection(alias=DefaultConfig.DEFAULT_USING) + + # list connection to check + self.connection_wrap.list_connections(check_task=ct.CheckTasks.ccr, check_items={ct.list_content: []}) + + # query after remove default connection + collection_w.query(default_term_expr, check_task=CheckTasks.err_res, + check_items={ct.err_code: 0, ct.err_msg: cem.ConnectFirst}) def test_query_without_loading(self): """