blob: fbed46defaa91cdc6b865894f1f24ccf6de98f65 [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
Junxiao Shi047a6fb2017-06-08 16:16:05 +000023#include "identity-management-fixture.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
Junxiao Shi047a6fb2017-06-08 16:16:05 +000030class DatasetBase : public virtual IdentityManagementFixture
Alexander Afanasyevb0c78ea2014-04-15 18:12:04 -070031{
32public:
Alexander Afanasyevb7e8a812014-07-23 01:36:47 -070033 class Error : public std::runtime_error
34 {
35 public:
36 explicit
37 Error(const std::string& what)
38 : std::runtime_error(what)
39 {
40 }
41 };
42
Alexander Afanasyev42290b22017-03-09 12:58:29 -080043 typedef std::list<std::shared_ptr<ndn::Data> > DataContainer;
Alexander Afanasyevb0c78ea2014-04-15 18:12:04 -070044 DataContainer data;
45
Alexander Afanasyev42290b22017-03-09 12:58:29 -080046 typedef std::list<std::pair<ndn::Interest, std::shared_ptr<ndn::Data> > > InterestContainer;
Alexander Afanasyevb0c78ea2014-04-15 18:12:04 -070047 InterestContainer interests;
Shuo Chen9a43f162014-07-01 13:43:54 +080048
Alexander Afanasyevb7e8a812014-07-23 01:36:47 -070049 typedef std::list<std::pair<ndn::Interest, size_t > > RemovalsContainer;
50 RemovalsContainer removals;
Weiqi Shi28a90fb2014-07-09 10:28:55 -070051
Alexander Afanasyevb7e8a812014-07-23 01:36:47 -070052protected:
Alexander Afanasyev42290b22017-03-09 12:58:29 -080053 std::shared_ptr<ndn::Data>
Alexander Afanasyevb7e8a812014-07-23 01:36:47 -070054 createData(const ndn::Name& name)
Shuo Chen9a43f162014-07-01 13:43:54 +080055 {
Alexander Afanasyevb7e8a812014-07-23 01:36:47 -070056 if (map.count(name) > 0)
57 return map[name];
Shuo Chen9a43f162014-07-01 13:43:54 +080058
Alexander Afanasyevb7e8a812014-07-23 01:36:47 -070059 static std::vector<uint8_t> content(1500, '-');
60
Alexander Afanasyev42290b22017-03-09 12:58:29 -080061 std::shared_ptr<ndn::Data> data = std::make_shared<ndn::Data>();
Alexander Afanasyevb7e8a812014-07-23 01:36:47 -070062 data->setName(name);
63 data->setContent(&content[0], content.size());
Junxiao Shi047a6fb2017-06-08 16:16:05 +000064 m_keyChain.sign(*data);
Alexander Afanasyevb7e8a812014-07-23 01:36:47 -070065
66 map.insert(std::make_pair(name, data));
67 return data;
68 }
69
Alexander Afanasyev42290b22017-03-09 12:58:29 -080070 std::shared_ptr<ndn::Data>
Alexander Afanasyevb7e8a812014-07-23 01:36:47 -070071 getData(const ndn::Name& name)
Shuo Chen9a43f162014-07-01 13:43:54 +080072 {
Alexander Afanasyevb7e8a812014-07-23 01:36:47 -070073 if (map.count(name) > 0)
74 return map[name];
75 else
Alexander Afanasyev42290b22017-03-09 12:58:29 -080076 BOOST_THROW_EXCEPTION(Error("Data with name " + name.toUri() + " is not found"));
Alexander Afanasyevb7e8a812014-07-23 01:36:47 -070077 }
78
79private:
80 std::map<Name, shared_ptr<Data> > map;
Alexander Afanasyevb0c78ea2014-04-15 18:12:04 -070081};
82
83
84template<size_t N>
Alexander Afanasyevb7e8a812014-07-23 01:36:47 -070085class SamePrefixDataset : public DatasetBase
Alexander Afanasyevb0c78ea2014-04-15 18:12:04 -070086{
87public:
88 static const std::string&
89 getName()
90 {
Alexander Afanasyevb7e8a812014-07-23 01:36:47 -070091 static std::string name = "SamePrefixDataset";
Alexander Afanasyevb0c78ea2014-04-15 18:12:04 -070092 return name;
93 }
94
Alexander Afanasyevb7e8a812014-07-23 01:36:47 -070095 SamePrefixDataset()
Alexander Afanasyevb0c78ea2014-04-15 18:12:04 -070096 {
97 ndn::Name baseName("/x/y/z/test/1");
98 for (size_t i = 0; i < N; i++) {
99 ndn::Name name(baseName);
100 name.appendSegment(i);
Alexander Afanasyev42290b22017-03-09 12:58:29 -0800101 std::shared_ptr<Data> data = createData(name);
Alexander Afanasyevb0c78ea2014-04-15 18:12:04 -0700102 this->data.push_back(data);
103
104 this->interests.push_back(std::make_pair(Interest(name), data));
105 }
106 }
107};
108
109
Alexander Afanasyevb7e8a812014-07-23 01:36:47 -0700110class BasicDataset : public DatasetBase
Alexander Afanasyevb0c78ea2014-04-15 18:12:04 -0700111{
112public:
113 static const std::string&
114 getName()
115 {
Alexander Afanasyevb7e8a812014-07-23 01:36:47 -0700116 static std::string name = "BasicDataset";
Alexander Afanasyevb0c78ea2014-04-15 18:12:04 -0700117 return name;
118 }
119
Alexander Afanasyevb7e8a812014-07-23 01:36:47 -0700120 BasicDataset()
Alexander Afanasyevb0c78ea2014-04-15 18:12:04 -0700121 {
122 this->data.push_back(createData("/a"));
Alexander Afanasyevb0c78ea2014-04-15 18:12:04 -0700123 this->data.push_back(createData("/a/b"));
Alexander Afanasyevb0c78ea2014-04-15 18:12:04 -0700124 this->data.push_back(createData("/a/b/c"));
Alexander Afanasyevb0c78ea2014-04-15 18:12:04 -0700125 this->data.push_back(createData("/a/b/c/d"));
Alexander Afanasyevb7e8a812014-07-23 01:36:47 -0700126
Alexander Afanasyev595b2bd2014-12-14 12:55:36 -0800127 this->interests.push_back(std::make_pair(Interest("/a"), getData("/a")));
128 this->interests.push_back(std::make_pair(Interest("/a/b"), getData("/a/b")));
129 this->interests.push_back(std::make_pair(Interest("/a/b/c"), getData("/a/b/c")));
Alexander Afanasyevb7e8a812014-07-23 01:36:47 -0700130 this->interests.push_back(std::make_pair(Interest("/a/b/c/d"), getData("/a/b/c/d")));
Alexander Afanasyevb0c78ea2014-04-15 18:12:04 -0700131 }
132};
133
Weiqi Shi28a90fb2014-07-09 10:28:55 -0700134//Fetch by prefix is useless due to the database is fetched by id
Alexander Afanasyevb7e8a812014-07-23 01:36:47 -0700135class FetchByPrefixDataset : public DatasetBase
Alexander Afanasyevb0c78ea2014-04-15 18:12:04 -0700136{
137public:
138 static const std::string&
139 getName()
140 {
Alexander Afanasyevb7e8a812014-07-23 01:36:47 -0700141 static std::string name = "FetchByPrefixDataset";
Alexander Afanasyevb0c78ea2014-04-15 18:12:04 -0700142 return name;
143 }
144
Alexander Afanasyevb7e8a812014-07-23 01:36:47 -0700145 FetchByPrefixDataset()
Alexander Afanasyevb0c78ea2014-04-15 18:12:04 -0700146 {
147 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"));
148 this->interests.push_back(std::make_pair(Interest("/a"),
149 this->data.back()));
150 this->interests.push_back(std::make_pair(Interest("/a/b"),
151 this->data.back()));
152 this->interests.push_back(std::make_pair(Interest("/a/b/c"),
153 this->data.back()));
154 this->interests.push_back(std::make_pair(Interest("/a/b/c/d"),
155 this->data.back()));
156 this->interests.push_back(std::make_pair(Interest("/a/b/c/d/e"),
157 this->data.back()));
158 this->interests.push_back(std::make_pair(Interest("/a/b/c/d/e/f"),
159 this->data.back()));
160 this->interests.push_back(std::make_pair(Interest("/a/b/c/d/e/f/g"),
161 this->data.back()));
162 this->interests.push_back(std::make_pair(Interest("/a/b/c/d/e/f/g/h"),
163 this->data.back()));
164 this->interests.push_back(std::make_pair(Interest("/a/b/c/d/e/f/g/h/i"),
165 this->data.back()));
166 this->interests.push_back(std::make_pair(Interest("/a/b/c/d/e/f/g/h/i/j"),
167 this->data.back()));
168 this->interests.push_back(std::make_pair(Interest("/a/b/c/d/e/f/g/h/i/j/k"),
169 this->data.back()));
170 this->interests.push_back(std::make_pair(Interest("/a/b/c/d/e/f/g/h/i/j/k/l"),
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/m"),
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/n"),
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/o"),
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/p"),
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/q"),
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/r"),
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/s"),
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/t"),
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/u"),
189 this->data.back()));
190 this->interests.push_back(
Weiqi Shi28a90fb2014-07-09 10:28:55 -0700191 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"),
192 this->data.back()));
Alexander Afanasyevb0c78ea2014-04-15 18:12:04 -0700193 this->interests.push_back(
Weiqi Shi28a90fb2014-07-09 10:28:55 -0700194 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"),
195 this->data.back()));
Alexander Afanasyevb0c78ea2014-04-15 18:12:04 -0700196 this->interests.push_back(
197 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"),
198 this->data.back()));
199 this->interests.push_back(
200 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"),
201 this->data.back()));
202 this->interests.push_back(
203 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"),
204 this->data.back()));
205 }
206};
207
208
Alexander Afanasyevb7e8a812014-07-23 01:36:47 -0700209class BasicChildSelectorDataset : public DatasetBase
Alexander Afanasyevb0c78ea2014-04-15 18:12:04 -0700210{
211public:
212 static const std::string&
213 getName()
214 {
Alexander Afanasyevb7e8a812014-07-23 01:36:47 -0700215 static std::string name = "BasicChildSelectorDataset";
Alexander Afanasyevb0c78ea2014-04-15 18:12:04 -0700216 return name;
217 }
218
Alexander Afanasyevb7e8a812014-07-23 01:36:47 -0700219 BasicChildSelectorDataset()
Alexander Afanasyevb0c78ea2014-04-15 18:12:04 -0700220 {
221 this->data.push_back(createData("/a/1"));
222 this->data.push_back(createData("/b/1"));
223 this->interests.push_back(std::make_pair(Interest()
Weiqi Shi28a90fb2014-07-09 10:28:55 -0700224 .setName("/b")
225 .setSelectors(Selectors()
226 .setChildSelector(0)),
227 this->data.back()));
Alexander Afanasyevb0c78ea2014-04-15 18:12:04 -0700228
229 this->data.push_back(createData("/c/1"));
230 this->data.push_back(createData("/b/99"));
231 this->interests.push_back(std::make_pair(Interest()
Weiqi Shi28a90fb2014-07-09 10:28:55 -0700232 .setName("/b")
233 .setSelectors(Selectors()
234 .setChildSelector(1)),
235 this->data.back()));
Alexander Afanasyevb0c78ea2014-04-15 18:12:04 -0700236 this->data.push_back(createData("/b/5"));
237 this->data.push_back(createData("/b/55"));
238 }
239};
240
Weiqi Shi28a90fb2014-07-09 10:28:55 -0700241
Alexander Afanasyevb7e8a812014-07-23 01:36:47 -0700242class ExtendedChildSelectorDataset : public DatasetBase
Weiqi Shi28a90fb2014-07-09 10:28:55 -0700243{
244public:
245 static const std::string&
246 getName()
247 {
248 static std::string name = "storage";
249 return name;
250 }
251
Alexander Afanasyevb7e8a812014-07-23 01:36:47 -0700252 ExtendedChildSelectorDataset()
Weiqi Shi28a90fb2014-07-09 10:28:55 -0700253 {
254 this->data.push_back(createData("/a/b/1"));
Alexander Afanasyevb7e8a812014-07-23 01:36:47 -0700255
Weiqi Shi28a90fb2014-07-09 10:28:55 -0700256 this->data.push_back(createData("/a/c/1"));
Alexander Afanasyevb7e8a812014-07-23 01:36:47 -0700257 this->interests.push_back(std::make_pair(Interest("/a")
258 .setSelectors(Selectors()
259 .setChildSelector(1)),
260 this->data.back()));
Weiqi Shi28a90fb2014-07-09 10:28:55 -0700261
262 this->data.push_back(createData("/a/c/2"));
Weiqi Shi28a90fb2014-07-09 10:28:55 -0700263
264 this->data.push_back(createData("/b"));
Weiqi Shi28a90fb2014-07-09 10:28:55 -0700265 }
266};
267
Alexander Afanasyevb7e8a812014-07-23 01:36:47 -0700268
269class ComplexSelectorsDataset : public DatasetBase
Weiqi Shi28a90fb2014-07-09 10:28:55 -0700270{
271public:
Alexander Afanasyevb7e8a812014-07-23 01:36:47 -0700272 static const std::string&
273 getName()
274 {
275 static std::string name = "ComplexSelectorsDataset";
276 return name;
277 }
Weiqi Shi28a90fb2014-07-09 10:28:55 -0700278
Alexander Afanasyevb7e8a812014-07-23 01:36:47 -0700279 std::map<std::string, shared_ptr<Data> > map;
Weiqi Shi28a90fb2014-07-09 10:28:55 -0700280
Alexander Afanasyevb7e8a812014-07-23 01:36:47 -0700281 void
282 addData(const std::string& name)
283 {
284 }
Weiqi Shi28a90fb2014-07-09 10:28:55 -0700285
Alexander Afanasyevb7e8a812014-07-23 01:36:47 -0700286 ComplexSelectorsDataset()
287 {
288 // Dataset
289 this->data.push_back(createData("/a/b/c"));
290 this->data.push_back(createData("/a/b/d/1"));
291 this->data.push_back(createData("/a/b/d/2"));
292 this->data.push_back(createData("/a/b/d/3"));
293 this->data.push_back(createData("/a/b/d/4/I"));
294 this->data.push_back(createData("/a/b/d/4"));
295 this->data.push_back(createData("/a/b/d"));
296 this->data.push_back(createData("/a/b/e/1"));
297 this->data.push_back(createData("/a/b/e"));
Weiqi Shi28a90fb2014-07-09 10:28:55 -0700298
Alexander Afanasyevb7e8a812014-07-23 01:36:47 -0700299 // Basic selects
300 this->interests.push_back(std::make_pair(Interest("/a/b/c"), this->getData("/a/b/c")));
Alexander Afanasyev595b2bd2014-12-14 12:55:36 -0800301 this->interests.push_back(std::make_pair(Interest("/a/b/d"), this->getData("/a/b/d")));
Alexander Afanasyevb7e8a812014-07-23 01:36:47 -0700302 this->interests.push_back(std::make_pair(Interest("/a/b/d/1"), this->getData("/a/b/d/1")));
303 this->interests.push_back(std::make_pair(Interest("/a/b/d/2"), this->getData("/a/b/d/2")));
304 this->interests.push_back(std::make_pair(Interest("/a/b/d/3"), this->getData("/a/b/d/3")));
305 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 -0800306 this->interests.push_back(std::make_pair(Interest("/a/b/d/4"), this->getData("/a/b/d/4")));
307 this->interests.push_back(std::make_pair(Interest("/a/b/e"), this->getData("/a/b/e")));
Alexander Afanasyevb7e8a812014-07-23 01:36:47 -0700308 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 -0700309
Alexander Afanasyevb7e8a812014-07-23 01:36:47 -0700310 // Complex selects
311 this->interests.push_back(std::make_pair(Interest("/a/b")
312 .setSelectors(Selectors()
313 .setMinSuffixComponents(2)
314 .setMaxSuffixComponents(2)),
315 this->getData("/a/b/c")));
Weiqi Shi28a90fb2014-07-09 10:28:55 -0700316
Alexander Afanasyevb7e8a812014-07-23 01:36:47 -0700317 this->interests.push_back(std::make_pair(Interest("/a/b/d")
318 .setSelectors(Selectors()
319 .setMinSuffixComponents(-1)
320 .setChildSelector(0)),
Alexander Afanasyev595b2bd2014-12-14 12:55:36 -0800321 this->getData("/a/b/d")));
Weiqi Shi28a90fb2014-07-09 10:28:55 -0700322
Alexander Afanasyevb7e8a812014-07-23 01:36:47 -0700323 this->interests.push_back(std::make_pair(Interest("/a/b/d")
324 .setSelectors(Selectors()
325 .setMinSuffixComponents(2)
326 .setChildSelector(0)),
327 this->getData("/a/b/d/1")));
Weiqi Shi28a90fb2014-07-09 10:28:55 -0700328
Alexander Afanasyevb7e8a812014-07-23 01:36:47 -0700329 this->interests.push_back(std::make_pair(
330 Interest("/a/b/d")
331 .setSelectors(Selectors()
332 .setChildSelector(1)
333 .setMaxSuffixComponents(2)
334 .setMinSuffixComponents(2)
335 .setExclude(Exclude()
336 .excludeRange(ndn::name::Component("3"),
337 ndn::name::Component("4")))),
338 this->getData("/a/b/d/2")));
Weiqi Shi28a90fb2014-07-09 10:28:55 -0700339
340
Alexander Afanasyevb7e8a812014-07-23 01:36:47 -0700341 this->interests.push_back(std::make_pair(Interest("/a/b/d")
342 .setSelectors(Selectors().setMinSuffixComponents(3)),
343 this->getData("/a/b/d/4/I")));
Weiqi Shi28a90fb2014-07-09 10:28:55 -0700344
Alexander Afanasyevb7e8a812014-07-23 01:36:47 -0700345 // According to selector definition, RightMost for the next level and LeftMost for the next-next level
346 this->interests.push_back(std::make_pair(Interest("/a/b/d")
347 .setSelectors(Selectors()
348 .setMinSuffixComponents(2)
349 .setChildSelector(1)),
Alexander Afanasyev595b2bd2014-12-14 12:55:36 -0800350 this->getData("/a/b/d/4")));
Weiqi Shif0330d52014-07-09 10:54:27 -0700351
Alexander Afanasyevb7e8a812014-07-23 01:36:47 -0700352 // because of the digest component, /a/b/d will be to the right of /a/b/d/4
353 this->interests.push_back(std::make_pair(Interest("/a/b/d")
354 .setSelectors(Selectors()
355 .setChildSelector(1)),
Alexander Afanasyev595b2bd2014-12-14 12:55:36 -0800356 this->getData("/a/b/d/4")));
Weiqi Shi28a90fb2014-07-09 10:28:55 -0700357
Alexander Afanasyevb7e8a812014-07-23 01:36:47 -0700358 // Alex: this interest doesn't make sense, as all Data packets will have the same selector
359 this->interests.push_back(std::make_pair(Interest("/a/b/e")
360 .setSelectors(Selectors()
361 .setPublisherPublicKeyLocator(
362 this->data.back()
363 ->getSignature().getKeyLocator())),
Alexander Afanasyev595b2bd2014-12-14 12:55:36 -0800364 this->getData("/a/b/e")));
Weiqi Shi28a90fb2014-07-09 10:28:55 -0700365
Alexander Afanasyevb7e8a812014-07-23 01:36:47 -0700366 // Removals
367 this->removals.push_back(std::make_pair(Interest("/a/b/d/2"), 1));
Weiqi Shif0330d52014-07-09 10:54:27 -0700368
Alexander Afanasyevb7e8a812014-07-23 01:36:47 -0700369 this->removals.push_back(std::make_pair(
370 Interest("/a/b/d")
371 .setSelectors(Selectors()
372 .setMaxSuffixComponents(2)
373 .setMinSuffixComponents(2)
374 .setExclude(Exclude()
375 .excludeOne(ndn::name::Component("3")))),
376 2));
377 }
Weiqi Shi28a90fb2014-07-09 10:28:55 -0700378};
Alexander Afanasyevb0c78ea2014-04-15 18:12:04 -0700379
Weiqi Shi28a90fb2014-07-09 10:28:55 -0700380
Alexander Afanasyevb7e8a812014-07-23 01:36:47 -0700381typedef boost::mpl::vector< BasicDataset,
382 FetchByPrefixDataset,
383 BasicChildSelectorDataset,
384 ExtendedChildSelectorDataset,
385 SamePrefixDataset<10>,
386 SamePrefixDataset<100> > CommonDatasets;
Weiqi Shi28a90fb2014-07-09 10:28:55 -0700387
Alexander Afanasyevb0c78ea2014-04-15 18:12:04 -0700388
389} // namespace tests
390} // namespace repo
391
392#endif // REPO_TESTS_DATASET_FIXTURES_HPP