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 /////////////////////////////////////////////////////////////////////////////
53 /////////////////////////////////////////////////////////////////////////////
55 // no conditions, default query
56 // result: all available resolvables
57 BOOST_AUTO_TEST_CASE(pool_query_000)
59 cout << "****000****" << endl;
61 cout << q.size() << endl;
62 BOOST_CHECK(q.size() == 11451);
63 /**!\todo should be 11453 probably according to:
64 * dumpsolv factory.solv factory-nonoss.solv zypp_svn.solv \@System.solv | \
65 * grep '^name:.*\(noarch\|i386\|i586\|i686\|src\)$' | wc -l
69 // default query + one search string
70 // q.addString("foo");
71 // result: all resolvables having at least one attribute matching foo
72 BOOST_AUTO_TEST_CASE(pool_query_001)
74 cout << "****001****" << endl;
76 q.addString("zypper");
78 std::for_each(q.begin(), q.end(), &result_cb);
79 BOOST_CHECK(q.size() == 16);
82 // default query + one attribute + one string
83 // q.addAttribute(foo, bar);
84 // should be the same as
85 // q.addAttribute(foo); q.addString(bar);
86 // result: resolvables with foo containing bar
87 BOOST_AUTO_TEST_CASE(pool_query_002)
89 cout << "****002****" << endl;
91 q.addString("zypper");
92 q.addAttribute(sat::SolvAttr::name);
94 std::for_each(q.begin(), q.end(), &result_cb);
95 BOOST_CHECK(q.size() == 6);
100 q1.addAttribute(sat::SolvAttr::name, "zypper");
102 std::for_each(q1.begin(), q1.end(), &result_cb);
103 BOOST_CHECK(q1.size() == 6);
107 BOOST_AUTO_TEST_CASE(pool_query_003)
109 cout << "****003****" << endl;
111 q.addString("zypper");
112 q.addAttribute(sat::SolvAttr::name);
113 q.addKind(ResTraits<Package>::kind);
115 std::for_each(q.begin(), q.end(), &result_cb);
116 BOOST_CHECK(q.size() == 3);
120 BOOST_AUTO_TEST_CASE(pool_query_004)
122 cout << "****004****" << endl;
125 q.addAttribute(sat::SolvAttr::name);
128 std::for_each(q.begin(), q.end(), &result_cb);
129 BOOST_CHECK(q.size() == 3);
132 q1.addString("zypp");
133 q1.addAttribute(sat::SolvAttr::name);
136 std::for_each(q1.begin(), q1.end(), &result_cb);
137 BOOST_CHECK(q1.empty());
141 BOOST_AUTO_TEST_CASE(pool_query_005)
143 cout << "****005****" << endl;
146 q.addAttribute(sat::SolvAttr::name);
149 std::for_each(q.begin(), q.end(), &result_cb);
150 BOOST_CHECK(q.size() == 11);
155 q1.addString("*zypp*");
156 q1.addAttribute(sat::SolvAttr::name);
159 std::for_each(q1.begin(), q1.end(), &result_cb);
160 BOOST_CHECK(q1.size() == 28);
162 // should be the same as above
164 q2.addString("zypp");
165 q2.addAttribute(sat::SolvAttr::name);
167 BOOST_CHECK(q2.size() == 28);
170 // match by installed status (basically by system vs. repo)
171 BOOST_AUTO_TEST_CASE(pool_query_006)
173 cout << "****006****" << endl;
175 q.addString("zypper");
176 q.addAttribute(sat::SolvAttr::name);
178 q.setInstalledOnly();
180 std::for_each(q.begin(), q.end(), &result_cb);
181 BOOST_CHECK(q.size() == 1);
186 q1.addString("zypper");
187 q1.addAttribute(sat::SolvAttr::name);
189 q1.setUninstalledOnly();
191 std::for_each(q1.begin(), q1.end(), &result_cb);
192 BOOST_CHECK(q1.size() == 5);
195 /////////////////////////////////////////////////////////////////////////////
196 // 1xx multiple attribute queries
197 /////////////////////////////////////////////////////////////////////////////
200 BOOST_AUTO_TEST_CASE(pool_query_100)
202 cout << "****100****" << endl;
204 q.addString("browser");
205 q.addAttribute(sat::SolvAttr::name);
206 q.addAttribute(sat::SolvAttr::summary);
207 q.addAttribute(sat::SolvAttr::description);
209 std::for_each(q.begin(), q.end(), &result_cb);
210 BOOST_CHECK(q.size() == 15);
215 q1.addString("browser");
216 q1.addAttribute(sat::SolvAttr::name);
218 std::for_each(q1.begin(), q1.end(), &result_cb);
219 BOOST_CHECK(q1.size() == 5);
223 // multi attr (same value) substring matching (case sensitive and insensitive)
224 BOOST_AUTO_TEST_CASE(pool_query_10)
226 cout << "****10****" << endl;
230 q.addAttribute(sat::SolvAttr::name);
231 q.addAttribute(sat::SolvAttr::summary);
232 q.addAttribute(sat::SolvAttr::description);
234 std::for_each(q.begin(), q.end(), &result_cb);
235 cout << q.size() << endl;
236 BOOST_CHECK(q.size() == 17);
242 q2.addAttribute(sat::SolvAttr::name);
243 q2.addAttribute(sat::SolvAttr::summary);
244 q2.addAttribute(sat::SolvAttr::description);
245 q2.setCaseSensitive();
247 std::for_each(q2.begin(), q2.end(), &result_cb);
248 cout << q2.size() << endl;
252 // multi attr (same value) glob matching (case sensitive and insensitive)
253 BOOST_AUTO_TEST_CASE(pool_query_11)
255 cout << "****11****" << endl;
257 q.addString("pack*");
258 q.addAttribute(sat::SolvAttr::name);
259 q.addAttribute(sat::SolvAttr::summary);
262 std::for_each(q.begin(), q.end(), &result_cb);
263 cout << q.asString() << endl;
264 // BOOST_CHECK(q.size() == 11);
268 /////////////////////////////////////////////////////////////////////////////
269 // 3xx repo filter queries (addRepo(alias_str))
270 /////////////////////////////////////////////////////////////////////////////
272 // default query + one attribute(one string) + one repo
273 BOOST_AUTO_TEST_CASE(pool_query_300)
275 cout << "****300****" << endl;
277 q.addAttribute(sat::SolvAttr::name, "zypper");
278 q.addRepo("zypp_svn");
280 std::for_each(q.begin(), q.end(), &result_cb);
281 BOOST_CHECK(q.size() == 3);
284 // default query + one repo
285 BOOST_AUTO_TEST_CASE(pool_query_301)
287 cout << "****301****" << endl;
289 q.addRepo("zypp_svn");
291 std::for_each(q.begin(), q.end(), &result_cb);
292 BOOST_CHECK(q.size() == 21);
295 // multiple repos + one attribute
296 BOOST_AUTO_TEST_CASE(pool_query_302)
298 cout << "****302****" << endl;
301 q.addAttribute(sat::SolvAttr::name);
302 q.addRepo("factory-nonoss");
303 q.addRepo("zypp_svn");
305 std::for_each(q.begin(), q.end(), &result_cb);
306 BOOST_CHECK(q.size() == 8);
310 BOOST_AUTO_TEST_CASE(pool_query_X)
312 cout << "****X****" << endl;
314 q.addString("pack*");
315 q.addAttribute(sat::SolvAttr::name);
317 std::for_each(q.begin(), q.end(), &result_cb);
318 BOOST_CHECK(q.size() == 28);
323 BOOST_AUTO_TEST_CASE(pool_query_equal)
325 cout << "****equal****" << endl;
328 q.addAttribute(sat::SolvAttr::name);
331 q2.addString("zypp");
332 q2.addAttribute(sat::SolvAttr::name);
335 q3.addString("zypp");
336 q3.addAttribute(sat::SolvAttr::name);
338 q3.setRequireAll(true);
340 q4.addAttribute(sat::SolvAttr::name,"zypp");
343 BOOST_CHECK(equal(q,q2));
344 BOOST_CHECK(!equal(q,q3));
345 //only exact equal! \TODO maybe change
346 BOOST_CHECK(!equal(q,q4));
347 BOOST_CHECK(!equal(q4,q3));
351 BOOST_AUTO_TEST_CASE(pool_query_save_restore)
353 #warning CAN NOT USE A FIX SOLV FILE
354 // must store some raw metadata and generate the solv file
355 // otherwise trestcases break whenever the solv format changes
357 Pathname dir(TESTS_SRC_DIR);
358 dir += "/zypp/data/PoolQuery";
360 ZYpp::Ptr z = getZYpp();
362 sat::Pool::instance().addRepoSolv(dir + "foo.solv");
365 //query.setInstalledOnly();
366 query.execute("kde", &result_cb);
368 cout << "search done." << endl;
370 query.setMatchExact(true);
371 query.execute("kde", &result_cb);
373 cout << "search done." << endl;
376 //test recovery from file
377 Pathname pathToQueries(TESTS_SRC_DIR);
378 pathToQueries += "/zypp/data/PoolQuery/savedqueries";
380 std::list<PoolQuery> savedQueries;
382 std::insert_iterator<std::list<PoolQuery> > ii(savedQueries, savedQueries.end());
383 readPoolQueriesFromFile(pathToQueries,ii);
384 BOOST_CHECK( savedQueries.size() == 2 );
386 filesystem::TmpFile tmp;
387 Pathname tmpPath = tmp.path();
389 savedQueries.clear();
394 q1.addKind( Resolvable::Kind::patch );
395 q2.addKind( Resolvable::Kind::patch );
396 q2.addKind( Resolvable::Kind::pattern );
398 savedQueries.push_front( q1 );
399 savedQueries.push_front( q2 );
401 writePoolQueriesToFile ( tmpPath, savedQueries.begin(), savedQueries.end() );
402 std::insert_iterator<std::list<PoolQuery> > ii2(savedQueries,
404 //reread writed queries
405 readPoolQueriesFromFile( tmpPath, ii2);
406 //TODO test if 0==2 and 1==3
407 BOOST_CHECK( savedQueries.size() == 4 );