]> git.ipfire.org Git - thirdparty/lxc.git/commitdiff
criu: add a test case for the criu feature check support 2035/head
authorAdrian Reber <areber@redhat.com>
Wed, 13 Dec 2017 11:14:58 +0000 (12:14 +0100)
committerAdrian Reber <areber@redhat.com>
Thu, 14 Dec 2017 19:34:51 +0000 (20:34 +0100)
This adds a simple test case which verifies that the new migrate() API
command 'MIGRATE_FEATURE_CHECK' works as expected.

If a feature does not exist on the currently running
architecture/kernel/criu combination it does not report an error as this
is a valid scenario.

Signed-off-by: Adrian Reber <areber@redhat.com>
src/tests/Makefile.am
src/tests/criu_check_feature.c [new file with mode: 0644]

index b38c93c67a3774fb9c130d795b01314d08097167..0525ca909110102b3c7a60a8761a310b5dcab12e 100644 (file)
@@ -32,6 +32,7 @@ lxc_test_shortlived_SOURCES = shortlived.c
 lxc_test_livepatch_SOURCES = livepatch.c lxctest.h
 lxc_test_state_server_SOURCES = state_server.c lxctest.h
 lxc_test_share_ns_SOURCES = share_ns.c lxctest.h
+lxc_test_criu_check_feature_SOURCES = criu_check_feature.c lxctest.h
 
 AM_CFLAGS=-DLXCROOTFSMOUNT=\"$(LXCROOTFSMOUNT)\" \
        -DLXCPATH=\"$(LXCPATH)\" \
@@ -61,7 +62,8 @@ bin_PROGRAMS = lxc-test-containertests lxc-test-locktests lxc-test-startone \
        lxc-test-reboot lxc-test-list lxc-test-attach lxc-test-device-add-remove \
        lxc-test-apparmor lxc-test-utils lxc-test-parse-config-file \
        lxc-test-config-jump-table lxc-test-shortlived lxc-test-livepatch \
-       lxc-test-api-reboot lxc-test-state-server lxc-test-share-ns
+       lxc-test-api-reboot lxc-test-state-server lxc-test-share-ns \
+       lxc-test-criu-check-feature
 
 bin_SCRIPTS = lxc-test-automount \
              lxc-test-autostart \
@@ -93,6 +95,7 @@ EXTRA_DIST = \
        console_log.c \
        containertests.c \
        createtest.c \
+       criu_check_feature.c \
        destroytest.c \
        device_add_remove.c \
        get_item.c \
diff --git a/src/tests/criu_check_feature.c b/src/tests/criu_check_feature.c
new file mode 100644 (file)
index 0000000..a5e0c34
--- /dev/null
@@ -0,0 +1,90 @@
+/* liblxcapi
+ *
+ * Copyright © 2017 Adrian Reber <areber@redhat.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2, as
+ * published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */
+
+#include <string.h>
+#include <limits.h>
+
+#include "lxc/lxccontainer.h"
+#include "lxctest.h"
+
+int main(int argc, char *argv[])
+{
+       struct lxc_container *c;
+       struct migrate_opts m_opts;
+       int ret = EXIT_FAILURE;
+
+       /* Test the feature check interface,
+        * we actually do not need a container. */
+       c = lxc_container_new("check_feature", NULL);
+       if (!c) {
+               lxc_error("%s", "Failed to create container \"check_feature\"");
+               exit(ret);
+       }
+
+       if (c->is_defined(c)) {
+               lxc_error("%s\n", "Container \"check_feature\" is defined");
+               goto on_error_put;
+       }
+
+       /* check the migrate API call with wrong 'cmd' */
+       if (!c->migrate(c, UINT_MAX, &m_opts, sizeof(struct migrate_opts))) {
+               /* This should failed */
+               lxc_error("%s\n", "Migrate API calls with command UINT_MAX did not fail");
+               goto on_error_put;
+       }
+
+       /* do the actual fature check for memory tracking */
+       m_opts.features_to_check = FEATURE_MEM_TRACK;
+       if (c->migrate(c, MIGRATE_FEATURE_CHECK, &m_opts, sizeof(struct migrate_opts))) {
+               lxc_debug("%s\n", "System does not support \"FEATURE_MEM_TRACK\".");
+       }
+
+       /* check for lazy pages */
+       m_opts.features_to_check = FEATURE_LAZY_PAGES;
+       if (c->migrate(c, MIGRATE_FEATURE_CHECK, &m_opts, sizeof(struct migrate_opts))) {
+               lxc_debug("%s\n", "System does not support \"FEATURE_LAZY_PAGES\".");
+       }
+
+       /* check for lazy pages and memory tracking */
+       m_opts.features_to_check = FEATURE_LAZY_PAGES | FEATURE_MEM_TRACK;
+       if (c->migrate(c, MIGRATE_FEATURE_CHECK, &m_opts, sizeof(struct migrate_opts))) {
+               if (m_opts.features_to_check == FEATURE_LAZY_PAGES)
+                       lxc_debug("%s\n", "System does not support \"FEATURE_MEM_TRACK\"");
+               else if (m_opts.features_to_check == FEATURE_MEM_TRACK)
+                       lxc_debug("%s\n", "System does not support \"FEATURE_LAZY_PAGES\"");
+               else
+                       lxc_debug("%s\n", "System does not support \"FEATURE_MEM_TRACK\" "
+                                       "and \"FEATURE_LAZY_PAGES\"");
+       }
+
+       /* test for unknown feature; once there are 64 features to test
+        * this will be valid... */
+       m_opts.features_to_check = -1ULL;
+       if (!c->migrate(c, MIGRATE_FEATURE_CHECK, &m_opts, sizeof(struct migrate_opts))) {
+               lxc_error("%s\n", "Unsupported feature supported, which is strange.");
+               goto on_error_put;
+       }
+
+       ret = EXIT_SUCCESS;
+
+on_error_put:
+       lxc_container_put(c);
+       if (ret == EXIT_SUCCESS)
+               lxc_debug("%s\n", "All criu feature check tests passed");
+       exit(ret);
+}