...

Source file src/github.com/opencontainers/runc/libcontainer/cgroups/utils_test.go

Documentation: github.com/opencontainers/runc/libcontainer/cgroups

     1  package cgroups
     2  
     3  import (
     4  	"bytes"
     5  	"errors"
     6  	"reflect"
     7  	"strings"
     8  	"testing"
     9  
    10  	"github.com/moby/sys/mountinfo"
    11  )
    12  
    13  const fedoraMountinfo = `15 35 0:3 / /proc rw,nosuid,nodev,noexec,relatime shared:5 - proc proc rw
    14  16 35 0:14 / /sys rw,nosuid,nodev,noexec,relatime shared:6 - sysfs sysfs rw,seclabel
    15  17 35 0:5 / /dev rw,nosuid shared:2 - devtmpfs devtmpfs rw,seclabel,size=8056484k,nr_inodes=2014121,mode=755
    16  18 16 0:15 / /sys/kernel/security rw,nosuid,nodev,noexec,relatime shared:7 - securityfs securityfs rw
    17  19 16 0:13 / /sys/fs/selinux rw,relatime shared:8 - selinuxfs selinuxfs rw
    18  20 17 0:16 / /dev/shm rw,nosuid,nodev shared:3 - tmpfs tmpfs rw,seclabel
    19  21 17 0:10 / /dev/pts rw,nosuid,noexec,relatime shared:4 - devpts devpts rw,seclabel,gid=5,mode=620,ptmxmode=000
    20  22 35 0:17 / /run rw,nosuid,nodev shared:21 - tmpfs tmpfs rw,seclabel,mode=755
    21  23 16 0:18 / /sys/fs/cgroup rw,nosuid,nodev,noexec shared:9 - tmpfs tmpfs rw,seclabel,mode=755
    22  24 23 0:19 / /sys/fs/cgroup/systemd rw,nosuid,nodev,noexec,relatime shared:10 - cgroup cgroup rw,xattr,release_agent=/usr/lib/systemd/systemd-cgroups-agent,name=systemd
    23  25 16 0:20 / /sys/fs/pstore rw,nosuid,nodev,noexec,relatime shared:20 - pstore pstore rw
    24  26 23 0:21 / /sys/fs/cgroup/cpuset rw,nosuid,nodev,noexec,relatime shared:11 - cgroup cgroup rw,cpuset,clone_children
    25  27 23 0:22 / /sys/fs/cgroup/cpu,cpuacct rw,nosuid,nodev,noexec,relatime shared:12 - cgroup cgroup rw,cpuacct,cpu,clone_children
    26  28 23 0:23 / /sys/fs/cgroup/memory rw,nosuid,nodev,noexec,relatime shared:13 - cgroup cgroup rw,memory,clone_children
    27  29 23 0:24 / /sys/fs/cgroup/devices rw,nosuid,nodev,noexec,relatime shared:14 - cgroup cgroup rw,devices,clone_children
    28  30 23 0:25 / /sys/fs/cgroup/freezer rw,nosuid,nodev,noexec,relatime shared:15 - cgroup cgroup rw,freezer,clone_children
    29  31 23 0:26 / /sys/fs/cgroup/net_cls rw,nosuid,nodev,noexec,relatime shared:16 - cgroup cgroup rw,net_cls,clone_children
    30  32 23 0:27 / /sys/fs/cgroup/blkio rw,nosuid,nodev,noexec,relatime shared:17 - cgroup cgroup rw,blkio,clone_children
    31  33 23 0:28 / /sys/fs/cgroup/perf_event rw,nosuid,nodev,noexec,relatime shared:18 - cgroup cgroup rw,perf_event,clone_children
    32  34 23 0:29 / /sys/fs/cgroup/hugetlb rw,nosuid,nodev,noexec,relatime shared:19 - cgroup cgroup rw,hugetlb,clone_children
    33  35 1 253:2 / / rw,relatime shared:1 - ext4 /dev/mapper/ssd-root--f20 rw,seclabel,data=ordered
    34  36 15 0:30 / /proc/sys/fs/binfmt_misc rw,relatime shared:22 - autofs systemd-1 rw,fd=38,pgrp=1,timeout=300,minproto=5,maxproto=5,direct
    35  37 17 0:12 / /dev/mqueue rw,relatime shared:23 - mqueue mqueue rw,seclabel
    36  38 35 0:31 / /tmp rw shared:24 - tmpfs tmpfs rw,seclabel
    37  39 17 0:32 / /dev/hugepages rw,relatime shared:25 - hugetlbfs hugetlbfs rw,seclabel
    38  40 16 0:7 / /sys/kernel/debug rw,relatime shared:26 - debugfs debugfs rw
    39  41 16 0:33 / /sys/kernel/config rw,relatime shared:27 - configfs configfs rw
    40  42 35 0:34 / /var/lib/nfs/rpc_pipefs rw,relatime shared:28 - rpc_pipefs sunrpc rw
    41  43 15 0:35 / /proc/fs/nfsd rw,relatime shared:29 - nfsd sunrpc rw
    42  45 35 8:17 / /boot rw,relatime shared:30 - ext4 /dev/sdb1 rw,seclabel,data=ordered
    43  46 35 253:4 / /home rw,relatime shared:31 - ext4 /dev/mapper/ssd-home rw,seclabel,data=ordered
    44  47 35 253:5 / /var/lib/libvirt/images rw,noatime,nodiratime shared:32 - ext4 /dev/mapper/ssd-virt rw,seclabel,discard,data=ordered
    45  48 35 253:12 / /mnt/old rw,relatime shared:33 - ext4 /dev/mapper/HelpDeskRHEL6-FedoraRoot rw,seclabel,data=ordered
    46  121 22 0:36 / /run/user/1000/gvfs rw,nosuid,nodev,relatime shared:104 - fuse.gvfsd-fuse gvfsd-fuse rw,user_id=1000,group_id=1000
    47  124 16 0:37 / /sys/fs/fuse/connections rw,relatime shared:107 - fusectl fusectl rw
    48  165 38 253:3 / /tmp/mnt rw,relatime shared:147 - ext4 /dev/mapper/ssd-root rw,seclabel,data=ordered
    49  167 35 253:15 / /var/lib/docker/devicemapper/mnt/aae4076022f0e2b80a2afbf8fc6df450c52080191fcef7fb679a73e6f073e5c2 rw,relatime shared:149 - ext4 /dev/mapper/docker-253:2-425882-aae4076022f0e2b80a2afbf8fc6df450c52080191fcef7fb679a73e6f073e5c2 rw,seclabel,discard,stripe=16,data=ordered
    50  171 35 253:16 / /var/lib/docker/devicemapper/mnt/c71be651f114db95180e472f7871b74fa597ee70a58ccc35cb87139ddea15373 rw,relatime shared:153 - ext4 /dev/mapper/docker-253:2-425882-c71be651f114db95180e472f7871b74fa597ee70a58ccc35cb87139ddea15373 rw,seclabel,discard,stripe=16,data=ordered
    51  175 35 253:17 / /var/lib/docker/devicemapper/mnt/1bac6ab72862d2d5626560df6197cf12036b82e258c53d981fa29adce6f06c3c rw,relatime shared:157 - ext4 /dev/mapper/docker-253:2-425882-1bac6ab72862d2d5626560df6197cf12036b82e258c53d981fa29adce6f06c3c rw,seclabel,discard,stripe=16,data=ordered
    52  179 35 253:18 / /var/lib/docker/devicemapper/mnt/d710a357d77158e80d5b2c55710ae07c94e76d34d21ee7bae65ce5418f739b09 rw,relatime shared:161 - ext4 /dev/mapper/docker-253:2-425882-d710a357d77158e80d5b2c55710ae07c94e76d34d21ee7bae65ce5418f739b09 rw,seclabel,discard,stripe=16,data=ordered
    53  183 35 253:19 / /var/lib/docker/devicemapper/mnt/6479f52366114d5f518db6837254baab48fab39f2ac38d5099250e9a6ceae6c7 rw,relatime shared:165 - ext4 /dev/mapper/docker-253:2-425882-6479f52366114d5f518db6837254baab48fab39f2ac38d5099250e9a6ceae6c7 rw,seclabel,discard,stripe=16,data=ordered
    54  187 35 253:20 / /var/lib/docker/devicemapper/mnt/8d9df91c4cca5aef49eeb2725292aab324646f723a7feab56be34c2ad08268e1 rw,relatime shared:169 - ext4 /dev/mapper/docker-253:2-425882-8d9df91c4cca5aef49eeb2725292aab324646f723a7feab56be34c2ad08268e1 rw,seclabel,discard,stripe=16,data=ordered
    55  191 35 253:21 / /var/lib/docker/devicemapper/mnt/c8240b768603d32e920d365dc9d1dc2a6af46cd23e7ae819947f969e1b4ec661 rw,relatime shared:173 - ext4 /dev/mapper/docker-253:2-425882-c8240b768603d32e920d365dc9d1dc2a6af46cd23e7ae819947f969e1b4ec661 rw,seclabel,discard,stripe=16,data=ordered
    56  195 35 253:22 / /var/lib/docker/devicemapper/mnt/2eb3a01278380bbf3ed12d86ac629eaa70a4351301ee307a5cabe7b5f3b1615f rw,relatime shared:177 - ext4 /dev/mapper/docker-253:2-425882-2eb3a01278380bbf3ed12d86ac629eaa70a4351301ee307a5cabe7b5f3b1615f rw,seclabel,discard,stripe=16,data=ordered
    57  199 35 253:23 / /var/lib/docker/devicemapper/mnt/37a17fb7c9d9b80821235d5f2662879bd3483915f245f9b49cdaa0e38779b70b rw,relatime shared:181 - ext4 /dev/mapper/docker-253:2-425882-37a17fb7c9d9b80821235d5f2662879bd3483915f245f9b49cdaa0e38779b70b rw,seclabel,discard,stripe=16,data=ordered
    58  203 35 253:24 / /var/lib/docker/devicemapper/mnt/aea459ae930bf1de913e2f29428fd80ee678a1e962d4080019d9f9774331ee2b rw,relatime shared:185 - ext4 /dev/mapper/docker-253:2-425882-aea459ae930bf1de913e2f29428fd80ee678a1e962d4080019d9f9774331ee2b rw,seclabel,discard,stripe=16,data=ordered
    59  207 35 253:25 / /var/lib/docker/devicemapper/mnt/928ead0bc06c454bd9f269e8585aeae0a6bd697f46dc8754c2a91309bc810882 rw,relatime shared:189 - ext4 /dev/mapper/docker-253:2-425882-928ead0bc06c454bd9f269e8585aeae0a6bd697f46dc8754c2a91309bc810882 rw,seclabel,discard,stripe=16,data=ordered
    60  211 35 253:26 / /var/lib/docker/devicemapper/mnt/0f284d18481d671644706e7a7244cbcf63d590d634cc882cb8721821929d0420 rw,relatime shared:193 - ext4 /dev/mapper/docker-253:2-425882-0f284d18481d671644706e7a7244cbcf63d590d634cc882cb8721821929d0420 rw,seclabel,discard,stripe=16,data=ordered
    61  215 35 253:27 / /var/lib/docker/devicemapper/mnt/d9dd16722ab34c38db2733e23f69e8f4803ce59658250dd63e98adff95d04919 rw,relatime shared:197 - ext4 /dev/mapper/docker-253:2-425882-d9dd16722ab34c38db2733e23f69e8f4803ce59658250dd63e98adff95d04919 rw,seclabel,discard,stripe=16,data=ordered
    62  219 35 253:28 / /var/lib/docker/devicemapper/mnt/bc4500479f18c2c08c21ad5282e5f826a016a386177d9874c2764751c031d634 rw,relatime shared:201 - ext4 /dev/mapper/docker-253:2-425882-bc4500479f18c2c08c21ad5282e5f826a016a386177d9874c2764751c031d634 rw,seclabel,discard,stripe=16,data=ordered
    63  223 35 253:29 / /var/lib/docker/devicemapper/mnt/7770c8b24eb3d5cc159a065910076938910d307ab2f5d94e1dc3b24c06ee2c8a rw,relatime shared:205 - ext4 /dev/mapper/docker-253:2-425882-7770c8b24eb3d5cc159a065910076938910d307ab2f5d94e1dc3b24c06ee2c8a rw,seclabel,discard,stripe=16,data=ordered
    64  227 35 253:30 / /var/lib/docker/devicemapper/mnt/c280cd3d0bf0aa36b478b292279671624cceafc1a67eaa920fa1082601297adf rw,relatime shared:209 - ext4 /dev/mapper/docker-253:2-425882-c280cd3d0bf0aa36b478b292279671624cceafc1a67eaa920fa1082601297adf rw,seclabel,discard,stripe=16,data=ordered
    65  231 35 253:31 / /var/lib/docker/devicemapper/mnt/8b59a7d9340279f09fea67fd6ad89ddef711e9e7050eb647984f8b5ef006335f rw,relatime shared:213 - ext4 /dev/mapper/docker-253:2-425882-8b59a7d9340279f09fea67fd6ad89ddef711e9e7050eb647984f8b5ef006335f rw,seclabel,discard,stripe=16,data=ordered
    66  235 35 253:32 / /var/lib/docker/devicemapper/mnt/1a28059f29eda821578b1bb27a60cc71f76f846a551abefabce6efd0146dce9f rw,relatime shared:217 - ext4 /dev/mapper/docker-253:2-425882-1a28059f29eda821578b1bb27a60cc71f76f846a551abefabce6efd0146dce9f rw,seclabel,discard,stripe=16,data=ordered
    67  239 35 253:33 / /var/lib/docker/devicemapper/mnt/e9aa60c60128cad1 rw,relatime shared:221 - ext4 /dev/mapper/docker-253:2-425882-e9aa60c60128cad1 rw,seclabel,discard,stripe=16,data=ordered
    68  243 35 253:34 / /var/lib/docker/devicemapper/mnt/5fec11304b6f4713fea7b6ccdcc1adc0a1966187f590fe25a8227428a8df275d-init rw,relatime shared:225 - ext4 /dev/mapper/docker-253:2-425882-5fec11304b6f4713fea7b6ccdcc1adc0a1966187f590fe25a8227428a8df275d-init rw,seclabel,discard,stripe=16,data=ordered
    69  247 35 253:35 / /var/lib/docker/devicemapper/mnt/5fec11304b6f4713fea7b6ccdcc1adc0a1966187f590fe25a8227428a8df275d rw,relatime shared:229 - ext4 /dev/mapper/docker-253:2-425882-5fec11304b6f4713fea7b6ccdcc1adc0a1966187f590fe25a8227428a8df275d rw,seclabel,discard,stripe=16,data=ordered
    70  31 21 0:23 / /DATA/foo_bla_bla rw,relatime - cifs //foo/BLA\040BLA\040BLA/ rw,sec=ntlm,cache=loose,unc=\\foo\BLA BLA BLA,username=my_login,domain=mydomain.com,uid=12345678,forceuid,gid=12345678,forcegid,addr=10.1.30.10,file_mode=0755,dir_mode=0755,nounix,rsize=61440,wsize=65536,actimeo=1`
    71  
    72  const systemdMountinfo = `115 83 0:32 / / rw,relatime - aufs none rw,si=c0bd3d3,dio,dirperm1
    73  116 115 0:35 / /proc rw,nosuid,nodev,noexec,relatime - proc proc rw
    74  117 115 0:36 / /dev rw,nosuid - tmpfs tmpfs rw,mode=755
    75  118 117 0:37 / /dev/pts rw,nosuid,noexec,relatime - devpts devpts rw,gid=5,mode=620,ptmxmode=666
    76  119 115 0:38 / /sys rw,nosuid,nodev,noexec,relatime - sysfs sysfs rw
    77  120 119 0:39 / /sys/fs/cgroup rw,nosuid,nodev,noexec,relatime - tmpfs tmpfs rw,mode=755
    78  121 120 0:19 /system.slice/docker-dc4eaa1a34ec4d593bc0125d31eea823a1d76ae483aeb1409cca80304e34da2e.scope /sys/fs/cgroup/systemd rw,nosuid,nodev,noexec,relatime - cgroup cgroup rw,xattr,release_agent=/lib/systemd/systemd-cgroups-agent,name=systemd
    79  122 120 0:20 /system.slice/docker-dc4eaa1a34ec4d593bc0125d31eea823a1d76ae483aeb1409cca80304e34da2e.scope /sys/fs/cgroup/devices rw,nosuid,nodev,noexec,relatime - cgroup cgroup rw,devices
    80  123 120 0:21 /system.slice/docker-dc4eaa1a34ec4d593bc0125d31eea823a1d76ae483aeb1409cca80304e34da2e.scope /sys/fs/cgroup/freezer rw,nosuid,nodev,noexec,relatime - cgroup cgroup rw,freezer
    81  124 120 0:22 /system.slice/docker-dc4eaa1a34ec4d593bc0125d31eea823a1d76ae483aeb1409cca80304e34da2e.scope /sys/fs/cgroup/memory rw,nosuid,nodev,noexec,relatime - cgroup cgroup rw,memory
    82  125 120 0:23 /system.slice/docker-dc4eaa1a34ec4d593bc0125d31eea823a1d76ae483aeb1409cca80304e34da2e.scope /sys/fs/cgroup/net_cls,net_prio rw,nosuid,nodev,noexec,relatime - cgroup cgroup rw,net_cls,net_prio
    83  126 120 0:24 /system.slice/docker-dc4eaa1a34ec4d593bc0125d31eea823a1d76ae483aeb1409cca80304e34da2e.scope /sys/fs/cgroup/blkio rw,nosuid,nodev,noexec,relatime - cgroup cgroup rw,blkio
    84  127 120 0:25 /system.slice/docker-dc4eaa1a34ec4d593bc0125d31eea823a1d76ae483aeb1409cca80304e34da2e.scope /sys/fs/cgroup/cpuset rw,nosuid,nodev,noexec,relatime - cgroup cgroup rw,cpuset,clone_children
    85  128 120 0:26 /system.slice/docker-dc4eaa1a34ec4d593bc0125d31eea823a1d76ae483aeb1409cca80304e34da2e.scope /sys/fs/cgroup/cpu,cpuacct rw,nosuid,nodev,noexec,relatime - cgroup cgroup rw,cpu,cpuacct
    86  129 120 0:27 /system.slice/docker-dc4eaa1a34ec4d593bc0125d31eea823a1d76ae483aeb1409cca80304e34da2e.scope /sys/fs/cgroup/perf_event rw,nosuid,nodev,noexec,relatime - cgroup cgroup rw,perf_event,release_agent=/run/cgmanager/agents/cgm-release-agent.perf_event
    87  130 115 43:0 /var/lib/docker/volumes/a44a712176377f57c094397330ee04387284c478364eb25f4c3d25f775f25c26/_data /var/lib/docker rw,relatime - ext4 /dev/nbd0 rw,data=ordered
    88  131 115 43:0 /var/lib/docker/containers/dc4eaa1a34ec4d593bc0125d31eea823a1d76ae483aeb1409cca80304e34da2e/resolv.conf /etc/resolv.conf rw,relatime - ext4 /dev/nbd0 rw,data=ordered
    89  132 115 43:0 /var/lib/docker/containers/dc4eaa1a34ec4d593bc0125d31eea823a1d76ae483aeb1409cca80304e34da2e/hostname /etc/hostname rw,relatime - ext4 /dev/nbd0 rw,data=ordered
    90  133 115 43:0 /var/lib/docker/containers/dc4eaa1a34ec4d593bc0125d31eea823a1d76ae483aeb1409cca80304e34da2e/hosts /etc/hosts rw,relatime - ext4 /dev/nbd0 rw,data=ordered
    91  134 117 0:33 / /dev/shm rw,nosuid,nodev,noexec,relatime - tmpfs shm rw,size=65536k
    92  135 117 0:13 / /dev/mqueue rw,nosuid,nodev,noexec,relatime - mqueue mqueue rw
    93  136 117 0:12 /1 /dev/console rw,nosuid,noexec,relatime - devpts none rw,gid=5,mode=620,ptmxmode=000
    94  84 115 0:40 / /tmp rw,relatime - tmpfs none rw`
    95  
    96  const bedrockMountinfo = `120 17 0:28 / /sys/fs/cgroup ro,nosuid,nodev,noexec shared:16 - tmpfs tmpfs ro,mode=755
    97  124 28 0:28 / /bedrock/strata/arch/sys/fs/cgroup rw,nosuid,nodev,noexec shared:16 - tmpfs tmpfs ro,mode=755
    98  123 53 0:28 / /bedrock/strata/fallback/sys/fs/cgroup rw,nosuid,nodev,noexec shared:16 - tmpfs tmpfs ro,mode=755
    99  122 71 0:28 / /bedrock/strata/gentoo/sys/fs/cgroup rw,nosuid,nodev,noexec shared:16 - tmpfs tmpfs ro,mode=755
   100  121 89 0:28 / /bedrock/strata/kde/sys/fs/cgroup rw,nosuid,nodev,noexec shared:16 - tmpfs tmpfs ro,mode=755
   101  125 120 0:29 / /sys/fs/cgroup/systemd rw,nosuid,nodev,noexec,relatime shared:17 - cgroup cgroup rw,xattr,release_agent=/lib/systemd/systemd-cgroups-agent,name=systemd
   102  129 124 0:29 / /bedrock/strata/arch/sys/fs/cgroup/systemd rw,nosuid,nodev,noexec,relatime shared:17 - cgroup cgroup rw,xattr,release_agent=/lib/systemd/systemd-cgroups-agent,name=systemd
   103  128 123 0:29 / /bedrock/strata/fallback/sys/fs/cgroup/systemd rw,nosuid,nodev,noexec,relatime shared:17 - cgroup cgroup rw,xattr,release_agent=/lib/systemd/systemd-cgroups-agent,name=systemd
   104  127 122 0:29 / /bedrock/strata/gentoo/sys/fs/cgroup/systemd rw,nosuid,nodev,noexec,relatime shared:17 - cgroup cgroup rw,xattr,release_agent=/lib/systemd/systemd-cgroups-agent,name=systemd
   105  126 121 0:29 / /bedrock/strata/kde/sys/fs/cgroup/systemd rw,nosuid,nodev,noexec,relatime shared:17 - cgroup cgroup rw,xattr,release_agent=/lib/systemd/systemd-cgroups-agent,name=systemd
   106  140 120 0:32 / /sys/fs/cgroup/net_cls,net_prio rw,nosuid,nodev,noexec,relatime shared:48 - cgroup cgroup rw,net_cls,net_prio
   107  144 124 0:32 / /bedrock/strata/arch/sys/fs/cgroup/net_cls,net_prio rw,nosuid,nodev,noexec,relatime shared:48 - cgroup cgroup rw,net_cls,net_prio
   108  143 123 0:32 / /bedrock/strata/fallback/sys/fs/cgroup/net_cls,net_prio rw,nosuid,nodev,noexec,relatime shared:48 - cgroup cgroup rw,net_cls,net_prio
   109  142 122 0:32 / /bedrock/strata/gentoo/sys/fs/cgroup/net_cls,net_prio rw,nosuid,nodev,noexec,relatime shared:48 - cgroup cgroup rw,net_cls,net_prio
   110  141 121 0:32 / /bedrock/strata/kde/sys/fs/cgroup/net_cls,net_prio rw,nosuid,nodev,noexec,relatime shared:48 - cgroup cgroup rw,net_cls,net_prio
   111  145 120 0:33 / /sys/fs/cgroup/blkio rw,nosuid,nodev,noexec,relatime shared:49 - cgroup cgroup rw,blkio
   112  149 124 0:33 / /bedrock/strata/arch/sys/fs/cgroup/blkio rw,nosuid,nodev,noexec,relatime shared:49 - cgroup cgroup rw,blkio
   113  148 123 0:33 / /bedrock/strata/fallback/sys/fs/cgroup/blkio rw,nosuid,nodev,noexec,relatime shared:49 - cgroup cgroup rw,blkio
   114  147 122 0:33 / /bedrock/strata/gentoo/sys/fs/cgroup/blkio rw,nosuid,nodev,noexec,relatime shared:49 - cgroup cgroup rw,blkio
   115  146 121 0:33 / /bedrock/strata/kde/sys/fs/cgroup/blkio rw,nosuid,nodev,noexec,relatime shared:49 - cgroup cgroup rw,blkio
   116  150 120 0:34 / /sys/fs/cgroup/cpu,cpuacct rw,nosuid,nodev,noexec,relatime shared:50 - cgroup cgroup rw,cpu,cpuacct
   117  154 124 0:34 / /bedrock/strata/arch/sys/fs/cgroup/cpu,cpuacct rw,nosuid,nodev,noexec,relatime shared:50 - cgroup cgroup rw,cpu,cpuacct
   118  153 123 0:34 / /bedrock/strata/fallback/sys/fs/cgroup/cpu,cpuacct rw,nosuid,nodev,noexec,relatime shared:50 - cgroup cgroup rw,cpu,cpuacct
   119  152 122 0:34 / /bedrock/strata/gentoo/sys/fs/cgroup/cpu,cpuacct rw,nosuid,nodev,noexec,relatime shared:50 - cgroup cgroup rw,cpu,cpuacct
   120  151 121 0:34 / /bedrock/strata/kde/sys/fs/cgroup/cpu,cpuacct rw,nosuid,nodev,noexec,relatime shared:50 - cgroup cgroup rw,cpu,cpuacct
   121  155 120 0:35 / /sys/fs/cgroup/cpuset rw,nosuid,nodev,noexec,relatime shared:51 - cgroup cgroup rw,cpuset
   122  159 124 0:35 / /bedrock/strata/arch/sys/fs/cgroup/cpuset rw,nosuid,nodev,noexec,relatime shared:51 - cgroup cgroup rw,cpuset
   123  158 123 0:35 / /bedrock/strata/fallback/sys/fs/cgroup/cpuset rw,nosuid,nodev,noexec,relatime shared:51 - cgroup cgroup rw,cpuset
   124  157 122 0:35 / /bedrock/strata/gentoo/sys/fs/cgroup/cpuset rw,nosuid,nodev,noexec,relatime shared:51 - cgroup cgroup rw,cpuset
   125  156 121 0:35 / /bedrock/strata/kde/sys/fs/cgroup/cpuset rw,nosuid,nodev,noexec,relatime shared:51 - cgroup cgroup rw,cpuset
   126  160 120 0:36 / /sys/fs/cgroup/devices rw,nosuid,nodev,noexec,relatime shared:52 - cgroup cgroup rw,devices
   127  164 124 0:36 / /bedrock/strata/arch/sys/fs/cgroup/devices rw,nosuid,nodev,noexec,relatime shared:52 - cgroup cgroup rw,devices
   128  163 123 0:36 / /bedrock/strata/fallback/sys/fs/cgroup/devices rw,nosuid,nodev,noexec,relatime shared:52 - cgroup cgroup rw,devices
   129  162 122 0:36 / /bedrock/strata/gentoo/sys/fs/cgroup/devices rw,nosuid,nodev,noexec,relatime shared:52 - cgroup cgroup rw,devices
   130  161 121 0:36 / /bedrock/strata/kde/sys/fs/cgroup/devices rw,nosuid,nodev,noexec,relatime shared:52 - cgroup cgroup rw,devices
   131  165 120 0:37 / /sys/fs/cgroup/memory rw,nosuid,nodev,noexec,relatime shared:53 - cgroup cgroup rw,memory
   132  169 124 0:37 / /bedrock/strata/arch/sys/fs/cgroup/memory rw,nosuid,nodev,noexec,relatime shared:53 - cgroup cgroup rw,memory
   133  168 123 0:37 / /bedrock/strata/fallback/sys/fs/cgroup/memory rw,nosuid,nodev,noexec,relatime shared:53 - cgroup cgroup rw,memory
   134  167 122 0:37 / /bedrock/strata/gentoo/sys/fs/cgroup/memory rw,nosuid,nodev,noexec,relatime shared:53 - cgroup cgroup rw,memory
   135  166 121 0:37 / /bedrock/strata/kde/sys/fs/cgroup/memory rw,nosuid,nodev,noexec,relatime shared:53 - cgroup cgroup rw,memory
   136  170 120 0:38 / /sys/fs/cgroup/freezer rw,nosuid,nodev,noexec,relatime shared:54 - cgroup cgroup rw,freezer
   137  174 124 0:38 / /bedrock/strata/arch/sys/fs/cgroup/freezer rw,nosuid,nodev,noexec,relatime shared:54 - cgroup cgroup rw,freezer
   138  173 123 0:38 / /bedrock/strata/fallback/sys/fs/cgroup/freezer rw,nosuid,nodev,noexec,relatime shared:54 - cgroup cgroup rw,freezer
   139  172 122 0:38 / /bedrock/strata/gentoo/sys/fs/cgroup/freezer rw,nosuid,nodev,noexec,relatime shared:54 - cgroup cgroup rw,freezer
   140  171 121 0:38 / /bedrock/strata/kde/sys/fs/cgroup/freezer rw,nosuid,nodev,noexec,relatime shared:54 - cgroup cgroup rw,freezer
   141  175 120 0:39 / /sys/fs/cgroup/pids rw,nosuid,nodev,noexec,relatime shared:55 - cgroup cgroup rw,pids
   142  179 124 0:39 / /bedrock/strata/arch/sys/fs/cgroup/pids rw,nosuid,nodev,noexec,relatime shared:55 - cgroup cgroup rw,pids
   143  178 123 0:39 / /bedrock/strata/fallback/sys/fs/cgroup/pids rw,nosuid,nodev,noexec,relatime shared:55 - cgroup cgroup rw,pids
   144  177 122 0:39 / /bedrock/strata/gentoo/sys/fs/cgroup/pids rw,nosuid,nodev,noexec,relatime shared:55 - cgroup cgroup rw,pids
   145  176 121 0:39 / /bedrock/strata/kde/sys/fs/cgroup/pids rw,nosuid,nodev,noexec,relatime shared:55 - cgroup cgroup rw,pids
   146  180 120 0:40 / /sys/fs/cgroup/perf_event rw,nosuid,nodev,noexec,relatime shared:56 - cgroup cgroup rw,perf_event
   147  184 124 0:40 / /bedrock/strata/arch/sys/fs/cgroup/perf_event rw,nosuid,nodev,noexec,relatime shared:56 - cgroup cgroup rw,perf_event
   148  183 123 0:40 / /bedrock/strata/fallback/sys/fs/cgroup/perf_event rw,nosuid,nodev,noexec,relatime shared:56 - cgroup cgroup rw,perf_event
   149  182 122 0:40 / /bedrock/strata/gentoo/sys/fs/cgroup/perf_event rw,nosuid,nodev,noexec,relatime shared:56 - cgroup cgroup rw,perf_event
   150  181 121 0:40 / /bedrock/strata/kde/sys/fs/cgroup/perf_event rw,nosuid,nodev,noexec,relatime shared:56 - cgroup cgroup rw,perf_event`
   151  
   152  const cgroup2Mountinfo = `18 64 0:18 / /sys rw,nosuid,nodev,noexec,relatime shared:6 - sysfs sysfs rw,seclabel
   153  19 64 0:4 / /proc rw,nosuid,nodev,noexec,relatime shared:5 - proc proc rw
   154  20 64 0:6 / /dev rw,nosuid shared:2 - devtmpfs devtmpfs rw,seclabel,size=8171204k,nr_inodes=2042801,mode=755
   155  21 18 0:19 / /sys/kernel/security rw,nosuid,nodev,noexec,relatime shared:7 - securityfs securityfs rw
   156  22 20 0:20 / /dev/shm rw,nosuid,nodev shared:3 - tmpfs tmpfs rw,seclabel
   157  23 20 0:21 / /dev/pts rw,nosuid,noexec,relatime shared:4 - devpts devpts rw,seclabel,gid=5,mode=620,ptmxmode=000
   158  24 64 0:22 / /run rw,nosuid,nodev shared:24 - tmpfs tmpfs rw,seclabel,mode=755
   159  25 18 0:23 / /sys/fs/cgroup ro,nosuid,nodev,noexec shared:8 - tmpfs tmpfs ro,seclabel,mode=755
   160  26 25 0:24 / /sys/fs/cgroup/systemd rw,nosuid,nodev,noexec,relatime shared:9 - cgroup2 cgroup rw
   161  27 18 0:25 / /sys/fs/pstore rw,nosuid,nodev,noexec,relatime shared:20 - pstore pstore rw,seclabel
   162  28 18 0:26 / /sys/firmware/efi/efivars rw,nosuid,nodev,noexec,relatime shared:21 - efivarfs efivarfs rw
   163  29 25 0:27 / /sys/fs/cgroup/cpu,cpuacct rw,nosuid,nodev,noexec,relatime shared:10 - cgroup cgroup rw,cpu,cpuacct
   164  30 25 0:28 / /sys/fs/cgroup/memory rw,nosuid,nodev,noexec,relatime shared:11 - cgroup cgroup rw,memory
   165  31 25 0:29 / /sys/fs/cgroup/net_cls,net_prio rw,nosuid,nodev,noexec,relatime shared:12 - cgroup cgroup rw,net_cls,net_prio
   166  32 25 0:30 / /sys/fs/cgroup/blkio rw,nosuid,nodev,noexec,relatime shared:13 - cgroup cgroup rw,blkio
   167  33 25 0:31 / /sys/fs/cgroup/perf_event rw,nosuid,nodev,noexec,relatime shared:14 - cgroup cgroup rw,perf_event
   168  34 25 0:32 / /sys/fs/cgroup/hugetlb rw,nosuid,nodev,noexec,relatime shared:15 - cgroup cgroup rw,hugetlb
   169  35 25 0:33 / /sys/fs/cgroup/freezer rw,nosuid,nodev,noexec,relatime shared:16 - cgroup cgroup rw,freezer
   170  36 25 0:34 / /sys/fs/cgroup/cpuset rw,nosuid,nodev,noexec,relatime shared:17 - cgroup cgroup rw,cpuset
   171  37 25 0:35 / /sys/fs/cgroup/devices rw,nosuid,nodev,noexec,relatime shared:18 - cgroup cgroup rw,devices
   172  38 25 0:36 / /sys/fs/cgroup/pids rw,nosuid,nodev,noexec,relatime shared:19 - cgroup cgroup rw,pids
   173  61 18 0:37 / /sys/kernel/config rw,relatime shared:22 - configfs configfs rw
   174  64 0 253:0 / / rw,relatime shared:1 - ext4 /dev/mapper/fedora_dhcp--16--129-root rw,seclabel,data=ordered
   175  39 18 0:17 / /sys/fs/selinux rw,relatime shared:23 - selinuxfs selinuxfs rw
   176  40 20 0:16 / /dev/mqueue rw,relatime shared:25 - mqueue mqueue rw,seclabel
   177  41 20 0:39 / /dev/hugepages rw,relatime shared:26 - hugetlbfs hugetlbfs rw,seclabel
   178  `
   179  
   180  func TestGetCgroupMounts(t *testing.T) {
   181  	type testData struct {
   182  		mountInfo string
   183  		root      string
   184  		// all is the total number of records expected with all=true,
   185  		// or 0 for no extra records expected (most cases).
   186  		all        int
   187  		subsystems map[string]bool
   188  	}
   189  	testTable := []testData{
   190  		{
   191  			mountInfo: fedoraMountinfo,
   192  			root:      "/",
   193  			subsystems: map[string]bool{
   194  				"name=systemd": false,
   195  				"cpuset":       false,
   196  				"cpu":          false,
   197  				"cpuacct":      false,
   198  				"memory":       false,
   199  				"devices":      false,
   200  				"freezer":      false,
   201  				"net_cls":      false,
   202  				"blkio":        false,
   203  				"perf_event":   false,
   204  				"hugetlb":      false,
   205  			},
   206  		},
   207  		{
   208  			mountInfo: systemdMountinfo,
   209  			root:      "/system.slice/docker-dc4eaa1a34ec4d593bc0125d31eea823a1d76ae483aeb1409cca80304e34da2e.scope",
   210  			subsystems: map[string]bool{
   211  				"name=systemd": false,
   212  				"cpuset":       false,
   213  				"cpu":          false,
   214  				"cpuacct":      false,
   215  				"memory":       false,
   216  				"devices":      false,
   217  				"freezer":      false,
   218  				"net_cls":      false,
   219  				"net_prio":     false,
   220  				"blkio":        false,
   221  				"perf_event":   false,
   222  			},
   223  		},
   224  		{
   225  			mountInfo: bedrockMountinfo,
   226  			root:      "/",
   227  			all:       50,
   228  			subsystems: map[string]bool{
   229  				"name=systemd": false,
   230  				"cpuset":       false,
   231  				"cpu":          false,
   232  				"cpuacct":      false,
   233  				"memory":       false,
   234  				"devices":      false,
   235  				"freezer":      false,
   236  				"net_cls":      false,
   237  				"net_prio":     false,
   238  				"blkio":        false,
   239  				"perf_event":   false,
   240  				"pids":         false,
   241  			},
   242  		},
   243  	}
   244  	for _, td := range testTable {
   245  		mi, err := mountinfo.GetMountsFromReader(
   246  			bytes.NewBufferString(td.mountInfo),
   247  			mountinfo.FSTypeFilter("cgroup"),
   248  		)
   249  		if err != nil {
   250  			t.Fatal(err)
   251  		}
   252  		cgMounts, err := getCgroupMountsHelper(td.subsystems, mi, false)
   253  		if err != nil {
   254  			t.Fatal(err)
   255  		}
   256  		cgMap := make(map[string]Mount)
   257  		for _, m := range cgMounts {
   258  			for _, ss := range m.Subsystems {
   259  				cgMap[ss] = m
   260  			}
   261  		}
   262  		for ss := range td.subsystems {
   263  			ss = strings.TrimPrefix(ss, CgroupNamePrefix)
   264  			m, ok := cgMap[ss]
   265  			if !ok {
   266  				t.Fatalf("%s not found", ss)
   267  			}
   268  			if m.Root != td.root {
   269  				t.Fatalf("unexpected root for %s: %s", ss, m.Root)
   270  			}
   271  			if !strings.HasPrefix(m.Mountpoint, "/sys/fs/cgroup/") && !strings.Contains(m.Mountpoint, ss) {
   272  				t.Fatalf("unexpected mountpoint for %s: %s", ss, m.Mountpoint)
   273  			}
   274  			var ssFound bool
   275  			for _, mss := range m.Subsystems {
   276  				if mss == ss {
   277  					ssFound = true
   278  					break
   279  				}
   280  			}
   281  			if !ssFound {
   282  				t.Fatalf("subsystem %s not found in Subsystems field %v", ss, m.Subsystems)
   283  			}
   284  		}
   285  		// Test the all=true case.
   286  
   287  		// Reset the test input.
   288  		for k := range td.subsystems {
   289  			td.subsystems[k] = false
   290  		}
   291  		cgMountsAll, err := getCgroupMountsHelper(td.subsystems, mi, true)
   292  		if err != nil {
   293  			t.Fatal(err)
   294  		}
   295  		if td.all == 0 {
   296  			// Results with and without "all" should be the same.
   297  			if len(cgMounts) != len(cgMountsAll) || !reflect.DeepEqual(cgMounts, cgMountsAll) {
   298  				t.Errorf("expected same results, got (all=false) %v, (all=true) %v", cgMounts, cgMountsAll)
   299  			}
   300  		} else {
   301  			// Make sure we got all records.
   302  			if len(cgMountsAll) != td.all {
   303  				t.Errorf("expected %d records, got %d (%+v)", td.all, len(cgMountsAll), cgMountsAll)
   304  			}
   305  		}
   306  
   307  	}
   308  }
   309  
   310  func BenchmarkGetCgroupMounts(b *testing.B) {
   311  	subsystems := map[string]bool{
   312  		"cpuset":     false,
   313  		"cpu":        false,
   314  		"cpuacct":    false,
   315  		"memory":     false,
   316  		"devices":    false,
   317  		"freezer":    false,
   318  		"net_cls":    false,
   319  		"blkio":      false,
   320  		"perf_event": false,
   321  		"hugetlb":    false,
   322  	}
   323  	mi, err := mountinfo.GetMountsFromReader(
   324  		bytes.NewBufferString(fedoraMountinfo),
   325  		mountinfo.FSTypeFilter("cgroup"),
   326  	)
   327  	if err != nil {
   328  		b.Fatal(err)
   329  	}
   330  	b.ResetTimer()
   331  	for i := 0; i < b.N; i++ {
   332  		if _, err := getCgroupMountsHelper(subsystems, mi, false); err != nil {
   333  			b.Fatal(err)
   334  		}
   335  	}
   336  }
   337  
   338  func TestParseCgroupString(t *testing.T) {
   339  	testCases := []struct {
   340  		input          string
   341  		expectedError  error
   342  		expectedOutput map[string]string
   343  	}{
   344  		{
   345  			// Taken from a CoreOS instance running systemd 225 with CPU/Mem
   346  			// accounting enabled in systemd
   347  			input: `9:blkio:/
   348  8:freezer:/
   349  7:perf_event:/
   350  6:devices:/system.slice/system-sshd.slice
   351  5:cpuset:/
   352  4:cpu,cpuacct:/system.slice/system-sshd.slice/sshd@126-10.240.0.15:22-xxx.yyy.zzz.aaa:33678.service
   353  3:net_cls,net_prio:/
   354  2:memory:/system.slice/system-sshd.slice/sshd@126-10.240.0.15:22-xxx.yyy.zzz.aaa:33678.service
   355  1:name=systemd:/system.slice/system-sshd.slice/sshd@126-10.240.0.15:22-xxx.yyy.zzz.aaa:33678.service`,
   356  			expectedOutput: map[string]string{
   357  				"name=systemd": "/system.slice/system-sshd.slice/sshd@126-10.240.0.15:22-xxx.yyy.zzz.aaa:33678.service",
   358  				"blkio":        "/",
   359  				"freezer":      "/",
   360  				"perf_event":   "/",
   361  				"devices":      "/system.slice/system-sshd.slice",
   362  				"cpuset":       "/",
   363  				"cpu":          "/system.slice/system-sshd.slice/sshd@126-10.240.0.15:22-xxx.yyy.zzz.aaa:33678.service",
   364  				"cpuacct":      "/system.slice/system-sshd.slice/sshd@126-10.240.0.15:22-xxx.yyy.zzz.aaa:33678.service",
   365  				"net_cls":      "/",
   366  				"net_prio":     "/",
   367  				"memory":       "/system.slice/system-sshd.slice/sshd@126-10.240.0.15:22-xxx.yyy.zzz.aaa:33678.service",
   368  			},
   369  		},
   370  		{
   371  			input:         `malformed input`,
   372  			expectedError: errors.New(`invalid cgroup entry: must contain at least two colons: malformed input`),
   373  		},
   374  	}
   375  
   376  	for ndx, testCase := range testCases {
   377  		out, err := parseCgroupFromReader(strings.NewReader(testCase.input))
   378  		if err != nil {
   379  			if testCase.expectedError == nil || testCase.expectedError.Error() != err.Error() {
   380  				t.Errorf("%v: expected error %v, got error %v", ndx, testCase.expectedError, err)
   381  			}
   382  		} else {
   383  			if !reflect.DeepEqual(testCase.expectedOutput, out) {
   384  				t.Errorf("%v: expected output %v, got error %v", ndx, testCase.expectedOutput, out)
   385  			}
   386  		}
   387  	}
   388  }
   389  
   390  func TestIgnoreCgroup2Mount(t *testing.T) {
   391  	subsystems := map[string]bool{
   392  		"cpuset":       false,
   393  		"cpu":          false,
   394  		"cpuacct":      false,
   395  		"memory":       false,
   396  		"devices":      false,
   397  		"freezer":      false,
   398  		"net_cls":      false,
   399  		"blkio":        false,
   400  		"perf_event":   false,
   401  		"pids":         false,
   402  		"name=systemd": false,
   403  	}
   404  
   405  	mi, err := mountinfo.GetMountsFromReader(
   406  		bytes.NewBufferString(cgroup2Mountinfo),
   407  		mountinfo.FSTypeFilter("cgroup"),
   408  	)
   409  	if err != nil {
   410  		t.Fatal(err)
   411  	}
   412  	cgMounts, err := getCgroupMountsHelper(subsystems, mi, false)
   413  	if err != nil {
   414  		t.Fatal(err)
   415  	}
   416  	for _, m := range cgMounts {
   417  		if m.Mountpoint == "/sys/fs/cgroup/systemd" {
   418  			t.Errorf("parsed a cgroup2 mount at /sys/fs/cgroup/systemd instead of ignoring it")
   419  		}
   420  	}
   421  }
   422  
   423  func TestFindCgroupMountpointAndRoot(t *testing.T) {
   424  	fakeMountInfo := `35 27 0:29 / /foo rw,nosuid,nodev,noexec,relatime shared:18 - cgroup cgroup rw,devices
   425  35 27 0:29 / /sys/fs/cgroup/devices rw,nosuid,nodev,noexec,relatime shared:18 - cgroup cgroup rw,devices`
   426  	testCases := []struct {
   427  		cgroupPath string
   428  		output     string
   429  	}{
   430  		{cgroupPath: "/sys/fs", output: "/sys/fs/cgroup/devices"},
   431  		{cgroupPath: "", output: "/foo"},
   432  	}
   433  
   434  	mi, err := mountinfo.GetMountsFromReader(
   435  		bytes.NewBufferString(fakeMountInfo),
   436  		mountinfo.FSTypeFilter("cgroup"),
   437  	)
   438  	if err != nil {
   439  		t.Fatal(err)
   440  	}
   441  
   442  	for _, c := range testCases {
   443  		mountpoint, _, _ := findCgroupMountpointAndRootFromMI(mi, c.cgroupPath, "devices")
   444  		if mountpoint != c.output {
   445  			t.Errorf("expected %s, got %s", c.output, mountpoint)
   446  		}
   447  	}
   448  }
   449  
   450  func BenchmarkGetHugePageSizeImpl(b *testing.B) {
   451  	var (
   452  		input  = []string{"hugepages-1048576kB", "hugepages-2048kB", "hugepages-32768kB", "hugepages-64kB"}
   453  		output []string
   454  		err    error
   455  	)
   456  	for i := 0; i < b.N; i++ {
   457  		output, err = getHugePageSizeFromFilenames(input)
   458  	}
   459  	if err != nil || len(output) != len(input) {
   460  		b.Fatal("unexpected results")
   461  	}
   462  }
   463  
   464  func TestGetHugePageSizeImpl(t *testing.T) {
   465  	testCases := []struct {
   466  		doc    string
   467  		input  []string
   468  		output []string
   469  		isErr  bool
   470  	}{
   471  		{
   472  			doc:    "normal input",
   473  			input:  []string{"hugepages-1048576kB", "hugepages-2048kB", "hugepages-32768kB", "hugepages-64kB"},
   474  			output: []string{"1GB", "2MB", "32MB", "64KB"},
   475  		},
   476  		{
   477  			doc:    "empty input",
   478  			input:  []string{},
   479  			output: []string{},
   480  		},
   481  		{
   482  			doc:   "not a number",
   483  			input: []string{"hugepages-akB"},
   484  			isErr: true,
   485  		},
   486  		{
   487  			doc:   "no prefix (silently skipped)",
   488  			input: []string{"1024kB"},
   489  		},
   490  		{
   491  			doc:   "invalid prefix (silently skipped)",
   492  			input: []string{"whatever-1024kB"},
   493  		},
   494  		{
   495  			doc:   "invalid suffix",
   496  			input: []string{"hugepages-1024gB"},
   497  			isErr: true,
   498  		},
   499  		{
   500  			doc:   "no suffix",
   501  			input: []string{"hugepages-1024"},
   502  			isErr: true,
   503  		},
   504  		{
   505  			doc:    "mixed valid and invalid entries",
   506  			input:  []string{"hugepages-4194304kB", "hugepages-2048kB", "hugepages-akB", "hugepages-64kB"},
   507  			output: []string{"4GB", "2MB", "64KB"},
   508  			isErr:  true,
   509  		},
   510  		{
   511  			doc:    "more mixed valid and invalid entries",
   512  			input:  []string{"hugepages-2048kB", "hugepages-kB", "hugepages-64kB"},
   513  			output: []string{"2MB", "64KB"},
   514  			isErr:  true,
   515  		},
   516  	}
   517  
   518  	for _, c := range testCases {
   519  		c := c
   520  		t.Run(c.doc, func(t *testing.T) {
   521  			output, err := getHugePageSizeFromFilenames(c.input)
   522  			t.Log("input:", c.input, "; output:", output, "; err:", err)
   523  			if err != nil {
   524  				if !c.isErr {
   525  					t.Errorf("input %v, expected nil, got error: %v", c.input, err)
   526  				}
   527  				// no more checks
   528  				return
   529  			}
   530  			if c.isErr {
   531  				t.Errorf("input %v, expected error, got error: nil, output: %v", c.input, output)
   532  			}
   533  			// check output
   534  			if len(output) != len(c.output) || (len(output) > 0 && !reflect.DeepEqual(output, c.output)) {
   535  				t.Errorf("input %v, expected %v, got %v", c.input, c.output, output)
   536  			}
   537  		})
   538  	}
   539  }
   540  
   541  func TestConvertCPUSharesToCgroupV2Value(t *testing.T) {
   542  	cases := map[uint64]uint64{
   543  		0:      0,
   544  		2:      1,
   545  		262144: 10000,
   546  	}
   547  	for i, expected := range cases {
   548  		got := ConvertCPUSharesToCgroupV2Value(i)
   549  		if got != expected {
   550  			t.Errorf("expected ConvertCPUSharesToCgroupV2Value(%d) to be %d, got %d", i, expected, got)
   551  		}
   552  	}
   553  }
   554  
   555  func TestConvertMemorySwapToCgroupV2Value(t *testing.T) {
   556  	cases := []struct {
   557  		memswap, memory int64
   558  		expected        int64
   559  		expErr          bool
   560  	}{
   561  		{
   562  			memswap:  0,
   563  			memory:   0,
   564  			expected: 0,
   565  		},
   566  		{
   567  			memswap:  -1,
   568  			memory:   0,
   569  			expected: -1,
   570  		},
   571  		{
   572  			memswap:  -1,
   573  			memory:   -1,
   574  			expected: -1,
   575  		},
   576  		{
   577  			memswap: -2,
   578  			memory:  0,
   579  			expErr:  true,
   580  		},
   581  		{
   582  			memswap:  -1,
   583  			memory:   1000,
   584  			expected: -1,
   585  		},
   586  		{
   587  			memswap:  1000,
   588  			memory:   1000,
   589  			expected: 0,
   590  		},
   591  		{
   592  			memswap:  500,
   593  			memory:   200,
   594  			expected: 300,
   595  		},
   596  		{
   597  			memswap: 300,
   598  			memory:  400,
   599  			expErr:  true,
   600  		},
   601  		{
   602  			memswap: 300,
   603  			memory:  0,
   604  			expErr:  true,
   605  		},
   606  		{
   607  			memswap: 300,
   608  			memory:  -300,
   609  			expErr:  true,
   610  		},
   611  		{
   612  			memswap: 300,
   613  			memory:  -1,
   614  			expErr:  true,
   615  		},
   616  	}
   617  
   618  	for _, c := range cases {
   619  		swap, err := ConvertMemorySwapToCgroupV2Value(c.memswap, c.memory)
   620  		if c.expErr {
   621  			if err == nil {
   622  				t.Errorf("memswap: %d, memory %d, expected error, got %d, nil", c.memswap, c.memory, swap)
   623  			}
   624  			// no more checks
   625  			continue
   626  		}
   627  		if err != nil {
   628  			t.Errorf("memswap: %d, memory %d, expected success, got error %s", c.memswap, c.memory, err)
   629  		}
   630  		if swap != c.expected {
   631  			t.Errorf("memswap: %d, memory %d, expected %d, got %d", c.memswap, c.memory, c.expected, swap)
   632  		}
   633  	}
   634  }
   635  
   636  func TestConvertBlkIOToIOWeightValue(t *testing.T) {
   637  	cases := map[uint16]uint64{
   638  		0:    0,
   639  		10:   1,
   640  		1000: 10000,
   641  	}
   642  	for i, expected := range cases {
   643  		got := ConvertBlkIOToIOWeightValue(i)
   644  		if got != expected {
   645  			t.Errorf("expected ConvertBlkIOToIOWeightValue(%d) to be %d, got %d", i, expected, got)
   646  		}
   647  	}
   648  }
   649  

View as plain text