diff options
| author | ruki <[email protected]> | 2023-10-07 00:45:08 +0800 |
|---|---|---|
| committer | ruki <[email protected]> | 2023-10-07 00:45:08 +0800 |
| commit | e6373510a1fc487dd6652a5bc1cd74a966a8749c (patch) | |
| tree | dcbd83f3cc32da90c39b1836a07548897c0da85e | |
| parent | 621d6df885bc9ee832221f968ffcb07399d791fa (diff) | |
get tests
| -rw-r--r-- | :w | 273 | ||||
| -rw-r--r-- | tests/actions/test/xmake.lua | 3 | ||||
| -rw-r--r-- | xmake/actions/test/main.lua | 21 | ||||
| -rw-r--r-- | xmake/actions/test/xmake.lua | 2 |
4 files changed, 296 insertions, 3 deletions
@@ -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_*" } |
