driver_test.go 24 KB

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