rox-rollout 5.1.0 → 5.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.github/workflows/e2e_tests.yaml +52 -0
- data/.github/workflows/{ruby.yml → unit_tests.yaml} +4 -5
- data/Rakefile +0 -6
- data/e2e-server/run_server.sh +7 -3
- data/e2e-server/server.rb +26 -56
- data/lib/rox/core/analytics/transport.rb +1 -0
- data/lib/rox/core/consts/environment.rb +62 -54
- data/lib/rox/core/core.rb +5 -7
- data/lib/rox/core/entities/rox_double.rb +1 -1
- data/lib/rox/core/entities/rox_int.rb +1 -1
- data/lib/rox/core/network/request_configuration_builder.rb +1 -1
- data/lib/rox/core/network/response.rb +2 -2
- data/lib/rox/core/network/state_sender.rb +1 -1
- data/lib/rox/server/network_configurations_options.rb +20 -0
- data/lib/rox/server/rox_options.rb +3 -9
- data/lib/rox/server/self_managed_options.rb +12 -0
- data/lib/rox/version.rb +1 -1
- data/rox.gemspec +2 -2
- metadata +14 -16
- data/.circleci/config.yml +0 -73
- data/e2e/container.rb +0 -35
- data/e2e/custom_props.rb +0 -55
- data/e2e/rox_e2e_test.rb +0 -202
- data/e2e/test_vars.rb +0 -22
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ae34336f9f49d2ba7a2f77003d3f537eb53bbf4cde40fff04846a4c71d9fe177
|
4
|
+
data.tar.gz: d168174f3d6b72a482b89868d950e4bd8c30c908c0df6d0c11d276aceb8c229d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: be4f8985f0289f5becb88a46f13578d83982ad0b5d471c3241dd8127493cdca9d1479eae63bc87e6c13c81092a37ae63e48bedaa40b806020a497a091e0996f2
|
7
|
+
data.tar.gz: f5c134a9692176e0495bbb3805799a439c14a08b5c160a61148c4affdb7e39f2699d1586e7f853e6bdd7fc43103bd9a66d17fc61b93a9b228627a92a7a6217ba
|
@@ -0,0 +1,52 @@
|
|
1
|
+
name: E2E tests
|
2
|
+
|
3
|
+
on:
|
4
|
+
push:
|
5
|
+
branches:
|
6
|
+
- master
|
7
|
+
pull_request:
|
8
|
+
branches:
|
9
|
+
- master
|
10
|
+
|
11
|
+
jobs:
|
12
|
+
build:
|
13
|
+
|
14
|
+
runs-on: macos-latest
|
15
|
+
|
16
|
+
steps:
|
17
|
+
- uses: actions/checkout@v3
|
18
|
+
with:
|
19
|
+
path: rox-ruby
|
20
|
+
- name: Checkout e2e tests
|
21
|
+
uses: actions/checkout@v3
|
22
|
+
with:
|
23
|
+
repository: rollout/sdk-end-2-end-tests
|
24
|
+
ref: master
|
25
|
+
token: ${{ secrets.E2E_PAT }}
|
26
|
+
path: sdk-end-2-end-tests
|
27
|
+
- name: link driver
|
28
|
+
working-directory: ./sdk-end-2-end-tests/drivers
|
29
|
+
run: ln -s $GITHUB_WORKSPACE/rox-ruby/e2e-server ruby
|
30
|
+
- name: build e2e node driver
|
31
|
+
working-directory: ./sdk-end-2-end-tests/drivers/nodejs
|
32
|
+
run: |
|
33
|
+
yarn install --frozen-lockfile
|
34
|
+
- name: build and run e2e
|
35
|
+
working-directory: ./sdk-end-2-end-tests
|
36
|
+
run: |
|
37
|
+
yarn install --frozen-lockfile
|
38
|
+
QA_E2E_BEARER=$QA_E2E_BEARER API_HOST=https://api.test.rollout.io CD_API_ENDPOINT=https://api.test.rollout.io/device/get_configuration CD_S3_ENDPOINT=https://rox-conf.test.rollout.io/ SS_API_ENDPOINT=https://api.test.rollout.io/device/update_state_store/ SS_S3_ENDPOINT=https://rox-state.test.rollout.io/ CLIENT_DATA_CACHE_KEY=client_data ANALYTICS_ENDPOINT=https://analytic.test.rollout.io/ NOTIFICATIONS_ENDPOINT=https://push.test.rollout.io/sse SDK_LANG=ruby NODE_ENV=container yarn test:env
|
39
|
+
env:
|
40
|
+
QA_E2E_BEARER: ${{ secrets.QA_E2E_BEARER }}
|
41
|
+
- name: Show e2e server driver logs
|
42
|
+
if: ${{ always() }}
|
43
|
+
run: cat ./sdk-end-2-end-tests/drivers/ruby/log_1234.out || echo "no log file"
|
44
|
+
- name: Show e2e server sync driver logs
|
45
|
+
if: ${{ always() }}
|
46
|
+
run: cat ./sdk-end-2-end-tests/drivers/nodejs/log_1233.out || echo "no log file"
|
47
|
+
- name: Show e2e server init ClientData driver logs
|
48
|
+
if: ${{ always() }}
|
49
|
+
run: cat ./sdk-end-2-end-tests/drivers/ruby/log_2234.out || echo "no log file"
|
50
|
+
- name: Show e2e server init ClientData sync driver logs
|
51
|
+
if: ${{ always() }}
|
52
|
+
run: cat ./sdk-end-2-end-tests/drivers/nodejs/log_2233.out || echo "no log file"
|
@@ -1,4 +1,4 @@
|
|
1
|
-
name:
|
1
|
+
name: Unit Tests
|
2
2
|
|
3
3
|
on: [push]
|
4
4
|
|
@@ -8,14 +8,13 @@ jobs:
|
|
8
8
|
fail-fast: false
|
9
9
|
matrix:
|
10
10
|
os: [ubuntu-latest]
|
11
|
-
ruby: [2.
|
11
|
+
ruby: [2.6, 2.7, '3.0', 3.1, 3.2]
|
12
12
|
runs-on: ${{ matrix.os }}
|
13
13
|
steps:
|
14
|
-
- uses: actions/checkout@
|
14
|
+
- uses: actions/checkout@v3
|
15
15
|
- uses: ruby/setup-ruby@v1
|
16
16
|
with:
|
17
17
|
ruby-version: ${{ matrix.ruby }}
|
18
|
-
bundler: 2.
|
18
|
+
bundler: 2.4.6
|
19
19
|
bundler-cache: true # runs 'bundle install' and caches installed gems automatically
|
20
20
|
- run: bundle exec rake test
|
21
|
-
- run: bundle exec rake e2e
|
data/Rakefile
CHANGED
@@ -8,12 +8,6 @@ Rake::TestTask.new(:test) do |t|
|
|
8
8
|
t.test_files = FileList['test/**/*_test.rb']
|
9
9
|
end
|
10
10
|
|
11
|
-
Rake::TestTask.new(:e2e) do |t|
|
12
|
-
t.libs << 'lib'
|
13
|
-
t.libs << 'e2e'
|
14
|
-
t.test_files = FileList['e2e/**/*_test.rb']
|
15
|
-
end
|
16
|
-
|
17
11
|
RuboCop::RakeTask.new(:lint)
|
18
12
|
|
19
13
|
task default: :test
|
data/e2e-server/run_server.sh
CHANGED
@@ -2,9 +2,13 @@
|
|
2
2
|
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )"
|
3
3
|
cd -P "$DIR"
|
4
4
|
DIR=`pwd`
|
5
|
-
|
6
|
-
gem install
|
7
|
-
gem install
|
5
|
+
|
6
|
+
# --conservative will save us some time (hopefully gem install just once)
|
7
|
+
gem install sinatra --conservative
|
8
|
+
gem install sinatra-contrib --conservative
|
9
|
+
gem install json --conservative
|
10
|
+
gem install em-eventsource --conservative
|
11
|
+
|
8
12
|
nohup ruby ./server.rb $1 1>"$DIR"/log_"$1".out 2>&1 &
|
9
13
|
while true ; do
|
10
14
|
curl -p http://127.0.0.1:$1/status-check && exit
|
data/e2e-server/server.rb
CHANGED
@@ -1,18 +1,20 @@
|
|
1
|
+
# comment the following line and install a rox-ruby gem to test a released version
|
2
|
+
$LOAD_PATH.unshift File.expand_path('../lib', __dir__)
|
3
|
+
|
1
4
|
require 'sinatra'
|
2
5
|
require 'sinatra/namespace'
|
3
6
|
require 'json'
|
4
7
|
require 'rox/server/flags/rox_flag'
|
5
8
|
require 'rox/server/rox_server'
|
6
9
|
require 'rox/server/rox_options'
|
10
|
+
require 'rox/server/network_configurations_options'
|
7
11
|
|
8
12
|
class Container
|
9
|
-
|
10
|
-
attr_reader :bool_default_false, :bool_default_true
|
13
|
+
attr_reader :boolDefaultFalse, :boolDefaultTrue
|
11
14
|
|
12
15
|
def initialize
|
13
|
-
@
|
14
|
-
@
|
15
|
-
@first_flag = Rox::Server::RoxFlag.new(true)
|
16
|
+
@boolDefaultFalse = Rox::Server::RoxFlag.new(false)
|
17
|
+
@boolDefaultTrue = Rox::Server::RoxFlag.new(true)
|
16
18
|
end
|
17
19
|
end
|
18
20
|
|
@@ -58,95 +60,63 @@ namespace '/' do
|
|
58
60
|
[200, '']
|
59
61
|
end
|
60
62
|
|
61
|
-
get 'api/values/:id' do |id|
|
62
|
-
if container.first_flag.enabled?
|
63
|
-
[200, JSON.generate({ value: id })]
|
64
|
-
else
|
65
|
-
[200, 'Eladddddd']
|
66
|
-
end
|
67
|
-
end
|
68
|
-
|
69
|
-
put 'api/values/:id' do
|
70
|
-
[200, '']
|
71
|
-
end
|
72
|
-
|
73
|
-
delete 'api/values/:id' do
|
74
|
-
[200, '']
|
75
|
-
end
|
76
|
-
|
77
63
|
post '' do
|
78
64
|
data = JSON.parse(request.body.read)
|
79
65
|
action = data['action']
|
80
66
|
payload = data['payload']
|
81
|
-
puts data
|
82
|
-
|
67
|
+
puts "data => #{data}"
|
83
68
|
case action
|
84
69
|
when 'staticFlagIsEnabled'
|
85
70
|
flag = payload['flag']
|
86
71
|
result = container.send(flag.to_sym).enabled?(payload['context'])
|
87
72
|
[200, JSON.generate({ result: result })]
|
88
73
|
when 'registerStaticContainers'
|
89
|
-
Rox::Server::RoxServer.
|
74
|
+
Rox::Server::RoxServer.register_with_namespace('namespace', container)
|
90
75
|
[200, JSON.generate({ result: 'done' })]
|
91
76
|
when 'setCustomPropertyToThrow'
|
92
77
|
def raise_(ex)
|
93
78
|
raise ex
|
94
79
|
end
|
95
|
-
Rox::Server::RoxServer.set_custom_string_property(payload['key']
|
80
|
+
Rox::Server::RoxServer.set_custom_string_property(payload['key']) do |_context|
|
81
|
+
raise_(StandardError.new "custom property generator error")
|
82
|
+
end
|
96
83
|
[200, JSON.generate({ result: 'done' })]
|
97
84
|
when 'setCustomStringProperty'
|
98
85
|
Rox::Server::RoxServer.set_custom_string_property(payload['key'], payload['value'])
|
99
86
|
[200, JSON.generate({ result: 'done' })]
|
100
87
|
when 'dynamicFlagValue'
|
101
|
-
|
102
|
-
puts "There is a payload[context] => #{payload['context']}"
|
103
|
-
payload['context'].each do |context|
|
104
|
-
key = context[0]
|
105
|
-
value = context[1]
|
106
|
-
Rox::Server::RoxServer.set_custom_string_property(key, value) if value.instance_of? String
|
107
|
-
if value.instance_of? TrueClass
|
108
|
-
Rox::Server::RoxServer.set_custom_boolean_property(key, value)
|
109
|
-
elsif value.instance_of? FalseClass
|
110
|
-
Rox::Server::RoxServer.set_custom_boolean_property(key, value)
|
111
|
-
end
|
112
|
-
Rox::Server::RoxServer.set_custom_int_property(key, value) if value.instance_of? Integer
|
113
|
-
Rox::Server::RoxServer.set_custom_float_property(key, value) if value.instance_of? Float
|
114
|
-
end
|
115
|
-
end
|
116
|
-
result = Rox::Server::RoxServer.dynamic_api.value(payload['flag'], payload['defaultValue'], payload['context'],
|
117
|
-
[])
|
88
|
+
result = Rox::Server::RoxServer.dynamic_api.value(payload['flag'], payload['defaultValue'], payload['context'], [])
|
118
89
|
[200, JSON.generate({ result: result })]
|
119
90
|
when 'dynamicFlagIsEnabled'
|
120
|
-
payload['context']&.each do |context|
|
121
|
-
key = context[0]
|
122
|
-
value = context[1]
|
123
|
-
Rox::Server::RoxServer.set_custom_string_property(key, value) if value.instance_of? String
|
124
|
-
if value.instance_of? TrueClass
|
125
|
-
Rox::Server::RoxServer.set_custom_boolean_property(key, value)
|
126
|
-
elsif value.instance_of? FalseClass
|
127
|
-
Rox::Server::RoxServer.set_custom_boolean_property(key, value)
|
128
|
-
end
|
129
|
-
Rox::Server::RoxServer.set_custom_int_property(key, value) if value.instance_of? Integer
|
130
|
-
Rox::Server::RoxServer.set_custom_float_property(key, value) if value.instance_of? Float
|
131
|
-
end
|
132
91
|
result = Rox::Server::RoxServer.dynamic_api.enabled?(payload['flag'], payload['defaultValue'], payload['context'])
|
133
92
|
[200, JSON.generate({ result: result })]
|
134
93
|
when 'setupAndAwait'
|
135
94
|
env = 'stam'
|
95
|
+
fetch_interval = nil
|
136
96
|
if payload['options']
|
137
97
|
options = payload['options']
|
98
|
+
env = options['env']
|
99
|
+
fetch_interval = options['fetchInterval']
|
138
100
|
if options['configuration']
|
139
101
|
configuration = options['configuration']
|
140
|
-
env = configuration['env']
|
141
102
|
end
|
142
103
|
end
|
104
|
+
network_config = nil
|
143
105
|
case env
|
106
|
+
when 'container'
|
107
|
+
network_config = Rox::Server::NetworkConfigurationsOptions.new(
|
108
|
+
get_config_api_endpoint: configuration['CD_API_ENDPOINT']&.chomp('/'),
|
109
|
+
get_config_cloud_endpoint: configuration['CD_S3_ENDPOINT']&.chomp('/'),
|
110
|
+
send_state_api_endpoint: configuration['SS_API_ENDPOINT']&.chomp('/'),
|
111
|
+
send_state_cloud_endpoint: configuration['SS_S3_ENDPOINT']&.chomp('/'),
|
112
|
+
analytics_endpoint: configuration['ANALYTICS_ENDPOINT']&.chomp('/'),
|
113
|
+
push_notification_endpoint: configuration['NOTIFICATIONS_ENDPOINT']&.chomp('/'))
|
144
114
|
when 'qa'
|
145
115
|
ENV['ROLLOUT_MODE'] = 'QA'
|
146
116
|
when 'localhost'
|
147
117
|
ENV['ROLLOUT_MODE'] = 'LOCAL'
|
148
118
|
end
|
149
|
-
options = Rox::Server::RoxOptions.new(logger: ServerLogger.new)
|
119
|
+
options = Rox::Server::RoxOptions.new(fetch_interval: fetch_interval,logger: ServerLogger.new, network_configurations_options: network_config)
|
150
120
|
puts "options => #{options}"
|
151
121
|
Rox::Server::RoxServer.setup(payload['key'], options).value
|
152
122
|
[200, JSON.generate({ result: 'done' })]
|
@@ -18,6 +18,7 @@ module Rox
|
|
18
18
|
def initialize(device_properties)
|
19
19
|
@device_properties = device_properties
|
20
20
|
uri = URI.parse(Rox::Core::Environment.analytics_path)
|
21
|
+
logger.debug("Using Analytics url #{uri}")
|
21
22
|
@headers = {
|
22
23
|
'Accept' => 'application/json',
|
23
24
|
'Content-Type' => 'application/json',
|
@@ -1,77 +1,85 @@
|
|
1
1
|
module Rox
|
2
2
|
module Core
|
3
3
|
module Environment
|
4
|
+
def self.reset(rox_options = nil)
|
5
|
+
@roxy_internal_path = 'device/request_configuration'
|
6
|
+
if !rox_options&.network_configurations_options.nil?
|
7
|
+
@cdn_path = rox_options&.network_configurations_options&.get_config_cloud_endpoint
|
8
|
+
@api_path = rox_options&.network_configurations_options&.get_config_api_endpoint
|
9
|
+
@state_cdn_path = rox_options&.network_configurations_options&.send_state_cloud_endpoint
|
10
|
+
@state_api_path = rox_options&.network_configurations_options&.send_state_api_endpoint
|
11
|
+
@analytics_path = rox_options&.network_configurations_options&.analytics_endpoint
|
12
|
+
@notifications_path = rox_options&.network_configurations_options&.push_notification_endpoint
|
13
|
+
else
|
14
|
+
case ENV['ROLLOUT_MODE']
|
15
|
+
when 'QA'
|
16
|
+
setQA
|
17
|
+
when 'LOCAL'
|
18
|
+
setLOCAL
|
19
|
+
else
|
20
|
+
setDefault(rox_options)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
4
25
|
def self.roxy_internal_path
|
5
|
-
|
26
|
+
@roxy_internal_path
|
6
27
|
end
|
7
28
|
|
8
29
|
def self.cdn_path
|
9
|
-
|
10
|
-
when 'QA'
|
11
|
-
'https://qa-conf.rollout.io'
|
12
|
-
when 'LOCAL'
|
13
|
-
'https://development-conf.rollout.io'
|
14
|
-
else
|
15
|
-
'https://conf.rollout.io'
|
16
|
-
end
|
30
|
+
@cdn_path
|
17
31
|
end
|
18
32
|
|
19
|
-
def self.api_path
|
20
|
-
|
21
|
-
when 'QA'
|
22
|
-
'https://qa-api.rollout.io/device/get_configuration'
|
23
|
-
when 'LOCAL'
|
24
|
-
'http://127.0.0.1:8557/device/get_configuration'
|
25
|
-
else
|
26
|
-
api_url ||= 'https://x-api.rollout.io'
|
27
|
-
"#{api_url}/device/get_configuration"
|
28
|
-
end
|
33
|
+
def self.api_path
|
34
|
+
@api_path
|
29
35
|
end
|
30
36
|
|
31
37
|
def self.state_cdn_path
|
32
|
-
|
33
|
-
when 'QA'
|
34
|
-
'https://qa-statestore.rollout.io'
|
35
|
-
when 'LOCAL'
|
36
|
-
'https://development-statestore.rollout.io'
|
37
|
-
else
|
38
|
-
'https://statestore.rollout.io'
|
39
|
-
end
|
38
|
+
@state_cdn_path
|
40
39
|
end
|
41
40
|
|
42
|
-
def self.state_api_path
|
43
|
-
|
44
|
-
when 'QA'
|
45
|
-
'https://qa-api.rollout.io/device/update_state_store'
|
46
|
-
when 'LOCAL'
|
47
|
-
'http://127.0.0.1:8557/device/update_state_store'
|
48
|
-
else
|
49
|
-
api_url ||= 'https://x-api.rollout.io'
|
50
|
-
"#{api_url}/device/update_state_store"
|
51
|
-
end
|
41
|
+
def self.state_api_path
|
42
|
+
@state_api_path
|
52
43
|
end
|
53
44
|
|
54
|
-
def self.analytics_path
|
55
|
-
|
56
|
-
when 'QA'
|
57
|
-
'https://qaanalytic.rollout.io'
|
58
|
-
when 'LOCAL'
|
59
|
-
'http://127.0.0.1:8787'
|
60
|
-
else
|
61
|
-
analytics_url
|
62
|
-
end
|
45
|
+
def self.analytics_path
|
46
|
+
@analytics_path
|
63
47
|
end
|
64
48
|
|
65
49
|
def self.notifications_path
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
50
|
+
@notifications_path
|
51
|
+
end
|
52
|
+
|
53
|
+
private
|
54
|
+
def self.setQA()
|
55
|
+
@cdn_path = 'https://qa-conf.rollout.io'
|
56
|
+
@api_path = 'https://qa-api.rollout.io/device/get_configuration'
|
57
|
+
@state_cdn_path = 'https://qa-statestore.rollout.io'
|
58
|
+
@state_api_path = 'https://qa-api.rollout.io/device/update_state_store'
|
59
|
+
@analytics_path = 'https://qaanalytic.rollout.io'
|
60
|
+
@notifications_path = 'https://qax-push.rollout.io/sse'
|
61
|
+
end
|
62
|
+
|
63
|
+
def self.setLOCAL()
|
64
|
+
@cdn_path = 'https://development-conf.rollout.io'
|
65
|
+
@api_path = 'http://127.0.0.1:8557/device/get_configuration'
|
66
|
+
@state_cdn_path = 'https://development-statestore.rollout.io'
|
67
|
+
@state_api_path = 'http://127.0.0.1:8557/device/update_state_store'
|
68
|
+
@analytics_path = 'http://127.0.0.1:8787'
|
69
|
+
@notifications_path = 'http://127.0.0.1:8887/sse'
|
70
|
+
end
|
71
|
+
|
72
|
+
def self.setDefault(rox_options)
|
73
|
+
@cdn_path = 'https://conf.rollout.io'
|
74
|
+
@state_cdn_path = 'https://statestore.rollout.io'
|
75
|
+
alternative_api_url = rox_options&.self_managed_options&.server_url || 'https://x-api.rollout.io'
|
76
|
+
@api_path = "#{alternative_api_url}/device/get_configuration"
|
77
|
+
@state_api_path = "#{alternative_api_url}/device/update_state_store"
|
78
|
+
@analytics_path = rox_options&.self_managed_options&.analytics_url ||'https://analytic.rollout.io'
|
79
|
+
@notifications_path = 'https://push.rollout.io/sse'
|
74
80
|
end
|
75
81
|
end
|
76
82
|
end
|
77
83
|
end
|
84
|
+
|
85
|
+
Rox::Core::Environment.reset
|
data/lib/rox/core/core.rb
CHANGED
@@ -59,6 +59,7 @@ module Rox
|
|
59
59
|
def setup(sdk_settings, device_properties)
|
60
60
|
@sdk_settings = sdk_settings
|
61
61
|
@rox_options = device_properties.rox_options
|
62
|
+
Rox::Core::Environment.reset(@rox_options)
|
62
63
|
|
63
64
|
experiments_extensions = ExperimentsExtensions.new(@parser, @target_group_repository, @flag_repository,
|
64
65
|
@experiment_repository)
|
@@ -70,14 +71,12 @@ module Rox
|
|
70
71
|
|
71
72
|
validate_api_key(sdk_settings&.api_key) if roxy_path.nil?
|
72
73
|
|
73
|
-
# TODO: Analytics.Analytics.Initialize(deviceProperties.RolloutKey, deviceProperties)
|
74
74
|
@internal_flags = InternalFlags.new(@experiment_repository, @parser, @rox_options)
|
75
75
|
|
76
|
-
if
|
76
|
+
if roxy_path.nil?
|
77
77
|
@analytics_client = create_analytics_client(device_properties)
|
78
78
|
end
|
79
79
|
|
80
|
-
# TODO: impressionInvoker = new ImpressionInvoker(internalFlags, customPropertyRepository, deviceProperties, Analytics.Analytics.Client, roxyPath != null);
|
81
80
|
@impression_invoker = ImpressionInvoker.new(@internal_flags, @custom_property_repository, device_properties,
|
82
81
|
@analytics_client, !roxy_path.nil?, @user_unhandled_error_invoker)
|
83
82
|
@flag_setter = FlagSetter.new(@flag_repository, @parser, @experiment_repository, @impression_invoker)
|
@@ -109,14 +108,13 @@ module Rox
|
|
109
108
|
@configuration_fetched_invoker)
|
110
109
|
end
|
111
110
|
|
112
|
-
configuration_fetched_handler = nil
|
113
|
-
configuration_fetched_handler = @rox_options.configuration_fetched_handler unless @rox_options.nil?
|
114
|
-
|
115
111
|
@configuration_fetched_invoker.register_start_stop_push(proc do |args|
|
116
112
|
start_or_stop_push_updated_listener unless args.fetcher_status == FetcherStatus::ERROR_FETCHED_FAILED
|
117
113
|
end)
|
118
114
|
|
119
|
-
|
115
|
+
if !@rox_options.nil? && !@rox_options.configuration_fetched_handler.nil?
|
116
|
+
@configuration_fetched_invoker.register_fetched_handler(&@rox_options.configuration_fetched_handler)
|
117
|
+
end
|
120
118
|
|
121
119
|
@thread = Thread.new do
|
122
120
|
Thread.current.report_on_exception = false if Thread.current.respond_to?(:report_on_exception)
|
@@ -4,7 +4,7 @@ module Rox
|
|
4
4
|
module Core
|
5
5
|
class RoxDouble < RoxString
|
6
6
|
def value(context = nil)
|
7
|
-
return_value = internal_value(context, false, Float)
|
7
|
+
return_value = Rox::Server::NormalizeFlagType.normalize_float(internal_value(context, false, Float))
|
8
8
|
send_impressions(return_value, context)
|
9
9
|
return_value
|
10
10
|
end
|
@@ -4,7 +4,7 @@ module Rox
|
|
4
4
|
module Core
|
5
5
|
class RoxInt < RoxString
|
6
6
|
def value(context = nil)
|
7
|
-
return_value = internal_value(context, false, Integer)
|
7
|
+
return_value = Rox::Server::NormalizeFlagType.normalize_int(internal_value(context, false, Integer))
|
8
8
|
send_impressions(return_value, context)
|
9
9
|
return_value
|
10
10
|
end
|
@@ -23,7 +23,7 @@ module Rox
|
|
23
23
|
end
|
24
24
|
|
25
25
|
def build_for_api
|
26
|
-
build_request_with_full_params("#{Rox::Core::Environment.api_path
|
26
|
+
build_request_with_full_params("#{Rox::Core::Environment.api_path}/#{relative_path}")
|
27
27
|
end
|
28
28
|
|
29
29
|
def relative_path
|
@@ -21,8 +21,8 @@ module Rox
|
|
21
21
|
end
|
22
22
|
|
23
23
|
def missing_via_response_body?
|
24
|
-
|
25
|
-
|
24
|
+
# api send state respons returns 200 'OK', application/json filters it
|
25
|
+
@status_code == 200 && @content_type == 'application/json' && @text && [404, '404'].include?(JSON.parse(text)['result'])
|
26
26
|
rescue JSON::ParserError
|
27
27
|
Logging.logger.error("Failed to parse JSON response: #{text}")
|
28
28
|
false
|
@@ -69,7 +69,7 @@ module Rox
|
|
69
69
|
|
70
70
|
def send_state_to_API(rollout_key, md5_signature, state_payload)
|
71
71
|
@request.send_post(
|
72
|
-
"#{Rox::Core::Environment.state_api_path
|
72
|
+
"#{Rox::Core::Environment.state_api_path}/#{rollout_key}/#{md5_signature}", state_payload
|
73
73
|
)
|
74
74
|
end
|
75
75
|
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module Rox
|
2
|
+
module Server
|
3
|
+
class NetworkConfigurationsOptions
|
4
|
+
attr_reader :get_config_api_endpoint, :get_config_cloud_endpoint,
|
5
|
+
:send_state_api_endpoint, :send_state_cloud_endpoint,
|
6
|
+
:analytics_endpoint, :push_notification_endpoint
|
7
|
+
|
8
|
+
def initialize(get_config_api_endpoint:, get_config_cloud_endpoint:,
|
9
|
+
send_state_api_endpoint:, send_state_cloud_endpoint:,
|
10
|
+
analytics_endpoint:, push_notification_endpoint:)
|
11
|
+
@get_config_api_endpoint = get_config_api_endpoint
|
12
|
+
@get_config_cloud_endpoint = get_config_cloud_endpoint
|
13
|
+
@send_state_api_endpoint = send_state_api_endpoint
|
14
|
+
@send_state_cloud_endpoint = send_state_cloud_endpoint
|
15
|
+
@analytics_endpoint = analytics_endpoint
|
16
|
+
@push_notification_endpoint = push_notification_endpoint
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -3,20 +3,12 @@ require 'rox/server/logging/server_logger'
|
|
3
3
|
|
4
4
|
module Rox
|
5
5
|
module Server
|
6
|
-
class SelfManagedOptions
|
7
|
-
attr_reader :server_url, :analytics_url
|
8
|
-
|
9
|
-
def initialize(server_url:, analytics_url:)
|
10
|
-
@server_url = server_url
|
11
|
-
@analytics_url = analytics_url
|
12
|
-
end
|
13
|
-
end
|
14
|
-
|
15
6
|
class RoxOptions
|
16
7
|
attr_reader :dev_mode_key, :version, :fetch_interval,
|
17
8
|
:logger, :impression_handler,
|
18
9
|
:configuration_fetched_handler,
|
19
10
|
:roxy_url, :self_managed_options,
|
11
|
+
:network_configurations_options,
|
20
12
|
:dynamic_property_rule_handler
|
21
13
|
|
22
14
|
def initialize(
|
@@ -28,6 +20,7 @@ module Rox
|
|
28
20
|
configuration_fetched_handler: nil,
|
29
21
|
roxy_url: nil,
|
30
22
|
self_managed_options: nil,
|
23
|
+
network_configurations_options: nil,
|
31
24
|
dynamic_property_rule_handler: nil
|
32
25
|
)
|
33
26
|
@dev_mode_key = dev_mode_key || 'stam'
|
@@ -45,6 +38,7 @@ module Rox
|
|
45
38
|
@configuration_fetched_handler = configuration_fetched_handler
|
46
39
|
@roxy_url = roxy_url
|
47
40
|
@self_managed_options = self_managed_options
|
41
|
+
@network_configurations_options = network_configurations_options
|
48
42
|
@dynamic_property_rule_handler = dynamic_property_rule_handler || proc do |prop_name, context|
|
49
43
|
context ? context[prop_name] : nil
|
50
44
|
end
|
data/lib/rox/version.rb
CHANGED
data/rox.gemspec
CHANGED
@@ -20,11 +20,11 @@ Gem::Specification.new do |spec|
|
|
20
20
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
21
21
|
spec.require_paths = ['lib']
|
22
22
|
|
23
|
-
spec.required_ruby_version = '>= 2.
|
23
|
+
spec.required_ruby_version = '>= 2.5'
|
24
24
|
|
25
25
|
spec.add_runtime_dependency 'em-eventsource', '~> 0.3.2'
|
26
26
|
|
27
|
-
spec.add_development_dependency 'bundler', '~> 2.
|
27
|
+
spec.add_development_dependency 'bundler', '~> 2.4.6'
|
28
28
|
spec.add_development_dependency 'minitest', '~> 5.11'
|
29
29
|
spec.add_development_dependency 'pry-byebug', '~> 3.7.0'
|
30
30
|
spec.add_development_dependency 'rake', '~> 12.3'
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rox-rollout
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 5.1.
|
4
|
+
version: 5.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- CloudBees
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2023-05-08 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: em-eventsource
|
@@ -30,14 +30,14 @@ dependencies:
|
|
30
30
|
requirements:
|
31
31
|
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: 2.
|
33
|
+
version: 2.4.6
|
34
34
|
type: :development
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
38
|
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: 2.
|
40
|
+
version: 2.4.6
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: minitest
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -108,16 +108,16 @@ dependencies:
|
|
108
108
|
- - "~>"
|
109
109
|
- !ruby/object:Gem::Version
|
110
110
|
version: 3.7.5
|
111
|
-
description:
|
111
|
+
description:
|
112
112
|
email:
|
113
113
|
- support@rollout.io
|
114
114
|
executables: []
|
115
115
|
extensions: []
|
116
116
|
extra_rdoc_files: []
|
117
117
|
files:
|
118
|
-
- ".circleci/config.yml"
|
119
118
|
- ".editorconfig"
|
120
|
-
- ".github/workflows/
|
119
|
+
- ".github/workflows/e2e_tests.yaml"
|
120
|
+
- ".github/workflows/unit_tests.yaml"
|
121
121
|
- ".gitignore"
|
122
122
|
- ".rubocop.yml"
|
123
123
|
- Gemfile
|
@@ -129,10 +129,6 @@ files:
|
|
129
129
|
- e2e-server/.gitignore
|
130
130
|
- e2e-server/run_server.sh
|
131
131
|
- e2e-server/server.rb
|
132
|
-
- e2e/container.rb
|
133
|
-
- e2e/custom_props.rb
|
134
|
-
- e2e/rox_e2e_test.rb
|
135
|
-
- e2e/test_vars.rb
|
136
132
|
- example/local.rb
|
137
133
|
- lib/rox.rb
|
138
134
|
- lib/rox/core/analytics/backoff_policy.rb
|
@@ -226,15 +222,17 @@ files:
|
|
226
222
|
- lib/rox/server/flags/rox_string.rb
|
227
223
|
- lib/rox/server/flags/server_entities_provider.rb
|
228
224
|
- lib/rox/server/logging/server_logger.rb
|
225
|
+
- lib/rox/server/network_configurations_options.rb
|
229
226
|
- lib/rox/server/rox_options.rb
|
230
227
|
- lib/rox/server/rox_server.rb
|
228
|
+
- lib/rox/server/self_managed_options.rb
|
231
229
|
- lib/rox/version.rb
|
232
230
|
- rox.gemspec
|
233
231
|
homepage: https://github.com/rollout/rox-ruby
|
234
232
|
licenses:
|
235
233
|
- Nonstandard
|
236
234
|
metadata: {}
|
237
|
-
post_install_message:
|
235
|
+
post_install_message:
|
238
236
|
rdoc_options: []
|
239
237
|
require_paths:
|
240
238
|
- lib
|
@@ -242,15 +240,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
242
240
|
requirements:
|
243
241
|
- - ">="
|
244
242
|
- !ruby/object:Gem::Version
|
245
|
-
version: '2.
|
243
|
+
version: '2.5'
|
246
244
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
247
245
|
requirements:
|
248
246
|
- - ">="
|
249
247
|
- !ruby/object:Gem::Version
|
250
248
|
version: '0'
|
251
249
|
requirements: []
|
252
|
-
rubygems_version: 3.
|
253
|
-
signing_key:
|
250
|
+
rubygems_version: 3.4.7
|
251
|
+
signing_key:
|
254
252
|
specification_version: 4
|
255
253
|
summary: Feature Management ROX Ruby SDK
|
256
254
|
test_files: []
|
data/.circleci/config.yml
DELETED
@@ -1,73 +0,0 @@
|
|
1
|
-
version: 2.1
|
2
|
-
jobs:
|
3
|
-
test_2-6: &test-template
|
4
|
-
docker:
|
5
|
-
- image: circleci/ruby:2.6.4
|
6
|
-
|
7
|
-
working_directory: ~/repo
|
8
|
-
|
9
|
-
steps:
|
10
|
-
- checkout
|
11
|
-
|
12
|
-
- run:
|
13
|
-
name: install ssh
|
14
|
-
command: |
|
15
|
-
sudo apt-get update
|
16
|
-
sudo apt-get install libssl-dev
|
17
|
-
|
18
|
-
- run:
|
19
|
-
name: install dependencies
|
20
|
-
command: |
|
21
|
-
bundle install --jobs=4 --retry=3 --path vendor/bundle
|
22
|
-
|
23
|
-
- run:
|
24
|
-
name: run tests
|
25
|
-
command: |
|
26
|
-
bundle exec rake test
|
27
|
-
|
28
|
-
- run:
|
29
|
-
name: run tests
|
30
|
-
command: |
|
31
|
-
bundle exec rake e2e
|
32
|
-
|
33
|
-
test_2-5:
|
34
|
-
<<: *test-template
|
35
|
-
docker:
|
36
|
-
- image: circleci/ruby:2.5.6
|
37
|
-
test_2-4:
|
38
|
-
<<: *test-template
|
39
|
-
docker:
|
40
|
-
- image: circleci/ruby:2.4.7
|
41
|
-
test_2-3:
|
42
|
-
<<: *test-template
|
43
|
-
docker:
|
44
|
-
- image: circleci/ruby:2.3.8
|
45
|
-
|
46
|
-
sdk-integration-test:
|
47
|
-
<<: *test-template
|
48
|
-
steps:
|
49
|
-
- run:
|
50
|
-
name: trigger sdk integration test workflow
|
51
|
-
command: >-
|
52
|
-
curl -X POST https://circleci.com/api/v2/project/gh/rollout/sdk-integration-tests/pipeline
|
53
|
-
--header 'Content-Type: application/json'
|
54
|
-
--header 'Accept: application/json'
|
55
|
-
--header 'x-attribution-login: rox-ruby'
|
56
|
-
--header 'x-attribution-actor-id: rox-ruby'
|
57
|
-
--header 'Circle-Token: '$CircleApiToken
|
58
|
-
--data '{"parameters": {"sdk_triggered_run": true, "repo_name": "'$CIRCLE_PROJECT_REPONAME'", "repo_owner": "'$CIRCLE_PROJECT_USERNAME'", "sha": "'$CIRCLE_SHA1'" }}'
|
59
|
-
|
60
|
-
workflows:
|
61
|
-
version: 2
|
62
|
-
test:
|
63
|
-
jobs:
|
64
|
-
- test_2-6
|
65
|
-
- test_2-5
|
66
|
-
- test_2-4
|
67
|
-
- test_2-3
|
68
|
-
- sdk-integration-test:
|
69
|
-
requires:
|
70
|
-
- test_2-6
|
71
|
-
- test_2-5
|
72
|
-
- test_2-4
|
73
|
-
- test_2-3
|
data/e2e/container.rb
DELETED
@@ -1,35 +0,0 @@
|
|
1
|
-
require 'rox/server/flags/rox_flag'
|
2
|
-
require 'rox/server/flags/rox_string'
|
3
|
-
|
4
|
-
module E2E
|
5
|
-
class Container
|
6
|
-
attr_accessor :simple_flag, :simple_flag_overwritten, :flag_for_impression,
|
7
|
-
:flag_for_impression_with_experiment_and_context, :flag_custom_properties,
|
8
|
-
:flag_target_groups_all, :flag_target_groups_any, :flag_target_groups_none,
|
9
|
-
:variant_with_context, :variant, :variant_overwritten, :flag_for_dependency,
|
10
|
-
:flag_dependent, :flag_color_dependent_with_context
|
11
|
-
|
12
|
-
def initialize
|
13
|
-
@simple_flag = Rox::Server::RoxFlag.new(true)
|
14
|
-
@simple_flag_overwritten = Rox::Server::RoxFlag.new(true)
|
15
|
-
|
16
|
-
@flag_for_impression = Rox::Server::RoxFlag.new(false)
|
17
|
-
@flag_for_impression_with_experiment_and_context = Rox::Server::RoxFlag.new(false)
|
18
|
-
|
19
|
-
@flag_custom_properties = Rox::Server::RoxFlag.new
|
20
|
-
|
21
|
-
@flag_target_groups_all = Rox::Server::RoxFlag.new
|
22
|
-
@flag_target_groups_any = Rox::Server::RoxFlag.new
|
23
|
-
@flag_target_groups_none = Rox::Server::RoxFlag.new
|
24
|
-
|
25
|
-
@variant_with_context = Rox::Server::RoxString.new('red', %w[red blue green])
|
26
|
-
|
27
|
-
@variant = Rox::Server::RoxString.new('red', %w[red blue green])
|
28
|
-
@variant_overwritten = Rox::Server::RoxString.new('red', %w[red blue green])
|
29
|
-
|
30
|
-
@flag_for_dependency = Rox::Server::RoxFlag.new(false)
|
31
|
-
@flag_dependent = Rox::Server::RoxFlag.new(false)
|
32
|
-
@flag_color_dependent_with_context = Rox::Server::RoxString.new('White', %w[White Blue Green Yellow])
|
33
|
-
end
|
34
|
-
end
|
35
|
-
end
|
data/e2e/custom_props.rb
DELETED
@@ -1,55 +0,0 @@
|
|
1
|
-
module E2E
|
2
|
-
class CustomProps
|
3
|
-
def self.create_custom_props
|
4
|
-
Rox::Server::RoxServer.set_custom_string_property('string_prop1', 'Hello')
|
5
|
-
Rox::Server::RoxServer.set_custom_string_property('string_prop2') do |_context|
|
6
|
-
TestVars.is_computed_string_prop_called = true
|
7
|
-
'World'
|
8
|
-
end
|
9
|
-
|
10
|
-
Rox::Server::RoxServer.set_custom_boolean_property('bool_prop1', true)
|
11
|
-
Rox::Server::RoxServer.set_custom_boolean_property('bool_prop2') do |_context|
|
12
|
-
TestVars.is_computed_boolean_prop_called = true
|
13
|
-
false
|
14
|
-
end
|
15
|
-
|
16
|
-
Rox::Server::RoxServer.set_custom_int_property('int_prop1', 6)
|
17
|
-
Rox::Server::RoxServer.set_custom_int_property('int_prop2') do |_context|
|
18
|
-
TestVars.is_computed_int_prop_called = true
|
19
|
-
28
|
20
|
-
end
|
21
|
-
|
22
|
-
Rox::Server::RoxServer.set_custom_float_property('float_prop1', 3.14)
|
23
|
-
Rox::Server::RoxServer.set_custom_float_property('float_prop2') do |_context|
|
24
|
-
TestVars.is_computed_float_prop_called = true
|
25
|
-
1.618
|
26
|
-
end
|
27
|
-
|
28
|
-
Rox::Server::RoxServer.set_custom_semver_property('smvr_prop1', '9.11.2001')
|
29
|
-
Rox::Server::RoxServer.set_custom_semver_property('smvr_prop2') do |_context|
|
30
|
-
TestVars.is_computed_semver_prop_called = true
|
31
|
-
'20.7.1969'
|
32
|
-
end
|
33
|
-
|
34
|
-
Rox::Server::RoxServer.set_custom_boolean_property('bool_prop_target_group_for_variant') do |context|
|
35
|
-
context['isDuckAndCover']
|
36
|
-
end
|
37
|
-
|
38
|
-
Rox::Server::RoxServer.set_custom_boolean_property('bool_prop_target_group_operand1') do |_context|
|
39
|
-
TestVars.target_group1
|
40
|
-
end
|
41
|
-
|
42
|
-
Rox::Server::RoxServer.set_custom_boolean_property('bool_prop_target_group_operand2') do |_context|
|
43
|
-
TestVars.target_group2
|
44
|
-
end
|
45
|
-
|
46
|
-
Rox::Server::RoxServer.set_custom_boolean_property('bool_prop_target_group_for_dependency') do |_context|
|
47
|
-
TestVars.is_prop_for_target_group_for_dependency
|
48
|
-
end
|
49
|
-
|
50
|
-
Rox::Server::RoxServer.set_custom_boolean_property('bool_prop_target_group_for_variant_dependency') do |context|
|
51
|
-
context['isDuckAndCover']
|
52
|
-
end
|
53
|
-
end
|
54
|
-
end
|
55
|
-
end
|
data/e2e/rox_e2e_test.rb
DELETED
@@ -1,202 +0,0 @@
|
|
1
|
-
require 'minitest/autorun'
|
2
|
-
require 'rox/server/rox_options'
|
3
|
-
require 'rox/server/rox_server'
|
4
|
-
require 'rox/server/logging/server_logger'
|
5
|
-
require_relative 'container'
|
6
|
-
require_relative 'custom_props'
|
7
|
-
require_relative 'test_vars'
|
8
|
-
|
9
|
-
module E2E
|
10
|
-
class Logger
|
11
|
-
def debug(message, _ex = nil)
|
12
|
-
puts 'Before Rox.Setup', message
|
13
|
-
end
|
14
|
-
|
15
|
-
def error(message, ex = nil)
|
16
|
-
puts 'Before Rox.Setup', message, ex
|
17
|
-
end
|
18
|
-
|
19
|
-
def warn(message, _ex = nil)
|
20
|
-
puts 'Before Rox.Setup', message
|
21
|
-
end
|
22
|
-
end
|
23
|
-
|
24
|
-
class RoxE2ETest < Minitest::Test
|
25
|
-
ENV['ROLLOUT_MODE'] = 'QA'
|
26
|
-
|
27
|
-
@@setupComplete = false
|
28
|
-
@@testsRun = 0
|
29
|
-
|
30
|
-
def setup
|
31
|
-
@@testsRun += 1
|
32
|
-
if !@@setupComplete
|
33
|
-
|
34
|
-
configuration_fetched_handler = proc do |e|
|
35
|
-
if !e.nil? && e.fetcher_status == Rox::Core::FetcherStatus::APPLIED_FROM_NETWORK
|
36
|
-
TestVars.configuration_fetched_count += 1
|
37
|
-
end
|
38
|
-
end
|
39
|
-
|
40
|
-
impression_handler = proc do |e|
|
41
|
-
puts "targeting: #{e.reporting_value.targeting}"
|
42
|
-
if e.reporting_value.targeting
|
43
|
-
puts "#{Time.now}: flag #{e.reporting_value.name} value is #{e.reporting_value.value}"
|
44
|
-
else
|
45
|
-
puts "#{Time.now}: flag #{e.reporting_value.name} has no conditions, or targeting is off. default value #{!!e.reporting_value.value == e.reporting_value.value ? (e.reporting_value.value ? 'true' : 'false') : e.reporting_value.value} was used"
|
46
|
-
end
|
47
|
-
if !e.nil? && !e.reporting_value.nil? && (e.reporting_value.name == 'flag_for_impression')
|
48
|
-
TestVars.is_impression_raised = true
|
49
|
-
TestVars.impression_raised_times += 1
|
50
|
-
end
|
51
|
-
TestVars.impression_returned_args = e
|
52
|
-
end
|
53
|
-
|
54
|
-
option = Rox::Server::RoxOptions.new(
|
55
|
-
configuration_fetched_handler: configuration_fetched_handler,
|
56
|
-
impression_handler: impression_handler,
|
57
|
-
dev_mode_key: '67e39e708444aa953414e444',
|
58
|
-
logger: Rox::Server::ServerLogger.new
|
59
|
-
)
|
60
|
-
|
61
|
-
@@container = Container.new
|
62
|
-
Rox::Server::RoxServer.register(@@container)
|
63
|
-
CustomProps.create_custom_props
|
64
|
-
Rox::Server::RoxServer.setup('5b82864ebc3aec37aff1fdd5', option).join
|
65
|
-
@@setupComplete = true
|
66
|
-
end
|
67
|
-
end
|
68
|
-
|
69
|
-
def teardown
|
70
|
-
if @@testsRun == RoxE2ETest.runnable_methods.length
|
71
|
-
Rox::Server::RoxServer.shutdown
|
72
|
-
end
|
73
|
-
end
|
74
|
-
|
75
|
-
def before_setup
|
76
|
-
TestVars.is_impression_raised = false
|
77
|
-
TestVars.impression_raised_times = 0
|
78
|
-
end
|
79
|
-
|
80
|
-
def test_simple_flag
|
81
|
-
assert_equal true, @@container.simple_flag.enabled?
|
82
|
-
end
|
83
|
-
|
84
|
-
def test_simple_flag_overwritten
|
85
|
-
assert_equal false, @@container.simple_flag_overwritten.enabled?
|
86
|
-
end
|
87
|
-
|
88
|
-
def test_string
|
89
|
-
assert_equal 'red', @@container.variant.value
|
90
|
-
end
|
91
|
-
|
92
|
-
def test_variant_overwritten
|
93
|
-
assert_equal 'green', @@container.variant_overwritten.value
|
94
|
-
end
|
95
|
-
|
96
|
-
def test_all_custom_properties
|
97
|
-
assert_equal true, @@container.flag_custom_properties.enabled?
|
98
|
-
|
99
|
-
assert_equal true, TestVars.is_computed_boolean_prop_called
|
100
|
-
assert_equal true, TestVars.is_computed_float_prop_called
|
101
|
-
assert_equal true, TestVars.is_computed_int_prop_called
|
102
|
-
assert_equal true, TestVars.is_computed_semver_prop_called
|
103
|
-
assert_equal true, TestVars.is_computed_string_prop_called
|
104
|
-
end
|
105
|
-
|
106
|
-
def test_fetch_within_timeout
|
107
|
-
number_of_config_fetches = TestVars.configuration_fetched_count
|
108
|
-
timeout = 5
|
109
|
-
thread = Rox::Server::RoxServer.fetch
|
110
|
-
res = thread.join(timeout)
|
111
|
-
|
112
|
-
if res.nil?
|
113
|
-
flunk('timeout')
|
114
|
-
else
|
115
|
-
assert number_of_config_fetches < TestVars.configuration_fetched_count
|
116
|
-
end
|
117
|
-
end
|
118
|
-
|
119
|
-
def test_string_with_context
|
120
|
-
some_positive_context = { 'isDuckAndCover' => true }
|
121
|
-
some_negative_context = { 'isDuckAndCover' => false }
|
122
|
-
|
123
|
-
assert_equal 'red', @@container.variant_with_context.value
|
124
|
-
|
125
|
-
assert_equal 'blue', @@container.variant_with_context.value(some_positive_context)
|
126
|
-
assert_equal 'red', @@container.variant_with_context.value(some_negative_context)
|
127
|
-
end
|
128
|
-
|
129
|
-
def test_target_groups_all_any_none
|
130
|
-
TestVars.target_group1 = true
|
131
|
-
TestVars.target_group2 = true
|
132
|
-
|
133
|
-
assert_equal true, @@container.flag_target_groups_all.enabled?
|
134
|
-
assert_equal true, @@container.flag_target_groups_any.enabled?
|
135
|
-
assert_equal false, @@container.flag_target_groups_none.enabled?
|
136
|
-
|
137
|
-
TestVars.target_group1 = false
|
138
|
-
assert_equal false, @@container.flag_target_groups_all.enabled?
|
139
|
-
assert_equal true, @@container.flag_target_groups_any.enabled?
|
140
|
-
assert_equal false, @@container.flag_target_groups_none.enabled?
|
141
|
-
|
142
|
-
TestVars.target_group2 = false
|
143
|
-
assert_equal false, @@container.flag_target_groups_all.enabled?
|
144
|
-
assert_equal false, @@container.flag_target_groups_any.enabled?
|
145
|
-
assert_equal true, @@container.flag_target_groups_none.enabled?
|
146
|
-
end
|
147
|
-
|
148
|
-
def test_impression_handler
|
149
|
-
@@container.flag_for_impression.enabled?
|
150
|
-
assert_equal true, TestVars.is_impression_raised
|
151
|
-
TestVars.is_impression_raised = false
|
152
|
-
|
153
|
-
context = { 'var' => 'val' }
|
154
|
-
flag_impression_value = @@container.flag_for_impression_with_experiment_and_context.enabled?(context)
|
155
|
-
refute_nil TestVars.impression_returned_args
|
156
|
-
refute_nil TestVars.impression_returned_args.reporting_value
|
157
|
-
assert_equal true, TestVars.impression_returned_args.reporting_value.value
|
158
|
-
assert_equal true, flag_impression_value
|
159
|
-
assert_equal 'flag_for_impression_with_experiment_and_context',
|
160
|
-
TestVars.impression_returned_args.reporting_value.name
|
161
|
-
|
162
|
-
refute_nil TestVars.impression_returned_args
|
163
|
-
|
164
|
-
assert_equal 'val', TestVars.impression_returned_args.context['var']
|
165
|
-
end
|
166
|
-
|
167
|
-
def test_static_flag_impression_raised_once
|
168
|
-
assert_equal false, TestVars.is_impression_raised
|
169
|
-
assert_equal 0, TestVars.impression_raised_times
|
170
|
-
@@container.flag_for_impression.enabled?
|
171
|
-
assert_equal true, TestVars.is_impression_raised
|
172
|
-
assert_equal 1, TestVars.impression_raised_times
|
173
|
-
end
|
174
|
-
|
175
|
-
def test_dynamic_flag_impression_raised_once
|
176
|
-
assert_equal false, TestVars.is_impression_raised
|
177
|
-
assert_equal 0, TestVars.impression_raised_times
|
178
|
-
Rox::Server::RoxServer::dynamic_api.enabled?('flag_for_impression', true)
|
179
|
-
assert_equal true, TestVars.is_impression_raised
|
180
|
-
assert_equal 1, TestVars.impression_raised_times
|
181
|
-
end
|
182
|
-
|
183
|
-
def test_flag_dependency
|
184
|
-
TestVars.is_prop_for_target_group_for_dependency = true
|
185
|
-
assert_equal true, @@container.flag_for_dependency.enabled?
|
186
|
-
assert_equal false, @@container.flag_dependent.enabled?
|
187
|
-
|
188
|
-
TestVars.is_prop_for_target_group_for_dependency = false
|
189
|
-
assert_equal true, @@container.flag_dependent.enabled?
|
190
|
-
assert_equal false, @@container.flag_for_dependency.enabled?
|
191
|
-
end
|
192
|
-
|
193
|
-
def test_string_dependency_with_context
|
194
|
-
some_positive_context = { 'isDuckAndCover' => true }
|
195
|
-
some_negative_context = { 'isDuckAndCover' => false }
|
196
|
-
|
197
|
-
assert_equal 'White', @@container.flag_color_dependent_with_context.value
|
198
|
-
assert_equal 'White', @@container.flag_color_dependent_with_context.value(some_negative_context)
|
199
|
-
assert_equal 'Yellow', @@container.flag_color_dependent_with_context.value(some_positive_context)
|
200
|
-
end
|
201
|
-
end
|
202
|
-
end
|
data/e2e/test_vars.rb
DELETED
@@ -1,22 +0,0 @@
|
|
1
|
-
module E2E
|
2
|
-
module TestVars
|
3
|
-
class << self
|
4
|
-
attr_accessor :is_computed_boolean_prop_called, :is_computed_string_prop_called, :is_computed_int_prop_called,
|
5
|
-
:is_computed_float_prop_called, :is_computed_semver_prop_called, :target_group1, :target_group2, :is_impression_raised, :impression_raised_times, :is_prop_for_target_group_for_dependency, :configuration_fetched_count, :impression_returned_args
|
6
|
-
end
|
7
|
-
|
8
|
-
@is_computed_boolean_prop_called = false
|
9
|
-
@is_computed_string_prop_called = false
|
10
|
-
@is_computed_int_prop_called = false
|
11
|
-
@is_computed_float_prop_called = false
|
12
|
-
@is_computed_semver_prop_called = false
|
13
|
-
@target_group1 = false
|
14
|
-
@target_group2 = false
|
15
|
-
@is_impression_raised = false
|
16
|
-
@impression_raised_times = 0
|
17
|
-
@is_prop_for_target_group_for_dependency = false
|
18
|
-
|
19
|
-
@configuration_fetched_count = 0
|
20
|
-
@impression_returned_args = nil
|
21
|
-
end
|
22
|
-
end
|