mirror of
https://github.com/golang/go
synced 2024-11-12 07:30:25 -07:00
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:
parent
c7271c0c25
commit
cb7f9ec4b7
@ -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))
|
||||
}
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
15
src/cmd/compile/internal/gc/testdata/reproducible/issue27013.go
vendored
Normal file
15
src/cmd/compile/internal/gc/testdata/reproducible/issue27013.go
vendored
Normal 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 })
|
||||
}
|
Loading…
Reference in New Issue
Block a user