server_test.go 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295
  1. package docker
  2. import (
  3. "bytes"
  4. "testing"
  5. "time"
  6. "github.com/docker/docker/engine"
  7. )
  8. func TestCreateNumberHostname(t *testing.T) {
  9. eng := NewTestEngine(t)
  10. defer mkDaemonFromEngine(eng, t).Nuke()
  11. config, _, _, err := parseRun([]string{"-h", "web.0", unitTestImageID, "echo test"})
  12. if err != nil {
  13. t.Fatal(err)
  14. }
  15. createTestContainer(eng, config, t)
  16. }
  17. func TestCommit(t *testing.T) {
  18. eng := NewTestEngine(t)
  19. defer mkDaemonFromEngine(eng, t).Nuke()
  20. config, _, _, err := parseRun([]string{unitTestImageID, "/bin/cat"})
  21. if err != nil {
  22. t.Fatal(err)
  23. }
  24. id := createTestContainer(eng, config, t)
  25. job := eng.Job("commit", id)
  26. job.Setenv("repo", "testrepo")
  27. job.Setenv("tag", "testtag")
  28. job.SetenvJson("config", config)
  29. if err := job.Run(); err != nil {
  30. t.Fatal(err)
  31. }
  32. }
  33. func TestMergeConfigOnCommit(t *testing.T) {
  34. eng := NewTestEngine(t)
  35. runtime := mkDaemonFromEngine(eng, t)
  36. defer runtime.Nuke()
  37. container1, _, _ := mkContainer(runtime, []string{"-e", "FOO=bar", unitTestImageID, "echo test > /tmp/foo"}, t)
  38. defer runtime.Destroy(container1)
  39. config, _, _, err := parseRun([]string{container1.ID, "cat /tmp/foo"})
  40. if err != nil {
  41. t.Error(err)
  42. }
  43. job := eng.Job("commit", container1.ID)
  44. job.Setenv("repo", "testrepo")
  45. job.Setenv("tag", "testtag")
  46. job.SetenvJson("config", config)
  47. var outputBuffer = bytes.NewBuffer(nil)
  48. job.Stdout.Add(outputBuffer)
  49. if err := job.Run(); err != nil {
  50. t.Error(err)
  51. }
  52. container2, _, _ := mkContainer(runtime, []string{engine.Tail(outputBuffer, 1)}, t)
  53. defer runtime.Destroy(container2)
  54. job = eng.Job("container_inspect", container1.Name)
  55. baseContainer, _ := job.Stdout.AddEnv()
  56. if err := job.Run(); err != nil {
  57. t.Error(err)
  58. }
  59. job = eng.Job("container_inspect", container2.Name)
  60. commitContainer, _ := job.Stdout.AddEnv()
  61. if err := job.Run(); err != nil {
  62. t.Error(err)
  63. }
  64. baseConfig := baseContainer.GetSubEnv("Config")
  65. commitConfig := commitContainer.GetSubEnv("Config")
  66. if commitConfig.Get("Env") != baseConfig.Get("Env") {
  67. t.Fatalf("Env config in committed container should be %v, was %v",
  68. baseConfig.Get("Env"), commitConfig.Get("Env"))
  69. }
  70. if baseConfig.Get("Cmd") != "[\"echo test \\u003e /tmp/foo\"]" {
  71. t.Fatalf("Cmd in base container should be [\"echo test \\u003e /tmp/foo\"], was %s",
  72. baseConfig.Get("Cmd"))
  73. }
  74. if commitConfig.Get("Cmd") != "[\"cat /tmp/foo\"]" {
  75. t.Fatalf("Cmd in committed container should be [\"cat /tmp/foo\"], was %s",
  76. commitConfig.Get("Cmd"))
  77. }
  78. }
  79. func TestRestartKillWait(t *testing.T) {
  80. eng := NewTestEngine(t)
  81. runtime := mkDaemonFromEngine(eng, t)
  82. defer runtime.Nuke()
  83. config, hostConfig, _, err := parseRun([]string{"-i", unitTestImageID, "/bin/cat"})
  84. if err != nil {
  85. t.Fatal(err)
  86. }
  87. id := createTestContainer(eng, config, t)
  88. job := eng.Job("containers")
  89. job.SetenvBool("all", true)
  90. outs, err := job.Stdout.AddListTable()
  91. if err != nil {
  92. t.Fatal(err)
  93. }
  94. if err := job.Run(); err != nil {
  95. t.Fatal(err)
  96. }
  97. if len(outs.Data) != 1 {
  98. t.Errorf("Expected 1 container, %v found", len(outs.Data))
  99. }
  100. job = eng.Job("start", id)
  101. if err := job.ImportEnv(hostConfig); err != nil {
  102. t.Fatal(err)
  103. }
  104. if err := job.Run(); err != nil {
  105. t.Fatal(err)
  106. }
  107. job = eng.Job("kill", id)
  108. if err := job.Run(); err != nil {
  109. t.Fatal(err)
  110. }
  111. eng = newTestEngine(t, false, runtime.Config().Root)
  112. job = eng.Job("containers")
  113. job.SetenvBool("all", true)
  114. outs, err = job.Stdout.AddListTable()
  115. if err != nil {
  116. t.Fatal(err)
  117. }
  118. if err := job.Run(); err != nil {
  119. t.Fatal(err)
  120. }
  121. if len(outs.Data) != 1 {
  122. t.Errorf("Expected 1 container, %v found", len(outs.Data))
  123. }
  124. setTimeout(t, "Waiting on stopped container timedout", 5*time.Second, func() {
  125. job = eng.Job("wait", outs.Data[0].Get("Id"))
  126. if err := job.Run(); err != nil {
  127. t.Fatal(err)
  128. }
  129. })
  130. }
  131. func TestCreateStartRestartStopStartKillRm(t *testing.T) {
  132. eng := NewTestEngine(t)
  133. defer mkDaemonFromEngine(eng, t).Nuke()
  134. config, hostConfig, _, err := parseRun([]string{"-i", unitTestImageID, "/bin/cat"})
  135. if err != nil {
  136. t.Fatal(err)
  137. }
  138. id := createTestContainer(eng, config, t)
  139. job := eng.Job("containers")
  140. job.SetenvBool("all", true)
  141. outs, err := job.Stdout.AddListTable()
  142. if err != nil {
  143. t.Fatal(err)
  144. }
  145. if err := job.Run(); err != nil {
  146. t.Fatal(err)
  147. }
  148. if len(outs.Data) != 1 {
  149. t.Errorf("Expected 1 container, %v found", len(outs.Data))
  150. }
  151. job = eng.Job("start", id)
  152. if err := job.ImportEnv(hostConfig); err != nil {
  153. t.Fatal(err)
  154. }
  155. if err := job.Run(); err != nil {
  156. t.Fatal(err)
  157. }
  158. job = eng.Job("restart", id)
  159. job.SetenvInt("t", 2)
  160. if err := job.Run(); err != nil {
  161. t.Fatal(err)
  162. }
  163. job = eng.Job("stop", id)
  164. job.SetenvInt("t", 2)
  165. if err := job.Run(); err != nil {
  166. t.Fatal(err)
  167. }
  168. job = eng.Job("start", id)
  169. if err := job.ImportEnv(hostConfig); err != nil {
  170. t.Fatal(err)
  171. }
  172. if err := job.Run(); err != nil {
  173. t.Fatal(err)
  174. }
  175. if err := eng.Job("kill", id).Run(); err != nil {
  176. t.Fatal(err)
  177. }
  178. // FIXME: this failed once with a race condition ("Unable to remove filesystem for xxx: directory not empty")
  179. job = eng.Job("rm", id)
  180. job.SetenvBool("removeVolume", true)
  181. if err := job.Run(); err != nil {
  182. t.Fatal(err)
  183. }
  184. job = eng.Job("containers")
  185. job.SetenvBool("all", true)
  186. outs, err = job.Stdout.AddListTable()
  187. if err != nil {
  188. t.Fatal(err)
  189. }
  190. if err := job.Run(); err != nil {
  191. t.Fatal(err)
  192. }
  193. if len(outs.Data) != 0 {
  194. t.Errorf("Expected 0 container, %v found", len(outs.Data))
  195. }
  196. }
  197. func TestRunWithTooLowMemoryLimit(t *testing.T) {
  198. eng := NewTestEngine(t)
  199. defer mkDaemonFromEngine(eng, t).Nuke()
  200. // Try to create a container with a memory limit of 1 byte less than the minimum allowed limit.
  201. job := eng.Job("create")
  202. job.Setenv("Image", unitTestImageID)
  203. job.Setenv("Memory", "524287")
  204. job.Setenv("CpuShares", "1000")
  205. job.SetenvList("Cmd", []string{"/bin/cat"})
  206. if err := job.Run(); err == nil {
  207. t.Errorf("Memory limit is smaller than the allowed limit. Container creation should've failed!")
  208. }
  209. }
  210. func TestImagesFilter(t *testing.T) {
  211. eng := NewTestEngine(t)
  212. defer nuke(mkDaemonFromEngine(eng, t))
  213. if err := eng.Job("tag", unitTestImageName, "utest", "tag1").Run(); err != nil {
  214. t.Fatal(err)
  215. }
  216. if err := eng.Job("tag", unitTestImageName, "utest/docker", "tag2").Run(); err != nil {
  217. t.Fatal(err)
  218. }
  219. if err := eng.Job("tag", unitTestImageName, "utest:5000/docker", "tag3").Run(); err != nil {
  220. t.Fatal(err)
  221. }
  222. images := getImages(eng, t, false, "utest*/*")
  223. if len(images.Data[0].GetList("RepoTags")) != 2 {
  224. t.Fatal("incorrect number of matches returned")
  225. }
  226. images = getImages(eng, t, false, "utest")
  227. if len(images.Data[0].GetList("RepoTags")) != 1 {
  228. t.Fatal("incorrect number of matches returned")
  229. }
  230. images = getImages(eng, t, false, "utest*")
  231. if len(images.Data[0].GetList("RepoTags")) != 1 {
  232. t.Fatal("incorrect number of matches returned")
  233. }
  234. images = getImages(eng, t, false, "*5000*/*")
  235. if len(images.Data[0].GetList("RepoTags")) != 1 {
  236. t.Fatal("incorrect number of matches returned")
  237. }
  238. }