From cb7f9ec4b71e81760fa36ebff60a7e41a07df238 Mon Sep 17 00:00:00 2001 From: Cherry Zhang Date: Fri, 17 Aug 2018 11:12:43 -0400 Subject: [PATCH] cmd/compile: add a test for reproducible build with anonymous interfaces Duplicated anonymous interfaces caused nondeterministic build. The fix is CL 129515. This CL adds a test. Updates #27013. Change-Id: I6b7e1bbfc943c22e8e6f32c145f7aebb567cef15 Reviewed-on: https://go-review.googlesource.com/129680 Run-TryBot: Cherry Zhang TryBot-Result: Gobot Gobot Reviewed-by: Brad Fitzpatrick --- .../internal/gc/reproduciblebuilds_test.go | 55 +++++++++++-------- .../gc/testdata/reproducible/issue27013.go | 15 +++++ 2 files changed, 48 insertions(+), 22 deletions(-) create mode 100644 src/cmd/compile/internal/gc/testdata/reproducible/issue27013.go diff --git a/src/cmd/compile/internal/gc/reproduciblebuilds_test.go b/src/cmd/compile/internal/gc/reproduciblebuilds_test.go index b5f318e761..9173f80ee3 100644 --- a/src/cmd/compile/internal/gc/reproduciblebuilds_test.go +++ b/src/cmd/compile/internal/gc/reproduciblebuilds_test.go @@ -15,34 +15,45 @@ import ( ) func TestReproducibleBuilds(t *testing.T) { + tests := []string{ + "issue20272.go", + "issue27013.go", + } + testenv.MustHaveGoBuild(t) iters := 10 if testing.Short() { iters = 4 } t.Parallel() - var want []byte - tmp, err := ioutil.TempFile("", "") - if err != nil { - t.Fatalf("temp file creation failed: %v", err) - } - defer os.Remove(tmp.Name()) - defer tmp.Close() - for i := 0; i < iters; i++ { - out, err := exec.Command(testenv.GoToolPath(t), "tool", "compile", "-o", tmp.Name(), filepath.Join("testdata", "reproducible", "issue20272.go")).CombinedOutput() - if err != nil { - t.Fatalf("failed to compile: %v\n%s", err, out) - } - obj, err := ioutil.ReadFile(tmp.Name()) - if err != nil { - t.Fatalf("failed to read object file: %v", err) - } - if i == 0 { - want = obj - } else { - if !bytes.Equal(want, obj) { - t.Fatalf("builds produced different output after %d iters (%d bytes vs %d bytes)", i, len(want), len(obj)) + for _, test := range tests { + test := test + t.Run(test, func(t *testing.T) { + t.Parallel() + var want []byte + tmp, err := ioutil.TempFile("", "") + if err != nil { + t.Fatalf("temp file creation failed: %v", err) } - } + defer os.Remove(tmp.Name()) + defer tmp.Close() + for i := 0; i < iters; i++ { + out, err := exec.Command(testenv.GoToolPath(t), "tool", "compile", "-o", tmp.Name(), filepath.Join("testdata", "reproducible", test)).CombinedOutput() + if err != nil { + t.Fatalf("failed to compile: %v\n%s", err, out) + } + obj, err := ioutil.ReadFile(tmp.Name()) + if err != nil { + t.Fatalf("failed to read object file: %v", err) + } + if i == 0 { + want = obj + } else { + if !bytes.Equal(want, obj) { + t.Fatalf("builds produced different output after %d iters (%d bytes vs %d bytes)", i, len(want), len(obj)) + } + } + } + }) } } diff --git a/src/cmd/compile/internal/gc/testdata/reproducible/issue27013.go b/src/cmd/compile/internal/gc/testdata/reproducible/issue27013.go new file mode 100644 index 0000000000..817f4a640e --- /dev/null +++ b/src/cmd/compile/internal/gc/testdata/reproducible/issue27013.go @@ -0,0 +1,15 @@ +// Copyright 2018 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package p + +func A(arg interface{}) { + _ = arg.(interface{ Func() int32 }) + _ = arg.(interface{ Func() int32 }) + _ = arg.(interface{ Func() int32 }) + _ = arg.(interface{ Func() int32 }) + _ = arg.(interface{ Func() int32 }) + _ = arg.(interface{ Func() int32 }) + _ = arg.(interface{ Func() int32 }) +}