blob: d6435a836ad64c8b98483b2099c7ed6aaf814abd [file] [log] [blame]
Václav Kubernátab612e92019-11-26 19:51:31 +01001/*
2 * Copyright (C) 2019 CESNET, https://photonics.cesnet.cz/
3 *
4 * Written by Václav Kubernát <kubervac@fit.cvut.cz>
5 *
6*/
7
8#include <experimental/iterator>
Václav Kubernát654303f2020-07-31 13:16:54 +02009#include <sysrepo-cpp/Session.hpp>
Václav Kubernát26b56082020-02-03 18:28:56 +010010#include "trompeloeil_doctest.hpp"
Václav Kubernátab612e92019-11-26 19:51:31 +010011
12#ifdef sysrepo_BACKEND
13#include "sysrepo_access.hpp"
14#elif defined(netconf_BACKEND)
15#include "netconf_access.hpp"
16#include "netopeer_vars.hpp"
Václav Kubernát74487df2020-06-04 01:29:28 +020017#elif defined(yang_BACKEND)
18#include "yang_access.hpp"
19#include "yang_access_test_vars.hpp"
Václav Kubernátab612e92019-11-26 19:51:31 +010020#else
21#error "Unknown backend"
22#endif
23#include "data_query.hpp"
Václav Kubernáted824d02020-06-09 15:48:30 +020024#include "pretty_printers.hpp"
Václav Kubernátab612e92019-11-26 19:51:31 +010025#include "sysrepo_subscription.hpp"
26#include "utils.hpp"
27
Václav Kubernátab612e92019-11-26 19:51:31 +010028
29TEST_CASE("data query")
30{
31 trompeloeil::sequence seq1;
Václav Kubernát654303f2020-07-31 13:16:54 +020032 {
33 auto conn = std::make_shared<sysrepo::Connection>();
34 auto sess = std::make_shared<sysrepo::Session>(conn);
35 sess->copy_config(SR_DS_STARTUP, "example-schema", 1000, true);
36 }
Václav Kubernátab612e92019-11-26 19:51:31 +010037 SysrepoSubscription subscriptionExample("example-schema");
38 SysrepoSubscription subscriptionOther("other-module");
39
40#ifdef sysrepo_BACKEND
Václav Kubernát654303f2020-07-31 13:16:54 +020041 SysrepoAccess datastore(Datastore::Running);
Václav Kubernátab612e92019-11-26 19:51:31 +010042#elif defined(netconf_BACKEND)
43 NetconfAccess datastore(NETOPEER_SOCKET_PATH);
Václav Kubernát74487df2020-06-04 01:29:28 +020044#elif defined(yang_BACKEND)
45 YangAccess datastore;
46 datastore.addSchemaDir(schemaDir);
47 datastore.addSchemaFile(exampleSchemaFile);
Václav Kubernátab612e92019-11-26 19:51:31 +010048#else
49#error "Unknown backend"
50#endif
51
52 DataQuery dataquery(datastore);
53
54 SECTION("listKeys")
55 {
Václav Kubernát2db124c2020-05-28 21:58:36 +020056 dataPath_ listPath;
57 listPath.m_scope = Scope::Absolute;
Václav Kubernátc15fe822020-06-04 11:28:39 +020058 std::vector<ListInstance> expected;
Václav Kubernátab612e92019-11-26 19:51:31 +010059
60 SECTION("example-schema:person")
61 {
Jan Kundrátcbf288b2020-06-18 20:44:39 +020062 datastore.createItem("/example-schema:person[name='Vaclav']");
63 datastore.createItem("/example-schema:person[name='Tomas']");
64 datastore.createItem("/example-schema:person[name='Jan Novak']");
Václav Kubernátfaacd022020-07-08 16:44:38 +020065 listPath.m_nodes.emplace_back(module_{"example-schema"}, list_{"person"});
Václav Kubernátab612e92019-11-26 19:51:31 +010066 expected = {
67 {{"name", std::string{"Jan Novak"}}},
68 {{"name", std::string{"Tomas"}}},
69 {{"name", std::string{"Vaclav"}}}
70 };
71 }
72
Václav Kubernát45e55462020-02-04 11:19:32 +010073 SECTION("example-schema:person - no instances")
74 {
Václav Kubernátfaacd022020-07-08 16:44:38 +020075 listPath.m_nodes.emplace_back(module_{"example-schema"}, list_{"person"});
Václav Kubernát45e55462020-02-04 11:19:32 +010076 expected = {
77 };
78 }
79
Václav Kubernátab612e92019-11-26 19:51:31 +010080 SECTION("example-schema:selectedNumbers")
81 {
Jan Kundrátcbf288b2020-06-18 20:44:39 +020082 datastore.createItem("/example-schema:selectedNumbers[value='45']");
83 datastore.createItem("/example-schema:selectedNumbers[value='99']");
84 datastore.createItem("/example-schema:selectedNumbers[value='127']");
Václav Kubernátfaacd022020-07-08 16:44:38 +020085 listPath.m_nodes.emplace_back(module_{"example-schema"}, list_{"selectedNumbers"});
Václav Kubernátab612e92019-11-26 19:51:31 +010086 expected = {
87 {{"value", int8_t{127}}},
88 {{"value", int8_t{45}}},
89 {{"value", int8_t{99}}}
90 };
91 }
92
93 SECTION("example-schema:animalWithColor")
94 {
Jan Kundrátcbf288b2020-06-18 20:44:39 +020095 datastore.createItem("/example-schema:animalWithColor[name='Dog'][color='brown']");
96 datastore.createItem("/example-schema:animalWithColor[name='Dog'][color='white']");
97 datastore.createItem("/example-schema:animalWithColor[name='Cat'][color='grey']");
Václav Kubernátfaacd022020-07-08 16:44:38 +020098 listPath.m_nodes.emplace_back(module_{"example-schema"}, list_{"animalWithColor"});
Václav Kubernátab612e92019-11-26 19:51:31 +010099 expected = {
100 {{"name", std::string{"Cat"}}, {"color", std::string{"grey"}}},
101 {{"name", std::string{"Dog"}}, {"color", std::string{"brown"}}},
102 {{"name", std::string{"Dog"}}, {"color", std::string{"white"}}}
103 };
104 }
105
106 SECTION("example-schema:animalWithColor - quotes in values")
107 {
Václav Kubernát1db04ca2020-07-08 17:23:26 +0200108 datastore.createItem(R"(/example-schema:animalWithColor[name='D"o"g'][color="b'r'own"])");
Václav Kubernátfaacd022020-07-08 16:44:38 +0200109 listPath.m_nodes.emplace_back(module_{"example-schema"}, list_{"animalWithColor"});
Václav Kubernátab612e92019-11-26 19:51:31 +0100110 expected = {
111 {{"name", std::string{"D\"o\"g"}}, {"color", std::string{"b'r'own"}}}
112 };
113 }
114
115 SECTION("example-schema:ports")
116 {
Jan Kundrátcbf288b2020-06-18 20:44:39 +0200117 datastore.createItem("/example-schema:ports[name='A']");
118 datastore.createItem("/example-schema:ports[name='B']");
119 datastore.createItem("/example-schema:ports[name='E']");
Václav Kubernátfaacd022020-07-08 16:44:38 +0200120 listPath.m_nodes.emplace_back(module_{"example-schema"}, list_{"ports"});
Václav Kubernátab612e92019-11-26 19:51:31 +0100121 expected = {
122 {{"name", enum_{"A"}}},
123 {{"name", enum_{"B"}}},
124 {{"name", enum_{"E"}}},
125 };
126 }
127
128 SECTION("example-schema:org/example:people - nested list")
129 {
Jan Kundrátcbf288b2020-06-18 20:44:39 +0200130 datastore.createItem("/example-schema:org[department='accounting']");
131 datastore.createItem("/example-schema:org[department='sales']");
132 datastore.createItem("/example-schema:org[department='programmers']");
133 datastore.createItem("/example-schema:org[department='accounting']/people[name='Alice']");
134 datastore.createItem("/example-schema:org[department='accounting']/people[name='Bob']");
135 datastore.createItem("/example-schema:org[department='sales']/people[name='Alice']");
136 datastore.createItem("/example-schema:org[department='sales']/people[name='Cyril']");
137 datastore.createItem("/example-schema:org[department='sales']/people[name='Alice']/computers[type='laptop']");
138 datastore.createItem("/example-schema:org[department='sales']/people[name='Alice']/computers[type='server']");
139 datastore.createItem("/example-schema:org[department='sales']/people[name='Cyril']/computers[type='PC']");
140 datastore.createItem("/example-schema:org[department='sales']/people[name='Cyril']/computers[type='server']");
Václav Kubernátab612e92019-11-26 19:51:31 +0100141
142 SECTION("outer list")
143 {
Václav Kubernátfaacd022020-07-08 16:44:38 +0200144 listPath.m_nodes.emplace_back(module_{"example-schema"}, list_{"org"});
Václav Kubernátab612e92019-11-26 19:51:31 +0100145 expected = {
146 {{"department", std::string{"accounting"}}},
147 {{"department", std::string{"sales"}}},
148 {{"department", std::string{"programmers"}}},
149 };
150 }
151
152 SECTION("nested list")
153 {
154 listElement_ list;
155 list.m_name = "org";
Václav Kubernátab612e92019-11-26 19:51:31 +0100156 SECTION("accounting department")
157 {
158 list.m_keys = {
159 {"department", std::string{"accounting"}}
160 };
161 expected = {
162 {{"name", std::string{"Alice"}}},
163 {{"name", std::string{"Bob"}}},
164 };
165 }
166 SECTION("sales department")
167 {
168 list.m_keys = {
169 {"department", std::string{"sales"}}
170 };
171 expected = {
172 {{"name", std::string{"Alice"}}},
173 {{"name", std::string{"Cyril"}}},
174 };
175 }
176 SECTION("programmers department")
177 {
178 list.m_keys = {
179 {"department", std::string{"programmers"}}
180 };
181 expected = {
182 };
183 }
Václav Kubernátfaacd022020-07-08 16:44:38 +0200184 listPath.m_nodes.emplace_back(module_{"example-schema"}, list);
185 listPath.m_nodes.emplace_back(list_{"people"});
Václav Kubernátab612e92019-11-26 19:51:31 +0100186 }
187
188 SECTION("THREE MF NESTED LISTS")
189 {
190 listElement_ listOrg;
191 listOrg.m_name = "org";
192 listOrg.m_keys = {
193 {"department", std::string{"sales"}}
194 };
195
196 listElement_ listPeople;
Václav Kubernátab612e92019-11-26 19:51:31 +0100197
198 SECTION("alice computers")
199 {
200 listPeople.m_name = "people";
201 listPeople.m_keys = {
202 {"name", std::string{"Alice"}}
203 };
204 expected = {
205 {{"type", enum_{"laptop"}}},
206 {{"type", enum_{"server"}}},
207 };
208
209 }
210
211 SECTION("cyril computers")
212 {
213 listPeople.m_name = "people";
214 listPeople.m_keys = {
215 {"name", std::string{"Cyril"}}
216 };
217 expected = {
218 {{"type", enum_{"PC"}}},
219 {{"type", enum_{"server"}}},
220 };
221 }
222
Václav Kubernátfaacd022020-07-08 16:44:38 +0200223 listPath.m_nodes.emplace_back(module_{"example-schema"}, listOrg);
224 listPath.m_nodes.emplace_back(listPeople);
225 listPath.m_nodes.emplace_back(list_{"computers"});
Václav Kubernátab612e92019-11-26 19:51:31 +0100226 }
227 }
228
229 SECTION("/other-module:parking-lot/example-schema:cars - list coming from an augment")
230 {
Jan Kundrátcbf288b2020-06-18 20:44:39 +0200231 datastore.createItem("/other-module:parking-lot/example-schema:cars[id='1']");
232 datastore.createItem("/other-module:parking-lot/example-schema:cars[id='2']");
Václav Kubernátab612e92019-11-26 19:51:31 +0100233
Václav Kubernátfaacd022020-07-08 16:44:38 +0200234 listPath.m_nodes.emplace_back(module_{"other-module"}, container_{"parking-lot"});
235 listPath.m_nodes.emplace_back(module_{"example-schema"}, list_{"cars"});
Václav Kubernátab612e92019-11-26 19:51:31 +0100236 expected = {
237 {{"id", int32_t{1}}},
238 {{"id", int32_t{2}}},
239 };
240
241 }
242
243 datastore.commitChanges();
244 std::sort(expected.begin(), expected.end());
Václav Kubernát2db124c2020-05-28 21:58:36 +0200245 auto keys = dataquery.listKeys(listPath);
Václav Kubernátab612e92019-11-26 19:51:31 +0100246 std::sort(keys.begin(), keys.end());
247 REQUIRE(keys == expected);
248 }
249
Václav Kubernát0f362fb2020-06-24 15:16:56 +0200250 SECTION("empty datastore")
251 {
252 dataPath_ listPath;
253 listPath.m_scope = Scope::Absolute;
Václav Kubernátfaacd022020-07-08 16:44:38 +0200254 listPath.m_nodes.emplace_back(module_{"example-schema"}, list_{"person"});
Václav Kubernát0f362fb2020-06-24 15:16:56 +0200255 auto keys = dataquery.listKeys(listPath);
256 REQUIRE(keys == std::vector<ListInstance>{});
257 }
258
Václav Kubernátab612e92019-11-26 19:51:31 +0100259 waitForCompletionAndBitMore(seq1);
260}