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 // no conditions, default query
52 // result: all available resolvables
53 BOOST_AUTO_TEST_CASE(pool_query_1)
55 cout << "****1****" << endl;
57 cout << q.size() << endl;
58 BOOST_CHECK(q.size() == 11451);
59 //!\todo should be 11453 probably according to:
60 // dumpsolv factory.solv factory-nonoss.solv zypp_svn.solv \@System.solv | \
61 // grep '^name:.*\(noarch\|i386\|i586\|i686\|src\)$' | wc -l
64 // default query + one search string
65 // q.addString("foo");
66 // result: all resolvables having at least one attribute matching foo
67 BOOST_AUTO_TEST_CASE(pool_query_2)
69 cout << "****2****" << endl;
71 q.addString("zypper");
73 std::for_each(q.begin(), q.end(), &result_cb);
74 BOOST_CHECK(q.size() == 16);
77 // default query + one attribute + one string
78 // q.addAttribute(foo, bar);
79 // should be the same as
80 // q.addAttribute(foo); q.addString(bar);
81 // result: resolvables with foo containing bar
82 BOOST_AUTO_TEST_CASE(pool_query_3)
84 cout << "****3****" << endl;
86 q.addString("zypper");
87 q.addAttribute(sat::SolvAttr::name);
89 std::for_each(q.begin(), q.end(), &result_cb);
90 BOOST_CHECK(q.size() == 6);
95 q1.addAttribute(sat::SolvAttr::name, "zypper");
97 std::for_each(q1.begin(), q1.end(), &result_cb);
98 BOOST_CHECK(q1.size() == 6);
102 // default query + one attribute(one string) + one repo
103 // q.addRepo(foorepo);
104 // q.addAttribute(solvable:name, foo);
106 BOOST_AUTO_TEST_CASE(pool_query_4)
108 cout << "****4****" << endl;
110 q.addAttribute(sat::SolvAttr::name, "zypper");
111 q.addRepo("zypp_svn");
113 std::for_each(q.begin(), q.end(), &result_cb);
114 BOOST_CHECK(q.size() == 3);
117 BOOST_AUTO_TEST_CASE(pool_query_5)
119 cout << "****5****" << endl;
121 q.addRepo("zypp_svn");
123 std::for_each(q.begin(), q.end(), &result_cb);
124 BOOST_CHECK(q.size() == 21);
127 BOOST_AUTO_TEST_CASE(pool_query_6)
129 cout << "****6****" << endl;
131 q.addString("browser");
132 q.addAttribute(sat::SolvAttr::name);
133 q.addAttribute(sat::SolvAttr::summary);
134 q.addAttribute(sat::SolvAttr::description);
136 std::for_each(q.begin(), q.end(), &result_cb);
137 BOOST_CHECK(q.size() == 15);
142 q1.addString("browser");
143 q1.addAttribute(sat::SolvAttr::name);
145 std::for_each(q1.begin(), q1.end(), &result_cb);
146 BOOST_CHECK(q1.size() == 5);
150 BOOST_AUTO_TEST_CASE(pool_query_7)
152 cout << "****7****" << endl;
155 q.addAttribute(sat::SolvAttr::name);
158 std::for_each(q.begin(), q.end(), &result_cb);
159 BOOST_CHECK(q.size() == 3);
162 q1.addString("zypp");
163 q1.addAttribute(sat::SolvAttr::name);
166 std::for_each(q1.begin(), q1.end(), &result_cb);
167 BOOST_CHECK(q1.empty());
170 // match by installed status (basically by system vs. repo)
171 BOOST_AUTO_TEST_CASE(pool_query_8)
173 cout << "****8****" << 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 BOOST_AUTO_TEST_CASE(pool_query_save_restore)
197 #warning CAN NOT USE A FIX SOLV FILE
198 // must store some raw metadata and generate the solv file
199 // otherwise trestcases break whenever the solv format changes
201 Pathname dir(TESTS_SRC_DIR);
202 dir += "/zypp/data/PoolQuery";
204 ZYpp::Ptr z = getZYpp();
206 sat::Pool::instance().addRepoSolv(dir + "foo.solv");
209 //query.setInstalledOnly();
210 query.execute("kde", &result_cb);
212 cout << "search done." << endl;
214 query.setMatchExact(true);
215 query.execute("kde", &result_cb);
217 cout << "search done." << endl;
220 //test recovery from file
221 Pathname pathToQueries(TESTS_SRC_DIR);
222 pathToQueries += "/zypp/data/PoolQuery/savedqueries";
224 std::list<PoolQuery> savedQueries;
226 std::insert_iterator<std::list<PoolQuery> > ii(savedQueries, savedQueries.end());
227 readPoolQueriesFromFile(pathToQueries,ii);
228 BOOST_CHECK( savedQueries.size() == 2 );
230 filesystem::TmpFile tmp;
231 Pathname tmpPath = tmp.path();
233 savedQueries.clear();
238 q1.addKind( Resolvable::Kind::patch );
239 q2.addKind( Resolvable::Kind::patch );
240 q2.addKind( Resolvable::Kind::pattern );
242 savedQueries.push_front( q1 );
243 savedQueries.push_front( q2 );
245 writePoolQueriesToFile ( tmpPath, savedQueries.begin(), savedQueries.end() );
246 std::insert_iterator<std::list<PoolQuery> > ii2(savedQueries,
248 //reread writed queries
249 readPoolQueriesFromFile( tmpPath, ii2);
250 //TODO test if 0==2 and 1==3
251 BOOST_CHECK( savedQueries.size() == 4 );