4 #include <boost/test/auto_unit_test.hpp>
7 #include "zypp/ZYppFactory.h"
8 #include "zypp/PoolQuery.h"
9 #include "zypp/PoolQueryUtil.tcc"
10 #include "zypp/TmpPath.h"
12 #define BOOST_TEST_MODULE PoolQuery
18 using namespace boost::unit_test;
20 bool result_cb( const sat::Solvable & solvable )
22 zypp::PoolItem pi( zypp::ResPool::instance().find( solvable ) );
23 cout << pi.resolvable() << endl;
24 // name: yast2-sound 2.16.2-9 i586
28 static void init_pool()
30 Pathname dir(TESTS_SRC_DIR);
31 dir += "/zypp/data/PoolQuery";
33 ZYpp::Ptr z = getZYpp();
34 ZConfig::instance().setSystemArchitecture(Arch("i586"));
36 RepoInfo i1; i1.setAlias("factory");
37 sat::Pool::instance().addRepoSolv(dir / "factory.solv", i1);
38 RepoInfo i2; i2.setAlias("factory-nonoss");
39 sat::Pool::instance().addRepoSolv(dir / "factory-nonoss.solv", i2);
40 RepoInfo i3; i3.setAlias("zypp_svn");
41 sat::Pool::instance().addRepoSolv(dir / "zypp_svn.solv", i3);
42 RepoInfo i4; i4.setAlias("@System");
43 sat::Pool::instance().addRepoSolv(dir / "@System.solv", i4);
46 BOOST_AUTO_TEST_CASE(pool_query_init)
51 BOOST_AUTO_TEST_CASE(pool_query_exp)
53 cout << "****exp****" << endl;
56 q.addString("zypper");
57 q.addAttribute(sat::SolvAttr::name);
59 // should list 2 selectables
60 for (PoolQuery::Selectable_iterator it = q.selectableBegin();
61 it != q.selectableEnd(); ++it)
63 ui::Selectable::Ptr s = *it;
64 cout << s->kind() << ":" << s->name() << " hasinstalled: " << s->installedEmpty() << endl;
67 std::for_each(q.begin(), q.end(), &result_cb);
70 /////////////////////////////////////////////////////////////////////////////
72 /////////////////////////////////////////////////////////////////////////////
74 // no conditions, default query
75 // result: all available resolvables
76 BOOST_AUTO_TEST_CASE(pool_query_000)
78 cout << "****000****" << endl;
80 cout << q.size() << endl;
81 BOOST_CHECK(q.size() == 11451);
82 /**!\todo should be 11453 probably according to:
83 * dumpsolv factory.solv factory-nonoss.solv zypp_svn.solv \@System.solv | \
84 * grep '^name:.*\(noarch\|i386\|i586\|i686\|src\)$' | wc -l
88 // default query + one search string
89 // q.addString("foo");
90 // result: all resolvables having at least one attribute matching foo
91 BOOST_AUTO_TEST_CASE(pool_query_001)
93 cout << "****001****" << endl;
95 q.addString("zypper");
97 std::for_each(q.begin(), q.end(), &result_cb);
98 BOOST_CHECK(q.size() == 16);
101 // default query + one attribute + one string
102 // q.addAttribute(foo, bar);
103 // should be the same as
104 // q.addAttribute(foo); q.addString(bar);
105 // result: resolvables with foo containing bar
106 BOOST_AUTO_TEST_CASE(pool_query_002)
108 cout << "****002****" << endl;
110 q.addString("zypper");
111 q.addAttribute(sat::SolvAttr::name);
113 std::for_each(q.begin(), q.end(), &result_cb);
114 BOOST_CHECK(q.size() == 6);
119 q1.addAttribute(sat::SolvAttr::name, "zypper");
121 std::for_each(q1.begin(), q1.end(), &result_cb);
122 BOOST_CHECK(q1.size() == 6);
126 BOOST_AUTO_TEST_CASE(pool_query_003)
128 cout << "****003****" << endl;
130 q.addString("zypper");
131 q.addAttribute(sat::SolvAttr::name);
132 q.addKind(ResTraits<Package>::kind);
134 std::for_each(q.begin(), q.end(), &result_cb);
135 BOOST_CHECK(q.size() == 3);
139 BOOST_AUTO_TEST_CASE(pool_query_004)
141 cout << "****004****" << endl;
144 q.addAttribute(sat::SolvAttr::name);
147 std::for_each(q.begin(), q.end(), &result_cb);
148 BOOST_CHECK(q.size() == 3);
151 q1.addString("zypp");
152 q1.addAttribute(sat::SolvAttr::name);
155 std::for_each(q1.begin(), q1.end(), &result_cb);
156 BOOST_CHECK(q1.empty());
160 BOOST_AUTO_TEST_CASE(pool_query_005)
162 cout << "****005.1****" << endl;
165 q.addAttribute(sat::SolvAttr::name);
168 std::for_each(q.begin(), q.end(), &result_cb);
169 BOOST_CHECK(q.size() == 11);
171 cout << "****005.2****" << endl;
174 q1.addString("*zypp*");
175 q1.addAttribute(sat::SolvAttr::name);
178 std::for_each(q1.begin(), q1.end(), &result_cb);
179 BOOST_CHECK(q1.size() == 28);
181 cout << "****005.3****" << endl;
183 // should be the same as above
185 q2.addString("zypp");
186 q2.addAttribute(sat::SolvAttr::name);
188 BOOST_CHECK(q2.size() == 28);
192 BOOST_AUTO_TEST_CASE(pool_query_006)
194 cout << "****006.1***" << endl;
196 // should be the same as 005 1
198 q.addString("^z.p.*");
199 q.addAttribute(sat::SolvAttr::name);
202 std::for_each(q.begin(), q.end(), &result_cb);
203 BOOST_CHECK(q.size() == 11);
205 cout << "****006.2***" << endl;
208 q1.addString("zypper|smart");
209 q1.addAttribute(sat::SolvAttr::name);
212 std::for_each(q1.begin(), q1.end(), &result_cb);
213 BOOST_CHECK(q1.size() == 21);
215 cout << "****006.3***" << endl;
219 q2.addString("zypp\\");
221 BOOST_CHECK_THROW(q2.size(), Exception);
225 // match by installed status (basically by system vs. repo)
226 BOOST_AUTO_TEST_CASE(pool_query_050)
228 cout << "****050****" << endl;
230 q.addString("zypper");
231 q.addAttribute(sat::SolvAttr::name);
233 q.setInstalledOnly();
235 std::for_each(q.begin(), q.end(), &result_cb);
236 BOOST_CHECK(q.size() == 1);
241 q1.addString("zypper");
242 q1.addAttribute(sat::SolvAttr::name);
244 q1.setUninstalledOnly();
246 std::for_each(q1.begin(), q1.end(), &result_cb);
247 BOOST_CHECK(q1.size() == 5);
251 /////////////////////////////////////////////////////////////////////////////
252 // 1xx multiple attribute queries
253 /////////////////////////////////////////////////////////////////////////////
256 BOOST_AUTO_TEST_CASE(pool_query_100)
258 cout << "****100****" << endl;
260 /* This string is found sometimes only in solvable names (e.g. novell-lum),
261 sometimes only in summary (e.g. yast2-casa-ats) and sometimes only
262 in descriptions (e.g. beagle-quickfinder). novell-lum doesn't exist
263 in our test solv file, but let's ignore this. I didn't find a string
264 with the same characteristics giving fewer matches :-/ */
265 q.addString("novell");
266 q.addAttribute(sat::SolvAttr::name);
267 q.addAttribute(sat::SolvAttr::summary);
268 q.addAttribute(sat::SolvAttr::description);
270 std::for_each(q.begin(), q.end(), &result_cb);
271 BOOST_CHECK(q.size() == 74);
277 q1.addAttribute(sat::SolvAttr::name);
279 std::for_each(q1.begin(), q1.end(), &result_cb);
280 BOOST_CHECK(q1.size() == 7);
284 // multi attr (same value) substring matching (case sensitive and insensitive)
285 BOOST_AUTO_TEST_CASE(pool_query_101)
287 cout << "****101****" << endl;
291 q.addAttribute(sat::SolvAttr::name);
292 q.addAttribute(sat::SolvAttr::summary);
293 q.addAttribute(sat::SolvAttr::description);
295 std::for_each(q.begin(), q.end(), &result_cb);
296 BOOST_CHECK(q.size() == 30);
301 q2.addString("ZYpp");
302 q2.addAttribute(sat::SolvAttr::name);
303 q2.addAttribute(sat::SolvAttr::summary);
304 q2.addAttribute(sat::SolvAttr::description);
305 q2.setCaseSensitive();
307 std::for_each(q2.begin(), q2.end(), &result_cb);
308 BOOST_CHECK(q2.size() == 2);
312 // multi attr (same value) glob matching (case sensitive and insensitive)
313 BOOST_AUTO_TEST_CASE(pool_query_102)
315 cout << "****102****" << endl;
317 q.addString("pack*");
318 q.addAttribute(sat::SolvAttr::name);
319 q.addAttribute(sat::SolvAttr::summary);
322 std::for_each(q.begin(), q.end(), &result_cb);
323 BOOST_CHECK(q.size() == 35);
327 // multi attr (same value via addAttribute())
328 BOOST_AUTO_TEST_CASE(pool_query_103)
330 cout << "****103.1****" << endl;
332 q.addAttribute(sat::SolvAttr::name, "novell");
333 q.addAttribute(sat::SolvAttr::summary, "novell");
335 // std::for_each(q.begin(), q.end(), &result_cb);
336 BOOST_CHECK(q.size() == 42);
338 cout << "****103.2****" << endl;
341 q1.addString("novell");
342 q1.addAttribute(sat::SolvAttr::name);
343 q1.addAttribute(sat::SolvAttr::summary);
345 // std::for_each(q1.begin(), q1.end(), &result_cb);
346 BOOST_CHECK(q1.size() == 42);
351 // multiple attributes, different search strings (one string per attrbute)
352 BOOST_AUTO_TEST_CASE(pool_query_104)
354 cout << "****104****" << endl;
356 q.addAttribute(sat::SolvAttr::name, "novell");
357 q.addAttribute(sat::SolvAttr::summary, "package management");
359 std::for_each(q.begin(), q.end(), &result_cb);
360 BOOST_CHECK(q.size() == 22);
363 // multiple attributes, different search strings (one string per attrbute), regex matching
364 BOOST_AUTO_TEST_CASE(pool_query_105)
366 cout << "****105****" << endl;
368 q.addAttribute(sat::SolvAttr::name, "no.ell");
369 q.addAttribute(sat::SolvAttr::summary, "package management");
372 std::for_each(q.begin(), q.end(), &result_cb);
373 BOOST_CHECK(q.size() == 22);
376 /////////////////////////////////////////////////////////////////////////////
377 // 3xx repo filter queries (addRepo(alias_str))
378 /////////////////////////////////////////////////////////////////////////////
380 // default query + one attribute(one string) + one repo
381 BOOST_AUTO_TEST_CASE(pool_query_300)
383 cout << "****300****" << endl;
385 q.addAttribute(sat::SolvAttr::name, "zypper");
386 q.addRepo("zypp_svn");
388 std::for_each(q.begin(), q.end(), &result_cb);
389 BOOST_CHECK(q.size() == 3);
392 // default query + one repo
393 BOOST_AUTO_TEST_CASE(pool_query_301)
395 cout << "****301****" << endl;
397 q.addRepo("zypp_svn");
399 std::for_each(q.begin(), q.end(), &result_cb);
400 BOOST_CHECK(q.size() == 21);
403 // multiple repos + one attribute
404 BOOST_AUTO_TEST_CASE(pool_query_302)
406 cout << "****302****" << endl;
409 q.addAttribute(sat::SolvAttr::name);
410 q.addRepo("factory-nonoss");
411 q.addRepo("zypp_svn");
413 std::for_each(q.begin(), q.end(), &result_cb);
414 BOOST_CHECK(q.size() == 8);
418 BOOST_AUTO_TEST_CASE(pool_query_X)
420 cout << "****X****" << endl;
422 q.addString("pack*");
423 q.addAttribute(sat::SolvAttr::name);
425 std::for_each(q.begin(), q.end(), &result_cb);
426 BOOST_CHECK(q.size() == 28);
431 BOOST_AUTO_TEST_CASE(pool_query_recovery)
433 Pathname testfile(TESTS_SRC_DIR);
434 testfile += "/zypp/data/PoolQuery/savedqueries";
435 cout << "****recovery****" << endl;
436 std::vector<PoolQuery> queries;
437 std::insert_iterator<std::vector<PoolQuery> > ii( queries,queries.begin());
438 readPoolQueriesFromFile(testfile,ii);
439 BOOST_REQUIRE_MESSAGE(queries.size()==2,"Bad count of readed queries.");
440 BOOST_CHECK(queries[0].size() == 8);
443 q.addRepo("factory");
444 q.addKind(Resolvable::Kind::patch);
447 q.setCaseSensitive();
448 q.setUninstalledOnly();
449 BOOST_CHECK(q==queries[1]);
454 BOOST_AUTO_TEST_CASE(pool_query_serialize)
458 q.addAttribute(sat::SolvAttr::name);
459 q.addRepo("factory-nonoss");
460 q.addRepo("zypp_svn");
462 q2.addAttribute(sat::SolvAttr::name,"ma");
463 q2.addRepo("factory-nonoss");
464 q2.addRepo("zypp_svn");
467 // Pathname testfile(TESTS_SRC_DIR);
468 // testfile += "/zypp/data/PoolQuery/testqueries";
469 filesystem::TmpFile testfile;
470 cout << "****serialize****" << endl;
471 std::vector<PoolQuery> queries;
472 queries.push_back(q);
473 queries.push_back(q2);
474 writePoolQueriesToFile(testfile,queries.begin(),queries.end());
475 BOOST_REQUIRE_MESSAGE(queries.size()==2,"Bad count of added queries.");
477 std::insert_iterator<std::vector<PoolQuery> > ii( queries,queries.end());
478 readPoolQueriesFromFile(testfile,ii);
479 BOOST_REQUIRE_MESSAGE(queries.size()==4,"Bad count of writed/readed queries.");
480 BOOST_CHECK(queries[2] == queries[0]);
481 BOOST_CHECK(queries[3] == queries[1]);
486 BOOST_AUTO_TEST_CASE(pool_query_equal)
488 cout << "****equal****" << endl;
491 q.addAttribute(sat::SolvAttr::name);
494 q2.addString("zypp");
495 q2.addAttribute(sat::SolvAttr::name);
498 q3.addString("zypp");
499 q3.addAttribute(sat::SolvAttr::name);
501 q3.setRequireAll(true);
503 q4.addAttribute(sat::SolvAttr::name,"zypp");