Skip to content

Commit c92f06d

Browse files
multiple modules might provide an extension with the same name
...especially in case of augments. In this test case, the other module "adds" an extension instance with the same unqualified name as an existing extension instance. This was inspired by a patch from Bedrich (Ib0dfb68afaf0f74d3defe87b16b7c34457cc4899). I was wondering why that one was adding the .module() method for both Extension and ExtensionInstance; now I know. Co-authored-by: Bedřich Schindler <bedrich.schindler@gmail.com> Change-Id: Ib839695a67b3b102f487b18a835c9c903e0ffdcd
1 parent ca36a0a commit c92f06d

File tree

4 files changed

+45
-0
lines changed

4 files changed

+45
-0
lines changed

include/libyang-cpp/Module.hpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,7 @@ class LIBYANG_CPP_EXPORT Module {
9696
friend Context;
9797
friend DataNode;
9898
friend Extension;
99+
friend ExtensionInstance;
99100
friend Meta;
100101
friend Identity;
101102
friend SchemaNode;
@@ -161,6 +162,7 @@ class LIBYANG_CPP_EXPORT Identity {
161162
*/
162163
class LIBYANG_CPP_EXPORT ExtensionInstance {
163164
public:
165+
Module module() const;
164166
Extension definition() const;
165167
std::optional<std::string> argument() const;
166168

src/Module.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -390,6 +390,16 @@ ExtensionInstance::ExtensionInstance(const lysc_ext_instance* instance, std::sha
390390
{
391391
}
392392

393+
/**
394+
* @brief Returns the module of this extension instance.
395+
*
396+
* Wraps `lysc_ext_instance::module`.
397+
*/
398+
Module ExtensionInstance::module() const
399+
{
400+
return Module{m_instance->module, m_ctx};
401+
}
402+
393403
/**
394404
* @brief Returns the argument name
395405
*

tests/example_schema.hpp

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -754,3 +754,16 @@ module with-extensions {
754754
}
755755
}
756756
)"s;
757+
const auto augmented_extensions_module = R"(
758+
module augmenting-extensions {
759+
yang-version 1.1;
760+
prefix "ae";
761+
namespace "ae";
762+
import with-extensions {
763+
prefix "we";
764+
}
765+
augment "/we:c" {
766+
we:annotation last-modified;
767+
}
768+
}
769+
)"s;

tests/schema_node.cpp

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -356,12 +356,32 @@ TEST_CASE("SchemaNode")
356356
REQUIRE(mod.extensionInstances().size() == 0);
357357
auto elem = ctx->findPath("/with-extensions:c");
358358
REQUIRE(elem.extensionInstances().size() == 2);
359+
REQUIRE(elem.extensionInstances()[0].module().name() == "with-extensions");
359360
REQUIRE(elem.extensionInstances()[0].definition().module().name() == "ietf-netconf-acm");
360361
REQUIRE(elem.extensionInstances()[0].definition().name() == "default-deny-write");
361362
REQUIRE(!elem.extensionInstances()[0].argument());
363+
REQUIRE(elem.extensionInstances()[1].module().name() == "with-extensions");
362364
REQUIRE(elem.extensionInstances()[1].definition().module().name() == "with-extensions");
363365
REQUIRE(elem.extensionInstances()[1].definition().name() == "annotation");
364366
REQUIRE(elem.extensionInstances()[1].argument() == "last-modified");
367+
368+
auto mod2 = ctx->parseModule(augmented_extensions_module, libyang::SchemaFormat::YANG);
369+
REQUIRE(mod2.extensionInstances().size() == 0);
370+
elem = ctx->findPath("/with-extensions:c");
371+
REQUIRE(elem.extensionInstances().size() == 3);
372+
// the augment adds a new extension, and libyang places that at index 0
373+
REQUIRE(elem.extensionInstances()[0].module().name() == "augmenting-extensions");
374+
REQUIRE(elem.extensionInstances()[0].definition().module().name() == "with-extensions");
375+
REQUIRE(elem.extensionInstances()[0].definition().name() == "annotation");
376+
REQUIRE(elem.extensionInstances()[0].argument() == "last-modified");
377+
REQUIRE(elem.extensionInstances()[1].module().name() == "with-extensions");
378+
REQUIRE(elem.extensionInstances()[1].definition().module().name() == "ietf-netconf-acm");
379+
REQUIRE(elem.extensionInstances()[1].definition().name() == "default-deny-write");
380+
REQUIRE(!elem.extensionInstances()[1].argument());
381+
REQUIRE(elem.extensionInstances()[2].module().name() == "with-extensions");
382+
REQUIRE(elem.extensionInstances()[2].definition().module().name() == "with-extensions");
383+
REQUIRE(elem.extensionInstances()[2].definition().name() == "annotation");
384+
REQUIRE(elem.extensionInstances()[2].argument() == "last-modified");
365385
}
366386

367387
DOCTEST_SUBCASE("SchemaNode::operator==")

0 commit comments

Comments
 (0)