c313de
From d323cd99b256b368c37f0a36eef8b3b2d6213346 Mon Sep 17 00:00:00 2001
c313de
Message-Id: <d323cd99b256b368c37f0a36eef8b3b2d6213346@dist-git>
c313de
From: Pavel Hrdina <phrdina@redhat.com>
c313de
Date: Mon, 1 Jul 2019 17:06:18 +0200
c313de
Subject: [PATCH] vircgroupmock: rewrite cgroup fopen mocking
c313de
MIME-Version: 1.0
c313de
Content-Type: text/plain; charset=UTF-8
c313de
Content-Transfer-Encoding: 8bit
c313de
c313de
Move all the cgroup data into separate files out of vircgroupmock.c
c313de
and rework the fopen function to load data from files.  This will
c313de
make it easier to add more test cases.
c313de
c313de
Reviewed-by: Fabiano Fidêncio <fidencio@redhat.com>
c313de
Reviewed-by: Ján Tomko <jtomko@redhat.com>
c313de
Signed-off-by: Pavel Hrdina <phrdina@redhat.com>
c313de
(cherry picked from commit 5cf1b25708328ad4006572801d0829548418cfe7)
c313de
c313de
Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1689297
c313de
c313de
Signed-off-by: Pavel Hrdina <phrdina@redhat.com>
c313de
Message-Id: <efee26b41a026de90498f4abd724f1c7d85d6731.1561993099.git.phrdina@redhat.com>
c313de
Reviewed-by: Ján Tomko <jtomko@redhat.com>
c313de
---
c313de
 tests/vircgroupdata/all-in-one.cgroups     |   7 ++
c313de
 tests/vircgroupdata/all-in-one.mounts      |   2 +-
c313de
 tests/vircgroupdata/all-in-one.parsed      |  12 +-
c313de
 tests/vircgroupdata/all-in-one.self.cgroup |   1 +
c313de
 tests/vircgroupdata/logind.cgroups         |  10 ++
c313de
 tests/vircgroupdata/logind.mounts          |   2 +
c313de
 tests/vircgroupdata/logind.self.cgroup     |   1 +
c313de
 tests/vircgroupdata/systemd.cgroups        |   8 ++
c313de
 tests/vircgroupdata/systemd.mounts         |  11 ++
c313de
 tests/vircgroupdata/systemd.self.cgroup    |   6 +
c313de
 tests/vircgroupmock.c                      | 136 +++------------------
c313de
 tests/vircgrouptest.c                      |  10 +-
c313de
 12 files changed, 79 insertions(+), 127 deletions(-)
c313de
 create mode 100644 tests/vircgroupdata/all-in-one.cgroups
c313de
 create mode 100644 tests/vircgroupdata/all-in-one.self.cgroup
c313de
 create mode 100644 tests/vircgroupdata/logind.cgroups
c313de
 create mode 100644 tests/vircgroupdata/logind.mounts
c313de
 create mode 100644 tests/vircgroupdata/logind.self.cgroup
c313de
 create mode 100644 tests/vircgroupdata/systemd.cgroups
c313de
 create mode 100644 tests/vircgroupdata/systemd.mounts
c313de
 create mode 100644 tests/vircgroupdata/systemd.self.cgroup
c313de
c313de
diff --git a/tests/vircgroupdata/all-in-one.cgroups b/tests/vircgroupdata/all-in-one.cgroups
c313de
new file mode 100644
c313de
index 0000000000..7208e5a0b6
c313de
--- /dev/null
c313de
+++ b/tests/vircgroupdata/all-in-one.cgroups
c313de
@@ -0,0 +1,7 @@
c313de
+#subsys_name    hierarchy       num_cgroups     enabled
c313de
+cpuset   6   1  1
c313de
+cpu      6   1  1
c313de
+cpuacct  6   1  1
c313de
+memory   6   1  1
c313de
+devices  6   1  1
c313de
+blkio    6   1  1
c313de
diff --git a/tests/vircgroupdata/all-in-one.mounts b/tests/vircgroupdata/all-in-one.mounts
c313de
index 14093b961c..76c579ff69 100644
c313de
--- a/tests/vircgroupdata/all-in-one.mounts
c313de
+++ b/tests/vircgroupdata/all-in-one.mounts
c313de
@@ -4,4 +4,4 @@ proc /proc proc rw,nosuid,nodev,noexec,relatime 0 0
c313de
 udev /dev devtmpfs rw,relatime,size=16458560k,nr_inodes=4114640,mode=755 0 0
