xref: /aosp_15_r20/external/bazelbuild-rules_go/go/private/tools/single_output_test.bzl (revision 9bb1b549b6a84214c53be0924760be030e66b93a)
1# Copyright 2017 The Bazel Go Rules Authors. All rights reserved.
2#
3# Licensed under the Apache License, Version 2.0 (the "License");
4# you may not use this file except in compliance with the License.
5# You may obtain a copy of the License at
6#
7#    http://www.apache.org/licenses/LICENSE-2.0
8#
9# Unless required by applicable law or agreed to in writing, software
10# distributed under the License is distributed on an "AS IS" BASIS,
11# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12# See the License for the specific language governing permissions and
13# limitations under the License.
14
15def _impl(ctx):
16    exe = ctx.outputs.out
17    ctx.actions.write(
18        output = exe,
19        # The file must not be empty because running an empty .bat file as a
20        # subprocess fails on Windows, so we write one space to it.
21        content = " ",
22        is_executable = True,
23    )
24    return [DefaultInfo(files = depset([exe]), executable = exe)]
25
26_single_output_test = rule(
27    implementation = _impl,
28    attrs = {
29        "dep": attr.label(allow_single_file = True),
30        "out": attr.output(),
31    },
32    test = True,
33)
34
35def single_output_test(name, dep, **kwargs):
36    """Checks that a dependency produces a single output file.
37
38    This test works by setting `allow_single_file = True` on the `dep` attribute.
39    If `dep` provides zero or multiple files in its `files` provider, Bazel will
40    fail to build this rule during analysis. The actual test does nothing.
41
42    Args:
43      name: The name of the test rule.
44      dep: a label for the rule to check.
45      **kwargs: The <a href="https://docs.bazel.build/versions/master/be/common-definitions.html#common-attributes-tests">common attributes for tests</a>.
46    """
47
48    _single_output_test(
49        name = name,
50        dep = dep,
51        # On Windows we need the ".bat" extension.
52        # On other platforms the extension doesn't matter.
53        # Therefore we can use ".bat" on every platform.
54        out = name + ".bat",
55        **kwargs
56    )
57