| /* |
| * Licensed to the Apache Software Foundation (ASF) under one or more |
| * contributor license agreements. See the NOTICE file distributed with |
| * this work for additional information regarding copyright ownership. |
| * The ASF licenses this file to You under the Apache License, Version 2.0 |
| * (the "License"); you may not use this file except in compliance with |
| * the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| package org.apache.kafka.connect.runtime; |
| |
| import org.apache.kafka.connect.runtime.isolation.Plugins; |
| import org.apache.kafka.connect.tools.MockConnector; |
| import org.apache.kafka.connect.transforms.Cast; |
| import org.apache.kafka.connect.transforms.ExtractField; |
| import org.apache.kafka.connect.transforms.Flatten; |
| import org.apache.kafka.connect.transforms.HoistField; |
| import org.apache.kafka.connect.transforms.InsertField; |
| import org.apache.kafka.connect.transforms.MaskField; |
| import org.apache.kafka.connect.transforms.RegexRouter; |
| import org.apache.kafka.connect.transforms.ReplaceField; |
| import org.apache.kafka.connect.transforms.SetSchemaMetadata; |
| import org.apache.kafka.connect.transforms.TimestampConverter; |
| import org.apache.kafka.connect.transforms.TimestampRouter; |
| import org.apache.kafka.connect.transforms.ValueToKey; |
| import org.junit.Test; |
| |
| import java.util.HashMap; |
| |
| /** |
| * Tests that transformations' configs can be composed with ConnectorConfig during its construction, ensuring no |
| * conflicting fields or other issues. |
| * |
| * This test appears here simply because it requires both connect-runtime and connect-transforms and connect-runtime |
| * already depends on connect-transforms. |
| */ |
| public class TransformationConfigTest { |
| |
| @Test |
| public void testEmbeddedConfigCast() { |
| // Validate that we can construct a Connector config containing the extended config for the transform |
| HashMap<String, String> connProps = new HashMap<>(); |
| connProps.put("name", "foo"); |
| connProps.put("connector.class", MockConnector.class.getName()); |
| connProps.put("transforms", "example"); |
| connProps.put("transforms.example.type", Cast.Value.class.getName()); |
| connProps.put("transforms.example.spec", "int8"); |
| |
| Plugins plugins = null; // Safe when we're only constructing the config |
| new ConnectorConfig(plugins, connProps); |
| } |
| |
| @Test |
| public void testEmbeddedConfigExtractField() { |
| // Validate that we can construct a Connector config containing the extended config for the transform |
| HashMap<String, String> connProps = new HashMap<>(); |
| connProps.put("name", "foo"); |
| connProps.put("connector.class", MockConnector.class.getName()); |
| connProps.put("transforms", "example"); |
| connProps.put("transforms.example.type", ExtractField.Value.class.getName()); |
| connProps.put("transforms.example.field", "field"); |
| |
| Plugins plugins = null; // Safe when we're only constructing the config |
| new ConnectorConfig(plugins, connProps); |
| } |
| |
| @Test |
| public void testEmbeddedConfigFlatten() { |
| // Validate that we can construct a Connector config containing the extended config for the transform |
| HashMap<String, String> connProps = new HashMap<>(); |
| connProps.put("name", "foo"); |
| connProps.put("connector.class", MockConnector.class.getName()); |
| connProps.put("transforms", "example"); |
| connProps.put("transforms.example.type", Flatten.Value.class.getName()); |
| |
| Plugins plugins = null; // Safe when we're only constructing the config |
| new ConnectorConfig(plugins, connProps); |
| } |
| |
| @Test |
| public void testEmbeddedConfigHoistField() { |
| // Validate that we can construct a Connector config containing the extended config for the transform |
| HashMap<String, String> connProps = new HashMap<>(); |
| connProps.put("name", "foo"); |
| connProps.put("connector.class", MockConnector.class.getName()); |
| connProps.put("transforms", "example"); |
| connProps.put("transforms.example.type", HoistField.Value.class.getName()); |
| connProps.put("transforms.example.field", "field"); |
| |
| Plugins plugins = null; // Safe when we're only constructing the config |
| new ConnectorConfig(plugins, connProps); |
| } |
| |
| @Test |
| public void testEmbeddedConfigInsertField() { |
| // Validate that we can construct a Connector config containing the extended config for the transform |
| HashMap<String, String> connProps = new HashMap<>(); |
| connProps.put("name", "foo"); |
| connProps.put("connector.class", MockConnector.class.getName()); |
| connProps.put("transforms", "example"); |
| connProps.put("transforms.example.type", InsertField.Value.class.getName()); |
| |
| Plugins plugins = null; // Safe when we're only constructing the config |
| new ConnectorConfig(plugins, connProps); |
| } |
| |
| @Test |
| public void testEmbeddedConfigMaskField() { |
| // Validate that we can construct a Connector config containing the extended config for the transform |
| HashMap<String, String> connProps = new HashMap<>(); |
| connProps.put("name", "foo"); |
| connProps.put("connector.class", MockConnector.class.getName()); |
| connProps.put("transforms", "example"); |
| connProps.put("transforms.example.type", MaskField.Value.class.getName()); |
| connProps.put("transforms.example.fields", "field"); |
| connProps.put("transforms.example.replacement", "nothing"); |
| |
| Plugins plugins = null; // Safe when we're only constructing the config |
| new ConnectorConfig(plugins, connProps); |
| } |
| |
| @Test |
| public void testEmbeddedConfigRegexRouter() { |
| // Validate that we can construct a Connector config containing the extended config for the transform |
| HashMap<String, String> connProps = new HashMap<>(); |
| connProps.put("name", "foo"); |
| connProps.put("connector.class", MockConnector.class.getName()); |
| connProps.put("transforms", "example"); |
| connProps.put("transforms.example.type", RegexRouter.class.getName()); |
| connProps.put("transforms.example.regex", "(.*)"); |
| connProps.put("transforms.example.replacement", "prefix-$1"); |
| |
| Plugins plugins = null; // Safe when we're only constructing the config |
| new ConnectorConfig(plugins, connProps); |
| } |
| |
| @Test |
| public void testEmbeddedConfigReplaceField() { |
| // Validate that we can construct a Connector config containing the extended config for the transform |
| HashMap<String, String> connProps = new HashMap<>(); |
| connProps.put("name", "foo"); |
| connProps.put("connector.class", MockConnector.class.getName()); |
| connProps.put("transforms", "example"); |
| connProps.put("transforms.example.type", ReplaceField.Value.class.getName()); |
| |
| Plugins plugins = null; // Safe when we're only constructing the config |
| new ConnectorConfig(plugins, connProps); |
| } |
| |
| @Test |
| public void testEmbeddedConfigSetSchemaMetadata() { |
| // Validate that we can construct a Connector config containing the extended config for the transform |
| HashMap<String, String> connProps = new HashMap<>(); |
| connProps.put("name", "foo"); |
| connProps.put("connector.class", MockConnector.class.getName()); |
| connProps.put("transforms", "example"); |
| connProps.put("transforms.example.type", SetSchemaMetadata.Value.class.getName()); |
| |
| Plugins plugins = null; // Safe when we're only constructing the config |
| new ConnectorConfig(plugins, connProps); |
| } |
| |
| @Test |
| public void testEmbeddedConfigTimestampConverter() { |
| // Validate that we can construct a Connector config containing the extended config for the transform |
| HashMap<String, String> connProps = new HashMap<>(); |
| connProps.put("name", "foo"); |
| connProps.put("connector.class", MockConnector.class.getName()); |
| connProps.put("transforms", "example"); |
| connProps.put("transforms.example.type", TimestampConverter.Value.class.getName()); |
| connProps.put("transforms.example.target.type", "unix"); |
| |
| Plugins plugins = null; // Safe when we're only constructing the config |
| new ConnectorConfig(plugins, connProps); |
| } |
| |
| @Test |
| public void testEmbeddedConfigTimestampRouter() { |
| // Validate that we can construct a Connector config containing the extended config for the transform |
| HashMap<String, String> connProps = new HashMap<>(); |
| connProps.put("name", "foo"); |
| connProps.put("connector.class", MockConnector.class.getName()); |
| connProps.put("transforms", "example"); |
| connProps.put("transforms.example.type", TimestampRouter.class.getName()); |
| |
| Plugins plugins = null; // Safe when we're only constructing the config |
| new ConnectorConfig(plugins, connProps); |
| } |
| |
| @Test |
| public void testEmbeddedConfigValueToKey() { |
| // Validate that we can construct a Connector config containing the extended config for the transform |
| HashMap<String, String> connProps = new HashMap<>(); |
| connProps.put("name", "foo"); |
| connProps.put("connector.class", MockConnector.class.getName()); |
| connProps.put("transforms", "example"); |
| connProps.put("transforms.example.type", ValueToKey.class.getName()); |
| connProps.put("transforms.example.fields", "field"); |
| |
| Plugins plugins = null; // Safe when we're only constructing the config |
| new ConnectorConfig(plugins, connProps); |
| } |
| |
| } |