未验证 提交 b1f0e51d 编写于 作者: D del-zhenwu 提交者: GitHub

skip some cases in http mode (#1633)

* skip some cases in http mode
Signed-off-by: Ndel-zhenwu <zw@zilliz.com>

* reset config
Signed-off-by: Ndel-zhenwu <zw@zilliz.com>

* fix case for http mode
Signed-off-by: Ndel-zhenwu <zw@zilliz.com>
上级 7c3a673b
......@@ -629,6 +629,8 @@ class TestAddBase:
assert the value returned by count_collection method is equal to length of vectors
expected: the count is equal to the length of vectors
'''
if args["handler"] == "HTTP":
pytest.skip("Skip test in http mode")
thread_num = 8
threads = []
collection = gen_unique_str()
......@@ -643,7 +645,7 @@ class TestAddBase:
vectors = gen_vectors(nb, dim)
def add(thread_i):
logging.getLogger().info("In thread-%d" % thread_i)
milvus = get_milvus()
milvus = get_milvus(args["handler"])
milvus.connect(uri=uri)
status, result = milvus.add_vectors(collection, records=vectors)
assert status.OK()
......
......@@ -989,7 +989,9 @@ class TestCollectionLogic(object):
@pytest.mark.parametrize("logic_seq", gen_sequence())
@pytest.mark.level(2)
def test_logic(self, connect, logic_seq):
def test_logic(self, connect, logic_seq, args):
if args["handler"] == "HTTP":
pytest.skip("Skip in http mode")
if self.is_right(logic_seq):
self.execute(logic_seq, connect)
else:
......
......@@ -25,6 +25,11 @@ class TestCacheConfig:
The following cases are used to test `get_config` function
******************************************************************
"""
@pytest.fixture(scope="function", autouse=True)
def skip_http_check(self, args):
if args["handler"] == "HTTP":
pytest.skip("skip in http mode")
@pytest.mark.timeout(CONFIG_TIMEOUT)
def reset_configs(self, connect):
'''
......@@ -32,6 +37,8 @@ class TestCacheConfig:
'''
status, reply = connect.set_config("cache_config", "cpu_cache_capacity", 4)
assert status.OK()
status, reply = connect.set_config("cache_config", "cache_insert_data", "false")
assert status.OK()
status, config_value = connect.get_config("cache_config", "cpu_cache_capacity")
assert config_value == '4'
status, reply = connect.set_config("cache_config", "insert_buffer_size", 1)
......@@ -47,7 +54,7 @@ class TestCacheConfig:
expected: status not ok
'''
invalid_configs = gen_invalid_cache_config()
invalid_configs.extend(["Cache_config", "cache config", "cache_Config", "cacheconfig", "cache_config\n", "cache_config\t"])
invalid_configs.extend(["Cache_config", "cache config", "cache_Config", "cacheconfig"])
for config in invalid_configs:
status, config_value = connect.get_config(config, "cpu_cache_capacity")
assert not status.OK()
......@@ -60,7 +67,7 @@ class TestCacheConfig:
expected: status not ok
'''
invalid_configs = gen_invalid_cache_config()
invalid_configs.extend(["Cpu_cache_capacity", "cpu cache_capacity", "cpucachecapacity", "cpu_cache_capacity\n", "cpu_cache_capacity\t"])
invalid_configs.extend(["Cpu_cache_capacity", "cpu cache_capacity", "cpucachecapacity"])
for config in invalid_configs:
status, config_value = connect.get_config("cache_config", config)
assert not status.OK()
......@@ -83,7 +90,7 @@ class TestCacheConfig:
expected: status not ok
'''
invalid_configs = gen_invalid_cache_config()
invalid_configs.extend(["Cache_config", "cache config", "cache_Config", "cacheconfig", "cache_config\n", "cache_config\t"])
invalid_configs.extend(["Cache_config", "cache config", "cache_Config", "cacheconfig"])
for config in invalid_configs:
status, config_value = connect.get_config(config, "insert_buffer_size")
assert not status.OK()
......@@ -96,7 +103,7 @@ class TestCacheConfig:
expected: status not ok
'''
invalid_configs = gen_invalid_cache_config()
invalid_configs.extend(["Insert_buffer_size", "insert buffer_size", "insertbuffersize", "insert_buffer_size\n", "insert_buffer_size\t"])
invalid_configs.extend(["Insert_buffer_size", "insert buffer_size", "insertbuffersize"])
for config in invalid_configs:
status, config_value = connect.get_config("cache_config", config)
assert not status.OK()
......@@ -119,7 +126,7 @@ class TestCacheConfig:
expected: status not ok
'''
invalid_configs = gen_invalid_cache_config()
invalid_configs.extend(["Cache_config", "cache config", "cache_Config", "cacheconfig", "cache_config\n", "cache_config\t"])
invalid_configs.extend(["Cache_config", "cache config", "cache_Config", "cacheconfig"])
for config in invalid_configs:
status, config_value = connect.get_config(config, "cache_insert_data")
assert not status.OK()
......@@ -178,7 +185,7 @@ class TestCacheConfig:
'''
self.reset_configs(connect)
invalid_configs = gen_invalid_cache_config()
invalid_configs.extend(["Cache_config", "cache config", "cache_Config", "cacheconfig", "cache_config\n", "cache_config\t"])
invalid_configs.extend(["Cache_config", "cache config", "cache_Config", "cacheconfig"])
for config in invalid_configs:
status, reply = connect.set_config(config, "cpu_cache_capacity", 4)
assert not status.OK()
......@@ -239,7 +246,7 @@ class TestCacheConfig:
'''
self.reset_configs(connect)
invalid_configs = gen_invalid_cache_config()
invalid_configs.extend(["Cache_config", "cache config", "cache_Config", "cacheconfig", "cache_config\n", "cache_config\t"])
invalid_configs.extend(["Cache_config", "cache config", "cache_Config", "cacheconfig"])
for config in invalid_configs:
status, reply = connect.set_config(config, "insert_buffer_size", 1)
assert not status.OK()
......@@ -347,10 +354,11 @@ class TestCacheConfig:
'''
self.reset_configs(connect)
invalid_configs = gen_invalid_cache_config()
invalid_configs.extend(["Cache_config", "cache config", "cache_Config", "cacheconfig", "cache_config\n", "cache_config\t"])
invalid_configs.extend(["Cache_config", "cache config", "cache_Config", "cacheconfig"])
for config in invalid_configs:
status, reply = connect.set_config(config, "cache_insert_data", "1")
assert not status.OK()
self.reset_configs(connect)
@pytest.mark.timeout(CONFIG_TIMEOUT)
def test_set_cache_insert_data_valid(self, connect, collection):
......@@ -368,6 +376,7 @@ class TestCacheConfig:
status, config_value = connect.get_config("cache_config", "cache_insert_data")
assert status.OK()
assert config_value == str(config)
self.reset_configs(connect)
class TestEngineConfig:
......@@ -376,6 +385,11 @@ class TestEngineConfig:
The following cases are used to test `get_config` function
******************************************************************
"""
@pytest.fixture(scope="function", autouse=True)
def skip_http_check(self, args):
if args["handler"] == "HTTP":
pytest.skip("skip in http mode")
@pytest.mark.timeout(CONFIG_TIMEOUT)
def test_get_use_blas_threshold_invalid_parent_key(self, connect, collection):
'''
......@@ -384,7 +398,7 @@ class TestEngineConfig:
expected: status not ok
'''
invalid_configs = gen_invalid_engine_config()
invalid_configs.extend(["Engine_config", "engine config", "engine_config\n", "engine_config\t"])
invalid_configs.extend(["Engine_config", "engine config"])
for config in invalid_configs:
status, config_value = connect.get_config(config, "use_blas_threshold")
assert not status.OK()
......@@ -397,7 +411,7 @@ class TestEngineConfig:
expected: status not ok
'''
invalid_configs = gen_invalid_engine_config()
invalid_configs.extend(["Use_blas_threshold", "use blas threshold", "use_blas_threshold\n", "use_blas_threshold\t"])
invalid_configs.extend(["Use_blas_threshold", "use blas threshold"])
for config in invalid_configs:
status, config_value = connect.get_config("engine_config", config)
assert not status.OK()
......@@ -422,7 +436,7 @@ class TestEngineConfig:
if str(connect._cmd("mode")[1]) == "CPU":
pytest.skip("Only support GPU mode")
invalid_configs = gen_invalid_engine_config()
invalid_configs.extend(["Engine_config", "engine config", "engine_config\n", "engine_config\t"])
invalid_configs.extend(["Engine_config", "engine config"])
for config in invalid_configs:
status, config_value = connect.get_config(config, "gpu_search_threshold")
assert not status.OK()
......@@ -437,7 +451,7 @@ class TestEngineConfig:
if str(connect._cmd("mode")[1]) == "CPU":
pytest.skip("Only support GPU mode")
invalid_configs = gen_invalid_engine_config()
invalid_configs.extend(["Gpu_search_threshold", "gpusearchthreshold", "gpu_search_threshold\n", "gpu_search_threshold\t"])
invalid_configs.extend(["Gpu_search_threshold", "gpusearchthreshold"])
for config in invalid_configs:
status, config_value = connect.get_config("engine_config", config)
assert not status.OK()
......@@ -468,7 +482,7 @@ class TestEngineConfig:
expected: status not ok
'''
invalid_configs = gen_invalid_engine_config()
invalid_configs.extend(["Engine_config", "engine config", "engine_config\n", "engine_config\t"])
invalid_configs.extend(["Engine_config", "engine config"])
for config in invalid_configs:
status, reply = connect.set_config(config, "use_blas_threshold", 1000)
assert not status.OK()
......@@ -525,7 +539,7 @@ class TestEngineConfig:
if str(connect._cmd("mode")[1]) == "CPU":
pytest.skip("Only support GPU mode")
invalid_configs = gen_invalid_engine_config()
invalid_configs.extend(["Engine_config", "engine config", "engine_config\n", "engine_config\t"])
invalid_configs.extend(["Engine_config", "engine config"])
for config in invalid_configs:
status, reply = connect.set_config(config, "gpu_search_threshold", 1000)
assert not status.OK()
......@@ -585,6 +599,11 @@ class TestGPUResourceConfig:
The following cases are used to test `get_config` function
******************************************************************
"""
@pytest.fixture(scope="function", autouse=True)
def skip_http_check(self, args):
if args["handler"] == "HTTP":
pytest.skip("skip in http mode")
@pytest.mark.timeout(CONFIG_TIMEOUT)
def reset_configs(self, connect):
'''
......@@ -617,7 +636,7 @@ class TestGPUResourceConfig:
if str(connect._cmd("mode")[1]) == "CPU":
pytest.skip("Only support GPU mode")
invalid_configs = ["Gpu_resource_config", "gpu resource config", \
"gpu_resource", "gpu_resource_config\n", "gpu_resource_config\t"]
"gpu_resource"]
for config in invalid_configs:
status, config_value = connect.get_config(config, "enable")
assert not status.OK()
......@@ -631,7 +650,7 @@ class TestGPUResourceConfig:
'''
if str(connect._cmd("mode")[1]) == "CPU":
pytest.skip("Only support GPU mode")
invalid_configs = ["Enable", "enable ", "disable", "true", "enable\t"]
invalid_configs = ["Enable", "enable ", "disable", "true"]
for config in invalid_configs:
status, config_value = connect.get_config("gpu_resource_config", config)
assert not status.OK()
......@@ -659,7 +678,7 @@ class TestGPUResourceConfig:
if str(connect._cmd("mode")[1]) == "CPU":
pytest.skip("Only support GPU mode")
invalid_configs = ["Gpu_resource_config", "gpu resource config", \
"gpu_resource", "gpu_resource_config\n", "gpu_resource_config\t"]
"gpu_resource"]
for config in invalid_configs:
status, config_value = connect.get_config(config, "cache_capacity")
assert not status.OK()
......@@ -673,7 +692,7 @@ class TestGPUResourceConfig:
'''
if str(connect._cmd("mode")[1]) == "CPU":
pytest.skip("Only support GPU mode")
invalid_configs = ["Cache_capacity", "cachecapacity", "cache_capacity\n", "cache_capacity\t"]
invalid_configs = ["Cache_capacity", "cachecapacity"]
for config in invalid_configs:
status, config_value = connect.get_config("gpu_resource_config", config)
assert not status.OK()
......@@ -700,7 +719,7 @@ class TestGPUResourceConfig:
if str(connect._cmd("mode")[1]) == "CPU":
pytest.skip("Only support GPU mode")
invalid_configs = ["Gpu_resource_config", "gpu resource config", \
"gpu_resource", "gpu_resource_config\n", "gpu_resource_config\t"]
"gpu_resource"]
for config in invalid_configs:
status, config_value = connect.get_config(config, "search_resources")
assert not status.OK()
......@@ -714,7 +733,7 @@ class TestGPUResourceConfig:
'''
if str(connect._cmd("mode")[1]) == "CPU":
pytest.skip("Only support GPU mode")
invalid_configs = ["Search_resources", "search_resources\n", "search_resources\t"]
invalid_configs = ["Search_resources"]
for config in invalid_configs:
status, config_value = connect.get_config("gpu_resource_config", config)
assert not status.OK()
......@@ -742,7 +761,7 @@ class TestGPUResourceConfig:
if str(connect._cmd("mode")[1]) == "CPU":
pytest.skip("Only support GPU mode")
invalid_configs = ["Gpu_resource_config", "gpu resource config", \
"gpu_resource", "gpu_resource_config\n", "gpu_resource_config\t"]
"gpu_resource"]
for config in invalid_configs:
status, config_value = connect.get_config(config, "build_index_resources")
assert not status.OK()
......@@ -756,7 +775,7 @@ class TestGPUResourceConfig:
'''
if str(connect._cmd("mode")[1]) == "CPU":
pytest.skip("Only support GPU mode")
invalid_configs = ["Build_index_resources", "build_index_resources\n", "build_index_resources\t"]
invalid_configs = ["Build_index_resources"]
for config in invalid_configs:
status, config_value = connect.get_config("gpu_resource_config", config)
assert not status.OK()
......@@ -790,7 +809,7 @@ class TestGPUResourceConfig:
if str(connect._cmd("mode")[1]) == "CPU":
pytest.skip("Only support GPU mode")
invalid_configs = ["Gpu_resource_config", "gpu resource config", \
"gpu_resource", "gpu_resource_config\n", "gpu_resource_config\t"]
"gpu_resource"]
for config in invalid_configs:
status, reply = connect.set_config(config, "enable", "true")
assert not status.OK()
......@@ -805,7 +824,7 @@ class TestGPUResourceConfig:
if str(connect._cmd("mode")[1]) == "CPU":
pytest.skip("Only support GPU mode")
invalid_configs = ["Gpu_resource_config", "gpu resource config", \
"gpu_resource", "gpu_resource_config\n", "gpu_resource_config\t"]
"gpu_resource"]
for config in invalid_configs:
status, reply = connect.set_config("gpu_resource_config", config, "true")
assert not status.OK()
......@@ -850,7 +869,7 @@ class TestGPUResourceConfig:
if str(connect._cmd("mode")[1]) == "CPU":
pytest.skip("Only support GPU mode")
invalid_configs = ["Gpu_resource_config", "gpu resource config", \
"gpu_resource", "gpu_resource_config\n", "gpu_resource_config\t"]
"gpu_resource"]
for config in invalid_configs:
status, reply = connect.set_config(config, "cache_capacity", 2)
assert not status.OK()
......@@ -891,7 +910,7 @@ class TestGPUResourceConfig:
if str(connect._cmd("mode")[1]) == "CPU":
pytest.skip("Only support GPU mode")
invalid_configs = ["Gpu_resource_config", "gpu resource config", \
"gpu_resource", "gpu_resource_config\n", "gpu_resource_config\t"]
"gpu_resource"]
for config in invalid_configs:
status, reply = connect.set_config(config, "search_resources", "gpu0")
assert not status.OK()
......@@ -933,7 +952,7 @@ class TestGPUResourceConfig:
if str(connect._cmd("mode")[1]) == "CPU":
pytest.skip("Only support GPU mode")
invalid_configs = ["Gpu_resource_config", "gpu resource config", \
"gpu_resource", "gpu_resource_config\n", "gpu_resource_config\t"]
"gpu_resource"]
for config in invalid_configs:
status, reply = connect.set_config(config, "build_index_resources", "gpu0")
assert not status.OK()
......@@ -973,6 +992,11 @@ class TestServerConfig:
The following cases are used to test `get_config` function
******************************************************************
"""
@pytest.fixture(scope="function", autouse=True)
def skip_http_check(self, args):
if args["handler"] == "HTTP":
pytest.skip("skip in http mode")
@pytest.mark.timeout(CONFIG_TIMEOUT)
def test_get_address_invalid_child_key(self, connect, collection):
'''
......@@ -1225,6 +1249,11 @@ class TestDBConfig:
The following cases are used to test `get_config` function
******************************************************************
"""
@pytest.fixture(scope="function", autouse=True)
def skip_http_check(self, args):
if args["handler"] == "HTTP":
pytest.skip("skip in http mode")
@pytest.mark.timeout(CONFIG_TIMEOUT)
def test_get_backend_url_invalid_child_key(self, connect, collection):
'''
......@@ -1362,6 +1391,11 @@ class TestStorageConfig:
The following cases are used to test `get_config` function
******************************************************************
"""
@pytest.fixture(scope="function", autouse=True)
def skip_http_check(self, args):
if args["handler"] == "HTTP":
pytest.skip("skip in http mode")
@pytest.mark.timeout(CONFIG_TIMEOUT)
def test_get_primary_path_invalid_child_key(self, connect, collection):
'''
......@@ -1455,6 +1489,11 @@ class TestMetricConfig:
The following cases are used to test `get_config` function
******************************************************************
"""
@pytest.fixture(scope="function", autouse=True)
def skip_http_check(self, args):
if args["handler"] == "HTTP":
pytest.skip("skip in http mode")
@pytest.mark.timeout(CONFIG_TIMEOUT)
def test_get_enable_monitor_invalid_child_key(self, connect, collection):
'''
......@@ -1593,6 +1632,11 @@ class TestTracingConfig:
The following cases are used to test `get_config` function
******************************************************************
"""
@pytest.fixture(scope="function", autouse=True)
def skip_http_check(self, args):
if args["handler"] == "HTTP":
pytest.skip("skip in http mode")
@pytest.mark.timeout(CONFIG_TIMEOUT)
def test_get_json_config_path_invalid_child_key(self, connect, collection):
'''
......@@ -1651,6 +1695,11 @@ class TestWALConfig:
The following cases are used to test `get_config` function
******************************************************************
"""
@pytest.fixture(scope="function", autouse=True)
def skip_http_check(self, args):
if args["handler"] == "HTTP":
pytest.skip("skip in http mode")
@pytest.mark.timeout(CONFIG_TIMEOUT)
def test_get_enable_invalid_child_key(self, connect, collection):
'''
......@@ -1795,7 +1844,7 @@ class TestWALConfig:
assert config_value == str(valid_buffer_size)
@pytest.mark.timeout(CONFIG_TIMEOUT)
def test_set_wal_path_valid(self, connect, collection):
def test_set_wal_path_valid(self, connect, collection, args):
'''
target: set wal_path
method: call set_config correctly
......
......@@ -209,10 +209,12 @@ class TestDeleteBase:
status, res = connect.search_vectors(collection, top_k, query_vecs, params=search_param)
assert status.OK()
logging.getLogger().info(res)
assert res[0][0].distance > epsilon
assert res[1][0].distance < epsilon
logging.getLogger().info(ids[0])
logging.getLogger().info(ids[1])
logging.getLogger().info(ids[-1])
assert res[0][0].id != ids[0]
assert res[1][0].id == ids[1]
assert res[2][0].distance > epsilon
assert res[2][0].id != ids[-1]
def test_add_vector_after_delete(self, connect, collection, get_simple_index):
'''
......@@ -351,11 +353,13 @@ class TestDeleteIndexedVectors:
search_param = get_search_param(index_type)
status, res = connect.search_vectors(collection, top_k, query_vecs, params=search_param)
assert status.OK()
logging.getLogger().info(ids[0])
logging.getLogger().info(ids[1])
logging.getLogger().info(ids[-1])
logging.getLogger().info(res)
assert res[0][0].distance > epsilon
assert res[1][0].distance < epsilon
assert res[0][0].id != ids[0]
assert res[1][0].id == ids[1]
assert res[2][0].distance > epsilon
assert res[2][0].id != ids[-1]
class TestDeleteBinary:
......
......@@ -210,13 +210,13 @@ class TestFlushBase:
'dimension': dim,
'index_file_size': index_file_size,
'metric_type': MetricType.L2}
milvus = get_milvus()
milvus = get_milvus(args["handler"])
milvus.connect(uri=uri)
milvus.create_collection(param)
vectors = gen_vector(nb, dim)
status, ids = milvus.add_vectors(collection, vectors, ids=[i for i in range(nb)])
def flush(collection_name):
milvus = get_milvus()
milvus = get_milvus(args["handler"])
milvus.connect(uri=uri)
status = milvus.delete_by_id(collection_name, [i for i in range(nb)])
assert status.OK()
......
......@@ -1034,12 +1034,14 @@ class TestSearchParamsInvalid(object):
pytest.skip("ivfpq not support in GPU mode")
return request.param
def test_search_with_empty_params(self, connect, collection, get_simple_index):
def test_search_with_empty_params(self, connect, collection, args, get_simple_index):
'''
target: test search fuction, with empty search params
method: search with params
expected: search status not ok, and the connection is normal
'''
if args["handler"] == "HTTP":
pytest.skip("skip in http mode")
index_type = get_simple_index["index_type"]
index_param = get_simple_index["index_param"]
connect.create_index(collection, index_type, index_param)
......
......@@ -90,8 +90,6 @@ def gen_invalid_ips():
"BB。A",
" siede ",
"(mn)",
"\n",
"\t",
"中文",
"a".join("a" for _ in range(256))
]
......@@ -110,8 +108,6 @@ def gen_invalid_ports():
"BB。A",
" siede ",
"(mn)",
"\n",
"\t",
"中文"
]
return ports
......@@ -149,7 +145,6 @@ def gen_invalid_uris():
def gen_invalid_collection_names():
collection_names = [
"12-s",
"12/s",
" ",
# "",
# None,
......@@ -158,11 +153,8 @@ def gen_invalid_collection_names():
"c|c",
" siede ",
"(mn)",
"#12s",
"pip+",
"=c",
"\n",
"\t",
"中文",
"a".join("a" for i in range(256))
]
......@@ -184,11 +176,8 @@ def gen_invalid_top_ks():
"BB。A",
" siede ",
"(mn)",
"#12s",
"pip+",
"=c",
"\n",
"\t",
"中文",
"a".join("a" for i in range(256))
]
......@@ -213,11 +202,8 @@ def gen_invalid_dims():
"BB。A",
" siede ",
"(mn)",
"#12s",
"pip+",
"=c",
"\n",
"\t",
"中文",
"a".join("a" for i in range(256))
]
......@@ -241,11 +227,8 @@ def gen_invalid_file_sizes():
"BB。A",
" siede ",
"(mn)",
"#12s",
"pip+",
"=c",
"\n",
"\t",
"中文",
"a".join("a" for i in range(256))
]
......@@ -270,11 +253,8 @@ def gen_invalid_index_types():
"BB。A",
" siede ",
"(mn)",
"#12s",
"pip+",
"=c",
"\n",
"\t",
"中文",
"a".join("a" for i in range(256))
]
......@@ -296,11 +276,8 @@ def gen_invalid_params():
"BB。A",
" siede ",
"(mn)",
"#12s",
"pip+",
"=c",
"\n",
"\t",
"中文"
]
return params
......@@ -322,11 +299,8 @@ def gen_invalid_nprobes():
"BB。A",
" siede ",
"(mn)",
"#12s",
"pip+",
"=c",
"\n",
"\t",
"中文"
]
return nprobes
......@@ -348,11 +322,8 @@ def gen_invalid_metric_types():
"BB。A",
" siede ",
"(mn)",
"#12s",
"pip+",
"=c",
"\n",
"\t",
"中文"
]
return metric_types
......@@ -377,11 +348,8 @@ def gen_invalid_vectors():
"BB。A",
" siede ",
"(mn)",
"#12s",
"pip+",
"=c",
"\n",
"\t",
"中文",
"a".join("a" for i in range(256))
]
......@@ -401,9 +369,7 @@ def gen_invalid_vector_ids():
"BB。A",
" siede ",
"(mn)",
"#12s",
"=c",
"\n",
"中文",
]
return invalid_vector_ids
......@@ -424,11 +390,8 @@ def gen_invalid_cache_config():
"BB。A",
" siede ",
"(mn)",
"#12s",
"pip+",
"=c",
"\n",
"\t",
"中文",
"'123'",
"さようなら"
......@@ -449,11 +412,8 @@ def gen_invalid_engine_config():
"BB。A",
" siede ",
"(mn)",
"#12s",
"pip+",
"=c",
"\n",
"\t",
"中文",
"'123'",
]
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册