blob: 2c773b91203bd055c312b28cb9ed8684f7be8cbe [file] [log] [blame]
// Copyright 2013 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 x509
import (
"os"
"os/exec"
"testing"
"time"
)
func TestSystemRoots(t *testing.T) {
t0 := time.Now()
sysRoots, err := loadSystemRoots() // actual system roots
sysRootsDuration := time.Since(t0)
if err != nil {
t.Fatalf("failed to read system roots: %v", err)
}
t.Logf("loadSystemRoots: %v", sysRootsDuration)
// There are 174 system roots on Catalina, and 163 on iOS right now, require
// at least 100 to make sure this is not completely broken.
if want, have := 100, len(sysRoots.certs); have < want {
t.Errorf("want at least %d system roots, have %d", want, have)
}
if loadSystemRootsWithCgo == nil {
t.Skip("cgo not available, can't compare pool")
}
t1 := time.Now()
cgoRoots, err := loadSystemRootsWithCgo() // cgo roots
cgoSysRootsDuration := time.Since(t1)
if err != nil {
t.Fatalf("failed to read cgo roots: %v", err)
}
t.Logf("loadSystemRootsWithCgo: %v", cgoSysRootsDuration)
// Check that the two cert pools are the same.
sysPool := make(map[string]*Certificate, len(sysRoots.certs))
for _, c := range sysRoots.certs {
sysPool[string(c.Raw)] = c
}
for _, c := range cgoRoots.certs {
if _, ok := sysPool[string(c.Raw)]; ok {
delete(sysPool, string(c.Raw))
} else {
t.Errorf("certificate only present in cgo pool: %v", c.Subject)
}
}
for _, c := range sysPool {
t.Errorf("certificate only present in real pool: %v", c.Subject)
}
if t.Failed() {
cmd := exec.Command("security", "dump-trust-settings")
cmd.Stdout, cmd.Stderr = os.Stderr, os.Stderr
cmd.Run()
cmd = exec.Command("security", "dump-trust-settings", "-d")
cmd.Stdout, cmd.Stderr = os.Stderr, os.Stderr
cmd.Run()
}
}