| 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 |
| } |
| } |