[libvirt] [PATCH v3 06/16] Add a test suite for cgroups functionality

Eric Blake eblake at redhat.com
Thu Apr 11 03:04:33 UTC 2013


On 04/10/2013 04:08 AM, Daniel P. Berrange wrote:
> From: "Daniel P. Berrange" <berrange at redhat.com>
> 
> Some aspects of the cgroups setup / detection code are quite subtle
> and easy to break. It would greatly benefit from unit testing, but
> this is difficult because the test suite won't have privileges to
> play around with cgroups. The solution is to use monkey patching
> via LD_PRELOAD to override the fopen, open, mkdir, access functions
> to redirect access of cgroups files to some magic stubs in the
> test suite.
> 
> Using this we provide custom content for the /proc/cgroup and
> /proc/self/mounts files which report a fixed cgroup setup. We
> then override open/mkdir/access so that access to the cgroups
> filesystem gets redirected into files in a temporary directory
> tree in the test suite build dir.

Do you also need to override openat/mkdirat/faccessat, in case we (or
even libc on our behalf) ever uses the newer *at syscalls?

Wow, this looks complicated, so I'll have to defer my review to sometime
earlier in my day when I'm thinking straight.  But the premise is
useful, and a passing 'make check' even on a system with no cgroups
mounted is a pretty good indication of whether you got it right.

> +/*
> + * The plan:
> + *
> + * We fake out /proc/mounts, so make it look as is cgroups
> + * are mounted on /not/really/sys/fs/cgroup. We don't
> + * use /sys/fs/cgroup, because we want to make it easy to
> + * detect places where we've not mocked enough syscalls.

and so that the testsuite will run and pass even on systems without
cgroups mounted.

> + *
> + * In any open/acces/mkdir calls we look at path and if
> + * it starts with /not/really/sys/fs/cgroup, we rewrite
> + * the path to point at a temporary directory referred
> + * to by LIBVIRT_FAKE_SYSFS_DIR env variable that is
> + * set by the main test suite
> + *
> + * In mkdir() calls, we simulate the cgroups behaviour
> + * whereby creating the directory auto-creates a bunch
> + * of files beneath it
> + */

Good luck!

> +mymain(void)
> +{
> +    int ret = 0;
> +    char *fakesysfsdir;
> +
> +    if (!(fakesysfsdir = strdup(FAKESYSFSDIRTEMPLATE))) {
> +        fprintf(stderr, "Out of memory\n");
> +        abort();
> +    }
> +
> +    if (!mkdtemp(fakesysfsdir)) {

Does this compile on mingw, or do you need to modify bootstrap.conf to
pull in the mkdtemp gnulib module?  [Then again, it won't compile on
mingw in the first place, since the Makefile.am limits it to platforms
with LD_PRELOAD support]

> +        fprintf(stderr, "Cannot create fakesysfsdir");
> +        abort();
> +    }
> +
> +    setenv("LIBVIRT_FAKE_SYSFS_DIR", fakesysfsdir, 1);
> +
> +    if (virtTestRun("New cgroup for self", 1, testCgroupNewForSelf, NULL) < 0)
> +        ret = -1;
> +
> +    if (virtTestRun("New cgroup for driver", 1, testCgroupNewForDriver, NULL) < 0)
> +        ret = -1;
> +
> +    if (virtTestRun("New cgroup for domain", 1, testCgroupNewForDomain, NULL) < 0)
> +        ret = -1;
> +
> +    if (getenv("LIBVIRT_SKIP_CLEANUP") == NULL)
> +        virFileDeleteTree(fakesysfsdir);
> +
> +    return ret==0 ? EXIT_SUCCESS : EXIT_FAILURE;

Spaces around ==

> +}
> +
> +VIRT_TEST_MAIN_PRELOAD(mymain, abs_builddir "/.libs/libvircgroupmock.so")
> 

-- 
Eric Blake   eblake redhat com    +1-919-301-3266
Libvirt virtualization library http://libvirt.org

-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 621 bytes
Desc: OpenPGP digital signature
URL: <http://listman.redhat.com/archives/libvir-list/attachments/20130410/5f800329/attachment-0001.sig>


More information about the libvir-list mailing list