import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
+import static org.opendaylight.yangtools.yang.stmt.StmtTestUtils.sourceForResource;
+import com.google.common.collect.Iterables;
+import com.google.common.collect.Range;
import java.net.URI;
import java.util.List;
+import java.util.Optional;
import java.util.Set;
import org.junit.Before;
import org.junit.Test;
import org.opendaylight.yangtools.yang.common.QName;
+import org.opendaylight.yangtools.yang.common.Revision;
import org.opendaylight.yangtools.yang.model.api.IdentitySchemaNode;
import org.opendaylight.yangtools.yang.model.api.LeafSchemaNode;
import org.opendaylight.yangtools.yang.model.api.Module;
+import org.opendaylight.yangtools.yang.model.api.SchemaContext;
import org.opendaylight.yangtools.yang.model.api.Status;
import org.opendaylight.yangtools.yang.model.api.TypeDefinition;
import org.opendaylight.yangtools.yang.model.api.type.BitsTypeDefinition;
import org.opendaylight.yangtools.yang.parser.spi.source.StatementStreamSource;
import org.opendaylight.yangtools.yang.parser.stmt.reactor.CrossSourceStatementReactor;
import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.YangInferencePipeline;
-import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.YangStatementSourceImpl;
-import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.effective.EffectiveSchemaContext;
public class TypesResolutionTest {
- private Set<Module> testedModules;
+ private SchemaContext context;
@Before
public void init() throws Exception {
- final StatementStreamSource yangFile =
- new YangStatementSourceImpl("/types/custom-types-test@2012-4-4.yang", false);
- final StatementStreamSource yangFileDependency1 =
- new YangStatementSourceImpl ("/ietf/iana-timezones@2012-07-09.yang", false);
- final StatementStreamSource yangFileDependency2 =
- new YangStatementSourceImpl ("/ietf/ietf-inet-types@2010-09-24.yang", false);
- final StatementStreamSource yangFileDependency3 =
- new YangStatementSourceImpl ("/ietf/ietf-yang-types@2010-09-24.yang", false);
-
- testedModules = TestUtils.parseYangSources(yangFile, yangFileDependency1, yangFileDependency2,
- yangFileDependency3).getModules();
- assertEquals(4, testedModules.size());
+ final StatementStreamSource yangFile = sourceForResource("/types/custom-types-test@2012-04-04.yang");
+ final StatementStreamSource yangFileDependency1 = sourceForResource("/ietf/iana-timezones@2012-07-09.yang");
+ final StatementStreamSource yangFileDependency2 = sourceForResource("/ietf/ietf-inet-types@2010-09-24.yang");
+ final StatementStreamSource yangFileDependency3 = sourceForResource("/ietf/ietf-yang-types@2010-09-24.yang");
+ context = TestUtils.parseYangSources(yangFile, yangFileDependency1, yangFileDependency2, yangFileDependency3);
+ assertEquals(4, context.getModules().size());
}
@Test
public void testIPVersion() {
- Module tested = TestUtils.findModule(testedModules, "ietf-inet-types");
+ Module tested = TestUtils.findModule(context, "ietf-inet-types").get();
Set<TypeDefinition<?>> typedefs = tested.getTypeDefinitions();
assertEquals(14, typedefs.size());
@Test
public void testEnumeration() {
- Module tested = TestUtils.findModule(testedModules, "custom-types-test");
+ Module tested = TestUtils.findModule(context, "custom-types-test").get();
Set<TypeDefinition<?>> typedefs = tested.getTypeDefinitions();
TypeDefinition<?> type = TestUtils.findTypedef(typedefs, "ip-version");
@Test
public void testIpAddress() {
- Module tested = TestUtils.findModule(testedModules, "ietf-inet-types");
+ Module tested = TestUtils.findModule(context, "ietf-inet-types").get();
Set<TypeDefinition<?>> typedefs = tested.getTypeDefinitions();
TypeDefinition<?> type = TestUtils.findTypedef(typedefs, "ip-address");
UnionTypeDefinition baseType = (UnionTypeDefinition) type.getBaseType();
@Test
public void testDomainName() {
- Module tested = TestUtils.findModule(testedModules, "ietf-inet-types");
+ Module tested = TestUtils.findModule(context, "ietf-inet-types").get();
Set<TypeDefinition<?>> typedefs = tested.getTypeDefinitions();
StringTypeDefinition type = (StringTypeDefinition) TestUtils.findTypedef(typedefs, "domain-name");
assertNotNull(type.getBaseType());
+ "([a-zA-Z0-9_]([a-zA-Z0-9\\-_]){0,61})?[a-zA-Z0-9]\\.?)" + "|\\.$";
assertEquals(expectedPattern, patterns.get(0).getRegularExpression());
- List<LengthConstraint> lengths = type.getLengthConstraints();
- assertEquals(1, lengths.size());
- LengthConstraint length = type.getLengthConstraints().get(0);
- assertEquals(Integer.valueOf(1), length.getMin());
- assertEquals(Integer.valueOf(253), length.getMax());
+ LengthConstraint lengths = type.getLengthConstraint().get();
+ assertEquals(1, lengths.getAllowedRanges().asRanges().size());
+ Range<Integer> length = lengths.getAllowedRanges().span();
+ assertEquals(Integer.valueOf(1), length.lowerEndpoint());
+ assertEquals(Integer.valueOf(253), length.upperEndpoint());
}
@Test
public void testInstanceIdentifier1() {
- Module tested = TestUtils.findModule(testedModules, "custom-types-test");
+ Module tested = TestUtils.findModule(context, "custom-types-test").get();
LeafSchemaNode leaf = (LeafSchemaNode) tested.getDataChildByName(
QName.create(tested.getQNameModule(), "inst-id-leaf1"));
InstanceIdentifierTypeDefinition leafType = (InstanceIdentifierTypeDefinition) leaf.getType();
@Test
public void testInstanceIdentifier2() {
- Module tested = TestUtils.findModule(testedModules, "custom-types-test");
+ Module tested = TestUtils.findModule(context, "custom-types-test").get();
LeafSchemaNode leaf = (LeafSchemaNode) tested.getDataChildByName(
QName.create(tested.getQNameModule(), "inst-id-leaf2"));
InstanceIdentifierTypeDefinition leafType = (InstanceIdentifierTypeDefinition) leaf.getType();
@Test
public void testIdentity() {
- Module tested = TestUtils.findModule(testedModules, "custom-types-test");
+ Module tested = TestUtils.findModule(context, "custom-types-test").get();
Set<IdentitySchemaNode> identities = tested.getIdentities();
assertEquals(5, identities.size());
IdentitySchemaNode cryptoAlg = null;
}
}
assertNotNull(cryptoAlg);
- IdentitySchemaNode baseIdentity = cryptoAlg.getBaseIdentity();
+ IdentitySchemaNode baseIdentity = Iterables.getOnlyElement(cryptoAlg.getBaseIdentities());
assertEquals("crypto-base", baseIdentity.getQName().getLocalName());
assertTrue(cryptoAlg.getDerivedIdentities().isEmpty());
- assertNull(baseIdentity.getBaseIdentity());
+ assertTrue(baseIdentity.getBaseIdentities().isEmpty());
assertNotNull(cryptoBase);
- assertNull(cryptoBase.getBaseIdentity());
+ assertTrue(cryptoBase.getBaseIdentities().isEmpty());
assertEquals(3, cryptoBase.getDerivedIdentities().size());
assertNotNull(cryptoId);
@Test
public void testBitsType1() {
- Module tested = TestUtils.findModule(testedModules, "custom-types-test");
+ Module tested = TestUtils.findModule(context, "custom-types-test").get();
LeafSchemaNode leaf = (LeafSchemaNode) tested.getDataChildByName(
QName.create(tested.getQNameModule(), "mybits"));
BitsTypeDefinition leafType = (BitsTypeDefinition) leaf.getType();
@Test
public void testBitsType2() {
- Module tested = TestUtils.findModule(testedModules, "custom-types-test");
+ Module tested = TestUtils.findModule(context, "custom-types-test").get();
Set<TypeDefinition<?>> typedefs = tested.getTypeDefinitions();
TypeDefinition<?> testedType = TestUtils.findTypedef(typedefs, "access-operations-type");
@Test
public void testIanaTimezones() {
- Module tested = TestUtils.findModule(testedModules, "iana-timezones");
+ Module tested = TestUtils.findModule(context, "iana-timezones").get();
Set<TypeDefinition<?>> typedefs = tested.getTypeDefinitions();
TypeDefinition<?> testedType = TestUtils.findTypedef(typedefs, "iana-timezone");
QName testedTypeQName = testedType.getQName();
assertEquals(URI.create("urn:ietf:params:xml:ns:yang:iana-timezones"), testedTypeQName.getNamespace());
- assertEquals(TestUtils.createDate("2012-07-09"), testedTypeQName.getRevision());
+ assertEquals(Optional.of(Revision.valueOf("2012-07-09")), testedTypeQName.getRevision());
assertEquals("iana-timezone", testedTypeQName.getLocalName());
EnumTypeDefinition enumType = (EnumTypeDefinition) testedType.getBaseType();
@Test
public void testObjectId128() {
- Module tested = TestUtils.findModule(testedModules, "ietf-yang-types");
+ Module tested = TestUtils.findModule(context, "ietf-yang-types").get();
Set<TypeDefinition<?>> typedefs = tested.getTypeDefinitions();
StringTypeDefinition testedType = (StringTypeDefinition) TestUtils.findTypedef(typedefs,
"object-identifier-128");
QName testedTypeQName = testedType.getQName();
assertEquals(URI.create("urn:ietf:params:xml:ns:yang:ietf-yang-types"), testedTypeQName.getNamespace());
- assertEquals(TestUtils.createDate("2010-09-24"), testedTypeQName.getRevision());
+ assertEquals(Optional.of(Revision.valueOf("2010-09-24")), testedTypeQName.getRevision());
assertEquals("object-identifier-128", testedTypeQName.getLocalName());
StringTypeDefinition testedTypeBase = testedType.getBaseType();
QName testedTypeBaseQName = testedTypeBase.getQName();
assertEquals(URI.create("urn:ietf:params:xml:ns:yang:ietf-yang-types"), testedTypeBaseQName.getNamespace());
- assertEquals(TestUtils.createDate("2010-09-24"), testedTypeBaseQName.getRevision());
+ assertEquals(Optional.of(Revision.valueOf("2010-09-24")), testedTypeBaseQName.getRevision());
assertEquals("object-identifier", testedTypeBaseQName.getLocalName());
}
@Test
public void testIdentityref() {
- Module tested = TestUtils.findModule(testedModules, "custom-types-test");
+ Module tested = TestUtils.findModule(context, "custom-types-test").get();
Set<TypeDefinition<?>> typedefs = tested.getTypeDefinitions();
TypeDefinition<?> testedType = TestUtils.findTypedef(typedefs, "service-type-ref");
IdentityrefTypeDefinition baseType = (IdentityrefTypeDefinition) testedType.getBaseType();
QName identity = baseType.getIdentity().getQName();
assertEquals(URI.create("urn:custom.types.demo"), identity.getNamespace());
- assertEquals(TestUtils.createDate("2012-04-16"), identity.getRevision());
+ assertEquals(Optional.of(Revision.valueOf("2012-04-16")), identity.getRevision());
assertEquals("service-type", identity.getLocalName());
LeafSchemaNode type = (LeafSchemaNode) tested.getDataChildByName(QName.create(tested.getQNameModule(), "type"));
@Test
public void testUnionWithExt() throws ReactorException {
- final YangStatementSourceImpl yangFile1 = new YangStatementSourceImpl("/types/union-with-ext/extdef.yang",
- false);
- final YangStatementSourceImpl yangFile2 = new YangStatementSourceImpl("/types/union-with-ext/unionbug.yang",
- false);
- final YangStatementSourceImpl yangFile3 = new YangStatementSourceImpl("/ietf/ietf-inet-types@2010-09-24.yang",
- false);
+ final StatementStreamSource yangFile1 = sourceForResource("/types/union-with-ext/extdef.yang");
+ final StatementStreamSource yangFile2 = sourceForResource("/types/union-with-ext/unionbug.yang");
+ final StatementStreamSource yangFile3 = sourceForResource("/ietf/ietf-inet-types@2010-09-24.yang");
CrossSourceStatementReactor.BuildAction reactor = YangInferencePipeline.RFC6020_REACTOR.newBuild();
- addSources(reactor, yangFile1, yangFile2, yangFile3);
+ reactor.addSources(yangFile1, yangFile2, yangFile3);
- final EffectiveSchemaContext result = reactor.buildEffective();
+ final SchemaContext result = reactor.buildEffective();
assertNotNull(result);
}
@Test
public void testUnionWithBits() throws ReactorException {
- final YangStatementSourceImpl yangFile = new YangStatementSourceImpl(
- "/types/union-with-bits/union-bits-model.yang", false);
+ final StatementStreamSource yangFile = sourceForResource("/types/union-with-bits/union-bits-model.yang");
CrossSourceStatementReactor.BuildAction reactor = YangInferencePipeline.RFC6020_REACTOR.newBuild();
- addSources(reactor, yangFile);
+ reactor.addSources(yangFile);
- final EffectiveSchemaContext result = reactor.buildEffective();
+ final SchemaContext result = reactor.buildEffective();
assertNotNull(result);
}
@Test
public void testUnionInList() {
- final YangStatementSourceImpl yangFile = new YangStatementSourceImpl(
- "/types/union-in-list/unioninlisttest.yang", false);
+ final StatementStreamSource yangFile = sourceForResource("/types/union-in-list/unioninlisttest.yang");
CrossSourceStatementReactor.BuildAction reactor = YangInferencePipeline.RFC6020_REACTOR.newBuild();
- addSources(reactor, yangFile);
+ reactor.addSources(yangFile);
try {
- final EffectiveSchemaContext result = reactor.buildEffective();
+ final SchemaContext result = reactor.buildEffective();
fail("effective build should fail due to union in list; this is not allowed");
- } catch (Exception e) {
+ } catch (ReactorException e) {
assertEquals(SomeModifiersUnresolvedException.class, e.getClass());
assertTrue(e.getCause() instanceof SourceException);
assertTrue(e.getCause().getMessage().startsWith("union is not a YANG statement or use of extension"));
}
}
-
- private static void addSources(final CrossSourceStatementReactor.BuildAction reactor, final YangStatementSourceImpl... sources) {
- for (YangStatementSourceImpl source : sources) {
- reactor.addSource(source);
- }
- }
}