server_test.go 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214
  1. package docker
  2. import (
  3. "bytes"
  4. "testing"
  5. "time"
  6. "github.com/docker/docker/builder"
  7. "github.com/docker/docker/daemon"
  8. "github.com/docker/docker/engine"
  9. )
  10. func TestCreateNumberHostname(t *testing.T) {
  11. eng := NewTestEngine(t)
  12. defer mkDaemonFromEngine(eng, t).Nuke()
  13. config, _, _, err := parseRun([]string{"-h", "web.0", unitTestImageID, "echo test"})
  14. if err != nil {
  15. t.Fatal(err)
  16. }
  17. createTestContainer(eng, config, t)
  18. }
  19. func TestCommit(t *testing.T) {
  20. eng := NewTestEngine(t)
  21. b := &builder.BuilderJob{Engine: eng}
  22. b.Install()
  23. defer mkDaemonFromEngine(eng, t).Nuke()
  24. config, _, _, err := parseRun([]string{unitTestImageID, "/bin/cat"})
  25. if err != nil {
  26. t.Fatal(err)
  27. }
  28. id := createTestContainer(eng, config, t)
  29. job := eng.Job("commit", id)
  30. job.Setenv("repo", "testrepo")
  31. job.Setenv("tag", "testtag")
  32. job.SetenvJson("config", config)
  33. if err := job.Run(); err != nil {
  34. t.Fatal(err)
  35. }
  36. }
  37. func TestMergeConfigOnCommit(t *testing.T) {
  38. eng := NewTestEngine(t)
  39. b := &builder.BuilderJob{Engine: eng}
  40. b.Install()
  41. runtime := mkDaemonFromEngine(eng, t)
  42. defer runtime.Nuke()
  43. container1, _, _ := mkContainer(runtime, []string{"-e", "FOO=bar", unitTestImageID, "echo test > /tmp/foo"}, t)
  44. defer runtime.Rm(container1)
  45. config, _, _, err := parseRun([]string{container1.ID, "cat /tmp/foo"})
  46. if err != nil {
  47. t.Error(err)
  48. }
  49. job := eng.Job("commit", container1.ID)
  50. job.Setenv("repo", "testrepo")
  51. job.Setenv("tag", "testtag")
  52. job.SetenvJson("config", config)
  53. var outputBuffer = bytes.NewBuffer(nil)
  54. job.Stdout.Add(outputBuffer)
  55. if err := job.Run(); err != nil {
  56. t.Error(err)
  57. }
  58. container2, _, _ := mkContainer(runtime, []string{engine.Tail(outputBuffer, 1)}, t)
  59. defer runtime.Rm(container2)
  60. job = eng.Job("container_inspect", container1.Name)
  61. baseContainer, _ := job.Stdout.AddEnv()
  62. if err := job.Run(); err != nil {
  63. t.Error(err)
  64. }
  65. job = eng.Job("container_inspect", container2.Name)
  66. commitContainer, _ := job.Stdout.AddEnv()
  67. if err := job.Run(); err != nil {
  68. t.Error(err)
  69. }
  70. baseConfig := baseContainer.GetSubEnv("Config")
  71. commitConfig := commitContainer.GetSubEnv("Config")
  72. if commitConfig.Get("Env") != baseConfig.Get("Env") {
  73. t.Fatalf("Env config in committed container should be %v, was %v",
  74. baseConfig.Get("Env"), commitConfig.Get("Env"))
  75. }
  76. if baseConfig.Get("Cmd") != "[\"echo test \\u003e /tmp/foo\"]" {
  77. t.Fatalf("Cmd in base container should be [\"echo test \\u003e /tmp/foo\"], was %s",
  78. baseConfig.Get("Cmd"))
  79. }
  80. if commitConfig.Get("Cmd") != "[\"cat /tmp/foo\"]" {
  81. t.Fatalf("Cmd in committed container should be [\"cat /tmp/foo\"], was %s",
  82. commitConfig.Get("Cmd"))
  83. }
  84. }
  85. func TestRestartKillWait(t *testing.T) {
  86. eng := NewTestEngine(t)
  87. runtime := mkDaemonFromEngine(eng, t)
  88. defer runtime.Nuke()
  89. config, hostConfig, _, err := parseRun([]string{"-i", unitTestImageID, "/bin/cat"})
  90. if err != nil {
  91. t.Fatal(err)
  92. }
  93. id := createTestContainer(eng, config, t)
  94. containers, err := runtime.Containers(&daemon.ContainersConfig{All: true})
  95. if err != nil {
  96. t.Errorf("Error getting containers1: %q", err)
  97. }
  98. if len(containers) != 1 {
  99. t.Errorf("Expected 1 container, %v found", len(containers))
  100. }
  101. job := eng.Job("start", id)
  102. if err := job.ImportEnv(hostConfig); err != nil {
  103. t.Fatal(err)
  104. }
  105. if err := job.Run(); err != nil {
  106. t.Fatal(err)
  107. }
  108. if err := runtime.ContainerKill(id, 0); err != nil {
  109. t.Fatal(err)
  110. }
  111. eng = newTestEngine(t, false, runtime.Config().Root)
  112. runtime = mkDaemonFromEngine(eng, t)
  113. containers, err = runtime.Containers(&daemon.ContainersConfig{All: true})
  114. if err != nil {
  115. t.Errorf("Error getting containers1: %q", err)
  116. }
  117. if len(containers) != 1 {
  118. t.Errorf("Expected 1 container, %v found", len(containers))
  119. }
  120. setTimeout(t, "Waiting on stopped container timedout", 5*time.Second, func() {
  121. job = eng.Job("wait", containers[0].ID)
  122. if err := job.Run(); err != nil {
  123. t.Fatal(err)
  124. }
  125. })
  126. }
  127. func TestRunWithTooLowMemoryLimit(t *testing.T) {
  128. eng := NewTestEngine(t)
  129. defer mkDaemonFromEngine(eng, t).Nuke()
  130. // Try to create a container with a memory limit of 1 byte less than the minimum allowed limit.
  131. job := eng.Job("create")
  132. job.Setenv("Image", unitTestImageID)
  133. job.Setenv("Memory", "524287")
  134. job.Setenv("CpuShares", "1000")
  135. job.SetenvList("Cmd", []string{"/bin/cat"})
  136. if err := job.Run(); err == nil {
  137. t.Errorf("Memory limit is smaller than the allowed limit. Container creation should've failed!")
  138. }
  139. }
  140. func TestImagesFilter(t *testing.T) {
  141. eng := NewTestEngine(t)
  142. defer nuke(mkDaemonFromEngine(eng, t))
  143. if err := eng.Job("tag", unitTestImageName, "utest", "tag1").Run(); err != nil {
  144. t.Fatal(err)
  145. }
  146. if err := eng.Job("tag", unitTestImageName, "utest/docker", "tag2").Run(); err != nil {
  147. t.Fatal(err)
  148. }
  149. if err := eng.Job("tag", unitTestImageName, "utest:5000/docker", "tag3").Run(); err != nil {
  150. t.Fatal(err)
  151. }
  152. images := getImages(eng, t, false, "utest*/*")
  153. if len(images[0].RepoTags) != 2 {
  154. t.Fatal("incorrect number of matches returned")
  155. }
  156. images = getImages(eng, t, false, "utest")
  157. if len(images[0].RepoTags) != 1 {
  158. t.Fatal("incorrect number of matches returned")
  159. }
  160. images = getImages(eng, t, false, "utest*")
  161. if len(images[0].RepoTags) != 1 {
  162. t.Fatal("incorrect number of matches returned")
  163. }
  164. images = getImages(eng, t, false, "*5000*/*")
  165. if len(images[0].RepoTags) != 1 {
  166. t.Fatal("incorrect number of matches returned")
  167. }
  168. }