driver_test.go 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364
  1. package devmapper
  2. import (
  3. "io/ioutil"
  4. "path"
  5. "testing"
  6. )
  7. func init() {
  8. // Reduce the size the the base fs and loopback for the tests
  9. DefaultDataLoopbackSize = 300 * 1024 * 1024
  10. DefaultMetaDataLoopbackSize = 200 * 1024 * 1024
  11. DefaultBaseFsSize = 300 * 1024 * 1024
  12. // Hijack all calls to libdevmapper with default panics.
  13. // Authorized calls are selectively hijacked in each tests.
  14. DmTaskCreate = func(t int) *CDmTask {
  15. panic("DmTaskCreate: this method should not be called here")
  16. }
  17. DmTaskRun = func(task *CDmTask) int {
  18. panic("DmTaskRun: this method should not be called here")
  19. }
  20. DmTaskSetName = func(task *CDmTask, name string) int {
  21. panic("DmTaskSetName: this method should not be called here")
  22. }
  23. DmTaskSetMessage = func(task *CDmTask, message string) int {
  24. panic("DmTaskSetMessage: this method should not be called here")
  25. }
  26. DmTaskSetSector = func(task *CDmTask, sector uint64) int {
  27. panic("DmTaskSetSector: this method should not be called here")
  28. }
  29. DmTaskSetCookie = func(task *CDmTask, cookie *uint, flags uint16) int {
  30. panic("DmTaskSetCookie: this method should not be called here")
  31. }
  32. DmTaskSetAddNode = func(task *CDmTask, addNode AddNodeType) int {
  33. panic("DmTaskSetAddNode: this method should not be called here")
  34. }
  35. DmTaskSetRo = func(task *CDmTask) int {
  36. panic("DmTaskSetRo: this method should not be called here")
  37. }
  38. DmTaskAddTarget = func(task *CDmTask, start, size uint64, ttype, params string) int {
  39. panic("DmTaskAddTarget: this method should not be called here")
  40. }
  41. DmTaskGetInfo = func(task *CDmTask, info *Info) int {
  42. panic("DmTaskGetInfo: this method should not be called here")
  43. }
  44. DmGetNextTarget = func(task *CDmTask, next uintptr, start, length *uint64, target, params *string) uintptr {
  45. panic("DmGetNextTarget: this method should not be called here")
  46. }
  47. DmAttachLoopDevice = func(filename string, fd *int) string {
  48. panic("DmAttachLoopDevice: this method should not be called here")
  49. }
  50. DmGetBlockSize = func(fd uintptr) (int64, sysErrno) {
  51. panic("DmGetBlockSize: this method should not be called here")
  52. }
  53. DmUdevWait = func(cookie uint) int {
  54. panic("DmUdevWait: this method should not be called here")
  55. }
  56. DmSetDevDir = func(dir string) int {
  57. panic("DmSetDevDir: this method should not be called here")
  58. }
  59. DmGetLibraryVersion = func(version *string) int {
  60. panic("DmGetLibraryVersion: this method should not be called here")
  61. }
  62. DmLogInitVerbose = func(level int) {
  63. panic("DmLogInitVerbose: this method should not be called here")
  64. }
  65. DmTaskDestroy = func(task *CDmTask) {
  66. panic("DmTaskDestroy: this method should not be called here")
  67. }
  68. GetBlockSize = func(fd uintptr, size *uint64) sysErrno {
  69. panic("GetBlockSize: 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 mkTestDirectory(t *testing.T) string {
  76. dir, err := ioutil.TempDir("", "docker-test-devmapper-")
  77. if err != nil {
  78. t.Fatal(err)
  79. }
  80. return dir
  81. }
  82. func newDriver(t *testing.T) *Driver {
  83. home := mkTestDirectory(t)
  84. d, err := Init(home)
  85. if err != nil {
  86. t.Fatal(err)
  87. }
  88. return d.(*Driver)
  89. }
  90. func cleanup(d *Driver) {
  91. d.Cleanup()
  92. osRemoveAll(d.home)
  93. }
  94. func TestInit(t *testing.T) {
  95. home := mkTestDirectory(t)
  96. defer osRemoveAll(home)
  97. driver, err := Init(home)
  98. if err != nil {
  99. t.Fatal(err)
  100. }
  101. defer func() {
  102. if err := driver.Cleanup(); err != nil {
  103. t.Fatal(err)
  104. }
  105. }()
  106. id := "foo"
  107. if err := driver.Create(id, ""); err != nil {
  108. t.Fatal(err)
  109. }
  110. dir, err := driver.Get(id)
  111. if err != nil {
  112. t.Fatal(err)
  113. }
  114. if st, err := osStat(dir); err != nil {
  115. t.Fatal(err)
  116. } else if !st.IsDir() {
  117. t.Fatalf("Get(%V) did not return a directory", id)
  118. }
  119. }
  120. func TestDriverName(t *testing.T) {
  121. d := newDriver(t)
  122. defer cleanup(d)
  123. if d.String() != "devicemapper" {
  124. t.Fatalf("Expected driver name to be devicemapper got %s", d.String())
  125. }
  126. }
  127. func TestDriverCreate(t *testing.T) {
  128. d := newDriver(t)
  129. defer cleanup(d)
  130. if err := d.Create("1", ""); err != nil {
  131. t.Fatal(err)
  132. }
  133. }
  134. func TestDriverRemove(t *testing.T) {
  135. d := newDriver(t)
  136. defer cleanup(d)
  137. if err := d.Create("1", ""); err != nil {
  138. t.Fatal(err)
  139. }
  140. if err := d.Remove("1"); err != nil {
  141. t.Fatal(err)
  142. }
  143. }
  144. func TestCleanup(t *testing.T) {
  145. t.Skip("Unimplemented")
  146. d := newDriver(t)
  147. defer osRemoveAll(d.home)
  148. mountPoints := make([]string, 2)
  149. if err := d.Create("1", ""); err != nil {
  150. t.Fatal(err)
  151. }
  152. // Mount the id
  153. p, err := d.Get("1")
  154. if err != nil {
  155. t.Fatal(err)
  156. }
  157. mountPoints[0] = p
  158. if err := d.Create("2", "1"); err != nil {
  159. t.Fatal(err)
  160. }
  161. p, err = d.Get("2")
  162. if err != nil {
  163. t.Fatal(err)
  164. }
  165. mountPoints[1] = p
  166. // Ensure that all the mount points are currently mounted
  167. for _, p := range mountPoints {
  168. if mounted, err := Mounted(p); err != nil {
  169. t.Fatal(err)
  170. } else if !mounted {
  171. t.Fatalf("Expected %s to be mounted", p)
  172. }
  173. }
  174. // Ensure that devices are active
  175. for _, p := range []string{"1", "2"} {
  176. if !d.HasActivatedDevice(p) {
  177. t.Fatalf("Expected %s to have an active device", p)
  178. }
  179. }
  180. if err := d.Cleanup(); err != nil {
  181. t.Fatal(err)
  182. }
  183. // Ensure that all the mount points are no longer mounted
  184. for _, p := range mountPoints {
  185. if mounted, err := Mounted(p); err != nil {
  186. t.Fatal(err)
  187. } else if mounted {
  188. t.Fatalf("Expected %s to not be mounted", p)
  189. }
  190. }
  191. // Ensure that devices are no longer activated
  192. for _, p := range []string{"1", "2"} {
  193. if d.HasActivatedDevice(p) {
  194. t.Fatalf("Expected %s not be an active device", p)
  195. }
  196. }
  197. }
  198. func TestNotMounted(t *testing.T) {
  199. t.Skip("Not implemented")
  200. d := newDriver(t)
  201. defer cleanup(d)
  202. if err := d.Create("1", ""); err != nil {
  203. t.Fatal(err)
  204. }
  205. mounted, err := Mounted(path.Join(d.home, "mnt", "1"))
  206. if err != nil {
  207. t.Fatal(err)
  208. }
  209. if mounted {
  210. t.Fatal("Id 1 should not be mounted")
  211. }
  212. }
  213. func TestMounted(t *testing.T) {
  214. d := newDriver(t)
  215. defer cleanup(d)
  216. if err := d.Create("1", ""); err != nil {
  217. t.Fatal(err)
  218. }
  219. if _, err := d.Get("1"); err != nil {
  220. t.Fatal(err)
  221. }
  222. mounted, err := Mounted(path.Join(d.home, "mnt", "1"))
  223. if err != nil {
  224. t.Fatal(err)
  225. }
  226. if !mounted {
  227. t.Fatal("Id 1 should be mounted")
  228. }
  229. }
  230. func TestInitCleanedDriver(t *testing.T) {
  231. d := newDriver(t)
  232. if err := d.Create("1", ""); err != nil {
  233. t.Fatal(err)
  234. }
  235. if _, err := d.Get("1"); err != nil {
  236. t.Fatal(err)
  237. }
  238. if err := d.Cleanup(); err != nil {
  239. t.Fatal(err)
  240. }
  241. driver, err := Init(d.home)
  242. if err != nil {
  243. t.Fatal(err)
  244. }
  245. d = driver.(*Driver)
  246. defer cleanup(d)
  247. if _, err := d.Get("1"); err != nil {
  248. t.Fatal(err)
  249. }
  250. }
  251. func TestMountMountedDriver(t *testing.T) {
  252. d := newDriver(t)
  253. defer cleanup(d)
  254. if err := d.Create("1", ""); err != nil {
  255. t.Fatal(err)
  256. }
  257. // Perform get on same id to ensure that it will
  258. // not be mounted twice
  259. if _, err := d.Get("1"); err != nil {
  260. t.Fatal(err)
  261. }
  262. if _, err := d.Get("1"); err != nil {
  263. t.Fatal(err)
  264. }
  265. }
  266. func TestGetReturnsValidDevice(t *testing.T) {
  267. d := newDriver(t)
  268. defer cleanup(d)
  269. if err := d.Create("1", ""); err != nil {
  270. t.Fatal(err)
  271. }
  272. if !d.HasDevice("1") {
  273. t.Fatalf("Expected id 1 to be in device set")
  274. }
  275. if _, err := d.Get("1"); err != nil {
  276. t.Fatal(err)
  277. }
  278. if !d.HasActivatedDevice("1") {
  279. t.Fatalf("Expected id 1 to be activated")
  280. }
  281. if !d.HasInitializedDevice("1") {
  282. t.Fatalf("Expected id 1 to be initialized")
  283. }
  284. }
  285. func TestDriverGetSize(t *testing.T) {
  286. t.Skipf("Size is currently not implemented")
  287. d := newDriver(t)
  288. defer cleanup(d)
  289. if err := d.Create("1", ""); err != nil {
  290. t.Fatal(err)
  291. }
  292. mountPoint, err := d.Get("1")
  293. if err != nil {
  294. t.Fatal(err)
  295. }
  296. size := int64(1024)
  297. f, err := osCreate(path.Join(mountPoint, "test_file"))
  298. if err != nil {
  299. t.Fatal(err)
  300. }
  301. if err := f.Truncate(size); err != nil {
  302. t.Fatal(err)
  303. }
  304. f.Close()
  305. // diffSize, err := d.DiffSize("1")
  306. // if err != nil {
  307. // t.Fatal(err)
  308. // }
  309. // if diffSize != size {
  310. // t.Fatalf("Expected size %d got %d", size, diffSize)
  311. // }
  312. }