| // Copyright 2024 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 cryptotest |
| |
| import ( |
| "crypto/internal/boring" |
| "crypto/internal/impl" |
| "internal/goos" |
| "internal/testenv" |
| "testing" |
| ) |
| |
| // TestAllImplementations runs the provided test function with each available |
| // implementation of the package registered with crypto/internal/impl. If there |
| // are no alternative implementations for pkg, f is invoked directly once. |
| func TestAllImplementations(t *testing.T, pkg string, f func(t *testing.T)) { |
| // BoringCrypto bypasses the multiple Go implementations. |
| if boring.Enabled { |
| f(t) |
| return |
| } |
| |
| impls := impl.List(pkg) |
| if len(impls) == 0 { |
| f(t) |
| return |
| } |
| |
| t.Cleanup(func() { impl.Reset(pkg) }) |
| |
| for _, name := range impls { |
| if available := impl.Select(pkg, name); available { |
| t.Run(name, f) |
| } else { |
| t.Run(name, func(t *testing.T) { |
| // Report an error if we're on Linux CI (assumed to be the most |
| // consistent) and the builder can't test this implementation. |
| if testenv.Builder() != "" && goos.GOOS == "linux" { |
| if name == "SHA-NI" { |
| t.Skip("known issue, see golang.org/issue/69592") |
| } |
| if name == "Armv8.2" { |
| t.Skip("known issue, see golang.org/issue/69593") |
| } |
| t.Error("builder doesn't support CPU features needed to test this implementation") |
| } else { |
| t.Skip("implementation not supported") |
| } |
| }) |
| } |
| |
| } |
| |
| // Test the generic implementation. |
| impl.Select(pkg, "") |
| t.Run("Base", f) |
| } |