Merge pull request #3356 from amscanne:generics_tests

PiperOrigin-RevId: 323066414
This commit is contained in:
gVisor bot 2020-07-24 13:59:45 -07:00
commit ea0342d470
35 changed files with 212 additions and 111 deletions

View File

@ -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.

View File

@ -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"],
)

View File

@ -100,20 +100,21 @@ 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.append("-p=%s" % ctx.attr.package)
if len(ctx.attr.prefix) > 0:
args += ["-prefix=%s" % ctx.attr.prefix]
args.append("-prefix=%s" % ctx.attr.prefix)
if len(ctx.attr.suffix) > 0:
args += ["-suffix=%s" % ctx.attr.suffix]
args.append("-suffix=%s" % ctx.attr.suffix)
args += [("-t=%s=%s" % (p[0], p[1])) for p in ctx.attr.types.items()]
args += [("-c=%s=%s" % (p[0], p[1])) for p in ctx.attr.consts.items()]
args += [("-import=%s=%s" % (p[0], p[1])) for p in ctx.attr.imports.items()]
if ctx.attr.anon:
args += ["-anon"]
args.append("-anon")
ctx.actions.run(
inputs = [template.file],
@ -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")),
},

View File

@ -1 +0,0 @@
-t=T=Q

View File

@ -1 +0,0 @@
-t=T=Q

View File

@ -1 +0,0 @@
-t=T=Q -suffix=New -anon

View File

@ -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"

View File

@ -1 +0,0 @@
-t=T=sync.Mutex -c=n=math.Uint32 -c=m=math.Uint64 -import=sync=sync -import=math=mymathpath

View File

@ -1 +0,0 @@
-t=T=Q -suffix=New

View File

@ -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__

View File

View File

@ -0,0 +1,16 @@
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",
},
)
# @unused
glaze_ignore = [
"input.go",
"output.go",
]

View File

@ -0,0 +1,16 @@
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",
},
)
# @unused
glaze_ignore = [
"input.go",
"output.go",
]

View File

@ -14,7 +14,9 @@
package tests
import "./lib"
import (
"./lib"
)
type T int

View File

@ -14,7 +14,9 @@
package main
import "./lib"
import (
"./lib"
)
type newType struct {
a Q

View File

@ -0,0 +1,18 @@
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",
},
)
# @unused
glaze_ignore = [
"input.go",
"output.go",
]

View File

@ -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
}

View File

@ -0,0 +1,23 @@
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",
)
# @unused
glaze_ignore = [
"input.go",
"output.go",
]

View File

@ -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,
)
def go_generics_test(name, inputs, output, types = None, consts = None, **kwargs):
"""Instantiates a generics test.
Args:
name: the name of the test.
inputs: all the input files.
output: the output files.
types: the template types (dictionary).
consts: the template consts (dictionary).
**kwargs: additional arguments for the template_instance.
"""
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,
)

View File

@ -0,0 +1,24 @@
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",
},
)
# @unused
glaze_ignore = [
"input.go",
"output.go",
]

View File

@ -0,0 +1,16 @@
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",
},
)
# @unused
glaze_ignore = [
"input.go",
"output.go",
]

View File

@ -0,0 +1,17 @@
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",
},
)
# @unused
glaze_ignore = [
"input.go",
"output.go",
]