1 /*
2 * Copyright (C) 2012-2014 Red Hat, Inc.
3 *
4 * Licensed under the GNU Lesser General Public License Version 2.1
5 *
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
10 *
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
15 *
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19 */
20
21
22 #include <solv/util.h>
23
24
25 #include "libdnf/dnf-advisory.h"
26 #include "libdnf/hy-package.h"
27 #include "libdnf/hy-package-private.hpp"
28 #include "libdnf/hy-query.h"
29 #include "libdnf/dnf-reldep.h"
30 #include "libdnf/dnf-reldep-list.h"
31 #include "libdnf/dnf-sack-private.hpp"
32 #include "libdnf/hy-util.h"
33 #include "fixtures.h"
34 #include "test_suites.h"
35 #include "testsys.h"
36
37 #include "libdnf/repo/solvable/Dependency.hpp"
38 #include "libdnf/repo/solvable/DependencyContainer.hpp"
39
START_TEST(test_package_summary)40 START_TEST(test_package_summary)
41 {
42 DnfPackage *pkg = by_name(test_globals.sack, "penny-lib");
43 fail_if(strcmp(dnf_package_get_summary(pkg), "in my ears"));
44 g_object_unref(pkg);
45 }
46 END_TEST
47
START_TEST(test_identical)48 START_TEST(test_identical)
49 {
50 DnfSack *sack = test_globals.sack;
51 DnfPackage *pkg1 = by_name(sack, "penny-lib");
52 DnfPackage *pkg2 = by_name(sack, "flying");
53 DnfPackage *pkg3 = by_name(sack, "penny-lib");
54
55 fail_unless(dnf_package_get_identical(pkg1, pkg3));
56 fail_if(dnf_package_get_identical(pkg2, pkg3));
57
58 g_object_unref(pkg1);
59 g_object_unref(pkg2);
60 g_object_unref(pkg3);
61 }
62 END_TEST
63
START_TEST(test_versions)64 START_TEST(test_versions)
65 {
66 DnfSack *sack = test_globals.sack;
67 unsigned epoch;
68 const char *version, *release;
69 DnfPackage *pkg;
70
71 pkg = by_name(sack, "baby");
72 ck_assert_str_eq(dnf_package_get_evr(pkg), "6:5.0-11");
73 epoch = dnf_package_get_epoch(pkg);
74 fail_unless(epoch == 6);
75 version = dnf_package_get_version(pkg);
76 ck_assert_str_eq(version, "5.0");
77 release = dnf_package_get_release(pkg);
78 ck_assert_str_eq(release, "11");
79 g_object_unref(pkg);
80
81 pkg = by_name(sack, "jay");
82 // epoch missing if it's 0:
83 ck_assert_str_eq(dnf_package_get_evr(pkg), "5.0-0");
84 epoch = dnf_package_get_epoch(pkg);
85 fail_unless(epoch == 0);
86 version = dnf_package_get_version(pkg);
87 ck_assert_str_eq(version, "5.0");
88 release = dnf_package_get_release(pkg);
89 ck_assert_str_eq(release, "0");
90 g_object_unref(pkg);
91 }
92 END_TEST
93
START_TEST(test_vendor)94 START_TEST(test_vendor)
95 {
96 DnfSack *sack = test_globals.sack;
97 DnfPackage *pkg = by_name_repo(sack, "foolish-grin", "vendor");
98 fail_if(pkg == NULL);
99 const char *vendor = dnf_package_get_vendor(pkg);
100
101 ck_assert_str_eq(vendor, "PerfectlyLoud");
102 g_object_unref(pkg);
103 }
104 END_TEST
105
START_TEST(test_no_sourcerpm)106 START_TEST(test_no_sourcerpm)
107 {
108 DnfSack *sack = test_globals.sack;
109 DnfPackage *pkg = by_name(sack, "baby");
110 const char *src = dnf_package_get_sourcerpm(pkg);
111
112 fail_unless(src == NULL);
113 g_object_unref(pkg);
114 }
115 END_TEST
116
START_TEST(test_get_requires)117 START_TEST(test_get_requires)
118 {
119 DnfSack *sack = test_globals.sack;
120 DnfPackage *pkg = by_name(sack, "flying");
121 DnfReldepList *reldeplist = dnf_package_get_requires(pkg);
122
123 fail_unless(dnf_reldep_list_count (reldeplist) == 1);
124 DnfReldep *reldep = dnf_reldep_list_index (reldeplist, 0);
125
126 const char *depstr = dnf_reldep_to_string (reldep);
127 ck_assert_str_eq(depstr, "P-lib >= 3");
128
129 delete reldep;
130 delete reldeplist;
131 g_object_unref(pkg);
132 }
133 END_TEST
134
START_TEST(test_get_more_requires)135 START_TEST(test_get_more_requires)
136 {
137 DnfSack *sack = test_globals.sack;
138 DnfPackage *pkg = by_name(sack, "walrus");
139 DnfReldepList *reldeplist = dnf_package_get_requires(pkg);
140
141 fail_unless(dnf_reldep_list_count (reldeplist) == 2);
142 delete reldeplist;
143 g_object_unref(pkg);
144 }
145 END_TEST
146
START_TEST(test_chksum_fail)147 START_TEST(test_chksum_fail)
148 {
149 DnfSack *sack = test_globals.sack;
150 DnfPackage *pkg = by_name(sack, "walrus");
151 int type;
152
153 const unsigned char *chksum = dnf_package_get_chksum(pkg, &type);
154 fail_unless(chksum == NULL);
155 chksum = dnf_package_get_hdr_chksum(pkg, &type);
156 fail_unless(chksum == NULL);
157 g_object_unref(pkg);
158 }
159 END_TEST
160
START_TEST(test_checksums)161 START_TEST(test_checksums)
162 {
163 DnfPackage *pkg = by_name(test_globals.sack, "mystery-devel");
164 int i;
165 HyChecksum *csum = dnf_package_get_chksum(pkg, &i);
166 fail_unless(i == G_CHECKSUM_SHA256);
167 // Check the first and last bytes. Those need to match against information
168 // in primary.xml.gz.
169 fail_unless(csum[0] == 0x2e);
170 fail_unless(csum[31] == 0xf5);
171
172 g_object_unref(pkg);
173 }
174 END_TEST
175
START_TEST(test_get_files)176 START_TEST(test_get_files)
177 {
178 DnfSack *sack = test_globals.sack;
179
180 DnfPackage *pkg = by_name(sack, "tour");
181 gchar **files = dnf_package_get_files(pkg);
182 int i = 0;
183 char **iter;
184
185 for (iter = files; iter && *iter; iter++)
186 i++;
187 g_assert_cmpint(i, ==, 6);
188 g_strfreev(files);
189 g_object_unref(pkg);
190 }
191 END_TEST
192
START_TEST(test_get_advisories)193 START_TEST(test_get_advisories)
194 {
195 GPtrArray *advisories;
196 DnfSack *sack = test_globals.sack;
197 DnfPackage *pkg = by_name(sack, "tour");
198
199 advisories = dnf_package_get_advisories(pkg, HY_GT);
200 fail_unless(advisories != NULL);
201 ck_assert_int_eq(advisories->len, 1);
202 auto advisory = static_cast<DnfAdvisory *>(g_ptr_array_index(advisories, 0));
203 ck_assert_str_eq(dnf_advisory_get_id(advisory), "FEDORA-2008-9969");
204 g_ptr_array_unref(advisories);
205 g_object_unref(pkg);
206 }
207 END_TEST
208
START_TEST(test_get_advisories_none)209 START_TEST(test_get_advisories_none)
210 {
211 GPtrArray *advisories;
212 DnfSack *sack = test_globals.sack;
213 DnfPackage *pkg = by_name(sack, "mystery-devel");
214
215 advisories = dnf_package_get_advisories(pkg, HY_GT|HY_EQ);
216 fail_unless(advisories != NULL);
217 ck_assert_int_eq(advisories->len, 1);
218 g_ptr_array_unref(advisories);
219
220 advisories = dnf_package_get_advisories(pkg, HY_LT|HY_EQ);
221 fail_unless(advisories != NULL);
222 ck_assert_int_eq(advisories->len, 1);
223 g_ptr_array_unref(advisories);
224
225 g_object_unref(pkg);
226 }
227 END_TEST
228
START_TEST(test_lookup_num)229 START_TEST(test_lookup_num)
230 {
231 DnfPackage *pkg = by_name(test_globals.sack, "tour");
232 guint64 buildtime = dnf_package_get_buildtime(pkg);
233 fail_unless(buildtime > 1330473600); // after 2012-02-29
234 fail_unless(buildtime < 1456704000); // before 2016-02-29
235
236 g_object_unref(pkg);
237 }
238 END_TEST
239
START_TEST(test_installed)240 START_TEST(test_installed)
241 {
242 DnfPackage *pkg1 = by_name_repo(test_globals.sack, "penny-lib", "main");
243 DnfPackage *pkg2 = by_name_repo(test_globals.sack,
244 "penny-lib", HY_SYSTEM_REPO_NAME);
245 int installed1 = dnf_package_installed(pkg1);
246 int installed2 = dnf_package_installed(pkg2);
247 fail_unless(installed1 == 0);
248 fail_unless(installed2 == 1);
249
250 g_object_unref(pkg1);
251 g_object_unref(pkg2);
252 }
253 END_TEST
254
START_TEST(test_two_sacks)255 START_TEST(test_two_sacks)
256 {
257 /* This clumsily mimics create_ut_sack() and setup_with() to
258 * create a second DnfSack. */
259 char *tmpdir = solv_dupjoin(test_globals.tmpdir, "/tmp", NULL);
260 DnfSack *sack1 = dnf_sack_new();
261 dnf_sack_set_arch(sack1, TEST_FIXED_ARCH, NULL);
262 dnf_sack_set_cachedir(sack1, tmpdir);
263 fail_unless(dnf_sack_setup(sack1, DNF_SACK_SETUP_FLAG_MAKE_CACHE_DIR, NULL));
264 Pool *pool1 = dnf_sack_get_pool(sack1);
265 const char *path = pool_tmpjoin(pool1, test_globals.repo_dir,
266 "change.repo", NULL);
267 fail_if(load_repo(pool1, "change", path, 0));
268 DnfPackage *pkg1 = by_name(sack1, "penny-lib");
269 fail_if(pkg1 == NULL);
270
271 DnfSack *sack2 = test_globals.sack;
272 Pool *pool2 = dnf_sack_get_pool(sack2);
273 DnfPackage *pkg2 = by_name(sack2, "penny-lib");
274 fail_if(pkg2 == NULL);
275
276 /* "penny-lib" is in both pools but at different offsets */
277 Solvable *s1 = pool_id2solvable(pool1, dnf_package_get_id(pkg1));
278 Solvable *s2 = pool_id2solvable(pool2, dnf_package_get_id(pkg2));
279 fail_if(s1->name == s2->name);
280
281 fail_if(dnf_package_cmp(pkg1, pkg2) != 0);
282
283 g_object_unref(pkg1);
284 g_object_unref(pkg2);
285
286 g_object_unref(sack1);
287 g_free(tmpdir);
288 }
289 END_TEST
290
START_TEST(test_packager)291 START_TEST(test_packager)
292 {
293 DnfPackage *pkg = by_name(test_globals.sack, "tour");
294 ck_assert_str_eq(dnf_package_get_packager(pkg), "roll up <roll@up.net>");
295 g_object_unref(pkg);
296 }
297 END_TEST
298
START_TEST(test_sourcerpm)299 START_TEST(test_sourcerpm)
300 {
301 DnfPackage *pkg = by_name(test_globals.sack, "tour");
302 const char *sourcerpm = dnf_package_get_sourcerpm(pkg);
303
304 ck_assert_str_eq(sourcerpm, "tour-4-6.src.rpm");
305 g_object_unref(pkg);
306
307 pkg = by_name(test_globals.sack, "mystery-devel");
308 sourcerpm = dnf_package_get_sourcerpm(pkg);
309 ck_assert_str_eq(sourcerpm, "mystery-19.67-1.src.rpm");
310 g_object_unref(pkg);
311 }
312 END_TEST
313
314 #define TOUR_45_46_DRPM_CHKSUM "\xc3\xc3\xd5\x72\xa4\x6b"\
315 "\x1a\x66\x90\x6d\x42\xca\x17\x63\xef\x36\x20\xf7\x02"\
316 "\x58\xaa\xac\x4c\x14\xbf\x46\x3e\xd5\x37\x16\xd4\x44"
317
START_TEST(test_presto)318 START_TEST(test_presto)
319 {
320 DnfSack *sack = test_globals.sack;
321 DnfPackage *tour = by_name(sack, "tour");
322 fail_if(tour == NULL);
323
324 DnfPackageDelta *delta = dnf_package_get_delta_from_evr(tour, "4-5");
325 const char *location = dnf_packagedelta_get_location(delta);
326 ck_assert_str_eq(location, "drpms/tour-4-5_4-6.noarch.drpm");
327 const char *baseurl = dnf_packagedelta_get_baseurl(delta);
328 fail_unless(baseurl == NULL);
329 guint64 size = dnf_packagedelta_get_downloadsize(delta);
330 ck_assert_int_eq(size, 3132);
331 int type;
332 HyChecksum *csum = dnf_packagedelta_get_chksum(delta, &type);
333 fail_unless(type == G_CHECKSUM_SHA256);
334 ck_assert(!memcmp(csum, TOUR_45_46_DRPM_CHKSUM, 32));
335 g_object_unref(delta);
336 g_object_unref(tour);
337 }
338 END_TEST
339
START_TEST(test_get_files_cmdline)340 START_TEST(test_get_files_cmdline)
341 {
342 DnfSack *sack = test_globals.sack;
343
344 DnfPackage *pkg = by_name(sack, "tour");
345 gchar **files;
346
347 files = dnf_package_get_files(pkg);
348 g_assert_cmpint (6, ==, g_strv_length(files));
349 g_strfreev(files);
350 g_object_unref(pkg);
351 }
352 END_TEST
353
354 Suite *
package_suite(void)355 package_suite(void)
356 {
357 Suite *s = suite_create("Package");
358 TCase *tc;
359
360 tc = tcase_create("Core");
361 tcase_add_unchecked_fixture(tc, fixture_system_only, teardown);
362 tcase_add_test(tc, test_package_summary);
363 tcase_add_test(tc, test_identical);
364 tcase_add_test(tc, test_versions);
365 tcase_add_test(tc, test_no_sourcerpm);
366 suite_add_tcase(s, tc);
367
368 tc = tcase_create("Requires");
369 tcase_add_unchecked_fixture(tc, fixture_with_main, teardown);
370 tcase_add_test(tc, test_get_requires);
371 tcase_add_test(tc, test_get_more_requires);
372 tcase_add_test(tc, test_chksum_fail);
373 tcase_add_test(tc, test_installed);
374 tcase_add_test(tc, test_two_sacks);
375 suite_add_tcase(s, tc);
376
377 tc = tcase_create("WithRealRepo");
378 tcase_add_unchecked_fixture(tc, fixture_yum, teardown);
379 tcase_add_test(tc, test_checksums);
380 tcase_add_test(tc, test_get_files);
381 tcase_add_test(tc, test_get_advisories);
382 tcase_add_test(tc, test_get_advisories_none);
383 tcase_add_test(tc, test_lookup_num);
384 tcase_add_test(tc, test_packager);
385 tcase_add_test(tc, test_sourcerpm);
386 tcase_add_test(tc, test_presto);
387 suite_add_tcase(s, tc);
388
389 tc = tcase_create("WithCmdlinePackage");
390 tcase_add_unchecked_fixture(tc, fixture_cmdline_only, teardown);
391 tcase_add_test(tc, test_get_files_cmdline);
392 suite_add_tcase(s, tc);
393
394 tc = tcase_create("Vendor");
395 tcase_add_unchecked_fixture(tc, fixture_with_vendor, teardown);
396 tcase_add_test(tc, test_vendor);
397 suite_add_tcase(s, tc);
398
399 return s;
400 }
401