/ tests / lib / pkg_jobs_dryrun.c
pkg_jobs_dryrun.c
 1  /*-
 2   * SPDX-License-Identifier: BSD-2-Clause
 3   * Copyright (c) 2026 Baptiste Daroussin <bapt@FreeBSD.org>
 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  }