This is an automated email from the ASF dual-hosted git repository.
pvillard31 pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/nifi.git
The following commit(s) were added to refs/heads/main by this push:
new 931d4c278c4 NIFI-15960 Replaced current property in AvroSchemaRegistry
with a new one which utilizes a validation strategy where it details what Avro
validations occur when choosing strict validation of Avro schemas (#11290)
931d4c278c4 is described below
commit 931d4c278c480837d043535a81eb399f06f85b88
Author: dan-s1 <[email protected]>
AuthorDate: Wed Jul 8 15:42:02 2026 -0400
NIFI-15960 Replaced current property in AvroSchemaRegistry with a new one
which utilizes a validation strategy where it details what Avro validations
occur when choosing strict validation of Avro schemas (#11290)
* NIFI-15960 Replaced current property in AvroSchemaRegistry with a new one
which utilizes a validation strategy where it details what Avro validations
occur when choosing strict validation of Avro schemas
---
.../services/AvroSchemaRegistry.java | 50 +++--
.../services/ValidationStrategy.java | 52 +++++
.../services/TestAvroSchemaRegistry.java | 239 +++++++++++++++------
3 files changed, 255 insertions(+), 86 deletions(-)
diff --git
a/nifi-extension-bundles/nifi-registry-bundle/nifi-registry-service/src/main/java/org/apache/nifi/schemaregistry/services/AvroSchemaRegistry.java
b/nifi-extension-bundles/nifi-registry-bundle/nifi-registry-service/src/main/java/org/apache/nifi/schemaregistry/services/AvroSchemaRegistry.java
index 70f74eb91ce..c131221c0cf 100644
---
a/nifi-extension-bundles/nifi-registry-bundle/nifi-registry-service/src/main/java/org/apache/nifi/schemaregistry/services/AvroSchemaRegistry.java
+++
b/nifi-extension-bundles/nifi-registry-bundle/nifi-registry-service/src/main/java/org/apache/nifi/schemaregistry/services/AvroSchemaRegistry.java
@@ -34,7 +34,6 @@ import org.apache.nifi.schema.access.SchemaNotFoundException;
import org.apache.nifi.serialization.record.RecordSchema;
import org.apache.nifi.serialization.record.SchemaIdentifier;
-import java.io.IOException;
import java.util.Collection;
import java.util.EnumSet;
import java.util.HashSet;
@@ -52,22 +51,22 @@ import java.util.concurrent.ConcurrentMap;
description = "Adds a named schema using the JSON string
representation of an Avro schema",
expressionLanguageScope = ExpressionLanguageScope.NONE)
public class AvroSchemaRegistry extends AbstractControllerService implements
SchemaRegistry {
- private static final Set<SchemaField> schemaFields =
EnumSet.of(SchemaField.SCHEMA_NAME, SchemaField.SCHEMA_TEXT,
SchemaField.SCHEMA_TEXT_FORMAT);
- private final ConcurrentMap<String, RecordSchema> recordSchemas = new
ConcurrentHashMap<>();
-
- static final PropertyDescriptor VALIDATE_FIELD_NAMES = new
PropertyDescriptor.Builder()
- .name("Validate Field Names")
- .description("Whether or not to validate the field names in the
Avro schema based on Avro naming rules. If set to true, all field names must be
valid Avro names, "
- + "which must begin with [A-Za-z_], and subsequently
contain only [A-Za-z0-9_]. If set to false, no validation will be performed on
the field names.")
- .allowableValues("true", "false")
- .defaultValue("true")
+ static final List<String> OBSOLETE_VALIDATE_FIELD_NAMES =
List.of("avro-reg-validated-field-names", "Validate Field Names");
+ static final PropertyDescriptor VALIDATION_STRATEGY = new
PropertyDescriptor.Builder()
+ .name("Validation Strategy")
+ .description("Set the strategy for the level of Avro validation
required for field names, namespaces and default values")
.required(true)
+ .allowableValues(ValidationStrategy.class)
+ .defaultValue(ValidationStrategy.VALIDATE)
.build();
private static final List<PropertyDescriptor> PROPERTY_DESCRIPTORS =
List.of(
- VALIDATE_FIELD_NAMES
+ VALIDATION_STRATEGY
);
+ private static final Set<SchemaField> SCHEMA_FIELDS =
EnumSet.of(SchemaField.SCHEMA_NAME, SchemaField.SCHEMA_TEXT,
SchemaField.SCHEMA_TEXT_FORMAT);
+ private final ConcurrentMap<String, RecordSchema> recordSchemas = new
ConcurrentHashMap<>();
+
@Override
public void onPropertyModified(final PropertyDescriptor descriptor, final
String oldValue, final String newValue) {
if (descriptor.isDynamic()) {
@@ -92,8 +91,8 @@ public class AvroSchemaRegistry extends
AbstractControllerService implements Sch
@Override
protected Collection<ValidationResult> customValidate(ValidationContext
validationContext) {
- Set<ValidationResult> results = new HashSet<>();
- boolean strict =
validationContext.getProperty(VALIDATE_FIELD_NAMES).asBoolean();
+ final Set<ValidationResult> results = new HashSet<>();
+ final ValidationStrategy validationStrategy =
validationContext.getProperty(VALIDATION_STRATEGY).asAllowableValue(ValidationStrategy.class);
// Iterate over dynamic properties, validating the schemas, and adding
results
validationContext.getProperties().entrySet().stream().filter(entry ->
entry.getKey().isDynamic()).forEach(entry -> {
@@ -101,7 +100,7 @@ public class AvroSchemaRegistry extends
AbstractControllerService implements Sch
String input = entry.getValue();
try {
- final Schema.Parser parser = strict
+ final Schema.Parser parser = ValidationStrategy.VALIDATE ==
validationStrategy
? new
Schema.Parser(NameValidator.STRICT_VALIDATOR).setValidateDefaults(true)
: new
Schema.Parser(NameValidator.NO_VALIDATION).setValidateDefaults(false);
final Schema avroSchema = parser.parse(input);
@@ -127,7 +126,7 @@ public class AvroSchemaRegistry extends
AbstractControllerService implements Sch
}
@Override
- public RecordSchema retrieveSchema(final SchemaIdentifier
schemaIdentifier) throws IOException, SchemaNotFoundException {
+ public RecordSchema retrieveSchema(final SchemaIdentifier
schemaIdentifier) throws SchemaNotFoundException {
final Optional<String> schemaName = schemaIdentifier.getName();
if (schemaName.isPresent()) {
return retrieveSchemaByName(schemaName.get());
@@ -137,8 +136,23 @@ public class AvroSchemaRegistry extends
AbstractControllerService implements Sch
}
@Override
- public void migrateProperties(PropertyConfiguration config) {
- config.renameProperty("avro-reg-validated-field-names",
VALIDATE_FIELD_NAMES.getName());
+ public void migrateProperties(final PropertyConfiguration config) {
+ // NOTE: Although there are multiple names for
OBSOLETE_VALIDATE_FIELD_NAMES, the code in the if statement
+ // will execute at most once as the assumption is a configuration has
one of the obsolete property names but not all.
+ for (final String obsoletePropertyName :
OBSOLETE_VALIDATE_FIELD_NAMES) {
+ if (config.hasProperty(obsoletePropertyName) &&
config.isPropertySet(obsoletePropertyName)) {
+ final String validateFieldNamesRawValue =
config.getRawPropertyValue(obsoletePropertyName).orElse(Boolean.TRUE.toString());
+ final boolean validateFieldNames =
Boolean.parseBoolean(validateFieldNamesRawValue);
+
+ if (validateFieldNames) {
+ config.setProperty(VALIDATION_STRATEGY,
ValidationStrategy.VALIDATE.getValue());
+ } else {
+ config.setProperty(VALIDATION_STRATEGY,
ValidationStrategy.NONE.getValue());
+ }
+ }
+
+ config.removeProperty(obsoletePropertyName);
+ }
}
@Override
@@ -159,6 +173,6 @@ public class AvroSchemaRegistry extends
AbstractControllerService implements Sch
@Override
public Set<SchemaField> getSuppliedSchemaFields() {
- return schemaFields;
+ return SCHEMA_FIELDS;
}
}
diff --git
a/nifi-extension-bundles/nifi-registry-bundle/nifi-registry-service/src/main/java/org/apache/nifi/schemaregistry/services/ValidationStrategy.java
b/nifi-extension-bundles/nifi-registry-bundle/nifi-registry-service/src/main/java/org/apache/nifi/schemaregistry/services/ValidationStrategy.java
new file mode 100644
index 00000000000..e7528173c93
--- /dev/null
+++
b/nifi-extension-bundles/nifi-registry-bundle/nifi-registry-service/src/main/java/org/apache/nifi/schemaregistry/services/ValidationStrategy.java
@@ -0,0 +1,52 @@
+/*
+ * 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.nifi.schemaregistry.services;
+
+import org.apache.nifi.components.DescribedValue;
+
+public enum ValidationStrategy implements DescribedValue {
+ VALIDATE("Validate Schemas", """
+ Validate incoming Avro schemas. Validation includes field name,
+ namespace and default value validation. All field names must be
valid Avro names
+ that match the following regular expression [A-Za-z_][A-Za-z0-9_]*
(i.e. a name that starts with a letter or an underscore, followed by zero or
more alphanumeric
+ characters or underscores), all namespaces must be one or more
valid Avro names each matching the aforementioned regular expression and
separated by periods
+ and any default value specified must match the field type (e.g. a
field with type int must specify a number such as 9)"""),
+ NONE("Do Not Validate Schemas", "Do not validate field names, namespaces
and default values of incoming schemas.");
+
+ private final String displayName;
+ private final String description;
+
+ ValidationStrategy(String displayName, String description) {
+ this.displayName = displayName;
+ this.description = description;
+ }
+
+ @Override
+ public String getValue() {
+ return name();
+ }
+
+ @Override
+ public String getDisplayName() {
+ return displayName;
+ }
+
+ @Override
+ public String getDescription() {
+ return description;
+ }
+}
diff --git
a/nifi-extension-bundles/nifi-registry-bundle/nifi-registry-service/src/test/java/org/apache/nifi/schemaregistry/services/TestAvroSchemaRegistry.java
b/nifi-extension-bundles/nifi-registry-bundle/nifi-registry-service/src/test/java/org/apache/nifi/schemaregistry/services/TestAvroSchemaRegistry.java
index 776e26f008c..087a6e714c4 100644
---
a/nifi-extension-bundles/nifi-registry-bundle/nifi-registry-service/src/test/java/org/apache/nifi/schemaregistry/services/TestAvroSchemaRegistry.java
+++
b/nifi-extension-bundles/nifi-registry-bundle/nifi-registry-service/src/test/java/org/apache/nifi/schemaregistry/services/TestAvroSchemaRegistry.java
@@ -17,93 +17,196 @@
package org.apache.nifi.schemaregistry.services;
import org.apache.nifi.components.PropertyDescriptor;
-import org.apache.nifi.components.PropertyValue;
-import org.apache.nifi.components.ValidationContext;
-import org.apache.nifi.components.ValidationResult;
-import org.apache.nifi.controller.ConfigurationContext;
+import org.apache.nifi.expression.ExpressionLanguageScope;
+import org.apache.nifi.processor.util.StandardValidators;
import org.apache.nifi.schema.access.SchemaNotFoundException;
import org.apache.nifi.serialization.record.RecordSchema;
import org.apache.nifi.serialization.record.SchemaIdentifier;
+import org.apache.nifi.util.MockPropertyConfiguration;
+import org.apache.nifi.util.NoOpProcessor;
+import org.apache.nifi.util.PropertyMigrationResult;
+import org.apache.nifi.util.TestRunner;
+import org.apache.nifi.util.TestRunners;
+import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.Arguments;
+import org.junit.jupiter.params.provider.EnumSource;
+import org.junit.jupiter.params.provider.MethodSource;
-import java.util.Collection;
-import java.util.HashMap;
import java.util.Map;
+import java.util.Optional;
+import java.util.Set;
+import java.util.stream.Stream;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.junit.jupiter.api.Assertions.assertTrue;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
public class TestAvroSchemaRegistry {
-
- @Test
- public void validateSchemaRegistrationFromDynamicProperties() throws
Exception {
- String schemaName = "fooSchema";
-
- PropertyDescriptor fooSchema = new PropertyDescriptor.Builder()
- .name(schemaName)
+ private static final String SCHEMA_NAME = "fooSchema";
+ private static final PropertyDescriptor
SUPPORTED_DYNAMIC_PROPERTY_DESCRIPTOR = new PropertyDescriptor.Builder()
+ .name(SCHEMA_NAME)
+ .required(false)
+ .addValidator(StandardValidators.NON_BLANK_VALIDATOR)
.dynamic(true)
- .build();
- String fooSchemaText = "{\"namespace\": \"example.avro\", " +
"\"type\": \"record\", " + "\"name\": \"User\", "
- + "\"fields\": [ " + "{\"name\": \"name\", \"type\": [\"string\",
\"null\"]}, "
- + "{\"name\": \"favorite_number\", \"type\": [\"int\",
\"null\"]}, "
- + "{\"name\": \"foo\", \"type\": [\"int\", \"null\"]}, "
- + "{\"name\": \"favorite_color\", \"type\": [\"string\",
\"null\"]} " + "]" + "}";
- PropertyDescriptor barSchema = new PropertyDescriptor.Builder()
- .name("barSchema")
- .dynamic(false)
+ .expressionLanguageSupported(ExpressionLanguageScope.NONE)
.build();
- AvroSchemaRegistry delegate = new AvroSchemaRegistry();
- delegate.onPropertyModified(fooSchema, null, fooSchemaText);
- delegate.onPropertyModified(barSchema, null, "");
+ private static final String NON_PERIOD_NAMESPACE_SEPARATOR = """
+ {"namespace": "example-avro", "type":
"record", "name": "User",
+ "fields": [ {"name": "name", "type":
["string", "null"]},
+ {"name": "favorite_number", "type": ["int",
"null"]},
+ {"name": "foo", "type": ["int", "null"]},
+ {"name": "favorite_color", "type": ["string",
"null"]} ]}""";
- SchemaIdentifier schemaIdentifier =
SchemaIdentifier.builder().name(schemaName).build();
- RecordSchema locatedSchema = delegate.retrieveSchema(schemaIdentifier);
- assertEquals(fooSchemaText, locatedSchema.getSchemaText().get());
- assertThrows(SchemaNotFoundException.class, () ->
delegate.retrieveSchema(SchemaIdentifier.builder().name("barSchema").build()));
+ private static final String ILLEGAL_CHARACTER_IN_RECORD_NAME = """
+ {"namespace": "example.avro", "type":
"record", "name": "$User",
+ "fields": [ {"name": "name", "type":
["string", "null"]},
+ {"name": "favorite_number", "type": ["int",
"null"]},
+ {"name": "foo", "type": ["int", "null"]},
+ {"name": "favorite_color", "type": ["string",
"null"]} ]}""";
+
+ private static final String ILLEGAL_CHARACTER_IN_FIELD_NAME = """
+ {"namespace": "example.avro", "type":
"record", "name": "User",
+ "fields": [ {"name": "@name", "type":
["string", "null"]},
+ {"name": "favorite_number", "type": ["int",
"null"]},
+ {"name": "foo", "type": ["int", "null"]},
+ {"name": "favorite_color", "type": ["string",
"null"]} ]}""";
+
+ private static final String NON_MATCHING_DEFAULT_TYPE = """
+ {"namespace": "example.avro", "type":
"record", "name": "User",
+ "fields": [ {"name": "name", "type":
["string", "null"]},
+ {"name": "favorite_number", "type": ["int",
"null"]},
+ {"name": "foo", "type": "int", "default":
"NAN"},
+ {"name": "favorite_color", "type": ["string",
"null"]} ]}""";
+
+ private static final String NON_MATCHING_UNION_DEFAULT_TYPE = """
+ {"namespace": "example.avro", "type":
"record", "name": "User",
+ "fields": [ {"name": "name", "type":
["string", "null"]},
+ {"name": "favorite_number", "type": ["int",
"null"]},
+ {"name": "foo", "type": ["int", "null"],
"default": "NAN"},
+ {"name": "favorite_color", "type": ["string",
"null"]} ]}""";
+
+ private TestRunner runner;
+ private AvroSchemaRegistry avroSchemaRegistry;
+
+ @BeforeEach
+ void setup() throws Exception {
+ runner = TestRunners.newTestRunner(NoOpProcessor.class);
+ avroSchemaRegistry = new AvroSchemaRegistry();
+ runner.addControllerService("avroSchemaRegistry", avroSchemaRegistry);
+ }
+
+ @Test
+ public void testRetrievalOfNonExistentSchema() {
+ runner.assertValid(avroSchemaRegistry);
+ runner.enableControllerService(avroSchemaRegistry);
+ final SchemaIdentifier nonExistentSchemaIdentifier =
SchemaIdentifier.builder().name("barSchema").build();
+
+ assertThrows(SchemaNotFoundException.class, () ->
avroSchemaRegistry.retrieveSchema(nonExistentSchemaIdentifier));
}
@Test
- public void
validateStrictAndNonStrictSchemaRegistrationFromDynamicProperties() {
+ public void validateSchemaRegistration() throws Exception {
String schemaName = "fooSchema";
- ConfigurationContext configContext = mock(ConfigurationContext.class);
- Map<PropertyDescriptor, String> properties = new HashMap<>();
- PropertyDescriptor fooSchema = new PropertyDescriptor.Builder()
- .name(schemaName)
- .dynamic(true)
- .build();
- // NOTE: name of record and name of first field are not
Avro-compliant, verified below
- String fooSchemaText = "{\"namespace\": \"example.avro\", " +
"\"type\": \"record\", " + "\"name\": \"$User\", "
- + "\"fields\": [ " + "{\"name\": \"@name\", \"type\":
[\"string\", \"null\"]}, "
- + "{\"name\": \"favorite_number\", \"type\": [\"int\",
\"null\"]}, "
- + "{\"name\": \"foo\", \"type\": [\"int\", \"null\"]}, "
- + "{\"name\": \"favorite_color\", \"type\": [\"string\",
\"null\"]} " + "]" + "}";
- PropertyDescriptor barSchema = new PropertyDescriptor.Builder()
- .name("barSchema")
- .dynamic(false)
- .build();
- properties.put(fooSchema, fooSchemaText);
- properties.put(barSchema, "");
- AvroSchemaRegistry delegate = new AvroSchemaRegistry();
- delegate.getSupportedPropertyDescriptors().forEach(prop ->
properties.put(prop, prop.getDisplayName()));
- when(configContext.getProperties()).thenReturn(properties);
-
- ValidationContext validationContext = mock(ValidationContext.class);
- when(validationContext.getProperties()).thenReturn(properties);
- PropertyValue propertyValue = mock(PropertyValue.class);
-
when(validationContext.getProperty(AvroSchemaRegistry.VALIDATE_FIELD_NAMES)).thenReturn(propertyValue);
-
- // Strict parsing
- when(propertyValue.asBoolean()).thenReturn(true);
- Collection<ValidationResult> results =
delegate.customValidate(validationContext);
- assertTrue(results.stream().anyMatch(result -> !result.isValid()));
-
- // Non-strict parsing
- when(propertyValue.asBoolean()).thenReturn(false);
- results = delegate.customValidate(validationContext);
- results.forEach(result -> assertTrue(result.isValid()));
+ String fooSchemaText = """
+ {"namespace": "example.avro", "type": "record", "name": "User",
+ "fields": [ {"name": "name", "type": ["string", "null"]},
+ {"name": "favorite_number", "type": ["int", "null"]},
+ {"name": "foo", "type": ["int", "null"]},
+ {"name": "favorite_color", "type": ["string", "null"]} ]}""";
+
+ runner.setProperty(avroSchemaRegistry,
SUPPORTED_DYNAMIC_PROPERTY_DESCRIPTOR, fooSchemaText);
+ runner.assertValid(avroSchemaRegistry);
+ runner.enableControllerService(avroSchemaRegistry);
+
+ final SchemaIdentifier schemaIdentifier =
SchemaIdentifier.builder().name(schemaName).build();
+ final RecordSchema locatedSchema =
avroSchemaRegistry.retrieveSchema(schemaIdentifier);
+ assertTrue(locatedSchema.getSchemaText().isPresent());
+ assertEquals(fooSchemaText, locatedSchema.getSchemaText().get());
+ }
+
+ @ParameterizedTest
+ @MethodSource("invalidSchemas")
+ public void testWhereSchemasValidated(String schema) {
+ runner.setProperty(avroSchemaRegistry,
SUPPORTED_DYNAMIC_PROPERTY_DESCRIPTOR, schema);
+ runner.setProperty(avroSchemaRegistry,
AvroSchemaRegistry.VALIDATION_STRATEGY, ValidationStrategy.VALIDATE.getValue());
+
+ runner.assertNotValid(avroSchemaRegistry);
+ }
+
+ @ParameterizedTest
+ @MethodSource("invalidSchemas")
+ public void testWhereSchemasNotValidated(String schema) {
+ runner.setProperty(avroSchemaRegistry,
SUPPORTED_DYNAMIC_PROPERTY_DESCRIPTOR, schema);
+ runner.setProperty(avroSchemaRegistry,
AvroSchemaRegistry.VALIDATION_STRATEGY, ValidationStrategy.NONE.getValue());
+
+ runner.assertValid(avroSchemaRegistry);
+ }
+
+ @ParameterizedTest
+ @EnumSource(ValidationStrategy.class)
+ public void
testDuplicateFieldsInvalidRegardlessOfValidation(ValidationStrategy
validationStrategy) {
+ final String schema = """
+ {"namespace": "example.avro", "type": "record", "name": "User",
+ "fields": [ {"name": "name", "type": ["string", "null"]},
+ {"name": "favorite_number", "type": ["int", "null"]},
+ {"name": "foo", "type": ["int", "null"]},
+ {"name": "foo", "type": ["int", "null"]},
+ {"name": "favorite_color", "type": ["string", "null"]} ]}""";
+
+ runner.setProperty(avroSchemaRegistry,
SUPPORTED_DYNAMIC_PROPERTY_DESCRIPTOR, schema);
+ runner.setProperty(avroSchemaRegistry,
AvroSchemaRegistry.VALIDATION_STRATEGY, validationStrategy.getValue());
+
+ runner.assertNotValid(avroSchemaRegistry);
+ }
+
+ @ParameterizedTest
+ @MethodSource("migrationConfigurations")
+ void testMigrateProperties(MockPropertyConfiguration configuration, String
expectedRemoved, ValidationStrategy expectedChangedTo) {
+ final AvroSchemaRegistry service = new AvroSchemaRegistry();
+ service.migrateProperties(configuration);
+
+ final PropertyMigrationResult result =
configuration.toPropertyMigrationResult();
+ final Set<String> propertiesRemoved = result.getPropertiesRemoved();
+ assertTrue(propertiesRemoved.contains(expectedRemoved));
+
+ final String expectedUpdated =
AvroSchemaRegistry.VALIDATION_STRATEGY.getName();
+ final Set<String> actualUpdated = result.getPropertiesUpdated();
+ assertEquals(1, actualUpdated.size());
+ assertTrue(actualUpdated.contains(expectedUpdated));
+
+ final Optional<String> optional =
configuration.getPropertyValue(AvroSchemaRegistry.VALIDATION_STRATEGY);
+ assertTrue(optional.isPresent());
+ final ValidationStrategy actualChangedToValue =
ValidationStrategy.valueOf(optional.get());
+ assertEquals(expectedChangedTo, actualChangedToValue);
+ }
+
+ private static Stream<Arguments> invalidSchemas() {
+ return Stream.of(
+ Arguments.argumentSet("Namespace separator other than a
period", NON_PERIOD_NAMESPACE_SEPARATOR),
+ Arguments.argumentSet("Illegal character(s) in record name",
ILLEGAL_CHARACTER_IN_RECORD_NAME),
+ Arguments.argumentSet("Illegal character(s) in field name",
ILLEGAL_CHARACTER_IN_FIELD_NAME),
+ Arguments.argumentSet("Non matching default type",
NON_MATCHING_DEFAULT_TYPE),
+ Arguments.argumentSet("Non matching union default type",
NON_MATCHING_UNION_DEFAULT_TYPE)
+ );
+ }
+
+ private static Stream<Arguments> migrationConfigurations() {
+ return Stream.of(
+
Arguments.argumentSet(AvroSchemaRegistry.OBSOLETE_VALIDATE_FIELD_NAMES.getFirst()
+ " Validate",
+ new
MockPropertyConfiguration(Map.of(AvroSchemaRegistry.OBSOLETE_VALIDATE_FIELD_NAMES.getFirst(),
Boolean.TRUE.toString())),
+
AvroSchemaRegistry.OBSOLETE_VALIDATE_FIELD_NAMES.getFirst(),
ValidationStrategy.VALIDATE),
+
Arguments.argumentSet(AvroSchemaRegistry.OBSOLETE_VALIDATE_FIELD_NAMES.getFirst()
+ " Do Not Validate",
+ new
MockPropertyConfiguration(Map.of(AvroSchemaRegistry.OBSOLETE_VALIDATE_FIELD_NAMES.getFirst(),
Boolean.FALSE.toString())),
+
AvroSchemaRegistry.OBSOLETE_VALIDATE_FIELD_NAMES.getFirst(),
ValidationStrategy.NONE),
+
Arguments.argumentSet(AvroSchemaRegistry.OBSOLETE_VALIDATE_FIELD_NAMES.get(1) +
" Validate",
+ new
MockPropertyConfiguration(Map.of(AvroSchemaRegistry.OBSOLETE_VALIDATE_FIELD_NAMES.get(1),
Boolean.TRUE.toString())),
+
AvroSchemaRegistry.OBSOLETE_VALIDATE_FIELD_NAMES.get(1),
ValidationStrategy.VALIDATE),
+
Arguments.argumentSet(AvroSchemaRegistry.OBSOLETE_VALIDATE_FIELD_NAMES.get(1) +
" Do Not Validate",
+ new
MockPropertyConfiguration(Map.of(AvroSchemaRegistry.OBSOLETE_VALIDATE_FIELD_NAMES.get(1),
Boolean.FALSE.toString())),
+
AvroSchemaRegistry.OBSOLETE_VALIDATE_FIELD_NAMES.get(1),
ValidationStrategy.NONE)
+ );
}
}