From 47c79870ea529099cca635f53da870e0cea5652a Mon Sep 17 00:00:00 2001 From: Alexander Larsson Date: Wed, 30 Apr 2014 11:16:06 +0200 Subject: [PATCH] devmapper: Properly restore mocked functions after test Currently the tests that mocks or denies functions leave this state around for the next test. This is no good if we want to actually test the devicemapper code in later tests. Docker-DCO-1.1-Signed-off-by: Alexander Larsson (github: alexlarsson) --- daemon/graphdriver/devmapper/driver_test.go | 52 ++++++++++++++++++--- 1 file changed, 46 insertions(+), 6 deletions(-) diff --git a/daemon/graphdriver/devmapper/driver_test.go b/daemon/graphdriver/devmapper/driver_test.go index e53dfaa75..54e75e2a0 100644 --- a/daemon/graphdriver/devmapper/driver_test.go +++ b/daemon/graphdriver/devmapper/driver_test.go @@ -20,8 +20,16 @@ func init() { DefaultBaseFsSize = 300 * 1024 * 1024 } +// We use assignment here to get the right type +var ( + oldMounted = Mounted + oldExecRun = execRun +) + // denyAllDevmapper mocks all calls to libdevmapper in the unit tests, and denies them by default func denyAllDevmapper() { + oldExecRun = execRun + // Hijack all calls to libdevmapper with default panics. // Authorized calls are selectively hijacked in each tests. DmTaskCreate = func(t int) *CDmTask { @@ -77,7 +85,29 @@ func denyAllDevmapper() { } } +func restoreAllDevmapper() { + DmGetLibraryVersion = dmGetLibraryVersionFct + DmGetNextTarget = dmGetNextTargetFct + DmLogInitVerbose = dmLogInitVerboseFct + DmSetDevDir = dmSetDevDirFct + DmTaskAddTarget = dmTaskAddTargetFct + DmTaskCreate = dmTaskCreateFct + DmTaskDestroy = dmTaskDestroyFct + DmTaskGetInfo = dmTaskGetInfoFct + DmTaskRun = dmTaskRunFct + DmTaskSetAddNode = dmTaskSetAddNodeFct + DmTaskSetCookie = dmTaskSetCookieFct + DmTaskSetMessage = dmTaskSetMessageFct + DmTaskSetName = dmTaskSetNameFct + DmTaskSetRo = dmTaskSetRoFct + DmTaskSetSector = dmTaskSetSectorFct + DmUdevWait = dmUdevWaitFct + LogWithErrnoInit = logWithErrnoInitFct + execRun = oldExecRun +} + func denyAllSyscall() { + oldMounted = Mounted sysMount = func(source, target, fstype string, flags uintptr, data string) (err error) { panic("sysMount: this method should not be called here") } @@ -110,6 +140,14 @@ func denyAllSyscall() { // } } +func restoreAllSyscall() { + sysMount = syscall.Mount + sysUnmount = syscall.Unmount + sysCloseOnExec = syscall.CloseOnExec + sysSyscall = syscall.Syscall + Mounted = oldMounted +} + func mkTestDirectory(t *testing.T) string { dir, err := ioutil.TempDir("", "docker-test-devmapper-") if err != nil { @@ -160,8 +198,10 @@ func TestInit(t *testing.T) { ) defer osRemoveAll(home) + denyAllDevmapper() + defer restoreAllDevmapper() + func() { - denyAllDevmapper() DmSetDevDir = func(dir string) int { calls["DmSetDevDir"] = true expectedDir := "/dev" @@ -398,7 +438,7 @@ func mockAllDevmapper(calls Set) { func TestDriverName(t *testing.T) { denyAllDevmapper() - defer denyAllDevmapper() + defer restoreAllDevmapper() oldInit := fakeInit() defer restoreInit(oldInit) @@ -412,8 +452,8 @@ func TestDriverName(t *testing.T) { func TestDriverCreate(t *testing.T) { denyAllDevmapper() denyAllSyscall() - defer denyAllSyscall() - defer denyAllDevmapper() + defer restoreAllSyscall() + defer restoreAllDevmapper() calls := make(Set) mockAllDevmapper(calls) @@ -524,8 +564,8 @@ func TestDriverCreate(t *testing.T) { func TestDriverRemove(t *testing.T) { denyAllDevmapper() denyAllSyscall() - defer denyAllSyscall() - defer denyAllDevmapper() + defer restoreAllSyscall() + defer restoreAllDevmapper() calls := make(Set) mockAllDevmapper(calls)