25
25
import static org .mockito .ArgumentMatchers .anyString ;
26
26
import static org .mockito .Mockito .doReturn ;
27
27
import static org .mockito .Mockito .mock ;
28
+ import static org .mockito .Mockito .times ;
28
29
import static org .mockito .Mockito .verify ;
29
30
import static org .mockito .Mockito .verifyNoMoreInteractions ;
30
31
import static org .testng .Assert .assertEquals ;
41
42
import org .apache .pulsar .client .api .ProducerCryptoFailureAction ;
42
43
import org .apache .pulsar .client .api .PulsarClient ;
43
44
import org .apache .pulsar .client .api .Schema ;
45
+ import org .apache .pulsar .common .functions .BatchingConfig ;
44
46
import org .apache .pulsar .common .functions .CryptoConfig ;
45
47
import org .apache .pulsar .common .functions .ProducerConfig ;
46
48
import org .mockito .internal .util .MockUtil ;
@@ -139,6 +141,62 @@ public void testCreateProducerBuilderWithAdvancedProducerConfig() {
139
141
cryptoConfig .setCryptoKeyReaderConfig (Map .of ("key" , "value" ));
140
142
cryptoConfig .setCryptoKeyReaderClassName (TestCryptoKeyReader .class .getName ());
141
143
producerConfig .setCryptoConfig (cryptoConfig );
144
+ BatchingConfig batchingConfig = new BatchingConfig ();
145
+ batchingConfig .setEnabled (true );
146
+ batchingConfig .setBatchingMaxPublishDelayMs (20 );
147
+ batchingConfig .setBatchingMaxMessages (100 );
148
+ batchingConfig .setBatchingMaxBytes (-1 );
149
+ producerConfig .setBatchingConfig (batchingConfig );
150
+ ProducerBuilderFactory builderFactory = new ProducerBuilderFactory (pulsarClient , producerConfig , null , null );
151
+ builderFactory .createProducerBuilder ("topic" , Schema .STRING , "producerName" );
152
+
153
+ verify (pulsarClient ).newProducer (Schema .STRING );
154
+ verify (producerBuilder ).blockIfQueueFull (true );
155
+ // enableBatching will be called twice here:
156
+ // the first time is called by default to keep the backward compability
157
+ // the second call is called when the producerConfig and producerConfig.batchingConfig are not null
158
+ verify (producerBuilder , times (2 )).enableBatching (true );
159
+ verify (producerBuilder ).batchingMaxPublishDelay (10 , TimeUnit .MILLISECONDS );
160
+ verify (producerBuilder ).hashingScheme (HashingScheme .Murmur3_32Hash );
161
+ verify (producerBuilder ).messageRoutingMode (MessageRoutingMode .CustomPartition );
162
+ verify (producerBuilder ).messageRouter (FunctionResultRouter .of ());
163
+ verify (producerBuilder ).sendTimeout (0 , TimeUnit .SECONDS );
164
+ verify (producerBuilder ).topic ("topic" );
165
+ verify (producerBuilder ).producerName ("producerName" );
166
+
167
+ verify (producerBuilder ).compressionType (CompressionType .SNAPPY );
168
+ verify (producerBuilder ).batcherBuilder (BatcherBuilder .KEY_BASED );
169
+ verify (producerBuilder ).maxPendingMessages (5000 );
170
+ verify (producerBuilder ).maxPendingMessagesAcrossPartitions (50000 );
171
+ TestCryptoKeyReader lastInstance = TestCryptoKeyReader .LAST_INSTANCE ;
172
+ assertNotNull (lastInstance );
173
+ assertEquals (lastInstance .configs , cryptoConfig .getCryptoKeyReaderConfig ());
174
+ verify (producerBuilder ).cryptoKeyReader (lastInstance );
175
+ verify (producerBuilder ).cryptoFailureAction (ProducerCryptoFailureAction .FAIL );
176
+ verify (producerBuilder ).addEncryptionKey ("key1" );
177
+ verify (producerBuilder ).addEncryptionKey ("key2" );
178
+ verify (producerBuilder ).batchingMaxPublishDelay (20 , TimeUnit .MILLISECONDS );
179
+ verify (producerBuilder ).batchingMaxMessages (100 );
180
+ verifyNoMoreInteractions (producerBuilder );
181
+ }
182
+
183
+ @ Test
184
+ public void testCreateProducerBuilderWithBatchingDisabled () {
185
+ ProducerConfig producerConfig = new ProducerConfig ();
186
+ producerConfig .setBatchBuilder ("KEY_BASED" );
187
+ producerConfig .setCompressionType (CompressionType .SNAPPY );
188
+ producerConfig .setMaxPendingMessages (5000 );
189
+ producerConfig .setMaxPendingMessagesAcrossPartitions (50000 );
190
+ CryptoConfig cryptoConfig = new CryptoConfig ();
191
+ cryptoConfig .setProducerCryptoFailureAction (ProducerCryptoFailureAction .FAIL );
192
+ cryptoConfig .setEncryptionKeys (new String []{"key1" , "key2" });
193
+ cryptoConfig .setCryptoKeyReaderConfig (Map .of ("key" , "value" ));
194
+ cryptoConfig .setCryptoKeyReaderClassName (TestCryptoKeyReader .class .getName ());
195
+ producerConfig .setCryptoConfig (cryptoConfig );
196
+ BatchingConfig batchingConfig = new BatchingConfig ();
197
+ batchingConfig .setEnabled (false );
198
+ batchingConfig .setBatchingMaxPublishDelayMs (0 );
199
+ producerConfig .setBatchingConfig (batchingConfig );
142
200
ProducerBuilderFactory builderFactory = new ProducerBuilderFactory (pulsarClient , producerConfig , null , null );
143
201
builderFactory .createProducerBuilder ("topic" , Schema .STRING , "producerName" );
144
202
verifyCommon ();
@@ -153,12 +211,14 @@ public void testCreateProducerBuilderWithAdvancedProducerConfig() {
153
211
verify (producerBuilder ).cryptoFailureAction (ProducerCryptoFailureAction .FAIL );
154
212
verify (producerBuilder ).addEncryptionKey ("key1" );
155
213
verify (producerBuilder ).addEncryptionKey ("key2" );
214
+ verify (producerBuilder ).enableBatching (false );
156
215
verifyNoMoreInteractions (producerBuilder );
157
216
}
158
217
159
218
public static class TestCryptoKeyReader implements CryptoKeyReader {
160
219
static TestCryptoKeyReader LAST_INSTANCE ;
161
220
Map <String , Object > configs ;
221
+
162
222
public TestCryptoKeyReader (Map <String , Object > configs ) {
163
223
this .configs = configs ;
164
224
assert LAST_INSTANCE == null ;
0 commit comments