// Copyright 2022 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 ( "testing" ) func TestFallbackPanic(t *testing.T) { defer func() { if recover() == nil { t.Fatal("Multiple calls to SetFallbackRoots should panic") } }() SetFallbackRoots(nil) SetFallbackRoots(nil) } func TestFallback(t *testing.T) { // call systemRootsPool so that the sync.Once is triggered, and we can // manipulate systemRoots without worrying about our working being overwritten systemRootsPool() if systemRoots != nil { originalSystemRoots := *systemRoots defer func() { systemRoots = &originalSystemRoots }() } tests := []struct { name string systemRoots *CertPool systemPool bool poolContent []*Certificate forceFallback bool returnsFallback bool }{ { name: "nil systemRoots", returnsFallback: true, }, { name: "empty systemRoots", systemRoots: NewCertPool(), returnsFallback: true, }, { name: "empty systemRoots system pool", systemRoots: NewCertPool(), systemPool: true, }, { name: "filled systemRoots system pool", systemRoots: NewCertPool(), poolContent: []*Certificate{{}}, systemPool: true, }, { name: "filled systemRoots", systemRoots: NewCertPool(), poolContent: []*Certificate{{}}, }, { name: "filled systemRoots, force fallback", systemRoots: NewCertPool(), poolContent: []*Certificate{{}}, forceFallback: true, returnsFallback: true, }, { name: "filled systemRoot system pool, force fallback", systemRoots: NewCertPool(), poolContent: []*Certificate{{}}, systemPool: true, forceFallback: true, returnsFallback: true, }, } for _, tc := range tests { t.Run(tc.name, func(t *testing.T) { fallbacksSet = false systemRoots = tc.systemRoots if systemRoots != nil { systemRoots.systemPool = tc.systemPool } for _, c := range tc.poolContent { systemRoots.AddCert(c) } if tc.forceFallback { t.Setenv("GODEBUG", "x509usefallbackroots=1") } else { t.Setenv("GODEBUG", "x509usefallbackroots=0") } fallbackPool := NewCertPool() SetFallbackRoots(fallbackPool) systemPoolIsFallback := systemRoots == fallbackPool if tc.returnsFallback && !systemPoolIsFallback { t.Error("systemRoots was not set to fallback pool") } else if !tc.returnsFallback && systemPoolIsFallback { t.Error("systemRoots was set to fallback pool when it shouldn't have been") } }) } }