1717
1818require "spec_helper"
1919require "logstash/settings"
20+ java_import org . apache . logging . log4j . core . appender . AbstractAppender
2021
2122describe LogStash ::Setting ::SettingWithDeprecatedAlias do
2223 let ( :canonical_setting_name ) { "canonical.setting" }
2728 let ( :settings ) { LogStash ::Settings . new }
2829 let ( :canonical_setting ) { LogStash ::Setting ::StringSetting . new ( canonical_setting_name , default_value , true ) }
2930
30- log_spy = nil
31- log_ctx = nil
31+ class CustomAppender < AbstractAppender
3232
33- def log_ctx
34- @log_ctx
35- end
33+ attr_reader :events_collector
34+
35+ def initialize ( events )
36+ super ( "CustomCaptorAppender" , nil , nil , true , org . apache . logging . log4j . core . config . Property ::EMPTY_ARRAY )
37+ @events_collector = events
38+ end
3639
37- def log_spy
38- @log_spy
40+ # override the append to catch all the calls and collect the events
41+ def append ( log_event )
42+ @events_collector << log_event . message . formatted_message
43+ end
3944 end
4045
46+ let ( :events ) { [ ] }
47+
4148 before ( :each ) do
42- # Initialization of appender and logger use to spy, need to be freshly recreated on each test is context shutdown is used.
43- @log_ctx = setup_logger_spy
44- @log_spy = retrieve_logger_spy ( @log_ctx )
49+ java_import org . apache . logging . log4j . LogManager
50+ logger = LogManager . getLogger ( "org.logstash.settings.DeprecatedAlias" )
51+ deprecated_logger = LogManager . getLogger ( "org.logstash.deprecation.settings.DeprecatedAlias" )
52+
53+ @custom_appender = CustomAppender . new ( events ) . tap { |appender | appender . start }
54+
55+ java_import org . apache . logging . log4j . Level
56+ logger . addAppender ( @custom_appender )
57+ deprecated_logger . addAppender ( @custom_appender )
58+ # had to set level after appending as it was "error" for some reason
59+ logger . setLevel ( Level ::INFO )
60+ deprecated_logger . setLevel ( Level ::INFO )
61+
62+ expect ( @custom_appender . started? ) . to be_truthy
4563
4664 allow ( LogStash ::Settings ) . to receive ( :logger ) . and_return ( double ( "SettingsLogger" ) . as_null_object )
4765 allow ( LogStash ::Settings ) . to receive ( :deprecation_logger ) . and_return ( double ( "SettingsDeprecationLogger" ) . as_null_object )
@@ -50,9 +68,15 @@ def log_spy
5068 end
5169
5270 after ( :each ) do
53- @log_ctx . close
54- @log_spy = nil
55- @log_ctx = nil
71+ events . clear
72+ java_import org . apache . logging . log4j . LogManager
73+ logger = LogManager . getLogger ( "org.logstash.settings.DeprecatedAlias" )
74+ deprecated_logger = LogManager . getLogger ( "org.logstash.deprecation.settings.DeprecatedAlias" )
75+ # The Logger's AbstractConfiguration contains a cache of Appender, by class name. The cache is updated
76+ # iff is absent, so to make subsequent add_appender effective we have cleanup on teardown, else the new
77+ # appender instance is simply not used by the logger
78+ logger . remove_appender ( @custom_appender )
79+ deprecated_logger . remove_appender ( @custom_appender )
5680 end
5781
5882 shared_examples '#validate_value success' do
@@ -78,8 +102,7 @@ def log_spy
78102 it 'does not emit a deprecation warning' do
79103 expect ( LogStash ::Settings . deprecation_logger ) . to_not receive ( :deprecated ) . with ( a_string_including ( deprecated_setting_name ) )
80104 settings . get_setting ( deprecated_setting_name ) . observe_post_process
81- log_spy = retrieve_logger_spy ( log_ctx )
82- expect ( log_spy . messages ) . to be_empty
105+ expect ( events ) . to be_empty
83106 end
84107 end
85108 end
@@ -97,15 +120,15 @@ def log_spy
97120 end
98121
99122 it 'logs a deprecation warning' do
100- expect ( log_spy . messages [ 0 ] ) . to include ( deprecated_setting_name )
123+ expect ( events [ 0 ] ) . to include ( deprecated_setting_name )
101124 end
102125
103126 include_examples '#validate_value success'
104127
105128 context "#observe_post_process" do
106129 it 're-emits the deprecation warning' do
107130 settings . get_setting ( deprecated_setting_name ) . observe_post_process
108- expect ( log_spy . messages [ 0 ] ) . to include ( deprecated_setting_name )
131+ expect ( events [ 0 ] ) . to include ( deprecated_setting_name )
109132 end
110133 end
111134
@@ -142,15 +165,15 @@ def log_spy
142165
143166 it 'does not produce a relevant deprecation warning' do
144167 settings . get_setting ( deprecated_setting_name ) . observe_post_process
145- expect ( log_spy . messages ) . to be_empty
168+ expect ( events ) . to be_empty
146169 end
147170
148171 include_examples '#validate_value success'
149172
150173 context "#observe_post_process" do
151174 it 'does not emit a deprecation warning' do
152175 settings . get_setting ( deprecated_setting_name ) . observe_post_process
153- expect ( log_spy . messages ) . to be_empty
176+ expect ( events ) . to be_empty
154177 end
155178 end
156179 end
@@ -172,7 +195,8 @@ def log_spy
172195 context 'Settings#get on deprecated alias' do
173196 it 'produces a WARN-level message to the logger' do
174197 settings . get ( deprecated_setting_name )
175- expect ( log_spy . messages [ 0 ] ) . to include ( "setting `#{ canonical_setting_name } ` has been queried by its deprecated alias `#{ deprecated_setting_name } `" )
198+ sleep 0.1
199+ expect ( events [ 0 ] ) . to include ( "setting `#{ canonical_setting_name } ` has been queried by its deprecated alias `#{ deprecated_setting_name } `" )
176200 end
177201 end
178202end
0 commit comments