c313de
 devpts /dev/pts devpts rw,nosuid,noexec,relatime,gid=5,mode=620,ptmxmode=000 0 0
c313de
 nfsd /proc/fs/nfsd nfsd rw,relatime 0 0
c313de
-cgroup /sys/fs/cgroup cgroup rw,relatime,blkio,devices,memory,cpuacct,cpu,cpuset 0 0
c313de
+cgroup /not/really/sys/fs/cgroup cgroup rw,relatime,blkio,devices,memory,cpuacct,cpu,cpuset 0 0
c313de
diff --git a/tests/vircgroupdata/all-in-one.parsed b/tests/vircgroupdata/all-in-one.parsed
c313de
index 2701778fea..d703d08fb9 100644
c313de
--- a/tests/vircgroupdata/all-in-one.parsed
c313de
+++ b/tests/vircgroupdata/all-in-one.parsed
c313de
@@ -1,10 +1,10 @@
c313de
-cpu          /sys/fs/cgroup
c313de
-cpuacct      /sys/fs/cgroup
c313de
-cpuset       /sys/fs/cgroup
c313de
-memory       /sys/fs/cgroup
c313de
-devices      /sys/fs/cgroup
c313de
+cpu          /not/really/sys/fs/cgroup
c313de
+cpuacct      /not/really/sys/fs/cgroup
c313de
+cpuset       /not/really/sys/fs/cgroup
c313de
+memory       /not/really/sys/fs/cgroup
c313de
+devices      /not/really/sys/fs/cgroup
c313de
 freezer      <null>
c313de
-blkio        /sys/fs/cgroup
c313de
+blkio        /not/really/sys/fs/cgroup
c313de
 net_cls      <null>
c313de
 perf_event   <null>
c313de
 name=systemd <null>
