forked from SeleniumHQ/selenium
-
Notifications
You must be signed in to change notification settings - Fork 0
/
nunit-test.bzl
143 lines (127 loc) · 5.09 KB
/
nunit-test.bzl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
load(
"@io_bazel_rules_dotnet//dotnet/private:context.bzl",
"dotnet_context",
)
load(
"@io_bazel_rules_dotnet//dotnet/private:providers.bzl",
"DotnetLibrary",
"DotnetResource",
)
TEST_RUNNER_SCRIPT_CONTENT = """{script_prefix}
{runner} {test} --result={result_location};transform={xslt} {additional_args}
"""
def _is_windows():
return select({
"@bazel_tools//src/conditions:windows": True,
"//conditions:default": False,
})
def _convert_path(input_path, is_windows = False):
if (is_windows):
return input_path.replace("/", "\\")
return input_path
def _nunit_test_impl(ctx):
dotnet = dotnet_context(ctx)
name = ctx.label.name
test_assembly = dotnet.assembly(
dotnet,
name = ctx.label.name,
srcs = ctx.attr.srcs,
deps = ctx.attr.deps,
resources = ctx.attr.resources,
out = ctx.attr.out,
defines = ctx.attr.defines,
unsafe = ctx.attr.unsafe,
data = ctx.attr.data,
executable = False,
keyfile = ctx.attr.keyfile,
)
args = [test_assembly.result.path] + ctx.attr.args
file_inputs = [test_assembly.result]
for dep in ctx.attr.deps:
src_file = dep.files.to_list()[0]
dest_file = ctx.actions.declare_file(src_file.basename)
file_inputs.append(dest_file)
ctx.actions.run(
outputs = [dest_file],
inputs = [src_file],
executable = ctx.attr._copy.files.to_list()[0],
arguments = [dest_file.path, src_file.path],
mnemonic = "CopyDependencyAssembly",
)
runner_executable = None
for runner_file in ctx.attr.test_runner.files.to_list():
dest_runner_file = ctx.actions.declare_file("runner/" + runner_file.basename)
file_inputs.append(dest_runner_file)
if runner_file.basename == "nunit3-console.exe":
runner_executable = dest_runner_file
ctx.actions.run(
outputs = [dest_runner_file],
inputs = [runner_file],
executable = ctx.attr._copy.files.to_list()[0],
arguments = [dest_runner_file.path, runner_file.path],
mnemonic = "CopyTestRunner",
)
# Determining platform isn't available during the analysis phase,
# so there's no opportunity to give the script file a proper extention.
# Luckily, as long as the file is marked with the executable attribute
# in the OS, there's nothing preventing a file named '.bat' being a
# valid executable shell script on non-Windows OSes. If this changes,
# this comment can be removed, and the below line changed to give the
# generated script file a proper extension of '.sh'.
script_file_extension = "bat"
additional_args = "$@"
result_location = "$XML_OUTPUT_FILE"
script_prefix = "#!/bin/bash"
is_windows = _is_windows()
if (is_windows):
script_file_extension = "bat"
additional_args = "%*"
result_location = "%XML_OUTPUT_FILE%"
script_prefix = "@echo off"
script_file_name = "{}.{}".format(name, script_file_extension)
script_file = ctx.actions.declare_file(script_file_name)
script_content = TEST_RUNNER_SCRIPT_CONTENT.format(
script_prefix = script_prefix,
runner = _convert_path(runner_executable.path, is_windows),
test = _convert_path(test_assembly.result.path, is_windows),
result_location = result_location,
xslt = _convert_path(ctx.attr._xslt.files.to_list()[0].path, is_windows),
additional_args = additional_args,
)
ctx.actions.write(script_file, script_content, True)
extra = [] if ctx.attr.data == None else [d.files for d in ctx.attr.data]
runfiles = ctx.runfiles(
files = file_inputs,
transitive_files = depset(transitive = [d[DotnetLibrary].runfiles for d in ctx.attr.deps] + extra),
)
info = DefaultInfo(
files = depset([test_assembly.result, runner_executable, script_file]),
runfiles = runfiles,
executable = script_file,
)
return [
info,
test_assembly,
]
nunit_test = rule(
implementation = _nunit_test_impl,
attrs = {
"deps": attr.label_list(providers = [DotnetLibrary]),
"resources": attr.label_list(providers = [DotnetResource]),
"srcs": attr.label_list(allow_files = [".cs"]),
"out": attr.string(),
"defines": attr.string_list(),
"unsafe": attr.bool(default = False),
"keyfile": attr.label(allow_files = True),
"data": attr.label_list(allow_files = True),
"dotnet_context_data": attr.label(default = Label("@io_bazel_rules_dotnet//:dotnet_context_data")),
"test_runner": attr.label(
default = Label("//third_party/dotnet/nunit.console-3.10.0/bin/net35:nunitconsole"),
allow_files = True
),
"_copy": attr.label(default = Label("@io_bazel_rules_dotnet//dotnet/tools/copy")),
"_xslt": attr.label(default = Label("@io_bazel_rules_dotnet//tools/converttests:n3.xslt"), allow_files = True),
},
toolchains = ["@io_bazel_rules_dotnet//dotnet:toolchain_net"],
test = True,
)