diff options
Diffstat (limited to 'internal/testhelper/testhelper.go')
-rw-r--r-- | internal/testhelper/testhelper.go | 67 |
1 files changed, 34 insertions, 33 deletions
diff --git a/internal/testhelper/testhelper.go b/internal/testhelper/testhelper.go index 72d803176..cb13ca76b 100644 --- a/internal/testhelper/testhelper.go +++ b/internal/testhelper/testhelper.go @@ -736,23 +736,23 @@ func WriteBlobs(t testing.TB, testRepoPath string, n int) []string { // FeatureSet is a representation of a set of features that are enabled // This is useful in situations where a test needs to test any combination of features toggled on and off type FeatureSet struct { - features map[featureflag.FeatureFlag]bool - rubyFeatures map[featureflag.FeatureFlag]bool + featureIndices map[featureflag.FeatureFlag]int + bitmask int } -func (f FeatureSet) IsEnabled(flag featureflag.FeatureFlag) bool { - on, ok := f.features[flag] - if !ok { - return flag.OnByDefault - } - - return on +func (f FeatureSet) IsEnabled(feature featureflag.FeatureFlag) bool { + return f.featureIndices[feature]&f.bitmask > 0 } func (f FeatureSet) String() string { features := make([]string, 0, len(f.enabledFeatures())) for _, feature := range f.enabledFeatures() { - features = append(features, feature.Name) + switch feature.(type) { + case featureflag.GoFeatureFlag: + features = append(features, feature.GetName()) + case featureflag.RubyFeatureFlag: + features = append(features, feature.GetName()+"(ruby)") + } } return strings.Join(features, ",") @@ -761,20 +761,27 @@ func (f FeatureSet) String() string { func (f FeatureSet) enabledFeatures() []featureflag.FeatureFlag { var enabled []featureflag.FeatureFlag - for feature := range f.features { - enabled = append(enabled, feature) + for feature, featureVal := range f.featureIndices { + if featureVal&f.bitmask > 0 { + enabled = append(enabled, feature) + } } return enabled } func (f FeatureSet) WithParent(ctx context.Context) context.Context { - for _, enabledFeature := range f.enabledFeatures() { - if _, ok := f.rubyFeatures[enabledFeature]; ok { - ctx = featureflag.OutgoingCtxWithRubyFeatureFlags(ctx, enabledFeature) + for feature, featureVal := range f.featureIndices { + if f.bitmask&featureVal == 0 { continue } - ctx = featureflag.OutgoingCtxWithFeatureFlags(ctx, enabledFeature) + + switch feature.(type) { + case featureflag.GoFeatureFlag: + ctx = featureflag.OutgoingCtxWithRubyFeatureFlags(ctx, feature) + case featureflag.RubyFeatureFlag: + ctx = featureflag.OutgoingCtxWithFeatureFlags(ctx, feature) + } } return ctx @@ -785,27 +792,21 @@ type FeatureSets []FeatureSet // NewFeatureSets takes a slice of go feature flags, and an optional variadic set of ruby feature flags // and returns a FeatureSets slice -func NewFeatureSets(goFeatures []featureflag.FeatureFlag, rubyFeatures ...featureflag.FeatureFlag) (FeatureSets, error) { - rubyFeatureMap := make(map[featureflag.FeatureFlag]bool) - for _, rubyFeature := range rubyFeatures { - rubyFeatureMap[rubyFeature] = true - } - - // start with an empty feature set - f := []FeatureSet{{features: make(map[featureflag.FeatureFlag]bool), rubyFeatures: rubyFeatureMap}} +func NewFeatureSets(features []featureflag.FeatureFlag) (FeatureSets, error) { + featureIndices := make(map[featureflag.FeatureFlag]int) - allFeatures := append(goFeatures, rubyFeatures...) - - for i := range allFeatures { - featureMap := make(map[featureflag.FeatureFlag]bool) - for j := 0; j <= i; j++ { - featureMap[allFeatures[j]] = true - } + featureVal := 1 + for _, feature := range features { + featureIndices[feature] = featureVal + featureVal <<= 1 + } - f = append(f, FeatureSet{features: featureMap, rubyFeatures: rubyFeatureMap}) + featureSets := make([]FeatureSet, featureVal) + for i := 0; i < featureVal; i++ { + featureSets[i] = FeatureSet{featureIndices: featureIndices, bitmask: i} } - return f, nil + return featureSets, nil } // ModifyEnvironment will change an environment variable and return a func suitable |