@@ -102,4 +102,96 @@ public void shouldLogFilterTypeIfFilterTypeIsNotNone() {
102
102
Mockito .verify (firehoseInstrumentation , Mockito .times (1 )).logInfo ("\n \t Filter schema: {}" , TestMessage .class .getName ());
103
103
Mockito .verify (firehoseInstrumentation , Mockito .times (1 )).logInfo ("\n \t Filter expression: {}" , "testMessage.getOrderNumber() == 123" );
104
104
}
105
+
106
+ @ Test
107
+ public void shouldDropMessageWhenDeserializationFailsAndDropConfigEnabled () throws FilterException {
108
+ Message invalidMessage = new Message (new byte []{1 , 2 }, new byte []{1 , 2 , 3 }, "topic1" , 0 , 100 );
109
+ Message validMessage = new Message (key .toByteArray (), testMessage .toByteArray (), "topic1" , 0 , 101 );
110
+ Map <String , String > filterConfigs = new HashMap <>();
111
+ filterConfigs .put ("FILTER_DATA_SOURCE" , "message" );
112
+ filterConfigs .put ("FILTER_JEXL_EXPRESSION" , "testMessage.getOrderNumber() == 123" );
113
+ filterConfigs .put ("FILTER_SCHEMA_PROTO_CLASS" , TestMessage .class .getName ());
114
+ filterConfigs .put ("FILTER_DROP_DESERIALIZATION_ERROR" , "true" );
115
+ kafkaConsumerConfig = ConfigFactory .create (FilterConfig .class , filterConfigs );
116
+ filter = new JexlFilter (kafkaConsumerConfig , firehoseInstrumentation );
117
+ FilteredMessages filteredMessages = filter .filter (Arrays .asList (invalidMessage , validMessage ));
118
+ assertEquals (1 , filteredMessages .sizeOfValidMessages ());
119
+ assertEquals (1 , filteredMessages .sizeOfInvalidMessages ());
120
+ Mockito .verify (firehoseInstrumentation , Mockito .times (1 )).captureCount ("firehose_jexl_filter_deserialization_errors_total" , 1L );
121
+ Mockito .verify (firehoseInstrumentation , Mockito .times (1 )).logWarn (Mockito .eq ("Failed to deserialize protobuf message: {}" ), Mockito .any (String .class ));
122
+ }
123
+
124
+ @ Test
125
+ public void shouldThrowExceptionWhenDeserializationFailsAndDropConfigDisabled () throws FilterException {
126
+ Message invalidMessage = new Message (new byte []{1 , 2 }, new byte []{1 , 2 , 3 }, "topic1" , 0 , 100 );
127
+ Map <String , String > filterConfigs = new HashMap <>();
128
+ filterConfigs .put ("FILTER_DATA_SOURCE" , "message" );
129
+ filterConfigs .put ("FILTER_JEXL_EXPRESSION" , "testMessage.getOrderNumber() == 123" );
130
+ filterConfigs .put ("FILTER_SCHEMA_PROTO_CLASS" , TestMessage .class .getName ());
131
+ filterConfigs .put ("FILTER_DROP_DESERIALIZATION_ERROR" , "false" );
132
+ kafkaConsumerConfig = ConfigFactory .create (FilterConfig .class , filterConfigs );
133
+ filter = new JexlFilter (kafkaConsumerConfig , firehoseInstrumentation );
134
+ try {
135
+ filter .filter (Arrays .asList (invalidMessage ));
136
+ assertEquals ("Expected FilterException to be thrown" , true , false );
137
+ } catch (FilterException e ) {
138
+ assertEquals ("Failed while filtering EsbMessages" , e .getMessage ());
139
+ }
140
+ }
141
+
142
+ @ Test
143
+ public void shouldNotCaptureMetricsWhenDropConfigDisabled () throws FilterException {
144
+ Message invalidMessage = new Message (new byte []{1 , 2 }, new byte []{1 , 2 , 3 }, "topic1" , 0 , 100 );
145
+ Map <String , String > filterConfigs = new HashMap <>();
146
+ filterConfigs .put ("FILTER_DATA_SOURCE" , "message" );
147
+ filterConfigs .put ("FILTER_JEXL_EXPRESSION" , "testMessage.getOrderNumber() == 123" );
148
+ filterConfigs .put ("FILTER_SCHEMA_PROTO_CLASS" , TestMessage .class .getName ());
149
+ filterConfigs .put ("FILTER_DROP_DESERIALIZATION_ERROR" , "false" );
150
+ kafkaConsumerConfig = ConfigFactory .create (FilterConfig .class , filterConfigs );
151
+ filter = new JexlFilter (kafkaConsumerConfig , firehoseInstrumentation );
152
+ try {
153
+ filter .filter (Arrays .asList (invalidMessage ));
154
+ } catch (FilterException e ) {
155
+ }
156
+ Mockito .verify (firehoseInstrumentation , Mockito .never ()).captureCount (Mockito .eq ("firehose_jexl_filter_deserialization_errors_total" ), Mockito .any (Long .class ));
157
+ Mockito .verify (firehoseInstrumentation , Mockito .never ()).logWarn (Mockito .eq ("Failed to deserialize protobuf message: {}" ), Mockito .any (String .class ));
158
+ }
159
+
160
+ @ Test
161
+ public void shouldDropMultipleInvalidMessagesAndCaptureCorrectMetrics () throws FilterException {
162
+ Message invalidMessage1 = new Message (new byte []{1 , 2 }, new byte []{1 , 2 , 3 }, "topic1" , 0 , 100 );
163
+ Message invalidMessage2 = new Message (new byte []{4 , 5 }, new byte []{4 , 5 , 6 }, "topic1" , 0 , 101 );
164
+ Message validMessage = new Message (key .toByteArray (), testMessage .toByteArray (), "topic1" , 0 , 102 );
165
+ Map <String , String > filterConfigs = new HashMap <>();
166
+ filterConfigs .put ("FILTER_DATA_SOURCE" , "message" );
167
+ filterConfigs .put ("FILTER_JEXL_EXPRESSION" , "testMessage.getOrderNumber() == 123" );
168
+ filterConfigs .put ("FILTER_SCHEMA_PROTO_CLASS" , TestMessage .class .getName ());
169
+ filterConfigs .put ("FILTER_DROP_DESERIALIZATION_ERROR" , "true" );
170
+ kafkaConsumerConfig = ConfigFactory .create (FilterConfig .class , filterConfigs );
171
+ filter = new JexlFilter (kafkaConsumerConfig , firehoseInstrumentation );
172
+ FilteredMessages filteredMessages = filter .filter (Arrays .asList (invalidMessage1 , invalidMessage2 , validMessage ));
173
+ assertEquals (1 , filteredMessages .sizeOfValidMessages ());
174
+ assertEquals (2 , filteredMessages .sizeOfInvalidMessages ());
175
+ Mockito .verify (firehoseInstrumentation , Mockito .times (2 )).captureCount ("firehose_jexl_filter_deserialization_errors_total" , 1L );
176
+ Mockito .verify (firehoseInstrumentation , Mockito .times (2 )).logWarn (Mockito .eq ("Failed to deserialize protobuf message: {}" ), Mockito .any (String .class ));
177
+ }
178
+
179
+ @ Test
180
+ public void shouldStillThrowExceptionForNonDeserializationErrors () throws FilterException {
181
+ Message message = new Message (key .toByteArray (), testMessage .toByteArray (), "topic1" , 0 , 100 );
182
+ Map <String , String > filterConfigs = new HashMap <>();
183
+ filterConfigs .put ("FILTER_DATA_SOURCE" , "message" );
184
+ filterConfigs .put ("FILTER_JEXL_EXPRESSION" , "testMessage.getOrderNumber() == 123" );
185
+ filterConfigs .put ("FILTER_SCHEMA_PROTO_CLASS" , "com.invalid.ClassName" );
186
+ filterConfigs .put ("FILTER_DROP_DESERIALIZATION_ERROR" , "true" );
187
+ kafkaConsumerConfig = ConfigFactory .create (FilterConfig .class , filterConfigs );
188
+ filter = new JexlFilter (kafkaConsumerConfig , firehoseInstrumentation );
189
+ try {
190
+ filter .filter (Arrays .asList (message ));
191
+ assertEquals ("Expected FilterException to be thrown" , true , false );
192
+ } catch (FilterException e ) {
193
+ assertEquals ("Failed while filtering EsbMessages" , e .getMessage ());
194
+ }
195
+ Mockito .verify (firehoseInstrumentation , Mockito .never ()).captureCount (Mockito .eq ("firehose_jexl_filter_deserialization_errors_total" ), Mockito .any (Long .class ));
196
+ }
105
197
}
0 commit comments