Browse code

devicemapper: Remove non-general tests

Now that we have the generic graphtest tests that actually tests
the driver we can remove the old mock-using tests. Almost all of
these tests were disabled anyway, and the four remaining ones
didn't really test much while at the same time being really
fragile and making the rest of the code more complex due to
the mocking setup.

Docker-DCO-1.1-Signed-off-by: Alexander Larsson <alexl@redhat.com> (github: alexlarsson)

Alexander Larsson authored on 2014/05/16 19:46:28
Showing 2 changed files
... ...
@@ -3,285 +3,35 @@
3 3
 package devmapper
4 4
 
5 5
 import (
6
+	"github.com/dotcloud/docker/daemon/graphdriver/graphtest"
6 7
 	"testing"
7 8
 )
8 9
 
9
-func TestTaskCreate(t *testing.T) {
10
-	t.Skip("FIXME: not a unit test")
11
-	// Test success
12
-	taskCreate(t, DeviceInfo)
13
-
14
-	// Test Failure
15
-	DmTaskCreate = dmTaskCreateFail
16
-	defer func() { DmTaskCreate = dmTaskCreateFct }()
17
-	if task := TaskCreate(-1); task != nil {
18
-		t.Fatalf("An error should have occured while creating an invalid task.")
19
-	}
20
-}
21
-
22
-func TestTaskRun(t *testing.T) {
23
-	t.Skip("FIXME: not a unit test")
24
-	task := taskCreate(t, DeviceInfo)
25
-
26
-	// Test success
27
-	// Perform the RUN
28
-	if err := task.Run(); err != nil {
29
-		t.Fatal(err)
30
-	}
31
-	// Make sure we don't have error with GetInfo
32
-	if _, err := task.GetInfo(); err != nil {
33
-		t.Fatal(err)
34
-	}
35
-
36
-	// Test failure
37
-	DmTaskRun = dmTaskRunFail
38
-	defer func() { DmTaskRun = dmTaskRunFct }()
39
-
40
-	task = taskCreate(t, DeviceInfo)
41
-	// Perform the RUN
42
-	if err := task.Run(); err != ErrTaskRun {
43
-		t.Fatalf("An error should have occured while running task.")
44
-	}
45
-	// Make sure GetInfo also fails
46
-	if _, err := task.GetInfo(); err != ErrTaskGetInfo {
47
-		t.Fatalf("GetInfo should fail if task.Run() failed.")
48
-	}
49
-}
50
-
51
-func TestTaskSetName(t *testing.T) {
52
-	t.Skip("FIXME: not a unit test")
53
-	task := taskCreate(t, DeviceInfo)
54
-
55
-	// Test success
56
-	if err := task.SetName("test"); err != nil {
57
-		t.Fatal(err)
58
-	}
59
-
60
-	// Test failure
61
-	DmTaskSetName = dmTaskSetNameFail
62
-	defer func() { DmTaskSetName = dmTaskSetNameFct }()
63
-
64
-	if err := task.SetName("test"); err != ErrTaskSetName {
65
-		t.Fatalf("An error should have occured while runnign SetName.")
66
-	}
67
-}
68
-
69
-func TestTaskSetMessage(t *testing.T) {
70
-	t.Skip("FIXME: not a unit test")
71
-	task := taskCreate(t, DeviceInfo)
72
-
73
-	// Test success
74
-	if err := task.SetMessage("test"); err != nil {
75
-		t.Fatal(err)
76
-	}
77
-
78
-	// Test failure
79
-	DmTaskSetMessage = dmTaskSetMessageFail
80
-	defer func() { DmTaskSetMessage = dmTaskSetMessageFct }()
81
-
82
-	if err := task.SetMessage("test"); err != ErrTaskSetMessage {
83
-		t.Fatalf("An error should have occured while runnign SetMessage.")
84
-	}
85
-}
86
-
87
-func TestTaskSetSector(t *testing.T) {
88
-	t.Skip("FIXME: not a unit test")
89
-	task := taskCreate(t, DeviceInfo)
90
-
91
-	// Test success
92
-	if err := task.SetSector(128); err != nil {
93
-		t.Fatal(err)
94
-	}
95
-
96
-	DmTaskSetSector = dmTaskSetSectorFail
97
-	defer func() { DmTaskSetSector = dmTaskSetSectorFct }()
98
-
99
-	// Test failure
100
-	if err := task.SetSector(0); err != ErrTaskSetSector {
101
-		t.Fatalf("An error should have occured while running SetSector.")
102
-	}
103
-}
104
-
105
-func TestTaskSetCookie(t *testing.T) {
106
-	t.Skip("FIXME: not a unit test")
107
-	var (
108
-		cookie uint = 0
109
-		task        = taskCreate(t, DeviceInfo)
110
-	)
111
-
112
-	// Test success
113
-	if err := task.SetCookie(&cookie, 0); err != nil {
114
-		t.Fatal(err)
115
-	}
116
-
117
-	// Test failure
118
-	if err := task.SetCookie(nil, 0); err != ErrNilCookie {
119
-		t.Fatalf("An error should have occured while running SetCookie with nil cookie.")
120
-	}
121
-
122
-	DmTaskSetCookie = dmTaskSetCookieFail
123
-	defer func() { DmTaskSetCookie = dmTaskSetCookieFct }()
124
-
125
-	if err := task.SetCookie(&cookie, 0); err != ErrTaskSetCookie {
126
-		t.Fatalf("An error should have occured while running SetCookie.")
127
-	}
128
-}
129
-
130
-func TestTaskSetAddNode(t *testing.T) {
131
-	t.Skip("FIXME: not a unit test")
132
-	task := taskCreate(t, DeviceInfo)
133
-
134
-	// Test success
135
-	if err := task.SetAddNode(0); err != nil {
136
-		t.Fatal(err)
137
-	}
138
-
139
-	// Test failure
140
-	if err := task.SetAddNode(-1); err != ErrInvalidAddNode {
141
-		t.Fatalf("An error should have occured running SetAddNode with wrong node.")
142
-	}
143
-
144
-	DmTaskSetAddNode = dmTaskSetAddNodeFail
145
-	defer func() { DmTaskSetAddNode = dmTaskSetAddNodeFct }()
146
-
147
-	if err := task.SetAddNode(0); err != ErrTaskSetAddNode {
148
-		t.Fatalf("An error should have occured running SetAddNode.")
149
-	}
150
-}
151
-
152
-func TestTaskSetRo(t *testing.T) {
153
-	t.Skip("FIXME: not a unit test")
154
-	task := taskCreate(t, DeviceInfo)
155
-
156
-	// Test success
157
-	if err := task.SetRo(); err != nil {
158
-		t.Fatal(err)
159
-	}
160
-
161
-	// Test failure
162
-	DmTaskSetRo = dmTaskSetRoFail
163
-	defer func() { DmTaskSetRo = dmTaskSetRoFct }()
164
-
165
-	if err := task.SetRo(); err != ErrTaskSetRo {
166
-		t.Fatalf("An error should have occured running SetRo.")
167
-	}
168
-}
169
-
170
-func TestTaskAddTarget(t *testing.T) {
171
-	t.Skip("FIXME: not a unit test")
172
-	task := taskCreate(t, DeviceInfo)
173
-
174
-	// Test success
175
-	if err := task.AddTarget(0, 128, "thinp", ""); err != nil {
176
-		t.Fatal(err)
177
-	}
178
-
179
-	// Test failure
180
-	DmTaskAddTarget = dmTaskAddTargetFail
181
-	defer func() { DmTaskAddTarget = dmTaskAddTargetFct }()
182
-
183
-	if err := task.AddTarget(0, 128, "thinp", ""); err != ErrTaskAddTarget {
184
-		t.Fatalf("An error should have occured running AddTarget.")
185
-	}
186
-}
187
-
188
-// func TestTaskGetInfo(t *testing.T) {
189
-// 	task := taskCreate(t, DeviceInfo)
190
-
191
-// 	// Test success
192
-// 	if _, err := task.GetInfo(); err != nil {
193
-// 		t.Fatal(err)
194
-// 	}
195
-
196
-// 	// Test failure
197
-// 	DmTaskGetInfo = dmTaskGetInfoFail
198
-// 	defer func() { DmTaskGetInfo = dmTaskGetInfoFct }()
199
-
200
-// 	if _, err := task.GetInfo(); err != ErrTaskGetInfo {
201
-// 		t.Fatalf("An error should have occured running GetInfo.")
202
-// 	}
203
-// }
204
-
205
-// func TestTaskGetNextTarget(t *testing.T) {
206
-// 	task := taskCreate(t, DeviceInfo)
207
-
208
-// 	if next, _, _, _, _ := task.GetNextTarget(0); next == 0 {
209
-// 		t.Fatalf("The next target should not be 0.")
210
-// 	}
211
-// }
212
-
213
-/// Utils
214
-func taskCreate(t *testing.T, taskType TaskType) *Task {
215
-	task := TaskCreate(taskType)
216
-	if task == nil {
217
-		t.Fatalf("Error creating task")
218
-	}
219
-	return task
220
-}
221
-
222
-/// Failure function replacement
223
-func dmTaskCreateFail(t int) *CDmTask {
224
-	return nil
225
-}
226
-
227
-func dmTaskRunFail(task *CDmTask) int {
228
-	return -1
229
-}
230
-
231
-func dmTaskSetNameFail(task *CDmTask, name string) int {
232
-	return -1
233
-}
234
-
235
-func dmTaskSetMessageFail(task *CDmTask, message string) int {
236
-	return -1
237
-}
238
-
239
-func dmTaskSetSectorFail(task *CDmTask, sector uint64) int {
240
-	return -1
241
-}
242
-
243
-func dmTaskSetCookieFail(task *CDmTask, cookie *uint, flags uint16) int {
244
-	return -1
245
-}
246
-
247
-func dmTaskSetAddNodeFail(task *CDmTask, addNode AddNodeType) int {
248
-	return -1
249
-}
250
-
251
-func dmTaskSetRoFail(task *CDmTask) int {
252
-	return -1
253
-}
254
-
255
-func dmTaskAddTargetFail(task *CDmTask,
256
-	start, size uint64, ttype, params string) int {
257
-	return -1
258
-}
259
-
260
-func dmTaskGetInfoFail(task *CDmTask, info *Info) int {
261
-	return -1
262
-}
263
-
264
-func dmGetNextTargetFail(task *CDmTask, next uintptr, start, length *uint64,
265
-	target, params *string) uintptr {
266
-	return 0
10
+func init() {
11
+	// Reduce the size the the base fs and loopback for the tests
12
+	DefaultDataLoopbackSize = 300 * 1024 * 1024
13
+	DefaultMetaDataLoopbackSize = 200 * 1024 * 1024
14
+	DefaultBaseFsSize = 300 * 1024 * 1024
267 15
 }
268 16
 
269
-func dmAttachLoopDeviceFail(filename string, fd *int) string {
270
-	return ""
17
+// This avoids creating a new driver for each test if all tests are run
18
+// Make sure to put new tests between TestDevmapperSetup and TestDevmapperTeardown
19
+func TestDevmapperSetup(t *testing.T) {
20
+	graphtest.GetDriver(t, "devicemapper")
271 21
 }
272 22
 
273
-func sysGetBlockSizeFail(fd uintptr, size *uint64) sysErrno {
274
-	return 1
23
+func TestDevmapperCreateEmpty(t *testing.T) {
24
+	graphtest.DriverTestCreateEmpty(t, "devicemapper")
275 25
 }
276 26
 
277
-func dmUdevWaitFail(cookie uint) int {
278
-	return -1
27
+func TestDevmapperCreateBase(t *testing.T) {
28
+	graphtest.DriverTestCreateBase(t, "devicemapper")
279 29
 }
280 30
 
281
-func dmSetDevDirFail(dir string) int {
282
-	return -1
31
+func TestDevmapperCreateSnap(t *testing.T) {
32
+	graphtest.DriverTestCreateSnap(t, "devicemapper")
283 33
 }
284 34
 
285
-func dmGetLibraryVersionFail(version *string) int {
286
-	return -1
35
+func TestDevmapperTeardown(t *testing.T) {
36
+	graphtest.PutDriver(t)
287 37
 }
288 38
deleted file mode 100644
... ...
@@ -1,939 +0,0 @@
1
-// +build linux,amd64
2
-
3
-package devmapper
4
-
5
-import (
6
-	"fmt"
7
-	"github.com/dotcloud/docker/daemon/graphdriver"
8
-	"github.com/dotcloud/docker/daemon/graphdriver/graphtest"
9
-	"io/ioutil"
10
-	"path"
11
-	"runtime"
12
-	"strings"
13
-	"syscall"
14
-	"testing"
15
-)
16
-
17
-func init() {
18
-	// Reduce the size the the base fs and loopback for the tests
19
-	DefaultDataLoopbackSize = 300 * 1024 * 1024
20
-	DefaultMetaDataLoopbackSize = 200 * 1024 * 1024
21
-	DefaultBaseFsSize = 300 * 1024 * 1024
22
-}
23
-
24
-// We use assignment here to get the right type
25
-var (
26
-	oldMounted = Mounted
27
-	oldExecRun = execRun
28
-)
29
-
30
-// denyAllDevmapper mocks all calls to libdevmapper in the unit tests, and denies them by default
31
-func denyAllDevmapper() {
32
-	oldExecRun = execRun
33
-
34
-	// Hijack all calls to libdevmapper with default panics.
35
-	// Authorized calls are selectively hijacked in each tests.
36
-	DmTaskCreate = func(t int) *CDmTask {
37
-		panic("DmTaskCreate: this method should not be called here")
38
-	}
39
-	DmTaskRun = func(task *CDmTask) int {
40
-		panic("DmTaskRun: this method should not be called here")
41
-	}
42
-	DmTaskSetName = func(task *CDmTask, name string) int {
43
-		panic("DmTaskSetName: this method should not be called here")
44
-	}
45
-	DmTaskSetMessage = func(task *CDmTask, message string) int {
46
-		panic("DmTaskSetMessage: this method should not be called here")
47
-	}
48
-	DmTaskSetSector = func(task *CDmTask, sector uint64) int {
49
-		panic("DmTaskSetSector: this method should not be called here")
50
-	}
51
-	DmTaskSetCookie = func(task *CDmTask, cookie *uint, flags uint16) int {
52
-		panic("DmTaskSetCookie: this method should not be called here")
53
-	}
54
-	DmTaskSetAddNode = func(task *CDmTask, addNode AddNodeType) int {
55
-		panic("DmTaskSetAddNode: this method should not be called here")
56
-	}
57
-	DmTaskSetRo = func(task *CDmTask) int {
58
-		panic("DmTaskSetRo: this method should not be called here")
59
-	}
60
-	DmTaskAddTarget = func(task *CDmTask, start, size uint64, ttype, params string) int {
61
-		panic("DmTaskAddTarget: this method should not be called here")
62
-	}
63
-	DmTaskGetInfo = func(task *CDmTask, info *Info) int {
64
-		panic("DmTaskGetInfo: this method should not be called here")
65
-	}
66
-	DmGetNextTarget = func(task *CDmTask, next uintptr, start, length *uint64, target, params *string) uintptr {
67
-		panic("DmGetNextTarget: this method should not be called here")
68
-	}
69
-	DmUdevWait = func(cookie uint) int {
70
-		panic("DmUdevWait: this method should not be called here")
71
-	}
72
-	DmSetDevDir = func(dir string) int {
73
-		panic("DmSetDevDir: this method should not be called here")
74
-	}
75
-	DmGetLibraryVersion = func(version *string) int {
76
-		panic("DmGetLibraryVersion: this method should not be called here")
77
-	}
78
-	DmLogInitVerbose = func(level int) {
79
-		panic("DmLogInitVerbose: this method should not be called here")
80
-	}
81
-	DmTaskDestroy = func(task *CDmTask) {
82
-		panic("DmTaskDestroy: this method should not be called here")
83
-	}
84
-	LogWithErrnoInit = func() {
85
-		panic("LogWithErrnoInit: this method should not be called here")
86
-	}
87
-}
88
-
89
-func restoreAllDevmapper() {
90
-	DmGetLibraryVersion = dmGetLibraryVersionFct
91
-	DmGetNextTarget = dmGetNextTargetFct
92
-	DmLogInitVerbose = dmLogInitVerboseFct
93
-	DmSetDevDir = dmSetDevDirFct
94
-	DmTaskAddTarget = dmTaskAddTargetFct
95
-	DmTaskCreate = dmTaskCreateFct
96
-	DmTaskDestroy = dmTaskDestroyFct
97
-	DmTaskGetInfo = dmTaskGetInfoFct
98
-	DmTaskRun = dmTaskRunFct
99
-	DmTaskSetAddNode = dmTaskSetAddNodeFct
100
-	DmTaskSetCookie = dmTaskSetCookieFct
101
-	DmTaskSetMessage = dmTaskSetMessageFct
102
-	DmTaskSetName = dmTaskSetNameFct
103
-	DmTaskSetRo = dmTaskSetRoFct
104
-	DmTaskSetSector = dmTaskSetSectorFct
105
-	DmUdevWait = dmUdevWaitFct
106
-	LogWithErrnoInit = logWithErrnoInitFct
107
-	execRun = oldExecRun
108
-}
109
-
110
-func denyAllSyscall() {
111
-	oldMounted = Mounted
112
-	sysMount = func(source, target, fstype string, flags uintptr, data string) (err error) {
113
-		panic("sysMount: this method should not be called here")
114
-	}
115
-	sysUnmount = func(target string, flags int) (err error) {
116
-		panic("sysUnmount: this method should not be called here")
117
-	}
118
-	sysCloseOnExec = func(fd int) {
119
-		panic("sysCloseOnExec: this method should not be called here")
120
-	}
121
-	sysSyscall = func(trap, a1, a2, a3 uintptr) (r1, r2 uintptr, err syscall.Errno) {
122
-		panic("sysSyscall: this method should not be called here")
123
-	}
124
-	// Not a syscall, but forbidding it here anyway
125
-	Mounted = func(mnt string) (bool, error) {
126
-		panic("devmapper.Mounted: this method should not be called here")
127
-	}
128
-	// osOpenFile = os.OpenFile
129
-	// osNewFile = os.NewFile
130
-	// osCreate = os.Create
131
-	// osStat = os.Stat
132
-	// osIsNotExist = os.IsNotExist
133
-	// osIsExist = os.IsExist
134
-	// osMkdirAll = os.MkdirAll
135
-	// osRemoveAll = os.RemoveAll
136
-	// osRename = os.Rename
137
-	// osReadlink = os.Readlink
138
-
139
-	// execRun = func(name string, args ...string) error {
140
-	// 	return exec.Command(name, args...).Run()
141
-	// }
142
-}
143
-
144
-func restoreAllSyscall() {
145
-	sysMount = syscall.Mount
146
-	sysUnmount = syscall.Unmount
147
-	sysCloseOnExec = syscall.CloseOnExec
148
-	sysSyscall = syscall.Syscall
149
-	Mounted = oldMounted
150
-}
151
-
152
-func mkTestDirectory(t *testing.T) string {
153
-	dir, err := ioutil.TempDir("", "docker-test-devmapper-")
154
-	if err != nil {
155
-		t.Fatal(err)
156
-	}
157
-	return dir
158
-}
159
-
160
-func newDriver(t *testing.T) *Driver {
161
-	home := mkTestDirectory(t)
162
-	d, err := Init(home)
163
-	if err != nil {
164
-		t.Fatal(err)
165
-	}
166
-	return d.(*Driver)
167
-}
168
-
169
-func cleanup(d *Driver) {
170
-	d.Cleanup()
171
-	osRemoveAll(d.home)
172
-}
173
-
174
-type Set map[string]bool
175
-
176
-func (r Set) Assert(t *testing.T, names ...string) {
177
-	for _, key := range names {
178
-		required := true
179
-		if strings.HasPrefix(key, "?") {
180
-			key = key[1:]
181
-			required = false
182
-		}
183
-		if _, exists := r[key]; !exists && required {
184
-			t.Fatalf("Key not set: %s", key)
185
-		}
186
-		delete(r, key)
187
-	}
188
-	if len(r) != 0 {
189
-		t.Fatalf("Unexpected keys: %v", r)
190
-	}
191
-}
192
-
193
-func TestInit(t *testing.T) {
194
-	var (
195
-		calls        = make(Set)
196
-		taskMessages = make(Set)
197
-		taskTypes    = make(Set)
198
-		home         = mkTestDirectory(t)
199
-	)
200
-	defer osRemoveAll(home)
201
-
202
-	denyAllDevmapper()
203
-	defer restoreAllDevmapper()
204
-
205
-	func() {
206
-		DmSetDevDir = func(dir string) int {
207
-			calls["DmSetDevDir"] = true
208
-			expectedDir := "/dev"
209
-			if dir != expectedDir {
210
-				t.Fatalf("Wrong libdevmapper call\nExpected: DmSetDevDir(%v)\nReceived: DmSetDevDir(%v)\n", expectedDir, dir)
211
-			}
212
-			return 0
213
-		}
214
-		LogWithErrnoInit = func() {
215
-			calls["DmLogWithErrnoInit"] = true
216
-		}
217
-		var task1 CDmTask
218
-		DmTaskCreate = func(taskType int) *CDmTask {
219
-			calls["DmTaskCreate"] = true
220
-			taskTypes[fmt.Sprintf("%d", taskType)] = true
221
-			return &task1
222
-		}
223
-		DmTaskSetName = func(task *CDmTask, name string) int {
224
-			calls["DmTaskSetName"] = true
225
-			expectedTask := &task1
226
-			if task != expectedTask {
227
-				t.Fatalf("Wrong libdevmapper call\nExpected: DmTaskSetName(%v)\nReceived: DmTaskSetName(%v)\n", expectedTask, task)
228
-			}
229
-			// FIXME: use Set.AssertRegexp()
230
-			if !strings.HasPrefix(name, "docker-") && !strings.HasPrefix(name, "/dev/mapper/docker-") ||
231
-				!strings.HasSuffix(name, "-pool") && !strings.HasSuffix(name, "-base") {
232
-				t.Fatalf("Wrong libdevmapper call\nExpected: DmTaskSetName(%v)\nReceived: DmTaskSetName(%v)\n", "docker-...-pool", name)
233
-			}
234
-			return 1
235
-		}
236
-		DmTaskRun = func(task *CDmTask) int {
237
-			calls["DmTaskRun"] = true
238
-			expectedTask := &task1
239
-			if task != expectedTask {
240
-				t.Fatalf("Wrong libdevmapper call\nExpected: DmTaskRun(%v)\nReceived: DmTaskRun(%v)\n", expectedTask, task)
241
-			}
242
-			return 1
243
-		}
244
-		DmTaskGetInfo = func(task *CDmTask, info *Info) int {
245
-			calls["DmTaskGetInfo"] = true
246
-			expectedTask := &task1
247
-			if task != expectedTask {
248
-				t.Fatalf("Wrong libdevmapper call\nExpected: DmTaskGetInfo(%v)\nReceived: DmTaskGetInfo(%v)\n", expectedTask, task)
249
-			}
250
-			// This will crash if info is not dereferenceable
251
-			info.Exists = 0
252
-			return 1
253
-		}
254
-		DmTaskSetSector = func(task *CDmTask, sector uint64) int {
255
-			calls["DmTaskSetSector"] = true
256
-			expectedTask := &task1
257
-			if task != expectedTask {
258
-				t.Fatalf("Wrong libdevmapper call\nExpected: DmTaskSetSector(%v)\nReceived: DmTaskSetSector(%v)\n", expectedTask, task)
259
-			}
260
-			if expectedSector := uint64(0); sector != expectedSector {
261
-				t.Fatalf("Wrong libdevmapper call to DmTaskSetSector\nExpected: %v\nReceived: %v\n", expectedSector, sector)
262
-			}
263
-			return 1
264
-		}
265
-		DmTaskSetMessage = func(task *CDmTask, message string) int {
266
-			calls["DmTaskSetMessage"] = true
267
-			expectedTask := &task1
268
-			if task != expectedTask {
269
-				t.Fatalf("Wrong libdevmapper call\nExpected: DmTaskSetSector(%v)\nReceived: DmTaskSetSector(%v)\n", expectedTask, task)
270
-			}
271
-			taskMessages[message] = true
272
-			return 1
273
-		}
274
-		DmTaskDestroy = func(task *CDmTask) {
275
-			calls["DmTaskDestroy"] = true
276
-			expectedTask := &task1
277
-			if task != expectedTask {
278
-				t.Fatalf("Wrong libdevmapper call\nExpected: DmTaskDestroy(%v)\nReceived: DmTaskDestroy(%v)\n", expectedTask, task)
279
-			}
280
-		}
281
-		DmTaskAddTarget = func(task *CDmTask, start, size uint64, ttype, params string) int {
282
-			calls["DmTaskSetTarget"] = true
283
-			expectedTask := &task1
284
-			if task != expectedTask {
285
-				t.Fatalf("Wrong libdevmapper call\nExpected: DmTaskDestroy(%v)\nReceived: DmTaskDestroy(%v)\n", expectedTask, task)
286
-			}
287
-			if start != 0 {
288
-				t.Fatalf("Wrong start: %d != %d", start, 0)
289
-			}
290
-			if ttype != "thin" && ttype != "thin-pool" {
291
-				t.Fatalf("Wrong ttype: %s", ttype)
292
-			}
293
-			// Quick smoke test
294
-			if params == "" {
295
-				t.Fatalf("Params should not be empty")
296
-			}
297
-			return 1
298
-		}
299
-		fakeCookie := uint(4321)
300
-		DmTaskSetCookie = func(task *CDmTask, cookie *uint, flags uint16) int {
301
-			calls["DmTaskSetCookie"] = true
302
-			expectedTask := &task1
303
-			if task != expectedTask {
304
-				t.Fatalf("Wrong libdevmapper call\nExpected: DmTaskDestroy(%v)\nReceived: DmTaskDestroy(%v)\n", expectedTask, task)
305
-			}
306
-			if flags != 0 {
307
-				t.Fatalf("Cookie flags should be 0 (not %x)", flags)
308
-			}
309
-			*cookie = fakeCookie
310
-			return 1
311
-		}
312
-		DmUdevWait = func(cookie uint) int {
313
-			calls["DmUdevWait"] = true
314
-			if cookie != fakeCookie {
315
-				t.Fatalf("Wrong cookie: %d != %d", cookie, fakeCookie)
316
-			}
317
-			return 1
318
-		}
319
-		DmTaskSetAddNode = func(task *CDmTask, addNode AddNodeType) int {
320
-			if addNode != AddNodeOnCreate {
321
-				t.Fatalf("Wrong AddNoteType: %v (expected %v)", addNode, AddNodeOnCreate)
322
-			}
323
-			calls["DmTaskSetAddNode"] = true
324
-			return 1
325
-		}
326
-		execRun = func(name string, args ...string) error {
327
-			calls["execRun"] = true
328
-			if name != "mkfs.ext4" {
329
-				t.Fatalf("Expected %s to be executed, not %s", "mkfs.ext4", name)
330
-			}
331
-			return nil
332
-		}
333
-		driver, err := Init(home)
334
-		if err != nil {
335
-			t.Fatal(err)
336
-		}
337
-		defer func() {
338
-			if err := driver.Cleanup(); err != nil {
339
-				t.Fatal(err)
340
-			}
341
-		}()
342
-	}()
343
-	// Put all tests in a function to make sure the garbage collection will
344
-	// occur.
345
-
346
-	// Call GC to cleanup runtime.Finalizers
347
-	runtime.GC()
348
-
349
-	calls.Assert(t,
350
-		"DmSetDevDir",
351
-		"DmLogWithErrnoInit",
352
-		"DmTaskSetName",
353
-		"DmTaskRun",
354
-		"DmTaskGetInfo",
355
-		"DmTaskDestroy",
356
-		"execRun",
357
-		"DmTaskCreate",
358
-		"DmTaskSetTarget",
359
-		"DmTaskSetCookie",
360
-		"DmUdevWait",
361
-		"DmTaskSetSector",
362
-		"DmTaskSetMessage",
363
-		"DmTaskSetAddNode",
364
-	)
365
-	taskTypes.Assert(t, "0", "6", "17")
366
-	taskMessages.Assert(t, "create_thin 0", "set_transaction_id 0 1")
367
-}
368
-
369
-func fakeInit() func(home string) (graphdriver.Driver, error) {
370
-	oldInit := Init
371
-	Init = func(home string) (graphdriver.Driver, error) {
372
-		return &Driver{
373
-			home: home,
374
-		}, nil
375
-	}
376
-	return oldInit
377
-}
378
-
379
-func restoreInit(init func(home string) (graphdriver.Driver, error)) {
380
-	Init = init
381
-}
382
-
383
-func mockAllDevmapper(calls Set) {
384
-	DmSetDevDir = func(dir string) int {
385
-		calls["DmSetDevDir"] = true
386
-		return 0
387
-	}
388
-	LogWithErrnoInit = func() {
389
-		calls["DmLogWithErrnoInit"] = true
390
-	}
391
-	DmTaskCreate = func(taskType int) *CDmTask {
392
-		calls["DmTaskCreate"] = true
393
-		return &CDmTask{}
394
-	}
395
-	DmTaskSetName = func(task *CDmTask, name string) int {
396
-		calls["DmTaskSetName"] = true
397
-		return 1
398
-	}
399
-	DmTaskRun = func(task *CDmTask) int {
400
-		calls["DmTaskRun"] = true
401
-		return 1
402
-	}
403
-	DmTaskGetInfo = func(task *CDmTask, info *Info) int {
404
-		calls["DmTaskGetInfo"] = true
405
-		return 1
406
-	}
407
-	DmTaskSetSector = func(task *CDmTask, sector uint64) int {
408
-		calls["DmTaskSetSector"] = true
409
-		return 1
410
-	}
411
-	DmTaskSetMessage = func(task *CDmTask, message string) int {
412
-		calls["DmTaskSetMessage"] = true
413
-		return 1
414
-	}
415
-	DmTaskDestroy = func(task *CDmTask) {
416
-		calls["DmTaskDestroy"] = true
417
-	}
418
-	DmTaskAddTarget = func(task *CDmTask, start, size uint64, ttype, params string) int {
419
-		calls["DmTaskSetTarget"] = true
420
-		return 1
421
-	}
422
-	DmTaskSetCookie = func(task *CDmTask, cookie *uint, flags uint16) int {
423
-		calls["DmTaskSetCookie"] = true
424
-		return 1
425
-	}
426
-	DmUdevWait = func(cookie uint) int {
427
-		calls["DmUdevWait"] = true
428
-		return 1
429
-	}
430
-	DmTaskSetAddNode = func(task *CDmTask, addNode AddNodeType) int {
431
-		calls["DmTaskSetAddNode"] = true
432
-		return 1
433
-	}
434
-	execRun = func(name string, args ...string) error {
435
-		calls["execRun"] = true
436
-		return nil
437
-	}
438
-}
439
-
440
-func TestDriverName(t *testing.T) {
441
-	denyAllDevmapper()
442
-	defer restoreAllDevmapper()
443
-
444
-	oldInit := fakeInit()
445
-	defer restoreInit(oldInit)
446
-
447
-	d := newDriver(t)
448
-	if d.String() != "devicemapper" {
449
-		t.Fatalf("Expected driver name to be devicemapper got %s", d.String())
450
-	}
451
-}
452
-
453
-func TestDriverCreate(t *testing.T) {
454
-	denyAllDevmapper()
455
-	denyAllSyscall()
456
-	defer restoreAllSyscall()
457
-	defer restoreAllDevmapper()
458
-
459
-	calls := make(Set)
460
-	mockAllDevmapper(calls)
461
-
462
-	sysMount = func(source, target, fstype string, flags uintptr, data string) (err error) {
463
-		calls["sysMount"] = true
464
-		// FIXME: compare the exact source and target strings (inodes + devname)
465
-		if expectedSource := "/dev/mapper/docker-"; !strings.HasPrefix(source, expectedSource) {
466
-			t.Fatalf("Wrong syscall call\nExpected: Mount(%v)\nReceived: Mount(%v)\n", expectedSource, source)
467
-		}
468
-		if expectedTarget := "/tmp/docker-test-devmapper-"; !strings.HasPrefix(target, expectedTarget) {
469
-			t.Fatalf("Wrong syscall call\nExpected: Mount(%v)\nReceived: Mount(%v)\n", expectedTarget, target)
470
-		}
471
-		if expectedFstype := "ext4"; fstype != expectedFstype {
472
-			t.Fatalf("Wrong syscall call\nExpected: Mount(%v)\nReceived: Mount(%v)\n", expectedFstype, fstype)
473
-		}
474
-		if expectedFlags := uintptr(3236757504); flags != expectedFlags {
475
-			t.Fatalf("Wrong syscall call\nExpected: Mount(%v)\nReceived: Mount(%v)\n", expectedFlags, flags)
476
-		}
477
-		return nil
478
-	}
479
-
480
-	sysUnmount = func(target string, flag int) error {
481
-		//calls["sysUnmount"] = true
482
-
483
-		return nil
484
-	}
485
-
486
-	Mounted = func(mnt string) (bool, error) {
487
-		calls["Mounted"] = true
488
-		if !strings.HasPrefix(mnt, "/tmp/docker-test-devmapper-") || !strings.HasSuffix(mnt, "/mnt/1") {
489
-			t.Fatalf("Wrong mounted call\nExpected: Mounted(%v)\nReceived: Mounted(%v)\n", "/tmp/docker-test-devmapper-.../mnt/1", mnt)
490
-		}
491
-		return false, nil
492
-	}
493
-
494
-	sysSyscall = func(trap, a1, a2, a3 uintptr) (r1, r2 uintptr, err syscall.Errno) {
495
-		calls["sysSyscall"] = true
496
-		if trap != sysSysIoctl {
497
-			t.Fatalf("Unexpected syscall. Expecting SYS_IOCTL, received: %d", trap)
498
-		}
499
-		switch a2 {
500
-		case LoopSetFd:
501
-			calls["ioctl.loopsetfd"] = true
502
-		case LoopCtlGetFree:
503
-			calls["ioctl.loopctlgetfree"] = true
504
-		case LoopGetStatus64:
505
-			calls["ioctl.loopgetstatus"] = true
506
-		case LoopSetStatus64:
507
-			calls["ioctl.loopsetstatus"] = true
508
-		case LoopClrFd:
509
-			calls["ioctl.loopclrfd"] = true
510
-		case LoopSetCapacity:
511
-			calls["ioctl.loopsetcapacity"] = true
512
-		case BlkGetSize64:
513
-			calls["ioctl.blkgetsize"] = true
514
-		default:
515
-			t.Fatalf("Unexpected IOCTL. Received %d", a2)
516
-		}
517
-		return 0, 0, 0
518
-	}
519
-
520
-	func() {
521
-		d := newDriver(t)
522
-
523
-		calls.Assert(t,
524
-			"DmSetDevDir",
525
-			"DmLogWithErrnoInit",
526
-			"DmTaskSetName",
527
-			"DmTaskRun",
528
-			"DmTaskGetInfo",
529
-			"execRun",
530
-			"DmTaskCreate",
531
-			"DmTaskSetTarget",
532
-			"DmTaskSetCookie",
533
-			"DmUdevWait",
534
-			"DmTaskSetSector",
535
-			"DmTaskSetMessage",
536
-			"DmTaskSetAddNode",
537
-			"sysSyscall",
538
-			"ioctl.blkgetsize",
539
-			"ioctl.loopsetfd",
540
-			"ioctl.loopsetstatus",
541
-			"?ioctl.loopctlgetfree",
542
-		)
543
-
544
-		if err := d.Create("1", ""); err != nil {
545
-			t.Fatal(err)
546
-		}
547
-		calls.Assert(t,
548
-			"DmTaskCreate",
549
-			"DmTaskGetInfo",
550
-			"DmTaskRun",
551
-			"DmTaskSetSector",
552
-			"DmTaskSetName",
553
-			"DmTaskSetMessage",
554
-		)
555
-
556
-	}()
557
-
558
-	runtime.GC()
559
-
560
-	calls.Assert(t,
561
-		"DmTaskDestroy",
562
-	)
563
-}
564
-
565
-func TestDriverRemove(t *testing.T) {
566
-	denyAllDevmapper()
567
-	denyAllSyscall()
568
-	defer restoreAllSyscall()
569
-	defer restoreAllDevmapper()
570
-
571
-	calls := make(Set)
572
-	mockAllDevmapper(calls)
573
-
574
-	sysMount = func(source, target, fstype string, flags uintptr, data string) (err error) {
575
-		calls["sysMount"] = true
576
-		// FIXME: compare the exact source and target strings (inodes + devname)
577
-		if expectedSource := "/dev/mapper/docker-"; !strings.HasPrefix(source, expectedSource) {
578
-			t.Fatalf("Wrong syscall call\nExpected: Mount(%v)\nReceived: Mount(%v)\n", expectedSource, source)
579
-		}
580
-		if expectedTarget := "/tmp/docker-test-devmapper-"; !strings.HasPrefix(target, expectedTarget) {
581
-			t.Fatalf("Wrong syscall call\nExpected: Mount(%v)\nReceived: Mount(%v)\n", expectedTarget, target)
582
-		}
583
-		if expectedFstype := "ext4"; fstype != expectedFstype {
584
-			t.Fatalf("Wrong syscall call\nExpected: Mount(%v)\nReceived: Mount(%v)\n", expectedFstype, fstype)
585
-		}
586
-		if expectedFlags := uintptr(3236757504); flags != expectedFlags {
587
-			t.Fatalf("Wrong syscall call\nExpected: Mount(%v)\nReceived: Mount(%v)\n", expectedFlags, flags)
588
-		}
589
-		return nil
590
-	}
591
-	sysUnmount = func(target string, flags int) (err error) {
592
-		// FIXME: compare the exact source and target strings (inodes + devname)
593
-		if expectedTarget := "/tmp/docker-test-devmapper-"; !strings.HasPrefix(target, expectedTarget) {
594
-			t.Fatalf("Wrong syscall call\nExpected: Mount(%v)\nReceived: Mount(%v)\n", expectedTarget, target)
595
-		}
596
-		if expectedFlags := 0; flags != expectedFlags {
597
-			t.Fatalf("Wrong syscall call\nExpected: Mount(%v)\nReceived: Mount(%v)\n", expectedFlags, flags)
598
-		}
599
-		return nil
600
-	}
601
-	Mounted = func(mnt string) (bool, error) {
602
-		calls["Mounted"] = true
603
-		return false, nil
604
-	}
605
-
606
-	sysSyscall = func(trap, a1, a2, a3 uintptr) (r1, r2 uintptr, err syscall.Errno) {
607
-		calls["sysSyscall"] = true
608
-		if trap != sysSysIoctl {
609
-			t.Fatalf("Unexpected syscall. Expecting SYS_IOCTL, received: %d", trap)
610
-		}
611
-		switch a2 {
612
-		case LoopSetFd:
613
-			calls["ioctl.loopsetfd"] = true
614
-		case LoopCtlGetFree:
615
-			calls["ioctl.loopctlgetfree"] = true
616
-		case LoopGetStatus64:
617
-			calls["ioctl.loopgetstatus"] = true
618
-		case LoopSetStatus64:
619
-			calls["ioctl.loopsetstatus"] = true
620
-		case LoopClrFd:
621
-			calls["ioctl.loopclrfd"] = true
622
-		case LoopSetCapacity:
623
-			calls["ioctl.loopsetcapacity"] = true
624
-		case BlkGetSize64:
625
-			calls["ioctl.blkgetsize"] = true
626
-		default:
627
-			t.Fatalf("Unexpected IOCTL. Received %d", a2)
628
-		}
629
-		return 0, 0, 0
630
-	}
631
-
632
-	func() {
633
-		d := newDriver(t)
634
-
635
-		calls.Assert(t,
636
-			"DmSetDevDir",
637
-			"DmLogWithErrnoInit",
638
-			"DmTaskSetName",
639
-			"DmTaskRun",
640
-			"DmTaskGetInfo",
641
-			"execRun",
642
-			"DmTaskCreate",
643
-			"DmTaskSetTarget",
644
-			"DmTaskSetCookie",
645
-			"DmUdevWait",
646
-			"DmTaskSetSector",
647
-			"DmTaskSetMessage",
648
-			"DmTaskSetAddNode",
649
-			"sysSyscall",
650
-			"ioctl.blkgetsize",
651
-			"ioctl.loopsetfd",
652
-			"ioctl.loopsetstatus",
653
-			"?ioctl.loopctlgetfree",
654
-		)
655
-
656
-		if err := d.Create("1", ""); err != nil {
657
-			t.Fatal(err)
658
-		}
659
-
660
-		calls.Assert(t,
661
-			"DmTaskCreate",
662
-			"DmTaskGetInfo",
663
-			"DmTaskRun",
664
-			"DmTaskSetSector",
665
-			"DmTaskSetName",
666
-			"DmTaskSetMessage",
667
-		)
668
-
669
-		Mounted = func(mnt string) (bool, error) {
670
-			calls["Mounted"] = true
671
-			return true, nil
672
-		}
673
-
674
-		if err := d.Remove("1"); err != nil {
675
-			t.Fatal(err)
676
-		}
677
-
678
-		calls.Assert(t,
679
-			"DmTaskRun",
680
-			"DmTaskSetSector",
681
-			"DmTaskSetName",
682
-			"DmTaskSetMessage",
683
-			"DmTaskCreate",
684
-			"DmTaskGetInfo",
685
-			"DmTaskSetCookie",
686
-			"DmTaskSetTarget",
687
-			"DmTaskSetAddNode",
688
-			"DmUdevWait",
689
-		)
690
-	}()
691
-	runtime.GC()
692
-
693
-	calls.Assert(t,
694
-		"DmTaskDestroy",
695
-	)
696
-}
697
-
698
-func TestCleanup(t *testing.T) {
699
-	t.Skip("FIXME: not a unit test")
700
-	t.Skip("Unimplemented")
701
-	d := newDriver(t)
702
-	defer osRemoveAll(d.home)
703
-
704
-	mountPoints := make([]string, 2)
705
-
706
-	if err := d.Create("1", ""); err != nil {
707
-		t.Fatal(err)
708
-	}
709
-	// Mount the id
710
-	p, err := d.Get("1", "")
711
-	if err != nil {
712
-		t.Fatal(err)
713
-	}
714
-	mountPoints[0] = p
715
-
716
-	if err := d.Create("2", "1"); err != nil {
717
-		t.Fatal(err)
718
-	}
719
-
720
-	p, err = d.Get("2", "")
721
-	if err != nil {
722
-		t.Fatal(err)
723
-	}
724
-	mountPoints[1] = p
725
-
726
-	// Ensure that all the mount points are currently mounted
727
-	for _, p := range mountPoints {
728
-		if mounted, err := Mounted(p); err != nil {
729
-			t.Fatal(err)
730
-		} else if !mounted {
731
-			t.Fatalf("Expected %s to be mounted", p)
732
-		}
733
-	}
734
-
735
-	// Ensure that devices are active
736
-	for _, p := range []string{"1", "2"} {
737
-		if !d.HasActivatedDevice(p) {
738
-			t.Fatalf("Expected %s to have an active device", p)
739
-		}
740
-	}
741
-
742
-	if err := d.Cleanup(); err != nil {
743
-		t.Fatal(err)
744
-	}
745
-
746
-	// Ensure that all the mount points are no longer mounted
747
-	for _, p := range mountPoints {
748
-		if mounted, err := Mounted(p); err != nil {
749
-			t.Fatal(err)
750
-		} else if mounted {
751
-			t.Fatalf("Expected %s to not be mounted", p)
752
-		}
753
-	}
754
-
755
-	// Ensure that devices are no longer activated
756
-	for _, p := range []string{"1", "2"} {
757
-		if d.HasActivatedDevice(p) {
758
-			t.Fatalf("Expected %s not be an active device", p)
759
-		}
760
-	}
761
-}
762
-
763
-func TestNotMounted(t *testing.T) {
764
-	t.Skip("FIXME: not a unit test")
765
-	t.Skip("Not implemented")
766
-	d := newDriver(t)
767
-	defer cleanup(d)
768
-
769
-	if err := d.Create("1", ""); err != nil {
770
-		t.Fatal(err)
771
-	}
772
-
773
-	mounted, err := Mounted(path.Join(d.home, "mnt", "1"))
774
-	if err != nil {
775
-		t.Fatal(err)
776
-	}
777
-	if mounted {
778
-		t.Fatal("Id 1 should not be mounted")
779
-	}
780
-}
781
-
782
-func TestMounted(t *testing.T) {
783
-	t.Skip("FIXME: not a unit test")
784
-	d := newDriver(t)
785
-	defer cleanup(d)
786
-
787
-	if err := d.Create("1", ""); err != nil {
788
-		t.Fatal(err)
789
-	}
790
-	if _, err := d.Get("1", ""); err != nil {
791
-		t.Fatal(err)
792
-	}
793
-
794
-	mounted, err := Mounted(path.Join(d.home, "mnt", "1"))
795
-	if err != nil {
796
-		t.Fatal(err)
797
-	}
798
-	if !mounted {
799
-		t.Fatal("Id 1 should be mounted")
800
-	}
801
-}
802
-
803
-func TestInitCleanedDriver(t *testing.T) {
804
-	t.Skip("FIXME: not a unit test")
805
-	d := newDriver(t)
806
-
807
-	if err := d.Create("1", ""); err != nil {
808
-		t.Fatal(err)
809
-	}
810
-	if _, err := d.Get("1", ""); err != nil {
811
-		t.Fatal(err)
812
-	}
813
-
814
-	if err := d.Cleanup(); err != nil {
815
-		t.Fatal(err)
816
-	}
817
-
818
-	driver, err := Init(d.home)
819
-	if err != nil {
820
-		t.Fatal(err)
821
-	}
822
-	d = driver.(*Driver)
823
-	defer cleanup(d)
824
-
825
-	if _, err := d.Get("1", ""); err != nil {
826
-		t.Fatal(err)
827
-	}
828
-}
829
-
830
-func TestMountMountedDriver(t *testing.T) {
831
-	t.Skip("FIXME: not a unit test")
832
-	d := newDriver(t)
833
-	defer cleanup(d)
834
-
835
-	if err := d.Create("1", ""); err != nil {
836
-		t.Fatal(err)
837
-	}
838
-
839
-	// Perform get on same id to ensure that it will
840
-	// not be mounted twice
841
-	if _, err := d.Get("1", ""); err != nil {
842
-		t.Fatal(err)
843
-	}
844
-	if _, err := d.Get("1", ""); err != nil {
845
-		t.Fatal(err)
846
-	}
847
-}
848
-
849
-func TestGetReturnsValidDevice(t *testing.T) {
850
-	t.Skip("FIXME: not a unit test")
851
-	d := newDriver(t)
852
-	defer cleanup(d)
853
-
854
-	if err := d.Create("1", ""); err != nil {
855
-		t.Fatal(err)
856
-	}
857
-
858
-	if !d.HasDevice("1") {
859
-		t.Fatalf("Expected id 1 to be in device set")
860
-	}
861
-
862
-	if _, err := d.Get("1", ""); err != nil {
863
-		t.Fatal(err)
864
-	}
865
-
866
-	if !d.HasActivatedDevice("1") {
867
-		t.Fatalf("Expected id 1 to be activated")
868
-	}
869
-}
870
-
871
-func TestDriverGetSize(t *testing.T) {
872
-	t.Skip("FIXME: not a unit test")
873
-	t.Skipf("Size is currently not implemented")
874
-
875
-	d := newDriver(t)
876
-	defer cleanup(d)
877
-
878
-	if err := d.Create("1", ""); err != nil {
879
-		t.Fatal(err)
880
-	}
881
-
882
-	mountPoint, err := d.Get("1", "")
883
-	if err != nil {
884
-		t.Fatal(err)
885
-	}
886
-
887
-	size := int64(1024)
888
-
889
-	f, err := osCreate(path.Join(mountPoint, "test_file"))
890
-	if err != nil {
891
-		t.Fatal(err)
892
-	}
893
-	if err := f.Truncate(size); err != nil {
894
-		t.Fatal(err)
895
-	}
896
-	f.Close()
897
-
898
-	// diffSize, err := d.DiffSize("1")
899
-	// if err != nil {
900
-	// 	t.Fatal(err)
901
-	// }
902
-	// if diffSize != size {
903
-	// 	t.Fatalf("Expected size %d got %d", size, diffSize)
904
-	// }
905
-}
906
-
907
-func assertMap(t *testing.T, m map[string]bool, keys ...string) {
908
-	for _, key := range keys {
909
-		if _, exists := m[key]; !exists {
910
-			t.Fatalf("Key not set: %s", key)
911
-		}
912
-		delete(m, key)
913
-	}
914
-	if len(m) != 0 {
915
-		t.Fatalf("Unexpected keys: %v", m)
916
-	}
917
-}
918
-
919
-// This avoids creating a new driver for each test if all tests are run
920
-// Make sure to put new tests between TestDevmapperSetup and TestDevmapperTeardown
921
-func TestDevmapperSetup(t *testing.T) {
922
-	graphtest.GetDriver(t, "devicemapper")
923
-}
924
-
925
-func TestDevmapperCreateEmpty(t *testing.T) {
926
-	graphtest.DriverTestCreateEmpty(t, "devicemapper")
927
-}
928
-
929
-func TestDevmapperCreateBase(t *testing.T) {
930
-	graphtest.DriverTestCreateBase(t, "devicemapper")
931
-}
932
-
933
-func TestDevmapperCreateSnap(t *testing.T) {
934
-	graphtest.DriverTestCreateSnap(t, "devicemapper")
935
-}
936
-
937
-func TestDevmapperTeardown(t *testing.T) {
938
-	graphtest.PutDriver(t)
939
-}