CiscoDevNet / ydk-gen

Generate model-driven APIs from YANG models
http://ciscodevnet.github.io/ydk-gen/
Apache License 2.0
135 stars 74 forks source link

XmlSubtreeCodec and JsonSubtreeCodec fail decode empty type of data #1046

Open ygorelik opened 3 years ago

ygorelik commented 3 years ago

Current Behavior

XmlSubtreeCodec and JsonSubtreeCodec fail decode empty type of data. They create empty leaf with value of empty string (expected: object Empty()).

Similar issue appears in JsonSubtreeCodec; see attached files for details.

json_codec_emty.cpp.txt json_ut.log

How to reproduce

Add and run unit test:

TEST_CASE("xml_codec_empty")
{
    auto repo = path::Repository{TEST_HOME};
    std::vector<path::Capability> empty_caps;
    auto root = repo.create_root_schema(empty_caps);
    XmlSubtreeCodec xml_codec{};

    // Encode
    auto runner = ydktest_sanity::Runner();
    runner.ytypes->built_in_t->emptee = Empty();
    auto xml = xml_codec.encode(runner, *root);
    string payload = R"(<runner xmlns="http://cisco.com/ns/yang/ydktest-sanity">
  <ytypes>
    <built-in-t>
      <emptee/>
    </built-in-t>
  </ytypes>
</runner>)";
    CHECK(payload == xml);

    // Decode
    auto top_entity = make_shared<ydktest_sanity::Runner>();
    auto entity = xml_codec.decode(payload, top_entity);
    auto runner_d = dynamic_cast<ydktest_sanity::Runner*>(entity.get());
    CHECK(*runner_d == runner);
}

Observe failure to compare entity Runner before and after encoding + decoding:

-------------------------------------------------------------------------------
xml_codec_empty
-------------------------------------------------------------------------------
/Users/ygorelik/github/ydk-gen/sdk/cpp/tests/test_xml_subtree.cpp:447
...............................................................................

/Users/ygorelik/github/ydk-gen/sdk/cpp/tests/test_xml_subtree.cpp:471: FAILED:
  CHECK( *runner_d == runner )
with expansion:
  {?} == {?}

<runner xmlns="http://cisco.com/ns/yang/ydktest-sanity">
  <ytypes>
    <built-in-t>
      <emptee/>
    </built-in-t>
  </ytypes>
</runner>
===============================================================================
test cases: 1 | 1 failed
assertions: 2 | 1 passed | 1 failed

Logs

When debug logging is enabled:

