SerdesInitializerTest.java 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  1. package com.provectus.kafka.ui.serdes;
  2. import static org.assertj.core.api.Assertions.assertThat;
  3. import static org.assertj.core.api.Assertions.assertThatCode;
  4. import static org.mockito.Mockito.any;
  5. import static org.mockito.Mockito.anyString;
  6. import static org.mockito.Mockito.eq;
  7. import static org.mockito.Mockito.mock;
  8. import static org.mockito.Mockito.verify;
  9. import static org.mockito.Mockito.when;
  10. import com.provectus.kafka.ui.config.ClustersProperties;
  11. import com.provectus.kafka.ui.exception.ValidationException;
  12. import com.provectus.kafka.ui.serde.api.PropertyResolver;
  13. import com.provectus.kafka.ui.serdes.builtin.Int32Serde;
  14. import com.provectus.kafka.ui.serdes.builtin.StringSerde;
  15. import java.net.URL;
  16. import java.net.URLClassLoader;
  17. import java.util.List;
  18. import java.util.Map;
  19. import org.junit.jupiter.api.Test;
  20. import org.springframework.core.env.Environment;
  21. import org.springframework.mock.env.MockEnvironment;
  22. class SerdesInitializerTest {
  23. private final Environment env = new MockEnvironment();
  24. private final CustomSerdeLoader customSerdeLoaderMock = mock(CustomSerdeLoader.class);
  25. private final SerdesInitializer initializer = new SerdesInitializer(
  26. Map.of(
  27. "BuiltIn1", BuiltInSerdeWithAutoconfigure.class,
  28. "BuiltIn2", BuiltInSerdeMock2NoAutoConfigure.class,
  29. Int32Serde.name(), Int32Serde.class,
  30. StringSerde.name(), StringSerde.class
  31. ),
  32. customSerdeLoaderMock
  33. );
  34. @Test
  35. void pluggedSerdesInitializedByLoader() {
  36. ClustersProperties.SerdeConfig customSerdeConfig = new ClustersProperties.SerdeConfig();
  37. customSerdeConfig.setName("MyPluggedSerde");
  38. customSerdeConfig.setFilePath("/custom.jar");
  39. customSerdeConfig.setClassName("org.test.MyPluggedSerde");
  40. customSerdeConfig.setTopicKeysPattern("keys");
  41. customSerdeConfig.setTopicValuesPattern("values");
  42. when(customSerdeLoaderMock.loadAndConfigure(anyString(), anyString(), any(), any(), any()))
  43. .thenReturn(new CustomSerdeLoader.CustomSerde(new StringSerde(), new URLClassLoader(new URL[]{})));
  44. var serdes = init(customSerdeConfig);
  45. SerdeInstance customSerdeInstance = serdes.serdes.get("MyPluggedSerde");
  46. verifyPatternsMatch(customSerdeConfig, customSerdeInstance);
  47. assertThat(customSerdeInstance.classLoader).isNotNull();
  48. verify(customSerdeLoaderMock).loadAndConfigure(
  49. eq(customSerdeConfig.getClassName()),
  50. eq(customSerdeConfig.getFilePath()),
  51. any(), any(), any()
  52. );
  53. }
  54. @Test
  55. void serdeWithBuiltInNameAndNoPropertiesCantBeInitializedIfSerdeNotSupportAutoConfigure() {
  56. ClustersProperties.SerdeConfig serdeConfig = new ClustersProperties.SerdeConfig();
  57. serdeConfig.setName("BuiltIn2"); //auto-configuration not supported
  58. serdeConfig.setTopicKeysPattern("keys");
  59. serdeConfig.setTopicValuesPattern("vals");
  60. assertThatCode(() -> initializer.init(env, createProperties(serdeConfig), 0))
  61. .isInstanceOf(ValidationException.class);
  62. }
  63. @Test
  64. void serdeWithBuiltInNameAndNoPropertiesIsAutoConfiguredIfPossible() {
  65. ClustersProperties.SerdeConfig serdeConfig = new ClustersProperties.SerdeConfig();
  66. serdeConfig.setName("BuiltIn1"); // supports auto-configuration
  67. serdeConfig.setTopicKeysPattern("keys");
  68. serdeConfig.setTopicValuesPattern("vals");
  69. var serdes = init(serdeConfig);
  70. SerdeInstance autoConfiguredSerde = serdes.serdes.get("BuiltIn1");
  71. verifyAutoConfigured(autoConfiguredSerde);
  72. verifyPatternsMatch(serdeConfig, autoConfiguredSerde);
  73. }
  74. @Test
  75. void serdeWithBuiltInNameAndSetPropertiesAreExplicitlyConfigured() {
  76. ClustersProperties.SerdeConfig serdeConfig = new ClustersProperties.SerdeConfig();
  77. serdeConfig.setName("BuiltIn1");
  78. serdeConfig.setProperties(Map.of("any", "property"));
  79. serdeConfig.setTopicKeysPattern("keys");
  80. serdeConfig.setTopicValuesPattern("vals");
  81. var serdes = init(serdeConfig);
  82. SerdeInstance explicitlyConfiguredSerde = serdes.serdes.get("BuiltIn1");
  83. verifyExplicitlyConfigured(explicitlyConfiguredSerde);
  84. verifyPatternsMatch(serdeConfig, explicitlyConfiguredSerde);
  85. }
  86. @Test
  87. void serdeWithCustomNameAndBuiltInClassnameAreExplicitlyConfigured() {
  88. ClustersProperties.SerdeConfig serdeConfig = new ClustersProperties.SerdeConfig();
  89. serdeConfig.setName("SomeSerde");
  90. serdeConfig.setClassName(BuiltInSerdeWithAutoconfigure.class.getName());
  91. serdeConfig.setTopicKeysPattern("keys");
  92. serdeConfig.setTopicValuesPattern("vals");
  93. var serdes = init(serdeConfig);
  94. SerdeInstance explicitlyConfiguredSerde = serdes.serdes.get("SomeSerde");
  95. verifyExplicitlyConfigured(explicitlyConfiguredSerde);
  96. verifyPatternsMatch(serdeConfig, explicitlyConfiguredSerde);
  97. }
  98. private ClusterSerdes init(ClustersProperties.SerdeConfig... serdeConfigs) {
  99. return initializer.init(env, createProperties(serdeConfigs), 0);
  100. }
  101. private ClustersProperties createProperties(ClustersProperties.SerdeConfig... serdeConfigs) {
  102. ClustersProperties.Cluster cluster = new ClustersProperties.Cluster();
  103. cluster.setName("test");
  104. cluster.setSerde(List.of(serdeConfigs));
  105. ClustersProperties clustersProperties = new ClustersProperties();
  106. clustersProperties.setClusters(List.of(cluster));
  107. return clustersProperties;
  108. }
  109. private void verifyExplicitlyConfigured(SerdeInstance serde) {
  110. assertThat(((BuiltInSerdeWithAutoconfigure) serde.serde).autoConfigureCheckCalled).isFalse();
  111. assertThat(((BuiltInSerdeWithAutoconfigure) serde.serde).autoConfigured).isFalse();
  112. assertThat(((BuiltInSerdeWithAutoconfigure) serde.serde).explicitlyConfigured).isTrue();
  113. }
  114. private void verifyAutoConfigured(SerdeInstance serde) {
  115. assertThat(((BuiltInSerdeWithAutoconfigure) serde.serde).autoConfigureCheckCalled).isTrue();
  116. assertThat(((BuiltInSerdeWithAutoconfigure) serde.serde).autoConfigured).isTrue();
  117. assertThat(((BuiltInSerdeWithAutoconfigure) serde.serde).explicitlyConfigured).isFalse();
  118. }
  119. private void verifyPatternsMatch(ClustersProperties.SerdeConfig config, SerdeInstance serde) {
  120. assertThat(serde.topicKeyPattern.pattern()).isEqualTo(config.getTopicKeysPattern());
  121. assertThat(serde.topicValuePattern.pattern()).isEqualTo(config.getTopicValuesPattern());
  122. }
  123. static class BuiltInSerdeWithAutoconfigure extends StringSerde {
  124. boolean explicitlyConfigured = false;
  125. boolean autoConfigured = false;
  126. boolean autoConfigureCheckCalled = false;
  127. @Override
  128. public boolean canBeAutoConfigured(PropertyResolver kafkaClusterProperties, PropertyResolver globalProperties) {
  129. this.autoConfigureCheckCalled = true;
  130. return true;
  131. }
  132. @Override
  133. public void autoConfigure(PropertyResolver kafkaClusterProperties, PropertyResolver globalProperties) {
  134. this.autoConfigured = true;
  135. }
  136. @Override
  137. public void configure(PropertyResolver serdeProperties,
  138. PropertyResolver kafkaClusterProperties,
  139. PropertyResolver globalProperties) {
  140. this.explicitlyConfigured = true;
  141. }
  142. }
  143. static class BuiltInSerdeMock2NoAutoConfigure extends BuiltInSerdeWithAutoconfigure {
  144. @Override
  145. public boolean canBeAutoConfigured(PropertyResolver kafkaClusterProperties, PropertyResolver globalProperties) {
  146. this.autoConfigureCheckCalled = true;
  147. return false;
  148. }
  149. }
  150. }