
On Thu, Nov 23, 2017 at 11:32:26AM +0100, Michal Privoznik wrote:
On 11/14/2017 06:27 PM, Daniel P. Berrange wrote:
This might be more tricky than one would initially think. What about tests for instance? In our test suite we rely heavily on mocking. For instance, virpcitest uses virpcimock which reimplements kernel behaviour for detach/attach of PCI devices. Would it be possible to have that with a Go program? Okay, virpcimock might not be the best example since it mocks plain syscalls (open, close, ...). But then there are some tests which mock more high level functions - e.g. qemuxml2argvmock.
It depends on which areas we would want to mock/test. A regular Go method is not directly callable to from, and thus also not directly mockable with the ELF preload / overrides tricks do. A Go method which is explicitly exported with C calling convention, however, can be mocked in the same manner we do now. So if we had replaced some low level infrastructure with a Go module, we could mock at the public entry points to that Go module which were exported to C code. We could not mock the internals of that Go module. For pure Go code being tested in isolation from any C code, you would use a different approach. The general concept in Go is to define an 'interface' covering sets of APIs which you might want alternative impls for. So if there was a bit of Go code you wanted to easily replace in unit tests with a fake impl, you would define an interface and fake impl that satisifies that interface. So you need to put a little bit more thought into the code upfront to make it fakeable in tests, but if you do that the end result is comparable. Regards, Daniel -- |: https://berrange.com -o- https://www.flickr.com/photos/dberrange :| |: https://libvirt.org -o- https://fstop138.berrange.com :| |: https://entangle-photo.org -o- https://www.instagram.com/dberrange :|