c313de
diff --git a/tests/vircgroupdata/all-in-one.self.cgroup b/tests/vircgroupdata/all-in-one.self.cgroup
c313de
new file mode 100644
c313de
index 0000000000..cf237502e9
c313de
--- /dev/null
c313de
+++ b/tests/vircgroupdata/all-in-one.self.cgroup
c313de
@@ -0,0 +1 @@
c313de
+6:blkio,devices,memory,cpuacct,cpu,cpuset:/
c313de
diff --git a/tests/vircgroupdata/logind.cgroups b/tests/vircgroupdata/logind.cgroups
c313de
new file mode 100644
c313de
index 0000000000..9d46f130e0
c313de
--- /dev/null
c313de
+++ b/tests/vircgroupdata/logind.cgroups
c313de
@@ -0,0 +1,10 @@
c313de
+#subsys_name    hierarchy       num_cgroups     enabled
c313de
+cpuset    0  1  1
c313de
+cpu       0  1  1
c313de
+cpuacct   0  1  1
c313de
+memory    0  1  0
c313de
+devices   0  1  1
c313de
+freezer   0  1  1
c313de
+net_cls   0  1  1
c313de
+blkio     0  1  1
c313de
+perf_event  0  1  1
c313de
diff --git a/tests/vircgroupdata/logind.mounts b/tests/vircgroupdata/logind.mounts
c313de
new file mode 100644
c313de
index 0000000000..3ab908aee9
c313de
--- /dev/null
c313de
+++ b/tests/vircgroupdata/logind.mounts
c313de
@@ -0,0 +1,2 @@
c313de
+none /not/really/sys/fs/cgroup tmpfs rw,rootcontext=system_u:object_r:sysfs_t:s0,seclabel,relatime,size=4k,mode=755 0 0
c313de
+systemd /not/really/sys/fs/cgroup/systemd cgroup rw,nosuid,nodev,noexec,relatime,name=systemd 0 0
c313de
diff --git a/tests/vircgroupdata/logind.self.cgroup b/tests/vircgroupdata/logind.self.cgroup
c313de
new file mode 100644
c313de
index 0000000000..31e0cfe8eb
c313de
--- /dev/null
c313de
+++ b/tests/vircgroupdata/logind.self.cgroup
c313de
@@ -0,0 +1 @@
c313de
+0:name=systemd:/
c313de
diff --git a/tests/vircgroupdata/systemd.cgroups b/tests/vircgroupdata/systemd.cgroups
c313de
new file mode 100644
c313de
index 0000000000..d32dfab222
c313de
--- /dev/null
c313de
+++ b/tests/vircgroupdata/systemd.cgroups
c313de
@@ -0,0 +1,8 @@
c313de
+#subsys_name    hierarchy       num_cgroups     enabled
c313de
+cpuset  2       4       1
c313de
+cpu     3       48      1
c313de
+cpuacct 3       48      1
c313de
+memory  4       4       1
c313de
+devices 5       4       1
c313de
+freezer 6       4       1
c313de
+blkio   8       4       1
c313de
diff --git a/tests/vircgroupdata/systemd.mounts b/tests/vircgroupdata/systemd.mounts
c313de
new file mode 100644
c313de
index 0000000000..75572c86f7
c313de
--- /dev/null
c313de
+++ b/tests/vircgroupdata/systemd.mounts
c313de
@@ -0,0 +1,11 @@
c313de
+rootfs / rootfs rw 0 0
c313de
+tmpfs /run tmpfs rw,seclabel,nosuid,nodev,mode=755 0 0
c313de
+tmpfs /not/really/sys/fs/cgroup tmpfs rw,seclabel,nosuid,nodev,noexec,mode=755 0 0
c313de
+cgroup /not/really/sys/fs/cgroup/systemd cgroup rw,nosuid,nodev,noexec,relatime,release_agent=/usr/lib/systemd/systemd-cgroups-agent,name=systemd 0 0
c313de
+cgroup /not/really/sys/fs/cgroup/cpuset cgroup rw,nosuid,nodev,noexec,relatime,cpuset 0 0
c313de
+cgroup /not/really/sys/fs/cgroup/cpu,cpuacct cgroup rw,nosuid,nodev,noexec,relatime,cpuacct,cpu 0 0
c313de
+cgroup /not/really/sys/fs/cgroup/freezer cgroup rw,nosuid,nodev,noexec,relatime,freezer 0 0
c313de
+cgroup /not/really/sys/fs/cgroup/blkio cgroup rw,nosuid,nodev,noexec,relatime,blkio 0 0
c313de
+cgroup /not/really/sys/fs/cgroup/memory cgroup rw,nosuid,nodev,noexec,relatime,memory 0 0
c313de
+/dev/sda1 /boot ext4 rw,seclabel,relatime,data=ordered 0 0
c313de
+tmpfs /tmp tmpfs rw,seclabel,relatime,size=1024000k 0 0
c313de
diff --git a/tests/vircgroupdata/systemd.self.cgroup b/tests/vircgroupdata/systemd.self.cgroup
c313de
new file mode 100644
c313de
index 0000000000..2b95af79d2
c313de
--- /dev/null
c313de
+++ b/tests/vircgroupdata/systemd.self.cgroup
c313de
@@ -0,0 +1,6 @@
c313de
+115:memory:/
c313de
+8:blkio:/
c313de
+6:freezer:/
c313de
+3:cpuacct,cpu:/system
c313de
+2:cpuset:/
c313de
+1:name=systemd:/user/berrange/123
c313de
diff --git a/tests/vircgroupmock.c b/tests/vircgroupmock.c
c313de
index cd5422dcba..3afe2fe192 100644
c313de
--- a/tests/vircgroupmock.c
c313de
+++ b/tests/vircgroupmock.c
c313de
@@ -81,85 +81,6 @@ const char *fakedevicedir1 = FAKEDEVDIR1;
c313de
  * of files beneath it
