prefab-cloud-ruby 0.24.2 → 0.24.4

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.
Files changed (44) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ruby.yml +1 -1
  3. data/.rubocop.yml +13 -0
  4. data/CHANGELOG.md +76 -0
  5. data/Gemfile.lock +4 -4
  6. data/VERSION +1 -1
  7. data/bin/console +21 -0
  8. data/compile_protos.sh +6 -0
  9. data/lib/prefab/client.rb +25 -4
  10. data/lib/prefab/config_client.rb +16 -6
  11. data/lib/prefab/config_loader.rb +1 -1
  12. data/lib/prefab/config_resolver.rb +2 -4
  13. data/lib/prefab/config_value_wrapper.rb +18 -0
  14. data/lib/prefab/context.rb +22 -2
  15. data/lib/prefab/context_shape.rb +20 -0
  16. data/lib/prefab/context_shape_aggregator.rb +63 -0
  17. data/lib/prefab/criteria_evaluator.rb +61 -41
  18. data/lib/prefab/evaluated_configs_aggregator.rb +60 -0
  19. data/lib/prefab/evaluated_keys_aggregator.rb +41 -0
  20. data/lib/prefab/local_config_parser.rb +13 -13
  21. data/lib/prefab/log_path_aggregator.rb +64 -0
  22. data/lib/prefab/logger_client.rb +29 -16
  23. data/lib/prefab/options.rb +46 -1
  24. data/lib/prefab/periodic_sync.rb +51 -0
  25. data/lib/prefab/time_helpers.rb +7 -0
  26. data/lib/prefab-cloud-ruby.rb +8 -1
  27. data/lib/prefab_pb.rb +33 -220
  28. data/prefab-cloud-ruby.gemspec +21 -5
  29. data/test/test_config_loader.rb +15 -15
  30. data/test/test_config_resolver.rb +102 -102
  31. data/test/test_config_value_unwrapper.rb +13 -13
  32. data/test/test_context.rb +42 -0
  33. data/test/test_context_shape.rb +51 -0
  34. data/test/test_context_shape_aggregator.rb +137 -0
  35. data/test/test_criteria_evaluator.rb +253 -150
  36. data/test/test_evaluated_configs_aggregator.rb +254 -0
  37. data/test/test_evaluated_keys_aggregator.rb +54 -0
  38. data/test/test_helper.rb +34 -2
  39. data/test/test_log_path_aggregator.rb +57 -0
  40. data/test/test_logger.rb +61 -76
  41. data/test/test_weighted_value_resolver.rb +2 -2
  42. metadata +21 -5
  43. data/lib/prefab/log_path_collector.rb +0 -102
  44. data/test/test_log_path_collector.rb +0 -58
data/test/test_logger.rb CHANGED
@@ -10,10 +10,10 @@ class TestLogger < Minitest::Test
10
10
  WRONG_ENV_VALUE = 'ERROR'
11
11
  PROJECT_ENV_ID = 1
12
12
 
