driver_test.go 22 KB

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