aboutsummaryrefslogtreecommitdiff
path: root/xmake.lua
diff options
context:
space:
mode:
Diffstat (limited to 'xmake.lua')
-rw-r--r--xmake.lua162
1 files changed, 112 insertions, 50 deletions
diff --git a/xmake.lua b/xmake.lua
index d7a905981..1416fbb6a 100644
--- a/xmake.lua
+++ b/xmake.lua
@@ -348,7 +348,9 @@ task("test")
description = "Run Zen tests",
options = {
{'r', "run", "kv", "all", "Run test(s) - comma-separated", " - all", " - core", " - http", " - util", " - store", " - remotestore", " - server", " - integration"},
- {'j', "junit", "k", nil, "Enable junit report output"}
+ {'j', "junit", "k", nil, "Enable junit report output"},
+ {'n', "noskip", "k", nil, "Run skipped tests (passes --no-skip to doctest)"},
+ {nil, "repeat", "kv", nil, "Repeat tests N times (stops on first failure)"}
}
}
on_run(function()
@@ -418,6 +420,8 @@ task("test")
end
local use_junit_reporting = option.get("junit")
+ local use_noskip = option.get("noskip")
+ local repeat_count = tonumber(option.get("repeat")) or 1
local junit_report_files = {}
local junit_report_dir
@@ -451,10 +455,15 @@ task("test")
end
-- Left-align a string within a given width (with 1-space left margin)
- local function left_pad_str(s, width)
+ local function left_align_str(s, width)
return " " .. s .. string.rep(" ", width - #s - 1)
end
+ -- Right-align a string within a given width (with 1-space right margin)
+ local function right_align_str(s, width)
+ return string.rep(" ", width - #s - 1) .. s .. " "
+ end
+
-- Format elapsed seconds as a human-readable string
local function format_time(seconds)
if seconds >= 60 then
@@ -498,62 +507,78 @@ task("test")
os.mkdir(summary_dir)
-- Run each test suite and collect results
- for _, entry in ipairs(tests) do
- local name, target = entry.name, entry.target
- printf("=== %s ===\n", target)
-
- local suite_name = target
- if name == "server" then
- suite_name = "zenserver (test)"
+ for iteration = 1, repeat_count do
+ if repeat_count > 1 then
+ printf("\n*** Iteration %d/%d ***\n", iteration, repeat_count)
end
- local cmd = string.format("xmake run %s", target)
- if name == "server" then
- cmd = string.format("xmake run %s test", target)
- end
- cmd = string.format("%s --duration=true", cmd)
+ for _, entry in ipairs(tests) do
+ local name, target = entry.name, entry.target
+ printf("=== %s ===\n", target)
- if use_junit_reporting then
- local junit_report_file = path.join(junit_report_dir, string.format("junit-%s-%s-%s.xml", config.plat(), arch, target))
- junit_report_files[target] = junit_report_file
- cmd = string.format("%s --reporters=junit --out=%s", cmd, junit_report_file)
- end
+ local suite_name = target
+ if name == "server" then
+ suite_name = "zenserver (test)"
+ end
- -- Tell TestListener where to write the summary
- local summary_file = path.join(summary_dir, target .. ".txt")
- os.setenv("ZEN_TEST_SUMMARY_FILE", summary_file)
-
- -- Run test with real-time streaming output
- local test_ok = true
- try {
- function()
- os.exec(cmd)
- end,
- catch {
- function(errors)
- test_ok = false
- end
+ local cmd = string.format("xmake run %s", target)
+ if name == "server" then
+ cmd = string.format("xmake run %s test", target)
+ end
+ cmd = string.format("%s --duration=true", cmd)
+
+ if use_junit_reporting then
+ local junit_report_file = path.join(junit_report_dir, string.format("junit-%s-%s-%s.xml", config.plat(), arch, target))
+ junit_report_files[target] = junit_report_file
+ cmd = string.format("%s --reporters=junit --out=%s", cmd, junit_report_file)
+ end
+ if use_noskip then
+ cmd = string.format("%s --no-skip", cmd)
+ end
+
+ -- Tell TestListener where to write the summary
+ local summary_file = path.join(summary_dir, target .. ".txt")
+ os.setenv("ZEN_TEST_SUMMARY_FILE", summary_file)
+
+ -- Run test with real-time streaming output
+ local test_ok = true
+ try {
+ function()
+ os.exec(cmd)
+ end,
+ catch {
+ function(errors)
+ test_ok = false
+ end
+ }
}
- }
- -- Read summary written by TestListener
- local summary = parse_summary_file(summary_file)
- os.tryrm(summary_file)
+ -- Read summary written by TestListener
+ local summary = parse_summary_file(summary_file)
+ os.tryrm(summary_file)
+
+ if not test_ok then
+ any_failed = true
+ end
- if not test_ok then
- any_failed = true
+ table.insert(results, {
+ suite = suite_name,
+ cases_passed = summary and summary.cases_passed or 0,
+ cases_total = summary and summary.cases_total or 0,
+ asserts_passed = summary and summary.asserts_passed or 0,
+ asserts_total = summary and summary.asserts_total or 0,
+ elapsed_seconds = summary and summary.elapsed_seconds or 0,
+ failures = summary and summary.failures or {},
+ passed = test_ok
+ })
end
- table.insert(results, {
- suite = suite_name,
- cases_passed = summary and summary.cases_passed or 0,
- cases_total = summary and summary.cases_total or 0,
- asserts_passed = summary and summary.asserts_passed or 0,
- asserts_total = summary and summary.asserts_total or 0,
- elapsed_seconds = summary and summary.elapsed_seconds or 0,
- failures = summary and summary.failures or {},
- passed = test_ok
- })
+ if any_failed then
+ if repeat_count > 1 then
+ printf("\n*** Failure detected on iteration %d, stopping ***\n", iteration)
+ end
+ break
+ end
end
-- Clean up
@@ -580,6 +605,13 @@ task("test")
local col_time = #("Time")
local col_status = #("Status")
+ -- Compute totals
+ local total_cases_passed = 0
+ local total_cases_total = 0
+ local total_asserts_passed = 0
+ local total_asserts_total = 0
+ local total_elapsed = 0
+
for _, r in ipairs(results) do
col_suite = math.max(col_suite, #r.suite)
local cases_str = format_number(r.cases_passed) .. "/" .. format_number(r.cases_total)
@@ -589,8 +621,20 @@ task("test")
col_time = math.max(col_time, #format_time(r.elapsed_seconds))
local status_str = r.passed and "SUCCESS" or "FAILED"
col_status = math.max(col_status, #status_str)
+
+ total_cases_passed = total_cases_passed + r.cases_passed
+ total_cases_total = total_cases_total + r.cases_total
+ total_asserts_passed = total_asserts_passed + r.asserts_passed
+ total_asserts_total = total_asserts_total + r.asserts_total
+ total_elapsed = total_elapsed + r.elapsed_seconds
end
+ -- Account for totals row in column widths
+ col_suite = math.max(col_suite, #("Total"))
+ col_cases = math.max(col_cases, #(format_number(total_cases_passed) .. "/" .. format_number(total_cases_total)))
+ col_asserts = math.max(col_asserts, #(format_number(total_asserts_passed) .. "/" .. format_number(total_asserts_total)))
+ col_time = math.max(col_time, #format_time(total_elapsed))
+
-- Add padding (1 space each side)
col_suite = col_suite + 2
col_cases = col_cases + 2
@@ -621,8 +665,26 @@ task("test")
local asserts_str = format_number(r.asserts_passed) .. "/" .. format_number(r.asserts_total)
local time_str = format_time(r.elapsed_seconds)
local status_str = r.passed and "SUCCESS" or "FAILED"
- printf(" %s%s%s%s%s%s%s%s%s%s%s\n", vbar, left_pad_str(r.suite, col_suite), vbar, left_pad_str(cases_str, col_cases), vbar, left_pad_str(asserts_str, col_asserts), vbar, left_pad_str(time_str, col_time), vbar, left_pad_str(status_str, col_status), vbar)
+ printf(" %s%s%s%s%s%s%s%s%s%s%s\n", vbar, left_align_str(r.suite, col_suite), vbar, right_align_str(cases_str, col_cases), vbar, right_align_str(asserts_str, col_asserts), vbar, right_align_str(time_str, col_time), vbar, right_align_str(status_str, col_status), vbar)
end
+
+ -- Totals row
+ if #results > 1 then
+ local h_suite_eq = string.rep("=", col_suite)
+ local h_cases_eq = string.rep("=", col_cases)
+ local h_asserts_eq = string.rep("=", col_asserts)
+ local h_time_eq = string.rep("=", col_time)
+ local h_status_eq = string.rep("=", col_status)
+ local totals_sep = "+" .. h_suite_eq .. "+" .. h_cases_eq .. "+" .. h_asserts_eq .. "+" .. h_time_eq .. "+" .. h_status_eq .. "+"
+ printf(" %s\n", totals_sep)
+
+ local total_cases_str = format_number(total_cases_passed) .. "/" .. format_number(total_cases_total)
+ local total_asserts_str = format_number(total_asserts_passed) .. "/" .. format_number(total_asserts_total)
+ local total_time_str = format_time(total_elapsed)
+ local total_status_str = any_failed and "FAILED" or "SUCCESS"
+ printf(" %s%s%s%s%s%s%s%s%s%s%s\n", vbar, left_align_str("Total", col_suite), vbar, right_align_str(total_cases_str, col_cases), vbar, right_align_str(total_asserts_str, col_asserts), vbar, right_align_str(total_time_str, col_time), vbar, right_align_str(total_status_str, col_status), vbar)
+ end
+
printf(" %s\n", bottom)
end