blob: 085dc5b1b5a71bc3f9d849fc984c94d826ad7377 [file] [log] [blame]
# Copyright 2019 The Bazel Authors. All rights reserved.
#
# 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.
"""Convenience macro for stardoc e2e tests."""
load("@bazel_skylib//:bzl_library.bzl", "bzl_library")
load("//stardoc:html_tables_stardoc.bzl", "html_tables_stardoc")
load("//stardoc:stardoc.bzl", "stardoc")
def stardoc_test(
name,
input_file,
golden_file,
deps = [],
test = "default",
**kwargs):
"""Convenience macro for stardoc e2e test suites.
Each invocation creates multiple targets:
1. A `stardoc` target which will generate a new golden file given an input
file, named "{name}_stardoc".
2. An `sh_test` target which verifies that the output of the `stardoc`
target above matches a golden file.
3. A shell script which can be executed via `bazel run` to update the golden
file from the `stardoc` target's output, named "{name}_regenerate"
4. A bzl_library target for convenient wrapping of input bzl files, named "{name}_lib".
Args:
name: A unique name to qualify the created targets.
input_file: The label string of the Starlark input file for which documentation is generated
in this test.
golden_file: The label string of the golden file containing the documentation when stardoc
is run on the input file.
deps: A list of label strings of starlark file dependencies of the input_file.
test: The type of test (default or html_tables).
**kwargs: A dictionary of input template names mapped to template file path for which documentation is generated.
"""
bzl_library(
name = "%s_lib" % name,
srcs = [input_file],
deps = deps,
)
_create_test_targets(
test_name = name,
stardoc_name = "%s_stardoc" % name,
regenerate_name = "%s_regenerate" % name,
lib_name = "%s_lib" % name,
input_file = input_file,
golden_file = golden_file,
test = test,
**kwargs
)
def _create_test_targets(
test_name,
stardoc_name,
regenerate_name,
lib_name,
input_file,
golden_file,
test,
**kwargs):
actual_generated_doc = "%s.md" % stardoc_name
tags = kwargs.get("tags", [])
native.sh_test(
name = test_name,
srcs = ["diff_test_runner.sh"],
args = [
"$(location %s)" % actual_generated_doc,
"$(location %s)" % golden_file,
],
data = [
actual_generated_doc,
golden_file,
],
tags = tags,
)
regenerate_sh = "%s.sh" % regenerate_name
native.genrule(
name = "%s_sh" % regenerate_name,
cmd = """cat > $(location %s) <<EOF
#!/usr/bin/env bash
cd \\$${BUILD_WORKSPACE_DIRECTORY}
cp -fv $(location %s) $(location %s)
EOF""" % (regenerate_sh, actual_generated_doc, golden_file),
outs = [regenerate_sh],
srcs = [actual_generated_doc, golden_file],
tags = tags,
)
native.sh_binary(
name = regenerate_name,
srcs = [regenerate_sh],
data = [actual_generated_doc],
tags = tags,
)
if test == "default":
stardoc(
name = stardoc_name,
out = actual_generated_doc,
input = input_file,
deps = [lib_name],
**kwargs
)
elif test == "html_tables":
html_tables_stardoc(
name = stardoc_name,
out = actual_generated_doc,
input = input_file,
deps = [lib_name],
**kwargs
)
else:
fail("parameter 'test' must either be 'default' or 'html_tables', but was " + test)
def self_gen_test(
name,
stardoc_doc,
golden_file,
**kwargs):
"""
A wrapper around `diff_test_runner.sh` for testing Stardoc's own generated documentation.
Args:
name: A unique name for the test target.
stardoc_doc: The Stardoc output being tested.
golden_file: Expected Stardoc output.
**kwargs: Additional arguments for the test.
"""
native.sh_test(
name = name,
srcs = ["diff_test_runner.sh"],
args = [
"$(location %s)" % golden_file,
"$(location %s)" % stardoc_doc,
],
data = [
golden_file,
stardoc_doc,
],
**kwargs
)