[ONOS-7304] YANG Runtime: YANG Push test for anydata

Change-Id: Ie2757343ef2598629c1e81b2f9ec5a265851e778
diff --git a/runtime/src/test/resources/schemaProviderTestYangFiles/yrt-ietf-yang-push.yang b/runtime/src/test/resources/schemaProviderTestYangFiles/yrt-ietf-yang-push.yang
new file mode 100644
index 0000000..9df4bde
--- /dev/null
+++ b/runtime/src/test/resources/schemaProviderTestYangFiles/yrt-ietf-yang-push.yang
@@ -0,0 +1,565 @@
+ module yrt-ietf-yang-push {
+    /*
+     * ---------------------------------------------------
+     * Not Supported
+    yang-version 1.1;
+     * ---------------------------------------------------
+     */
+    namespace "urn:ietf:params:xml:ns:yang:yrt-ietf-yang-push";
+    prefix yp;
+
+    import yrt-ietf-inet-types {
+      prefix inet;
+    }
+    import yrt-ietf-yang-types {
+      prefix yang;
+    }
+    import yrt-ietf-event-notifications {
+      prefix notif-bis;
+    }
+
+    organization "IETF";
+    contact
+      "WG Web:   <http://tools.ietf.org/wg/netconf/>
+       WG List:  <mailto:netconf@ietf.org>
+       WG Chair: Mahesh Jethanandani
+                 <mailto:mjethanandani@gmail.com>
+       WG Chair: Mehmet Ersue
+                 <mailto:mehmet.ersue@nokia.com>
+       Editor:   Alexander Clemm
+                 <mailto:alex@sympotech.com>
+       Editor:   Eric Voit
+                 <mailto:evoit@cisco.com>
+       Editor:   Alberto Gonzalez Prieto
+                 <mailto:albertgo@cisco.com>
+       Editor:   Ambika Prasad Tripathy
+                 <mailto:ambtripa@cisco.com>
+       Editor:   Einar Nilsen-Nygaard
+                 <mailto:einarnn@cisco.com>
+       Editor:   Andy Bierman
+                 <mailto:andy@yumaworks.com>
+       Editor:   Balazs Lengyel
+                 <mailto:balazs.lengyel@ericsson.com>";
+
+    description
+      "This module contains conceptual YANG specifications
+       for YANG push.";
+
+    revision 2016-10-28 {
+      description
+        "Updates to simplify modify-subscription, add anchor-time";
+      reference "YANG Datastore Push, draft-ietf-netconf-yang-push-04";
+    }
+
+    feature on-change {
+      description
+        "This feature indicates that on-change updates are
+         supported.";
+    }
+
+   /*
+    * IDENTITIES
+    */
+
+    /* Additional errors for subscription operations */
+    identity error-data-not-authorized {
+      base notif-bis:error;
+      description
+        "No read authorization for a requested data node.";
+    }
+
+    /* Additional types of streams */
+
+    identity yang-push {
+      base notif-bis:stream;
+      description
+        "A conceptual datastream consisting of all datastore
+         updates, including operational and configuration data.";
+    }
+
+    identity custom-stream {
+      base notif-bis:stream;
+      description
+        "A conceptual datastream for datastore
+         updates with custom updates as defined by a user.";
+    }
+
+    /* Additional transport option */
+    identity http2 {
+      base notif-bis:transport;
+      description
+        "HTTP2 notifications as a transport";
+    }
+
+    /*
+     * TYPE DEFINITIONS
+     */
+
+    typedef filter-id {
+      type uint32;
+      description
+        "A type to identify filters which can be associated with a
+         subscription.";
+    }
+
+    typedef change-type {
+      type enumeration {
+        enum "create" {
+          description
+            "A new data node was created";
+        }
+        enum "delete" {
+          description
+            "A data node was deleted";
+        }
+        enum "modify" {
+          description
+            "The value of a data node has changed";
+        }
+      }
+      description
+        "Specifies different types of changes that may occur
+         to a datastore.";
+    }
+
+
+    grouping update-filter {
+      description
+        "This groupings defines filters for push updates for a
+        datastore tree.  The filters define which updates are of
+        interest in a push update subscription.  Mixing and matching
+        of multiple filters does not occur at the level of this
+        grouping. When a push-update subscription is created, the
+        filter can be a regular subscription filter, or one of the
+        additional filters that are defined in this grouping.";
+      choice update-filter {
+        description
+          "Define filters regarding which data nodes to include
+           in push updates";
+        case subtree {
+          description
+            "Subtree filter.";
+          anyxml subtree-filter {
+            description
+              "Subtree-filter used to specify the data nodes targeted
+              for subscription within a subtree, or subtrees, of a
+              conceptual YANG datastore.  Objects matching the filter
+              criteria will traverse the filter. The syntax follows
+              the subtree filter syntax specified in RFC 6241,
+              section 6.";
+            reference "RFC 6241 section 6";
+          }
+        }
+        case xpath {
+          description
+            "XPath filter";
+          leaf xpath-filter {
+            type yang:xpath1.0;
+            description
+              "Xpath defining the data items of interest.";
+          }
+        }
+      }
+    }
+
+    grouping update-policy {
+      description
+        "This grouping describes the conditions under which an
+         update will be sent as part of an update stream.";
+      choice update-trigger {
+        description
+          "Defines necessary conditions for sending an event to
+           the subscriber.";
+        case periodic {
+          description
+            "The agent is requested to notify periodically the
+             current values of the datastore or the subset
+             defined by the filter.";
+          leaf period {
+            type yang:timeticks;
+            mandatory true;
+            description
+              "Duration of time which should occur between periodic
+               push updates.  Where the anchor of a start-time is
+               available, the push will include the objects and their
+               values which exist at an exact multiple of timeticks
+               aligning to this start-time anchor.";
+          }
+          leaf anchor-time {
+            type yang:date-and-time;
+            description
+              "Designates a timestamp from which the series of
+              periodic push updates are computed. The next update
+              will take place at the next period interval from the
+              anchor time.  For example, for an anchor time at the
+              top of a minute and a period interval of a minute,
+              the next update will be sent at the top of the next
+              minute.";
+          }
+        }
+        case on-change {
+          if-feature "on-change";
+          description
+            "The agent is requested to notify changes in
+             values in the datastore or a subset of it defined
+             by a filter.";
+          leaf no-synch-on-start {
+            type empty;
+            description
+              "This leaf acts as a flag that determines behavior at the
+               start of the subscription.  When present,
+               synchronization of state at the beginning of the
+               subscription is outside the scope of the subscription.
+               Only updates about changes that are observed from the
+               start time, i.e. only push-change-update notifications
+               are sent.
+               When absent (default behavior), in order to facilitate
+               a receiver's synchronization, a full update is sent
+               when the subscription starts using a push-update
+               notification, just like in the case of a periodic
+               subscription.  After that, push-change-update
+               notifications only are sent unless the Publisher chooses
+               to resynch the subscription again.";
+          }
+          leaf dampening-period {
+            type yang:timeticks;
+            mandatory true;
+            description
+              "Minimum amount of time that needs to have
+               passed since the last time an update was
+               provided.";
+          }
+          leaf-list excluded-change {
+            type change-type;
+            description
+              "Use to restrict which changes trigger an update.
+               For example, if modify is excluded, only creation and
+               deletion of objects is reported.";
+          }
+        }
+      }
+    }
+
+    grouping subscription-qos {
+      description
+        "This grouping describes Quality of Service information
+         concerning a subscription.  This information is passed to lower
+         layers for transport priortization and treatment";
+      leaf dscp {
+        if-feature "notif-bis:configured-subscriptions";
+        type inet:dscp;
+        default "0";
+        description
+          "The push update's IP packet transport priority.
+           This is made visible across network hops to receiver.
+           The transport priority is shared for all receivers of
+           a given subscription.";
+      }
+      leaf subscription-priority {
+        type uint8;
+        description
+          "Relative priority for a subscription.   Allows an
+           underlying transport layer perform informed load
+           balance allocations between various subscriptions";
+      }
+      leaf subscription-dependency {
+        type string;
+        description
+          "Provides the Subscription ID of a parent subscription
+           without which this subscription should not exist. In
+           other words, there is no reason to stream these objects
+           if another subscription is missing.";
+      }
+    }
+
+    augment "/notif-bis:establish-subscription/notif-bis:input" {
+      description
+        "Define additional subscription parameters that apply
+         specifically to push updates";
+      uses update-policy;
+      uses subscription-qos;
+    }
+    augment "/notif-bis:establish-subscription/notif-bis:input/"+
+            "notif-bis:filter-type" {
+      description
+        "Add push filters to selection of filter types.";
+      case update-filter {
+        description
+          "Additional filter options for push subscription.";
+        uses update-filter;
+      }
+    }
+    augment "/notif-bis:establish-subscription/notif-bis:output" {
+      description
+        "Allow to return additional subscription parameters that apply
+         specifically to push updates.";
+      uses update-policy;
+      uses subscription-qos;
+    }
+    augment "/notif-bis:establish-subscription/notif-bis:output/"+
+      "notif-bis:result/notif-bis:no-success/notif-bis:filter-type" {
+      description
+        "Add push filters to selection of filter types.";
+      case update-filter {
+        description
+          "Additional filter options for push subscription.";
+        uses update-filter;
+      }
+    }
+    augment "/notif-bis:modify-subscription/notif-bis:input" {
+      description
+        "Define additional subscription parameters that apply
+         specifically to push updates.";
+      uses update-policy;
+    }
+    augment "/notif-bis:modify-subscription/notif-bis:input/"+
+            "notif-bis:filter-type" {
+      description
+        "Add push filters to selection of filter types.";
+      case update-filter {
+        description
+          "Additional filter options for push subscription.";
+        uses update-filter;
+      }
+    }
+    augment "/notif-bis:modify-subscription/notif-bis:output" {
+      description
+        "Allow to retun additional subscription parameters that apply
+         specifically to push updates.";
+      uses update-policy;
+      uses subscription-qos;
+    }
+    augment "/notif-bis:modify-subscription/notif-bis:output/"+
+        "notif-bis:result/notif-bis:no-success/notif-bis:filter-type" {
+      description
+        "Add push filters to selection of filter types.";
+      case update-filter {
+        description
+          "Additional filter options for push subscription.";
+        uses update-filter;
+      }
+    }
+    notification push-update {
+      description
+        "This notification contains a push update, containing
+         data subscribed to via a subscription.
+         This notification is sent for periodic updates, for a
+         periodic subscription.  It can also be used for
+         synchronization updates of an on-change subscription.
+         This notification shall only be sent to receivers
+         of a subscription; it does not constitute a general-purpose
+         notification.";
+      leaf subscription-id {
+        type notif-bis:subscription-id;
+        mandatory true;
+        description
+          "This references the subscription because of which the
+           notification is sent.";
+      }
+      leaf time-of-update {
+        type yang:date-and-time;
+        description
+          "This leaf contains the time of the update.";
+      }
+      leaf updates-not-sent {
+        type empty;
+        description
+          "This is a flag which indicates that not all data nodes
+           subscribed to are included included with this
+           update.  In other words, the publisher has failed to
+           fulfill its full subscription obligations.
+           This may lead to intermittent loss of synchronization
+           of data at the client.  Synchronization at the client
+           can occur when the next push-update is received.";
+      }
+      /*
+       * --------------------------------------------------------------------
+       * datastore-contents not currently supported.
+       * Will replace datastore-contents-string in a future release.
+      anydata datastore-contents {
+        description
+          "This contains the updated data.  It constitutes a snapshot
+           at the time-of-update of the set of data that has been
+           subscribed to.  The format and syntax of the data
+           corresponds to the format and syntax of data that would be
+           returned in a corresponding get operation with the same
+           filter parameters applied.";
+      }
+       * --------------------------------------------------------------------
+       */
+      leaf datastore-contents-string {
+        type string;
+        description
+          "This contains the updated data.  It constitutes a snapshot
+           at the time-of-update of the set of data that has been
+           subscribed to.  The format and syntax of the data
+           corresponds to the format and syntax of data that would be
+           returned in a corresponding get operation with the same
+           filter parameters applied.";
+      }
+      /*
+       * --------------------------------------------------------------------
+       */
+
+    }
+    notification push-change-update {
+      if-feature "on-change";
+      description
+        "This notification contains an on-change push update.
+         This notification shall only be sent to the receivers
+         of a subscription; it does not constitute a general-purpose
+         notification.";
+      leaf subscription-id {
+        type notif-bis:subscription-id;
+        mandatory true;
+        description
+          "This references the subscription because of which the
+           notification is sent.";
+      }
+      leaf time-of-update {
+        type yang:date-and-time;
+        description
+          "This leaf contains the time of the update, i.e. the
+           time at which the change was observed.";
+      }
+      leaf updates-not-sent {
+        type empty;
+        description
+          "This is a flag which indicates that not all changes which
+           have occured since the last update are included with this
+           update.  In other words, the publisher has failed to
+           fulfill its full subscription obligations, for example in
+           cases where it was not able to keep up with a change burst.
+           To facilitate synchronization, a publisher MAY subsequently
+           send a push-update containing a full snapshot of subscribed
+           data. Such a push-update might also be triggered by a
+           subscriber requesting an on-demand synchronization.";
+      }
+      /*
+       * --------------------------------------------------------------------
+       * datastore-changes not currently supported.
+       * Will replace datastore-change-string in a future release.
+      anydata datastore-changes {
+        description
+          "This contains datastore contents that has changed
+           since the previous update, per the terms of the
+           subscription.  Changes are encoded analogous to
+           the syntax of a corresponding yang-patch operation,
+           i.e. a yang-patch operation applied to the YANG datastore
+           implied by the previous update to result in the current
+           state (and assuming yang-patch could also be applied to
+           operational data).";
+      }
+       *
+       * --------------------------------------------------------------------
+       */
+      leaf datastore-changes-string {
+        type string;
+        description
+          "This contains datastore contents that has changed
+           since the previous update, per the terms of the
+           subscription.  Changes are encoded analogous to
+           the syntax of a corresponding yang-patch operation,
+           i.e. a yang-patch operation applied to the YANG datastore
+           implied by the previous update to result in the current
+           state (and assuming yang-patch could also be applied to
+           operational data).";
+      }
+      /*
+       * --------------------------------------------------------------------
+       */
+
+    }
+    augment "/notif-bis:subscription-started" {
+      description
+        "This augmentation adds push subscription parameters
+         to the notification that a subscription has
+         started and data updates are beginning to be sent.
+         This notification shall only be sent to receivers
+         of a subscription; it does not constitute a general-purpose
+         notification.";
+      uses update-policy;
+      uses subscription-qos;
+    }
+    augment "/notif-bis:subscription-started/notif-bis:filter-type" {
+      description
+        "This augmentation allows to include additional update filters
+         options to be included as part of the notification that a
+         subscription has started.";
+      case update-filter {
+        description
+          "Additional filter options for push subscription.";
+        uses update-filter;
+      }
+    }
+    augment "/notif-bis:subscription-modified" {
+      description
+        "This augmentation adds push subscription parameters
+         to the notification that a subscription has
+         been modified.
+         This notification shall only be sent to receivers
+         of a subscription; it does not constitute a general-purpose
+         notification.";
+      uses update-policy;
+      uses subscription-qos;
+    }
+    augment "/notif-bis:subscription-modified/notif-bis:filter-type" {
+      description
+        "This augmentation allows to include additional update
+         filters options to be included as part of the notification
+         that a subscription has been modified.";
+      case update-filter {
+        description
+          "Additional filter options for push subscription.";
+        uses update-filter;
+      }
+    }
+    augment "/notif-bis:filters/notif-bis:filter/"+
+            "notif-bis:filter-type" {
+      description
+        "This container adds additional update filter options
+         to the list of configurable filters
+         that can be applied to subscriptions.  This facilitates
+         the reuse of complex filters once defined.";
+      case update-filter {
+        uses update-filter;
+      }
+    }
+    augment "/notif-bis:subscription-config/notif-bis:subscription" {
+      description
+        "Contains the list of subscriptions that are configured,
+         as opposed to established via RPC or other means.";
+      uses update-policy;
+      uses subscription-qos;
+    }
+    augment "/notif-bis:subscription-config/notif-bis:subscription/"+
+            "notif-bis:filter-type" {
+      description
+        "Add push filters to selection of filter types.";
+      case update-filter {
+        uses update-filter;
+      }
+    }
+    augment "/notif-bis:subscriptions/notif-bis:subscription" {
+      description
+        "Contains the list of currently active subscriptions,
+         i.e. subscriptions that are currently in effect,
+         used for subscription management and monitoring purposes.
+         This includes subscriptions that have been setup via RPC
+         primitives, e.g. establish-subscription, delete-subscription,
+         and modify-subscription, as well as subscriptions that
+         have been established via configuration.";
+      uses update-policy;
+      uses subscription-qos;
+    }
+    augment "/notif-bis:subscriptions/notif-bis:subscription/"+
+            "notif-bis:filter-type" {
+      description
+        "Add push filters to selection of filter types.";
+      case update-filter {
+        description
+          "Additional filter options for push subscription.";
+        uses update-filter;
+      }
+    }
+  }