aufs_test.go 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517
  1. package aufs
  2. import (
  3. "github.com/dotcloud/docker/archive"
  4. "os"
  5. "path"
  6. "testing"
  7. )
  8. var (
  9. tmp = path.Join(os.TempDir(), "aufs-tests", "aufs")
  10. )
  11. func newDriver(t *testing.T) *Driver {
  12. if err := os.MkdirAll(tmp, 0755); err != nil {
  13. t.Fatal(err)
  14. }
  15. d, err := Init(tmp)
  16. if err != nil {
  17. t.Fatal(err)
  18. }
  19. return d.(*Driver)
  20. }
  21. func TestNewDriver(t *testing.T) {
  22. if err := os.MkdirAll(tmp, 0755); err != nil {
  23. t.Fatal(err)
  24. }
  25. d, err := Init(tmp)
  26. if err != nil {
  27. t.Fatal(err)
  28. }
  29. defer os.RemoveAll(tmp)
  30. if d == nil {
  31. t.Fatalf("Driver should not be nil")
  32. }
  33. }
  34. func TestAufsString(t *testing.T) {
  35. d := newDriver(t)
  36. defer os.RemoveAll(tmp)
  37. if d.String() != "aufs" {
  38. t.Fatalf("Expected aufs got %s", d.String())
  39. }
  40. }
  41. func TestCreateDirStructure(t *testing.T) {
  42. newDriver(t)
  43. defer os.RemoveAll(tmp)
  44. paths := []string{
  45. "mnt",
  46. "layers",
  47. "diff",
  48. }
  49. for _, p := range paths {
  50. if _, err := os.Stat(path.Join(tmp, p)); err != nil {
  51. t.Fatal(err)
  52. }
  53. }
  54. }
  55. // We should be able to create two drivers with the same dir structure
  56. func TestNewDriverFromExistingDir(t *testing.T) {
  57. if err := os.MkdirAll(tmp, 0755); err != nil {
  58. t.Fatal(err)
  59. }
  60. if _, err := Init(tmp); err != nil {
  61. t.Fatal(err)
  62. }
  63. if _, err := Init(tmp); err != nil {
  64. t.Fatal(err)
  65. }
  66. os.RemoveAll(tmp)
  67. }
  68. func TestCreateNewDir(t *testing.T) {
  69. d := newDriver(t)
  70. defer os.RemoveAll(tmp)
  71. if err := d.Create("1", ""); err != nil {
  72. t.Fatal(err)
  73. }
  74. }
  75. func TestCreateNewDirStructure(t *testing.T) {
  76. d := newDriver(t)
  77. defer os.RemoveAll(tmp)
  78. if err := d.Create("1", ""); err != nil {
  79. t.Fatal(err)
  80. }
  81. paths := []string{
  82. "mnt",
  83. "diff",
  84. "layers",
  85. }
  86. for _, p := range paths {
  87. if _, err := os.Stat(path.Join(tmp, p, "1")); err != nil {
  88. t.Fatal(err)
  89. }
  90. }
  91. }
  92. func TestRemoveImage(t *testing.T) {
  93. d := newDriver(t)
  94. defer os.RemoveAll(tmp)
  95. if err := d.Create("1", ""); err != nil {
  96. t.Fatal(err)
  97. }
  98. if err := d.Remove("1"); err != nil {
  99. t.Fatal(err)
  100. }
  101. paths := []string{
  102. "mnt",
  103. "diff",
  104. "layers",
  105. }
  106. for _, p := range paths {
  107. if _, err := os.Stat(path.Join(tmp, p, "1")); err == nil {
  108. t.Fatalf("Error should not be nil because dirs with id 1 should be delted: %s", p)
  109. }
  110. }
  111. }
  112. func TestGetWithoutParent(t *testing.T) {
  113. d := newDriver(t)
  114. defer os.RemoveAll(tmp)
  115. if err := d.Create("1", ""); err != nil {
  116. t.Fatal(err)
  117. }
  118. diffPath, err := d.Get("1")
  119. if err != nil {
  120. t.Fatal(err)
  121. }
  122. expected := path.Join(tmp, "diff", "1")
  123. if diffPath != expected {
  124. t.Fatalf("Expected path %s got %s", expected, diffPath)
  125. }
  126. }
  127. func TestCleanupWithNoDirs(t *testing.T) {
  128. d := newDriver(t)
  129. defer os.RemoveAll(tmp)
  130. if err := d.Cleanup(); err != nil {
  131. t.Fatal(err)
  132. }
  133. }
  134. func TestCleanupWithDir(t *testing.T) {
  135. d := newDriver(t)
  136. defer os.RemoveAll(tmp)
  137. if err := d.Create("1", ""); err != nil {
  138. t.Fatal(err)
  139. }
  140. if err := d.Cleanup(); err != nil {
  141. t.Fatal(err)
  142. }
  143. }
  144. func TestMountedFalseResponse(t *testing.T) {
  145. d := newDriver(t)
  146. defer os.RemoveAll(tmp)
  147. if err := d.Create("1", ""); err != nil {
  148. t.Fatal(err)
  149. }
  150. response, err := d.mounted("1")
  151. if err != nil {
  152. t.Fatal(err)
  153. }
  154. if response != false {
  155. t.Fatalf("Response if dir id 1 is mounted should be false")
  156. }
  157. }
  158. func TestMountedTrueReponse(t *testing.T) {
  159. d := newDriver(t)
  160. defer os.RemoveAll(tmp)
  161. defer d.Cleanup()
  162. if err := d.Create("1", ""); err != nil {
  163. t.Fatal(err)
  164. }
  165. if err := d.Create("2", "1"); err != nil {
  166. t.Fatal(err)
  167. }
  168. _, err := d.Get("2")
  169. if err != nil {
  170. t.Fatal(err)
  171. }
  172. response, err := d.mounted("2")
  173. if err != nil {
  174. t.Fatal(err)
  175. }
  176. if response != true {
  177. t.Fatalf("Response if dir id 2 is mounted should be true")
  178. }
  179. }
  180. func TestMountWithParent(t *testing.T) {
  181. d := newDriver(t)
  182. defer os.RemoveAll(tmp)
  183. if err := d.Create("1", ""); err != nil {
  184. t.Fatal(err)
  185. }
  186. if err := d.Create("2", "1"); err != nil {
  187. t.Fatal(err)
  188. }
  189. defer func() {
  190. if err := d.Cleanup(); err != nil {
  191. t.Fatal(err)
  192. }
  193. }()
  194. mntPath, err := d.Get("2")
  195. if err != nil {
  196. t.Fatal(err)
  197. }
  198. if mntPath == "" {
  199. t.Fatal("mntPath should not be empty string")
  200. }
  201. expected := path.Join(tmp, "mnt", "2")
  202. if mntPath != expected {
  203. t.Fatalf("Expected %s got %s", expected, mntPath)
  204. }
  205. }
  206. func TestRemoveMountedDir(t *testing.T) {
  207. d := newDriver(t)
  208. defer os.RemoveAll(tmp)
  209. if err := d.Create("1", ""); err != nil {
  210. t.Fatal(err)
  211. }
  212. if err := d.Create("2", "1"); err != nil {
  213. t.Fatal(err)
  214. }
  215. defer func() {
  216. if err := d.Cleanup(); err != nil {
  217. t.Fatal(err)
  218. }
  219. }()
  220. mntPath, err := d.Get("2")
  221. if err != nil {
  222. t.Fatal(err)
  223. }
  224. if mntPath == "" {
  225. t.Fatal("mntPath should not be empty string")
  226. }
  227. mounted, err := d.mounted("2")
  228. if err != nil {
  229. t.Fatal(err)
  230. }
  231. if !mounted {
  232. t.Fatalf("Dir id 2 should be mounted")
  233. }
  234. if err := d.Remove("2"); err != nil {
  235. t.Fatal(err)
  236. }
  237. }
  238. func TestCreateWithInvalidParent(t *testing.T) {
  239. d := newDriver(t)
  240. defer os.RemoveAll(tmp)
  241. if err := d.Create("1", "docker"); err == nil {
  242. t.Fatalf("Error should not be nil with parent does not exist")
  243. }
  244. }
  245. func TestGetDiff(t *testing.T) {
  246. d := newDriver(t)
  247. defer os.RemoveAll(tmp)
  248. if err := d.Create("1", ""); err != nil {
  249. t.Fatal(err)
  250. }
  251. diffPath, err := d.Get("1")
  252. if err != nil {
  253. t.Fatal(err)
  254. }
  255. // Add a file to the diff path with a fixed size
  256. size := int64(1024)
  257. f, err := os.Create(path.Join(diffPath, "test_file"))
  258. if err != nil {
  259. t.Fatal(err)
  260. }
  261. if err := f.Truncate(size); err != nil {
  262. t.Fatal(err)
  263. }
  264. f.Close()
  265. a, err := d.Diff("1")
  266. if err != nil {
  267. t.Fatal(err)
  268. }
  269. if a == nil {
  270. t.Fatalf("Archive should not be nil")
  271. }
  272. }
  273. func TestChanges(t *testing.T) {
  274. d := newDriver(t)
  275. defer os.RemoveAll(tmp)
  276. if err := d.Create("1", ""); err != nil {
  277. t.Fatal(err)
  278. }
  279. if err := d.Create("2", "1"); err != nil {
  280. t.Fatal(err)
  281. }
  282. defer func() {
  283. if err := d.Cleanup(); err != nil {
  284. t.Fatal(err)
  285. }
  286. }()
  287. mntPoint, err := d.Get("2")
  288. if err != nil {
  289. t.Fatal(err)
  290. }
  291. // Create a file to save in the mountpoint
  292. f, err := os.Create(path.Join(mntPoint, "test.txt"))
  293. if err != nil {
  294. t.Fatal(err)
  295. }
  296. if _, err := f.WriteString("testline"); err != nil {
  297. t.Fatal(err)
  298. }
  299. if err := f.Close(); err != nil {
  300. t.Fatal(err)
  301. }
  302. changes, err := d.Changes("2")
  303. if err != nil {
  304. t.Fatal(err)
  305. }
  306. if len(changes) != 1 {
  307. t.Fatalf("Dir 2 should have one change from parent got %d", len(changes))
  308. }
  309. change := changes[0]
  310. expectedPath := "/test.txt"
  311. if change.Path != expectedPath {
  312. t.Fatalf("Expected path %s got %s", expectedPath, change.Path)
  313. }
  314. if change.Kind != archive.ChangeAdd {
  315. t.Fatalf("Change kind should be ChangeAdd got %s", change.Kind)
  316. }
  317. if err := d.Create("3", "2"); err != nil {
  318. t.Fatal(err)
  319. }
  320. mntPoint, err = d.Get("3")
  321. if err != nil {
  322. t.Fatal(err)
  323. }
  324. // Create a file to save in the mountpoint
  325. f, err = os.Create(path.Join(mntPoint, "test2.txt"))
  326. if err != nil {
  327. t.Fatal(err)
  328. }
  329. if _, err := f.WriteString("testline"); err != nil {
  330. t.Fatal(err)
  331. }
  332. if err := f.Close(); err != nil {
  333. t.Fatal(err)
  334. }
  335. changes, err = d.Changes("3")
  336. if err != nil {
  337. t.Fatal(err)
  338. }
  339. if len(changes) != 1 {
  340. t.Fatalf("Dir 2 should have one change from parent got %d", len(changes))
  341. }
  342. change = changes[0]
  343. expectedPath = "/test2.txt"
  344. if change.Path != expectedPath {
  345. t.Fatalf("Expected path %s got %s", expectedPath, change.Path)
  346. }
  347. if change.Kind != archive.ChangeAdd {
  348. t.Fatalf("Change kind should be ChangeAdd got %s", change.Kind)
  349. }
  350. }
  351. func TestDiffSize(t *testing.T) {
  352. d := newDriver(t)
  353. defer os.RemoveAll(tmp)
  354. if err := d.Create("1", ""); err != nil {
  355. t.Fatal(err)
  356. }
  357. diffPath, err := d.Get("1")
  358. if err != nil {
  359. t.Fatal(err)
  360. }
  361. // Add a file to the diff path with a fixed size
  362. size := int64(1024)
  363. f, err := os.Create(path.Join(diffPath, "test_file"))
  364. if err != nil {
  365. t.Fatal(err)
  366. }
  367. f.Truncate(size)
  368. s, err := f.Stat()
  369. if err != nil {
  370. t.Fatal(err)
  371. }
  372. size = s.Size()
  373. if err := f.Close(); err != nil {
  374. t.Fatal(err)
  375. }
  376. diffSize, err := d.DiffSize("1")
  377. if err != nil {
  378. t.Fatal(err)
  379. }
  380. if diffSize != size {
  381. t.Fatalf("Expected size to be %d got %d", size, diffSize)
  382. }
  383. }
  384. func TestApplyDiff(t *testing.T) {
  385. d := newDriver(t)
  386. defer os.RemoveAll(tmp)
  387. defer d.Cleanup()
  388. if err := d.Create("1", ""); err != nil {
  389. t.Fatal(err)
  390. }
  391. diffPath, err := d.Get("1")
  392. if err != nil {
  393. t.Fatal(err)
  394. }
  395. // Add a file to the diff path with a fixed size
  396. size := int64(1024)
  397. f, err := os.Create(path.Join(diffPath, "test_file"))
  398. if err != nil {
  399. t.Fatal(err)
  400. }
  401. f.Truncate(size)
  402. f.Close()
  403. diff, err := d.Diff("1")
  404. if err != nil {
  405. t.Fatal(err)
  406. }
  407. if err := d.Create("2", ""); err != nil {
  408. t.Fatal(err)
  409. }
  410. if err := d.Create("3", "2"); err != nil {
  411. t.Fatal(err)
  412. }
  413. if err := d.ApplyDiff("3", diff); err != nil {
  414. t.Fatal(err)
  415. }
  416. // Ensure that the file is in the mount point for id 3
  417. mountPoint, err := d.Get("3")
  418. if err != nil {
  419. t.Fatal(err)
  420. }
  421. if _, err := os.Stat(path.Join(mountPoint, "test_file")); err != nil {
  422. t.Fatal(err)
  423. }
  424. }