blob: f60526b72b13e5f1d6353bd8d7179d7a3fbd43a0 [file] [log] [blame]
Alexander Afanasyevb0c78ea2014-04-15 18:12:04 -07001/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2/**
Alexander Afanasyev42290b22017-03-09 12:58:29 -08003 * Copyright (c) 2014-2017, Regents of the University of California.
Alexander Afanasyeve1e6f2a2014-04-25 11:28:12 -07004 *
5 * This file is part of NDN repo-ng (Next generation of NDN repository).
6 * See AUTHORS.md for complete list of repo-ng authors and contributors.
7 *
8 * repo-ng is free software: you can redistribute it and/or modify it under the terms
9 * of the GNU General Public License as published by the Free Software Foundation,
10 * either version 3 of the License, or (at your option) any later version.
11 *
12 * repo-ng is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
13 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
14 * PURPOSE. See the GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License along with
17 * repo-ng, e.g., in COPYING.md file. If not, see <http://www.gnu.org/licenses/>.
Alexander Afanasyevb0c78ea2014-04-15 18:12:04 -070018 */
19
20#ifndef REPO_TESTS_DATASET_FIXTURES_HPP
21#define REPO_TESTS_DATASET_FIXTURES_HPP
22
Alexander Afanasyeve291caf2014-04-25 11:17:36 -070023#include <ndn-cxx/security/key-chain.hpp>
Wentao Shang91fb4f22014-05-20 10:55:22 -070024#include <vector>
25#include <boost/mpl/vector.hpp>
Alexander Afanasyevb0c78ea2014-04-15 18:12:04 -070026
27namespace repo {
28namespace tests {
29
Alexander Afanasyevb0c78ea2014-04-15 18:12:04 -070030
31class DatasetBase
32{
33public:
Alexander Afanasyevb7e8a812014-07-23 01:36:47 -070034 class Error : public std::runtime_error
35 {
36 public:
37 explicit
38 Error(const std::string& what)
39 : std::runtime_error(what)
40 {
41 }
42 };
43
Alexander Afanasyev42290b22017-03-09 12:58:29 -080044 typedef std::list<std::shared_ptr<ndn::Data> > DataContainer;
Alexander Afanasyevb0c78ea2014-04-15 18:12:04 -070045 DataContainer data;
46
Alexander Afanasyev42290b22017-03-09 12:58:29 -080047 typedef std::list<std::pair<ndn::Interest, std::shared_ptr<ndn::Data> > > InterestContainer;
Alexander Afanasyevb0c78ea2014-04-15 18:12:04 -070048 InterestContainer interests;
Shuo Chen9a43f162014-07-01 13:43:54 +080049
Alexander Afanasyevb7e8a812014-07-23 01:36:47 -070050 typedef std::list<std::pair<ndn::Interest, size_t > > RemovalsContainer;
51 RemovalsContainer removals;
Weiqi Shi28a90fb2014-07-09 10:28:55 -070052
Alexander Afanasyevb7e8a812014-07-23 01:36:47 -070053protected:
Alexander Afanasyev42290b22017-03-09 12:58:29 -080054 std::shared_ptr<ndn::Data>
Alexander Afanasyevb7e8a812014-07-23 01:36:47 -070055 createData(const ndn::Name& name)
Shuo Chen9a43f162014-07-01 13:43:54 +080056 {
Alexander Afanasyevb7e8a812014-07-23 01:36:47 -070057 if (map.count(name) > 0)
58 return map[name];
Shuo Chen9a43f162014-07-01 13:43:54 +080059
Alexander Afanasyevb7e8a812014-07-23 01:36:47 -070060 static ndn::KeyChain keyChain;
61 static std::vector<uint8_t> content(1500, '-');
62
Alexander Afanasyev42290b22017-03-09 12:58:29 -080063 std::shared_ptr<ndn::Data> data = std::make_shared<ndn::Data>();
Alexander Afanasyevb7e8a812014-07-23 01:36:47 -070064 data->setName(name);
65 data->setContent(&content[0], content.size());
66 keyChain.sign(*data);
67
68 map.insert(std::make_pair(name, data));
69 return data;
70 }
71
Alexander Afanasyev42290b22017-03-09 12:58:29 -080072 std::shared_ptr<ndn::Data>
Alexander Afanasyevb7e8a812014-07-23 01:36:47 -070073 getData(const ndn::Name& name)
Shuo Chen9a43f162014-07-01 13:43:54 +080074 {
Alexander Afanasyevb7e8a812014-07-23 01:36:47 -070075 if (map.count(name) > 0)
76 return map[name];
77 else
Alexander Afanasyev42290b22017-03-09 12:58:29 -080078 BOOST_THROW_EXCEPTION(Error("Data with name " + name.toUri() + " is not found"));
Alexander Afanasyevb7e8a812014-07-23 01:36:47 -070079 }
80
81private:
82 std::map<Name, shared_ptr<Data> > map;
Alexander Afanasyevb0c78ea2014-04-15 18:12:04 -070083};
84
85
86template<size_t N>
Alexander Afanasyevb7e8a812014-07-23 01:36:47 -070087class SamePrefixDataset : public DatasetBase
Alexander Afanasyevb0c78ea2014-04-15 18:12:04 -070088{
89public:
90 static const std::string&
91 getName()
92 {
Alexander Afanasyevb7e8a812014-07-23 01:36:47 -070093 static std::string name = "SamePrefixDataset";
Alexander Afanasyevb0c78ea2014-04-15 18:12:04 -070094 return name;
95 }
96
Alexander Afanasyevb7e8a812014-07-23 01:36:47 -070097 SamePrefixDataset()
Alexander Afanasyevb0c78ea2014-04-15 18:12:04 -070098 {
99 ndn::Name baseName("/x/y/z/test/1");
100 for (size_t i = 0; i < N; i++) {
101 ndn::Name name(baseName);
102 name.appendSegment(i);
Alexander Afanasyev42290b22017-03-09 12:58:29 -0800103 std::shared_ptr<Data> data = createData(name);
Alexander Afanasyevb0c78ea2014-04-15 18:12:04 -0700104 this->data.push_back(data);
105
106 this->interests.push_back(std::make_pair(Interest(name), data));
107 }
108 }
109};
110
111
Alexander Afanasyevb7e8a812014-07-23 01:36:47 -0700112class BasicDataset : public DatasetBase
Alexander Afanasyevb0c78ea2014-04-15 18:12:04 -0700113{
114public:
115 static const std::string&
116 getName()
117 {
Alexander Afanasyevb7e8a812014-07-23 01:36:47 -0700118 static std::string name = "BasicDataset";
Alexander Afanasyevb0c78ea2014-04-15 18:12:04 -0700119 return name;
120 }
121
Alexander Afanasyevb7e8a812014-07-23 01:36:47 -0700122 BasicDataset()
Alexander Afanasyevb0c78ea2014-04-15 18:12:04 -0700123 {
124 this->data.push_back(createData("/a"));
Alexander Afanasyevb0c78ea2014-04-15 18:12:04 -0700125 this->data.push_back(createData("/a/b"));
Alexander Afanasyevb0c78ea2014-04-15 18:12:04 -0700126 this->data.push_back(createData("/a/b/c"));
Alexander Afanasyevb0c78ea2014-04-15 18:12:04 -0700127 this->data.push_back(createData("/a/b/c/d"));
Alexander Afanasyevb7e8a812014-07-23 01:36:47 -0700128
Alexander Afanasyev595b2bd2014-12-14 12:55:36 -0800129 this->interests.push_back(std::make_pair(Interest("/a"), getData("/a")));
130 this->interests.push_back(std::make_pair(Interest("/a/b"), getData("/a/b")));
131 this->interests.push_back(std::make_pair(Interest("/a/b/c"), getData("/a/b/c")));
Alexander Afanasyevb7e8a812014-07-23 01:36:47 -0700132 this->interests.push_back(std::make_pair(Interest("/a/b/c/d"), getData("/a/b/c/d")));
Alexander Afanasyevb0c78ea2014-04-15 18:12:04 -0700133 }
134};
135
Weiqi Shi28a90fb2014-07-09 10:28:55 -0700136//Fetch by prefix is useless due to the database is fetched by id
Alexander Afanasyevb7e8a812014-07-23 01:36:47 -0700137class FetchByPrefixDataset : public DatasetBase
Alexander Afanasyevb0c78ea2014-04-15 18:12:04 -0700138{
139public:
140 static const std::string&
141 getName()
142 {
Alexander Afanasyevb7e8a812014-07-23 01:36:47 -0700143 static std::string name = "FetchByPrefixDataset";
Alexander Afanasyevb0c78ea2014-04-15 18:12:04 -0700144 return name;
145 }
146
Alexander Afanasyevb7e8a812014-07-23 01:36:47 -0700147 FetchByPrefixDataset()
Alexander Afanasyevb0c78ea2014-04-15 18:12:04 -0700148 {
149 this->data.push_back(createData("/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z"));
150 this->interests.push_back(std::make_pair(Interest("/a"),
151 this->data.back()));
152 this->interests.push_back(std::make_pair(Interest("/a/b"),
153 this->data.back()));
154 this->interests.push_back(std::make_pair(Interest("/a/b/c"),
155 this->data.back()));
156 this->interests.push_back(std::make_pair(Interest("/a/b/c/d"),
157 this->data.back()));
158 this->interests.push_back(std::make_pair(Interest("/a/b/c/d/e"),
159 this->data.back()));
160 this->interests.push_back(std::make_pair(Interest("/a/b/c/d/e/f"),
161 this->data.back()));
162 this->interests.push_back(std::make_pair(Interest("/a/b/c/d/e/f/g"),
163 this->data.back()));
164 this->interests.push_back(std::make_pair(Interest("/a/b/c/d/e/f/g/h"),
165 this->data.back()));
166 this->interests.push_back(std::make_pair(Interest("/a/b/c/d/e/f/g/h/i"),
167 this->data.back()));
168 this->interests.push_back(std::make_pair(Interest("/a/b/c/d/e/f/g/h/i/j"),
169 this->data.back()));
170 this->interests.push_back(std::make_pair(Interest("/a/b/c/d/e/f/g/h/i/j/k"),
171 this->data.back()));
172 this->interests.push_back(std::make_pair(Interest("/a/b/c/d/e/f/g/h/i/j/k/l"),
173 this->data.back()));
174 this->interests.push_back(std::make_pair(Interest("/a/b/c/d/e/f/g/h/i/j/k/l/m"),
175 this->data.back()));
176 this->interests.push_back(std::make_pair(Interest("/a/b/c/d/e/f/g/h/i/j/k/l/m/n"),
177 this->data.back()));
178 this->interests.push_back(std::make_pair(Interest("/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o"),
179 this->data.back()));
180 this->interests.push_back(std::make_pair(Interest("/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p"),
181 this->data.back()));
182 this->interests.push_back(std::make_pair(Interest("/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q"),
183 this->data.back()));
184 this->interests.push_back(std::make_pair(Interest("/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r"),
185 this->data.back()));
186 this->interests.push_back(std::make_pair(Interest("/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s"),
187 this->data.back()));
188 this->interests.push_back(std::make_pair(Interest("/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t"),
189 this->data.back()));
190 this->interests.push_back(std::make_pair(Interest("/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u"),
191 this->data.back()));
192 this->interests.push_back(
Weiqi Shi28a90fb2014-07-09 10:28:55 -0700193 std::make_pair(Interest("/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v"),
194 this->data.back()));
Alexander Afanasyevb0c78ea2014-04-15 18:12:04 -0700195 this->interests.push_back(
Weiqi Shi28a90fb2014-07-09 10:28:55 -0700196 std::make_pair(Interest("/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w"),
197 this->data.back()));
Alexander Afanasyevb0c78ea2014-04-15 18:12:04 -0700198 this->interests.push_back(
199 std::make_pair(Interest("/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x"),
200 this->data.back()));
201 this->interests.push_back(
202 std::make_pair(Interest("/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y"),
203 this->data.back()));
204 this->interests.push_back(
205 std::make_pair(Interest("/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z"),
206 this->data.back()));
207 }
208};
209
210
Alexander Afanasyevb7e8a812014-07-23 01:36:47 -0700211class BasicChildSelectorDataset : public DatasetBase
Alexander Afanasyevb0c78ea2014-04-15 18:12:04 -0700212{
213public:
214 static const std::string&
215 getName()
216 {
Alexander Afanasyevb7e8a812014-07-23 01:36:47 -0700217 static std::string name = "BasicChildSelectorDataset";
Alexander Afanasyevb0c78ea2014-04-15 18:12:04 -0700218 return name;
219 }
220
Alexander Afanasyevb7e8a812014-07-23 01:36:47 -0700221 BasicChildSelectorDataset()
Alexander Afanasyevb0c78ea2014-04-15 18:12:04 -0700222 {
223 this->data.push_back(createData("/a/1"));
224 this->data.push_back(createData("/b/1"));
225 this->interests.push_back(std::make_pair(Interest()
Weiqi Shi28a90fb2014-07-09 10:28:55 -0700226 .setName("/b")
227 .setSelectors(Selectors()
228 .setChildSelector(0)),
229 this->data.back()));
Alexander Afanasyevb0c78ea2014-04-15 18:12:04 -0700230
231 this->data.push_back(createData("/c/1"));
232 this->data.push_back(createData("/b/99"));
233 this->interests.push_back(std::make_pair(Interest()
Weiqi Shi28a90fb2014-07-09 10:28:55 -0700234 .setName("/b")
235 .setSelectors(Selectors()
236 .setChildSelector(1)),
237 this->data.back()));
Alexander Afanasyevb0c78ea2014-04-15 18:12:04 -0700238 this->data.push_back(createData("/b/5"));
239 this->data.push_back(createData("/b/55"));
240 }
241};
242
Weiqi Shi28a90fb2014-07-09 10:28:55 -0700243
Alexander Afanasyevb7e8a812014-07-23 01:36:47 -0700244class ExtendedChildSelectorDataset : public DatasetBase
Weiqi Shi28a90fb2014-07-09 10:28:55 -0700245{
246public:
247 static const std::string&
248 getName()
249 {
250 static std::string name = "storage";
251 return name;
252 }
253
Alexander Afanasyevb7e8a812014-07-23 01:36:47 -0700254 ExtendedChildSelectorDataset()
Weiqi Shi28a90fb2014-07-09 10:28:55 -0700255 {
256 this->data.push_back(createData("/a/b/1"));
Alexander Afanasyevb7e8a812014-07-23 01:36:47 -0700257
Weiqi Shi28a90fb2014-07-09 10:28:55 -0700258 this->data.push_back(createData("/a/c/1"));
Alexander Afanasyevb7e8a812014-07-23 01:36:47 -0700259 this->interests.push_back(std::make_pair(Interest("/a")
260 .setSelectors(Selectors()
261 .setChildSelector(1)),
262 this->data.back()));
Weiqi Shi28a90fb2014-07-09 10:28:55 -0700263
264 this->data.push_back(createData("/a/c/2"));
Weiqi Shi28a90fb2014-07-09 10:28:55 -0700265
266 this->data.push_back(createData("/b"));
Weiqi Shi28a90fb2014-07-09 10:28:55 -0700267 }
268};
269
Alexander Afanasyevb7e8a812014-07-23 01:36:47 -0700270
271class ComplexSelectorsDataset : public DatasetBase
Weiqi Shi28a90fb2014-07-09 10:28:55 -0700272{
273public:
Alexander Afanasyevb7e8a812014-07-23 01:36:47 -0700274 static const std::string&
275 getName()
276 {
277 static std::string name = "ComplexSelectorsDataset";
278 return name;
279 }
Weiqi Shi28a90fb2014-07-09 10:28:55 -0700280
Alexander Afanasyevb7e8a812014-07-23 01:36:47 -0700281 std::map<std::string, shared_ptr<Data> > map;
Weiqi Shi28a90fb2014-07-09 10:28:55 -0700282
Alexander Afanasyevb7e8a812014-07-23 01:36:47 -0700283 void
284 addData(const std::string& name)
285 {
286 }
Weiqi Shi28a90fb2014-07-09 10:28:55 -0700287
Alexander Afanasyevb7e8a812014-07-23 01:36:47 -0700288 ComplexSelectorsDataset()
289 {
290 // Dataset
291 this->data.push_back(createData("/a/b/c"));
292 this->data.push_back(createData("/a/b/d/1"));
293 this->data.push_back(createData("/a/b/d/2"));
294 this->data.push_back(createData("/a/b/d/3"));
295 this->data.push_back(createData("/a/b/d/4/I"));
296 this->data.push_back(createData("/a/b/d/4"));
297 this->data.push_back(createData("/a/b/d"));
298 this->data.push_back(createData("/a/b/e/1"));
299 this->data.push_back(createData("/a/b/e"));
Weiqi Shi28a90fb2014-07-09 10:28:55 -0700300
Alexander Afanasyevb7e8a812014-07-23 01:36:47 -0700301 // Basic selects
302 this->interests.push_back(std::make_pair(Interest("/a/b/c"), this->getData("/a/b/c")));
Alexander Afanasyev595b2bd2014-12-14 12:55:36 -0800303 this->interests.push_back(std::make_pair(Interest("/a/b/d"), this->getData("/a/b/d")));
Alexander Afanasyevb7e8a812014-07-23 01:36:47 -0700304 this->interests.push_back(std::make_pair(Interest("/a/b/d/1"), this->getData("/a/b/d/1")));
305 this->interests.push_back(std::make_pair(Interest("/a/b/d/2"), this->getData("/a/b/d/2")));
306 this->interests.push_back(std::make_pair(Interest("/a/b/d/3"), this->getData("/a/b/d/3")));
307 this->interests.push_back(std::make_pair(Interest("/a/b/d/4/I"), this->getData("/a/b/d/4/I")));
Alexander Afanasyev595b2bd2014-12-14 12:55:36 -0800308 this->interests.push_back(std::make_pair(Interest("/a/b/d/4"), this->getData("/a/b/d/4")));
309 this->interests.push_back(std::make_pair(Interest("/a/b/e"), this->getData("/a/b/e")));
Alexander Afanasyevb7e8a812014-07-23 01:36:47 -0700310 this->interests.push_back(std::make_pair(Interest("/a/b/e/1"), this->getData("/a/b/e/1")));
Weiqi Shi28a90fb2014-07-09 10:28:55 -0700311
Alexander Afanasyevb7e8a812014-07-23 01:36:47 -0700312 // Complex selects
313 this->interests.push_back(std::make_pair(Interest("/a/b")
314 .setSelectors(Selectors()
315 .setMinSuffixComponents(2)
316 .setMaxSuffixComponents(2)),
317 this->getData("/a/b/c")));
Weiqi Shi28a90fb2014-07-09 10:28:55 -0700318
Alexander Afanasyevb7e8a812014-07-23 01:36:47 -0700319 this->interests.push_back(std::make_pair(Interest("/a/b/d")
320 .setSelectors(Selectors()
321 .setMinSuffixComponents(-1)
322 .setChildSelector(0)),
Alexander Afanasyev595b2bd2014-12-14 12:55:36 -0800323 this->getData("/a/b/d")));
Weiqi Shi28a90fb2014-07-09 10:28:55 -0700324
Alexander Afanasyevb7e8a812014-07-23 01:36:47 -0700325 this->interests.push_back(std::make_pair(Interest("/a/b/d")
326 .setSelectors(Selectors()
327 .setMinSuffixComponents(2)
328 .setChildSelector(0)),
329 this->getData("/a/b/d/1")));
Weiqi Shi28a90fb2014-07-09 10:28:55 -0700330
Alexander Afanasyevb7e8a812014-07-23 01:36:47 -0700331 this->interests.push_back(std::make_pair(
332 Interest("/a/b/d")
333 .setSelectors(Selectors()
334 .setChildSelector(1)
335 .setMaxSuffixComponents(2)
336 .setMinSuffixComponents(2)
337 .setExclude(Exclude()
338 .excludeRange(ndn::name::Component("3"),
339 ndn::name::Component("4")))),
340 this->getData("/a/b/d/2")));
Weiqi Shi28a90fb2014-07-09 10:28:55 -0700341
342
Alexander Afanasyevb7e8a812014-07-23 01:36:47 -0700343 this->interests.push_back(std::make_pair(Interest("/a/b/d")
344 .setSelectors(Selectors().setMinSuffixComponents(3)),
345 this->getData("/a/b/d/4/I")));
Weiqi Shi28a90fb2014-07-09 10:28:55 -0700346
Alexander Afanasyevb7e8a812014-07-23 01:36:47 -0700347 // According to selector definition, RightMost for the next level and LeftMost for the next-next level
348 this->interests.push_back(std::make_pair(Interest("/a/b/d")
349 .setSelectors(Selectors()
350 .setMinSuffixComponents(2)
351 .setChildSelector(1)),
Alexander Afanasyev595b2bd2014-12-14 12:55:36 -0800352 this->getData("/a/b/d/4")));
Weiqi Shif0330d52014-07-09 10:54:27 -0700353
Alexander Afanasyevb7e8a812014-07-23 01:36:47 -0700354 // because of the digest component, /a/b/d will be to the right of /a/b/d/4
355 this->interests.push_back(std::make_pair(Interest("/a/b/d")
356 .setSelectors(Selectors()
357 .setChildSelector(1)),
Alexander Afanasyev595b2bd2014-12-14 12:55:36 -0800358 this->getData("/a/b/d/4")));
Weiqi Shi28a90fb2014-07-09 10:28:55 -0700359
Alexander Afanasyevb7e8a812014-07-23 01:36:47 -0700360 // Alex: this interest doesn't make sense, as all Data packets will have the same selector
361 this->interests.push_back(std::make_pair(Interest("/a/b/e")
362 .setSelectors(Selectors()
363 .setPublisherPublicKeyLocator(
364 this->data.back()
365 ->getSignature().getKeyLocator())),
Alexander Afanasyev595b2bd2014-12-14 12:55:36 -0800366 this->getData("/a/b/e")));
Weiqi Shi28a90fb2014-07-09 10:28:55 -0700367
Alexander Afanasyevb7e8a812014-07-23 01:36:47 -0700368 // Removals
369 this->removals.push_back(std::make_pair(Interest("/a/b/d/2"), 1));
Weiqi Shif0330d52014-07-09 10:54:27 -0700370
Alexander Afanasyevb7e8a812014-07-23 01:36:47 -0700371 this->removals.push_back(std::make_pair(
372 Interest("/a/b/d")
373 .setSelectors(Selectors()
374 .setMaxSuffixComponents(2)
375 .setMinSuffixComponents(2)
376 .setExclude(Exclude()
377 .excludeOne(ndn::name::Component("3")))),
378 2));
379 }
Weiqi Shi28a90fb2014-07-09 10:28:55 -0700380};
Alexander Afanasyevb0c78ea2014-04-15 18:12:04 -0700381
Weiqi Shi28a90fb2014-07-09 10:28:55 -0700382
Alexander Afanasyevb7e8a812014-07-23 01:36:47 -0700383typedef boost::mpl::vector< BasicDataset,
384 FetchByPrefixDataset,
385 BasicChildSelectorDataset,
386 ExtendedChildSelectorDataset,
387 SamePrefixDataset<10>,
388 SamePrefixDataset<100> > CommonDatasets;
Weiqi Shi28a90fb2014-07-09 10:28:55 -0700389
Alexander Afanasyevb0c78ea2014-04-15 18:12:04 -0700390
391} // namespace tests
392} // namespace repo
393
394#endif // REPO_TESTS_DATASET_FIXTURES_HPP