summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorruki <[email protected]>2023-10-07 00:45:08 +0800
committerruki <[email protected]>2023-10-07 00:45:08 +0800
commite6373510a1fc487dd6652a5bc1cd74a966a8749c (patch)
treedcbd83f3cc32da90c39b1836a07548897c0da85e
parent621d6df885bc9ee832221f968ffcb07399d791fa (diff)
get tests
-rw-r--r--:w273
-rw-r--r--tests/actions/test/xmake.lua3
-rw-r--r--xmake/actions/test/main.lua21
-rw-r--r--xmake/actions/test/xmake.lua2
4 files changed, 296 insertions, 3 deletions
diff --git a/:w b/:w
new file mode 100644
index 000000000..1808a9c89
--- /dev/null
+++ b/:w
@@ -0,0 +1,273 @@
+--!A cross-platform build utility based on Lua
+--
+-- Licensed under the Apache License, Version 2.0 (the "License");
+-- you may not use this file except in compliance with the License.
+-- You may obtain a copy of the License at
+--
+-- http://www.apache.org/licenses/LICENSE-2.0
+--
+-- Unless required by applicable law or agreed to in writing, software
+-- distributed under the License is distributed on an "AS IS" BASIS,
+-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+-- See the License for the specific language governing permissions and
+-- limitations under the License.
+--
+-- Copyright (C) 2015-present, TBOOX Open Source Group.
+--
+-- @author ruki
+-- @file main.lua
+--
+
+-- imports
+import("core.base.option")
+import("core.base.task")
+import("core.project.config")
+import("core.base.global")
+import("core.project.project")
+import("core.platform.platform")
+import("devel.debugger")
+import("async.runjobs")
+import("private.action.run.runenvs")
+import("private.service.remote_build.action", {alias = "remote_build_action"})
+
+-- run target
+function _do_run_target(target)
+
+ -- only for binary program
+ if not target:is_binary() then
+ return
+ end
+
+ -- get the run directory of target
+ local rundir = target:rundir()
+
+ -- get the absolute target file path
+ local targetfile = path.absolute(target:targetfile())
+
+ -- build run environments
+ local addenvs, setenvs = runenvs.make(target)
+
+ -- get run arguments
+ local args = table.wrap(option.get("arguments") or target:get("runargs"))
+
+ -- debugging?
+ if option.get("debug") then
+ debugger.run(targetfile, args, {curdir = rundir, addenvs = addenvs, setenvs = setenvs})
+ else
+ local envs = runenvs.join(addenvs, setenvs)
+ os.execv(targetfile, args, {curdir = rundir, detach = option.get("detach"), envs = envs})
+ end
+end
+
+-- run target
+function _on_run_target(target)
+
+ -- build target with rules
+ local done = false
+ for _, r in ipairs(target:orderules()) do
+ local on_run = r:script("run")
+ if on_run then
+ on_run(target)
+ done = true
+ end
+ end
+ if done then return end
+
+ -- do run
+ _do_run_target(target)
+end
+
+-- recursively target add env
+function _add_target_pkgenvs(target, targets_added)
+ if targets_added[target:name()] then
+ return
+ end
+ targets_added[target:name()] = true
+ os.addenvs(target:pkgenvs())
+ for _, dep in ipairs(target:orderdeps()) do
+ _add_target_pkgenvs(dep, targets_added)
+ end
+end
+
+-- find target names matching a specific name
+function _find_matching_target_names(targetname)
+ targetname = targetname:lower()
+ local matching_targetnames = {}
+ for _, target in ipairs(project.ordertargets()) do
+ if target:name():lower():find(targetname, 1, true) then
+ table.insert(matching_targetnames, target:name())
+ end
+ end
+
+ table.sort(matching_targetnames)
+ return matching_targetnames
+end
+
+-- run the given target
+function _run(target)
+
+ -- has been disabled?
+ if not target:is_enabled() then
+ return
+ end
+
+ -- enter the environments of the target packages
+ local oldenvs = os.getenvs()
+ _add_target_pkgenvs(target, {})
+
+ -- the target scripts
+ local scripts =
+ {
+ target:script("run_before")
+ , function (target)
+ for _, r in ipairs(target:orderules()) do
+ local before_run = r:script("run_before")
+ if before_run then
+ before_run(target)
+ end
+ end
+ end
+ , target:script("run", _on_run_target)
+ , function (target)
+ for _, r in ipairs(target:orderules()) do
+ local after_run = r:script("run_after")
+ if after_run then
+ after_run(target)
+ end
+ end
+ end
+ , target:script("run_after")
+ }
+
+ -- run the target scripts
+ for i = 1, 5 do
+ local script = scripts[i]
+ if script ~= nil then
+ script(target)
+ end
+ end
+
+ -- leave the environments of the target packages
+ os.setenvs(oldenvs)
+end
+
+-- check targets
+function _check_targets(targetname, group_pattern)
+
+ -- get targets
+ local targets = {}
+ if targetname then
+ local target = project.target(targetname)
+ if not target then
+ -- check if the name is part of other target to help
+ local possible_targetnames = _find_matching_target_names(targetname)
+ local errors = targetname .. " is not a valid target name for this project"
+ if #possible_targetnames > 0 then
+ errors = errors .. "\nlist of valid target names close to your input:\n - " .. table.concat(possible_targetnames, '\n - ')
+ end
+ raise(errors)
+ end
+
+ table.insert(targets, target)
+ else
+ for _, target in ipairs(project.ordertargets()) do
+ if target:is_binary() or target:script("run") then
+ local group = target:get("group")
+ if (target:is_default() and not group_pattern) or option.get("all") or (group_pattern and group and group:match(group_pattern)) then
+ table.insert(targets, target)
+ end
+ end
+ end
+ end
+
+ -- filter and check targets with builtin-run script
+ local targetnames = {}
+ for _, target in ipairs(targets) do
+ if target:targetfile() and target:is_enabled() and not target:script("run") then
+ local targetfile = target:targetfile()
+ if targetfile and not os.isfile(targetfile) then
+ table.insert(targetnames, target:name())
+ end
+ end
+ end
+
+ -- there are targets that have not yet been built?
+ if #targetnames > 0 then
+ raise("please run `$xmake build [target]` to build the following targets first:\n -> " .. table.concat(targetnames, '\n -> '))
+ end
+end
+
+-- main
+function main()
+
+ -- do action for remote?
+ if remote_build_action.enabled() then
+ return remote_build_action()
+ end
+
+ -- load config first
+ config.load()
+
+ -- load targets
+ project.load_targets()
+
+ -- get tests
+ local tests = {}
+ for _, target in ipairs(project.ordertargets()) do
+ if target:is_binary() or target:script("run") then
+ print(target:name())
+ for _, test in ipairs(target:get("tests")) do
+ print(test)
+
+ --table.insert(tests, )
+ end
+ --[[
+ local group = target:get("group")
+ if (target:is_default() and not group_pattern) or option.get("all") or (group_pattern and group and group:match(group_pattern)) then
+ table.insert(targets, target)
+ end]]
+ end
+ end
+
+ --[[
+ -- check targets first
+ local targetname
+ local group_pattern = option.get("group")
+ if group_pattern then
+ group_pattern = "^" .. path.pattern(group_pattern) .. "$"
+ else
+ targetname = option.get("target")
+ end
+ _check_targets(targetname, group_pattern)
+
+ -- enter project directory
+ local oldir = os.cd(project.directory())
+
+ -- run the given target?
+ if targetname then
+ _run(project.target(targetname))
+ else
+ local targets = {}
+ for _, target in ipairs(project.ordertargets()) do
+ if target:is_binary() or target:script("run") then
+ local group = target:get("group")
+ if (target:is_default() and not group_pattern) or option.get("all") or (group_pattern and group and group:match(group_pattern)) then
+ table.insert(targets, target)
+ end
+ end
+ end
+ local jobs = tonumber(option.get("jobs") or "1")
+ runjobs("run_targets", function (index)
+ local target = targets[index]
+ if target then
+ _run(target)
+ end
+ end, {total = #targets,
+ comax = jobs,
+ isolate = true})
+ end
+
+ -- leave project directory
+ os.cd(oldir)]]
+end
+
diff --git a/tests/actions/test/xmake.lua b/tests/actions/test/xmake.lua
index b9465566f..f02f50c0c 100644
--- a/tests/actions/test/xmake.lua
+++ b/tests/actions/test/xmake.lua
@@ -4,9 +4,10 @@ for _, file in ipairs(os.files("src/test_*.cpp")) do
local name = path.basename(file)
target(name)
set_kind("binary")
+ set_default(false)
add_files("src/" .. name .. ".cpp")
add_tests(name)
- add_tests(name .. "_arg", "foo")
+ add_tests(name .. "_arg", "foo", "bar")
add_tests(name .. "_pass_output", "foo", {pass_output = "hello foo"})
add_tests(name .. "_fail_output", {fail_output = {"hello .*", "hello xmake"}})
end
diff --git a/xmake/actions/test/main.lua b/xmake/actions/test/main.lua
index 22748b388..667ae2a0e 100644
--- a/xmake/actions/test/main.lua
+++ b/xmake/actions/test/main.lua
@@ -211,6 +211,25 @@ function main()
-- load targets
project.load_targets()
+ -- get tests
+ local tests = {}
+ for _, target in ipairs(project.ordertargets()) do
+ if target:is_binary() or target:script("run") then
+ for name, argv in pairs(target:get("tests")) do
+ local extra = target:extraconf("tests", name)
+ print(name, extra)
+ tests[name] = table.join({argv = table.wrap(argv)}, extra)
+ end
+ --[[
+ local group = target:get("group")
+ if (target:is_default() and not group_pattern) or option.get("all") or (group_pattern and group and group:match(group_pattern)) then
+ table.insert(targets, target)
+ end]]
+ end
+ end
+-- print(tests)
+
+ --[[
-- check targets first
local targetname
local group_pattern = option.get("group")
@@ -249,6 +268,6 @@ function main()
end
-- leave project directory
- os.cd(oldir)
+ os.cd(oldir)]]
end
diff --git a/xmake/actions/test/xmake.lua b/xmake/actions/test/xmake.lua
index ce9455789..4a48f4621 100644
--- a/xmake/actions/test/xmake.lua
+++ b/xmake/actions/test/xmake.lua
@@ -37,7 +37,7 @@ task("test")
" xmake test --workdir=`pwd`" },
{'j', "jobs", "kv", "1", "Set the number of parallel compilation jobs." },
{},
- {nil, "tests", "vs", nil , "The test names. It support pattern matching.",
+ {nil, "tests", "vs", nil , "The test names. It support pattern matching.",
"e.g.",
" xmake test foo",
" xmake test foo_*" }