
On Wed, Apr 10, 2013 at 09:04:33PM -0600, Eric Blake wrote:
On 04/10/2013 04:08 AM, Daniel P. Berrange wrote:
From: "Daniel P. Berrange" <berrange@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?
Well, if glibc did try todo such magic, there'd probably be more that needed overriding besides hte *at() functions. So we should just wait until that day, rather than second guessing it I think.
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.
Correct.
+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]
Hmm, I've not tested with win32 build. I think we actually ought to make sure this is run on Linux only, since it doesn't make sense on BSD either. Daniel -- |: http://berrange.com -o- http://www.flickr.com/photos/dberrange/ :| |: http://libvirt.org -o- http://virt-manager.org :| |: http://autobuild.org -o- http://search.cpan.org/~danberr/ :| |: http://entangle-photo.org -o- http://live.gnome.org/gtk-vnc :|