Browse code

More dm unit tests

Guillaume J. Charmes authored on 2013/11/14 09:46:10
Showing 3 changed files
... ...
@@ -44,11 +44,11 @@ var (
44 44
 	ErrTaskSetName          = errors.New("dm_task_set_name failed")
45 45
 	ErrTaskSetMessage       = errors.New("dm_task_set_message failed")
46 46
 	ErrTaskSetAddNode       = errors.New("dm_task_set_add_node failed")
47
-	ErrTaskSetRO            = errors.New("dm_task_set_ro failed")
47
+	ErrTaskSetRo            = errors.New("dm_task_set_ro failed")
48 48
 	ErrTaskAddTarget        = errors.New("dm_task_add_target failed")
49 49
 	ErrTaskSetSector        = errors.New("dm_task_set_sector failed")
50
-	ErrGetInfo              = errors.New("dm_task_get_info failed")
51
-	ErrGetDriverVersion     = errors.New("dm_task_get_driver_version failed")
50
+	ErrTaskGetInfo          = errors.New("dm_task_get_info failed")
51
+	ErrTaskGetDriverVersion = errors.New("dm_task_get_driver_version failed")
52 52
 	ErrTaskSetCookie        = errors.New("dm_task_set_cookie failed")
53 53
 	ErrNilCookie            = errors.New("cookie ptr can't be nil")
54 54
 	ErrAttachLoopbackDevice = errors.New("loopback mounting failed")
... ...
@@ -58,6 +58,7 @@ var (
58 58
 	ErrGetLibraryVersion    = errors.New("dm_get_library_version failed")
59 59
 	ErrCreateRemoveTask     = errors.New("Can't create task of type DeviceRemove")
60 60
 	ErrRunRemoveDevice      = errors.New("running removeDevice failed")
61
+	ErrInvalidAddNode       = errors.New("Invalide AddNoce type")
61 62
 )
62 63
 
63 64
 type (
... ...
@@ -136,6 +137,9 @@ func (t *Task) SetCookie(cookie *uint, flags uint16) error {
136 136
 }
137 137
 
138 138
 func (t *Task) SetAddNode(addNode AddNodeType) error {
139
+	if addNode != AddNodeOnResume && addNode != AddNodeOnCreate {
140
+		return ErrInvalidAddNode
141
+	}
139 142
 	if res := DmTaskSetAddNode(t.unmanaged, addNode); res != 1 {
140 143
 		return ErrTaskSetAddNode
141 144
 	}
... ...
@@ -144,7 +148,7 @@ func (t *Task) SetAddNode(addNode AddNodeType) error {
144 144
 
145 145
 func (t *Task) SetRo() error {
146 146
 	if res := DmTaskSetRo(t.unmanaged); res != 1 {
147
-		return ErrTaskSetRO
147
+		return ErrTaskSetRo
148 148
 	}
149 149
 	return nil
150 150
 }
... ...
@@ -157,18 +161,10 @@ func (t *Task) AddTarget(start, size uint64, ttype, params string) error {
157 157
 	return nil
158 158
 }
159 159
 
160
-func (t *Task) GetDriverVersion() (string, error) {
161
-	var version string
162
-	if res := DmTaskGetDriverVersion(t.unmanaged, &version); res != 1 {
163
-		return "", ErrGetDriverVersion
164
-	}
165
-	return version, nil
166
-}
167
-
168 160
 func (t *Task) GetInfo() (*Info, error) {
169 161
 	info := &Info{}
170 162
 	if res := DmTaskGetInfo(t.unmanaged, info); res != 1 {
171
-		return nil, ErrGetInfo
163
+		return nil, ErrTaskGetInfo
172 164
 	}
173 165
 	return info, nil
174 166
 }
... ...
@@ -190,24 +186,6 @@ func AttachLoopDevice(filename string) (*os.File, error) {
190 190
 	return os.NewFile(uintptr(fd), res), nil
191 191
 }
192 192
 
193
-func getBlockSize(fd uintptr) int {
194
-	var size uint64
195
-
196
-	if err := SysGetBlockSize(fd, &size); err != 0 {
197
-		utils.Debugf("Error ioctl (getBlockSize: %s)", err)
198
-		return -1
199
-	}
200
-	return int(size)
201
-}
202
-
203
-func GetBlockDeviceSize(file *os.File) (uint64, error) {
204
-	size := DmGetBlockSize(file.Fd())
205
-	if size == -1 {
206
-		return 0, ErrGetBlockSize
207
-	}
208
-	return uint64(size), nil
209
-}
210
-
211 193
 func UdevWait(cookie uint) error {
212 194
 	if res := DmUdevWait(cookie); res != 1 {
213 195
 		utils.Debugf("Failed to wait on udev cookie %d", cookie)
... ...
@@ -259,6 +237,14 @@ func RemoveDevice(name string) error {
259 259
 	return nil
260 260
 }
261 261
 
262
+func GetBlockDeviceSize(file *os.File) (uint64, error) {
263
+	size, errno := DmGetBlockSize(file.Fd())
264
+	if size == -1 || errno != 0 {
265
+		return 0, ErrGetBlockSize
266
+	}
267
+	return uint64(size), nil
268
+}
269
+
262 270
 // This is the programmatic example of "dmsetup create"
263 271
 func createPool(poolName string, dataFile *os.File, metadataFile *os.File) error {
264 272
 	task, err := createTask(DeviceCreate, poolName)
... ...
@@ -282,7 +268,7 @@ func createPool(poolName string, dataFile *os.File, metadataFile *os.File) error
282 282
 	}
283 283
 
284 284
 	if err := task.Run(); err != nil {
285
-		return fmt.Errorf("Error running DeviceCreate")
285
+		return fmt.Errorf("Error running DeviceCreate (createPool)")
286 286
 	}
287 287
 
288 288
 	UdevWait(cookie)
... ...
@@ -462,7 +448,7 @@ func activateDevice(poolName string, name string, deviceId int, size uint64) err
462 462
 	}
463 463
 
464 464
 	if err := task.Run(); err != nil {
465
-		return fmt.Errorf("Error running DeviceCreate")
465
+		return fmt.Errorf("Error running DeviceCreate (activateDevice)")
466 466
 	}
467 467
 
468 468
 	UdevWait(cookie)
... ...
@@ -506,7 +492,7 @@ func (devices *DeviceSet) createSnapDevice(poolName string, deviceId int, baseNa
506 506
 		if doSuspend {
507 507
 			resumeDevice(baseName)
508 508
 		}
509
-		return fmt.Errorf("Error running DeviceCreate")
509
+		return fmt.Errorf("Error running DeviceCreate (createSnapDevice)")
510 510
 	}
511 511
 
512 512
 	if doSuspend {
... ...
@@ -36,11 +36,11 @@ func TestTaskRun(t *testing.T) {
36 36
 
37 37
 	task = taskCreate(t, DeviceInfo)
38 38
 	// Perform the RUN
39
-	if err := task.Run(); err == nil {
39
+	if err := task.Run(); err != ErrTaskRun {
40 40
 		t.Fatalf("An error should have occured while running task.")
41 41
 	}
42 42
 	// Make sure GetInfo also fails
43
-	if _, err := task.GetInfo(); err == nil {
43
+	if _, err := task.GetInfo(); err != ErrTaskGetInfo {
44 44
 		t.Fatalf("GetInfo should fail if task.Run() failed.")
45 45
 	}
46 46
 }
... ...
@@ -56,6 +56,7 @@ func TestTaskSetName(t *testing.T) {
56 56
 	// Test failure
57 57
 	DmTaskSetName = dmTaskSetNameFail
58 58
 	defer func() { DmTaskSetName = dmTaskSetNameFct }()
59
+
59 60
 	if err := task.SetName("test"); err != ErrTaskSetName {
60 61
 		t.Fatalf("An error should have occured while runnign SetName.")
61 62
 	}
... ...
@@ -72,6 +73,7 @@ func TestTaskSetMessage(t *testing.T) {
72 72
 	// Test failure
73 73
 	DmTaskSetMessage = dmTaskSetMessageFail
74 74
 	defer func() { DmTaskSetMessage = dmTaskSetMessageFct }()
75
+
75 76
 	if err := task.SetMessage("test"); err != ErrTaskSetMessage {
76 77
 		t.Fatalf("An error should have occured while runnign SetMessage.")
77 78
 	}
... ...
@@ -120,22 +122,84 @@ func TestTaskSetCookie(t *testing.T) {
120 120
 
121 121
 func TestTaskSetAddNode(t *testing.T) {
122 122
 	task := taskCreate(t, DeviceInfo)
123
+
124
+	// Test success
123 125
 	if err := task.SetAddNode(0); err != nil {
124 126
 		t.Fatal(err)
125 127
 	}
128
+
129
+	// Test failure
130
+	if err := task.SetAddNode(-1); err != ErrInvalidAddNode {
131
+		t.Fatalf("An error should have occured running SetAddNode with wrong node.")
132
+	}
133
+
134
+	DmTaskSetAddNode = dmTaskSetAddNodeFail
135
+	defer func() { DmTaskSetAddNode = dmTaskSetAddNodeFct }()
136
+
137
+	if err := task.SetAddNode(0); err != ErrTaskSetAddNode {
138
+		t.Fatalf("An error should have occured running SetAddNode.")
139
+	}
126 140
 }
127 141
 
128 142
 func TestTaskSetRo(t *testing.T) {
129 143
 	task := taskCreate(t, DeviceInfo)
144
+
145
+	// Test success
130 146
 	if err := task.SetRo(); err != nil {
131 147
 		t.Fatal(err)
132 148
 	}
149
+
150
+	// Test failure
151
+	DmTaskSetRo = dmTaskSetRoFail
152
+	defer func() { DmTaskSetRo = dmTaskSetRoFct }()
153
+
154
+	if err := task.SetRo(); err != ErrTaskSetRo {
155
+		t.Fatalf("An error should have occured running SetRo.")
156
+	}
133 157
 }
134 158
 
135 159
 func TestTaskAddTarget(t *testing.T) {
136
-	//	task := taskCreate(t, DeviceInfo)
160
+	task := taskCreate(t, DeviceInfo)
161
+
162
+	// Test success
163
+	if err := task.AddTarget(0, 128, "thinp", ""); err != nil {
164
+		t.Fatal(err)
165
+	}
166
+
167
+	// Test failure
168
+	DmTaskAddTarget = dmTaskAddTargetFail
169
+	defer func() { DmTaskAddTarget = dmTaskAddTargetFct }()
170
+
171
+	if err := task.AddTarget(0, 128, "thinp", ""); err != ErrTaskAddTarget {
172
+		t.Fatalf("An error should have occured running AddTarget.")
173
+	}
137 174
 }
138 175
 
176
+// func TestTaskGetInfo(t *testing.T) {
177
+// 	task := taskCreate(t, DeviceInfo)
178
+
179
+// 	// Test success
180
+// 	if _, err := task.GetInfo(); err != nil {
181
+// 		t.Fatal(err)
182
+// 	}
183
+
184
+// 	// Test failure
185
+// 	DmTaskGetInfo = dmTaskGetInfoFail
186
+// 	defer func() { DmTaskGetInfo = dmTaskGetInfoFct }()
187
+
188
+// 	if _, err := task.GetInfo(); err != ErrTaskGetInfo {
189
+// 		t.Fatalf("An error should have occured running GetInfo.")
190
+// 	}
191
+// }
192
+
193
+// func TestTaskGetNextTarget(t *testing.T) {
194
+// 	task := taskCreate(t, DeviceInfo)
195
+
196
+// 	if next, _, _, _, _ := task.GetNextTarget(0); next == 0 {
197
+// 		t.Fatalf("The next target should not be 0.")
198
+// 	}
199
+// }
200
+
139 201
 /// Utils
140 202
 func taskCreate(t *testing.T, taskType TaskType) *Task {
141 203
 	task := TaskCreate(taskType)
... ...
@@ -116,15 +116,6 @@ char*			attach_loop_device(const char *filename, int *loop_fd_out)
116 116
   return (NULL);
117 117
 }
118 118
 
119
-static int64_t	get_block_size(int fd)
120
-{
121
-  uint64_t	size;
122
-
123
-  if (ioctl(fd, BLKGETSIZE64, &size) == -1)
124
-    return -1;
125
-  return ((int64_t)size);
126
-}
127
-
128 119
 extern void DevmapperLogCallback(int level, char *file, int line, int dm_errno_or_class, char *str);
129 120
 
130 121
 static void	log_cb(int level, const char *file, int line,
... ...
@@ -158,27 +149,26 @@ type (
158 158
 )
159 159
 
160 160
 var (
161
-	DmTaskDestory          = dmTaskDestroyFct
162
-	DmTaskCreate           = dmTaskCreateFct
163
-	DmTaskRun              = dmTaskRunFct
164
-	DmTaskSetName          = dmTaskSetNameFct
165
-	DmTaskSetMessage       = dmTaskSetMessageFct
166
-	DmTaskSetSector        = dmTaskSetSectorFct
167
-	DmTaskSetCookie        = dmTaskSetCookieFct
168
-	DmTaskSetAddNode       = dmTaskSetAddNodeFct
169
-	DmTaskSetRo            = dmTaskSetRoFct
170
-	DmTaskAddTarget        = dmTaskAddTargetFct
171
-	DmTaskGetDriverVersion = dmTaskGetDriverVersionFct
172
-	DmTaskGetInfo          = dmTaskGetInfoFct
173
-	DmGetNextTarget        = dmGetNextTargetFct
174
-	DmAttachLoopDevice     = dmAttachLoopDeviceFct
175
-	SysGetBlockSize        = sysGetBlockSizeFct
176
-	DmGetBlockSize         = dmGetBlockSizeFct
177
-	DmUdevWait             = dmUdevWaitFct
178
-	DmLogInitVerbose       = dmLogInitVerboseFct
179
-	LogWithErrnoInit       = logWithErrnoInitFct
180
-	DmSetDevDir            = dmSetDevDirFct
181
-	DmGetLibraryVersion    = dmGetLibraryVersionFct
161
+	DmTaskDestory       = dmTaskDestroyFct
162
+	DmTaskCreate        = dmTaskCreateFct
163
+	DmTaskRun           = dmTaskRunFct
164
+	DmTaskSetName       = dmTaskSetNameFct
165
+	DmTaskSetMessage    = dmTaskSetMessageFct
166
+	DmTaskSetSector     = dmTaskSetSectorFct
167
+	DmTaskSetCookie     = dmTaskSetCookieFct
168
+	DmTaskSetAddNode    = dmTaskSetAddNodeFct
169
+	DmTaskSetRo         = dmTaskSetRoFct
170
+	DmTaskAddTarget     = dmTaskAddTargetFct
171
+	DmTaskGetInfo       = dmTaskGetInfoFct
172
+	DmGetNextTarget     = dmGetNextTargetFct
173
+	DmGetBlockSize      = dmGetBlockSizeFct
174
+	DmAttachLoopDevice  = dmAttachLoopDeviceFct
175
+	DmUdevWait          = dmUdevWaitFct
176
+	DmLogInitVerbose    = dmLogInitVerboseFct
177
+	DmSetDevDir         = dmSetDevDirFct
178
+	DmGetLibraryVersion = dmGetLibraryVersionFct
179
+	LogWithErrnoInit    = logWithErrnoInitFct
180
+	GetBlockSize        = getBlockSizeFct
182 181
 )
183 182
 
184 183
 func free(p *C.char) {
... ...
@@ -249,14 +239,11 @@ func dmTaskAddTargetFct(task *CDmTask,
249 249
 		C.uint64_t(start), C.uint64_t(size), Cttype, Cparams))
250 250
 }
251 251
 
252
-func dmTaskGetDriverVersionFct(task *CDmTask, version *string) int {
253
-	buffer := C.CString(string(make([]byte, 128)))
254
-	defer free(buffer)
255
-	defer func() {
256
-		*version = C.GoString(buffer)
257
-	}()
258
-	return int(C.dm_task_get_driver_version((*C.struct_dm_task)(task),
259
-		buffer, 128))
252
+func dmGetBlockSizeFct(fd uintptr) (int64, syscall.Errno) {
253
+	var size int64
254
+	_, _, err := syscall.Syscall(syscall.SYS_IOCTL, fd, C.BLKGETSIZE64,
255
+		uintptr(unsafe.Pointer(&size)))
256
+	return size, err
260 257
 }
261 258
 
262 259
 func dmTaskGetInfoFct(task *CDmTask, info *Info) int {
... ...
@@ -308,18 +295,12 @@ func dmAttachLoopDeviceFct(filename string, fd *int) string {
308 308
 	return C.GoString(ret)
309 309
 }
310 310
 
311
-// sysGetBlockSizeFct retrieves the block size from IOCTL
312
-func sysGetBlockSizeFct(fd uintptr, size *uint64) syscall.Errno {
311
+func getBlockSizeFct(fd uintptr, size *uint64) syscall.Errno {
313 312
 	_, _, err := syscall.Syscall(syscall.SYS_IOCTL, fd, C.BLKGETSIZE64,
314 313
 		uintptr(unsafe.Pointer(&size)))
315 314
 	return err
316 315
 }
317 316
 
318
-// dmGetBlockSizeFct retrieves the block size from library call
319
-func dmGetBlockSizeFct(fd uintptr) int64 {
320
-	return int64(C.get_block_size(C.int(fd)))
321
-}
322
-
323 317
 func dmUdevWaitFct(cookie uint) int {
324 318
 	return int(C.dm_udev_wait(C.uint32_t(cookie)))
325 319
 }