git: af238d55d313 - main - kyua: Fixes after vendor merge

From: Igor Ostapenko <igoro_at_FreeBSD.org>
Date: Sun, 18 Oct 2026 17:24:26 UTC
The branch main has been updated by igoro:

URL: https://cgit.FreeBSD.org/src/commit/?id=af238d55d313a4a99fe9a3492755eb152b17bca0

commit af238d55d313a4a99fe9a3492755eb152b17bca0
Author:     Igor Ostapenko <igoro@FreeBSD.org>
AuthorDate: 2026-10-18 17:22:55 +0000
Commit:     Igor Ostapenko <igoro@FreeBSD.org>
CommitDate: 2026-10-18 17:22:55 +0000

    kyua: Fixes after vendor merge
    
    Reviewed by:    ngie
    MFC after:      1 month
    Differential Revision:  https://reviews.freebsd.org/D60446
---
 contrib/kyua/cli/cmd_debug.cpp    |  4 ++--
 contrib/kyua/doc/kyuafile.5       |  1 +
 contrib/kyua/doc/kyuafile.5.in    |  1 +
 contrib/kyua/engine/scheduler.cpp |  4 ++--
 contrib/kyua/model/metadata.cpp   | 47 ++++++++++++++++++++++++++-------------
 contrib/kyua/os/freebsd/main.cpp  | 16 ++++++++-----
 6 files changed, 47 insertions(+), 26 deletions(-)

diff --git a/contrib/kyua/cli/cmd_debug.cpp b/contrib/kyua/cli/cmd_debug.cpp
index f5e48572407e..f43be8fe85f2 100644
--- a/contrib/kyua/cli/cmd_debug.cpp
+++ b/contrib/kyua/cli/cmd_debug.cpp
@@ -155,14 +155,14 @@ public:
                 _ui->out("The test failed and paused right before its cleanup "
                     "routine.");
                 _ui->out(F("Test work dir: %s") % eh.work_directory().str());
-                _ui->out("Press any key to continue...");
+                _ui->out("Press <Enter> to continue...");
                 (void) std::cin.get();
             }
         } else if (_cmdline.has_option(pause_before_cleanup_option
             .long_name())) {
             _ui->out("The test paused right before its cleanup routine.");
             _ui->out(F("Test work dir: %s") % eh.work_directory().str());
-            _ui->out("Press any key to continue...");
+            _ui->out("Press <Enter> to continue...");
             (void) std::cin.get();
         }
     };
diff --git a/contrib/kyua/doc/kyuafile.5 b/contrib/kyua/doc/kyuafile.5
index 1990e7bba3a3..d26312dd0d18 100644
--- a/contrib/kyua/doc/kyuafile.5
+++ b/contrib/kyua/doc/kyuafile.5
@@ -311,6 +311,7 @@ Supported platforms:
 .Pp
 ATF:
 .Va require.kmods
+(appends to the list declared at the Kyuafile level instead of overwriting it)
 .It Va required_memory
 Amount of physical memory that the test needs to run successfully.
 .Pp
diff --git a/contrib/kyua/doc/kyuafile.5.in b/contrib/kyua/doc/kyuafile.5.in
index ae4b8ebfa3fe..9485ed187814 100644
--- a/contrib/kyua/doc/kyuafile.5.in
+++ b/contrib/kyua/doc/kyuafile.5.in
@@ -311,6 +311,7 @@ Supported platforms:
 .Pp
 ATF:
 .Va require.kmods
+(appends to the list declared at the Kyuafile level instead of overwriting it)
 .It Va required_memory
 Amount of physical memory that the test needs to run successfully.
 .Pp
diff --git a/contrib/kyua/engine/scheduler.cpp b/contrib/kyua/engine/scheduler.cpp
index 6e19a1598f8c..d04fc1dfbd3d 100644
--- a/contrib/kyua/engine/scheduler.cpp
+++ b/contrib/kyua/engine/scheduler.cpp
@@ -1653,8 +1653,8 @@ scheduler::generate_config(const config::tree& user_config,
     if (user_config.is_set("unprivileged_user")) {
         const passwd::user& user =
             user_config.lookup< engine::user_node >("unprivileged_user");
-	// The property is duplicated using both ATF and Kyua naming styles
-	// for better UX.
+        // The property is duplicated using both ATF and Kyua naming styles
+        // for better UX.
         props["unprivileged-user"] = user.name;
         props["unprivileged_user"] = user.name;
     }
diff --git a/contrib/kyua/model/metadata.cpp b/contrib/kyua/model/metadata.cpp
index 8bb071163c10..51a7b03e4599 100644
--- a/contrib/kyua/model/metadata.cpp
+++ b/contrib/kyua/model/metadata.cpp
@@ -255,8 +255,8 @@ init_tree(config::tree& tree)
     tree.define< config::strings_set_node >("required_configs");
     tree.define< bytes_node >("required_disk_space");
     tree.define< paths_set_node >("required_files");
-    tree.define< bytes_node >("required_memory");
     tree.define< config::strings_set_node >("required_kmods");
+    tree.define< bytes_node >("required_memory");
     tree.define< paths_set_node >("required_programs");
     tree.define< user_node >("required_user");
     tree.define< delta_node >("timeout");
@@ -282,8 +282,8 @@ set_defaults(config::tree& tree)
                                          model::strings_set());
     tree.set< bytes_node >("required_disk_space", units::bytes(0));
     tree.set< paths_set_node >("required_files", model::paths_set());
