34 lines
1.2 KiB
Go
34 lines
1.2 KiB
Go
|
package experiments
|
||
|
|
||
|
import (
|
||
|
"testing"
|
||
|
)
|
||
|
|
||
|
// OverrideForTesting temporarily overrides the global tables
|
||
|
// of experiments in order to allow for a predictable set when unit testing
|
||
|
// the experiments infrastructure code.
|
||
|
//
|
||
|
// The correct way to use this function is to defer a call to its result so
|
||
|
// that the original tables can be restored at the conclusion of the calling
|
||
|
// test:
|
||
|
//
|
||
|
// defer experiments.OverrideForTesting(t, current, concluded)()
|
||
|
//
|
||
|
// This function modifies global variables that are normally fixed throughout
|
||
|
// our execution, so this function must not be called from non-test code and
|
||
|
// any test using it cannot safely run concurrently with other tests.
|
||
|
func OverrideForTesting(t *testing.T, current Set, concluded map[Experiment]string) func() {
|
||
|
// We're not currently using the given *testing.T in here, but we're
|
||
|
// requiring it anyway in case we might need it in future, and because
|
||
|
// it hopefully reinforces that only test code should be calling this.
|
||
|
|
||
|
realCurrents := currentExperiments
|
||
|
realConcludeds := concludedExperiments
|
||
|
currentExperiments = current
|
||
|
concludedExperiments = concluded
|
||
|
return func() {
|
||
|
currentExperiments = realCurrents
|
||
|
concludedExperiments = realConcludeds
|
||
|
}
|
||
|
}
|