13
- DEFAULT_ROW = Prefab::ConfigRow.new(
13
+ DEFAULT_ROW = PrefabProto::ConfigRow.new(
14
14
  values: [
15
- Prefab::ConditionalValue.new(
16
- value: Prefab::ConfigValue.new(log_level: DEFAULT_VALUE)
15
+ PrefabProto::ConditionalValue.new(
16
+ value: PrefabProto::ConfigValue.new(log_level: DEFAULT_VALUE)
17
17
  )
18
18
  ]
19
19
  )
@@ -85,46 +85,47 @@ class TestLogger < Minitest::Test
85
85
  end
86
86
 
87
87
  def test_log_internal
88
- logger, mock_logdev = mock_logger_expecting(/W, \[.*\] WARN -- cloud.prefab.client.test.path: : test message/)
89
- logger.log_internal('test message', 'test.path', '', ::Logger::WARN)
90
- mock_logdev.verify
88
+ prefab, io = captured_logger
89
+ prefab.log.log_internal('test message', 'test.path', '', ::Logger::WARN)
90
+ assert_logged io, 'WARN', "cloud.prefab.client.test.path", "test message"
91
91
  end
92
92
 
93
93
  def test_log_internal_unknown
94
- logger, mock_logdev = mock_logger_expecting(/A, \[.*\] ANY -- cloud.prefab.client.test.path: : test message/)
95
- logger.log_internal('test message', 'test.path', '', ::Logger::UNKNOWN)
96
- mock_logdev.verify
94
+ prefab, io = captured_logger
95
+ prefab.log.log_internal('test message', 'test.path', '', ::Logger::UNKNOWN)
96
+ assert_logged io, 'ANY', "cloud.prefab.client.test.path", "test message"
97
97
  end
98
98
 
99
99
  def test_log_internal_silencing
100
- logger, mock_logdev = mock_logger_expecting(/W, \[.*\] WARN -- cloud.prefab.client.test.path: : should log/,
101
- calls: 2)
102
- logger.silence do
103
- logger.log_internal('should not log', 'test.path', '', ::Logger::WARN)
100
+ prefab, io = captured_logger
101
+ prefab.log.silence do
102
+ prefab.log.log_internal('should not log', 'test.path', '', ::Logger::WARN)
104
103
  end
105
- logger.log_internal('should log', 'test.path', '', ::Logger::WARN)
106
- mock_logdev.verify
104
+ prefab.log.log_internal('should log', 'test.path', '', ::Logger::WARN)
105
+ assert_logged io, 'WARN', "cloud.prefab.client.test.path", "should log"
106
+ refute_logged io, 'should not log'
107
107
  end
108
108
 
109
109
  def test_log
110
- logger, mock_logdev = mock_logger_expecting(/W, \[.*\] WARN -- test.path: : test message/)
111
- logger.log('test message', 'test.path', '', ::Logger::WARN)
112
- mock_logdev.verify
110
+ prefab, io = captured_logger
111
+ prefab.log.log('test message', 'test.path', '', ::Logger::WARN)
112
+ assert_logged io, 'WARN', "test.path", "test message"
113
113
  end
114
114
 
115
115
  def test_log_unknown
116
- logger, mock_logdev = mock_logger_expecting(/A, \[.*\] ANY -- test.path: : test message/)
117
- logger.log('test message', 'test.path', '', ::Logger::UNKNOWN)
118
- mock_logdev.verify
116
+ prefab, io = captured_logger
117
+ prefab.log.log('test message', 'test.path', '', ::Logger::UNKNOWN)
118
+ assert_logged io, 'ANY', "test.path", "test message"
119
119
  end
120
120
 
121
121
  def test_log_silencing
122
- logger, mock_logdev = mock_logger_expecting(/W, \[.*\] WARN -- test.path: : should log/, calls: 2)
123
- logger.silence do
124
- logger.log('should not log', 'test.path', '', ::Logger::WARN)
122
+ prefab, io = captured_logger
123
+ prefab.log.silence do
124
+ prefab.log.log('should not log', 'test.path', '', ::Logger::WARN)
125
125
  end
126
- logger.log('should log', 'test.path', '', ::Logger::WARN)
127
- mock_logdev.verify
126
+ prefab.log.log('should log', 'test.path', '', ::Logger::WARN)
127
+ assert_logged io, 'WARN', "test.path", "should log"
128
+ refute_logged io, 'should not log'
128
129
  end
129
130
 
130
131
  def test_logging_with_prefix
@@ -163,7 +164,7 @@ class TestLogger < Minitest::Test
163
164
  prefab.log.progname = 'MY_PROGNAME'
164
165
  prefab.log.error message
165
166
 
166
- assert_logged io, 'ERROR', 'MY_PROGNAME test.test_logger.test_logging_with_a_progname', message
167
+ assert_logged io, 'ERROR', 'MY_PROGNAME: test.test_logger.test_logging_with_a_progname', message
167
168
  end
168
169
 
169
170
  def test_logging_with_a_progname_and_no_message
@@ -172,50 +173,50 @@ class TestLogger < Minitest::Test
172
173
  prefab.log.progname = 'MY_PROGNAME'
173
174
  prefab.log.error
174
175
 
175
- assert_logged io, 'ERROR', 'MY_PROGNAME test.test_logger.test_logging_with_a_progname_and_no_message', 'MY_PROGNAME'
176
+ assert_logged io, 'ERROR', 'MY_PROGNAME: test.test_logger.test_logging_with_a_progname_and_no_message', 'MY_PROGNAME'
176
177
  end
177
178
 
178
179
  def test_logging_with_criteria_on_top_level_key
179
180
  prefix = 'my.own.prefix'
180
181
 
181
- config = Prefab::Config.new(
182
+ config = PrefabProto::Config.new(
182
183
  key: 'log-level',
183
184
  rows: [
184
185
  DEFAULT_ROW,
185
186
 
186
187
  # wrong env
187
- Prefab::ConfigRow.new(
188
+ PrefabProto::ConfigRow.new(
188
189
  project_env_id: TEST_ENV_ID,
189
190
  values: [
190
- Prefab::ConditionalValue.new(
191
+ PrefabProto::ConditionalValue.new(
191
192
  criteria: [
192
- Prefab::Criterion.new(
193
- operator: Prefab::Criterion::CriterionOperator::PROP_IS_ONE_OF,
193
+ PrefabProto::Criterion.new(
194
+ operator: PrefabProto::Criterion::CriterionOperator::PROP_IS_ONE_OF,
194
195
  value_to_match: string_list(['hotmail.com', 'gmail.com']),
195
196
  property_name: 'user.email_suffix'
196
197
  )
197
198
  ],
198
- value: Prefab::ConfigValue.new(log_level: WRONG_ENV_VALUE)
199
+ value: PrefabProto::ConfigValue.new(log_level: WRONG_ENV_VALUE)
199
200
  )
200
201
  ]
201
202
  ),
202
203
 
203
204
  # correct env
204
- Prefab::ConfigRow.new(
205
+ PrefabProto::ConfigRow.new(
205
206
  project_env_id: PROJECT_ENV_ID,
206
207
  values: [
207
- Prefab::ConditionalValue.new(
208
+ PrefabProto::ConditionalValue.new(
208
209
  criteria: [
209
- Prefab::Criterion.new(
210
- operator: Prefab::Criterion::CriterionOperator::PROP_IS_ONE_OF,
210
+ PrefabProto::Criterion.new(
211
+ operator: PrefabProto::Criterion::CriterionOperator::PROP_IS_ONE_OF,
211
212
  value_to_match: string_list(['hotmail.com', 'gmail.com']),
212
213
  property_name: 'user.email_suffix'
213
214
  )
214
215
  ],
215
- value: Prefab::ConfigValue.new(log_level: DESIRED_VALUE)
216
+ value: PrefabProto::ConfigValue.new(log_level: DESIRED_VALUE)
216
217
  ),
217
- Prefab::ConditionalValue.new(
218
- value: Prefab::ConfigValue.new(log_level: DEFAULT_ENV_VALUE)
218
+ PrefabProto::ConditionalValue.new(
219
+ value: PrefabProto::ConfigValue.new(log_level: DEFAULT_ENV_VALUE)
219
220
  )
220
221
  ]
221
222
  )
@@ -271,56 +272,56 @@ class TestLogger < Minitest::Test
271
272
  def test_logging_with_criteria_on_key_path
272
273
  prefix = 'my.own.prefix'
273
274
 
274
- config = Prefab::Config.new(
275
+ config = PrefabProto::Config.new(
275
276
  key: 'log-level.my.own.prefix.test.test_logger',
276
277
  rows: [
277
278
  DEFAULT_ROW,
278
279
 
279
280
  # wrong env
280
- Prefab::ConfigRow.new(
281
+ PrefabProto::ConfigRow.new(
281
282
  project_env_id: TEST_ENV_ID,
282
283
  values: [
283
- Prefab::ConditionalValue.new(
284
+ PrefabProto::ConditionalValue.new(
284
285
  criteria: [
285
- Prefab::Criterion.new(
286
- operator: Prefab::Criterion::CriterionOperator::PROP_IS_ONE_OF,
286
+ PrefabProto::Criterion.new(
287
+ operator: PrefabProto::Criterion::CriterionOperator::PROP_IS_ONE_OF,
287
288
  value_to_match: string_list(['hotmail.com', 'gmail.com']),
288
289
  property_name: 'email_suffix'
289
290
  )
290
291
  ],
291
- value: Prefab::ConfigValue.new(log_level: WRONG_ENV_VALUE)
292
+ value: PrefabProto::ConfigValue.new(log_level: WRONG_ENV_VALUE)
292
293
  )
293
294
  ]
294
295
  ),
295
296
 
296
297
  # correct env
297
- Prefab::ConfigRow.new(
298
+ PrefabProto::ConfigRow.new(
298
299
  project_env_id: PROJECT_ENV_ID,
299
300
  values: [
300
- Prefab::ConditionalValue.new(
301
+ PrefabProto::ConditionalValue.new(
301
302
  criteria: [
302
- Prefab::Criterion.new(
303
- operator: Prefab::Criterion::CriterionOperator::PROP_IS_ONE_OF,
303
+ PrefabProto::Criterion.new(
304
+ operator: PrefabProto::Criterion::CriterionOperator::PROP_IS_ONE_OF,
304
305
  value_to_match: string_list(['hotmail.com', 'gmail.com']),
305
306
  property_name: 'user.email_suffix'
306
307
  )
307
308
  ],
308
- value: Prefab::ConfigValue.new(log_level: DESIRED_VALUE)
309
+ value: PrefabProto::ConfigValue.new(log_level: DESIRED_VALUE)
309
310
  ),
310
311
 
311
- Prefab::ConditionalValue.new(
312
+ PrefabProto::ConditionalValue.new(
312
313
  criteria: [
313
- Prefab::Criterion.new(
314
- operator: Prefab::Criterion::CriterionOperator::PROP_IS_ONE_OF,
314
+ PrefabProto::Criterion.new(
315
+ operator: PrefabProto::Criterion::CriterionOperator::PROP_IS_ONE_OF,
315
316
  value_to_match: string_list(%w[user:4567]),
316
317
  property_name: 'user.tracking_id'
317
318
  )
318
319
  ],
319
- value: Prefab::ConfigValue.new(log_level: DESIRED_VALUE)
320
+ value: PrefabProto::ConfigValue.new(log_level: DESIRED_VALUE)
320
321
  ),
321
322
 
322
- Prefab::ConditionalValue.new(
323
- value: Prefab::ConfigValue.new(log_level: DEFAULT_ENV_VALUE)
323
+ PrefabProto::ConditionalValue.new(
324
+ value: PrefabProto::ConfigValue.new(log_level: DEFAULT_ENV_VALUE)
324
325
  )
325
326
  ]
326
327
  )
@@ -399,35 +400,19 @@ class TestLogger < Minitest::Test
399
400
  raise 'THIS WILL NEVER BE EVALUATED'
400
401
  end
401
402
 
402
- assert_logged io, 'ERROR', 'test.test_logger.test_logging_with_a_block', ' ' + message
403
+ assert_logged io, 'ERROR', 'test.test_logger.test_logging_with_a_block', message
403
404
  end
404
405
 
405
406
  private
406
407
 
407
408
  def assert_logged(logged_io, level, path, message)
408
- assert_match(/#{level}\s+\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2} [-+]?\d+:\s+#{path}: #{message}\n/, logged_io.string)
409
+ assert_match(/#{level}\s+\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2} [-+]?\d+:\s+#{path} #{message}\n/, logged_io.string)
409
410
  end
410
411
 
411
412
  def refute_logged(logged_io, message)
412
413
  refute_match(/#{message}/, logged_io.string)
413
414
  end
414
415
 
415
- def mock_logger_expecting(pattern, configs = {}, calls: 1)
416
- mock_logdev = Minitest::Mock.new
417
- mock_logdev.expect :write, nil do |arg|
418
- pattern.match(arg)
419
- end
420
-
421
- calls.times.each do
422
- mock_logdev.expect(:nil?, false)
423
- end
424
-
425
- logger = Prefab::LoggerClient.new($stdout)
426
- logger.instance_variable_set('@logdev', mock_logdev)
427
- logger.set_config_client(MockConfigClient.new(configs))
428
- [logger, mock_logdev]
429
- end
430
-
431
416
  def captured_logger(options = {})
432
417
  io = StringIO.new
433
418
  options = Prefab::Options.new(**options.merge(
@@ -58,8 +58,8 @@ class TestWeightedValueResolver < Minitest::Test
58
58
  end
59
59
 
60
60
  def weighted_value(string, weight)
61
- Prefab::WeightedValue.new(
62
- value: Prefab::ConfigValue.new(string: string), weight: weight
61
+ PrefabProto::WeightedValue.new(
62
+ value: PrefabProto::ConfigValue.new(string: string), weight: weight
63
63
  )
64
64
  end
65
65
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: prefab-cloud-ruby
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.24.2
4
+ version: 0.24.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jeff Dwyer
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-05-12 00:00:00.000000000 Z
11
+ date: 2023-07-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: concurrent-ruby
@@ -172,9 +172,11 @@ dependencies:
172
172
  version: '0'
173
173
  description: Feature Flags, Live Config, and Dynamic Log Levels as a service
174
174
  email: jdwyer@prefab.cloud
175
- executables: []
175
+ executables:
176
+ - console
176
177
  extensions: []
177
178
  extra_rdoc_files:
179
+ - CHANGELOG.md
178
180
  - LICENSE.txt
179
181
  - README.md
180
182
  files:
@@ -182,7 +184,9 @@ files:
182
184
  - ".envrc.sample"
183
185
  - ".github/workflows/ruby.yml"
184
186
  - ".gitmodules"
187
+ - ".rubocop.yml"
185
188
  - ".tool-versions"
189
+ - CHANGELOG.md
186
190
  - CODEOWNERS
187
191
  - Gemfile
188
192
  - Gemfile.lock
@@ -190,6 +194,7 @@ files:
190
194
  - README.md
191
195
  - Rakefile
192
196
  - VERSION
197
+ - bin/console
193
198
  - compile_protos.sh
194
199
  - lib/prefab-cloud-ruby.rb
195
200
  - lib/prefab/client.rb
@@ -197,25 +202,32 @@ files:
197
202
  - lib/prefab/config_loader.rb
198
203
  - lib/prefab/config_resolver.rb
199
204
  - lib/prefab/config_value_unwrapper.rb
205
+ - lib/prefab/config_value_wrapper.rb
200
206
  - lib/prefab/context.rb
207
+ - lib/prefab/context_shape.rb
208
+ - lib/prefab/context_shape_aggregator.rb
201
209
  - lib/prefab/criteria_evaluator.rb
202
210
  - lib/prefab/error.rb
203
211
  - lib/prefab/errors/initialization_timeout_error.rb
204
212
  - lib/prefab/errors/invalid_api_key_error.rb
205
213
  - lib/prefab/errors/missing_default_error.rb
214
+ - lib/prefab/evaluated_configs_aggregator.rb
215
+ - lib/prefab/evaluated_keys_aggregator.rb
206
216
  - lib/prefab/exponential_backoff.rb
207
217
  - lib/prefab/feature_flag_client.rb
208
218
  - lib/prefab/http_connection.rb
209
219
  - lib/prefab/internal_logger.rb
210
220
  - lib/prefab/local_config_parser.rb
211
- - lib/prefab/log_path_collector.rb
221
+ - lib/prefab/log_path_aggregator.rb
212
222
  - lib/prefab/logger_client.rb
213
223
  - lib/prefab/murmer3.rb
214
224
  - lib/prefab/noop_cache.rb
215
225
  - lib/prefab/noop_stats.rb
216
226
  - lib/prefab/options.rb
227
+ - lib/prefab/periodic_sync.rb
217
228
  - lib/prefab/resolved_config_presenter.rb
218
229
  - lib/prefab/sse_logger.rb
230
+ - lib/prefab/time_helpers.rb
219
231
  - lib/prefab/weighted_value_resolver.rb
220
232
  - lib/prefab/yaml_config_parser.rb
221
233
  - lib/prefab_pb.rb
@@ -230,13 +242,17 @@ files:
230
242
  - test/test_config_resolver.rb
231
243
  - test/test_config_value_unwrapper.rb
232
244
  - test/test_context.rb
245
+ - test/test_context_shape.rb
246
+ - test/test_context_shape_aggregator.rb
233
247
  - test/test_criteria_evaluator.rb
248
+ - test/test_evaluated_configs_aggregator.rb
249
+ - test/test_evaluated_keys_aggregator.rb
234
250
  - test/test_exponential_backoff.rb
235
251
  - test/test_feature_flag_client.rb
236
252
  - test/test_helper.rb
237
253
  - test/test_integration.rb
238
254
  - test/test_local_config_parser.rb
239
- - test/test_log_path_collector.rb
255
+ - test/test_log_path_aggregator.rb
240
256
  - test/test_logger.rb
241
257
  - test/test_options.rb
242
258
  - test/test_weighted_value_resolver.rb
@@ -1,102 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Prefab
4
- class LogPathCollector
5
- INCREMENT = ->(count) { (count || 0) + 1 }
6
-
7
- SEVERITY_KEY = {
8
- ::Logger::DEBUG => 'debugs',
9
- ::Logger::INFO => 'infos',
10
- ::Logger::WARN => 'warns',
11
- ::Logger::ERROR => 'errors',
12
- ::Logger::FATAL => 'fatals'
13
- }.freeze
14
-
15
- def initialize(client:, max_paths:, sync_interval:)
16
- @max_paths = max_paths
17
- @client = client
18
- @start_at = now
19
- @sync_interval = if sync_interval.is_a?(Numeric)
20
- proc { sync_interval }
21
- else
22
- sync_interval || ExponentialBackoff.new(initial_delay: 8, max_delay: 60 * 10)
23
- end
24
-
25
- @pool = Concurrent::ThreadPoolExecutor.new(
26
- fallback_policy: :discard,
27
- max_queue: 5,
28
- max_threads: 4,
29
- min_threads: 1,
30
- name: 'prefab-log-paths'
31
- )
32
-
33
- @paths = Concurrent::Map.new
34
-
35
- start_periodic_sync
36
- end
37
-
38
- def push(path, severity)
39
- return unless @paths.size < @max_paths
40
-
41
- @paths.compute([path, severity], &INCREMENT)
42
- end
43
-
44
- private
45
-
46
- def sync
47
- return if @paths.size.zero?
48
-
49
- log_internal "Syncing #{@paths.size} paths"
50
-
51
- flush
52
- end
53
-
54
- def flush
55
- to_ship = @paths.dup
56
- @paths.clear
57
-
58
- start_at_was = @start_at
59
- @start_at = now
60
-
61
- @pool.post do
62
- log_internal "Uploading stats for #{to_ship.size} paths"
63
-
64
- aggregate = Hash.new { |h, k| h[k] = Prefab::Logger.new }
65
-
66
- to_ship.each do |(path, severity), count|
67
- aggregate[path][SEVERITY_KEY[severity]] = count
68
- aggregate[path]['logger_name'] = path
69
- end
70
-
71
- loggers = Prefab::Loggers.new(
72
- loggers: aggregate.values,
73
- start_at: start_at_was,
74
- end_at: now,
75
- instance_hash: @client.instance_hash,
76
- namespace: @client.namespace
77
- )
78
-
79
- @client.post('/api/v1/known-loggers', loggers)
80
- end
81
- end
82
-
83
- def start_periodic_sync
84
- Thread.new do
85
- log_internal "Initialized log path collector instance_hash=#{@client.instance_hash} max_paths=#{@max_paths}"
86
-
87
- loop do
88
- sleep @sync_interval.call
89
- sync
90
- end
91
- end
92
- end
93
-
94
- def log_internal(message)
95
- @client.log.log_internal message, 'log_path_collector', nil, ::Logger::DEBUG
96
- end
97
-
98
- def now
99
- (Time.now.utc.to_f * 1000).to_i
100
- end
101
- end
102
- end
@@ -1,58 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'test_helper'
4
- require 'timecop'
5
-
6
- class TestLogPathCollector < Minitest::Test
7
- MAX_WAIT = 2
8
- SLEEP_TIME = 0.01
9
-
10
- def test_sync
11
- Timecop.freeze do
12
- client = new_client(namespace: 'this.is.a.namespace')
13
-
14
- 2.times { client.log.info('here is a message') }
15
- 3.times { client.log.error('here is a message') }
16
-
17
- requests = []
18
-
19
- client.define_singleton_method(:post) do |*params|
20
- requests.push(params)
21
- end
22
-
23
- client.log_path_collector.send(:sync)
24
-
25
- # let the flush thread run
26
-
27
- wait_time = 0
28
- while requests.length == 0
29
- wait_time += SLEEP_TIME
30
- sleep SLEEP_TIME
31
-
32
- raise "Waited #{MAX_WAIT} seconds for the flush thread to run, but it never did" if wait_time > MAX_WAIT
33
- end
34
-
35
- assert_equal requests, [[
36
- '/api/v1/known-loggers',
37
- Prefab::Loggers.new(
38
- loggers: [Prefab::Logger.new(logger_name: 'test.test_log_path_collector.test_sync',
39
- infos: 2, errors: 3)],
40
- start_at: (Time.now.utc.to_f * 1000).to_i,
41
- end_at: (Time.now.utc.to_f * 1000).to_i,
42
- instance_hash: client.instance_hash,
43
- namespace: 'this.is.a.namespace'
44
- )
45
- ]]
46
- end
47
- end
48
-
49
- private
50
-
51
- def new_client(overrides = {})
52
- super(**{
53
- prefab_datasources: Prefab::Options::DATASOURCES::ALL,
54
- api_key: '123-development-yourapikey-SDK',
55
- collect_sync_interval: 1000 # we'll trigger sync manually in our test
56
- }.merge(overrides))
57
- end
58
- end