diff --git a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/configurable/providers/ConfigUtils.java b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/configurable/providers/ConfigUtils.java index 85e2dcab2742..f64355c5a5a6 100644 --- a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/configurable/providers/ConfigUtils.java +++ b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/configurable/providers/ConfigUtils.java @@ -77,15 +77,15 @@ public static Object getFiniteBalValue(String strValue, BFiniteType finiteType, public static boolean containsUnsupportedMembers(BUnionType unionType) { for (Type memberType : unionType.getMemberTypes()) { - if (!isSimpleSequenceType(TypeUtils.getImpliedType(memberType).getTag())) { + if (!isPrimitiveOrSequenceType(TypeUtils.getImpliedType(memberType).getTag())) { return true; } } return false; } - private static boolean isSimpleSequenceType(int tag) { - return tag <= TypeTags.BOOLEAN_TAG || TypeTags.isXMLTypeTag(tag); + private static boolean isPrimitiveOrSequenceType(int tag) { + return tag == TypeTags.NULL_TAG || tag <= TypeTags.BOOLEAN_TAG || TypeTags.isXMLTypeTag(tag); } public static Object getUnionValue(VariableKey key, BUnionType unionType, String value, String arg) { @@ -104,6 +104,8 @@ private static List getConvertibleMemberValues(String value, UnionType u List matchingValues = new ArrayList<>(); for (Type type : unionType.getMemberTypes()) { switch (TypeUtils.getImpliedType(type).getTag()) { + case TypeTags.NULL_TAG: + break; case TypeTags.BYTE_TAG: convertAndGetValuesFromString(matchingValues, TypeConverter::stringToByte, value); break; diff --git a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/configurable/providers/cli/CliProvider.java b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/configurable/providers/cli/CliProvider.java index 182b01135066..003998ff95d3 100644 --- a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/configurable/providers/cli/CliProvider.java +++ b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/configurable/providers/cli/CliProvider.java @@ -220,12 +220,12 @@ public Optional getAsUnionAndMark(Module module, VariableKey key) { CliArg cliArg = getCliArg(module, key); BUnionType unionType = (BUnionType) ((BIntersectionType) key.type).getEffectiveType(); boolean isEnum = SymbolFlags.isFlagOn(unionType.getFlags(), SymbolFlags.ENUM); - if (!isEnum && ConfigUtils.containsUnsupportedMembers(unionType)) { - throw new ConfigException(CONFIG_CLI_TYPE_NOT_SUPPORTED, key.variable, unionType); - } if (cliArg.value == null) { return Optional.empty(); } + if (!isEnum && ConfigUtils.containsUnsupportedMembers(unionType)) { + throw new ConfigException(CONFIG_CLI_TYPE_NOT_SUPPORTED, key.variable, unionType); + } if (isEnum) { return getCliConfigValue(ConfigUtils.getFiniteValue(key, unionType, cliArg.value, cliArg.toString())); } diff --git a/bvm/ballerina-runtime/src/test/java/io/ballerina/runtime/test/config/CliProviderTest.java b/bvm/ballerina-runtime/src/test/java/io/ballerina/runtime/test/config/CliProviderTest.java index e8d3e2f1ca63..71a55055055e 100644 --- a/bvm/ballerina-runtime/src/test/java/io/ballerina/runtime/test/config/CliProviderTest.java +++ b/bvm/ballerina-runtime/src/test/java/io/ballerina/runtime/test/config/CliProviderTest.java @@ -211,6 +211,10 @@ public Object[][] unionDataProvider() { PredefinedTypes.TYPE_DECIMAL), true); UnionType floatBoolen = TypeCreator.createUnionType(List.of(PredefinedTypes.TYPE_FLOAT, PredefinedTypes.TYPE_BOOLEAN), true); + UnionType intNull = TypeCreator.createUnionType(List.of(PredefinedTypes.TYPE_INT, + PredefinedTypes.TYPE_NULL), true); + UnionType boolenNull = TypeCreator.createUnionType(List.of(PredefinedTypes.TYPE_BOOLEAN, + PredefinedTypes.TYPE_NULL), true); return new Object[][]{ {"stringInt", getIntersectionType(ROOT_MODULE, stringInt), strVal, "-CstringInt=test"}, {"intFloat", getIntersectionType(ROOT_MODULE, intFloat), 2.2d, "-CintFloat=2.2"}, @@ -218,6 +222,8 @@ public Object[][] unionDataProvider() { {"intBoolean", getIntersectionType(ROOT_MODULE, intBoolean), 2L, "-CintBoolean=2"}, {"intDecimal", getIntersectionType(ROOT_MODULE, intDecimal), decimalVal, "-CintDecimal=3.23"}, {"floatBoolen", getIntersectionType(ROOT_MODULE, floatBoolen), true, "-CfloatBoolen=true"}, + {"intNull", getIntersectionType(ROOT_MODULE, intNull), 87L, "-CintNull=87"}, + {"boolenNull", getIntersectionType(ROOT_MODULE, boolenNull), true, "-CboolenNull=true"}, }; } diff --git a/bvm/ballerina-runtime/src/test/java/io/ballerina/runtime/test/config/ConfigTest.java b/bvm/ballerina-runtime/src/test/java/io/ballerina/runtime/test/config/ConfigTest.java index 16ecd652a26f..9807d9640e7e 100644 --- a/bvm/ballerina-runtime/src/test/java/io/ballerina/runtime/test/config/ConfigTest.java +++ b/bvm/ballerina-runtime/src/test/java/io/ballerina/runtime/test/config/ConfigTest.java @@ -258,4 +258,23 @@ public void testEnvVarUnsupportedErrors(String variableName, Type type, String e } } + + @Test + public void testCliWhenUnsupportedTypesWithinToml() { + ArrayType arrayType = TypeCreator.createArrayType(TYPE_STRING); + VariableKey v1 = new VariableKey(module, "v1", PredefinedTypes.TYPE_INT, true); + Type v2Type = new BIntersectionType(module, new Type[]{arrayType, PredefinedTypes.TYPE_READONLY}, + arrayType, 0, true); + VariableKey v2 = new VariableKey(module, "v2", v2Type, true); + RuntimeDiagnosticLog diagnosticLog = new RuntimeDiagnosticLog(); + ConfigResolver configResolver = + new ConfigResolver(Map.ofEntries(Map.entry(module, new VariableKey[]{v1, v2})), diagnosticLog, + List.of(new CliProvider(ROOT_MODULE, "-CmyOrg.test_module.v1=87"), + new TomlFileProvider(ROOT_MODULE, + getConfigPath("UnsupportedCLITypeConfig.toml"), Set.of(module)))); + Map configValueMap = configResolver.resolveConfigs(); + Assert.assertEquals(configValueMap.get(v1).getValue(), 87L); + Assert.assertEquals(configValueMap.get(v2).getValue().toString(), "[\"hello\",\"world\"]"); + Assert.assertEquals(0, diagnosticLog.getErrorCount()); + } } diff --git a/bvm/ballerina-runtime/src/test/resources/config_files/UnsupportedCLITypeConfig.toml b/bvm/ballerina-runtime/src/test/resources/config_files/UnsupportedCLITypeConfig.toml new file mode 100644 index 000000000000..ed6a86aa838e --- /dev/null +++ b/bvm/ballerina-runtime/src/test/resources/config_files/UnsupportedCLITypeConfig.toml @@ -0,0 +1,2 @@ +[myOrg.test_module] +v2 = ["hello", "world"]