From ab0262bd94c25bc91d5e0d831b75729c253dfde6 Mon Sep 17 00:00:00 2001 From: Adin Scannell Date: Thu, 23 Jul 2020 18:00:12 -0700 Subject: [PATCH] Convert go_generics tests to starlark. For some reason these tests were broken when run via the bazel docker container. The mechanism used was a bit crazy (self-extracting bundle), so convert them to use straight-forward starlark rules. This has the added advantaged that they are now independent tests. --- images/default/Dockerfile | 2 +- tools/go_generics/BUILD | 24 ------- tools/go_generics/defs.bzl | 5 +- .../generics_tests/all_stmts/opts.txt | 1 - .../generics_tests/all_types/opts.txt | 1 - .../go_generics/generics_tests/anon/opts.txt | 1 - .../generics_tests/consts/opts.txt | 1 - .../generics_tests/imports/opts.txt | 1 - .../generics_tests/remove_typedef/opts.txt | 1 - .../generics_tests/simple/opts.txt | 1 - tools/go_generics/go_generics_unittest.sh | 70 ------------------- tools/go_generics/tests/BUILD | 0 tools/go_generics/tests/all_stmts/BUILD | 10 +++ .../all_stmts/input.go | 0 .../output => tests/all_stmts}/output.go | 0 tools/go_generics/tests/all_types/BUILD | 10 +++ .../all_types/input.go | 4 +- .../all_types/lib/lib.go | 0 .../output => tests/all_types}/output.go | 4 +- tools/go_generics/tests/anon/BUILD | 12 ++++ .../{generics_tests => tests}/anon/input.go | 0 .../anon/output => tests/anon}/output.go | 4 +- tools/go_generics/tests/consts/BUILD | 17 +++++ .../{generics_tests => tests}/consts/input.go | 0 .../consts/output => tests/consts}/output.go | 0 tools/go_generics/tests/defs.bzl | 67 ++++++++++++++++++ tools/go_generics/tests/imports/BUILD | 18 +++++ .../imports/input.go | 0 .../output => tests/imports}/output.go | 0 tools/go_generics/tests/remove_typedef/BUILD | 10 +++ .../remove_typedef/input.go | 0 .../output => tests/remove_typedef}/output.go | 0 tools/go_generics/tests/simple/BUILD | 11 +++ .../{generics_tests => tests}/simple/input.go | 0 .../simple/output => tests/simple}/output.go | 0 35 files changed, 167 insertions(+), 108 deletions(-) delete mode 100644 tools/go_generics/generics_tests/all_stmts/opts.txt delete mode 100644 tools/go_generics/generics_tests/all_types/opts.txt delete mode 100644 tools/go_generics/generics_tests/anon/opts.txt delete mode 100644 tools/go_generics/generics_tests/consts/opts.txt delete mode 100644 tools/go_generics/generics_tests/imports/opts.txt delete mode 100644 tools/go_generics/generics_tests/remove_typedef/opts.txt delete mode 100644 tools/go_generics/generics_tests/simple/opts.txt delete mode 100755 tools/go_generics/go_generics_unittest.sh create mode 100644 tools/go_generics/tests/BUILD create mode 100644 tools/go_generics/tests/all_stmts/BUILD rename tools/go_generics/{generics_tests => tests}/all_stmts/input.go (100%) rename tools/go_generics/{generics_tests/all_stmts/output => tests/all_stmts}/output.go (100%) create mode 100644 tools/go_generics/tests/all_types/BUILD rename tools/go_generics/{generics_tests => tests}/all_types/input.go (97%) rename tools/go_generics/{generics_tests => tests}/all_types/lib/lib.go (100%) rename tools/go_generics/{generics_tests/all_types/output => tests/all_types}/output.go (97%) create mode 100644 tools/go_generics/tests/anon/BUILD rename tools/go_generics/{generics_tests => tests}/anon/input.go (100%) rename tools/go_generics/{generics_tests/anon/output => tests/anon}/output.go (89%) create mode 100644 tools/go_generics/tests/consts/BUILD rename tools/go_generics/{generics_tests => tests}/consts/input.go (100%) rename tools/go_generics/{generics_tests/consts/output => tests/consts}/output.go (100%) create mode 100644 tools/go_generics/tests/defs.bzl create mode 100644 tools/go_generics/tests/imports/BUILD rename tools/go_generics/{generics_tests => tests}/imports/input.go (100%) rename tools/go_generics/{generics_tests/imports/output => tests/imports}/output.go (100%) create mode 100644 tools/go_generics/tests/remove_typedef/BUILD rename tools/go_generics/{generics_tests => tests}/remove_typedef/input.go (100%) rename tools/go_generics/{generics_tests/remove_typedef/output => tests/remove_typedef}/output.go (100%) create mode 100644 tools/go_generics/tests/simple/BUILD rename tools/go_generics/{generics_tests => tests}/simple/input.go (100%) rename tools/go_generics/{generics_tests/simple/output => tests/simple}/output.go (100%) diff --git a/images/default/Dockerfile b/images/default/Dockerfile index 397082b02..2b38e6c58 100644 --- a/images/default/Dockerfile +++ b/images/default/Dockerfile @@ -1,7 +1,7 @@ FROM fedora:31 # Install bazel. RUN dnf install -y dnf-plugins-core && dnf copr enable -y vbatts/bazel -RUN dnf install -y git gcc make golang gcc-c++ glibc-devel python3 which python3-pip python3-devel libffi-devel openssl-devel pkg-config glibc-static libstdc++-static patch +RUN dnf install -y git gcc make golang gcc-c++ glibc-devel python3 which python3-pip python3-devel libffi-devel openssl-devel pkg-config glibc-static libstdc++-static patch diffutils RUN pip install pycparser RUN dnf install -y bazel3 # Install gcloud. diff --git a/tools/go_generics/BUILD b/tools/go_generics/BUILD index 32a949c93..558826bf1 100644 --- a/tools/go_generics/BUILD +++ b/tools/go_generics/BUILD @@ -12,27 +12,3 @@ go_binary( visibility = ["//:sandbox"], deps = ["//tools/go_generics/globals"], ) - -genrule( - name = "go_generics_tests", - srcs = glob(["generics_tests/**"]) + [":go_generics"], - outs = ["go_generics_tests.tgz"], - cmd = "tar -czvhf $@ $(SRCS)", -) - -genrule( - name = "go_generics_test_bundle", - srcs = [ - ":go_generics_tests.tgz", - ":go_generics_unittest.sh", - ], - outs = ["go_generics_test.sh"], - cmd = "cat $(location :go_generics_unittest.sh) $(location :go_generics_tests.tgz) > $@", - executable = True, -) - -sh_test( - name = "go_generics_test", - size = "small", - srcs = ["go_generics_test.sh"], -) diff --git a/tools/go_generics/defs.bzl b/tools/go_generics/defs.bzl index ec047a644..7fe7d7e59 100644 --- a/tools/go_generics/defs.bzl +++ b/tools/go_generics/defs.bzl @@ -100,7 +100,8 @@ def _go_template_instance_impl(ctx): # Build the argument list. args = ["-i=%s" % template.file.path, "-o=%s" % output.path] - args += ["-p=%s" % ctx.attr.package] + if ctx.attr.package: + args += ["-p=%s" % ctx.attr.package] if len(ctx.attr.prefix) > 0: args += ["-prefix=%s" % ctx.attr.prefix] @@ -151,7 +152,7 @@ go_template_instance = rule( "consts": attr.string_dict(), "imports": attr.string_dict(), "anon": attr.bool(mandatory = False, default = False), - "package": attr.string(mandatory = True), + "package": attr.string(mandatory = False), "out": attr.output(mandatory = True), "_tool": attr.label(executable = True, cfg = "host", default = Label("//tools/go_generics")), }, diff --git a/tools/go_generics/generics_tests/all_stmts/opts.txt b/tools/go_generics/generics_tests/all_stmts/opts.txt deleted file mode 100644 index c9d0e09bf..000000000 --- a/tools/go_generics/generics_tests/all_stmts/opts.txt +++ /dev/null @@ -1 +0,0 @@ --t=T=Q diff --git a/tools/go_generics/generics_tests/all_types/opts.txt b/tools/go_generics/generics_tests/all_types/opts.txt deleted file mode 100644 index c9d0e09bf..000000000 --- a/tools/go_generics/generics_tests/all_types/opts.txt +++ /dev/null @@ -1 +0,0 @@ --t=T=Q diff --git a/tools/go_generics/generics_tests/anon/opts.txt b/tools/go_generics/generics_tests/anon/opts.txt deleted file mode 100644 index a5e9d26de..000000000 --- a/tools/go_generics/generics_tests/anon/opts.txt +++ /dev/null @@ -1 +0,0 @@ --t=T=Q -suffix=New -anon diff --git a/tools/go_generics/generics_tests/consts/opts.txt b/tools/go_generics/generics_tests/consts/opts.txt deleted file mode 100644 index 4fb59dce8..000000000 --- a/tools/go_generics/generics_tests/consts/opts.txt +++ /dev/null @@ -1 +0,0 @@ --c=c1=20 -c=z=600 -c=v=3.3 -c=s="def" -c=A=20 -c=C=100 -c=S="def" -c=T="ABC" diff --git a/tools/go_generics/generics_tests/imports/opts.txt b/tools/go_generics/generics_tests/imports/opts.txt deleted file mode 100644 index 87324be79..000000000 --- a/tools/go_generics/generics_tests/imports/opts.txt +++ /dev/null @@ -1 +0,0 @@ --t=T=sync.Mutex -c=n=math.Uint32 -c=m=math.Uint64 -import=sync=sync -import=math=mymathpath diff --git a/tools/go_generics/generics_tests/remove_typedef/opts.txt b/tools/go_generics/generics_tests/remove_typedef/opts.txt deleted file mode 100644 index 9c8ecaada..000000000 --- a/tools/go_generics/generics_tests/remove_typedef/opts.txt +++ /dev/null @@ -1 +0,0 @@ --t=T=U diff --git a/tools/go_generics/generics_tests/simple/opts.txt b/tools/go_generics/generics_tests/simple/opts.txt deleted file mode 100644 index 7832ef66f..000000000 --- a/tools/go_generics/generics_tests/simple/opts.txt +++ /dev/null @@ -1 +0,0 @@ --t=T=Q -suffix=New diff --git a/tools/go_generics/go_generics_unittest.sh b/tools/go_generics/go_generics_unittest.sh deleted file mode 100755 index 44b22db91..000000000 --- a/tools/go_generics/go_generics_unittest.sh +++ /dev/null @@ -1,70 +0,0 @@ -#!/bin/bash - -# Copyright 2018 The gVisor Authors. -# -# 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. - -# Bash "safe-mode": Treat command failures as fatal (even those that occur in -# pipes), and treat unset variables as errors. -set -eu -o pipefail - -# This file will be generated as a self-extracting shell script in order to -# eliminate the need for any runtime dependencies. The tarball at the end will -# include the go_generics binary, as well as a subdirectory named -# generics_tests. See the BUILD file for more information. -declare -r temp=$(mktemp -d) -function cleanup() { - rm -rf "${temp}" -} -# trap cleanup EXIT - -# Print message in "$1" then exit with status 1. -function die () { - echo "$1" 1>&2 - exit 1 -} - -# This prints the line number of __BUNDLE__ below, that should be the last line -# of this script. After that point, the concatenated archive will be the -# contents. -declare -r tgz=`awk '/^__BUNDLE__/ {print NR + 1; exit 0; }' $0` -tail -n+"${tgz}" $0 | tar -xzv -C "${temp}" - -# The target for the test. -declare -r binary="$(find ${temp} -type f -a -name go_generics)" -declare -r input_dirs="$(find ${temp} -type d -a -name generics_tests)/*" - -# Go through all test cases. -for f in ${input_dirs}; do - base=$(basename "${f}") - - # Run go_generics on the input file. - opts=$(head -n 1 ${f}/opts.txt) - out="${f}/output/generated.go" - expected="${f}/output/output.go" - ${binary} ${opts} "-i=${f}/input.go" "-o=${out}" || die "go_generics failed for test case \"${base}\"" - - # Compare the outputs. - diff ${expected} ${out} - if [ $? -ne 0 ]; then - echo "Expected:" - cat ${expected} - echo "Actual:" - cat ${out} - die "Actual output is different from expected for test \"${base}\"" - fi -done - -echo "PASS" -exit 0 -__BUNDLE__ diff --git a/tools/go_generics/tests/BUILD b/tools/go_generics/tests/BUILD new file mode 100644 index 000000000..e69de29bb diff --git a/tools/go_generics/tests/all_stmts/BUILD b/tools/go_generics/tests/all_stmts/BUILD new file mode 100644 index 000000000..fbc07dbff --- /dev/null +++ b/tools/go_generics/tests/all_stmts/BUILD @@ -0,0 +1,10 @@ +load("//tools/go_generics/tests:defs.bzl", "go_generics_test") + +go_generics_test( + name = "all_stmts", + inputs = ["input.go"], + output = "output.go", + types = { + "T": "Q", + }, +) diff --git a/tools/go_generics/generics_tests/all_stmts/input.go b/tools/go_generics/tests/all_stmts/input.go similarity index 100% rename from tools/go_generics/generics_tests/all_stmts/input.go rename to tools/go_generics/tests/all_stmts/input.go diff --git a/tools/go_generics/generics_tests/all_stmts/output/output.go b/tools/go_generics/tests/all_stmts/output.go similarity index 100% rename from tools/go_generics/generics_tests/all_stmts/output/output.go rename to tools/go_generics/tests/all_stmts/output.go diff --git a/tools/go_generics/tests/all_types/BUILD b/tools/go_generics/tests/all_types/BUILD new file mode 100644 index 000000000..9144b0811 --- /dev/null +++ b/tools/go_generics/tests/all_types/BUILD @@ -0,0 +1,10 @@ +load("//tools/go_generics/tests:defs.bzl", "go_generics_test") + +go_generics_test( + name = "all_types", + inputs = ["input.go"], + output = "output.go", + types = { + "T": "Q", + }, +) diff --git a/tools/go_generics/generics_tests/all_types/input.go b/tools/go_generics/tests/all_types/input.go similarity index 97% rename from tools/go_generics/generics_tests/all_types/input.go rename to tools/go_generics/tests/all_types/input.go index 3575d02ec..6f85bbb69 100644 --- a/tools/go_generics/generics_tests/all_types/input.go +++ b/tools/go_generics/tests/all_types/input.go @@ -14,7 +14,9 @@ package tests -import "./lib" +import ( + "./lib" +) type T int diff --git a/tools/go_generics/generics_tests/all_types/lib/lib.go b/tools/go_generics/tests/all_types/lib/lib.go similarity index 100% rename from tools/go_generics/generics_tests/all_types/lib/lib.go rename to tools/go_generics/tests/all_types/lib/lib.go diff --git a/tools/go_generics/generics_tests/all_types/output/output.go b/tools/go_generics/tests/all_types/output.go similarity index 97% rename from tools/go_generics/generics_tests/all_types/output/output.go rename to tools/go_generics/tests/all_types/output.go index 41fd147a1..c0bbebfe7 100644 --- a/tools/go_generics/generics_tests/all_types/output/output.go +++ b/tools/go_generics/tests/all_types/output.go @@ -14,7 +14,9 @@ package main -import "./lib" +import ( + "./lib" +) type newType struct { a Q diff --git a/tools/go_generics/tests/anon/BUILD b/tools/go_generics/tests/anon/BUILD new file mode 100644 index 000000000..1890f2817 --- /dev/null +++ b/tools/go_generics/tests/anon/BUILD @@ -0,0 +1,12 @@ +load("//tools/go_generics/tests:defs.bzl", "go_generics_test") + +go_generics_test( + name = "anon", + anon = True, + inputs = ["input.go"], + output = "output.go", + suffix = "New", + types = { + "T": "Q", + }, +) diff --git a/tools/go_generics/generics_tests/anon/input.go b/tools/go_generics/tests/anon/input.go similarity index 100% rename from tools/go_generics/generics_tests/anon/input.go rename to tools/go_generics/tests/anon/input.go diff --git a/tools/go_generics/generics_tests/anon/output/output.go b/tools/go_generics/tests/anon/output.go similarity index 89% rename from tools/go_generics/generics_tests/anon/output/output.go rename to tools/go_generics/tests/anon/output.go index 160cddf79..7fa791853 100644 --- a/tools/go_generics/generics_tests/anon/output/output.go +++ b/tools/go_generics/tests/anon/output.go @@ -35,8 +35,8 @@ func (f FooNew) GetBar(name string) Q { func foobarNew() { a := BazNew{} - a.Q = 0 // should not be renamed, this is a limitation + a.Q = 0 b := otherpkg.UnrelatedType{} - b.Q = 0 // should not be renamed, this is a limitation + b.Q = 0 } diff --git a/tools/go_generics/tests/consts/BUILD b/tools/go_generics/tests/consts/BUILD new file mode 100644 index 000000000..1e3574593 --- /dev/null +++ b/tools/go_generics/tests/consts/BUILD @@ -0,0 +1,17 @@ +load("//tools/go_generics/tests:defs.bzl", "go_generics_test") + +go_generics_test( + name = "consts", + consts = { + "c1": "20", + "z": "600", + "v": "3.3", + "s": "\"def\"", + "A": "20", + "C": "100", + "S": "\"def\"", + "T": "\"ABC\"", + }, + inputs = ["input.go"], + output = "output.go", +) diff --git a/tools/go_generics/generics_tests/consts/input.go b/tools/go_generics/tests/consts/input.go similarity index 100% rename from tools/go_generics/generics_tests/consts/input.go rename to tools/go_generics/tests/consts/input.go diff --git a/tools/go_generics/generics_tests/consts/output/output.go b/tools/go_generics/tests/consts/output.go similarity index 100% rename from tools/go_generics/generics_tests/consts/output/output.go rename to tools/go_generics/tests/consts/output.go diff --git a/tools/go_generics/tests/defs.bzl b/tools/go_generics/tests/defs.bzl new file mode 100644 index 000000000..038629852 --- /dev/null +++ b/tools/go_generics/tests/defs.bzl @@ -0,0 +1,67 @@ +"""Generics tests.""" + +load("//tools/go_generics:defs.bzl", "go_template", "go_template_instance") + +def _go_generics_test_impl(ctx): + runner = ctx.actions.declare_file(ctx.label.name) + runner_content = "\n".join([ + "#!/bin/bash", + "exec diff --ignore-blank-lines --ignore-matching-lines=^[[:space:]]*// %s %s" % ( + ctx.files.template_output[0].short_path, + ctx.files.expected_output[0].short_path, + ), + "", + ]) + ctx.actions.write(runner, runner_content, is_executable = True) + return [DefaultInfo( + executable = runner, + runfiles = ctx.runfiles( + files = ctx.files.template_output + ctx.files.expected_output, + collect_default = True, + collect_data = True, + ), + )] + +_go_generics_test = rule( + implementation = _go_generics_test_impl, + attrs = { + "template_output": attr.label(mandatory = True, allow_single_file = True), + "expected_output": attr.label(mandatory = True, allow_single_file = True), + }, + test = True, +) + +""" +Instantiates a generics test. + +Args: + name: the name of the test. + inputs: all the input files. + output: the output files. + opts: the template options. +""" + +def go_generics_test(name, inputs, output, types = None, consts = None, **kwargs): + if types == None: + types = dict() + if consts == None: + consts = dict() + go_template( + name = name + "_template", + srcs = inputs, + types = types.keys(), + consts = consts.keys(), + ) + go_template_instance( + name = name + "_output", + template = ":" + name + "_template", + out = name + "_output.go", + types = types, + consts = consts, + **kwargs + ) + _go_generics_test( + name = name + "_test", + template_output = name + "_output.go", + expected_output = output, + ) diff --git a/tools/go_generics/tests/imports/BUILD b/tools/go_generics/tests/imports/BUILD new file mode 100644 index 000000000..c4424ee9c --- /dev/null +++ b/tools/go_generics/tests/imports/BUILD @@ -0,0 +1,18 @@ +load("//tools/go_generics/tests:defs.bzl", "go_generics_test") + +go_generics_test( + name = "imports", + consts = { + "n": "math.Uint32", + "m": "math.Uint64", + }, + imports = { + "sync": "sync", + "math": "mymathpath", + }, + inputs = ["input.go"], + output = "output.go", + types = { + "T": "sync.Mutex", + }, +) diff --git a/tools/go_generics/generics_tests/imports/input.go b/tools/go_generics/tests/imports/input.go similarity index 100% rename from tools/go_generics/generics_tests/imports/input.go rename to tools/go_generics/tests/imports/input.go diff --git a/tools/go_generics/generics_tests/imports/output/output.go b/tools/go_generics/tests/imports/output.go similarity index 100% rename from tools/go_generics/generics_tests/imports/output/output.go rename to tools/go_generics/tests/imports/output.go diff --git a/tools/go_generics/tests/remove_typedef/BUILD b/tools/go_generics/tests/remove_typedef/BUILD new file mode 100644 index 000000000..84f6ac1ab --- /dev/null +++ b/tools/go_generics/tests/remove_typedef/BUILD @@ -0,0 +1,10 @@ +load("//tools/go_generics/tests:defs.bzl", "go_generics_test") + +go_generics_test( + name = "remove_typedef", + inputs = ["input.go"], + output = "output.go", + types = { + "T": "U", + }, +) diff --git a/tools/go_generics/generics_tests/remove_typedef/input.go b/tools/go_generics/tests/remove_typedef/input.go similarity index 100% rename from tools/go_generics/generics_tests/remove_typedef/input.go rename to tools/go_generics/tests/remove_typedef/input.go diff --git a/tools/go_generics/generics_tests/remove_typedef/output/output.go b/tools/go_generics/tests/remove_typedef/output.go similarity index 100% rename from tools/go_generics/generics_tests/remove_typedef/output/output.go rename to tools/go_generics/tests/remove_typedef/output.go diff --git a/tools/go_generics/tests/simple/BUILD b/tools/go_generics/tests/simple/BUILD new file mode 100644 index 000000000..204952b90 --- /dev/null +++ b/tools/go_generics/tests/simple/BUILD @@ -0,0 +1,11 @@ +load("//tools/go_generics/tests:defs.bzl", "go_generics_test") + +go_generics_test( + name = "simple", + inputs = ["input.go"], + output = "output.go", + suffix = "New", + types = { + "T": "Q", + }, +) diff --git a/tools/go_generics/generics_tests/simple/input.go b/tools/go_generics/tests/simple/input.go similarity index 100% rename from tools/go_generics/generics_tests/simple/input.go rename to tools/go_generics/tests/simple/input.go diff --git a/tools/go_generics/generics_tests/simple/output/output.go b/tools/go_generics/tests/simple/output.go similarity index 100% rename from tools/go_generics/generics_tests/simple/output/output.go rename to tools/go_generics/tests/simple/output.go