driver_test.go 22 KB

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