| // 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() | |
| } | |
| } |