c313de
  */
c313de
 
c313de
-/*
c313de
- * Intentionally missing the 'devices' mount.
c313de
- * Co-mounting cpu & cpuacct controllers
c313de
- * An anonymous controller for systemd
c313de
- */
c313de
-const char *procmounts =
c313de
-    "rootfs / rootfs rw 0 0\n"
c313de
-    "tmpfs /run tmpfs rw,seclabel,nosuid,nodev,mode=755 0 0\n"
c313de
-    "tmpfs /not/really/sys/fs/cgroup tmpfs rw,seclabel,nosuid,nodev,noexec,mode=755 0 0\n"
c313de
-    "cgroup /not/really/sys/fs/cgroup/systemd cgroup rw,nosuid,nodev,noexec,relatime,release_agent=/usr/lib/systemd/systemd-cgroups-agent,name=systemd 0 0\n"
c313de
-    "cgroup /not/really/sys/fs/cgroup/cpuset cgroup rw,nosuid,nodev,noexec,relatime,cpuset 0 0\n"
c313de
-    "cgroup /not/really/sys/fs/cgroup/cpu,cpuacct cgroup rw,nosuid,nodev,noexec,relatime,cpuacct,cpu 0 0\n"
c313de
-    "cgroup /not/really/sys/fs/cgroup/freezer cgroup rw,nosuid,nodev,noexec,relatime,freezer 0 0\n"
c313de
-    "cgroup /not/really/sys/fs/cgroup/blkio cgroup rw,nosuid,nodev,noexec,relatime,blkio 0 0\n"
c313de
-    "cgroup /not/really/sys/fs/cgroup/memory cgroup rw,nosuid,nodev,noexec,relatime,memory 0 0\n"
c313de
-    "/dev/sda1 /boot ext4 rw,seclabel,relatime,data=ordered 0 0\n"
c313de
-    "tmpfs /tmp tmpfs rw,seclabel,relatime,size=1024000k 0 0\n";
c313de
-
c313de
-const char *procselfcgroups =
c313de
-    "115:memory:/\n"
c313de
-    "8:blkio:/\n"
c313de
-    "6:freezer:/\n"
c313de
-    "3:cpuacct,cpu:/system\n"
c313de
-    "2:cpuset:/\n"
c313de
-    "1:name=systemd:/user/berrange/123\n";
c313de
-
c313de
-const char *proccgroups =
c313de
-    "#subsys_name    hierarchy       num_cgroups     enabled\n"
c313de
-    "cpuset  2       4       1\n"
c313de
-    "cpu     3       48      1\n"
c313de
-    "cpuacct 3       48      1\n"
c313de
-    "memory  4       4       1\n"
c313de
-    "devices 5       4       1\n"
c313de
-    "freezer 6       4       1\n"
c313de
-    "blkio   8       4       1\n";
c313de
-
c313de
-
c313de
-const char *procmountsallinone =
c313de
-    "rootfs / rootfs rw 0 0\n"
c313de
-    "sysfs /sys sysfs rw,nosuid,nodev,noexec,relatime 0 0\n"
c313de
-    "proc /proc proc rw,nosuid,nodev,noexec,relatime 0 0\n"
c313de
-    "udev /dev devtmpfs rw,relatime,size=16458560k,nr_inodes=4114640,mode=755 0 0\n"
c313de
-    "devpts /dev/pts devpts rw,nosuid,noexec,relatime,gid=5,mode=620,ptmxmode=000 0 0\n"
c313de
-    "nfsd /proc/fs/nfsd nfsd rw,relatime 0 0\n"
c313de
-    "cgroup /not/really/sys/fs/cgroup cgroup rw,relatime,blkio,devices,memory,cpuacct,cpu,cpuset 0 0\n";
c313de
-
c313de
-const char *procselfcgroupsallinone =
c313de
-    "6:blkio,devices,memory,cpuacct,cpu,cpuset:/";
c313de
-
c313de
-const char *proccgroupsallinone =
c313de
-    "#subsys_name    hierarchy       num_cgroups     enabled\n"
c313de
-    "cpuset   6   1  1\n"
c313de
-    "cpu      6   1  1\n"
c313de
-    "cpuacct  6   1  1\n"
c313de
-    "memory   6   1  1\n"
c313de
-    "devices  6   1  1\n"
c313de
-    "blkio    6   1  1\n";
c313de
-
c313de
-const char *procmountslogind =
c313de
-    "none /not/really/sys/fs/cgroup tmpfs rw,rootcontext=system_u:object_r:sysfs_t:s0,seclabel,relatime,size=4k,mode=755 0 0\n"
c313de
-    "systemd /not/really/sys/fs/cgroup/systemd cgroup rw,nosuid,nodev,noexec,relatime,name=systemd 0 0\n";
c313de
-
c313de
-const char *procselfcgroupslogind =
c313de
-    "1:name=systemd:/\n";
c313de
-
c313de
-const char *proccgroupslogind =
c313de
-    "#subsys_name    hierarchy       num_cgroups     enabled\n"
c313de
-    "cpuset    0  1  1\n"
c313de
-    "cpu       0  1  1\n"
c313de
-    "cpuacct   0  1  1\n"
c313de
-    "memory    0  1  0\n"
c313de
-    "devices   0  1  1\n"
c313de
-    "freezer   0  1  1\n"
c313de
-    "net_cls   0  1  1\n"
c313de
-    "blkio     0  1  1\n"
c313de
-    "perf_event  0  1  1\n";
c313de
-
c313de
-
c313de
-
c313de
 static int make_file(const char *path,
c313de
                      const char *name,
c313de
                      const char *value)