ygorelik$ ./ydk_bundle_test xml_codec_empty
[2021-04-26 13:01:21.654] [ydk] [debug] Creating libyang context in path: /Users/ygorelik/github/ydk-gen/sdk/cpp/tests/../core/tests/models
[2021-04-26 13:01:21.655] [ydk] [debug] [libyang] Extension plugin "/usr/local/lib/libyang/libyang_ext_test.dylib" successfully loaded.
[2021-04-26 13:01:21.656] [ydk] [debug] [libyang] Extension plugin "/usr/local/lib/libyang/metadata.dylib" successfully loaded.
[2021-04-26 13:01:21.657] [ydk] [debug] [libyang] Extension plugin "/usr/local/lib/libyang/nacm.dylib" successfully loaded.
[2021-04-26 13:01:21.657] [ydk] [debug] [libyang] Reading module "ietf-yang-metadata".
[2021-04-26 13:01:21.657] [ydk] [debug] [libyang] Module "ietf-yang-metadata@2016-08-05" successfully parsed as implemented.
[2021-04-26 13:01:21.657] [ydk] [debug] [libyang] Reading module "yang".
[2021-04-26 13:01:21.657] [ydk] [debug] [libyang] Resolving "yang" unresolved schema nodes and their constraints...
[2021-04-26 13:01:21.658] [ydk] [debug] [libyang] All "yang" schema nodes and constraints resolved.
[2021-04-26 13:01:21.658] [ydk] [debug] [libyang] Module "yang@2017-02-20" successfully parsed as implemented.
[2021-04-26 13:01:21.658] [ydk] [debug] [libyang] Reading module "ietf-inet-types".
[2021-04-26 13:01:21.659] [ydk] [debug] [libyang] Resolving derived type "union" failed, it will be attempted later.
[2021-04-26 13:01:21.659] [ydk] [debug] [libyang] Resolving derived type "union" failed, it will be attempted later.
[2021-04-26 13:01:21.659] [ydk] [debug] [libyang] Resolving derived type "union" failed, it will be attempted later.
[2021-04-26 13:01:21.659] [ydk] [debug] [libyang] Resolving derived type "union" failed, it will be attempted later.
[2021-04-26 13:01:21.659] [ydk] [debug] [libyang] Resolving "ietf-inet-types" unresolved schema nodes and their constraints...
[2021-04-26 13:01:21.659] [ydk] [debug] [libyang] All "ietf-inet-types" schema nodes and constraints resolved.
[2021-04-26 13:01:21.659] [ydk] [debug] [libyang] Module "ietf-inet-types@2013-07-15" successfully parsed as implemented.
[2021-04-26 13:01:21.660] [ydk] [debug] [libyang] Reading module "ietf-yang-types".
[2021-04-26 13:01:21.660] [ydk] [debug] [libyang] Module "ietf-yang-types@2013-07-15" successfully parsed as implemented.
[2021-04-26 13:01:21.660] [ydk] [debug] [libyang] Reading module "ietf-datastores".
[2021-04-26 13:01:21.661] [ydk] [debug] [libyang] Module "ietf-datastores@2017-08-17" successfully parsed as implemented.
[2021-04-26 13:01:21.661] [ydk] [debug] [libyang] Reading module "ietf-yang-library".
[2021-04-26 13:01:21.662] [ydk] [debug] [libyang] Module "ietf-yang-library@2017-08-17" successfully parsed as implemented.
[2021-04-26 13:01:21.662] [ydk] [debug] Populating new module schema 'ietf-yang-metadata'
[2021-04-26 13:01:21.662] [ydk] [debug] Populating new module schema 'yang'
[2021-04-26 13:01:21.662] [ydk] [debug] Populating new module schema 'ietf-inet-types'
[2021-04-26 13:01:21.662] [ydk] [debug] Populating new module schema 'ietf-yang-types'
[2021-04-26 13:01:21.662] [ydk] [debug] Populating new module schema 'ietf-datastores'
[2021-04-26 13:01:21.662] [ydk] [debug] Populating new module schema 'ietf-yang-library'
[2021-04-26 13:01:21.663] [ydk] [debug] Getting new modules for path 'ydktest-sanity:runner'
[2021-04-26 13:01:21.663] [ydk] [debug] Loading module 'ydktest-sanity', revision ''
[2021-04-26 13:01:21.663] [ydk] [debug] [libyang] Searching for "ydktest-sanity" in /Users/ygorelik/github/ydk-gen/sdk/cpp/core/tests/models.
[2021-04-26 13:01:21.663] [ydk] [debug] [libyang] Searching for "ydktest-sanity" in /Users/ygorelik/github/ydk-gen/sdk/cpp/tests/build.
[2021-04-26 13:01:21.663] [ydk] [debug] [libyang] Loading schema from "/Users/ygorelik/github/ydk-gen/sdk/cpp/core/tests/models/ydktest-sanity@2015-11-17.yang" file.
[2021-04-26 13:01:21.664] [ydk] [debug] [libyang] Searching for "ydktest-types" in /Users/ygorelik/github/ydk-gen/sdk/cpp/core/tests/models.
[2021-04-26 13:01:21.664] [ydk] [debug] [libyang] Searching for "ydktest-types" in /Users/ygorelik/github/ydk-gen/sdk/cpp/tests/build.
[2021-04-26 13:01:21.664] [ydk] [debug] [libyang] Loading schema from "/Users/ygorelik/github/ydk-gen/sdk/cpp/core/tests/models/ydktest-types@2016-05-23.yang" file.
[2021-04-26 13:01:21.665] [ydk] [debug] [libyang] Module "ydktest-types@2016-05-23" successfully parsed as implemented.
[2021-04-26 13:01:21.665] [ydk] [debug] [libyang] Searching for "ydktest-sanity-submodule" in /Users/ygorelik/github/ydk-gen/sdk/cpp/core/tests/models.
[2021-04-26 13:01:21.665] [ydk] [debug] [libyang] Loading schema from "/Users/ygorelik/github/ydk-gen/sdk/cpp/core/tests/models/ydktest-sanity-submodule@2016-04-25.yang" file.
[2021-04-26 13:01:21.666] [ydk] [debug] [libyang] Submodule "ydktest-sanity-submodule" successfully parsed.
[2021-04-26 13:01:21.667] [ydk] [debug] [libyang] Resolving "ydktest-sanity" unresolved schema nodes and their constraints...
[2021-04-26 13:01:21.668] [ydk] [debug] [libyang] All "ydktest-sanity" schema nodes and constraints resolved.
[2021-04-26 13:01:21.668] [ydk] [debug] [libyang] Module "ydktest-sanity@2015-11-17" successfully parsed as implemented.
[2021-04-26 13:01:21.668] [ydk] [debug] Added new libyang module 'ydktest-sanity'
[2021-04-26 13:01:21.668] [ydk] [debug] Populating new module schema 'ydktest-sanity'
[2021-04-26 13:01:21.668] [ydk] [debug] Looking to populate schemas for 'ydktest-sanity:runner'
[2021-04-26 13:01:21.668] [ydk] [debug] Getting new modules for path 'ydktest-sanity:runner'
[2021-04-26 13:01:21.668] [ydk] [debug] Loading module 'ydktest-sanity', revision ''
[2021-04-26 13:01:21.668] [ydk] [debug] The module 'ydktest-sanity' schema has already been populated in YDK repository
[2021-04-26 13:01:21.668] [ydk] [debug] Creating root data node with path '/ydktest-sanity:runner'
[2021-04-26 13:01:21.669] [ydk] [debug] XMLCodec: Leaf count: 0
[2021-04-26 13:01:21.669] [ydk] [debug] XMLCodec: Children count for: ydktest-sanity:runner : 14
[2021-04-26 13:01:21.669] [ydk] [debug] ==================
[2021-04-26 13:01:21.669] [ydk] [debug] XMLCodec: Looking at child 'inbtw-list'
[2021-04-26 13:01:21.669] [ydk] [debug] XMLCodec: Child has no data and no operations
[2021-04-26 13:01:21.669] [ydk] [debug] ==================
[2021-04-26 13:01:21.669] [ydk] [debug] XMLCodec: Looking at child 'leaf-ref'
[2021-04-26 13:01:21.669] [ydk] [debug] XMLCodec: Child has no data and no operations
[2021-04-26 13:01:21.669] [ydk] [debug] ==================
[2021-04-26 13:01:21.669] [ydk] [debug] XMLCodec: Looking at child 'mtus'
[2021-04-26 13:01:21.669] [ydk] [debug] XMLCodec: Child has no data and no operations
[2021-04-26 13:01:21.669] [ydk] [debug] ==================
[2021-04-26 13:01:21.669] [ydk] [debug] XMLCodec: Looking at child 'not-supported-1'
[2021-04-26 13:01:21.669] [ydk] [debug] XMLCodec: Child has no data and no operations
[2021-04-26 13:01:21.669] [ydk] [debug] ==================
[2021-04-26 13:01:21.669] [ydk] [debug] XMLCodec: Looking at child 'one'
[2021-04-26 13:01:21.669] [ydk] [debug] XMLCodec: Child has no data and no operations
[2021-04-26 13:01:21.669] [ydk] [debug] ==================
[2021-04-26 13:01:21.669] [ydk] [debug] XMLCodec: Looking at child 'one-list'
[2021-04-26 13:01:21.669] [ydk] [debug] XMLCodec: Child has no data and no operations
[2021-04-26 13:01:21.669] [ydk] [debug] ==================
[2021-04-26 13:01:21.669] [ydk] [debug] XMLCodec: Looking at child 'one-read-only'
[2021-04-26 13:01:21.669] [ydk] [debug] XMLCodec: Child has no data and no operations
[2021-04-26 13:01:21.669] [ydk] [debug] ==================
[2021-04-26 13:01:21.669] [ydk] [debug] XMLCodec: Looking at child 'outer'
[2021-04-26 13:01:21.669] [ydk] [debug] XMLCodec: Child has no data and no operations
[2021-04-26 13:01:21.669] [ydk] [debug] ==================
[2021-04-26 13:01:21.669] [ydk] [debug] XMLCodec: Looking at child 'three'
[2021-04-26 13:01:21.669] [ydk] [debug] XMLCodec: Child has no data and no operations
[2021-04-26 13:01:21.669] [ydk] [debug] ==================
[2021-04-26 13:01:21.669] [ydk] [debug] XMLCodec: Looking at child 'three-list'
[2021-04-26 13:01:21.669] [ydk] [debug] XMLCodec: Child has no data and no operations
[2021-04-26 13:01:21.669] [ydk] [debug] ==================
[2021-04-26 13:01:21.669] [ydk] [debug] XMLCodec: Looking at child 'two'
[2021-04-26 13:01:21.669] [ydk] [debug] XMLCodec: Child has no data and no operations
[2021-04-26 13:01:21.669] [ydk] [debug] ==================
[2021-04-26 13:01:21.669] [ydk] [debug] XMLCodec: Looking at child 'two-list'
[2021-04-26 13:01:21.669] [ydk] [debug] XMLCodec: Child has no data and no operations
[2021-04-26 13:01:21.669] [ydk] [debug] ==================
[2021-04-26 13:01:21.669] [ydk] [debug] XMLCodec: Looking at child 'one'
[2021-04-26 13:01:21.669] [ydk] [debug] XMLCodec: Child has no data and no operations
[2021-04-26 13:01:21.669] [ydk] [debug] ==================
[2021-04-26 13:01:21.669] [ydk] [debug] XMLCodec: Looking at child 'ytypes'
[2021-04-26 13:01:21.669] [ydk] [debug] Looking to populate schemas for 'ytypes'
[2021-04-26 13:01:21.669] [ydk] [debug] Getting new modules for path 'ytypes'
[2021-04-26 13:01:21.670] [ydk] [debug] XMLCodec: Leaf count: 0
[2021-04-26 13:01:21.670] [ydk] [debug] XMLCodec: Children count for: ytypes : 3
[2021-04-26 13:01:21.670] [ydk] [debug] ==================
[2021-04-26 13:01:21.670] [ydk] [debug] XMLCodec: Looking at child 'built-in-t'
[2021-04-26 13:01:21.670] [ydk] [debug] Looking to populate schemas for 'built-in-t'
[2021-04-26 13:01:21.670] [ydk] [debug] Getting new modules for path 'built-in-t'
[2021-04-26 13:01:21.670] [ydk] [debug] XMLCodec: Leaf count: 1
[2021-04-26 13:01:21.670] [ydk] [debug] Looking to populate schemas for 'emptee'
[2021-04-26 13:01:21.670] [ydk] [debug] Getting new modules for path 'emptee'
[2021-04-26 13:01:21.670] [ydk] [debug] XMLCodec: Creating child emptee of /ydktest-sanity:runner/all-ytypes-class/ytypes/built-in-t with value: '', is_set: true
[2021-04-26 13:01:21.670] [ydk] [debug] XmlCodec: Creating leaf node 'emptee' with value: ''
[2021-04-26 13:01:21.670] [ydk] [debug] XMLCodec: Children count for: built-in-t : 0
[2021-04-26 13:01:21.670] [ydk] [debug] ==================
[2021-04-26 13:01:21.670] [ydk] [debug] XMLCodec: Looking at child 'derived-t'
[2021-04-26 13:01:21.670] [ydk] [debug] XMLCodec: Child has no data and no operations
[2021-04-26 13:01:21.670] [ydk] [debug] ==================
[2021-04-26 13:01:21.670] [ydk] [debug] XMLCodec: Looking at child 'none'
[2021-04-26 13:01:21.670] [ydk] [debug] XMLCodec: Child has no data and no operations
[2021-04-26 13:01:21.670] [ydk] [debug] XMLCodec: Looking for child 'ytypes' in 'runner'
[2021-04-26 13:01:21.670] [ydk] [debug] XMLCodec: Creating child entity 'ytypes' in 'runner'
[2021-04-26 13:01:21.670] [ydk] [debug] XMLCodec: Looking for child 'built-in-t' in 'ytypes'
[2021-04-26 13:01:21.670] [ydk] [debug] XMLCodec: Creating child entity 'built-in-t' in 'ytypes'
[2021-04-26 13:01:21.670] [ydk] [debug] XMLCodec: Looking for child 'emptee' in 'built-in-t'
[2021-04-26 13:01:21.670] [ydk] [debug] XMLCodec: Creating leaf 'emptee' with no value

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
ydk_bundle_test is a Catch v1.7.1 host application.
Run with -? for options