-    tree.set< bytes_node >("required_memory", units::bytes(0));
     tree.set< config::strings_set_node >("required_kmods", model::strings_set());
+    tree.set< bytes_node >("required_memory", units::bytes(0));
     tree.set< paths_set_node >("required_programs", model::paths_set());
     tree.set< user_node >("required_user", "");
     // TODO(jmmv): We shouldn't be setting a default timeout like this.  See
@@ -585,20 +585,6 @@ model::metadata::required_files(void) const
 }
 
 
-/// Returns the amount of memory required by the test.
-///
-/// \return Number of bytes, or 0 if this does not apply.
-const units::bytes&
-model::metadata::required_memory(void) const
-{
-    if (_pimpl->props.is_set("required_memory")) {
-        return _pimpl->props.lookup< bytes_node >("required_memory");
-    } else {
-        return get_defaults().lookup< bytes_node >("required_memory");
-    }
-}
-
-
 /// Returns the list of kernel modules needed by the test.
 ///
 /// \return Set of kernel module names.
@@ -615,6 +601,20 @@ model::metadata::required_kmods(void) const
 }
 
 
+/// Returns the amount of memory required by the test.
+///
+/// \return Number of bytes, or 0 if this does not apply.
+const units::bytes&
+model::metadata::required_memory(void) const
+{
+    if (_pimpl->props.is_set("required_memory")) {
+        return _pimpl->props.lookup< bytes_node >("required_memory");
+    } else {
+        return get_defaults().lookup< bytes_node >("required_memory");
+    }
+}
+
+
 /// Returns the list of programs needed by the test.
 ///
 /// \return Set of paths.
@@ -1059,6 +1059,21 @@ model::metadata_builder::set_required_files(const model::paths_set& files)
 }
 
 
+/// Sets the list of required kernel modules.
+///
+/// \param vars Set of kernel module names.
+///
+/// \return A reference to this builder.
+///
+/// \throw model::error If the value is invalid.
+model::metadata_builder&
+model::metadata_builder::set_required_kmods(const model::strings_set& kmods)
+{
+    set< config::strings_set_node >(_pimpl->props, "required_kmods", kmods);
+    return *this;
+}
+
+
 /// Sets the amount of memory required by the test.
 ///
 /// \param bytes Number of bytes.
diff --git a/contrib/kyua/os/freebsd/main.cpp b/contrib/kyua/os/freebsd/main.cpp
index 700284b64b78..1fe4fca8cae4 100644
--- a/contrib/kyua/os/freebsd/main.cpp
+++ b/contrib/kyua/os/freebsd/main.cpp
@@ -34,7 +34,12 @@
 #include "engine/requirements.hpp"
 #include "os/freebsd/reqs_checker_kmods.hpp"
 
+#include "engine/prepare/prepare.hpp"
+#include "os/freebsd/prepare_kmods.hpp"
+
 namespace execenv = engine::execenv;
+namespace prepare = engine::prepare;
+
 
 /// FreeBSD related features initialization.
 ///
@@ -50,15 +55,14 @@ int
 freebsd::main(const int, const char* const* const)
 {
     execenv::register_execenv(
-        std::shared_ptr< execenv::manager >(new freebsd::execenv_jail_manager())
-    );
+        std::make_shared<freebsd::execenv_jail_manager>());
 
 #ifdef __FreeBSD__
     engine::register_reqs_checker(
-        std::shared_ptr< engine::reqs_checker >(
-            new freebsd::reqs_checker_kmods()
-        )
-    );
+        std::make_shared<freebsd::reqs_checker_kmods>());
+
+    prepare::register_handler(
+        std::make_shared<freebsd::prepare_kmods>());
 #endif
 
     return 0;