From 7e882dd07e70cc016c1387ec8378cc5607494b05 Mon Sep 17 00:00:00 2001 From: chenhaoran Date: Thu, 5 Mar 2026 09:54:06 +0800 Subject: [PATCH 01/22] fix: refactor file handling in TDCom class for improved readability --- test/new_test_framework/utils/common.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/test/new_test_framework/utils/common.py b/test/new_test_framework/utils/common.py index 56dc017ae168..4f1321017f32 100644 --- a/test/new_test_framework/utils/common.py +++ b/test/new_test_framework/utils/common.py @@ -3021,10 +3021,9 @@ def generate_query_result(self, inputfile, test_case): f"taos -c {cfgPath} -f {inputfile} | grep -v 'Query OK'|grep -v 'Copyright'| grep -v 'Welcome to the TDengine TSDB Command' > {self.query_result_file}.raw " ) time.sleep(1) - with ( - open(f"{self.query_result_file}.raw", "r", encoding="utf-8") as fin, - open(self.query_result_file, "w", encoding="utf-8") as fout, - ): + with open(f"{self.query_result_file}.raw", "r", encoding="utf-8") as fin, open( + self.query_result_file, "w", encoding="utf-8" + ) as fout: for line in fin: stripped = line.rstrip() # 跳过整行是 taos> 或 taos> 后全是空白的行 From 445d30a2ba963965e7f2fb4358d4453f304ce8b7 Mon Sep 17 00:00:00 2001 From: chenhaoran Date: Thu, 5 Mar 2026 10:23:51 +0800 Subject: [PATCH 02/22] fix: enhance process cleanup in clean_taos_process to avoid terminating Jenkins agents --- test/ci/run_win_cases.py | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/test/ci/run_win_cases.py b/test/ci/run_win_cases.py index 2622ac63be49..f64c18a59a07 100644 --- a/test/ci/run_win_cases.py +++ b/test/ci/run_win_cases.py @@ -55,12 +55,25 @@ def clean_taos_process(keywords=None): :param keywords: List[str],用于匹配进程命令行的关键字列表。如果为 None,则默认匹配 'taos'。 """ if keywords is None: - keywords = ['taos'] # 默认关键字为 'taos' + keywords = ["taos", "taosd", "taosadapter", "taoskeeper", "taos-explorer", "taosx"] + + current_pid = os.getpid() for proc in psutil.process_iter(['pid', 'name', 'cmdline']): try: - # 检查进程命令行是否包含指定关键字 - if proc.info['cmdline'] and any(keyword in ' '.join(proc.info['cmdline']) for keyword in keywords): + if proc.info["pid"] == current_pid: + continue + + cmdline_parts = proc.info.get("cmdline") or [] + cmdline = " ".join(cmdline_parts).lower() + proc_name = (proc.info.get("name") or "").lower() + + # 跳过 Jenkins agent,避免断开 remoting channel 导致当前用例被系统回收 + if "agent.jar" in cmdline or "jenkins" in cmdline: + continue + + # 清理 taos 相关进程,同时避免误杀 Jenkins/agent + if any(keyword in proc_name for keyword in keywords) or proc_name.startswith("taos"): logger.debug(f"Found matching process: {proc.info}") proc.terminate() # 优雅终止进程 try: From df19aac307a4c56c91c98300e73586d8db16932d Mon Sep 17 00:00:00 2001 From: chenhaoran Date: Thu, 5 Mar 2026 12:36:57 +0800 Subject: [PATCH 03/22] fix: remove redundant safe_rmtree function implementation --- test/ci/run_win_cases.py | 20 -------------------- 1 file changed, 20 deletions(-) diff --git a/test/ci/run_win_cases.py b/test/ci/run_win_cases.py index f64c18a59a07..4f293cc64a7a 100644 --- a/test/ci/run_win_cases.py +++ b/test/ci/run_win_cases.py @@ -114,26 +114,6 @@ def safe_rmtree(path, retries=5, delay=1): time.sleep(delay) raise Exception(f"Failed to remove {path} after {retries} retries.") -def safe_rmtree(path, retries=5, delay=1): - """ - 安全删除目录,支持重试机制。 - - :param path: 要删除的目录路径。 - :param retries: 重试次数。 - :param delay: 每次重试之间的延迟时间(秒)。 - """ - for i in range(retries): - try: - if os.path.exists(path): - shutil.rmtree(path) - break - except Exception as e: - logger.warning(f"Retry {i + 1}/{retries}: Failed to remove {path}. Error: {e}") - time.sleep(delay) - else: - raise Exception(f"Failed to remove {path} after {retries} retries.") - - def process_pytest_file(input_file, log_path="C:\\CI_logs", exclusion_file=os.path.join(os.path.dirname(__file__), "win_ignore_cases")): global failed_cases # 声明使用全局变量 From 2015da8342e681fc3b6815c6444e87009bbf31d0 Mon Sep 17 00:00:00 2001 From: chenhaoran Date: Thu, 5 Mar 2026 18:55:30 +0800 Subject: [PATCH 04/22] fix: add signal handling for graceful termination of subprocesses in run_win_cases --- packaging/delete_ref_lock.py | 178 +++++++++++++++++++++++------------ test/ci/run_win_cases.py | 59 ++++++++++-- 2 files changed, 172 insertions(+), 65 deletions(-) diff --git a/packaging/delete_ref_lock.py b/packaging/delete_ref_lock.py index 7200246a8a92..e4cd742a6500 100644 --- a/packaging/delete_ref_lock.py +++ b/packaging/delete_ref_lock.py @@ -1,80 +1,142 @@ import subprocess import re +import os +from typing import Optional +from abc import ABC, abstractmethod -def git_fetch(): - result = subprocess.run(['git', 'fetch'], capture_output=True, text=True) - return result -def git_prune(): - # git remote prune origin - print("git remote prune origin") - result = subprocess.run(['git', 'remote', 'prune', 'origin'], capture_output=True, text=True) - return result - -def parse_branch_name_type1(error_output): +class RefLockErrorHandler(ABC): + """抽象基类,定义处理接口""" + + @abstractmethod + def match(self, error_output: str) -> bool: + pass + + @abstractmethod + def parse_branch(self, error_output: str) -> Optional[str]: + pass + + def handle(self, error_output: str): + branch = self.parse_branch(error_output) + if branch: + print(f"Detected error, attempting to delete ref for branch: {branch}") + self.delete_ref(branch) + else: + print("Error parsing branch name.") + + def delete_ref(self, branch_name: str): + try: + subprocess.run(["git", "update-ref", "-d", branch_name], check=True) + except subprocess.CalledProcessError as e: + print(f"git update-ref failed: {e}") + lock_files = [f".git/{branch_name}.lock", f".git/logs/{branch_name}.lock"] + for lock_file in lock_files: + if os.path.exists(lock_file): + try: + os.remove(lock_file) + print(f"Removed lock file: {lock_file}") + except Exception as ex: + print(f"Failed to remove lock file {lock_file}: {ex}") + # retry + try: + subprocess.run(["git", "update-ref", "-d", branch_name], check=True) + except subprocess.CalledProcessError as e2: + print(f"Still failed to delete ref after removing lock: {e2}") + + +class Type1Handler(RefLockErrorHandler): # error: cannot lock ref 'refs/remotes/origin/fix/3.0/TD-32817': is at 7af5 but expected eaba # match the branch name before ‘is at’ with a regular expression - match = re.search(r"error: cannot lock ref '(refs/remotes/origin/[^']+)': is at", error_output) - if match: - return match.group(1) - return None + def match(self, error_output: str) -> bool: + return "is at" in error_output and "but expected" in error_output + + def parse_branch(self, error_output: str) -> str: + # 匹配 cannot lock ref 部分,兼容中英文 + match = re.search( + r"cannot lock ref '(refs/remotes/origin/[^']+)': is at", error_output + ) + return match.group(1) if match else None -def parse_branch_name_type2(error_output): + +class Type2Handler(RefLockErrorHandler): # match the branch name before ‘exists; cannot create’ with a regular expression - match = re.search(r"'(refs/remotes/origin/[^']+)' exists;", error_output) - if match: - return match.group(1) - return None + def match(self, error_output: str) -> bool: + return "exists; cannot create" in error_output + + def parse_branch(self, error_output: str) -> str: + match = re.search(r"'(refs/remotes/origin/[^']+)' exists;", error_output) + return match.group(1) if match else None -# parse branch name from error output of git remote prune origin -def parse_branch_name_type3(error_output): + +class Type3Handler(RefLockErrorHandler): # match the branch name before the first single quote before 'Unable to' with a regular expression # git error: could not delete references: cannot lock ref 'refs/remotes/origin/test/3.0/TS-4893': Unable to create 'D:/workspace/main/TDinternal/community/.git/refs/remotes/origin/test/3.0/TS-4893.lock': File exists - match = re.search(r"references: cannot lock ref '(refs/remotes/origin/[^']+)': Unable to", error_output) - if match: - return match.group(1) - return None + def match(self, error_output: str) -> bool: + return "Unable to create" in error_output and "File exists" in error_output + + def parse_branch(self, error_output: str) -> str: + match = re.search( + r"(?:error|references): cannot lock ref '(refs/remotes/origin/[^']+)': Unable to", + error_output, + ) + return match.group(1) if match else None + + +class RefLockErrorHandlerFactory: + """工厂类,返回合适的处理器""" + handlers = [Type1Handler(), Type2Handler(), Type3Handler()] + + @classmethod + def get_handler(cls, error_output: str): + for handler in cls.handlers: + if handler.match(error_output): + return handler + return None -# execute git update-ref -d to delete the ref -def git_update_ref(branch_name): - if branch_name: - subprocess.run(['git', 'update-ref', '-d', f'{branch_name}'], check=True) -# parse error type and execute corresponding repair operation def handle_error(error_output): - error_types = [ - ("is at", "but expected", parse_branch_name_type1, "type 1"), - ("exists; cannot create", None, parse_branch_name_type2, "type 2"), - ("Unable to create", "File exists", parse_branch_name_type3, "type 3") - ] - - for error_type in error_types: - if error_type[0] in error_output and (error_type[1] is None or error_type[1] in error_output): - branch_name = error_type[2](error_output) - if branch_name: - print(f"Detected error {error_type[3]}, attempting to delete ref for branch: {branch_name}") - git_update_ref(branch_name) - else: - print(f"Error parsing branch name for {error_type[3]}.") - break + handler = RefLockErrorHandlerFactory.get_handler(error_output) + if handler: + handler.handle(error_output) + else: + print("No handler found for this error.") + + +def git_fetch(): + print("Running: git fetch") + result = subprocess.run(["git", "fetch"], capture_output=True, text=True) + if result.returncode != 0: + print("git fetch failed:") + print(result.stderr) + else: + print("git fetch successful.") + return result + + +def git_prune(): + print("Running: git remote prune origin") + result = subprocess.run( + ["git", "remote", "prune", "origin"], capture_output=True, text=True + ) + if result.returncode != 0: + print("git remote prune origin failed:") + print(result.stderr) + else: + print("git remote prune origin successful.") + return result + def main(): fetch_result = git_fetch() - if fetch_result.returncode != 0: - error_output = fetch_result.stderr - handle_error(error_output) - else: - print("Git fetch successful.") + if fetch_result.returncode != 0: + handle_error(fetch_result.stderr) + return prune_result = git_prune() - print(prune_result.returncode) - if prune_result.returncode != 0: - error_output = prune_result.stderr - print(error_output) - handle_error(error_output) - else: - print("Git prune successful.") + if prune_result.returncode != 0: + handle_error(prune_result.stderr) + if __name__ == "__main__": - main() \ No newline at end of file + main() diff --git a/test/ci/run_win_cases.py b/test/ci/run_win_cases.py index 4f293cc64a7a..9acdd9c3995b 100644 --- a/test/ci/run_win_cases.py +++ b/test/ci/run_win_cases.py @@ -7,6 +7,7 @@ import psutil import sys import zipfile +import signal from datetime import datetime logging.basicConfig(level=logging.INFO, @@ -14,6 +15,23 @@ datefmt='%Y-%m-%d %H:%M:%S') logger = logging.getLogger(__name__) failed_cases = 0 # 全局变量,记录失败用例数量 +exit_flag = False # 全局退出标志 +current_process = None # 当前运行的子进程 + +def signal_handler(signum, frame): + """处理 Ctrl+C 信号""" + global exit_flag, current_process + logger.info("接收到中断信号,正在退出...") + exit_flag = True + # 终止当前子进程 + if current_process is not None: + try: + current_process.terminate() + except: + pass + +# 注册信号处理 +signal.signal(signal.SIGINT, signal_handler) def get_git_commit_id(): try: @@ -172,13 +190,19 @@ def process_pytest_file(input_file, log_path="C:\\CI_logs", case_start = time.time() try: + # 检查退出标志 + if exit_flag: + logger.info("检测到退出标志,终止测试") + break + # 清理环境,kill残留进程,删除sim目录 clean_taos_process() if os.path.exists(work_dir): safe_rmtree(work_dir) - # 执行pytest命令,设置超时为300秒(5分钟) + # 执行pytest命令,设置超时为3000秒 + global current_process with open(log_file, 'w') as log: - process = subprocess.Popen( + current_process = subprocess.Popen( pytest_cmd, shell=True, stdout=log, @@ -187,11 +211,32 @@ def process_pytest_file(input_file, log_path="C:\\CI_logs", ) try: - return_code = process.wait(timeout=3000) - except subprocess.TimeoutExpired: - process.kill() - return_code = -1 - logger.info(f"Case {pytest_cmd} running timeout, killed process.") + # 轮询等待,以便响应 Ctrl+C + return_code = None + waited = 0 + while waited < 3000: + ret = current_process.poll() + if ret is not None: + return_code = ret + break + if exit_flag: + logger.info("测试被中断") + current_process.kill() + current_process.wait() + sys.exit(130) + time.sleep(0.5) + waited += 0.5 + else: + # 超时 + current_process.kill() + return_code = -1 + logger.info(f"Case {pytest_cmd} running timeout, killed process.") + current_process = None + except KeyboardInterrupt: + exit_flag = True + if current_process: + current_process.kill() + sys.exit(130) case_end = time.time() execution_time = case_end - case_start From 4561fdbd69264ebaa427988395917e00a65e15a6 Mon Sep 17 00:00:00 2001 From: chenhaoran Date: Thu, 5 Mar 2026 20:05:02 +0800 Subject: [PATCH 05/22] fix: declare exit_flag as global in process_pytest_file function --- test/ci/run_win_cases.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/ci/run_win_cases.py b/test/ci/run_win_cases.py index 9acdd9c3995b..d4f3642645c6 100644 --- a/test/ci/run_win_cases.py +++ b/test/ci/run_win_cases.py @@ -134,7 +134,7 @@ def safe_rmtree(path, retries=5, delay=1): def process_pytest_file(input_file, log_path="C:\\CI_logs", exclusion_file=os.path.join(os.path.dirname(__file__), "win_ignore_cases")): - global failed_cases # 声明使用全局变量 + global failed_cases, exit_flag # 声明使用全局变量 # 初始化统计变量 total_cases = 0 success_cases = 0 From 3ad9d459d655cfd2710d01b2aef40fcb95ceac3b Mon Sep 17 00:00:00 2001 From: chenhaoran Date: Thu, 5 Mar 2026 20:59:37 +0800 Subject: [PATCH 06/22] fix: refactor file handling in TDCom class for improved readability --- test/new_test_framework/utils/common.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/test/new_test_framework/utils/common.py b/test/new_test_framework/utils/common.py index 4f1321017f32..fd69a042db49 100644 --- a/test/new_test_framework/utils/common.py +++ b/test/new_test_framework/utils/common.py @@ -3021,9 +3021,10 @@ def generate_query_result(self, inputfile, test_case): f"taos -c {cfgPath} -f {inputfile} | grep -v 'Query OK'|grep -v 'Copyright'| grep -v 'Welcome to the TDengine TSDB Command' > {self.query_result_file}.raw " ) time.sleep(1) - with open(f"{self.query_result_file}.raw", "r", encoding="utf-8") as fin, open( - self.query_result_file, "w", encoding="utf-8" - ) as fout: + with ( + open(f"{self.query_result_file}.raw", "r", encoding="utf-8") as fin, + open(self.query_result_file, "w", encoding="utf-8") as fout, + ): for line in fin: stripped = line.rstrip() # 跳过整行是 taos> 或 taos> 后全是空白的行 From 4dafb95c6e0947fbed8d149d601aeb76732dd7d9 Mon Sep 17 00:00:00 2001 From: chenhaoran Date: Thu, 5 Mar 2026 21:00:31 +0800 Subject: [PATCH 07/22] fix: refactor file handling in TDCom class for improved readability --- test/new_test_framework/utils/common.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/new_test_framework/utils/common.py b/test/new_test_framework/utils/common.py index fd69a042db49..532033f35ea5 100644 --- a/test/new_test_framework/utils/common.py +++ b/test/new_test_framework/utils/common.py @@ -3021,7 +3021,7 @@ def generate_query_result(self, inputfile, test_case): f"taos -c {cfgPath} -f {inputfile} | grep -v 'Query OK'|grep -v 'Copyright'| grep -v 'Welcome to the TDengine TSDB Command' > {self.query_result_file}.raw " ) time.sleep(1) - with ( + with ( open(f"{self.query_result_file}.raw", "r", encoding="utf-8") as fin, open(self.query_result_file, "w", encoding="utf-8") as fout, ): From d4bca097d42adb859df940f33e9f93c809341562 Mon Sep 17 00:00:00 2001 From: chenhaoran Date: Thu, 5 Mar 2026 21:01:19 +0800 Subject: [PATCH 08/22] fix: improve code formatting and readability in TDCom class --- test/new_test_framework/utils/common.py | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/test/new_test_framework/utils/common.py b/test/new_test_framework/utils/common.py index 532033f35ea5..1223dcc2c3e0 100644 --- a/test/new_test_framework/utils/common.py +++ b/test/new_test_framework/utils/common.py @@ -2974,7 +2974,7 @@ def generate_query_result_file(self, test_case, idx, sql): # print(f"taosCmd:{taosCmd}, currentPath:{os.getcwd()}") os.system(taosCmd) return self.query_result_file - + def run_sql(self, sql, db): tdsql = self.newTdSql() if db: @@ -2994,14 +2994,11 @@ def execute_query_file(self, inputfile, max_workers=8): tdLog.info(f"Executing query file: {inputfile}") - with open(inputfile, 'r') as f: + with open(inputfile, "r") as f: lines = [line.strip() for line in f if line.strip()] # 假设第一行是 use 语句 - db = lines[0].split()[1].rstrip(';') - sql_lines = [ - line.replace('\\G', '').rstrip(';') + ';' - for line in lines[1:] - ] + db = lines[0].split()[1].rstrip(";") + sql_lines = [line.replace("\\G", "").rstrip(";") + ";" for line in lines[1:]] with concurrent.futures.ThreadPoolExecutor(max_workers=max_workers) as executor: executor.map(lambda sql: self.run_sql(sql, db), sql_lines) @@ -3022,8 +3019,8 @@ def generate_query_result(self, inputfile, test_case): ) time.sleep(1) with ( - open(f"{self.query_result_file}.raw", "r", encoding="utf-8") as fin, - open(self.query_result_file, "w", encoding="utf-8") as fout, + open(f"{self.query_result_file}.raw", "r", encoding="utf-8") as fin, + open(self.query_result_file, "w", encoding="utf-8") as fout, ): for line in fin: stripped = line.rstrip() From d201db7e6f3a2aacd481963f9dd46f449890724d Mon Sep 17 00:00:00 2001 From: chenhaoran Date: Fri, 6 Mar 2026 10:27:04 +0800 Subject: [PATCH 09/22] fix: update exclusion list for Windows CI compatibility and improve cleanup process --- test/ci/run_win_cases.py | 198 +++++++++++++++++++++++++-------------- test/ci/win_ignore_cases | 147 ++--------------------------- 2 files changed, 139 insertions(+), 206 deletions(-) diff --git a/test/ci/run_win_cases.py b/test/ci/run_win_cases.py index d4f3642645c6..f3f705bdb4a7 100644 --- a/test/ci/run_win_cases.py +++ b/test/ci/run_win_cases.py @@ -73,7 +73,7 @@ def clean_taos_process(keywords=None): :param keywords: List[str],用于匹配进程命令行的关键字列表。如果为 None,则默认匹配 'taos'。 """ if keywords is None: - keywords = ["taos", "taosd", "taosadapter", "taoskeeper", "taos-explorer", "taosx"] + keywords = ["taos", "taosd", "taosadapter", "taoskeeper", "taos-explorer", "taosx", "tmq_sim", "taosdump", "taosBenchmark" ] current_pid = os.getpid() @@ -115,13 +115,17 @@ def zip_dir(dir_path, zip_path): rel_path = os.path.relpath(abs_path, dir_path) zipf.write(abs_path, rel_path) -def safe_rmtree(path, retries=5, delay=1): +def safe_rmtree(path, retries=10, delay=2): """ 安全删除目录,支持重试机制。 :param path: 要删除的目录路径。 :param retries: 重试次数。 :param delay: 每次重试之间的延迟时间(秒)。 """ + import sys + # Windows 上进程终止后句柄可能未立即释放,先等待一下 + if sys.platform == "win32": + time.sleep(1) for i in range(retries): try: if os.path.exists(path): @@ -155,25 +159,43 @@ def process_pytest_file(input_file, log_path="C:\\CI_logs", shutil.rmtree(log_dir) os.makedirs(log_dir, exist_ok=True) + # 定义清理函数(失败时抛出异常,终止测试) + def cleanup_environment(phase=""): + """清理进程和目录,失败则抛出异常终止测试""" + logger.info(f"Cleaning up environment ({phase})...") + + # 1. 结束残留进程 + clean_taos_process() + + # 2. 等待句柄释放 + time.sleep(1) + + # 3. 删除 sim 目录,失败则终止 + if os.path.exists(work_dir): + try: + shutil.rmtree(work_dir) + logger.info(f"Removed {work_dir}") + except Exception as e: + logger.error(f"CRITICAL: Failed to remove {work_dir}: {e}") + raise RuntimeError(f"Cleanup failed: cannot remove work_dir") from e + with open(input_file, 'r', encoding="utf-8", errors="ignore") as f: for line in f: line = line.strip() - # 跳过空行和注释行 if not line or line.startswith('#'): continue - # 解析pytest命令 + # 解析 pytest 命令 if "ci/pytest.sh " in line: pytest_cmd = line.split("ci/pytest.sh ")[1] else: pytest_cmd = line.split(",,n,.,")[1] - # 确保是pytest命令 if not pytest_cmd.startswith("pytest"): logger.warning(f"异常pytest命令: {pytest_cmd}") continue - case_base_name = pytest_cmd.split(" ")[1] # 获取用例无参数名称用于与排除用例列表比对 + case_base_name = pytest_cmd.split(" ")[1] if case_base_name and len(exclusion_list) > 0 and case_base_name in exclusion_list: skipped_cases += 1 logger.info(f"Case {case_base_name} not support runnning on Windows. Skip test.") @@ -182,92 +204,130 @@ def process_pytest_file(input_file, log_path="C:\\CI_logs", rf.write(result_str) continue - case_name = pytest_cmd.split("/")[-1].replace(" ", "_") # 获取用例名称 + case_name = pytest_cmd.split("/")[-1].replace(" ", "_") total_cases += 1 log_file = os.path.join(log_dir, f"{case_name}.log") logger.info(f"Running case {pytest_cmd}") case_start = time.time() + return_code = None + + # ========== 用例前清理(失败则终止) ========== + try: + cleanup_environment("pre-case") + except RuntimeError as e: + logger.error(f"Pre-case cleanup failed, stopping test suite: {e}") + result_str = f"ERROR\t{pytest_cmd}\t\t\t0.00s\tPre-case cleanup failed: {e}\n" + with open(result_file, "a", encoding="utf-8") as rf: + rf.write(result_str) + break # 清理失败,终止整个测试 + # ========== 执行用例 ========== try: - # 检查退出标志 if exit_flag: logger.info("检测到退出标志,终止测试") break - - # 清理环境,kill残留进程,删除sim目录 - clean_taos_process() - if os.path.exists(work_dir): - safe_rmtree(work_dir) - # 执行pytest命令,设置超时为3000秒 + global current_process - with open(log_file, 'w') as log: + pytest_cmd_clean = f"{pytest_cmd} --clean -u" + + with open(log_file, 'w', buffering=1) as log: current_process = subprocess.Popen( - pytest_cmd, + pytest_cmd_clean, shell=True, stdout=log, stderr=subprocess.STDOUT, text=True ) - try: - # 轮询等待,以便响应 Ctrl+C - return_code = None - waited = 0 - while waited < 3000: - ret = current_process.poll() - if ret is not None: - return_code = ret - break - if exit_flag: - logger.info("测试被中断") - current_process.kill() - current_process.wait() - sys.exit(130) - time.sleep(0.5) - waited += 0.5 - else: - # 超时 + # 轮询等待 + waited = 0 + while waited < 1800: + ret = current_process.poll() + if ret is not None: + return_code = ret + break + if exit_flag: + logger.info("测试被中断") current_process.kill() - return_code = -1 - logger.info(f"Case {pytest_cmd} running timeout, killed process.") - current_process = None - except KeyboardInterrupt: - exit_flag = True - if current_process: - current_process.kill() - sys.exit(130) - - case_end = time.time() - execution_time = case_end - case_start + current_process.wait() + sys.exit(130) + time.sleep(0.5) + waited += 0.5 + else: + # 超时 + current_process.kill() + return_code = -1 + logger.info(f"Case {pytest_cmd} running timeout, killed process.") + current_process = None + + # 确保日志刷盘 + if os.path.exists(log_file): + with open(log_file, 'a') as f: + f.flush() + try: + os.fsync(f.fileno()) + except: + pass + + except KeyboardInterrupt: + exit_flag = True + if current_process: + current_process.kill() + sys.exit(130) + except Exception as e: + return_code = -2 # 执行异常 + logger.error(f"Case execution error: {e}") - if return_code == 0: - success_cases += 1 - os.remove(log_file) - logger.info(f"Case {pytest_cmd}: Success. Time cost: {execution_time:.2f}s") - result_str = f"SUCCESS\t{pytest_cmd}\t\t\t{execution_time:.2f}s\n" + # ========== 用例后清理(失败则终止) ========== + try: + cleanup_environment("post-case") + except RuntimeError as e: + logger.error(f"Post-case cleanup failed, stopping test suite: {e}") + # 记录当前用例结果(如果执行过) + if return_code is not None: + if return_code == 0: + result_str = f"SUCCESS\t{pytest_cmd}\t\t\t{time.time() - case_start:.2f}s\n" + else: + result_str = f"FAILED\t{pytest_cmd}\t\t\t{time.time() - case_start:.2f}s\n" else: - failed_cases += 1 - failed_case_list.append(pytest_cmd) - logger.info(f"Case {pytest_cmd} Failed. Time cost: {execution_time:.2f}s") - result_str = f"FAILED\t{pytest_cmd}\t\t\t{execution_time:.2f}s\n" - - except Exception as e: - case_end = time.time() - execution_time = case_end - case_start + result_str = f"ERROR\t{pytest_cmd}\t\t\t{time.time() - case_start:.2f}s\tExecution error\n" + with open(result_file, "a", encoding="utf-8") as rf: + rf.write(result_str) + break # 清理失败,终止整个测试 + + # ========== 记录用例结果 ========== + case_end = time.time() + execution_time = case_end - case_start + + if return_code == 0: + success_cases += 1 + os.remove(log_file) + logger.info(f"Case {pytest_cmd}: Success. Time cost: {execution_time:.2f}s") + result_str = f"SUCCESS\t{pytest_cmd}\t\t\t{execution_time:.2f}s\n" + elif return_code == -1: + failed_cases += 1 + failed_case_list.append(pytest_cmd) + logger.info(f"Case {pytest_cmd} Failed (timeout). Time cost: {execution_time:.2f}s") + result_str = f"FAILED\t{pytest_cmd}\t\t\t{execution_time:.2f}s\ttimeout\n" + elif return_code == -2: + failed_cases += 1 + failed_case_list.append(pytest_cmd) + logger.info(f"Case {pytest_cmd} Exception. Time cost: {execution_time:.2f}s") + result_str = f"ERROR\t{pytest_cmd}\t\t\t{execution_time:.2f}s\texecution error\n" + else: failed_cases += 1 failed_case_list.append(pytest_cmd) - logger.info(f"Case {total_cases} Exception: {str(e)}. Time cost: {execution_time:.2f}s") - result_str = f"ERROR\t{pytest_cmd}\t\t\t{execution_time:.2f}s\t{str(e)}\n" - # 每条用例执行完都写入结果文件 + logger.info(f"Case {pytest_cmd} Failed. Time cost: {execution_time:.2f}s") + result_str = f"FAILED\t{pytest_cmd}\t\t\t{execution_time:.2f}s\n" + with open(result_file, "a", encoding="utf-8") as rf: rf.write(result_str) - # 计算总执行时间 + # ========== 收尾 ========== end_time = time.time() total_execution_time = end_time - start_time - # 输出统计信息 logger.info("All cases run finished:") logger.info(f"Total cost time: {total_execution_time:.2f}s") logger.info(f"Total cases: {total_cases}") @@ -280,8 +340,12 @@ def process_pytest_file(input_file, log_path="C:\\CI_logs", logger.info(cmd) with open(result_file, "a", encoding="utf-8") as rf: - rf.write( - f"\nAll cases run finished:\nTotal cost time: {total_execution_time:.2f}s\nTotal cases: {total_cases}\nSuccess cases: {success_cases}\nFailed cases: {failed_cases}\nWindows skip cases: {skipped_cases}\n") + rf.write(f"\nAll cases run finished:\n") + rf.write(f"Total cost time: {total_execution_time:.2f}s\n") + rf.write(f"Total cases: {total_cases}\n") + rf.write(f"Success cases: {success_cases}\n") + rf.write(f"Failed cases: {failed_cases}\n") + rf.write(f"Windows skip cases: {skipped_cases}\n") if failed_cases > 0: rf.write("\nFailed cases list:\n") for cmd in failed_case_list: @@ -293,10 +357,6 @@ def process_pytest_file(input_file, log_path="C:\\CI_logs", shutil.move(f"{log_prefix}.zip", os.path.join(log_path, f"{log_prefix}.zip")) shutil.move(result_file, os.path.join(log_path, result_file)) - # 如果没有失败用例,删除日志目录 - # if failed_cases == 0 and os.path.exists(log_dir): - # shutil.rmtree(log_dir) - if __name__ == "__main__": import sys diff --git a/test/ci/win_ignore_cases b/test/ci/win_ignore_cases index 2120d5686d40..f4d5aae2a348 100644 --- a/test/ci/win_ignore_cases +++ b/test/ci/win_ignore_cases @@ -1,143 +1,16 @@ -cases/22-Show/test_show_table_distributed_null.py -cases/uncatalog/army/alter/test_alter_config.py -cases/uncatalog/army/cluster/test_snapshot.py -cases/uncatalog/army/cmdline/test_taos_cli.py -# TD-37673 -cases/22-Functions/01-Scalar/test_scalar_all.py -cases/uncatalog/army/query/function/test_function.py -# TD-37674 -cases/22-Functions/02-Aggregate/test_agg_all.py -cases/uncatalog/army/query/function/test_interval_diff_tz.py -cases/12-DataCompression/test_compress_alter_table.py -cases/uncatalog/army/storage/test_compress_basic.py -cases/uncatalog/army/tools/benchmark/basic/test_stmt_insert_alltypes_same_min_max.py -cases/uncatalog/army/tools/benchmark/basic/test_stmt_sample_csv_json_subtable.py -cases/uncatalog/army/tools/benchmark/basic/test_stmt_sample_csv_json.py -# TD-37683 -cases/uncatalog/army/tools/benchmark/basic/test_insert_tag_order_sml.py -cases/uncatalog/army/tools/benchmark/basic/test_insert_tag_order_sql.py -cases/uncatalog/army/tools/benchmark/basic/test_insert_tag_order_stmt.py -cases/uncatalog/army/tools/benchmark/basic/test_insert_tag_order_stmt2.py -cases/uncatalog/army/tools/benchmark/basic/test_telnet_tcp.py -cases/uncatalog/army/tools/taosdump/native/test_taosdump_test_loose_mode.py -cases/uncatalog/army/tools/taosdump/native/test_taosdump_commandline.py -cases/uncatalog/system-test/0-others/test_mounts.py - # udf not supported in Windows CI -cases/uncatalog/system-test/0-others/test_udf_test.py -cases/uncatalog/system-test/0-others/test_udf_create.py -cases/uncatalog/system-test/0-others/test_udf_restart_taosd.py -cases/uncatalog/system-test/0-others/test_udf_cfg1.py -cases/uncatalog/system-test/0-others/test_udf_cfg2.py +cases/12-UDFs/test_udf_test.py +cases/12-UDFs/test_udf_create.py +cases/12-UDFs/test_udf_restart_taosd.py +cases/12-UDFs/test_udf_cfg1.py +cases/12-UDFs/test_udf_cfg2.py cases/uncatalog/system-test/0-others/test_udfpy_main.py cases/uncatalog/system-test/7-tmq/test_tmqUdf.py cases/uncatalog/system-test/7-tmq/test_tmqUdf_multCtb_snapshot0.py cases/uncatalog/system-test/7-tmq/test_tmqUdf_multCtb_snapshot1.py -# Stream not supported in Windows CI -cases/18-StreamProcessing/01-Snode/test_snode_mgmt_basic.py -cases/18-StreamProcessing/01-Snode/test_snode_mgmt_replica3.py -cases/18-StreamProcessing/01-Snode/test_snode_mgmt_replicas.py -cases/18-StreamProcessing/01-Snode/test_snode_params_alter_value.py -cases/18-StreamProcessing/01-Snode/test_snode_params_check_default.py -cases/18-StreamProcessing/01-Snode/test_snode_params_check_maxvalue.py -cases/18-StreamProcessing/01-Snode/test_snode_params_check_minvalue.py -cases/18-StreamProcessing/01-Snode/test_snode_privileges_recalc.py -cases/18-StreamProcessing/01-Snode/test_snode_privileges_stream.py -cases/18-StreamProcessing/01-Snode/test_snode_privileges_systable.py -cases/18-StreamProcessing/01-Snode/test_snode_privileges_twodb.py -cases/18-StreamProcessing/02-Stream/test_stream_check_name.py -cases/18-StreamProcessing/02-Stream/test_stream_long_name.py -cases/18-StreamProcessing/02-Stream/test_stream_no_snode.py -cases/18-StreamProcessing/02-Stream/test_stream_same_name.py -cases/18-StreamProcessing/03-TriggerMode/test_count_new.py -cases/18-StreamProcessing/03-TriggerMode/test_count.py -cases/18-StreamProcessing/03-TriggerMode/test_event_new.py -cases/18-StreamProcessing/03-TriggerMode/test_event.py -cases/18-StreamProcessing/03-TriggerMode/test_fill_history.py -cases/18-StreamProcessing/03-TriggerMode/test_period_1.py -cases/18-StreamProcessing/03-TriggerMode/test_sliding.py -cases/18-StreamProcessing/03-TriggerMode/test_state_new.py -cases/18-StreamProcessing/03-TriggerMode/test_state_disorder_update_new.py -cases/18-StreamProcessing/03-TriggerMode/test_state_window_close.py -cases/18-StreamProcessing/03-TriggerMode/test_state.py -cases/18-StreamProcessing/04-Options/test_abnormal_data_table.py -cases/18-StreamProcessing/04-Options/test_abnormal_data_vtable.py -cases/18-StreamProcessing/04-Options/test_meta_change_table.py -cases/18-StreamProcessing/04-Options/test_meta_change_vtable.py -cases/18-StreamProcessing/04-Options/test_options_abnormal.py -cases/18-StreamProcessing/04-Options/test_options_basic.py -cases/18-StreamProcessing/04-Options/test_options_ns.py -cases/18-StreamProcessing/04-Options/test_options_us.py -cases/18-StreamProcessing/04-Options/test_options_vtable.py -cases/18-StreamProcessing/05-Notify/test_notify.py -cases/18-StreamProcessing/06-ResultSaved/test_result_saved_comprehensive.py -cases/18-StreamProcessing/07-SubQuery/test_subquery_basic.py -cases/18-StreamProcessing/07-SubQuery/test_subquery_count_1.py -cases/18-StreamProcessing/07-SubQuery/test_subquery_count_2.py -cases/18-StreamProcessing/07-SubQuery/test_subquery_event.py -cases/18-StreamProcessing/07-SubQuery/test_subquery_sliding.py -cases/18-StreamProcessing/07-SubQuery/test_subquery_session.py -cases/18-StreamProcessing/07-SubQuery/test_subquery_state.py -cases/18-StreamProcessing/07-SubQuery/test_subquery_usage_restrict.py -cases/18-StreamProcessing/07-SubQuery/test_subquery_vtable_change.py -cases/18-StreamProcessing/08-Recalc/test_recalc_combined_options.py -cases/18-StreamProcessing/08-Recalc/test_recalc_delete_recalc.py -cases/18-StreamProcessing/08-Recalc/test_recalc_expired_time.py -cases/18-StreamProcessing/08-Recalc/test_recalc_ignore_disorder.py -cases/18-StreamProcessing/08-Recalc/test_recalc_manual_basic.py -cases/18-StreamProcessing/08-Recalc/test_recalc_manual_with_options.py -cases/18-StreamProcessing/08-Recalc/test_recalc_watermark.py -cases/18-StreamProcessing/20-UseCase/test_idmp_manager.py -cases/18-StreamProcessing/20-UseCase/test_idmp_meters.py -cases/18-StreamProcessing/20-UseCase/test_idmp_public.py -cases/18-StreamProcessing/20-UseCase/test_idmp_pv.py -cases/18-StreamProcessing/20-UseCase/test_idmp_tobacco.py -cases/18-StreamProcessing/20-UseCase/test_idmp_vehicle.py -cases/18-StreamProcessing/20-UseCase/test_idmp_yuxi.py -cases/18-StreamProcessing/20-UseCase/test_nevados.py -cases/18-StreamProcessing/20-UseCase/test_three_gorges_case4.py -cases/18-StreamProcessing/20-UseCase/test_three_gorges_case5.py -cases/18-StreamProcessing/20-UseCase/test_three_gorges_phase1.py -cases/18-StreamProcessing/20-UseCase/test_three_gorges_second_case1.py -cases/18-StreamProcessing/20-UseCase/test_three_gorges_second_case2.py -cases/18-StreamProcessing/20-UseCase/test_three_gorges_second_case3.py -cases/18-StreamProcessing/20-UseCase/test_three_gorges_second_case4.py -cases/18-StreamProcessing/20-UseCase/test_three_gorges_second_case6.py -cases/18-StreamProcessing/20-UseCase/test_three_gorges_second_case17.py -cases/18-StreamProcessing/20-UseCase/test_three_gorges_second_case18.py -cases/18-StreamProcessing/20-UseCase/test_three_gorges_second_case19.py -cases/18-StreamProcessing/20-UseCase/test_three_gorges_second_case19_bug1.py -cases/18-StreamProcessing/20-UseCase/test_three_gorges_second_case22.py -cases/18-StreamProcessing/20-UseCase/test_yuxi_TS_7152.py -cases/18-StreamProcessing/23-Compatibility/test_compatibility_cross_version.py -cases/18-StreamProcessing/30-OldPyCases/test_oldcase_at_once.py -cases/18-StreamProcessing/30-OldPyCases/test_oldcase_backquote_check.py -cases/18-StreamProcessing/30-OldPyCases/test_oldcase_checkpoint_info.py -cases/18-StreamProcessing/30-OldPyCases/test_oldcase_drop.py -cases/18-StreamProcessing/30-OldPyCases/test_oldcase_empty_identifier.py -cases/18-StreamProcessing/30-OldPyCases/test_oldcase_math_func.py -cases/18-StreamProcessing/30-OldPyCases/test_oldcase_snode_restart_with_checkpoint.py -cases/18-StreamProcessing/30-OldPyCases/test_oldcase_state_window.py -cases/18-StreamProcessing/30-OldPyCases/test_oldcase_stream_basic.py -cases/18-StreamProcessing/30-OldPyCases/test_oldcase_stream_multi_agg.py -cases/18-StreamProcessing/30-OldPyCases/test_oldcase_string_func.py -cases/18-StreamProcessing/30-OldPyCases/test_oldcase_taosdShell.py -cases/18-StreamProcessing/30-OldPyCases/test_oldcase_window_true_for.py -cases/18-StreamProcessing/31-OldTsimCases/test_oldcase_basic1.py -cases/18-StreamProcessing/31-OldTsimCases/test_oldcase_basic2.py -cases/18-StreamProcessing/31-OldTsimCases/test_oldcase_check.py -cases/18-StreamProcessing/31-OldTsimCases/test_oldcase_checkpoint.py -cases/18-StreamProcessing/31-OldTsimCases/test_oldcase_concat.py -cases/18-StreamProcessing/31-OldTsimCases/test_oldcase_continuewindowclose.py -cases/18-StreamProcessing/31-OldTsimCases/test_oldcase_state.py -cases/18-StreamProcessing/31-OldTsimCases/test_oldcase_twa.py -cases/18-StreamProcessing/23-Compatibility/test_compatibility_rolling_upgrade_all.py -cases/18-StreamProcessing/23-Compatibility/test_compatibility_backward_forward.py -cases/18-StreamProcessing/23-Compatibility/test_compatibility_rolling_upgrade.py -cases/uncatalog/system-test/7-tmq/test_tmq_td37436.py # MQTT bnode not supported in Windows CI -cases/40-DataSubscription/03-MQTT/test_mqtt_smoking.py -cases/40-DataSubscription/03-MQTT/test_mqtt_bnodes.py -cases/40-DataSubscription/03-MQTT/test_mqtt_qos.py -cases/40-DataSubscription/03-MQTT/test_mqtt_special.py -cases/40-DataSubscription/03-MQTT/test_mqtt_rb.py +cases/17-DataSubscription/03-MQTT/test_mqtt_smoking.py +cases/17-DataSubscription/03-MQTT/test_mqtt_bnodes.py +cases/17-DataSubscription/03-MQTT/test_mqtt_qos.py +cases/17-DataSubscription/03-MQTT/test_mqtt_special.py +cases/17-DataSubscription/03-MQTT/test_mqtt_rb.py From 0987c455a6c0f494307719e3c892862da6ac59f0 Mon Sep 17 00:00:00 2001 From: chenhaoran Date: Fri, 6 Mar 2026 10:27:38 +0800 Subject: [PATCH 10/22] test: add test_cases.task --- test/ci/test_cases.task | 572 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 572 insertions(+) create mode 100644 test/ci/test_cases.task diff --git a/test/ci/test_cases.task b/test/ci/test_cases.task new file mode 100644 index 000000000000..e4f04ba38632 --- /dev/null +++ b/test/ci/test_cases.task @@ -0,0 +1,572 @@ +,,y,.,./ci/pytest.sh pytest cases/14-JoinQueries/test_join_func_cursor.py +,,y,.,./ci/pytest.sh pytest cases/14-JoinQueries/test_join_interval.py +,,y,.,./ci/pytest.sh pytest cases/14-JoinQueries/test_join_manyblocks.py +,,y,.,./ci/pytest.sh pytest cases/14-JoinQueries/test_join_multitables.py +,,y,.,./ci/pytest.sh pytest cases/14-JoinQueries/test_join_multivnode.py +,,y,.,./ci/pytest.sh pytest cases/14-JoinQueries/test_join_pk.py +,,y,.,./ci/pytest.sh pytest cases/14-JoinQueries/test_join_order.py +,,y,.,./ci/pytest.sh pytest cases/14-JoinQueries/test_join_tbname.py +,,y,.,./ci/pytest.sh pytest cases/14-JoinQueries/test_join.py +,,y,.,./ci/pytest.sh pytest cases/14-JoinQueries/test_join_condition.py +,,y,.,./ci/pytest.sh pytest cases/14-JoinQueries/test_join_ns_db.py +,,y,.,./ci/pytest.sh pytest cases/14-JoinQueries/test_join_6604237597.py + +# 15-TagIndices + +,,y,.,./ci/pytest.sh pytest cases/15-TagIndices/test_index_create_drop.py +,,y,.,./ci/pytest.sh pytest cases/15-TagIndices/test_index_overflow.py +,,y,.,./ci/pytest.sh pytest cases/15-TagIndices/test_index_perf.py + +# 16-Views +,,y,.,./ci/pytest.sh pytest cases/16-Views/test_view_basic.py +,,y,.,./ci/pytest.sh pytest cases/16-Views/test_view_mgmt.py +,,y,.,./ci/pytest.sh pytest cases/16-Views/test_view_nested_join.py + +# 17-DataSubscription + +## 01-Mgmt +,,y,.,./ci/pytest.sh pytest cases/17-DataSubscription/01-Mgmt/test_drop_lost_comsumers.py +,,y,.,./ci/pytest.sh pytest cases/17-DataSubscription/01-Mgmt/test_force_drop_topic.py +,,y,.,./ci/pytest.sh pytest cases/17-DataSubscription/01-Mgmt/test_tmq_drop_stb.py +,,y,.,./ci/pytest.sh pytest cases/17-DataSubscription/01-Mgmt/test_tmq_show.py +,,y,.,./ci/pytest.sh pytest cases/17-DataSubscription/01-Mgmt/test_topic.py +## 02-Consume +,,y,.,./ci/pytest.sh pytest cases/17-DataSubscription/02-Consume/test_subscribe_stb0.py +,,y,.,./ci/pytest.sh pytest cases/17-DataSubscription/02-Consume/test_subscribe_stb1.py +,,y,.,./ci/pytest.sh pytest cases/17-DataSubscription/02-Consume/test_subscribe_stb2.py +,,y,.,./ci/pytest.sh pytest cases/17-DataSubscription/02-Consume/test_subscribe_stb3.py +,,y,.,./ci/pytest.sh pytest cases/17-DataSubscription/02-Consume/test_subscribe_stb.py +,,y,.,./ci/pytest.sh pytest cases/17-DataSubscription/02-Consume/test_subscribe_stb4.py +,,y,.,./ci/pytest.sh pytest cases/17-DataSubscription/02-Consume/test_subscribe_db.py -N 3 --replica 3 +,,y,.,./ci/pytest.sh pytest cases/17-DataSubscription/02-Consume/test_subscribe_db0.py -N 3 --replica 3 +,,y,.,./ci/pytest.sh pytest cases/17-DataSubscription/02-Consume/test_subscribe_db1.py +,,y,.,./ci/pytest.sh pytest cases/17-DataSubscription/02-Consume/test_subscribe_db2.py +,,y,.,./ci/pytest.sh pytest cases/17-DataSubscription/02-Consume/test_subscribe_db3.py +,,y,.,./ci/pytest.sh pytest cases/17-DataSubscription/02-Consume/test_subscribe_db4.py +,,y,.,./ci/pytest.sh pytest cases/17-DataSubscription/02-Consume/test_tmq_basic.py +,,y,.,./ci/pytest.sh pytest cases/17-DataSubscription/02-Consume/test_tmq_bugs.py -N 3 +,,y,.,./ci/pytest.sh pytest cases/17-DataSubscription/02-Consume/test_tmq_topics_info.py +,,y,.,./ci/pytest.sh pytest cases/17-DataSubscription/02-Consume/test_tmq_max_topics.py +,,y,.,./ci/pytest.sh pytest cases/17-DataSubscription/02-Consume/test_tmq_update_tablelist.py +,,y,.,./ci/pytest.sh pytest cases/17-DataSubscription/02-Consume/test_tmq_params.py +,,y,.,./ci/pytest.sh pytest cases/17-DataSubscription/02-Consume/test_tmq_max_groups.py +,,y,.,./ci/pytest.sh pytest cases/17-DataSubscription/02-Consume/test_tmq_discontinuous_data.py +,,n,.,pytest cases/17-DataSubscription/02-Consume/test_tmq_offset.py +,,y,.,./ci/pytest.sh pytest cases/17-DataSubscription/02-Consume/test_tmq_primary_key.py +,,y,.,./ci/pytest.sh pytest cases/17-DataSubscription/02-Consume/test_tmq_drop_db_replica3.py -N 3 +,,y,.,./ci/pytest.sh pytest cases/17-DataSubscription/02-Consume/test_tmq_db_topic.py +,,y,.,./ci/pytest.sh pytest cases/17-DataSubscription/02-Consume/test_tmq_error.py +,,y,.,./ci/pytest.sh pytest cases/17-DataSubscription/02-Consume/test_tmq_schema.py +,,y,.,./ci/pytest.sh pytest cases/17-DataSubscription/02-Consume/test_tmq_stb_where_filter.py +,,y,.,./ci/pytest.sh pytest cases/17-DataSubscription/02-Consume/test_tmq_stb_filter.py +,,y,.,./ci/pytest.sh pytest cases/17-DataSubscription/02-Consume/test_tmq_check_data.py +,,y,.,./ci/pytest.sh pytest cases/17-DataSubscription/02-Consume/test_tmq_check_data_db.py +,,y,.,./ci/pytest.sh pytest cases/17-DataSubscription/02-Consume/test_tmq_alter_schema.py +,,y,.,./ci/pytest.sh pytest cases/17-DataSubscription/02-Consume/test_tmq_snapshot_basic.py -N 3 --replica 3 +,,y,.,./ci/pytest.sh pytest cases/17-DataSubscription/02-Consume/test_tmq_snapshot_filter.py -N 3 --replica 3 +,,y,.,./ci/pytest.sh pytest cases/17-DataSubscription/02-Consume/test_tmq_snapshot_single_ctb.py +,,y,.,./ci/pytest.sh pytest cases/17-DataSubscription/02-Consume/test_tmq_snapshot_single_ctb_filter.py +,,y,.,./ci/pytest.sh pytest cases/17-DataSubscription/02-Consume/test_tmq_snapshot_func_filter.py +,,y,.,./ci/pytest.sh pytest cases/17-DataSubscription/02-Consume/test_tmq_snapshot_func_filter2.py +,,y,.,./ci/pytest.sh pytest cases/17-DataSubscription/02-Consume/test_tmq_snapshot_multi_vg.py +,,y,.,./ci/pytest.sh pytest cases/17-DataSubscription/02-Consume/test_tmq_snapshot_multi_vg_filter.py +,,y,.,./ci/pytest.sh pytest cases/17-DataSubscription/02-Consume/test_tmq_snapshot_multi_ctb.py +,,y,.,./ci/pytest.sh pytest cases/17-DataSubscription/02-Consume/test_tmq_snapshot_multi_ctb_filter.py +,,y,.,./ci/pytest.sh pytest cases/17-DataSubscription/02-Consume/test_tmq_snapshot_func_filter_complex.py +,,y,.,./ci/pytest.sh pytest cases/17-DataSubscription/02-Consume/test_tmq_snapshot_func_filter_complex2.py +,,y,.,./ci/pytest.sh pytest cases/17-DataSubscription/02-Consume/test_tmq_auto_create_table.py +,,y,.,./ci/pytest.sh pytest cases/17-DataSubscription/02-Consume/test_tmq_dnode_restart.py +,,y,.,./ci/pytest.sh pytest cases/17-DataSubscription/02-Consume/test_tmq_dnode_restart2.py +,,y,.,./ci/pytest.sh pytest cases/17-DataSubscription/02-Consume/test_tmq_update_single_ctb.py +,,y,.,./ci/pytest.sh pytest cases/17-DataSubscription/02-Consume/test_tmq_update_while_consume.py -N 3 --replica 3 +,,y,.,./ci/pytest.sh pytest cases/17-DataSubscription/02-Consume/test_tmq_update_wal_mode.py +,,y,.,./ci/pytest.sh pytest cases/17-DataSubscription/02-Consume/test_tmq_update_snapshot_mode.py +,,y,.,./ci/pytest.sh pytest cases/17-DataSubscription/02-Consume/test_tmq_delete_single_ctb.py +,,y,.,./ci/pytest.sh pytest cases/17-DataSubscription/02-Consume/test_tmq_delete_multi_ctb.py -N 3 --replica 3 +,,y,.,./ci/pytest.sh pytest cases/17-DataSubscription/02-Consume/test_tmq_drop_ntb_wal.py +,,y,.,./ci/pytest.sh pytest cases/17-DataSubscription/02-Consume/test_tmq_drop_ntb_snapshot.py +,,y,.,./ci/pytest.sh pytest cases/17-DataSubscription/02-Consume/test_tmq_drop_stb_ctb.py +,,n,.,pytest cases/17-DataSubscription/02-Consume/test_tmq_drop_consumer.py +,,y,.,./ci/pytest.sh pytest cases/17-DataSubscription/02-Consume/test_tmq_udf.py +,,n,.,pytest cases/17-DataSubscription/02-Consume/test_tmq_udf_wal_mode.py +,,n,.,pytest cases/17-DataSubscription/02-Consume/test_tmq_udf_snapshot_mode.py +,,y,.,./ci/pytest.sh pytest cases/17-DataSubscription/02-Consume/test_tmq_stb_tag_filter.py +,,y,.,./ci/pytest.sh pytest cases/17-DataSubscription/02-Consume/test_tmq_tsdb_and_wal.py -N 3 --replica 3 +,,y,.,./ci/pytest.sh pytest cases/17-DataSubscription/02-Consume/test_tmq_tsdb_wal_multi_ctb.py -N 3 --replica 3 +,,y,.,./ci/pytest.sh pytest cases/17-DataSubscription/02-Consume/test_tmq_taosx.py +,,y,.,./ci/pytest.sh pytest cases/17-DataSubscription/02-Consume/test_tmq_meta_json.py +,,y,.,./ci/pytest.sh pytest cases/17-DataSubscription/02-Consume/test_tmq_seek_commit.py +,,y,.,./ci/pytest.sh pytest cases/17-DataSubscription/02-Consume/test_tmq_vnode_split_column.py -N 3 --replica 3 +,,y,.,./ci/pytest.sh pytest cases/17-DataSubscription/02-Consume/test_tmq_vnode_split_no_remove.py -N 3 --replica 3 +,,y,.,./ci/pytest.sh pytest cases/17-DataSubscription/02-Consume/test_tmq_vnode_split_db.py -N 3 --replica 3 +,,y,.,./ci/pytest.sh pytest cases/17-DataSubscription/02-Consume/test_tmq_vnode_split_db_no_wal.py -N 3 --replica 3 +,,y,.,./ci/pytest.sh pytest cases/17-DataSubscription/02-Consume/test_tmq_vnode_split_ntb.py -N 3 --replica 3 +,,y,.,./ci/pytest.sh pytest cases/17-DataSubscription/02-Consume/test_tmq_vnode_split_stb.py -N 3 --replica 3 +,,y,.,./ci/pytest.sh pytest cases/17-DataSubscription/02-Consume/test_tmq_vnode_split_stb_no_wal.py -N 3 --replica 3 +,,y,.,./ci/pytest.sh pytest cases/17-DataSubscription/02-Consume/test_tmq_vnode_split_stb_select.py -N 2 --replica 1 +,,y,.,./ci/pytest.sh pytest cases/17-DataSubscription/02-Consume/test_tmq_vnode_split_stb_select.py -N 3 --replica 3 +,,y,.,./ci/pytest.sh pytest cases/17-DataSubscription/02-Consume/test_tmq_vnode_split_duplicate.py -N 3 --replica 3 +,,y,.,./ci/pytest.sh pytest cases/17-DataSubscription/02-Consume/test_tmq_vnode_split_dup_no_wal.py -N 3 --replica 3 +,,y,.,./ci/pytest.sh pytest cases/17-DataSubscription/02-Consume/test_tmq_vnode_split_select_no_wal.py -N 3 --replica 3 +,,y,.,./ci/pytest.sh pytest cases/17-DataSubscription/02-Consume/test_tmq_vnode_transform_db.py -N 2 --replica 1 +,,y,.,./ci/pytest.sh pytest cases/17-DataSubscription/02-Consume/test_tmq_vnode_transform_db_wal.py -N 6 --replica 3 +,,y,.,./ci/pytest.sh pytest cases/17-DataSubscription/02-Consume/test_tmq_vnode_transform_stb.py -N 2 --replica 1 +,,y,.,./ci/pytest.sh pytest cases/17-DataSubscription/02-Consume/test_tmq_vnode_transform_stb.py -N 6 --replica 3 +,,y,.,./ci/pytest.sh pytest cases/17-DataSubscription/02-Consume/test_tmq_vnode_transform_stb_wal.py -N 6 --replica 3 +,,n,.,pytest cases/17-DataSubscription/02-Consume/test_tmq_consumer_group.py +,,y,.,./ci/pytest.sh pytest cases/17-DataSubscription/02-Consume/test_tmq_data_precision.py +,,y,.,./ci/pytest.sh pytest cases/17-DataSubscription/02-Consume/test_tmq_mnode_switch.py -N 6 -M 3 -I True +,,y,.,./ci/pytest.sh pytest cases/17-DataSubscription/02-Consume/test_tmq_mnode_switch.py -N 6 -M 3 --replica 3 -I True +,,y,.,./ci/pytest.sh pytest cases/17-DataSubscription/02-Consume/test_tmq_vnode_replicate.py -M 3 -N 3 --replica 3 +,,y,.,./ci/pytest.sh pytest cases/17-DataSubscription/02-Consume/test_tmq_subscribe_stb_r3.py -N 5 +,,y,.,./ci/pytest.sh pytest cases/17-DataSubscription/02-Consume/test_tmq_raw_block_interface.py +,,y,.,./ci/pytest.sh pytest cases/17-DataSubscription/02-Consume/test_tmq_replay.py +,,y,.,./ci/pytest.sh pytest cases/17-DataSubscription/02-Consume/test_tmq_wal_remove.py -N 3 +,,y,.,./ci/pytest.sh pytest cases/17-DataSubscription/02-Consume/test_tmq_stb_tag_multi_ctb.py +,,n,.,pytest cases/17-DataSubscription/02-Consume/test_tmq_restart.py +,,n,.,pytest cases/17-DataSubscription/02-Consume/test_tmq_cons1_v1_snapshot.py +,,n,.,pytest cases/17-DataSubscription/02-Consume/test_tmq_cons1_v1_t1.py +,,n,.,pytest cases/17-DataSubscription/02-Consume/test_tmq_cons1_v1_tn.py +,,n,.,pytest cases/17-DataSubscription/02-Consume/test_tmq_cons1_v4_t1.py +,,n,.,pytest cases/17-DataSubscription/02-Consume/test_tmq_cons1_v4_tn.py +,,n,.,pytest cases/17-DataSubscription/02-Consume/test_tmq_cons2_v1_overlap.py +,,n,.,pytest cases/17-DataSubscription/02-Consume/test_tmq_cons2_v1_snapshot.py +,,n,.,pytest cases/17-DataSubscription/02-Consume/test_tmq_cons2_v1_t1.py +,,n,.,pytest cases/17-DataSubscription/02-Consume/test_tmq_cons2_v1_tn.py +,,n,.,pytest cases/17-DataSubscription/02-Consume/test_tmq_cons2_v4_t1.py +,,n,.,pytest cases/17-DataSubscription/02-Consume/test_tmq_cons2_v4_tn.py +,,n,.,pytest cases/17-DataSubscription/02-Consume/test_tmq_params.py +## 03-MQTT +,,y,.,./ci/pytest.sh pytest cases/17-DataSubscription/03-MQTT/test_mqtt_smoking.py +,,y,.,./ci/pytest.sh pytest cases/17-DataSubscription/03-MQTT/test_mqtt_bnodes.py -N 2 +,,y,.,./ci/pytest.sh pytest cases/17-DataSubscription/03-MQTT/test_mqtt_bnodes.py -N 6 +,,y,.,./ci/pytest.sh pytest cases/17-DataSubscription/03-MQTT/test_mqtt_bnodes.py -N 11 +,,y,.,./ci/pytest.sh pytest cases/17-DataSubscription/03-MQTT/test_mqtt_qos.py +,,y,.,./ci/pytest.sh pytest cases/17-DataSubscription/03-MQTT/test_mqtt_special.py +,,y,.,./ci/pytest.sh pytest cases/17-DataSubscription/03-MQTT/test_mqtt_rb.py + +# 18-StreamProcessing + +## 01-Snode +,,y,.,./ci/pytest.sh pytest cases/18-StreamProcessing/01-Snode/test_snode_mgmt_basic.py -N 8 +,,y,.,./ci/pytest.sh pytest cases/18-StreamProcessing/01-Snode/test_snode_mgmt_replica3.py -N 6 --replica 3 +,,y,.,./ci/pytest.sh pytest cases/18-StreamProcessing/01-Snode/test_snode_mgmt_replicas.py -N 8 +,,y,.,./ci/pytest.sh pytest cases/18-StreamProcessing/01-Snode/test_snode_params_alter_value.py +,,y,.,./ci/pytest.sh pytest cases/18-StreamProcessing/01-Snode/test_snode_params_check_default.py +,,y,.,./ci/pytest.sh pytest cases/18-StreamProcessing/01-Snode/test_snode_params_check_maxvalue.py +,,y,.,./ci/pytest.sh pytest cases/18-StreamProcessing/01-Snode/test_snode_params_check_minvalue.py +,,y,.,./ci/pytest.sh pytest cases/18-StreamProcessing/01-Snode/test_snode_privileges_recalc.py +#,,y,.,./ci/pytest.sh pytest cases/18-StreamProcessing/01-Snode/test_snode_privileges_stream.py # PRIV_TODO +,,y,.,./ci/pytest.sh pytest cases/18-StreamProcessing/01-Snode/test_snode_privileges_systable.py +#,,y,.,./ci/pytest.sh pytest cases/18-StreamProcessing/01-Snode/test_snode_privileges_twodb.py # PRIV_TODO +## 02-Stream +,,y,.,./ci/pytest.sh pytest cases/18-StreamProcessing/02-Stream/stream_schema.py +,,y,.,./ci/pytest.sh pytest cases/18-StreamProcessing/02-Stream/stream_drop_table.py +,,y,.,./ci/pytest.sh pytest cases/18-StreamProcessing/02-Stream/stream_place_holder_column.py +,,y,.,./ci/pytest.sh pytest cases/18-StreamProcessing/02-Stream/stream_td37724.py +,,y,.,./ci/pytest.sh pytest cases/18-StreamProcessing/02-Stream/stream_6570600210.py +,,y,.,./ci/pytest.sh pytest cases/18-StreamProcessing/02-Stream/test_stream_check_name.py +,,y,.,./ci/pytest.sh pytest cases/18-StreamProcessing/02-Stream/test_stream_long_name.py +,,y,.,./ci/pytest.sh pytest cases/18-StreamProcessing/02-Stream/test_stream_no_snode.py +,,y,.,./ci/pytest.sh pytest cases/18-StreamProcessing/02-Stream/test_stream_same_name.py +,,y,.,./ci/pytest.sh pytest cases/18-StreamProcessing/02-Stream/test_stream_window_query.py +,,y,.,./ci/pytest.sh pytest cases/18-StreamProcessing/02-Stream/test_stream_output_table.py +,,y,.,./ci/pytest.sh pytest cases/18-StreamProcessing/02-Stream/stream_drop.py +,,y,.,./ci/pytest.sh pytest cases/18-StreamProcessing/02-Stream/stream_fetch.py +## 03-TriggerMode +#,,n,.,pytest cases/18-StreamProcessing/03-TriggerMode/test_count_new.py +,,y,.,./ci/pytest.sh pytest cases/18-StreamProcessing/03-TriggerMode/test_count.py +,,y,.,./ci/pytest.sh pytest cases/18-StreamProcessing/03-TriggerMode/test_event_new.py +,,y,.,./ci/pytest.sh pytest cases/18-StreamProcessing/03-TriggerMode/test_event.py +,,y,.,./ci/pytest.sh pytest cases/18-StreamProcessing/03-TriggerMode/test_fill_history.py +,,n,.,pytest cases/18-StreamProcessing/03-TriggerMode/test_period_1.py +,,n,.,pytest cases/18-StreamProcessing/03-TriggerMode/test_sliding.py +,,n,.,pytest cases/18-StreamProcessing/03-TriggerMode/test_state_new.py +#,,n,.,pytest cases/18-StreamProcessing/03-TriggerMode/test_state_disorder_update_new.py +,,y,.,./ci/pytest.sh pytest cases/18-StreamProcessing/03-TriggerMode/test_state_window_close.py +,,y,.,./ci/pytest.sh pytest cases/18-StreamProcessing/03-TriggerMode/test_state.py +,,y,.,./ci/pytest.sh pytest cases/18-StreamProcessing/03-TriggerMode/test_ts_7622.py +,,y,.,./ci/pytest.sh pytest cases/18-StreamProcessing/03-TriggerMode/test_window_true_for.py +## 04-Options +,,y,.,./ci/pytest.sh pytest cases/18-StreamProcessing/04-Options/test_abnormal_data_table.py +,,y,.,./ci/pytest.sh pytest cases/18-StreamProcessing/04-Options/test_abnormal_data_vtable.py +,,y,.,./ci/pytest.sh pytest cases/18-StreamProcessing/04-Options/test_meta_change_table.py +,,y,.,./ci/pytest.sh pytest cases/18-StreamProcessing/04-Options/test_meta_change_vtable.py +,,y,.,./ci/pytest.sh pytest cases/18-StreamProcessing/04-Options/test_options_abnormal.py +,,y,.,./ci/pytest.sh pytest cases/18-StreamProcessing/04-Options/test_options_basic.py +,,y,.,./ci/pytest.sh pytest cases/18-StreamProcessing/04-Options/test_options_ns.py +,,y,.,./ci/pytest.sh pytest cases/18-StreamProcessing/04-Options/test_options_us.py +,,y,.,./ci/pytest.sh pytest cases/18-StreamProcessing/04-Options/test_options_vtable.py +## 05-Notify +,,n,.,pytest cases/18-StreamProcessing/05-Notify/test_notify.py +## 06-ResultSaved +,,y,.,./ci/pytest.sh pytest cases/18-StreamProcessing/06-ResultSaved/test_result_saved_comprehensive.py +## 07-SubQuery +,,y,.,./ci/pytest.sh pytest cases/18-StreamProcessing/07-SubQuery/test_subquery_basic.py +100,,n,.,pytest cases/18-StreamProcessing/07-SubQuery/test_subquery_count_1.py +100,,n,.,pytest cases/18-StreamProcessing/07-SubQuery/test_subquery_count_2.py +100,,n,.,pytest cases/18-StreamProcessing/07-SubQuery/test_subquery_event.py +100,,n,.,pytest cases/18-StreamProcessing/07-SubQuery/test_subquery_sliding.py +100,,n,.,pytest cases/18-StreamProcessing/07-SubQuery/test_subquery_session.py +100,,n,.,pytest cases/18-StreamProcessing/07-SubQuery/test_subquery_state.py +,,y,.,./ci/pytest.sh pytest cases/18-StreamProcessing/07-SubQuery/test_subquery_state_filter_agg.py +,,y,.,./ci/pytest.sh pytest cases/18-StreamProcessing/07-SubQuery/test_subquery_usage_restrict.py +,,y,.,./ci/pytest.sh pytest cases/18-StreamProcessing/07-SubQuery/test_subquery_vtable_change.py +,,y,.,./ci/pytest.sh pytest cases/18-StreamProcessing/07-SubQuery/test_subquery_state_join_empty_result.py +## 08-Recalc +,,y,.,./ci/pytest.sh pytest cases/18-StreamProcessing/08-Recalc/test_recalc_combined_options.py +,,y,.,./ci/pytest.sh pytest cases/18-StreamProcessing/08-Recalc/test_recalc_delete_recalc.py +,,y,.,./ci/pytest.sh pytest cases/18-StreamProcessing/08-Recalc/test_recalc_expired_time.py +,,y,.,./ci/pytest.sh pytest cases/18-StreamProcessing/08-Recalc/test_recalc_ignore_disorder.py +,,y,.,./ci/pytest.sh pytest cases/18-StreamProcessing/08-Recalc/test_recalc_manual_basic.py +,,y,.,./ci/pytest.sh pytest cases/18-StreamProcessing/08-Recalc/test_recalc_manual_with_options.py +,,y,.,./ci/pytest.sh pytest cases/18-StreamProcessing/08-Recalc/test_recalc_watermark.py +,,y,.,./ci/pytest.sh pytest cases/18-StreamProcessing/08-Recalc/recalc_bug_13.py + +## 20-UseCase +,,y,.,./ci/pytest.sh pytest cases/18-StreamProcessing/20-UseCase/test_6771200393.py +,,y,.,./ci/pytest.sh pytest cases/18-StreamProcessing/20-UseCase/test_idmp_privilege.py +,,y,.,./ci/pytest.sh pytest cases/18-StreamProcessing/20-UseCase/test_idmp_manager.py +100,,y,.,./ci/pytest.sh pytest cases/18-StreamProcessing/20-UseCase/test_idmp_meters.py +,,n,.,pytest cases/18-StreamProcessing/20-UseCase/test_idmp_public.py +,,n,.,pytest cases/18-StreamProcessing/20-UseCase/test_idmp_pv.py +,,n,.,pytest cases/18-StreamProcessing/20-UseCase/test_idmp_tobacco.py +,,y,.,./ci/pytest.sh pytest cases/18-StreamProcessing/20-UseCase/test_idmp_vehicle.py +,,y,.,./ci/pytest.sh pytest cases/18-StreamProcessing/20-UseCase/test_idmp_yuxi.py +,,n,.,pytest cases/18-StreamProcessing/20-UseCase/test_nevados.py +,,y,.,./ci/pytest.sh pytest cases/18-StreamProcessing/20-UseCase/test_three_gorges_case4.py +,,y,.,./ci/pytest.sh pytest cases/18-StreamProcessing/20-UseCase/test_three_gorges_case5.py +,,n,.,pytest cases/18-StreamProcessing/20-UseCase/test_three_gorges_phase1.py +,,y,.,./ci/pytest.sh pytest cases/18-StreamProcessing/20-UseCase/test_three_gorges_second_case1.py +,,y,.,./ci/pytest.sh pytest cases/18-StreamProcessing/20-UseCase/test_three_gorges_second_case2.py +,,y,.,./ci/pytest.sh pytest cases/18-StreamProcessing/20-UseCase/test_three_gorges_second_case3.py +,,y,.,./ci/pytest.sh pytest cases/18-StreamProcessing/20-UseCase/test_three_gorges_second_case4.py +,,y,.,./ci/pytest.sh pytest cases/18-StreamProcessing/20-UseCase/test_three_gorges_second_case6.py +,,y,.,./ci/pytest.sh pytest cases/18-StreamProcessing/20-UseCase/test_three_gorges_second_case17.py +,,y,.,./ci/pytest.sh pytest cases/18-StreamProcessing/20-UseCase/test_three_gorges_second_case18.py +,,y,.,./ci/pytest.sh pytest cases/18-StreamProcessing/20-UseCase/test_three_gorges_second_case19.py +,,y,.,./ci/pytest.sh pytest cases/18-StreamProcessing/20-UseCase/test_three_gorges_second_case19_bug1.py +,,y,.,./ci/pytest.sh pytest cases/18-StreamProcessing/20-UseCase/test_three_gorges_second_case22.py +## 21-Stability +## 22-Performance +## 23-Compatibility +100,,n,.,pytest cases/18-StreamProcessing/23-Compatibility/test_compatibility_backward_forward_part1.py +100,,n,.,pytest cases/18-StreamProcessing/23-Compatibility/test_compatibility_backward_forward_part2.py +100,,n,.,pytest cases/18-StreamProcessing/23-Compatibility/test_compatibility_backward_forward_part3.py +100,,n,.,pytest cases/18-StreamProcessing/23-Compatibility/test_compatibility_backward_forward_part4.py +,,n,.,pytest cases/18-StreamProcessing/23-Compatibility/test_compatibility_cross_version.py +,,n,.,pytest cases/18-StreamProcessing/23-Compatibility/test_new_stream_compatibility.py +## 30-OldPyCases +,,y,.,./ci/pytest.sh pytest cases/18-StreamProcessing/30-OldPyCases/test_oldcase_at_once.py +,,n,.,pytest cases/18-StreamProcessing/30-OldPyCases/test_oldcase_backquote_check.py +,,y,.,./ci/pytest.sh pytest cases/18-StreamProcessing/30-OldPyCases/test_oldcase_checkpoint_info.py -N 4 +,,y,.,./ci/pytest.sh pytest cases/18-StreamProcessing/30-OldPyCases/test_oldcase_drop.py +,,y,.,./ci/pytest.sh pytest cases/18-StreamProcessing/30-OldPyCases/test_oldcase_empty_identifier.py +,,n,.,pytest cases/18-StreamProcessing/30-OldPyCases/test_oldcase_math_func.py +,,n,.,pytest cases/18-StreamProcessing/30-OldPyCases/test_oldcase_snode_restart_with_checkpoint.py -N 4 +,,n,.,pytest cases/18-StreamProcessing/30-OldPyCases/test_oldcase_state_window.py +,,y,.,./ci/pytest.sh pytest cases/18-StreamProcessing/30-OldPyCases/test_oldcase_stream_basic.py +,,y,.,./ci/pytest.sh pytest cases/18-StreamProcessing/30-OldPyCases/test_oldcase_stream_multi_agg.py +,,n,.,pytest cases/18-StreamProcessing/30-OldPyCases/test_oldcase_string_func.py +,,n,.,pytest cases/18-StreamProcessing/30-OldPyCases/test_oldcase_taosdShell.py +## 31-OldCases +,,n,.,pytest cases/18-StreamProcessing/31-OldTsimCases/test_oldcase_basic1.py +,,n,.,pytest cases/18-StreamProcessing/31-OldTsimCases/test_oldcase_basic2.py +,,n,.,pytest cases/18-StreamProcessing/31-OldTsimCases/test_oldcase_check.py +,,n,.,pytest cases/18-StreamProcessing/31-OldTsimCases/test_oldcase_checkpoint.py +,,n,.,pytest cases/18-StreamProcessing/31-OldTsimCases/test_oldcase_concat.py +,,n,.,pytest cases/18-StreamProcessing/31-OldTsimCases/test_oldcase_continuewindowclose.py +,,n,.,pytest cases/18-StreamProcessing/31-OldTsimCases/test_oldcase_state.py +,,y,.,./ci/pytest.sh pytest cases/18-StreamProcessing/31-OldTsimCases/test_oldcase_twa.py +## 99-Others +,,y,.,./ci/pytest.sh pytest cases/18-StreamProcessing/99-Others/test_stream_tag_cache.py +,,y,.,./ci/pytest.sh pytest cases/18-StreamProcessing/99-Others/test_out_table.py + + +# 19-TSMAs + +,,y,.,./ci/pytest.sh pytest cases/19-TSMAs/test_tsma.py +,,y,.,./ci/pytest.sh pytest cases/19-TSMAs/test_sma_basic.py -N 3 +,,y,.,./ci/pytest.sh pytest cases/19-TSMAs/test_sma_bugs.py +,,y,.,./ci/pytest.sh pytest cases/19-TSMAs/test_time_range_wise.py -N 3 + +# 20-RSMAs + +90,,y,.,./ci/pytest.sh pytest cases/20-RSMAs/test_rsma.py + +# 21-MetaData +,,y,.,./ci/pytest.sh pytest cases/21-MetaData/test_meta_bugs.py -N 3 +,,y,.,./ci/pytest.sh pytest cases/21-MetaData/test_meta_change.py -N 3 -M 3 +,,y,.,./ci/pytest.sh pytest cases/21-MetaData/test_meta_information_schema.py +,,y,.,./ci/pytest.sh pytest cases/21-MetaData/test_meta_ins_tables.py + +# 22-PerformanceData + +,,y,.,./ci/pytest.sh pytest cases/22-PerformanceData/test_performance_schema.py + +# 23-ShowCommands + +,,y,.,./ci/pytest.sh pytest cases/23-ShowCommands/test_show_alive.py -N 4 +,,y,.,./ci/pytest.sh pytest cases/23-ShowCommands/test_show_basic.py -N 3 +,,y,.,./ci/pytest.sh pytest cases/23-ShowCommands/test_show_create_db.py +,,y,.,./ci/pytest.sh pytest cases/23-ShowCommands/test_show_diskinfo.py +,,y,.,./ci/pytest.sh pytest cases/23-ShowCommands/test_show_table_distributed.py +,,y,.,./ci/pytest.sh pytest cases/23-ShowCommands/test_show_tables.py +,,y,.,./ci/pytest.sh pytest cases/23-ShowCommands/test_show_transaction.py -N 3 +,,y,.,./ci/pytest.sh pytest cases/23-ShowCommands/test_show_vgroups_ready.py -N 3 + +# 24-Users + +,,y,.,./ci/pytest.sh pytest cases/24-Users/test_user_basic.py +,,y,.,./ci/pytest.sh pytest cases/24-Users/test_user_control.py +,,y,.,./ci/pytest.sh pytest cases/24-Users/test_user_crypted_pass.py +,,y,.,./ci/pytest.sh pytest cases/24-Users/test_user_manager.py +,,y,.,./ci/pytest.sh pytest cases/24-Users/test_user_password.py +,,y,.,./ci/pytest.sh pytest cases/24-Users/test_user_privilege_create_db.py +,,y,.,./ci/pytest.sh pytest cases/24-Users/test_user_privilege_db.py +,,y,.,./ci/pytest.sh pytest cases/24-Users/test_user_privilege_sysinfo.py +,,y,.,./ci/pytest.sh pytest cases/24-Users/test_user_privilege_table.py +,,y,.,./ci/pytest.sh pytest cases/24-Users/test_user_privilege_topic.py +,,y,.,./ci/pytest.sh pytest cases/24-Users/test_user_token.py +,,y,.,./ci/pytest.sh pytest cases/24-Users/test_user_totp.py +,,y,.,./ci/pytest.sh pytest cases/24-Users/test_user_whitelist.py +,,n,.,pytest cases/24-Users/test_user_passwd.py + +# 25-Privileges +,,y,.,./ci/pytest.sh pytest cases/25-Privileges/test_priv_basic.py -N 3 +,,y,.,./ci/pytest.sh pytest cases/25-Privileges/test_priv_bugs.py -N 3 +,,n,.,pytest cases/25-Privileges/test_priv_control.py -N 3 +,,y,.,./ci/pytest.sh pytest cases/25-Privileges/test_priv_rbac.py +,,y,.,./ci/pytest.sh pytest cases/25-Privileges/test_priv_subscribe.py + +# 26-NodeManager + +## 01-Dnode +,,y,.,./ci/pytest.sh pytest cases/26-NodeManager/01-Dnode/test_alter_dnode.py +,,y,.,./ci/pytest.sh pytest cases/26-NodeManager/01-Dnode/test_create_dnode.py -N 2 -C 1 +#failed,,y,.,./ci/pytest.sh pytest cases/26-NodeManager/01-Dnode/test_drop_dnode_force.py -N 5 +,,y,.,./ci/pytest.sh pytest cases/26-NodeManager/01-Dnode/test_drop_dnode_has_mnode.py -N 2 +,,y,.,./ci/pytest.sh pytest cases/26-NodeManager/01-Dnode/test_drop_dnode_has_multi_vnode_replica1.py -N 3 +,,y,.,./ci/pytest.sh pytest cases/26-NodeManager/01-Dnode/test_drop_dnode_has_multi_vnode_replica3.py -N 5 +,,y,.,./ci/pytest.sh pytest cases/26-NodeManager/01-Dnode/test_drop_dnode_has_qnode_snode.py -N 2 +#failed,,y,.,./ci/pytest.sh pytest cases/26-NodeManager/01-Dnode/test_drop_dnode_has_vnode_replica1.py -N 3 +,,y,.,./ci/pytest.sh pytest cases/26-NodeManager/01-Dnode/test_drop_dnode_has_vnode_replica3.py -N 5 +,,y,.,./ci/pytest.sh pytest cases/26-NodeManager/01-Dnode/test_offline_reason.py -N 2 -C 1 +#,,y,.,./ci/pytest.sh pytest cases/26-NodeManager/01-Dnode/test_use_dropped_dnode.py -N 3 +## 02-Mnode +,,y,.,./ci/pytest.sh pytest cases/26-NodeManager/02-Mnode/test_mnode_basic1.py -N 2 +,,y,.,./ci/pytest.sh pytest cases/26-NodeManager/02-Mnode/test_mnode_basic2.py -N 2 +,,y,.,./ci/pytest.sh pytest cases/26-NodeManager/02-Mnode/test_mnode_basic3.py -N 4 +,,y,.,./ci/pytest.sh pytest cases/26-NodeManager/02-Mnode/test_mnode_basic4.py -N 3 +,,y,.,./ci/pytest.sh pytest cases/26-NodeManager/02-Mnode/test_mnode_basic5.py -N 4 +,,y,.,./ci/pytest.sh pytest cases/26-NodeManager/02-Mnode/test_mnode_basic6.py -N 4 +## 03-Qnode +,,y,.,./ci/pytest.sh pytest cases/26-NodeManager/03-Qnode/test_qnode_basic.py -N 2 +## 04-Snode +,,y,.,./ci/pytest.sh pytest cases/26-NodeManager/04-Snode/test_snode_basic1.py -N 2 + +# 27-Mount +,,y,.,./ci/pytest.sh pytest cases/27-Mount/test_mount_basic.py + +# 28-Except + +# 29-Escape + +,,y,.,./ci/pytest.sh pytest cases/29-Escape/test_binary_escape_character.py + +# 30-NameLimits + +,,y,.,./ci/pytest.sh pytest cases/30-NameLimits/test_boundary.py +,,y,.,./ci/pytest.sh pytest cases/30-NameLimits/test_db_tb_name_check.py +,,y,.,./ci/pytest.sh pytest cases/30-NameLimits/test_dbtbname_validate.py + +# 31-Security + +,,y,.,./ci/pytest.sh pytest cases/31-Security/01-KeyGeneration/test_key_generation.py +,,y,.,./ci/pytest.sh pytest cases/31-Security/02-KeyUpdate/test_key_update.py +,,y,.,./ci/pytest.sh pytest cases/31-Security/03-KeyBackupRestore/test_key_backup_restore.py +,,y,.,./ci/pytest.sh pytest cases/31-Security/04-TransparentEncryption/test_transparent_encryption.py +,,y,.,./ci/pytest.sh pytest cases/31-Security/06-EncryptionStatus/test_encryption_status.py +,,y,.,./ci/pytest.sh pytest cases/31-Security/10-SecurityTest/test_plaintext_check.py + +# 42-xnode +,,y,.,./ci/pytest.sh pytest cases/42-Xnode/test_xnode.py +,,y,.,./ci/pytest.sh pytest cases/42-Xnode/test_xnode_systables.py +,,y,.,./ci/pytest.sh pytest cases/42-Xnode/test_xnode_lifecycle.py + +# 70-Cluster + +,,n,.,pytest cases/70-Cluster/test_cluster_arbitrator.py -N 3 +,,y,.,./ci/pytest.sh pytest cases/70-Cluster/test_cluster_basic.py -N 5 +,,y,.,./ci/pytest.sh pytest cases/70-Cluster/test_cluster_drop_table_by_uid.py -N 3 +,,y,.,./ci/pytest.sh pytest cases/70-Cluster/test_cluster_kill_restore_dnode.py -N 5 +,,y,.,./ci/pytest.sh pytest cases/70-Cluster/test_cluster_inc_snapshot.py -N 3 +,,y,.,./ci/pytest.sh pytest cases/70-Cluster/test_cluster_restore_dnode.py -N 5 -M 3 +,,y,.,./ci/pytest.sh pytest cases/70-Cluster/test_cluster_restore_vnode.py -N 5 -M 3 +,,y,.,./ci/pytest.sh pytest cases/70-Cluster/test_cluster_restore_mnode.py -N 5 -M 3 +,,y,.,./ci/pytest.sh pytest cases/70-Cluster/test_cluster_restore_qnode.py -N 5 -M 3 +,,y,.,./ci/pytest.sh pytest cases/70-Cluster/test_cluster_snapshot.py -N 3 -L 3 -D 2 +,,y,.,./ci/pytest.sh pytest cases/70-Cluster/test_cluster_split_vgroup_by_learner.py -N 3 +,,y,.,./ci/pytest.sh pytest cases/70-Cluster/test_cluster_threads.py +,,y,.,./ci/pytest.sh pytest cases/70-Cluster/test_cluster_threads.py -N 3 --replica 3 -R +,,y,.,./ci/pytest.sh pytest cases/70-Cluster/test_cluster_tsdb_snapshot.py -N 3 -M 3 +,,y,.,./ci/pytest.sh pytest cases/70-Cluster/test_6dnode3mnode_insert_less_data_alter_rep3to1to3.py -N 6 -M 3 +,,y,.,./ci/pytest.sh pytest cases/70-Cluster/test_4dnode1mnode_basic_create_db_replica1.py -N 4 -M 1 +,,y,.,./ci/pytest.sh pytest cases/70-Cluster/test_4dnode1mnode_basic_replica1_insertdatas.py -N 4 -M 1 +,,y,.,./ci/pytest.sh pytest cases/70-Cluster/test_4dnode1mnode_basic_replica1_insertdatas_querys.py -N 4 -M 1 +,,y,.,./ci/pytest.sh pytest cases/70-Cluster/test_4dnode1mnode_basic_replica3_insertdatas.py -N 4 -M 1 +,,y,.,./ci/pytest.sh pytest cases/70-Cluster/test_4dnode1mnode_basic_replica3_insertdatas_querys.py -N 4 -M 1 +,,y,.,./ci/pytest.sh pytest cases/70-Cluster/test_4dnode1mnode_basic_replica3_vgroups.py -N 4 -M 1 +,,y,.,./ci/pytest.sh pytest cases/70-Cluster/test_5dnode1mnode.py +,,y,.,./ci/pytest.sh pytest cases/70-Cluster/test_5dnode2mnode.py -N 5 +,,y,.,./ci/pytest.sh pytest cases/70-Cluster/test_5dnode3mnode_stop.py -N 5 -M 3 +,,y,.,./ci/pytest.sh pytest cases/70-Cluster/test_5dnode3mnode_stop.py -N 5 -M 3 -I False +,,y,.,./ci/pytest.sh pytest cases/70-Cluster/test_5dnode3mnode_stop_2follower.py -N 5 -M 3 +,,y,.,./ci/pytest.sh pytest cases/70-Cluster/test_5dnode3mnode_stop_2follower.py -N 5 -M 3 -I False +,,y,.,./ci/pytest.sh pytest cases/70-Cluster/test_5dnode3mnode_stop_loop.py -N 5 -M 3 +,,y,.,./ci/pytest.sh pytest cases/70-Cluster/test_5dnode3mnode_sep1_vnode_stop_dnode_create_db.py -N 6 -M 3 +,,y,.,./ci/pytest.sh pytest cases/70-Cluster/test_5dnode3mnode_sep1_vnode_stop_dnode_create_db.py -N 6 -M 3 --replica 3 +,,y,.,./ci/pytest.sh pytest cases/70-Cluster/test_5dnode3mnode_sep1_vnode_stop_mnode_create_db.py -N 6 -M 3 +,,y,.,./ci/pytest.sh pytest cases/70-Cluster/test_5dnode3mnode_sep1_vnode_stop_mnode_create_db.py -N 6 -M 3 --replica 3 +,,y,.,./ci/pytest.sh pytest cases/70-Cluster/test_5dnode3mnode_sep1_vnode_stop_vnode_create_db.py -N 6 -M 3 +,,y,.,./ci/pytest.sh pytest cases/70-Cluster/test_5dnode3mnode_sep1_vnode_stop_vnode_create_db.py -N 6 -M 3 --replica 3 +,,y,.,./ci/pytest.sh pytest cases/70-Cluster/test_5dnode3mnode_sep1_vnode_stop_dnode_modify_meta.py -N 6 -M 3 +,,y,.,./ci/pytest.sh pytest cases/70-Cluster/test_5dnode3mnode_sep1_vnode_stop_mnode_modify_meta.py -N 6 -M 3 +,,y,.,./ci/pytest.sh pytest cases/70-Cluster/test_5dnode3mnode_sep1_vnode_stop_dnode_create_stb.py -N 6 -M 3 +,,y,.,./ci/pytest.sh pytest cases/70-Cluster/test_5dnode3mnode_sep1_vnode_stop_dnode_create_stb.py -N 6 -M 3 --replica 3 +,,y,.,./ci/pytest.sh pytest cases/70-Cluster/test_5dnode3mnode_sep1_vnode_stop_mnode_create_stb.py -N 6 -M 3 +,,y,.,./ci/pytest.sh pytest cases/70-Cluster/test_5dnode3mnode_sep1_vnode_stop_mnode_create_stb.py -N 6 -M 3 --replica 3 +,,y,.,./ci/pytest.sh pytest cases/70-Cluster/test_5dnode3mnode_sep1_vnode_stop_vnode_create_stb.py -N 6 -M 3 +,,y,.,./ci/pytest.sh pytest cases/70-Cluster/test_5dnode3mnode_sep1_vnode_stop_vnode_create_stb.py -N 6 -M 3 --replica 3 +,,y,.,./ci/pytest.sh pytest cases/70-Cluster/test_5dnode3mnode_restart_dnode_insert_data.py -N 6 -M 3 +,,y,.,./ci/pytest.sh pytest cases/70-Cluster/test_5dnode3mnode_restart_dnode_insert_data.py -N 6 -M 3 --replica 3 +,,y,.,./ci/pytest.sh pytest cases/70-Cluster/test_5dnode3mnode_restart_dnode_insert_data_async.py -N 6 -M 3 +,,y,.,./ci/pytest.sh pytest cases/70-Cluster/test_5dnode3mnode_add_1dnode.py -N 7 -M 3 -C 6 +,,y,.,./ci/pytest.sh pytest cases/70-Cluster/test_5dnode3mnode_add_1dnode.py -N 7 -M 3 -C 6 --replica 3 +,,y,.,./ci/pytest.sh pytest cases/70-Cluster/test_5dnode3mnode_recreate_mnode.py -N 6 -M 3 +,,y,.,./ci/pytest.sh pytest cases/70-Cluster/test_5dnode3mnode_stop_follower_leader.py -N 5 -M 3 +,,y,.,./ci/pytest.sh pytest cases/70-Cluster/test_compact_db_conflict.py -N 3 +,,y,.,./ci/pytest.sh pytest cases/70-Cluster/test_mnode_encrypt.py -N 3 +,,y,.,./ci/pytest.sh pytest cases/70-Cluster/test_5dnode_3mnode_add_1dnode.py -N 7 -M 3 -C 6 +,,y,.,./ci/pytest.sh pytest cases/70-Cluster/test_5dnode_3mnode_add_1dnode.py -N 7 -M 3 -C 6 --replica 3 +,,y,.,./ci/pytest.sh pytest cases/70-Cluster/test_5dnode_3mnode_stop.py -N 5 -M 3 +,,y,.,./ci/pytest.sh pytest cases/70-Cluster/test_5dnode_3mnode_stop.py -N 5 -M 3 -I False + + +# 80-Components + +# 01-Taosd +,,n,.,pytest cases/80-Components/01-Taosd/test_com_cmdline.py +,,n,.,pytest cases/80-Components/01-Taosd/test_com_taosd_log.py +,,y,.,./ci/pytest.sh pytest cases/80-Components/01-Taosd/test_com_config.py -N 3 +,,y,.,./ci/pytest.sh pytest cases/80-Components/01-Taosd/test_com_config_refresh.py -N 3 +,,y,.,./ci/pytest.sh pytest cases/80-Components/01-Taosd/test_com_config_refresh.py -N 3 -M 3 +,,y,.,./ci/pytest.sh pytest cases/80-Components/01-Taosd/test_com_persisit_config.py +,,y,.,./ci/pytest.sh pytest cases/80-Components/01-Taosd/test_com_taosd_audit.py +,,y,.,./ci/pytest.sh pytest cases/80-Components/01-Taosd/test_com_taosd_monitor.py +,,y,.,./ci/pytest.sh pytest cases/80-Components/01-Taosd/test_com_taosd_restart.py +,,y,.,./ci/pytest.sh pytest cases/80-Components/01-Taosd/test_com_telemetry.py + +# 02-Taosc +,,y,.,./ci/pytest.sh pytest cases/80-Components/02-Taosc/test_com_count_always_return_value.py +,,y,.,./ci/pytest.sh pytest cases/80-Components/02-Taosc/test_com_taosc_hot_refresh_config.py + +# 81-Tools + +## 01-Check +,,y,.,./ci/pytest.sh pytest cases/81-Tools/01-Check/test_check_error_code.py +,,y,.,./ci/pytest.sh pytest cases/81-Tools/01-Check/test_check_scan.py +,,y,.,./ci/pytest.sh pytest cases/81-Tools/01-Check/test_check_systb_inspect.py + +## 02-Taos +,,y,.,./ci/pytest.sh pytest cases/81-Tools/02-Taos/test_tool_taos_cli.py -B +,,n,.,pytest cases/81-Tools/02-Taos/test_tool_cmdline.py +,,y,.,./ci/pytest.sh pytest cases/81-Tools/02-Taos/test_tool_taos_shell.py +,,y,.,./ci/pytest.sh pytest cases/81-Tools/02-Taos/test_tool_taos_shell_error.py +,,y,.,./ci/pytest.sh pytest cases/81-Tools/02-Taos/test_tool_taos_shell_net_chk.py +## 03-Benchmark +,,n,pytest cases/81-Tools/03-Benchmark/test_benchmark_basic.py +,,y,.,./ci/pytest.sh pytest cases/81-Tools/03-Benchmark/test_benchmark_bugs.py -B +,,y,.,./ci/pytest.sh pytest cases/81-Tools/03-Benchmark/test_benchmark_commandline.py +,,y,.,./ci/pytest.sh pytest cases/81-Tools/03-Benchmark/test_benchmark_conn_mode.py -B +,,y,.,./ci/pytest.sh pytest cases/81-Tools/03-Benchmark/test_benchmark_datatypes.py +90,,y,.,./ci/pytest.sh pytest cases/81-Tools/03-Benchmark/test_benchmark_except.py +,,y,.,./ci/pytest.sh pytest cases/81-Tools/03-Benchmark/test_benchmark_mix.py +,,y,.,./ci/pytest.sh pytest cases/81-Tools/03-Benchmark/test_benchmark_query_main.py +,,y,.,./ci/pytest.sh pytest cases/81-Tools/03-Benchmark/test_benchmark_query_rest.py -B +,,y,.,./ci/pytest.sh pytest cases/81-Tools/03-Benchmark/test_benchmark_query_sqlfile.py +,,n,.,pytest cases/81-Tools/03-Benchmark/test_benchmark_rest.py -B +,,n,.,pytest cases/81-Tools/03-Benchmark/test_benchmark_sml.py +,,n,.,pytest cases/81-Tools/03-Benchmark/test_benchmark_stmt.py +,,y,.,./ci/pytest.sh pytest cases/81-Tools/03-Benchmark/test_benchmark_tag_order_sml.py +,,y,.,./ci/pytest.sh pytest cases/81-Tools/03-Benchmark/test_benchmark_tag_order_sql.py +,,y,.,./ci/pytest.sh pytest cases/81-Tools/03-Benchmark/test_benchmark_tag_order_stmt2.py +,,y,.,./ci/pytest.sh pytest cases/81-Tools/03-Benchmark/test_benchmark_tag_order_stmt.py +,,y,.,./ci/pytest.sh pytest cases/81-Tools/03-Benchmark/test_benchmark_taosc.py +# TD-38727: Temporarily disable memory leak detection for test_benchmark_tmq tests +# ,,y,.,./ci/pytest.sh pytest cases/81-Tools/03-Benchmark/test_benchmark_tmq.py +,,n,.,pytest cases/81-Tools/03-Benchmark/test_benchmark_tmq.py +,,y,.,./ci/pytest.sh pytest cases/81-Tools/03-Benchmark/test_benchmark_website.py +,,y,.,./ci/pytest.sh pytest cases/81-Tools/03-Benchmark/test_benchmark_with_csv.py +## 04-Taosdump +,,y,.,./ci/pytest.sh pytest cases/81-Tools/04-Taosdump/test_taosdump_basic.py -B +,,y,.,./ci/pytest.sh pytest cases/81-Tools/04-Taosdump/test_taosdump_bugs.py -B +#,,y,.,./ci/pytest.sh pytest cases/81-Tools/04-Taosdump/test_taosdump_commandline.py -B # PRIV_TODO +,,y,.,./ci/pytest.sh pytest cases/81-Tools/04-Taosdump/test_taosdump_compa.py +,,y,.,./ci/pytest.sh pytest cases/81-Tools/04-Taosdump/test_taosdump_datatypes.py -B +,,y,.,./ci/pytest.sh pytest cases/81-Tools/04-Taosdump/test_taosdump_precision.py +,,y,.,./ci/pytest.sh pytest cases/81-Tools/04-Taosdump/test_taosdump_primarykey.py -B +,,y,.,./ci/pytest.sh pytest cases/81-Tools/04-Taosdump/test_taosdump_privilege.py +,,y,.,./ci/pytest.sh pytest cases/81-Tools/04-Taosdump/test_taosdump_except.py -B +,,y,.,./ci/pytest.sh pytest cases/81-Tools/04-Taosdump/test_taosdump_schema_change.py -B + +## 05-Valgrind +,,y,.,./ci/pytest.sh pytest cases/81-Tools/05-Valgrind/test_valgrind_basic1.py +,,y,.,./ci/pytest.sh pytest cases/81-Tools/05-Valgrind/test_valgrind_basic2.py +,,y,.,./ci/pytest.sh pytest cases/81-Tools/05-Valgrind/test_valgrind_basic3.py +,,y,.,./ci/pytest.sh pytest cases/81-Tools/05-Valgrind/test_valgrind_basic4.py +,,y,.,./ci/pytest.sh pytest cases/81-Tools/05-Valgrind/test_valgrind_checkerror1.py -N 3 +,,y,.,./ci/pytest.sh pytest cases/81-Tools/05-Valgrind/test_valgrind_checkerror2.py +,,y,.,./ci/pytest.sh pytest cases/81-Tools/05-Valgrind/test_valgrind_checkerror3.py +,,y,.,./ci/pytest.sh pytest cases/81-Tools/05-Valgrind/test_valgrind_checkerror4.py +,,y,.,./ci/pytest.sh pytest cases/81-Tools/05-Valgrind/test_valgrind_checkerror5.py +,,y,.,./ci/pytest.sh pytest cases/81-Tools/05-Valgrind/test_valgrind_checkerror6.py +,,y,.,./ci/pytest.sh pytest cases/81-Tools/05-Valgrind/test_valgrind_checkerror7.py +,,y,.,./ci/pytest.sh pytest cases/81-Tools/05-Valgrind/test_valgrind_checkerror8.py +#,,y,.,./ci/pytest.sh pytest cases/81-Tools/05-Valgrind/test_valgrind_udf.py + +# 82-UnitTest + +200,,n,cases,bash 82-UnitTest/test.sh + +# 83-DocTest + +,,n,cases,bash 83-DocTest/c.sh +,,n,cases,bash 83-DocTest/python.sh +,,n,cases,bash 83-DocTest/node.sh +,,n,cases,bash 83-DocTest/csharp.sh +,,n,cases,bash 83-DocTest/jdbc.sh +,,n,cases,bash 83-DocTest/rust.sh +,,n,cases,bash 83-DocTest/go.sh +,,n,cases,bash 83-DocTest/test_R.sh + + +# ---------------------------- uncatalog -------------------------- + + +# army + +#newstm,,n,.,pytest cases/uncatalog/army/storage/ss/test_ss_basic.py -N 3 +#newstm,,y,.,./ci/pytest.sh pytest cases/uncatalog/army/stream/test_stream_vtable.py + +## system_test + +### 2-query +#newstm,,y,.,./ci/pytest.sh pytest cases/uncatalog/system-test/2-query/test_tsma.py +#newstm,,y,.,./ci/pytest.sh pytest cases/uncatalog/system-test/2-query/test_tsma2.py + +### 7-tmq +#,,y,.,./ci/pytest.sh pytest cases/uncatalog/system-test/7-tmq/test_tmqConsumerGroup.py +#memleak,,y,.,./ci/pytest.sh pytest cases/uncatalog/system-test/7-tmq/test_tmqUdf_multCtb_snapshot0.py +#memleak,,y,.,./ci/pytest.sh pytest cases/uncatalog/system-test/7-tmq/test_tmqUdf_multCtb_snapshot1.py +#,,n.,pytest cases/uncatalog/system-test/7-tmq/test_tmq_taosx.py From 0dc1a465cd11708b10568e3c89056b85c22a9beb Mon Sep 17 00:00:00 2001 From: chenhaoran Date: Fri, 6 Mar 2026 10:51:02 +0800 Subject: [PATCH 11/22] feat: add Windows CI pipeline --- test/ci/run_win_cases.py | 2 +- test/ci/win.pipline | 156 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 157 insertions(+), 1 deletion(-) create mode 100644 test/ci/win.pipline diff --git a/test/ci/run_win_cases.py b/test/ci/run_win_cases.py index f3f705bdb4a7..c7227dfdf204 100644 --- a/test/ci/run_win_cases.py +++ b/test/ci/run_win_cases.py @@ -229,7 +229,7 @@ def cleanup_environment(phase=""): break global current_process - pytest_cmd_clean = f"{pytest_cmd} --clean -u" + pytest_cmd_clean = f"{pytest_cmd} --clean" with open(log_file, 'w', buffering=1) as log: current_process = subprocess.Popen( diff --git a/test/ci/win.pipline b/test/ci/win.pipline new file mode 100644 index 000000000000..6f4c4c6f03e8 --- /dev/null +++ b/test/ci/win.pipline @@ -0,0 +1,156 @@ +def pre_test_win(){ + bat ''' + hostname + ipconfig + set + date /t + time /t + taskkill /f /t /im python.exe + taskkill /f /t /im bash.exe + taskkill /f /t /im taosd.exe + rd /s /Q %WIN_INTERNAL_ROOT%\\debug || echo "no debug folder" + echo "clean environment done" + exit 0 + ''' + bat ''' + cd %WIN_INTERNAL_ROOT% + git config --global --add safe.directory %WIN_INTERNAL_ROOT% + git reset --hard + git remote prune origin + git fetch || git fetch + ''' + bat ''' + cd %WIN_COMMUNITY_ROOT% + git config --global --add safe.directory %WIN_COMMUNITY_ROOT% + git reset --hard + git remote prune origin + git fetch || git fetch + ''' + bat ''' + cd %WIN_INTERNAL_ROOT% + git checkout %BRANCH_NAME% + git remote prune origin + git clean -f + ''' + bat ''' + cd %WIN_COMMUNITY_ROOT% + git checkout %BRANCH_NAME% + git remote prune origin + git clean -f + ''' + bat ''' + cd %WIN_INTERNAL_ROOT% + git pull origin %BRANCH_NAME% + ''' + bat ''' + cd %WIN_COMMUNITY_ROOT% + git pull origin %BRANCH_NAME% + ''' + bat ''' + cd %WIN_INTERNAL_ROOT% + git branch + git log -5 + ''' + bat ''' + cd %WIN_COMMUNITY_ROOT% + git branch + git log -5 + ''' +} +def pre_test_build_win(skip_build=false) { + if (skip_build) { + echo "SKIP_BUILD is set to true, skipping build stage" + // 检查必要的二进制文件是否存在 + bat ''' + if not exist "%WIN_INTERNAL_ROOT%\\debug\\build\\bin\\taosd.exe" ( + echo "ERROR: taosd.exe not found in %WIN_INTERNAL_ROOT%\\debug\\build\\bin\\" + echo "Please ensure binaries exist or disable SKIP_BUILD" + exit 1 + ) + echo "Using existing build in %WIN_INTERNAL_ROOT%\\debug\\" + ''' + // 仍然需要安装 Python 依赖和复制 DLL + bat ''' + cd %WIN_TEST_ROOT% + python3 -m pip install --upgrade pip + python3 -m pip uninstall taospy -y + python3 -m pip install taospy + xcopy /e/y/i/f %WIN_INTERNAL_ROOT%\\debug\\build\\bin\\taos.dll C:\\Windows\\System32 || echo "taos.dll already exists" + xcopy /e/y/i/f %WIN_INTERNAL_ROOT%\\debug\\build\\bin\\taosnative.dll C:\\Windows\\System32 || echo "taosnative.dll already exists" + ''' + return 1 + } + + bat ''' + echo "building ..." + time /t + cd %WIN_INTERNAL_ROOT% + mkdir debug + cd debug + rm -rf %WIN_INTERNAL_ROOT%/debug/* + time /t + call "C:\\Program Files\\Microsoft Visual Studio\\2022\\Community\\VC\\Auxiliary\\Build\\vcvarsall.bat" x64 + echo ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> cmake .. -G "NMake Makefiles JOM" -DBUILD_TEST=true -DBUILD_TOOLS=true -DBUILD_HTTP=internal " + time /t + cmake .. -G "NMake Makefiles JOM" -DBUILD_TEST=true -DBUILD_TOOLS=true -DBUILD_HTTP=internal || exit 7 + echo ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> jom -j 10 " + time /t + jom -j 10 || exit 8 + jom install || exit 8 + time /t + ''' + bat ''' + cd %WIN_TEST_ROOT% + python3 -m pip install --upgrade pip + python3 -m pip uninstall taospy -y + python3 -m pip install taospy + xcopy /e/y/i/f %WIN_INTERNAL_ROOT%\\debug\\build\\bin\\taos.dll C:\\Windows\\System32 + xcopy /e/y/i/f %WIN_INTERNAL_ROOT%\\debug\\build\\bin\\taosnative.dll C:\\Windows\\System32 + ''' + return 1 +} +def run_win_test_python() { + bat ''' + echo "windows test ..." + ls -l C:\\Windows\\System32\\taos.dll + ''' + bat ''' + time /t + cd %WIN_TEST_ROOT% + echo "python testing ..." + python3 ci\\run_win_cases.py ci\\test_cases.task + time /t + ''' +} +pipeline { + agent none + stages { + stage('run test') { + parallel { + stage('windows test') { + agent {label " u1-83 "} + environment{ + WIN_INTERNAL_ROOT="D:\\TDinternal" + WIN_COMMUNITY_ROOT="D:\\TDinternal\\community" + WIN_TEST_ROOT="D:\\TDinternal\\community\\test" + WIN_SYSTEM_TEST_ROOT="D:\\TDinternal\\community\\test" + BRANCH_NAME="${params.TEST_BRANCH}" + } + steps { + timeout(time: 4800, unit: 'MINUTES') { + script { + pre_test_win() + // 根据 SKIP_BUILD 参数决定是否跳过编译 + def skipBuild = params.SKIP_BUILD ?: false + pre_test_build_win(skipBuild) + catchError(buildResult: 'FAILURE', stageResult: 'FAILURE') { + run_win_test_python() + } + } + } + } + } + } + } + } +} \ No newline at end of file From 6dde59cbfc3c28399aa14e2e6ff8a18449277dec Mon Sep 17 00:00:00 2001 From: chenhaoran Date: Fri, 6 Mar 2026 13:07:13 +0800 Subject: [PATCH 12/22] fix: reduce wait time in process_pytest_file function --- test/ci/run_win_cases.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/ci/run_win_cases.py b/test/ci/run_win_cases.py index c7227dfdf204..1450fc29c6e1 100644 --- a/test/ci/run_win_cases.py +++ b/test/ci/run_win_cases.py @@ -242,7 +242,7 @@ def cleanup_environment(phase=""): # 轮询等待 waited = 0 - while waited < 1800: + while waited < 1200: ret = current_process.poll() if ret is not None: return_code = ret From 3ae47fe94007c403ae7cccfd7b27e1a080ee7044 Mon Sep 17 00:00:00 2001 From: chenhaoran Date: Fri, 6 Mar 2026 14:40:52 +0800 Subject: [PATCH 13/22] fix: update Windows pipeline for Python 3.8 support and improve path handling --- test/ci/win.pipline | 36 +++++++++++++++++++----------------- 1 file changed, 19 insertions(+), 17 deletions(-) diff --git a/test/ci/win.pipline b/test/ci/win.pipline index 6f4c4c6f03e8..f3be15af71bf 100644 --- a/test/ci/win.pipline +++ b/test/ci/win.pipline @@ -60,24 +60,24 @@ def pre_test_win(){ def pre_test_build_win(skip_build=false) { if (skip_build) { echo "SKIP_BUILD is set to true, skipping build stage" - // 检查必要的二进制文件是否存在 - bat ''' - if not exist "%WIN_INTERNAL_ROOT%\\debug\\build\\bin\\taosd.exe" ( - echo "ERROR: taosd.exe not found in %WIN_INTERNAL_ROOT%\\debug\\build\\bin\\" - echo "Please ensure binaries exist or disable SKIP_BUILD" + // 检查必要的二进制文件是否存在(使用双引号确保路径正确) + bat """ + if not exist "${WIN_INTERNAL_ROOT}\\debug\\build\\bin\\taosd.exe" ( + echo ERROR: taosd.exe not found in ${WIN_INTERNAL_ROOT}\\debug\\build\\bin\\ + echo Please ensure binaries exist or disable SKIP_BUILD exit 1 ) - echo "Using existing build in %WIN_INTERNAL_ROOT%\\debug\\" - ''' + echo Using existing build in ${WIN_INTERNAL_ROOT}\\debug\\ + """ // 仍然需要安装 Python 依赖和复制 DLL - bat ''' - cd %WIN_TEST_ROOT% + bat """ + cd ${WIN_TEST_ROOT} python3 -m pip install --upgrade pip python3 -m pip uninstall taospy -y python3 -m pip install taospy - xcopy /e/y/i/f %WIN_INTERNAL_ROOT%\\debug\\build\\bin\\taos.dll C:\\Windows\\System32 || echo "taos.dll already exists" - xcopy /e/y/i/f %WIN_INTERNAL_ROOT%\\debug\\build\\bin\\taosnative.dll C:\\Windows\\System32 || echo "taosnative.dll already exists" - ''' + xcopy /e/y/i/f ${WIN_INTERNAL_ROOT}\\debug\\build\\bin\\taos.dll C:\\Windows\\System32 || echo "taos.dll already exists" + xcopy /e/y/i/f ${WIN_INTERNAL_ROOT}\\debug\\build\\bin\\taosnative.dll C:\\Windows\\System32 || echo "taosnative.dll already exists" + """ return 1 } @@ -118,7 +118,7 @@ def run_win_test_python() { time /t cd %WIN_TEST_ROOT% echo "python testing ..." - python3 ci\\run_win_cases.py ci\\test_cases.task + python3 ci\\run_win_cases.py ci\\cases.task time /t ''' } @@ -130,10 +130,12 @@ pipeline { stage('windows test') { agent {label " u1-83 "} environment{ - WIN_INTERNAL_ROOT="D:\\TDinternal" - WIN_COMMUNITY_ROOT="D:\\TDinternal\\community" - WIN_TEST_ROOT="D:\\TDinternal\\community\\test" - WIN_SYSTEM_TEST_ROOT="D:\\TDinternal\\community\\test" + // 支持通过参数指定路径,默认使用 D:\TDinternal + // 如果 Jenkins 在子目录 checkout,请设置 WIN_INTERNAL_ROOT_PARAM 参数 + WIN_INTERNAL_ROOT="${params.WIN_INTERNAL_ROOT_PARAM ?: 'D:\\TDinternal'}" + WIN_COMMUNITY_ROOT="${params.WIN_INTERNAL_ROOT_PARAM ? params.WIN_INTERNAL_ROOT_PARAM + '\\community' : 'D:\\TDinternal\\community'}" + WIN_TEST_ROOT="${params.WIN_INTERNAL_ROOT_PARAM ? params.WIN_INTERNAL_ROOT_PARAM + '\\community\\test' : 'D:\\TDinternal\\community\\test'}" + WIN_SYSTEM_TEST_ROOT="${params.WIN_INTERNAL_ROOT_PARAM ? params.WIN_INTERNAL_ROOT_PARAM + '\\community\\test' : 'D:\\TDinternal\\community\\test'}" BRANCH_NAME="${params.TEST_BRANCH}" } steps { From dd518371acd7c69c927c12f28ce49549bf49b1c5 Mon Sep 17 00:00:00 2001 From: chenhaoran Date: Sun, 8 Mar 2026 10:32:09 +0800 Subject: [PATCH 14/22] test: delete test task --- test/ci/test_cases.task | 572 ---------------------------------------- 1 file changed, 572 deletions(-) delete mode 100644 test/ci/test_cases.task diff --git a/test/ci/test_cases.task b/test/ci/test_cases.task deleted file mode 100644 index e4f04ba38632..000000000000 --- a/test/ci/test_cases.task +++ /dev/null @@ -1,572 +0,0 @@ -,,y,.,./ci/pytest.sh pytest cases/14-JoinQueries/test_join_func_cursor.py -,,y,.,./ci/pytest.sh pytest cases/14-JoinQueries/test_join_interval.py -,,y,.,./ci/pytest.sh pytest cases/14-JoinQueries/test_join_manyblocks.py -,,y,.,./ci/pytest.sh pytest cases/14-JoinQueries/test_join_multitables.py -,,y,.,./ci/pytest.sh pytest cases/14-JoinQueries/test_join_multivnode.py -,,y,.,./ci/pytest.sh pytest cases/14-JoinQueries/test_join_pk.py -,,y,.,./ci/pytest.sh pytest cases/14-JoinQueries/test_join_order.py -,,y,.,./ci/pytest.sh pytest cases/14-JoinQueries/test_join_tbname.py -,,y,.,./ci/pytest.sh pytest cases/14-JoinQueries/test_join.py -,,y,.,./ci/pytest.sh pytest cases/14-JoinQueries/test_join_condition.py -,,y,.,./ci/pytest.sh pytest cases/14-JoinQueries/test_join_ns_db.py -,,y,.,./ci/pytest.sh pytest cases/14-JoinQueries/test_join_6604237597.py - -# 15-TagIndices - -,,y,.,./ci/pytest.sh pytest cases/15-TagIndices/test_index_create_drop.py -,,y,.,./ci/pytest.sh pytest cases/15-TagIndices/test_index_overflow.py -,,y,.,./ci/pytest.sh pytest cases/15-TagIndices/test_index_perf.py - -# 16-Views -,,y,.,./ci/pytest.sh pytest cases/16-Views/test_view_basic.py -,,y,.,./ci/pytest.sh pytest cases/16-Views/test_view_mgmt.py -,,y,.,./ci/pytest.sh pytest cases/16-Views/test_view_nested_join.py - -# 17-DataSubscription - -## 01-Mgmt -,,y,.,./ci/pytest.sh pytest cases/17-DataSubscription/01-Mgmt/test_drop_lost_comsumers.py -,,y,.,./ci/pytest.sh pytest cases/17-DataSubscription/01-Mgmt/test_force_drop_topic.py -,,y,.,./ci/pytest.sh pytest cases/17-DataSubscription/01-Mgmt/test_tmq_drop_stb.py -,,y,.,./ci/pytest.sh pytest cases/17-DataSubscription/01-Mgmt/test_tmq_show.py -,,y,.,./ci/pytest.sh pytest cases/17-DataSubscription/01-Mgmt/test_topic.py -## 02-Consume -,,y,.,./ci/pytest.sh pytest cases/17-DataSubscription/02-Consume/test_subscribe_stb0.py -,,y,.,./ci/pytest.sh pytest cases/17-DataSubscription/02-Consume/test_subscribe_stb1.py -,,y,.,./ci/pytest.sh pytest cases/17-DataSubscription/02-Consume/test_subscribe_stb2.py -,,y,.,./ci/pytest.sh pytest cases/17-DataSubscription/02-Consume/test_subscribe_stb3.py -,,y,.,./ci/pytest.sh pytest cases/17-DataSubscription/02-Consume/test_subscribe_stb.py -,,y,.,./ci/pytest.sh pytest cases/17-DataSubscription/02-Consume/test_subscribe_stb4.py -,,y,.,./ci/pytest.sh pytest cases/17-DataSubscription/02-Consume/test_subscribe_db.py -N 3 --replica 3 -,,y,.,./ci/pytest.sh pytest cases/17-DataSubscription/02-Consume/test_subscribe_db0.py -N 3 --replica 3 -,,y,.,./ci/pytest.sh pytest cases/17-DataSubscription/02-Consume/test_subscribe_db1.py -,,y,.,./ci/pytest.sh pytest cases/17-DataSubscription/02-Consume/test_subscribe_db2.py -,,y,.,./ci/pytest.sh pytest cases/17-DataSubscription/02-Consume/test_subscribe_db3.py -,,y,.,./ci/pytest.sh pytest cases/17-DataSubscription/02-Consume/test_subscribe_db4.py -,,y,.,./ci/pytest.sh pytest cases/17-DataSubscription/02-Consume/test_tmq_basic.py -,,y,.,./ci/pytest.sh pytest cases/17-DataSubscription/02-Consume/test_tmq_bugs.py -N 3 -,,y,.,./ci/pytest.sh pytest cases/17-DataSubscription/02-Consume/test_tmq_topics_info.py -,,y,.,./ci/pytest.sh pytest cases/17-DataSubscription/02-Consume/test_tmq_max_topics.py -,,y,.,./ci/pytest.sh pytest cases/17-DataSubscription/02-Consume/test_tmq_update_tablelist.py -,,y,.,./ci/pytest.sh pytest cases/17-DataSubscription/02-Consume/test_tmq_params.py -,,y,.,./ci/pytest.sh pytest cases/17-DataSubscription/02-Consume/test_tmq_max_groups.py -,,y,.,./ci/pytest.sh pytest cases/17-DataSubscription/02-Consume/test_tmq_discontinuous_data.py -,,n,.,pytest cases/17-DataSubscription/02-Consume/test_tmq_offset.py -,,y,.,./ci/pytest.sh pytest cases/17-DataSubscription/02-Consume/test_tmq_primary_key.py -,,y,.,./ci/pytest.sh pytest cases/17-DataSubscription/02-Consume/test_tmq_drop_db_replica3.py -N 3 -,,y,.,./ci/pytest.sh pytest cases/17-DataSubscription/02-Consume/test_tmq_db_topic.py -,,y,.,./ci/pytest.sh pytest cases/17-DataSubscription/02-Consume/test_tmq_error.py -,,y,.,./ci/pytest.sh pytest cases/17-DataSubscription/02-Consume/test_tmq_schema.py -,,y,.,./ci/pytest.sh pytest cases/17-DataSubscription/02-Consume/test_tmq_stb_where_filter.py -,,y,.,./ci/pytest.sh pytest cases/17-DataSubscription/02-Consume/test_tmq_stb_filter.py -,,y,.,./ci/pytest.sh pytest cases/17-DataSubscription/02-Consume/test_tmq_check_data.py -,,y,.,./ci/pytest.sh pytest cases/17-DataSubscription/02-Consume/test_tmq_check_data_db.py -,,y,.,./ci/pytest.sh pytest cases/17-DataSubscription/02-Consume/test_tmq_alter_schema.py -,,y,.,./ci/pytest.sh pytest cases/17-DataSubscription/02-Consume/test_tmq_snapshot_basic.py -N 3 --replica 3 -,,y,.,./ci/pytest.sh pytest cases/17-DataSubscription/02-Consume/test_tmq_snapshot_filter.py -N 3 --replica 3 -,,y,.,./ci/pytest.sh pytest cases/17-DataSubscription/02-Consume/test_tmq_snapshot_single_ctb.py -,,y,.,./ci/pytest.sh pytest cases/17-DataSubscription/02-Consume/test_tmq_snapshot_single_ctb_filter.py -,,y,.,./ci/pytest.sh pytest cases/17-DataSubscription/02-Consume/test_tmq_snapshot_func_filter.py -,,y,.,./ci/pytest.sh pytest cases/17-DataSubscription/02-Consume/test_tmq_snapshot_func_filter2.py -,,y,.,./ci/pytest.sh pytest cases/17-DataSubscription/02-Consume/test_tmq_snapshot_multi_vg.py -,,y,.,./ci/pytest.sh pytest cases/17-DataSubscription/02-Consume/test_tmq_snapshot_multi_vg_filter.py -,,y,.,./ci/pytest.sh pytest cases/17-DataSubscription/02-Consume/test_tmq_snapshot_multi_ctb.py -,,y,.,./ci/pytest.sh pytest cases/17-DataSubscription/02-Consume/test_tmq_snapshot_multi_ctb_filter.py -,,y,.,./ci/pytest.sh pytest cases/17-DataSubscription/02-Consume/test_tmq_snapshot_func_filter_complex.py -,,y,.,./ci/pytest.sh pytest cases/17-DataSubscription/02-Consume/test_tmq_snapshot_func_filter_complex2.py -,,y,.,./ci/pytest.sh pytest cases/17-DataSubscription/02-Consume/test_tmq_auto_create_table.py -,,y,.,./ci/pytest.sh pytest cases/17-DataSubscription/02-Consume/test_tmq_dnode_restart.py -,,y,.,./ci/pytest.sh pytest cases/17-DataSubscription/02-Consume/test_tmq_dnode_restart2.py -,,y,.,./ci/pytest.sh pytest cases/17-DataSubscription/02-Consume/test_tmq_update_single_ctb.py -,,y,.,./ci/pytest.sh pytest cases/17-DataSubscription/02-Consume/test_tmq_update_while_consume.py -N 3 --replica 3 -,,y,.,./ci/pytest.sh pytest cases/17-DataSubscription/02-Consume/test_tmq_update_wal_mode.py -,,y,.,./ci/pytest.sh pytest cases/17-DataSubscription/02-Consume/test_tmq_update_snapshot_mode.py -,,y,.,./ci/pytest.sh pytest cases/17-DataSubscription/02-Consume/test_tmq_delete_single_ctb.py -,,y,.,./ci/pytest.sh pytest cases/17-DataSubscription/02-Consume/test_tmq_delete_multi_ctb.py -N 3 --replica 3 -,,y,.,./ci/pytest.sh pytest cases/17-DataSubscription/02-Consume/test_tmq_drop_ntb_wal.py -,,y,.,./ci/pytest.sh pytest cases/17-DataSubscription/02-Consume/test_tmq_drop_ntb_snapshot.py -,,y,.,./ci/pytest.sh pytest cases/17-DataSubscription/02-Consume/test_tmq_drop_stb_ctb.py -,,n,.,pytest cases/17-DataSubscription/02-Consume/test_tmq_drop_consumer.py -,,y,.,./ci/pytest.sh pytest cases/17-DataSubscription/02-Consume/test_tmq_udf.py -,,n,.,pytest cases/17-DataSubscription/02-Consume/test_tmq_udf_wal_mode.py -,,n,.,pytest cases/17-DataSubscription/02-Consume/test_tmq_udf_snapshot_mode.py -,,y,.,./ci/pytest.sh pytest cases/17-DataSubscription/02-Consume/test_tmq_stb_tag_filter.py -,,y,.,./ci/pytest.sh pytest cases/17-DataSubscription/02-Consume/test_tmq_tsdb_and_wal.py -N 3 --replica 3 -,,y,.,./ci/pytest.sh pytest cases/17-DataSubscription/02-Consume/test_tmq_tsdb_wal_multi_ctb.py -N 3 --replica 3 -,,y,.,./ci/pytest.sh pytest cases/17-DataSubscription/02-Consume/test_tmq_taosx.py -,,y,.,./ci/pytest.sh pytest cases/17-DataSubscription/02-Consume/test_tmq_meta_json.py -,,y,.,./ci/pytest.sh pytest cases/17-DataSubscription/02-Consume/test_tmq_seek_commit.py -,,y,.,./ci/pytest.sh pytest cases/17-DataSubscription/02-Consume/test_tmq_vnode_split_column.py -N 3 --replica 3 -,,y,.,./ci/pytest.sh pytest cases/17-DataSubscription/02-Consume/test_tmq_vnode_split_no_remove.py -N 3 --replica 3 -,,y,.,./ci/pytest.sh pytest cases/17-DataSubscription/02-Consume/test_tmq_vnode_split_db.py -N 3 --replica 3 -,,y,.,./ci/pytest.sh pytest cases/17-DataSubscription/02-Consume/test_tmq_vnode_split_db_no_wal.py -N 3 --replica 3 -,,y,.,./ci/pytest.sh pytest cases/17-DataSubscription/02-Consume/test_tmq_vnode_split_ntb.py -N 3 --replica 3 -,,y,.,./ci/pytest.sh pytest cases/17-DataSubscription/02-Consume/test_tmq_vnode_split_stb.py -N 3 --replica 3 -,,y,.,./ci/pytest.sh pytest cases/17-DataSubscription/02-Consume/test_tmq_vnode_split_stb_no_wal.py -N 3 --replica 3 -,,y,.,./ci/pytest.sh pytest cases/17-DataSubscription/02-Consume/test_tmq_vnode_split_stb_select.py -N 2 --replica 1 -,,y,.,./ci/pytest.sh pytest cases/17-DataSubscription/02-Consume/test_tmq_vnode_split_stb_select.py -N 3 --replica 3 -,,y,.,./ci/pytest.sh pytest cases/17-DataSubscription/02-Consume/test_tmq_vnode_split_duplicate.py -N 3 --replica 3 -,,y,.,./ci/pytest.sh pytest cases/17-DataSubscription/02-Consume/test_tmq_vnode_split_dup_no_wal.py -N 3 --replica 3 -,,y,.,./ci/pytest.sh pytest cases/17-DataSubscription/02-Consume/test_tmq_vnode_split_select_no_wal.py -N 3 --replica 3 -,,y,.,./ci/pytest.sh pytest cases/17-DataSubscription/02-Consume/test_tmq_vnode_transform_db.py -N 2 --replica 1 -,,y,.,./ci/pytest.sh pytest cases/17-DataSubscription/02-Consume/test_tmq_vnode_transform_db_wal.py -N 6 --replica 3 -,,y,.,./ci/pytest.sh pytest cases/17-DataSubscription/02-Consume/test_tmq_vnode_transform_stb.py -N 2 --replica 1 -,,y,.,./ci/pytest.sh pytest cases/17-DataSubscription/02-Consume/test_tmq_vnode_transform_stb.py -N 6 --replica 3 -,,y,.,./ci/pytest.sh pytest cases/17-DataSubscription/02-Consume/test_tmq_vnode_transform_stb_wal.py -N 6 --replica 3 -,,n,.,pytest cases/17-DataSubscription/02-Consume/test_tmq_consumer_group.py -,,y,.,./ci/pytest.sh pytest cases/17-DataSubscription/02-Consume/test_tmq_data_precision.py -,,y,.,./ci/pytest.sh pytest cases/17-DataSubscription/02-Consume/test_tmq_mnode_switch.py -N 6 -M 3 -I True -,,y,.,./ci/pytest.sh pytest cases/17-DataSubscription/02-Consume/test_tmq_mnode_switch.py -N 6 -M 3 --replica 3 -I True -,,y,.,./ci/pytest.sh pytest cases/17-DataSubscription/02-Consume/test_tmq_vnode_replicate.py -M 3 -N 3 --replica 3 -,,y,.,./ci/pytest.sh pytest cases/17-DataSubscription/02-Consume/test_tmq_subscribe_stb_r3.py -N 5 -,,y,.,./ci/pytest.sh pytest cases/17-DataSubscription/02-Consume/test_tmq_raw_block_interface.py -,,y,.,./ci/pytest.sh pytest cases/17-DataSubscription/02-Consume/test_tmq_replay.py -,,y,.,./ci/pytest.sh pytest cases/17-DataSubscription/02-Consume/test_tmq_wal_remove.py -N 3 -,,y,.,./ci/pytest.sh pytest cases/17-DataSubscription/02-Consume/test_tmq_stb_tag_multi_ctb.py -,,n,.,pytest cases/17-DataSubscription/02-Consume/test_tmq_restart.py -,,n,.,pytest cases/17-DataSubscription/02-Consume/test_tmq_cons1_v1_snapshot.py -,,n,.,pytest cases/17-DataSubscription/02-Consume/test_tmq_cons1_v1_t1.py -,,n,.,pytest cases/17-DataSubscription/02-Consume/test_tmq_cons1_v1_tn.py -,,n,.,pytest cases/17-DataSubscription/02-Consume/test_tmq_cons1_v4_t1.py -,,n,.,pytest cases/17-DataSubscription/02-Consume/test_tmq_cons1_v4_tn.py -,,n,.,pytest cases/17-DataSubscription/02-Consume/test_tmq_cons2_v1_overlap.py -,,n,.,pytest cases/17-DataSubscription/02-Consume/test_tmq_cons2_v1_snapshot.py -,,n,.,pytest cases/17-DataSubscription/02-Consume/test_tmq_cons2_v1_t1.py -,,n,.,pytest cases/17-DataSubscription/02-Consume/test_tmq_cons2_v1_tn.py -,,n,.,pytest cases/17-DataSubscription/02-Consume/test_tmq_cons2_v4_t1.py -,,n,.,pytest cases/17-DataSubscription/02-Consume/test_tmq_cons2_v4_tn.py -,,n,.,pytest cases/17-DataSubscription/02-Consume/test_tmq_params.py -## 03-MQTT -,,y,.,./ci/pytest.sh pytest cases/17-DataSubscription/03-MQTT/test_mqtt_smoking.py -,,y,.,./ci/pytest.sh pytest cases/17-DataSubscription/03-MQTT/test_mqtt_bnodes.py -N 2 -,,y,.,./ci/pytest.sh pytest cases/17-DataSubscription/03-MQTT/test_mqtt_bnodes.py -N 6 -,,y,.,./ci/pytest.sh pytest cases/17-DataSubscription/03-MQTT/test_mqtt_bnodes.py -N 11 -,,y,.,./ci/pytest.sh pytest cases/17-DataSubscription/03-MQTT/test_mqtt_qos.py -,,y,.,./ci/pytest.sh pytest cases/17-DataSubscription/03-MQTT/test_mqtt_special.py -,,y,.,./ci/pytest.sh pytest cases/17-DataSubscription/03-MQTT/test_mqtt_rb.py - -# 18-StreamProcessing - -## 01-Snode -,,y,.,./ci/pytest.sh pytest cases/18-StreamProcessing/01-Snode/test_snode_mgmt_basic.py -N 8 -,,y,.,./ci/pytest.sh pytest cases/18-StreamProcessing/01-Snode/test_snode_mgmt_replica3.py -N 6 --replica 3 -,,y,.,./ci/pytest.sh pytest cases/18-StreamProcessing/01-Snode/test_snode_mgmt_replicas.py -N 8 -,,y,.,./ci/pytest.sh pytest cases/18-StreamProcessing/01-Snode/test_snode_params_alter_value.py -,,y,.,./ci/pytest.sh pytest cases/18-StreamProcessing/01-Snode/test_snode_params_check_default.py -,,y,.,./ci/pytest.sh pytest cases/18-StreamProcessing/01-Snode/test_snode_params_check_maxvalue.py -,,y,.,./ci/pytest.sh pytest cases/18-StreamProcessing/01-Snode/test_snode_params_check_minvalue.py -,,y,.,./ci/pytest.sh pytest cases/18-StreamProcessing/01-Snode/test_snode_privileges_recalc.py -#,,y,.,./ci/pytest.sh pytest cases/18-StreamProcessing/01-Snode/test_snode_privileges_stream.py # PRIV_TODO -,,y,.,./ci/pytest.sh pytest cases/18-StreamProcessing/01-Snode/test_snode_privileges_systable.py -#,,y,.,./ci/pytest.sh pytest cases/18-StreamProcessing/01-Snode/test_snode_privileges_twodb.py # PRIV_TODO -## 02-Stream -,,y,.,./ci/pytest.sh pytest cases/18-StreamProcessing/02-Stream/stream_schema.py -,,y,.,./ci/pytest.sh pytest cases/18-StreamProcessing/02-Stream/stream_drop_table.py -,,y,.,./ci/pytest.sh pytest cases/18-StreamProcessing/02-Stream/stream_place_holder_column.py -,,y,.,./ci/pytest.sh pytest cases/18-StreamProcessing/02-Stream/stream_td37724.py -,,y,.,./ci/pytest.sh pytest cases/18-StreamProcessing/02-Stream/stream_6570600210.py -,,y,.,./ci/pytest.sh pytest cases/18-StreamProcessing/02-Stream/test_stream_check_name.py -,,y,.,./ci/pytest.sh pytest cases/18-StreamProcessing/02-Stream/test_stream_long_name.py -,,y,.,./ci/pytest.sh pytest cases/18-StreamProcessing/02-Stream/test_stream_no_snode.py -,,y,.,./ci/pytest.sh pytest cases/18-StreamProcessing/02-Stream/test_stream_same_name.py -,,y,.,./ci/pytest.sh pytest cases/18-StreamProcessing/02-Stream/test_stream_window_query.py -,,y,.,./ci/pytest.sh pytest cases/18-StreamProcessing/02-Stream/test_stream_output_table.py -,,y,.,./ci/pytest.sh pytest cases/18-StreamProcessing/02-Stream/stream_drop.py -,,y,.,./ci/pytest.sh pytest cases/18-StreamProcessing/02-Stream/stream_fetch.py -## 03-TriggerMode -#,,n,.,pytest cases/18-StreamProcessing/03-TriggerMode/test_count_new.py -,,y,.,./ci/pytest.sh pytest cases/18-StreamProcessing/03-TriggerMode/test_count.py -,,y,.,./ci/pytest.sh pytest cases/18-StreamProcessing/03-TriggerMode/test_event_new.py -,,y,.,./ci/pytest.sh pytest cases/18-StreamProcessing/03-TriggerMode/test_event.py -,,y,.,./ci/pytest.sh pytest cases/18-StreamProcessing/03-TriggerMode/test_fill_history.py -,,n,.,pytest cases/18-StreamProcessing/03-TriggerMode/test_period_1.py -,,n,.,pytest cases/18-StreamProcessing/03-TriggerMode/test_sliding.py -,,n,.,pytest cases/18-StreamProcessing/03-TriggerMode/test_state_new.py -#,,n,.,pytest cases/18-StreamProcessing/03-TriggerMode/test_state_disorder_update_new.py -,,y,.,./ci/pytest.sh pytest cases/18-StreamProcessing/03-TriggerMode/test_state_window_close.py -,,y,.,./ci/pytest.sh pytest cases/18-StreamProcessing/03-TriggerMode/test_state.py -,,y,.,./ci/pytest.sh pytest cases/18-StreamProcessing/03-TriggerMode/test_ts_7622.py -,,y,.,./ci/pytest.sh pytest cases/18-StreamProcessing/03-TriggerMode/test_window_true_for.py -## 04-Options -,,y,.,./ci/pytest.sh pytest cases/18-StreamProcessing/04-Options/test_abnormal_data_table.py -,,y,.,./ci/pytest.sh pytest cases/18-StreamProcessing/04-Options/test_abnormal_data_vtable.py -,,y,.,./ci/pytest.sh pytest cases/18-StreamProcessing/04-Options/test_meta_change_table.py -,,y,.,./ci/pytest.sh pytest cases/18-StreamProcessing/04-Options/test_meta_change_vtable.py -,,y,.,./ci/pytest.sh pytest cases/18-StreamProcessing/04-Options/test_options_abnormal.py -,,y,.,./ci/pytest.sh pytest cases/18-StreamProcessing/04-Options/test_options_basic.py -,,y,.,./ci/pytest.sh pytest cases/18-StreamProcessing/04-Options/test_options_ns.py -,,y,.,./ci/pytest.sh pytest cases/18-StreamProcessing/04-Options/test_options_us.py -,,y,.,./ci/pytest.sh pytest cases/18-StreamProcessing/04-Options/test_options_vtable.py -## 05-Notify -,,n,.,pytest cases/18-StreamProcessing/05-Notify/test_notify.py -## 06-ResultSaved -,,y,.,./ci/pytest.sh pytest cases/18-StreamProcessing/06-ResultSaved/test_result_saved_comprehensive.py -## 07-SubQuery -,,y,.,./ci/pytest.sh pytest cases/18-StreamProcessing/07-SubQuery/test_subquery_basic.py -100,,n,.,pytest cases/18-StreamProcessing/07-SubQuery/test_subquery_count_1.py -100,,n,.,pytest cases/18-StreamProcessing/07-SubQuery/test_subquery_count_2.py -100,,n,.,pytest cases/18-StreamProcessing/07-SubQuery/test_subquery_event.py -100,,n,.,pytest cases/18-StreamProcessing/07-SubQuery/test_subquery_sliding.py -100,,n,.,pytest cases/18-StreamProcessing/07-SubQuery/test_subquery_session.py -100,,n,.,pytest cases/18-StreamProcessing/07-SubQuery/test_subquery_state.py -,,y,.,./ci/pytest.sh pytest cases/18-StreamProcessing/07-SubQuery/test_subquery_state_filter_agg.py -,,y,.,./ci/pytest.sh pytest cases/18-StreamProcessing/07-SubQuery/test_subquery_usage_restrict.py -,,y,.,./ci/pytest.sh pytest cases/18-StreamProcessing/07-SubQuery/test_subquery_vtable_change.py -,,y,.,./ci/pytest.sh pytest cases/18-StreamProcessing/07-SubQuery/test_subquery_state_join_empty_result.py -## 08-Recalc -,,y,.,./ci/pytest.sh pytest cases/18-StreamProcessing/08-Recalc/test_recalc_combined_options.py -,,y,.,./ci/pytest.sh pytest cases/18-StreamProcessing/08-Recalc/test_recalc_delete_recalc.py -,,y,.,./ci/pytest.sh pytest cases/18-StreamProcessing/08-Recalc/test_recalc_expired_time.py -,,y,.,./ci/pytest.sh pytest cases/18-StreamProcessing/08-Recalc/test_recalc_ignore_disorder.py -,,y,.,./ci/pytest.sh pytest cases/18-StreamProcessing/08-Recalc/test_recalc_manual_basic.py -,,y,.,./ci/pytest.sh pytest cases/18-StreamProcessing/08-Recalc/test_recalc_manual_with_options.py -,,y,.,./ci/pytest.sh pytest cases/18-StreamProcessing/08-Recalc/test_recalc_watermark.py -,,y,.,./ci/pytest.sh pytest cases/18-StreamProcessing/08-Recalc/recalc_bug_13.py - -## 20-UseCase -,,y,.,./ci/pytest.sh pytest cases/18-StreamProcessing/20-UseCase/test_6771200393.py -,,y,.,./ci/pytest.sh pytest cases/18-StreamProcessing/20-UseCase/test_idmp_privilege.py -,,y,.,./ci/pytest.sh pytest cases/18-StreamProcessing/20-UseCase/test_idmp_manager.py -100,,y,.,./ci/pytest.sh pytest cases/18-StreamProcessing/20-UseCase/test_idmp_meters.py -,,n,.,pytest cases/18-StreamProcessing/20-UseCase/test_idmp_public.py -,,n,.,pytest cases/18-StreamProcessing/20-UseCase/test_idmp_pv.py -,,n,.,pytest cases/18-StreamProcessing/20-UseCase/test_idmp_tobacco.py -,,y,.,./ci/pytest.sh pytest cases/18-StreamProcessing/20-UseCase/test_idmp_vehicle.py -,,y,.,./ci/pytest.sh pytest cases/18-StreamProcessing/20-UseCase/test_idmp_yuxi.py -,,n,.,pytest cases/18-StreamProcessing/20-UseCase/test_nevados.py -,,y,.,./ci/pytest.sh pytest cases/18-StreamProcessing/20-UseCase/test_three_gorges_case4.py -,,y,.,./ci/pytest.sh pytest cases/18-StreamProcessing/20-UseCase/test_three_gorges_case5.py -,,n,.,pytest cases/18-StreamProcessing/20-UseCase/test_three_gorges_phase1.py -,,y,.,./ci/pytest.sh pytest cases/18-StreamProcessing/20-UseCase/test_three_gorges_second_case1.py -,,y,.,./ci/pytest.sh pytest cases/18-StreamProcessing/20-UseCase/test_three_gorges_second_case2.py -,,y,.,./ci/pytest.sh pytest cases/18-StreamProcessing/20-UseCase/test_three_gorges_second_case3.py -,,y,.,./ci/pytest.sh pytest cases/18-StreamProcessing/20-UseCase/test_three_gorges_second_case4.py -,,y,.,./ci/pytest.sh pytest cases/18-StreamProcessing/20-UseCase/test_three_gorges_second_case6.py -,,y,.,./ci/pytest.sh pytest cases/18-StreamProcessing/20-UseCase/test_three_gorges_second_case17.py -,,y,.,./ci/pytest.sh pytest cases/18-StreamProcessing/20-UseCase/test_three_gorges_second_case18.py -,,y,.,./ci/pytest.sh pytest cases/18-StreamProcessing/20-UseCase/test_three_gorges_second_case19.py -,,y,.,./ci/pytest.sh pytest cases/18-StreamProcessing/20-UseCase/test_three_gorges_second_case19_bug1.py -,,y,.,./ci/pytest.sh pytest cases/18-StreamProcessing/20-UseCase/test_three_gorges_second_case22.py -## 21-Stability -## 22-Performance -## 23-Compatibility -100,,n,.,pytest cases/18-StreamProcessing/23-Compatibility/test_compatibility_backward_forward_part1.py -100,,n,.,pytest cases/18-StreamProcessing/23-Compatibility/test_compatibility_backward_forward_part2.py -100,,n,.,pytest cases/18-StreamProcessing/23-Compatibility/test_compatibility_backward_forward_part3.py -100,,n,.,pytest cases/18-StreamProcessing/23-Compatibility/test_compatibility_backward_forward_part4.py -,,n,.,pytest cases/18-StreamProcessing/23-Compatibility/test_compatibility_cross_version.py -,,n,.,pytest cases/18-StreamProcessing/23-Compatibility/test_new_stream_compatibility.py -## 30-OldPyCases -,,y,.,./ci/pytest.sh pytest cases/18-StreamProcessing/30-OldPyCases/test_oldcase_at_once.py -,,n,.,pytest cases/18-StreamProcessing/30-OldPyCases/test_oldcase_backquote_check.py -,,y,.,./ci/pytest.sh pytest cases/18-StreamProcessing/30-OldPyCases/test_oldcase_checkpoint_info.py -N 4 -,,y,.,./ci/pytest.sh pytest cases/18-StreamProcessing/30-OldPyCases/test_oldcase_drop.py -,,y,.,./ci/pytest.sh pytest cases/18-StreamProcessing/30-OldPyCases/test_oldcase_empty_identifier.py -,,n,.,pytest cases/18-StreamProcessing/30-OldPyCases/test_oldcase_math_func.py -,,n,.,pytest cases/18-StreamProcessing/30-OldPyCases/test_oldcase_snode_restart_with_checkpoint.py -N 4 -,,n,.,pytest cases/18-StreamProcessing/30-OldPyCases/test_oldcase_state_window.py -,,y,.,./ci/pytest.sh pytest cases/18-StreamProcessing/30-OldPyCases/test_oldcase_stream_basic.py -,,y,.,./ci/pytest.sh pytest cases/18-StreamProcessing/30-OldPyCases/test_oldcase_stream_multi_agg.py -,,n,.,pytest cases/18-StreamProcessing/30-OldPyCases/test_oldcase_string_func.py -,,n,.,pytest cases/18-StreamProcessing/30-OldPyCases/test_oldcase_taosdShell.py -## 31-OldCases -,,n,.,pytest cases/18-StreamProcessing/31-OldTsimCases/test_oldcase_basic1.py -,,n,.,pytest cases/18-StreamProcessing/31-OldTsimCases/test_oldcase_basic2.py -,,n,.,pytest cases/18-StreamProcessing/31-OldTsimCases/test_oldcase_check.py -,,n,.,pytest cases/18-StreamProcessing/31-OldTsimCases/test_oldcase_checkpoint.py -,,n,.,pytest cases/18-StreamProcessing/31-OldTsimCases/test_oldcase_concat.py -,,n,.,pytest cases/18-StreamProcessing/31-OldTsimCases/test_oldcase_continuewindowclose.py -,,n,.,pytest cases/18-StreamProcessing/31-OldTsimCases/test_oldcase_state.py -,,y,.,./ci/pytest.sh pytest cases/18-StreamProcessing/31-OldTsimCases/test_oldcase_twa.py -## 99-Others -,,y,.,./ci/pytest.sh pytest cases/18-StreamProcessing/99-Others/test_stream_tag_cache.py -,,y,.,./ci/pytest.sh pytest cases/18-StreamProcessing/99-Others/test_out_table.py - - -# 19-TSMAs - -,,y,.,./ci/pytest.sh pytest cases/19-TSMAs/test_tsma.py -,,y,.,./ci/pytest.sh pytest cases/19-TSMAs/test_sma_basic.py -N 3 -,,y,.,./ci/pytest.sh pytest cases/19-TSMAs/test_sma_bugs.py -,,y,.,./ci/pytest.sh pytest cases/19-TSMAs/test_time_range_wise.py -N 3 - -# 20-RSMAs - -90,,y,.,./ci/pytest.sh pytest cases/20-RSMAs/test_rsma.py - -# 21-MetaData -,,y,.,./ci/pytest.sh pytest cases/21-MetaData/test_meta_bugs.py -N 3 -,,y,.,./ci/pytest.sh pytest cases/21-MetaData/test_meta_change.py -N 3 -M 3 -,,y,.,./ci/pytest.sh pytest cases/21-MetaData/test_meta_information_schema.py -,,y,.,./ci/pytest.sh pytest cases/21-MetaData/test_meta_ins_tables.py - -# 22-PerformanceData - -,,y,.,./ci/pytest.sh pytest cases/22-PerformanceData/test_performance_schema.py - -# 23-ShowCommands - -,,y,.,./ci/pytest.sh pytest cases/23-ShowCommands/test_show_alive.py -N 4 -,,y,.,./ci/pytest.sh pytest cases/23-ShowCommands/test_show_basic.py -N 3 -,,y,.,./ci/pytest.sh pytest cases/23-ShowCommands/test_show_create_db.py -,,y,.,./ci/pytest.sh pytest cases/23-ShowCommands/test_show_diskinfo.py -,,y,.,./ci/pytest.sh pytest cases/23-ShowCommands/test_show_table_distributed.py -,,y,.,./ci/pytest.sh pytest cases/23-ShowCommands/test_show_tables.py -,,y,.,./ci/pytest.sh pytest cases/23-ShowCommands/test_show_transaction.py -N 3 -,,y,.,./ci/pytest.sh pytest cases/23-ShowCommands/test_show_vgroups_ready.py -N 3 - -# 24-Users - -,,y,.,./ci/pytest.sh pytest cases/24-Users/test_user_basic.py -,,y,.,./ci/pytest.sh pytest cases/24-Users/test_user_control.py -,,y,.,./ci/pytest.sh pytest cases/24-Users/test_user_crypted_pass.py -,,y,.,./ci/pytest.sh pytest cases/24-Users/test_user_manager.py -,,y,.,./ci/pytest.sh pytest cases/24-Users/test_user_password.py -,,y,.,./ci/pytest.sh pytest cases/24-Users/test_user_privilege_create_db.py -,,y,.,./ci/pytest.sh pytest cases/24-Users/test_user_privilege_db.py -,,y,.,./ci/pytest.sh pytest cases/24-Users/test_user_privilege_sysinfo.py -,,y,.,./ci/pytest.sh pytest cases/24-Users/test_user_privilege_table.py -,,y,.,./ci/pytest.sh pytest cases/24-Users/test_user_privilege_topic.py -,,y,.,./ci/pytest.sh pytest cases/24-Users/test_user_token.py -,,y,.,./ci/pytest.sh pytest cases/24-Users/test_user_totp.py -,,y,.,./ci/pytest.sh pytest cases/24-Users/test_user_whitelist.py -,,n,.,pytest cases/24-Users/test_user_passwd.py - -# 25-Privileges -,,y,.,./ci/pytest.sh pytest cases/25-Privileges/test_priv_basic.py -N 3 -,,y,.,./ci/pytest.sh pytest cases/25-Privileges/test_priv_bugs.py -N 3 -,,n,.,pytest cases/25-Privileges/test_priv_control.py -N 3 -,,y,.,./ci/pytest.sh pytest cases/25-Privileges/test_priv_rbac.py -,,y,.,./ci/pytest.sh pytest cases/25-Privileges/test_priv_subscribe.py - -# 26-NodeManager - -## 01-Dnode -,,y,.,./ci/pytest.sh pytest cases/26-NodeManager/01-Dnode/test_alter_dnode.py -,,y,.,./ci/pytest.sh pytest cases/26-NodeManager/01-Dnode/test_create_dnode.py -N 2 -C 1 -#failed,,y,.,./ci/pytest.sh pytest cases/26-NodeManager/01-Dnode/test_drop_dnode_force.py -N 5 -,,y,.,./ci/pytest.sh pytest cases/26-NodeManager/01-Dnode/test_drop_dnode_has_mnode.py -N 2 -,,y,.,./ci/pytest.sh pytest cases/26-NodeManager/01-Dnode/test_drop_dnode_has_multi_vnode_replica1.py -N 3 -,,y,.,./ci/pytest.sh pytest cases/26-NodeManager/01-Dnode/test_drop_dnode_has_multi_vnode_replica3.py -N 5 -,,y,.,./ci/pytest.sh pytest cases/26-NodeManager/01-Dnode/test_drop_dnode_has_qnode_snode.py -N 2 -#failed,,y,.,./ci/pytest.sh pytest cases/26-NodeManager/01-Dnode/test_drop_dnode_has_vnode_replica1.py -N 3 -,,y,.,./ci/pytest.sh pytest cases/26-NodeManager/01-Dnode/test_drop_dnode_has_vnode_replica3.py -N 5 -,,y,.,./ci/pytest.sh pytest cases/26-NodeManager/01-Dnode/test_offline_reason.py -N 2 -C 1 -#,,y,.,./ci/pytest.sh pytest cases/26-NodeManager/01-Dnode/test_use_dropped_dnode.py -N 3 -## 02-Mnode -,,y,.,./ci/pytest.sh pytest cases/26-NodeManager/02-Mnode/test_mnode_basic1.py -N 2 -,,y,.,./ci/pytest.sh pytest cases/26-NodeManager/02-Mnode/test_mnode_basic2.py -N 2 -,,y,.,./ci/pytest.sh pytest cases/26-NodeManager/02-Mnode/test_mnode_basic3.py -N 4 -,,y,.,./ci/pytest.sh pytest cases/26-NodeManager/02-Mnode/test_mnode_basic4.py -N 3 -,,y,.,./ci/pytest.sh pytest cases/26-NodeManager/02-Mnode/test_mnode_basic5.py -N 4 -,,y,.,./ci/pytest.sh pytest cases/26-NodeManager/02-Mnode/test_mnode_basic6.py -N 4 -## 03-Qnode -,,y,.,./ci/pytest.sh pytest cases/26-NodeManager/03-Qnode/test_qnode_basic.py -N 2 -## 04-Snode -,,y,.,./ci/pytest.sh pytest cases/26-NodeManager/04-Snode/test_snode_basic1.py -N 2 - -# 27-Mount -,,y,.,./ci/pytest.sh pytest cases/27-Mount/test_mount_basic.py - -# 28-Except - -# 29-Escape - -,,y,.,./ci/pytest.sh pytest cases/29-Escape/test_binary_escape_character.py - -# 30-NameLimits - -,,y,.,./ci/pytest.sh pytest cases/30-NameLimits/test_boundary.py -,,y,.,./ci/pytest.sh pytest cases/30-NameLimits/test_db_tb_name_check.py -,,y,.,./ci/pytest.sh pytest cases/30-NameLimits/test_dbtbname_validate.py - -# 31-Security - -,,y,.,./ci/pytest.sh pytest cases/31-Security/01-KeyGeneration/test_key_generation.py -,,y,.,./ci/pytest.sh pytest cases/31-Security/02-KeyUpdate/test_key_update.py -,,y,.,./ci/pytest.sh pytest cases/31-Security/03-KeyBackupRestore/test_key_backup_restore.py -,,y,.,./ci/pytest.sh pytest cases/31-Security/04-TransparentEncryption/test_transparent_encryption.py -,,y,.,./ci/pytest.sh pytest cases/31-Security/06-EncryptionStatus/test_encryption_status.py -,,y,.,./ci/pytest.sh pytest cases/31-Security/10-SecurityTest/test_plaintext_check.py - -# 42-xnode -,,y,.,./ci/pytest.sh pytest cases/42-Xnode/test_xnode.py -,,y,.,./ci/pytest.sh pytest cases/42-Xnode/test_xnode_systables.py -,,y,.,./ci/pytest.sh pytest cases/42-Xnode/test_xnode_lifecycle.py - -# 70-Cluster - -,,n,.,pytest cases/70-Cluster/test_cluster_arbitrator.py -N 3 -,,y,.,./ci/pytest.sh pytest cases/70-Cluster/test_cluster_basic.py -N 5 -,,y,.,./ci/pytest.sh pytest cases/70-Cluster/test_cluster_drop_table_by_uid.py -N 3 -,,y,.,./ci/pytest.sh pytest cases/70-Cluster/test_cluster_kill_restore_dnode.py -N 5 -,,y,.,./ci/pytest.sh pytest cases/70-Cluster/test_cluster_inc_snapshot.py -N 3 -,,y,.,./ci/pytest.sh pytest cases/70-Cluster/test_cluster_restore_dnode.py -N 5 -M 3 -,,y,.,./ci/pytest.sh pytest cases/70-Cluster/test_cluster_restore_vnode.py -N 5 -M 3 -,,y,.,./ci/pytest.sh pytest cases/70-Cluster/test_cluster_restore_mnode.py -N 5 -M 3 -,,y,.,./ci/pytest.sh pytest cases/70-Cluster/test_cluster_restore_qnode.py -N 5 -M 3 -,,y,.,./ci/pytest.sh pytest cases/70-Cluster/test_cluster_snapshot.py -N 3 -L 3 -D 2 -,,y,.,./ci/pytest.sh pytest cases/70-Cluster/test_cluster_split_vgroup_by_learner.py -N 3 -,,y,.,./ci/pytest.sh pytest cases/70-Cluster/test_cluster_threads.py -,,y,.,./ci/pytest.sh pytest cases/70-Cluster/test_cluster_threads.py -N 3 --replica 3 -R -,,y,.,./ci/pytest.sh pytest cases/70-Cluster/test_cluster_tsdb_snapshot.py -N 3 -M 3 -,,y,.,./ci/pytest.sh pytest cases/70-Cluster/test_6dnode3mnode_insert_less_data_alter_rep3to1to3.py -N 6 -M 3 -,,y,.,./ci/pytest.sh pytest cases/70-Cluster/test_4dnode1mnode_basic_create_db_replica1.py -N 4 -M 1 -,,y,.,./ci/pytest.sh pytest cases/70-Cluster/test_4dnode1mnode_basic_replica1_insertdatas.py -N 4 -M 1 -,,y,.,./ci/pytest.sh pytest cases/70-Cluster/test_4dnode1mnode_basic_replica1_insertdatas_querys.py -N 4 -M 1 -,,y,.,./ci/pytest.sh pytest cases/70-Cluster/test_4dnode1mnode_basic_replica3_insertdatas.py -N 4 -M 1 -,,y,.,./ci/pytest.sh pytest cases/70-Cluster/test_4dnode1mnode_basic_replica3_insertdatas_querys.py -N 4 -M 1 -,,y,.,./ci/pytest.sh pytest cases/70-Cluster/test_4dnode1mnode_basic_replica3_vgroups.py -N 4 -M 1 -,,y,.,./ci/pytest.sh pytest cases/70-Cluster/test_5dnode1mnode.py -,,y,.,./ci/pytest.sh pytest cases/70-Cluster/test_5dnode2mnode.py -N 5 -,,y,.,./ci/pytest.sh pytest cases/70-Cluster/test_5dnode3mnode_stop.py -N 5 -M 3 -,,y,.,./ci/pytest.sh pytest cases/70-Cluster/test_5dnode3mnode_stop.py -N 5 -M 3 -I False -,,y,.,./ci/pytest.sh pytest cases/70-Cluster/test_5dnode3mnode_stop_2follower.py -N 5 -M 3 -,,y,.,./ci/pytest.sh pytest cases/70-Cluster/test_5dnode3mnode_stop_2follower.py -N 5 -M 3 -I False -,,y,.,./ci/pytest.sh pytest cases/70-Cluster/test_5dnode3mnode_stop_loop.py -N 5 -M 3 -,,y,.,./ci/pytest.sh pytest cases/70-Cluster/test_5dnode3mnode_sep1_vnode_stop_dnode_create_db.py -N 6 -M 3 -,,y,.,./ci/pytest.sh pytest cases/70-Cluster/test_5dnode3mnode_sep1_vnode_stop_dnode_create_db.py -N 6 -M 3 --replica 3 -,,y,.,./ci/pytest.sh pytest cases/70-Cluster/test_5dnode3mnode_sep1_vnode_stop_mnode_create_db.py -N 6 -M 3 -,,y,.,./ci/pytest.sh pytest cases/70-Cluster/test_5dnode3mnode_sep1_vnode_stop_mnode_create_db.py -N 6 -M 3 --replica 3 -,,y,.,./ci/pytest.sh pytest cases/70-Cluster/test_5dnode3mnode_sep1_vnode_stop_vnode_create_db.py -N 6 -M 3 -,,y,.,./ci/pytest.sh pytest cases/70-Cluster/test_5dnode3mnode_sep1_vnode_stop_vnode_create_db.py -N 6 -M 3 --replica 3 -,,y,.,./ci/pytest.sh pytest cases/70-Cluster/test_5dnode3mnode_sep1_vnode_stop_dnode_modify_meta.py -N 6 -M 3 -,,y,.,./ci/pytest.sh pytest cases/70-Cluster/test_5dnode3mnode_sep1_vnode_stop_mnode_modify_meta.py -N 6 -M 3 -,,y,.,./ci/pytest.sh pytest cases/70-Cluster/test_5dnode3mnode_sep1_vnode_stop_dnode_create_stb.py -N 6 -M 3 -,,y,.,./ci/pytest.sh pytest cases/70-Cluster/test_5dnode3mnode_sep1_vnode_stop_dnode_create_stb.py -N 6 -M 3 --replica 3 -,,y,.,./ci/pytest.sh pytest cases/70-Cluster/test_5dnode3mnode_sep1_vnode_stop_mnode_create_stb.py -N 6 -M 3 -,,y,.,./ci/pytest.sh pytest cases/70-Cluster/test_5dnode3mnode_sep1_vnode_stop_mnode_create_stb.py -N 6 -M 3 --replica 3 -,,y,.,./ci/pytest.sh pytest cases/70-Cluster/test_5dnode3mnode_sep1_vnode_stop_vnode_create_stb.py -N 6 -M 3 -,,y,.,./ci/pytest.sh pytest cases/70-Cluster/test_5dnode3mnode_sep1_vnode_stop_vnode_create_stb.py -N 6 -M 3 --replica 3 -,,y,.,./ci/pytest.sh pytest cases/70-Cluster/test_5dnode3mnode_restart_dnode_insert_data.py -N 6 -M 3 -,,y,.,./ci/pytest.sh pytest cases/70-Cluster/test_5dnode3mnode_restart_dnode_insert_data.py -N 6 -M 3 --replica 3 -,,y,.,./ci/pytest.sh pytest cases/70-Cluster/test_5dnode3mnode_restart_dnode_insert_data_async.py -N 6 -M 3 -,,y,.,./ci/pytest.sh pytest cases/70-Cluster/test_5dnode3mnode_add_1dnode.py -N 7 -M 3 -C 6 -,,y,.,./ci/pytest.sh pytest cases/70-Cluster/test_5dnode3mnode_add_1dnode.py -N 7 -M 3 -C 6 --replica 3 -,,y,.,./ci/pytest.sh pytest cases/70-Cluster/test_5dnode3mnode_recreate_mnode.py -N 6 -M 3 -,,y,.,./ci/pytest.sh pytest cases/70-Cluster/test_5dnode3mnode_stop_follower_leader.py -N 5 -M 3 -,,y,.,./ci/pytest.sh pytest cases/70-Cluster/test_compact_db_conflict.py -N 3 -,,y,.,./ci/pytest.sh pytest cases/70-Cluster/test_mnode_encrypt.py -N 3 -,,y,.,./ci/pytest.sh pytest cases/70-Cluster/test_5dnode_3mnode_add_1dnode.py -N 7 -M 3 -C 6 -,,y,.,./ci/pytest.sh pytest cases/70-Cluster/test_5dnode_3mnode_add_1dnode.py -N 7 -M 3 -C 6 --replica 3 -,,y,.,./ci/pytest.sh pytest cases/70-Cluster/test_5dnode_3mnode_stop.py -N 5 -M 3 -,,y,.,./ci/pytest.sh pytest cases/70-Cluster/test_5dnode_3mnode_stop.py -N 5 -M 3 -I False - - -# 80-Components - -# 01-Taosd -,,n,.,pytest cases/80-Components/01-Taosd/test_com_cmdline.py -,,n,.,pytest cases/80-Components/01-Taosd/test_com_taosd_log.py -,,y,.,./ci/pytest.sh pytest cases/80-Components/01-Taosd/test_com_config.py -N 3 -,,y,.,./ci/pytest.sh pytest cases/80-Components/01-Taosd/test_com_config_refresh.py -N 3 -,,y,.,./ci/pytest.sh pytest cases/80-Components/01-Taosd/test_com_config_refresh.py -N 3 -M 3 -,,y,.,./ci/pytest.sh pytest cases/80-Components/01-Taosd/test_com_persisit_config.py -,,y,.,./ci/pytest.sh pytest cases/80-Components/01-Taosd/test_com_taosd_audit.py -,,y,.,./ci/pytest.sh pytest cases/80-Components/01-Taosd/test_com_taosd_monitor.py -,,y,.,./ci/pytest.sh pytest cases/80-Components/01-Taosd/test_com_taosd_restart.py -,,y,.,./ci/pytest.sh pytest cases/80-Components/01-Taosd/test_com_telemetry.py - -# 02-Taosc -,,y,.,./ci/pytest.sh pytest cases/80-Components/02-Taosc/test_com_count_always_return_value.py -,,y,.,./ci/pytest.sh pytest cases/80-Components/02-Taosc/test_com_taosc_hot_refresh_config.py - -# 81-Tools - -## 01-Check -,,y,.,./ci/pytest.sh pytest cases/81-Tools/01-Check/test_check_error_code.py -,,y,.,./ci/pytest.sh pytest cases/81-Tools/01-Check/test_check_scan.py -,,y,.,./ci/pytest.sh pytest cases/81-Tools/01-Check/test_check_systb_inspect.py - -## 02-Taos -,,y,.,./ci/pytest.sh pytest cases/81-Tools/02-Taos/test_tool_taos_cli.py -B -,,n,.,pytest cases/81-Tools/02-Taos/test_tool_cmdline.py -,,y,.,./ci/pytest.sh pytest cases/81-Tools/02-Taos/test_tool_taos_shell.py -,,y,.,./ci/pytest.sh pytest cases/81-Tools/02-Taos/test_tool_taos_shell_error.py -,,y,.,./ci/pytest.sh pytest cases/81-Tools/02-Taos/test_tool_taos_shell_net_chk.py -## 03-Benchmark -,,n,pytest cases/81-Tools/03-Benchmark/test_benchmark_basic.py -,,y,.,./ci/pytest.sh pytest cases/81-Tools/03-Benchmark/test_benchmark_bugs.py -B -,,y,.,./ci/pytest.sh pytest cases/81-Tools/03-Benchmark/test_benchmark_commandline.py -,,y,.,./ci/pytest.sh pytest cases/81-Tools/03-Benchmark/test_benchmark_conn_mode.py -B -,,y,.,./ci/pytest.sh pytest cases/81-Tools/03-Benchmark/test_benchmark_datatypes.py -90,,y,.,./ci/pytest.sh pytest cases/81-Tools/03-Benchmark/test_benchmark_except.py -,,y,.,./ci/pytest.sh pytest cases/81-Tools/03-Benchmark/test_benchmark_mix.py -,,y,.,./ci/pytest.sh pytest cases/81-Tools/03-Benchmark/test_benchmark_query_main.py -,,y,.,./ci/pytest.sh pytest cases/81-Tools/03-Benchmark/test_benchmark_query_rest.py -B -,,y,.,./ci/pytest.sh pytest cases/81-Tools/03-Benchmark/test_benchmark_query_sqlfile.py -,,n,.,pytest cases/81-Tools/03-Benchmark/test_benchmark_rest.py -B -,,n,.,pytest cases/81-Tools/03-Benchmark/test_benchmark_sml.py -,,n,.,pytest cases/81-Tools/03-Benchmark/test_benchmark_stmt.py -,,y,.,./ci/pytest.sh pytest cases/81-Tools/03-Benchmark/test_benchmark_tag_order_sml.py -,,y,.,./ci/pytest.sh pytest cases/81-Tools/03-Benchmark/test_benchmark_tag_order_sql.py -,,y,.,./ci/pytest.sh pytest cases/81-Tools/03-Benchmark/test_benchmark_tag_order_stmt2.py -,,y,.,./ci/pytest.sh pytest cases/81-Tools/03-Benchmark/test_benchmark_tag_order_stmt.py -,,y,.,./ci/pytest.sh pytest cases/81-Tools/03-Benchmark/test_benchmark_taosc.py -# TD-38727: Temporarily disable memory leak detection for test_benchmark_tmq tests -# ,,y,.,./ci/pytest.sh pytest cases/81-Tools/03-Benchmark/test_benchmark_tmq.py -,,n,.,pytest cases/81-Tools/03-Benchmark/test_benchmark_tmq.py -,,y,.,./ci/pytest.sh pytest cases/81-Tools/03-Benchmark/test_benchmark_website.py -,,y,.,./ci/pytest.sh pytest cases/81-Tools/03-Benchmark/test_benchmark_with_csv.py -## 04-Taosdump -,,y,.,./ci/pytest.sh pytest cases/81-Tools/04-Taosdump/test_taosdump_basic.py -B -,,y,.,./ci/pytest.sh pytest cases/81-Tools/04-Taosdump/test_taosdump_bugs.py -B -#,,y,.,./ci/pytest.sh pytest cases/81-Tools/04-Taosdump/test_taosdump_commandline.py -B # PRIV_TODO -,,y,.,./ci/pytest.sh pytest cases/81-Tools/04-Taosdump/test_taosdump_compa.py -,,y,.,./ci/pytest.sh pytest cases/81-Tools/04-Taosdump/test_taosdump_datatypes.py -B -,,y,.,./ci/pytest.sh pytest cases/81-Tools/04-Taosdump/test_taosdump_precision.py -,,y,.,./ci/pytest.sh pytest cases/81-Tools/04-Taosdump/test_taosdump_primarykey.py -B -,,y,.,./ci/pytest.sh pytest cases/81-Tools/04-Taosdump/test_taosdump_privilege.py -,,y,.,./ci/pytest.sh pytest cases/81-Tools/04-Taosdump/test_taosdump_except.py -B -,,y,.,./ci/pytest.sh pytest cases/81-Tools/04-Taosdump/test_taosdump_schema_change.py -B - -## 05-Valgrind -,,y,.,./ci/pytest.sh pytest cases/81-Tools/05-Valgrind/test_valgrind_basic1.py -,,y,.,./ci/pytest.sh pytest cases/81-Tools/05-Valgrind/test_valgrind_basic2.py -,,y,.,./ci/pytest.sh pytest cases/81-Tools/05-Valgrind/test_valgrind_basic3.py -,,y,.,./ci/pytest.sh pytest cases/81-Tools/05-Valgrind/test_valgrind_basic4.py -,,y,.,./ci/pytest.sh pytest cases/81-Tools/05-Valgrind/test_valgrind_checkerror1.py -N 3 -,,y,.,./ci/pytest.sh pytest cases/81-Tools/05-Valgrind/test_valgrind_checkerror2.py -,,y,.,./ci/pytest.sh pytest cases/81-Tools/05-Valgrind/test_valgrind_checkerror3.py -,,y,.,./ci/pytest.sh pytest cases/81-Tools/05-Valgrind/test_valgrind_checkerror4.py -,,y,.,./ci/pytest.sh pytest cases/81-Tools/05-Valgrind/test_valgrind_checkerror5.py -,,y,.,./ci/pytest.sh pytest cases/81-Tools/05-Valgrind/test_valgrind_checkerror6.py -,,y,.,./ci/pytest.sh pytest cases/81-Tools/05-Valgrind/test_valgrind_checkerror7.py -,,y,.,./ci/pytest.sh pytest cases/81-Tools/05-Valgrind/test_valgrind_checkerror8.py -#,,y,.,./ci/pytest.sh pytest cases/81-Tools/05-Valgrind/test_valgrind_udf.py - -# 82-UnitTest - -200,,n,cases,bash 82-UnitTest/test.sh - -# 83-DocTest - -,,n,cases,bash 83-DocTest/c.sh -,,n,cases,bash 83-DocTest/python.sh -,,n,cases,bash 83-DocTest/node.sh -,,n,cases,bash 83-DocTest/csharp.sh -,,n,cases,bash 83-DocTest/jdbc.sh -,,n,cases,bash 83-DocTest/rust.sh -,,n,cases,bash 83-DocTest/go.sh -,,n,cases,bash 83-DocTest/test_R.sh - - -# ---------------------------- uncatalog -------------------------- - - -# army - -#newstm,,n,.,pytest cases/uncatalog/army/storage/ss/test_ss_basic.py -N 3 -#newstm,,y,.,./ci/pytest.sh pytest cases/uncatalog/army/stream/test_stream_vtable.py - -## system_test - -### 2-query -#newstm,,y,.,./ci/pytest.sh pytest cases/uncatalog/system-test/2-query/test_tsma.py -#newstm,,y,.,./ci/pytest.sh pytest cases/uncatalog/system-test/2-query/test_tsma2.py - -### 7-tmq -#,,y,.,./ci/pytest.sh pytest cases/uncatalog/system-test/7-tmq/test_tmqConsumerGroup.py -#memleak,,y,.,./ci/pytest.sh pytest cases/uncatalog/system-test/7-tmq/test_tmqUdf_multCtb_snapshot0.py -#memleak,,y,.,./ci/pytest.sh pytest cases/uncatalog/system-test/7-tmq/test_tmqUdf_multCtb_snapshot1.py -#,,n.,pytest cases/uncatalog/system-test/7-tmq/test_tmq_taosx.py From 87b2ca91e4e22705b8ac0b7a43fbbccaa172f265 Mon Sep 17 00:00:00 2001 From: chenhaoran Date: Sun, 8 Mar 2026 12:12:04 +0800 Subject: [PATCH 15/22] fix: enhance pytest command parsing with format validation and error logging --- test/ci/cases.task | 2 +- test/ci/run_win_cases.py | 14 +++++++++++++- test/ci/win_ignore_cases | 13 +++++++++++++ 3 files changed, 27 insertions(+), 2 deletions(-) diff --git a/test/ci/cases.task b/test/ci/cases.task index e37c5f0b5c71..538f3dbab09a 100644 --- a/test/ci/cases.task +++ b/test/ci/cases.task @@ -1003,7 +1003,7 @@ ,,y,.,./ci/pytest.sh pytest cases/81-Tools/02-Taos/test_tool_taos_shell_error.py ,,y,.,./ci/pytest.sh pytest cases/81-Tools/02-Taos/test_tool_taos_shell_net_chk.py ## 03-Benchmark -,,n,pytest cases/81-Tools/03-Benchmark/test_benchmark_basic.py +,,n,.,pytest cases/81-Tools/03-Benchmark/test_benchmark_basic.py ,,y,.,./ci/pytest.sh pytest cases/81-Tools/03-Benchmark/test_benchmark_bugs.py -B ,,y,.,./ci/pytest.sh pytest cases/81-Tools/03-Benchmark/test_benchmark_commandline.py ,,y,.,./ci/pytest.sh pytest cases/81-Tools/03-Benchmark/test_benchmark_conn_mode.py -B diff --git a/test/ci/run_win_cases.py b/test/ci/run_win_cases.py index 1450fc29c6e1..30327002567c 100644 --- a/test/ci/run_win_cases.py +++ b/test/ci/run_win_cases.py @@ -185,7 +185,19 @@ def cleanup_environment(phase=""): if not line or line.startswith('#'): continue - # 解析 pytest 命令 + # 解析 pytest 命令 - 格式: priority,rerunTimes,sanitizer(y/n),path,command + # 检查格式: 第三列是 y/n,第五列决定使用 ./ci/pytest.sh 还是 pytest + parts = line.split(',') + if len(parts) < 5: + logger.error(f"格式错误: 列数不足(应有5列,实际{len(parts)}列): {line}") + continue + + sanitizer = parts[2].strip() # 第三列: y 或 n + if sanitizer not in ('y', 'n'): + logger.error(f"格式错误: 第三列必须是 y 或 n, 实际为 '{sanitizer}': {line}") + continue + + # 根据原逻辑解析 if "ci/pytest.sh " in line: pytest_cmd = line.split("ci/pytest.sh ")[1] else: diff --git a/test/ci/win_ignore_cases b/test/ci/win_ignore_cases index f4d5aae2a348..4c9309f874a6 100644 --- a/test/ci/win_ignore_cases +++ b/test/ci/win_ignore_cases @@ -14,3 +14,16 @@ cases/17-DataSubscription/03-MQTT/test_mqtt_bnodes.py cases/17-DataSubscription/03-MQTT/test_mqtt_qos.py cases/17-DataSubscription/03-MQTT/test_mqtt_special.py cases/17-DataSubscription/03-MQTT/test_mqtt_rb.py + +# Unit Test +82-UnitTest/test.sh + +#docs Test +83-DocTest/c.sh +83-DocTest/python.sh +83-DocTest/node.sh +83-DocTest/csharp.sh +83-DocTest/jdbc.sh +83-DocTest/rust.sh +83-DocTest/go.sh +83-DocTest/test_R.sh \ No newline at end of file From cf2f97d725331336cda1d1f988e9b39e49564fed Mon Sep 17 00:00:00 2001 From: chenhaoran Date: Sun, 8 Mar 2026 14:12:55 +0800 Subject: [PATCH 16/22] fix: skip UnitTest/DocTest in pytest processing for Windows compatibility --- test/ci/run_win_cases.py | 37 +++++++++++++++++++++++++++---------- 1 file changed, 27 insertions(+), 10 deletions(-) diff --git a/test/ci/run_win_cases.py b/test/ci/run_win_cases.py index 30327002567c..31aaa98aac2b 100644 --- a/test/ci/run_win_cases.py +++ b/test/ci/run_win_cases.py @@ -185,6 +185,32 @@ def cleanup_environment(phase=""): if not line or line.startswith('#'): continue + # 先用 win_ignore_cases 匹配,统一处理需要跳过的 case + # 提取第五列 command,检查其路径部分是否在排除列表中 + should_skip = False + if len(exclusion_list) > 0: + parts = line.split(',') + if len(parts) >= 5: + command = parts[4].strip() + # 提取 command 中的路径部分进行匹配 + # 如 "pytest cases/xx/test.py" -> "cases/xx/test.py" + # 如 "bash 82-UnitTest/test.sh" -> "82-UnitTest/test.sh" + if command: + cmd_parts = command.split(' ') + # 取第一个参数之后的路径部分(支持 pytest xxx 或 bash xxx 格式) + for i in range(1, len(cmd_parts)): + if cmd_parts[i] in exclusion_list: + should_skip = True + break + + if should_skip: + skipped_cases += 1 + logger.info(f"Case in win_ignore_cases, skip: {line}") + result_str = f"Skip\t{line}\t\t\t\n" + with open(result_file, "a", encoding="utf-8") as rf: + rf.write(result_str) + continue + # 解析 pytest 命令 - 格式: priority,rerunTimes,sanitizer(y/n),path,command # 检查格式: 第三列是 y/n,第五列决定使用 ./ci/pytest.sh 还是 pytest parts = line.split(',') @@ -197,7 +223,7 @@ def cleanup_environment(phase=""): logger.error(f"格式错误: 第三列必须是 y 或 n, 实际为 '{sanitizer}': {line}") continue - # 根据原逻辑解析 + # 根据原逻辑解析 pytest 命令 if "ci/pytest.sh " in line: pytest_cmd = line.split("ci/pytest.sh ")[1] else: @@ -207,15 +233,6 @@ def cleanup_environment(phase=""): logger.warning(f"异常pytest命令: {pytest_cmd}") continue - case_base_name = pytest_cmd.split(" ")[1] - if case_base_name and len(exclusion_list) > 0 and case_base_name in exclusion_list: - skipped_cases += 1 - logger.info(f"Case {case_base_name} not support runnning on Windows. Skip test.") - result_str = f"Skip\t{pytest_cmd}\t\t\t\n" - with open(result_file, "a", encoding="utf-8") as rf: - rf.write(result_str) - continue - case_name = pytest_cmd.split("/")[-1].replace(" ", "_") total_cases += 1 log_file = os.path.join(log_dir, f"{case_name}.log") From 9dd372dd11b8f1fa44a71de86e0598a5099de906 Mon Sep 17 00:00:00 2001 From: chenhaoran Date: Sun, 8 Mar 2026 14:17:41 +0800 Subject: [PATCH 17/22] fix: enhance pytest command processing to skip cases in exclusion list --- test/ci/run_win_cases.py | 48 +++++++++++++++++++++++++++++++--------- 1 file changed, 38 insertions(+), 10 deletions(-) diff --git a/test/ci/run_win_cases.py b/test/ci/run_win_cases.py index 3e010c0a3b02..21d8886a1234 100644 --- a/test/ci/run_win_cases.py +++ b/test/ci/run_win_cases.py @@ -186,7 +186,44 @@ def cleanup_environment(phase=""): if not line or line.startswith('#'): continue - # 解析pytest命令 + # 先用 win_ignore_cases 匹配,统一处理需要跳过的 case + # 提取第五列 command,检查其路径部分是否在排除列表中 + should_skip = False + if len(exclusion_list) > 0: + parts = line.split(',') + if len(parts) >= 5: + command = parts[4].strip() + # 提取 command 中的路径部分进行匹配 + # 如 "pytest cases/xx/test.py" -> "cases/xx/test.py" + # 如 "bash 82-UnitTest/test.sh" -> "82-UnitTest/test.sh" + if command: + cmd_parts = command.split(' ') + for i in range(1, len(cmd_parts)): + if cmd_parts[i] in exclusion_list: + should_skip = True + break + + if should_skip: + skipped_cases += 1 + logger.info(f"Case in win_ignore_cases, skip: {line}") + result_str = f"Skip\t{line}\t\t\t\n" + with open(result_file, "a", encoding="utf-8") as rf: + rf.write(result_str) + continue + + # 解析 pytest 命令 - 格式: priority,rerunTimes,sanitizer(y/n),path,command + # 检查格式: 第三列是 y/n,第五列决定使用 ./ci/pytest.sh 还是 pytest + parts = line.split(',') + if len(parts) < 5: + logger.error(f"格式错误: 列数不足(应有5列,实际{len(parts)}列): {line}") + continue + + sanitizer = parts[2].strip() # 第三列: y 或 n + if sanitizer not in ('y', 'n'): + logger.error(f"格式错误: 第三列必须是 y 或 n, 实际为 '{sanitizer}': {line}") + continue + + # 根据原逻辑解析 pytest 命令 if "ci/pytest.sh " in line: pytest_cmd = line.split("ci/pytest.sh ")[1] else: @@ -196,15 +233,6 @@ def cleanup_environment(phase=""): logger.warning(f"异常pytest命令: {pytest_cmd}") continue - case_base_name = pytest_cmd.split(" ")[1] # 获取用例无参数名称用于与排除用例列表比对 - if case_base_name and len(exclusion_list) > 0 and case_base_name in exclusion_list: - skipped_cases += 1 - logger.info(f"Case {case_base_name} not support runnning on Windows. Skip test.") - result_str = f"Skip\t{pytest_cmd}\t\t\t\n" - with open(result_file, "a", encoding="utf-8") as rf: - rf.write(result_str) - continue - case_name = pytest_cmd.split("/")[-1].replace(" ", "_") # 获取用例名称 total_cases += 1 log_file = os.path.join(log_dir, f"{case_name}.log") From 3d9c9d041acbb7c30d11a32d4f3ddbd0e4f41a39 Mon Sep 17 00:00:00 2001 From: chenhaoran Date: Mon, 9 Mar 2026 11:03:07 +0800 Subject: [PATCH 18/22] fix: update clean_taos_process to include additional keywords and enhance cleanup diagnostics for Windows --- test/ci/run_win_cases.py | 24 +++++++++++++++++++----- 1 file changed, 19 insertions(+), 5 deletions(-) diff --git a/test/ci/run_win_cases.py b/test/ci/run_win_cases.py index 21d8886a1234..b4e8c870f05c 100644 --- a/test/ci/run_win_cases.py +++ b/test/ci/run_win_cases.py @@ -74,7 +74,7 @@ def clean_taos_process(keywords=None): :param keywords: List[str],用于匹配进程命令行的关键字列表。如果为 None,则默认匹配 'taos'。 """ if keywords is None: - keywords = ["taos", "taosd", "taosadapter", "taoskeeper", "taos-explorer", "taosx", "tmq_sim", "taosdump", "taosBenchmark" ] + keywords = ["taos", "taosd", "taosadapter", "taoskeeper", "taos-explorer", "taosx", "tmq_sim", "taosdump", "taosBenchmark", "write_raw_block_test" ] current_pid = os.getpid() @@ -168,16 +168,30 @@ def cleanup_environment(phase=""): # 1. 结束残留进程 clean_taos_process() - # 2. 等待句柄释放 - time.sleep(1) + # 2. 等待句柄释放(Windows 需要更长时间) + time.sleep(3) - # 3. 删除 sim 目录,失败则终止 + # 3. 删除 sim 目录,使用 safe_rmtree 带重试机制 if os.path.exists(work_dir): try: - shutil.rmtree(work_dir) + safe_rmtree(work_dir, retries=15, delay=2) logger.info(f"Removed {work_dir}") except Exception as e: logger.error(f"CRITICAL: Failed to remove {work_dir}: {e}") + # 列出占用文件的进程,帮助诊断 + if sys.platform == "win32": + try: + logger.info("Attempting to identify processes holding handles to work_dir...") + # 使用 psutil 检查是否有进程仍在使用该目录 + for proc in psutil.process_iter(['pid', 'name']): + try: + for item in proc.open_files(): + if work_dir in item.path: + logger.warning(f"Process {proc.pid} ({proc.name()}) is holding: {item.path}") + except (psutil.NoSuchProcess, psutil.AccessDenied): + pass + except Exception as diag_e: + logger.error(f"Failed to diagnose handle holders: {diag_e}") raise RuntimeError(f"Cleanup failed: cannot remove work_dir") from e with open(input_file, 'r', encoding="utf-8", errors="ignore") as f: From 8fc5cb15d237b6d45655f4331b8559717bc87575 Mon Sep 17 00:00:00 2001 From: chenhaoran Date: Mon, 9 Mar 2026 11:18:51 +0800 Subject: [PATCH 19/22] fix: add Valgrind test cases to win_ignore_cases for Windows CI compatibility --- test/ci/win_ignore_cases | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/test/ci/win_ignore_cases b/test/ci/win_ignore_cases index 4c9309f874a6..b02bc7df58d1 100644 --- a/test/ci/win_ignore_cases +++ b/test/ci/win_ignore_cases @@ -26,4 +26,19 @@ cases/17-DataSubscription/03-MQTT/test_mqtt_rb.py 83-DocTest/jdbc.sh 83-DocTest/rust.sh 83-DocTest/go.sh -83-DocTest/test_R.sh \ No newline at end of file +83-DocTest/test_R.sh + +# Valgrind not supported in Windows CI +cases/81-Tools/05-Valgrind/test_valgrind_basic1.py +cases/81-Tools/05-Valgrind/test_valgrind_basic2.py +cases/81-Tools/05-Valgrind/test_valgrind_basic3.py +cases/81-Tools/05-Valgrind/test_valgrind_basic4.py +cases/81-Tools/05-Valgrind/test_valgrind_checkerror1.py +cases/81-Tools/05-Valgrind/test_valgrind_checkerror2.py +cases/81-Tools/05-Valgrind/test_valgrind_checkerror3.py +cases/81-Tools/05-Valgrind/test_valgrind_checkerror4.py +cases/81-Tools/05-Valgrind/test_valgrind_checkerror5.py +cases/81-Tools/05-Valgrind/test_valgrind_checkerror6.py +cases/81-Tools/05-Valgrind/test_valgrind_checkerror7.py +cases/81-Tools/05-Valgrind/test_valgrind_checkerror8.py +cases/81-Tools/05-Valgrind/test_valgrind_udf.py \ No newline at end of file From 80f470295bfb289b32e4c1b710f5b2f9798fbf6c Mon Sep 17 00:00:00 2001 From: chenhaoran Date: Mon, 9 Mar 2026 11:49:09 +0800 Subject: [PATCH 20/22] fix: add test case for tmq_raw_block_interface to win_ignore_cases --- test/ci/win_ignore_cases | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/test/ci/win_ignore_cases b/test/ci/win_ignore_cases index b02bc7df58d1..cc48f5387559 100644 --- a/test/ci/win_ignore_cases +++ b/test/ci/win_ignore_cases @@ -1,3 +1,6 @@ +#failed cases +cases/17-DataSubscription/02-Consume/test_tmq_raw_block_interface.py + # udf not supported in Windows CI cases/12-UDFs/test_udf_test.py cases/12-UDFs/test_udf_create.py @@ -8,6 +11,7 @@ cases/uncatalog/system-test/0-others/test_udfpy_main.py cases/uncatalog/system-test/7-tmq/test_tmqUdf.py cases/uncatalog/system-test/7-tmq/test_tmqUdf_multCtb_snapshot0.py cases/uncatalog/system-test/7-tmq/test_tmqUdf_multCtb_snapshot1.py + # MQTT bnode not supported in Windows CI cases/17-DataSubscription/03-MQTT/test_mqtt_smoking.py cases/17-DataSubscription/03-MQTT/test_mqtt_bnodes.py From 5a45fef3d5c4b2c712a2ee264aa54a525827ab0c Mon Sep 17 00:00:00 2001 From: chenhaoran Date: Tue, 10 Mar 2026 18:18:00 +0800 Subject: [PATCH 21/22] fix: normalize keywords to lowercase in clean_taos_process function --- test/ci/run_win_cases.py | 1 + 1 file changed, 1 insertion(+) diff --git a/test/ci/run_win_cases.py b/test/ci/run_win_cases.py index b4e8c870f05c..5f7e639d2829 100644 --- a/test/ci/run_win_cases.py +++ b/test/ci/run_win_cases.py @@ -75,6 +75,7 @@ def clean_taos_process(keywords=None): """ if keywords is None: keywords = ["taos", "taosd", "taosadapter", "taoskeeper", "taos-explorer", "taosx", "tmq_sim", "taosdump", "taosBenchmark", "write_raw_block_test" ] + keywords = [k.lower() for k in keywords] current_pid = os.getpid() From 4e3c6f01712f69f7a00b8cd934cf75cab951b1d5 Mon Sep 17 00:00:00 2001 From: chenhaoran Date: Tue, 10 Mar 2026 21:14:15 +0800 Subject: [PATCH 22/22] fix: remove redundant import of signal in run_win_cases.py --- test/ci/run_win_cases.py | 1 - 1 file changed, 1 deletion(-) diff --git a/test/ci/run_win_cases.py b/test/ci/run_win_cases.py index 5f7e639d2829..6da7489aba88 100644 --- a/test/ci/run_win_cases.py +++ b/test/ci/run_win_cases.py @@ -8,7 +8,6 @@ import sys import zipfile import signal -import signal from datetime import datetime logging.basicConfig(level=logging.INFO,