Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/pkg
Path: blob/main/tests/lib/pkg_jobs_dryrun.c
4743 views
1
/*-
2
* SPDX-License-Identifier: BSD-2-Clause
3
* Copyright (c) 2026 Baptiste Daroussin <[email protected]>
4
*/
5
6
#include <atf-c.h>
7
#include <pkg.h>
8
#include <private/pkg.h>
9
10
/*
11
* Test that pkg_jobs_apply() honors PKG_FLAG_DRY_RUN for delete jobs.
12
* See: https://github.com/freebsd/pkg/issues/2137
13
*/
14
15
ATF_TC_WITHOUT_HEAD(delete_dry_run_via_jobs_apply);
16
17
ATF_TC_BODY(delete_dry_run_via_jobs_apply, tc)
18
{
19
struct pkgdb *db = NULL;
20
struct pkg_jobs *jobs = NULL;
21
struct pkg *p = NULL;
22
struct pkgdb_it *it = NULL;
23
char *argv[] = { "testpkg", NULL };
24
25
setenv("INSTALL_AS_USER", "yes", 1);
26
setenv("PKG_DBDIR", ".", 1);
27
setenv("NO_TICK", "yes", 1);
28
setenv("PKG_ENABLE_PLUGINS", "false", 1);
29
30
ATF_REQUIRE_EQ(EPKG_OK, pkg_ini(NULL, NULL, 0));
31
ATF_REQUIRE_EQ(EPKG_OK, pkgdb_open(&db, PKGDB_DEFAULT));
32
33
/* Create and register a package directly */
34
ATF_REQUIRE_EQ(EPKG_OK, pkg_new(&p, PKG_INSTALLED));
35
p->name = xstrdup("testpkg");
36
p->uid = xstrdup("testpkg");
37
p->origin = xstrdup("test/testpkg");
38
p->version = xstrdup("1.0");
39
p->maintainer = xstrdup("test");
40
p->www = xstrdup("http://test");
41
p->comment = xstrdup("a test package");
42
p->desc = xstrdup("Test package for dry-run");
43
p->prefix = xstrdup("/usr/local");
44
p->abi = xstrdup("*");
45
46
ATF_REQUIRE_EQ(EPKG_OK, pkgdb_register_pkg(db, p, 0, NULL));
47
ATF_REQUIRE_EQ(EPKG_OK, pkgdb_register_finale(db, EPKG_OK, NULL));
48
pkg_free(p);
49
50
/* Verify the package is registered */
51
it = pkgdb_query(db, "testpkg", MATCH_EXACT);
52
ATF_REQUIRE(it != NULL);
53
p = NULL;
54
ATF_REQUIRE_EQ(EPKG_OK, pkgdb_it_next(it, &p, PKG_LOAD_BASIC));
55
ATF_REQUIRE(p != NULL);
56
ATF_REQUIRE_STREQ(p->name, "testpkg");
57
pkg_free(p);
58
pkgdb_it_free(it);
59
60
/* Create a DEINSTALL job with DRY_RUN flag */
61
ATF_REQUIRE_EQ(EPKG_OK,
62
pkg_jobs_new(&jobs, PKG_JOBS_DEINSTALL, db));
63
pkg_jobs_set_flags(jobs, PKG_FLAG_DRY_RUN | PKG_FLAG_FORCE);
64
ATF_REQUIRE_EQ(EPKG_OK,
65
pkg_jobs_add(jobs, MATCH_EXACT, argv, 1));
66
ATF_REQUIRE_EQ(EPKG_OK, pkg_jobs_solve(jobs));
67
ATF_REQUIRE(pkg_jobs_count(jobs) == 1);
68
69
/* Apply with DRY_RUN — package must NOT be removed */
70
ATF_REQUIRE_EQ(EPKG_OK, pkg_jobs_apply(jobs));
71
pkg_jobs_free(jobs);
72
73
/* Verify the package is still in the database */
74
it = pkgdb_query(db, "testpkg", MATCH_EXACT);
75
ATF_REQUIRE(it != NULL);
76
p = NULL;
77
ATF_REQUIRE_EQ_MSG(EPKG_OK, pkgdb_it_next(it, &p, PKG_LOAD_BASIC),
78
"Package was removed despite PKG_FLAG_DRY_RUN");
79
ATF_REQUIRE(p != NULL);
80
ATF_REQUIRE_STREQ(p->name, "testpkg");
81
82
pkg_free(p);
83
pkgdb_it_free(it);
84
pkgdb_close(db);
85
pkg_shutdown();
86
}
87
88
ATF_TP_ADD_TCS(tp)
89
{
90
ATF_TP_ADD_TC(tp, delete_dry_run_via_jobs_apply);
91
92
return (atf_no_error());
93
}
94
95