c313de
@@ -379,29 +300,16 @@ static void init_sysfs(void)
c313de
 
c313de
 FILE *fopen(const char *path, const char *mode)
c313de
 {
c313de
-    const char *mock;
c313de
-    bool allinone = false, logind = false;
c313de
-    init_syms();
c313de
+    char *filepath = NULL;
c313de
+    const char *type = NULL;
c313de
+    FILE *rc = NULL;
c313de
+    const char *filename = getenv("VIR_CGROUP_MOCK_FILENAME");
c313de
 
c313de
-    mock = getenv("VIR_CGROUP_MOCK_MODE");
c313de
-    if (mock) {
c313de
-        if (STREQ(mock, "allinone"))
c313de
-            allinone = true;
c313de
-        else if (STREQ(mock, "logind"))
c313de
-            logind = true;
c313de
-    }
c313de
+    init_syms();
c313de
 
c313de
     if (STREQ(path, "/proc/mounts")) {
c313de
         if (STREQ(mode, "r")) {
c313de
-            if (allinone)
c313de
-                return fmemopen((void *)procmountsallinone,
c313de
-                                strlen(procmountsallinone) + 1, mode);
c313de
-            else if (logind)
c313de
-                return fmemopen((void *)procmountslogind,
c313de
-                                strlen(procmountslogind) + 1, mode);
c313de
-            else
c313de
-                return fmemopen((void *)procmounts,
c313de
-                                strlen(procmounts) + 1, mode);
c313de
+            type = "mounts";
c313de
         } else {
c313de
             errno = EACCES;
c313de
             return NULL;
c313de
@@ -409,15 +317,7 @@ FILE *fopen(const char *path, const char *mode)
c313de
     }
c313de
     if (STREQ(path, "/proc/cgroups")) {
c313de
         if (STREQ(mode, "r")) {
c313de
-            if (allinone)
c313de
-                return fmemopen((void *)proccgroupsallinone,
c313de
-                                strlen(proccgroupsallinone) + 1, mode);
c313de
-            else if (logind)
c313de
-                return fmemopen((void *)proccgroupslogind,
c313de
-                                strlen(proccgroupslogind) + 1, mode);
c313de
-            else
c313de
-                return fmemopen((void *)proccgroups,
c313de
-                                strlen(proccgroups) + 1, mode);
c313de
+            type = "cgroups";
c313de
         } else {
c313de
             errno = EACCES;
c313de
             return NULL;
c313de
@@ -425,21 +325,25 @@ FILE *fopen(const char *path, const char *mode)
c313de
     }
c313de
     if (STREQ(path, "/proc/self/cgroup")) {
c313de
         if (STREQ(mode, "r")) {
c313de
-            if (allinone)
c313de
-                return fmemopen((void *)procselfcgroupsallinone,
c313de
-                                strlen(procselfcgroupsallinone) + 1, mode);
c313de
-            else if (logind)
c313de
-                return fmemopen((void *)procselfcgroupslogind,
c313de
-                                strlen(procselfcgroupslogind) + 1, mode);
c313de
-            else
c313de
-                return fmemopen((void *)procselfcgroups,
c313de
-                                strlen(procselfcgroups) + 1, mode);
c313de
+            type = "self.cgroup";
c313de
         } else {
c313de
             errno = EACCES;
c313de
             return NULL;
c313de
         }
c313de
     }
c313de
 
c313de
+    if (type) {
c313de
+        if (!filename)
c313de
+            abort();
c313de
+        if (virAsprintfQuiet(&filepath, "%s/vircgroupdata/%s.%s",
c313de
+                             abs_srcdir, filename, type) < 0) {
c313de
+            abort();
c313de
+        }
c313de
+        rc = real_fopen(filepath, mode);
c313de
+        free(filepath);
c313de
+        return rc;
c313de
+    }
c313de
+
c313de
     return real_fopen(path, mode);
c313de
 }
c313de
 
c313de
diff --git a/tests/vircgrouptest.c b/tests/vircgrouptest.c
c313de
index be50f3e73c..7968903cad 100644
c313de
--- a/tests/vircgrouptest.c
c313de
+++ b/tests/vircgrouptest.c
c313de
@@ -890,6 +890,7 @@ mymain(void)
c313de
     DETECT_MOUNTS("no-cgroups");
c313de
     DETECT_MOUNTS("kubevirt");
c313de
 
c313de
+    setenv("VIR_CGROUP_MOCK_FILENAME", "systemd", 1);
c313de
     if (virTestRun("New cgroup for self", testCgroupNewForSelf, NULL) < 0)
c313de
         ret = -1;
c313de
 
c313de
@@ -925,20 +926,21 @@ mymain(void)
c313de
 
c313de
     if (virTestRun("virCgroupGetPercpuStats works", testCgroupGetPercpuStats, NULL) < 0)
c313de
         ret = -1;
c313de
+    unsetenv("VIR_CGROUP_MOCK_FILENAME");
c313de
 
c313de
-    setenv("VIR_CGROUP_MOCK_MODE", "allinone", 1);
c313de
+    setenv("VIR_CGROUP_MOCK_FILENAME", "all-in-one", 1);
c313de
     if (virTestRun("New cgroup for self (allinone)", testCgroupNewForSelfAllInOne, NULL) < 0)
c313de
         ret = -1;
c313de
     if (virTestRun("Cgroup available", testCgroupAvailable, (void*)0x1) < 0)
c313de
         ret = -1;
c313de
-    unsetenv("VIR_CGROUP_MOCK_MODE");
c313de
+    unsetenv("VIR_CGROUP_MOCK_FILENAME");
c313de
 
c313de
-    setenv("VIR_CGROUP_MOCK_MODE", "logind", 1);
c313de
+    setenv("VIR_CGROUP_MOCK_FILENAME", "logind", 1);
c313de
     if (virTestRun("New cgroup for self (logind)", testCgroupNewForSelfLogind, NULL) < 0)
c313de
         ret = -1;
c313de
     if (virTestRun("Cgroup available", testCgroupAvailable, (void*)0x0) < 0)
c313de
         ret = -1;
c313de
-    unsetenv("VIR_CGROUP_MOCK_MODE");
c313de
+    unsetenv("VIR_CGROUP_MOCK_FILENAME");
c313de
 
c313de
     if (getenv("LIBVIRT_SKIP_CLEANUP") == NULL)
c313de
         virFileDeleteTree(fakerootdir);
c313de
-- 
c313de
2.22.0
c313de