summaryrefslogtreecommitdiffstats
path: root/library/cpp/yaml/fyamlcpp/fyamlcpp_ut.cpp
diff options
context:
space:
mode:
authorinnokentii <[email protected]>2023-03-23 17:02:27 +0300
committerinnokentii <[email protected]>2023-03-23 17:02:27 +0300
commit1b63dc868aaa1066fd2f723f739ea086a2a49601 (patch)
treef317d82984b0facf4a5d81720e5bb54cf9a124d4 /library/cpp/yaml/fyamlcpp/fyamlcpp_ut.cpp
parent8007028c9d3043fe9909990721048e49127eeeec (diff)
Fix leaks on fyamlcpp misuse
fix possible leaks on misuse
Diffstat (limited to 'library/cpp/yaml/fyamlcpp/fyamlcpp_ut.cpp')
-rw-r--r--library/cpp/yaml/fyamlcpp/fyamlcpp_ut.cpp67
1 files changed, 67 insertions, 0 deletions
diff --git a/library/cpp/yaml/fyamlcpp/fyamlcpp_ut.cpp b/library/cpp/yaml/fyamlcpp/fyamlcpp_ut.cpp
index 94093c4157b..ffe1d4368c3 100644
--- a/library/cpp/yaml/fyamlcpp/fyamlcpp_ut.cpp
+++ b/library/cpp/yaml/fyamlcpp/fyamlcpp_ut.cpp
@@ -86,4 +86,71 @@ test: b
auto docOpt3 = parser.NextDocument();
UNIT_ASSERT(!docOpt3);
}
+
+ Y_UNIT_TEST(Leak) {
+ std::optional<NFyaml::TDocument> doc;
+
+ {
+ std::optional<NFyaml::TDocument> item1;
+ std::optional<NFyaml::TDocument> item2;
+ {
+ const TString items = R"(
+item:
+ x: 1
+ y: 2
+---
+test:
+ a: noop
+ b:
+ - 1
+ - 2
+ - 3
+---
+x: b
+)";
+ auto parser = NFyaml::TParser::Create(items);
+
+ item1.emplace(*parser.NextDocument());
+ item2.emplace(*parser.NextDocument());
+ parser.NextDocument();
+ parser.NextDocument();
+ }
+
+ {
+ const TString config = R"(
+test: a
+---
+test: []
+---
+x: b
+)";
+ auto parser = NFyaml::TParser::Create(config);
+
+ parser.NextDocument();
+ doc.emplace(*parser.NextDocument());
+ parser.NextDocument();
+ parser.NextDocument();
+ }
+
+ {
+ auto item1NodeRef = item1->Root().Map().at("item");
+ auto item2NodeRef = item2->Root().Map().at("test");
+ auto docNodeRef = doc->Root().Map().at("test");
+ auto node1 = item1NodeRef.Copy(*doc);
+ auto node2 = item2NodeRef.Copy(*doc);
+ docNodeRef.Sequence().Append(node1.Ref());
+ docNodeRef.Sequence().Append(node2.Ref());
+ item1.reset();
+ item2.reset();
+ }
+ }
+
+ auto seq = doc->Root().Map().at("test").Sequence();
+ UNIT_ASSERT_VALUES_EQUAL(seq[0].Map().at("x").Scalar(), "1");
+ UNIT_ASSERT_VALUES_EQUAL(seq[0].Map().at("y").Scalar(), "2");
+ UNIT_ASSERT_VALUES_EQUAL(seq[1].Map().at("a").Scalar(), "noop");
+ UNIT_ASSERT_VALUES_EQUAL(seq[1].Map().at("b").Sequence().at(0).Scalar(), "1");
+ UNIT_ASSERT_VALUES_EQUAL(seq[1].Map().at("b").Sequence().at(1).Scalar(), "2");
+ UNIT_ASSERT_VALUES_EQUAL(seq[1].Map().at("b").Sequence().at(2).Scalar(), "3");
+ }
}