-
Bug
-
Resolution: Won't Do
-
Medium
-
None
-
None
Steps to reproduce:
1. on netconf master branch, add this model into restconf/restconf-openapi/src/test/resources/yang/ and name it definition-test.yang
module definition-test { namespace "urn:definition-test"; prefix sample; typedef topology-ref { type instance-identifier; } container binary-container { leaf binary-data { type binary; default "SGVsbG8gdGVzdCE="; } } container union-container { leaf testUnion1 { type union { type int32; type string; } default 5; } leaf testUnion2 { type union { type string; type boolean; } default false; } leaf testUnion3 { type union { type int32; type boolean; } default false; } leaf testBoolean { type boolean; default true; } } container number-container { leaf testInteger { type int32; default 42; } leaf testUnsignedInteger { type uint16; default 100; } leaf testDecimal { type decimal64 { fraction-digits 2; } default 3.14; } leaf testDouble { type decimal64 { fraction-digits 11; } default 3.14159265359; } leaf testInt64 { type int64; default 42; } leaf testUint64 { type uint64; default 42; } } container enum-container { leaf status { type enumeration { enum up { value 1; } enum down { value 2; } } default "up"; } } container network-container { leaf network-ref { type topology-ref; default "/network/nodes[node-id='node1']"; } } }
2.
Add this test into DefinitionGeneratorTest.java
@Test public void testUnionTypes() throws IOException { final var module = context.findModule("definition-test").orElseThrow(); final var generator = new DefinitionGenerator(); final var jsonObject = generator.convertToSchemas(module, context, new DefinitionNames(), true); assertNotNull(jsonObject); final var properties = jsonObject.get("definition-test_config_union-container").properties(); assertEquals("5", properties.get("testUnion1").get("default").asText()); assertEquals("string", properties.get("testUnion1").get("type").asText()); assertEquals("Some testUnion1", properties.get("testUnion1").get("example").asText()); assertEquals("false", properties.get("testUnion2").get("default").asText()); assertEquals("string", properties.get("testUnion2").get("type").asText()); assertEquals("Some testUnion2", properties.get("testUnion2").get("example").asText()); assertEquals("number", properties.get("testUnion3").get("type").asText()); assertEquals("0", properties.get("testUnion3").get("example").asText()); assertEquals("false", properties.get("testUnion3").get("default").asText()); }
Run the test. This will cause an exception to be thrown inside:
https://git.opendaylight.org/gerrit/c/netconf/+/105875/24/restconf/restconf-openapi/src/main/java/org/opendaylight/restconf/openapi/impl/DefinitionGenerator.java#876
The exception:
java.lang.NumberFormatException: For input string: "false" at java.base/java.lang.NumberFormatException.forInputString(NumberFormatException.java:67) at java.base/java.lang.Long.parseLong(Long.java:711) at java.base/java.lang.Long.valueOf(Long.java:1159) at org.opendaylight.restconf.openapi.impl.DefinitionGenerator.lambda$processUnionType$17(DefinitionGenerator.java:889) at java.base/java.util.Optional.ifPresent(Optional.java:178) at org.opendaylight.restconf.openapi.impl.DefinitionGenerator.processUnionType(DefinitionGenerator.java:889) at org.opendaylight.restconf.openapi.impl.DefinitionGenerator.processTypeDef(DefinitionGenerator.java:625) at org.opendaylight.restconf.openapi.impl.DefinitionGenerator.processLeafNode(DefinitionGenerator.java:564) at org.opendaylight.restconf.openapi.impl.DefinitionGenerator.processChildNode(DefinitionGenerator.java:492) at org.opendaylight.restconf.openapi.impl.DefinitionGenerator.processChildren(DefinitionGenerator.java:442) at org.opendaylight.restconf.openapi.impl.DefinitionGenerator.processDataNodeContainer(DefinitionGenerator.java:403) at org.opendaylight.restconf.openapi.impl.DefinitionGenerator.processContainersAndLists(DefinitionGenerator.java:263) at org.opendaylight.restconf.openapi.impl.DefinitionGenerator.convertToSchemas(DefinitionGenerator.java:150) at org.opendaylight.restconf.openapi.impl.DefinitionGenerator.convertToSchemas(DefinitionGenerator.java:167)
And the place inside yang model which causes this is here:
leaf testUnion3 { type union { type int32; type boolean; } default false; }