// 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 fipstest import ( "crypto/internal/fips140" "testing" ) func TestIndicator(t *testing.T) { fips140.ResetServiceIndicator() if fips140.ServiceIndicator() { t.Error("indicator should be false if no calls are made") } fips140.ResetServiceIndicator() fips140.RecordApproved() if !fips140.ServiceIndicator() { t.Error("indicator should be true if RecordApproved is called") } fips140.ResetServiceIndicator() fips140.RecordApproved() fips140.RecordApproved() if !fips140.ServiceIndicator() { t.Error("indicator should be true if RecordApproved is called multiple times") } fips140.ResetServiceIndicator() fips140.RecordNonApproved() if fips140.ServiceIndicator() { t.Error("indicator should be false if RecordNonApproved is called") } fips140.ResetServiceIndicator() fips140.RecordApproved() fips140.RecordNonApproved() if fips140.ServiceIndicator() { t.Error("indicator should be false if both RecordApproved and RecordNonApproved are called") } fips140.ResetServiceIndicator() fips140.RecordNonApproved() fips140.RecordApproved() if fips140.ServiceIndicator() { t.Error("indicator should be false if both RecordNonApproved and RecordApproved are called") } fips140.ResetServiceIndicator() fips140.RecordNonApproved() done := make(chan struct{}) go func() { fips140.ResetServiceIndicator() fips140.RecordApproved() close(done) }() <-done if fips140.ServiceIndicator() { t.Error("indicator should be false if RecordApproved is called in a different goroutine") } fips140.ResetServiceIndicator() fips140.RecordApproved() done = make(chan struct{}) go func() { fips140.ResetServiceIndicator() fips140.RecordNonApproved() close(done) }() <-done if !fips140.ServiceIndicator() { t.Error("indicator should be true if RecordNonApproved is called in a different goroutine") } }