-------------------------------------------------------------------------------
xml_codec_empty
-------------------------------------------------------------------------------
/Users/ygorelik/github/ydk-gen/sdk/cpp/tests/test_xml_subtree.cpp:447
...............................................................................

/Users/ygorelik/github/ydk-gen/sdk/cpp/tests/test_xml_subtree.cpp:471: FAILED:
  CHECK( *runner_d == runner )
with expansion:
  {?} == {?}

[2021-04-26 13:01:21.670] [ydk] [debug] Getting new modules for path 'ydktest-sanity:runner'
[2021-04-26 13:01:21.670] [ydk] [debug] Loading module 'ydktest-sanity', revision ''
[2021-04-26 13:01:21.670] [ydk] [debug] The module 'ydktest-sanity' schema has already been populated in YDK repository
[2021-04-26 13:01:21.670] [ydk] [debug] Looking to populate schemas for 'ydktest-sanity:runner'
[2021-04-26 13:01:21.670] [ydk] [debug] Getting new modules for path 'ydktest-sanity:runner'
[2021-04-26 13:01:21.671] [ydk] [debug] Loading module 'ydktest-sanity', revision ''
[2021-04-26 13:01:21.671] [ydk] [debug] The module 'ydktest-sanity' schema has already been populated in YDK repository
[2021-04-26 13:01:21.671] [ydk] [debug] Creating root data node with path '/ydktest-sanity:runner'
[2021-04-26 13:01:21.671] [ydk] [debug] XMLCodec: Leaf count: 0
[2021-04-26 13:01:21.671] [ydk] [debug] XMLCodec: Children count for: ydktest-sanity:runner : 14
[2021-04-26 13:01:21.671] [ydk] [debug] ==================
[2021-04-26 13:01:21.671] [ydk] [debug] XMLCodec: Looking at child 'inbtw-list'
[2021-04-26 13:01:21.671] [ydk] [debug] XMLCodec: Child has no data and no operations
[2021-04-26 13:01:21.671] [ydk] [debug] ==================
[2021-04-26 13:01:21.671] [ydk] [debug] XMLCodec: Looking at child 'leaf-ref'
[2021-04-26 13:01:21.671] [ydk] [debug] XMLCodec: Child has no data and no operations
[2021-04-26 13:01:21.671] [ydk] [debug] ==================
[2021-04-26 13:01:21.671] [ydk] [debug] XMLCodec: Looking at child 'mtus'
[2021-04-26 13:01:21.671] [ydk] [debug] XMLCodec: Child has no data and no operations
[2021-04-26 13:01:21.671] [ydk] [debug] ==================
[2021-04-26 13:01:21.671] [ydk] [debug] XMLCodec: Looking at child 'not-supported-1'
[2021-04-26 13:01:21.671] [ydk] [debug] XMLCodec: Child has no data and no operations
[2021-04-26 13:01:21.671] [ydk] [debug] ==================
[2021-04-26 13:01:21.671] [ydk] [debug] XMLCodec: Looking at child 'one'
[2021-04-26 13:01:21.671] [ydk] [debug] XMLCodec: Child has no data and no operations
[2021-04-26 13:01:21.671] [ydk] [debug] ==================
[2021-04-26 13:01:21.671] [ydk] [debug] XMLCodec: Looking at child 'one-list'
[2021-04-26 13:01:21.671] [ydk] [debug] XMLCodec: Child has no data and no operations
[2021-04-26 13:01:21.671] [ydk] [debug] ==================
[2021-04-26 13:01:21.671] [ydk] [debug] XMLCodec: Looking at child 'one-read-only'
[2021-04-26 13:01:21.671] [ydk] [debug] XMLCodec: Child has no data and no operations
[2021-04-26 13:01:21.671] [ydk] [debug] ==================
[2021-04-26 13:01:21.671] [ydk] [debug] XMLCodec: Looking at child 'outer'
[2021-04-26 13:01:21.671] [ydk] [debug] XMLCodec: Child has no data and no operations
[2021-04-26 13:01:21.671] [ydk] [debug] ==================
[2021-04-26 13:01:21.671] [ydk] [debug] XMLCodec: Looking at child 'three'
[2021-04-26 13:01:21.671] [ydk] [debug] XMLCodec: Child has no data and no operations
[2021-04-26 13:01:21.671] [ydk] [debug] ==================
[2021-04-26 13:01:21.671] [ydk] [debug] XMLCodec: Looking at child 'three-list'
[2021-04-26 13:01:21.671] [ydk] [debug] XMLCodec: Child has no data and no operations
[2021-04-26 13:01:21.671] [ydk] [debug] ==================
[2021-04-26 13:01:21.671] [ydk] [debug] XMLCodec: Looking at child 'two'
[2021-04-26 13:01:21.671] [ydk] [debug] XMLCodec: Child has no data and no operations
[2021-04-26 13:01:21.671] [ydk] [debug] ==================
[2021-04-26 13:01:21.671] [ydk] [debug] XMLCodec: Looking at child 'two-list'
[2021-04-26 13:01:21.671] [ydk] [debug] XMLCodec: Child has no data and no operations
[2021-04-26 13:01:21.671] [ydk] [debug] ==================
[2021-04-26 13:01:21.671] [ydk] [debug] XMLCodec: Looking at child 'one'
[2021-04-26 13:01:21.671] [ydk] [debug] XMLCodec: Child has no data and no operations
[2021-04-26 13:01:21.671] [ydk] [debug] ==================
[2021-04-26 13:01:21.671] [ydk] [debug] XMLCodec: Looking at child 'ytypes'
[2021-04-26 13:01:21.671] [ydk] [debug] Looking to populate schemas for 'ytypes'
[2021-04-26 13:01:21.671] [ydk] [debug] Getting new modules for path 'ytypes'
[2021-04-26 13:01:21.671] [ydk] [debug] XMLCodec: Leaf count: 0
[2021-04-26 13:01:21.671] [ydk] [debug] XMLCodec: Children count for: ytypes : 3
[2021-04-26 13:01:21.671] [ydk] [debug] ==================
[2021-04-26 13:01:21.671] [ydk] [debug] XMLCodec: Looking at child 'built-in-t'
[2021-04-26 13:01:21.671] [ydk] [debug] Looking to populate schemas for 'built-in-t'
[2021-04-26 13:01:21.671] [ydk] [debug] Getting new modules for path 'built-in-t'
[2021-04-26 13:01:21.671] [ydk] [debug] XMLCodec: Leaf count: 1
[2021-04-26 13:01:21.671] [ydk] [debug] Looking to populate schemas for 'emptee'
[2021-04-26 13:01:21.671] [ydk] [debug] Getting new modules for path 'emptee'
[2021-04-26 13:01:21.671] [ydk] [debug] XMLCodec: Creating child emptee of /ydktest-sanity:runner/all-ytypes-class/ytypes/built-in-t with value: '', is_set: false
[2021-04-26 13:01:21.671] [ydk] [debug] XMLCodec: Storing operation 'read' for leaf emptee
[2021-04-26 13:01:21.671] [ydk] [debug] XMLCodec: Children count for: built-in-t : 0
[2021-04-26 13:01:21.671] [ydk] [debug] ==================
[2021-04-26 13:01:21.671] [ydk] [debug] XMLCodec: Looking at child 'derived-t'
[2021-04-26 13:01:21.671] [ydk] [debug] XMLCodec: Child has no data and no operations
[2021-04-26 13:01:21.671] [ydk] [debug] ==================
[2021-04-26 13:01:21.671] [ydk] [debug] XMLCodec: Looking at child 'none'
[2021-04-26 13:01:21.671] [ydk] [debug] XMLCodec: Child has no data and no operations

===============================================================================
test cases: 1 | 1 failed
assertions: 2 | 1 passed | 1 failed

Important debug message shows that the leaf emptee was assigned empty string:

[2021-04-26 13:01:21.670] [ydk] [debug] XMLCodec: Creating child emptee of /ydktest-sanity:runner/all-ytypes-class/ytypes/built-in-t with value: '', is_set: true

System Information

YDK-0.8.5