diff options
Diffstat (limited to 'src/internal/boringtest/boring_test.go')
-rw-r--r-- | src/internal/boringtest/boring_test.go | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/src/internal/boringtest/boring_test.go b/src/internal/boringtest/boring_test.go new file mode 100644 index 0000000000..a6b07eda70 --- /dev/null +++ b/src/internal/boringtest/boring_test.go @@ -0,0 +1,47 @@ +// Copyright 2017 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. + +// Like crypto/rsa/boring_test.go but outside the crypto/ tree. +// Tests what happens if a package outside the crypto/ tree +// "adopts" a struct definition. This happens in golang.org/x/crypto/ssh. + +package boring + +import ( + "crypto/rand" + "crypto/rsa" + "encoding/asn1" + "reflect" + "testing" +) + +type publicKey rsa.PublicKey + +func TestBoringASN1Marshal(t *testing.T) { + k, err := rsa.GenerateKey(rand.Reader, 128) + if err != nil { + t.Fatal(err) + } + pk := (*publicKey)(&k.PublicKey) + // This used to fail, because of the unexported 'boring' field. + // Now the compiler hides it [sic]. + _, err = asn1.Marshal(*pk) + if err != nil { + t.Fatal(err) + } +} + +func TestBoringDeepEqual(t *testing.T) { + k0, err := rsa.GenerateKey(rand.Reader, 128) + if err != nil { + t.Fatal(err) + } + k := (*publicKey)(&k0.PublicKey) + k2 := *k + rsa.EncryptPKCS1v15(rand.Reader, (*rsa.PublicKey)(&k2), []byte("hello")) // initialize hidden boring field + if !reflect.DeepEqual(k, &k2) { + // compiler should be hiding the boring field from reflection + t.Fatalf("DeepEqual compared boring fields") + } +} |