blob: fd1e84a56913b2b952cafea0a86578003e6d0922 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
|
# frozen_string_literal: true
module QA
module Specs
module Helpers
class FeatureSetup
class << self
# Set up feature flags
#
# @return [void]
def configure!
configure_rspec
end
private
# Add global hooks to perform feature flag changes
#
# @return [void]
def configure_rspec
setup = new
::RSpec.configure do |config|
config.before(:suite) { setup.run_before }
config.after(:suite) { setup.run_after }
end
end
end
FF_PATTERN = /[a-z_]+=(enabled|disabled)/
private_class_method :new
def initialize
@options = Support::GlobalOptions.get
@enable_feature = options[:enable_feature]
@disable_feature = options[:disable_feature]
end
# Run feature setup before suite
#
# @return [void]
def run_before
set_feature_flags
enable_features
disable_features
end
# Restore feature state after suite
#
# @return [void]
def run_after
Runtime::Feature.disable(enable_feature) if enable_feature && !enabled
Runtime::Feature.enable(disable_feature) if disable_feature && !disabled
end
private
delegate :logger, to: Runtime::Logger
attr_reader :options, :enable_feature, :disable_feature, :enabled, :disabled
# Feature flags to set
#
# @return [<String, nil>]
def feature_flags
return @feature_flags if defined?(@feature_flags)
@feature_flags ||= options[:set_feature_flags] || feature_flags_from_env
end
# Fetch feature flags from environment variable
#
# @return [<Hash, nil>]
def feature_flags_from_env
ff = ENV["QA_FEATURE_FLAGS"]
return if ff.blank?
ff.split(",").each_with_object({}) do |flag, hash|
unless flag.match?(FF_PATTERN)
error_msg = "'#{flag}' in QA_FEATURE_FLAGS environment variable doesn't match pattern '#{FF_PATTERN}'"
next logger.error(error_msg)
end
name, value = flag.split("=")
hash[name] = value
end
end
# Update group of feature flags
#
# @return [void]
def set_feature_flags
return unless feature_flags
Runtime::Feature.set(feature_flags)
end
# Enable features
#
# @return [void]
def enable_features
return unless enable_feature
@enabled = Runtime::Feature.enabled?(enable_feature)
return if @enabled
Runtime::Feature.enable(enable_feature)
end
# Disable features
#
# @return [void]
def disable_features
return unless disable_feature
@disabled = !Runtime::Feature.enabled?(disable_feature)
return if @disabled
Runtime::Feature.disable(disable_feature)
end
end
end
end
end
|