blob: 2db8193c8bad4faa61c3bcbfb5fef8dbe831e3b8 [file] [log] [blame]
Václav Kubernát07204242018-06-04 18:12:09 +02001/*
2 * Copyright (C) 2018 CESNET, https://photonics.cesnet.cz/
3 * Copyright (C) 2018 FIT CVUT, https://fit.cvut.cz/
4 *
5 * Written by Václav Kubernát <kubervac@fit.cvut.cz>
6 *
7*/
8
Jan Kundráta33cf082019-03-28 11:55:57 +01009#include "trompeloeil_doctest.h"
Jan Kundrát76b3ddc2019-07-03 10:31:27 +020010#include <boost/core/demangle.hpp>
Václav Kubernát24df80e2018-06-06 15:18:03 +020011#include "ast_commands.hpp"
Václav Kubernát07204242018-06-04 18:12:09 +020012#include "parser.hpp"
Václav Kubernátbddbb172018-06-13 16:27:39 +020013#include "static_schema.hpp"
Václav Kubernát07204242018-06-04 18:12:09 +020014
Jan Kundrát76b3ddc2019-07-03 10:31:27 +020015std::ostream& operator<<(std::ostream& s, const set_ cmd)
16{
17 return s << "Command SET {path: " << pathToAbsoluteSchemaString(cmd.m_path) << ", type " << boost::core::demangle(cmd.m_data.type().name()) << ", data: " << leafDataToString(cmd.m_data) << "}";
18}
19
Václav Kubernát07204242018-06-04 18:12:09 +020020TEST_CASE("leaf editing")
21{
Václav Kubernátbddbb172018-06-13 16:27:39 +020022 auto schema = std::make_shared<StaticSchema>();
Václav Kubernát744f57f2018-06-29 22:46:26 +020023 schema->addModule("mod");
Václav Kubernáteeb38842019-03-20 19:46:05 +010024 schema->addModule("pizza-module");
Václav Kubernát744f57f2018-06-29 22:46:26 +020025 schema->addContainer("", "mod:contA");
26 schema->addLeaf("", "mod:leafString", yang::LeafDataTypes::String);
27 schema->addLeaf("", "mod:leafDecimal", yang::LeafDataTypes::Decimal);
28 schema->addLeaf("", "mod:leafBool", yang::LeafDataTypes::Bool);
29 schema->addLeaf("", "mod:leafInt", yang::LeafDataTypes::Int);
30 schema->addLeaf("", "mod:leafUint", yang::LeafDataTypes::Uint);
Václav Kubernátab538992019-03-06 15:30:50 +010031 schema->addLeaf("", "mod:leafBinary", yang::LeafDataTypes::Binary);
Václav Kubernáteeb38842019-03-20 19:46:05 +010032 schema->addIdentity(std::nullopt, ModuleValuePair{"mod", "food"});
33 schema->addIdentity(std::nullopt, ModuleValuePair{"mod", "vehicle"});
34 schema->addIdentity(ModuleValuePair{"mod", "food"}, ModuleValuePair{"mod", "pizza"});
35 schema->addIdentity(ModuleValuePair{"mod", "food"}, ModuleValuePair{"mod", "spaghetti"});
36 schema->addIdentity(ModuleValuePair{"mod", "pizza"}, ModuleValuePair{"pizza-module", "hawaii"});
37 schema->addLeafIdentityRef("", "mod:foodIdentRef", ModuleValuePair{"mod", "food"});
38 schema->addLeafIdentityRef("", "mod:pizzaIdentRef", ModuleValuePair{"mod", "pizza"});
39 schema->addLeafIdentityRef("mod:contA", "mod:identInCont", ModuleValuePair{"mod", "pizza"});
Václav Kubernát744f57f2018-06-29 22:46:26 +020040 schema->addLeafEnum("", "mod:leafEnum", {"lol", "data", "coze"});
41 schema->addLeaf("mod:contA", "mod:leafInCont", yang::LeafDataTypes::String);
42 schema->addList("", "mod:list", {"number"});
43 schema->addLeaf("mod:list", "mod:leafInList", yang::LeafDataTypes::String);
Václav Kubernát07204242018-06-04 18:12:09 +020044 Parser parser(schema);
45 std::string input;
46 std::ostringstream errorStream;
47
48 SECTION("valid input")
49 {
50 set_ expected;
51
Václav Kubernátab538992019-03-06 15:30:50 +010052 SECTION("set mod:leafString some_data")
Václav Kubernát07204242018-06-04 18:12:09 +020053 {
Václav Kubernát744f57f2018-06-29 22:46:26 +020054 input = "set mod:leafString some_data";
Václav Kubernát2eaceb82018-10-08 19:56:30 +020055 expected.m_path.m_nodes.push_back(dataNode_{module_{"mod"}, leaf_("leafString")});
Václav Kubernátebca2552018-06-08 19:06:02 +020056 expected.m_data = std::string("some_data");
Václav Kubernát07204242018-06-04 18:12:09 +020057 }
58
Václav Kubernát744f57f2018-06-29 22:46:26 +020059 SECTION("set mod:contA/leafInCont more_data")
Václav Kubernát07204242018-06-04 18:12:09 +020060 {
Václav Kubernát744f57f2018-06-29 22:46:26 +020061 input = "set mod:contA/leafInCont more_data";
Václav Kubernát2eaceb82018-10-08 19:56:30 +020062 expected.m_path.m_nodes.push_back(dataNode_{module_{"mod"}, container_("contA")});
63 expected.m_path.m_nodes.push_back(dataNode_{leaf_("leafInCont")});
Václav Kubernátebca2552018-06-08 19:06:02 +020064 expected.m_data = std::string("more_data");
65 }
66
Václav Kubernátab538992019-03-06 15:30:50 +010067 SECTION("set mod:list[number=1]/leafInList another_data")
Václav Kubernátebca2552018-06-08 19:06:02 +020068 {
Václav Kubernát744f57f2018-06-29 22:46:26 +020069 input = "set mod:list[number=1]/leafInList another_data";
Václav Kubernátebca2552018-06-08 19:06:02 +020070 auto keys = std::map<std::string, std::string>{
71 {"number", "1"}};
Václav Kubernát2eaceb82018-10-08 19:56:30 +020072 expected.m_path.m_nodes.push_back(dataNode_{module_{"mod"}, listElement_("list", keys)});
73 expected.m_path.m_nodes.push_back(dataNode_{leaf_("leafInList")});
Václav Kubernátebca2552018-06-08 19:06:02 +020074 expected.m_data = std::string("another_data");
75 }
76
77 SECTION("data types")
78 {
79 SECTION("string")
80 {
Václav Kubernát744f57f2018-06-29 22:46:26 +020081 input = "set mod:leafString somedata";
Václav Kubernát2eaceb82018-10-08 19:56:30 +020082 expected.m_path.m_nodes.push_back(dataNode_{module_{"mod"}, leaf_("leafString")});
Václav Kubernátebca2552018-06-08 19:06:02 +020083 expected.m_data = std::string("somedata");
84 }
85
86 SECTION("int")
87 {
Václav Kubernát744f57f2018-06-29 22:46:26 +020088 input = "set mod:leafInt 2";
Václav Kubernát2eaceb82018-10-08 19:56:30 +020089 expected.m_path.m_nodes.push_back(dataNode_{module_{"mod"}, leaf_("leafInt")});
Václav Kubernátebca2552018-06-08 19:06:02 +020090 expected.m_data = 2;
91 }
92
93 SECTION("decimal")
94 {
Václav Kubernát744f57f2018-06-29 22:46:26 +020095 input = "set mod:leafDecimal 3.14159";
Václav Kubernát2eaceb82018-10-08 19:56:30 +020096 expected.m_path.m_nodes.push_back(dataNode_{module_{"mod"}, leaf_("leafDecimal")});
Václav Kubernátebca2552018-06-08 19:06:02 +020097 expected.m_data = 3.14159;
98 }
99
100 SECTION("enum")
101 {
Václav Kubernát744f57f2018-06-29 22:46:26 +0200102 input = "set mod:leafEnum coze";
Václav Kubernát2eaceb82018-10-08 19:56:30 +0200103 expected.m_path.m_nodes.push_back(dataNode_{module_{"mod"}, leaf_("leafEnum")});
Václav Kubernátebca2552018-06-08 19:06:02 +0200104 expected.m_data = enum_("coze");
105 }
106
107 SECTION("bool")
108 {
Václav Kubernát744f57f2018-06-29 22:46:26 +0200109 input = "set mod:leafBool true";
Václav Kubernát2eaceb82018-10-08 19:56:30 +0200110 expected.m_path.m_nodes.push_back(dataNode_{module_{"mod"}, leaf_("leafBool")});
Václav Kubernátebca2552018-06-08 19:06:02 +0200111 expected.m_data = true;
112 }
Václav Kubernátab538992019-03-06 15:30:50 +0100113
114 SECTION("binary")
115 {
116 SECTION("zero ending '='")
117 {
118 input = "set mod:leafBinary This/IsABase64EncodedSomething++/342431++";
119 expected.m_data = binary_{"This/IsABase64EncodedSomething++/342431++"};
120 }
121
122 SECTION("one ending '='")
123 {
124 input = "set mod:leafBinary This/IsABase64EncodedSomething++/342431++=";
125 expected.m_data = binary_{"This/IsABase64EncodedSomething++/342431++="};
126 }
127
128 SECTION("two ending '='")
129 {
130 input = "set mod:leafBinary This/IsABase64EncodedSomething++/342431++==";
131 expected.m_data = binary_{"This/IsABase64EncodedSomething++/342431++=="};
132 }
133 expected.m_path.m_nodes.push_back(dataNode_{module_{"mod"}, leaf_("leafBinary")});
134 }
Václav Kubernáteeb38842019-03-20 19:46:05 +0100135
136 SECTION("identityRef")
137 {
138 SECTION("foodIdentRef")
139 {
140 input = "set mod:foodIdentRef ";
141 expected.m_path.m_nodes.push_back(dataNode_{module_{"mod"}, leaf_("foodIdentRef")});
142
143 SECTION("food")
144 {
145 input += "food";
146 expected.m_data = identityRef_("food");
147 }
148 SECTION("mod:food")
149 {
150 input += "mod:food";
151 expected.m_data = identityRef_("mod", "food");
152 }
153 SECTION("pizza")
154 {
155 input += "pizza";
156 expected.m_data = identityRef_("pizza");
157 }
158 SECTION("mod:pizza")
159 {
160 input += "mod:pizza";
161 expected.m_data = identityRef_("mod", "pizza");
162 }
163 SECTION("pizza-module:hawaii")
164 {
165 input += "pizza-module:hawaii";
166 expected.m_data = identityRef_("pizza-module", "hawaii");
167 }
168 }
169 SECTION("pizzaIdentRef")
170 {
171 input = "set mod:pizzaIdentRef ";
172 expected.m_path.m_nodes.push_back(dataNode_{module_{"mod"}, leaf_("pizzaIdentRef")});
173 SECTION("pizza")
174 {
175 input += "pizza";
176 expected.m_data = identityRef_("pizza");
177 }
178 SECTION("mod:pizza")
179 {
180 input += "mod:pizza";
181 expected.m_data = identityRef_("mod", "pizza");
182 }
183 SECTION("pizza-module:hawaii")
184 {
185 input += "pizza-module:hawaii";
186 expected.m_data = identityRef_("pizza-module", "hawaii");
187 }
188 }
189 SECTION("mod:contA/identInCont")
190 {
191 input = "set mod:contA/identInCont ";
192 expected.m_path.m_nodes.push_back(dataNode_{module_{"mod"}, container_("contA")});
193 expected.m_path.m_nodes.push_back(dataNode_(leaf_("identInCont")));
194 SECTION("pizza")
195 {
196 input += "pizza";
197 expected.m_data = identityRef_("pizza");
198 }
199 SECTION("mod:pizza")
200 {
201 input += "mod:pizza";
202 expected.m_data = identityRef_("mod", "pizza");
203 }
204 SECTION("pizza-module:hawaii")
205 {
206 input += "pizza-module:hawaii";
207 expected.m_data = identityRef_("pizza-module", "hawaii");
208 }
209 }
210 }
Václav Kubernát07204242018-06-04 18:12:09 +0200211 }
212
213 command_ command = parser.parseCommand(input, errorStream);
214 REQUIRE(command.type() == typeid(set_));
215 REQUIRE(boost::get<set_>(command) == expected);
216 }
217
218 SECTION("invalid input")
219 {
220 SECTION("missing space between a command and its arguments")
221 {
222 SECTION("setleaf some_data")
223 {
224 input = "setleaf some_data";
225 }
226 }
227
228 SECTION("missing space between arguments")
229 {
230 SECTION("set leaflol")
231 {
232 input = "set leaflol";
233 }
234 }
235
236 SECTION("non-leaf identifiers")
237 {
238 SECTION("set nonexistent blabla")
239 {
240 input = "set nonexistent blabla";
241 }
242
243 SECTION("set contA abde")
244 {
245 input = "set contA abde";
246 }
247 }
248
Václav Kubernátebca2552018-06-08 19:06:02 +0200249 SECTION("wrong types")
250 {
251 SECTION("set leafBool blabla")
252 {
253 input = "set leafBool blabla";
254 }
255 SECTION("set leafUint blabla")
256 {
257 input = "set leafUint blabla";
258 }
259 SECTION("set leafInt blabla")
260 {
261 input = "set leafInt blabla";
262 }
263 SECTION("set leafEnum blabla")
264 {
265 input = "set leafEnum blabla";
266 }
267 }
268
Václav Kubernátab538992019-03-06 15:30:50 +0100269 SECTION("wrong base64 strings")
270 {
271 SECTION("invalid character")
272 input = "set leafBinary dbahj-";
273 SECTION("equal sign in the middle")
274 input = "set leafBinary db=ahj";
275 }
276
Václav Kubernáteeb38842019-03-20 19:46:05 +0100277 SECTION("non-existing identity")
278 {
279 input = "set mod:foodIdentRef identityBLABLA";
280 }
281
282 SECTION("setting identities with wrong bases")
283 {
284 SECTION("set mod:foodIdentRef mod:vehicle")
285 {
286 input = "set mod:foodIdentRef mod:vehicle";
287 }
288 SECTION("set mod:pizzaIdentRef mod:food")
289 {
290 input = "set mod:pizzaIdentRef mod:food";
291 }
292 }
293 SECTION("setting different module identities without prefix")
294 {
295 input = "set mod:pizzaIdentRef hawaii";
296 }
297 SECTION("identity prefix without name")
298 {
299 input = "set mod:contA/identInCont pizza-module:";
300 }
301
Jan Kundrátc381e632019-03-14 13:39:11 +0100302 REQUIRE_THROWS_AS(parser.parseCommand(input, errorStream), InvalidCommandException);
Václav Kubernát07204242018-06-04 18:12:09 +0200303 }
304}