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 }