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 <cherryyz@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
This commit is contained in:
Cherry Zhang 2018-08-17 11:12:43 -04:00
parent c7271c0c25
commit cb7f9ec4b7
2 changed files with 48 additions and 22 deletions

View File

@ -15,34 +15,45 @@ import (
) )
func TestReproducibleBuilds(t *testing.T) { func TestReproducibleBuilds(t *testing.T) {
tests := []string{
"issue20272.go",
"issue27013.go",
}
testenv.MustHaveGoBuild(t) testenv.MustHaveGoBuild(t)
iters := 10 iters := 10
if testing.Short() { if testing.Short() {
iters = 4 iters = 4
} }
t.Parallel() t.Parallel()
var want []byte for _, test := range tests {
tmp, err := ioutil.TempFile("", "") test := test
if err != nil { t.Run(test, func(t *testing.T) {
t.Fatalf("temp file creation failed: %v", err) t.Parallel()
} var want []byte
defer os.Remove(tmp.Name()) tmp, err := ioutil.TempFile("", "")
defer tmp.Close() if err != nil {
for i := 0; i < iters; i++ { t.Fatalf("temp file creation failed: %v", err)
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))
} }
} 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))
}
}
}
})
} }
} }

View File

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