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@xxxxxxxxxx> > > > > 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 :| -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list