2 * Copyright (c) 2016 Cisco Systems, Inc. and others. All rights reserved.
4 * This program and the accompanying materials are made available under the
5 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6 * and is available at http://www.eclipse.org/legal/epl-v10.html
8 package org.opendaylight.yangtools.yang.parser.stmt.rfc7950;
10 import static org.junit.Assert.assertEquals;
11 import static org.junit.Assert.assertNotNull;
12 import static org.junit.Assert.assertTrue;
13 import static org.junit.Assert.fail;
15 import java.util.HashSet;
17 import org.junit.Test;
18 import org.opendaylight.yangtools.yang.common.QName;
19 import org.opendaylight.yangtools.yang.model.api.AugmentationSchema;
20 import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
21 import org.opendaylight.yangtools.yang.model.api.GroupingDefinition;
22 import org.opendaylight.yangtools.yang.model.api.Module;
23 import org.opendaylight.yangtools.yang.model.api.NotificationDefinition;
24 import org.opendaylight.yangtools.yang.model.api.NotificationNodeContainer;
25 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
26 import org.opendaylight.yangtools.yang.parser.spi.meta.SomeModifiersUnresolvedException;
27 import org.opendaylight.yangtools.yang.stmt.StmtTestUtils;
29 public class Bug6897Test {
30 private static final String FOO_NS = "foo";
33 public void notificationsInDataContainersTest() throws Exception {
34 final SchemaContext schemaContext = StmtTestUtils
35 .parseYangSource("/rfc7950/notifications-in-data-nodes/foo.yang");
36 assertNotNull(schemaContext);
38 assertContainsNotifications(schemaContext, "root", "grp-notification", "aug-notification");
39 assertContainsNotifications(schemaContext, "top-list", "top-list-notification");
40 assertContainsNotifications(schemaContext, "top", "top-notification");
42 final Set<GroupingDefinition> groupings = schemaContext.getGroupings();
43 assertEquals(1, groupings.size());
44 assertContainsNotifications(groupings.iterator().next(), "grp-notification");
46 final Set<Module> modules = schemaContext.getModules();
47 assertEquals(1, modules.size());
48 final Module foo = modules.iterator().next();
49 final Set<AugmentationSchema> augmentations = foo.getAugmentations();
50 assertEquals(1, augmentations.size());
51 assertContainsNotifications(augmentations.iterator().next(), "aug-notification", "grp-notification");
54 private static void assertContainsNotifications(final SchemaContext schemaContext, final String dataContainerName,
55 final String... notificationNames) {
56 final DataSchemaNode dataChildByName = schemaContext.getDataChildByName(
57 QName.create(FOO_NS, dataContainerName));
58 assertTrue(dataChildByName instanceof NotificationNodeContainer);
59 assertContainsNotifications((NotificationNodeContainer) dataChildByName, notificationNames);
62 private static void assertContainsNotifications(final NotificationNodeContainer notificationContainer,
63 final String... notificationNames) {
64 final Set<NotificationDefinition> notifications = notificationContainer.getNotifications();
65 assertEquals(notificationNames.length, notifications.size());
67 final Set<QName> notificationQNames = new HashSet<>();
68 notifications.forEach(n -> notificationQNames.add(n.getQName()));
70 for (final String notificationName : notificationNames) {
71 assertTrue(notificationQNames.contains(QName.create(FOO_NS, notificationName)));
76 public void invalid10Test() throws Exception {
78 StmtTestUtils.parseYangSource("/rfc7950/notifications-in-data-nodes/foo10.yang");
79 fail("Test should fail due to invalid Yang 1.0");
80 } catch (final SomeModifiersUnresolvedException e) {
81 assertTrue(e.getCause().getMessage().startsWith("NOTIFICATION is not valid for"));
86 public void invalid11Test() throws Exception {
88 StmtTestUtils.parseYangSource("/rfc7950/notifications-in-data-nodes/foo-invalid.yang");
89 fail("Test should fail due to invalid Yang 1.1");
90 } catch (final SomeModifiersUnresolvedException e) {
91 assertTrue(e.getCause().getMessage().startsWith(
92 "Notification (foo)grp-notification is defined within an rpc, action, or another notification"));
97 public void testNotificationWithinListWithoutKey() throws Exception {
99 StmtTestUtils.parseYangSource("/rfc7950/notifications-in-data-nodes/bar-invalid.yang");
100 fail("Test should fail due to invalid Yang 1.1");
101 } catch (final SomeModifiersUnresolvedException e) {
102 assertTrue(e.getCause().getMessage().startsWith(
103 "Notification (bar-namespace?revision=2016-12-08)my-notification is defined within a list "
104 + "that has no key statement"));
109 public void testNotificationInUsedGroupingWithinCase() throws Exception {
111 StmtTestUtils.parseYangSource("/rfc7950/notifications-in-data-nodes/baz-invalid.yang");
112 fail("Test should fail due to invalid Yang 1.1");
113 } catch (final SomeModifiersUnresolvedException e) {
114 assertTrue(e.getCause().getMessage().startsWith(
115 "Notification (baz-namespace?revision=2016-12-08)notification-in-grouping is defined within a case "