driver_test.go 22 KB

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