container_test.go 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328
  1. package docker
  2. import (
  3. "fmt"
  4. "testing"
  5. "time"
  6. )
  7. func TestStart(t *testing.T) {
  8. docker, err := newTestDocker()
  9. if err != nil {
  10. t.Fatal(err)
  11. }
  12. container, err := docker.Create(
  13. "start_test",
  14. "ls",
  15. []string{"-al"},
  16. []string{"/var/lib/docker/images/ubuntu"},
  17. &Config{
  18. Ram: 33554432,
  19. },
  20. )
  21. if err != nil {
  22. t.Fatal(err)
  23. }
  24. defer docker.Destroy(container)
  25. if container.State.Running {
  26. t.Errorf("Container shouldn't be running")
  27. }
  28. if err := container.Start(); err != nil {
  29. t.Fatal(err)
  30. }
  31. container.Wait()
  32. if container.State.Running {
  33. t.Errorf("Container shouldn't be running")
  34. }
  35. // We should be able to call Wait again
  36. container.Wait()
  37. if container.State.Running {
  38. t.Errorf("Container shouldn't be running")
  39. }
  40. }
  41. func TestRun(t *testing.T) {
  42. docker, err := newTestDocker()
  43. if err != nil {
  44. t.Fatal(err)
  45. }
  46. container, err := docker.Create(
  47. "run_test",
  48. "ls",
  49. []string{"-al"},
  50. []string{"/var/lib/docker/images/ubuntu"},
  51. &Config{
  52. Ram: 33554432,
  53. },
  54. )
  55. if err != nil {
  56. t.Fatal(err)
  57. }
  58. defer docker.Destroy(container)
  59. if container.State.Running {
  60. t.Errorf("Container shouldn't be running")
  61. }
  62. if err := container.Run(); err != nil {
  63. t.Fatal(err)
  64. }
  65. if container.State.Running {
  66. t.Errorf("Container shouldn't be running")
  67. }
  68. }
  69. func TestOutput(t *testing.T) {
  70. docker, err := newTestDocker()
  71. if err != nil {
  72. t.Fatal(err)
  73. }
  74. container, err := docker.Create(
  75. "output_test",
  76. "echo",
  77. []string{"-n", "foobar"},
  78. []string{"/var/lib/docker/images/ubuntu"},
  79. &Config{},
  80. )
  81. if err != nil {
  82. t.Fatal(err)
  83. }
  84. defer docker.Destroy(container)
  85. pipe, err := container.StdoutPipe()
  86. defer pipe.Close()
  87. output, err := container.Output()
  88. if err != nil {
  89. t.Fatal(err)
  90. }
  91. if string(output) != "foobar" {
  92. t.Error(string(output))
  93. }
  94. }
  95. func TestKill(t *testing.T) {
  96. docker, err := newTestDocker()
  97. if err != nil {
  98. t.Fatal(err)
  99. }
  100. container, err := docker.Create(
  101. "stop_test",
  102. "cat",
  103. []string{"/dev/zero"},
  104. []string{"/var/lib/docker/images/ubuntu"},
  105. &Config{},
  106. )
  107. if err != nil {
  108. t.Fatal(err)
  109. }
  110. defer docker.Destroy(container)
  111. if container.State.Running {
  112. t.Errorf("Container shouldn't be running")
  113. }
  114. if err := container.Start(); err != nil {
  115. t.Fatal(err)
  116. }
  117. if !container.State.Running {
  118. t.Errorf("Container should be running")
  119. }
  120. if err := container.Kill(); err != nil {
  121. t.Fatal(err)
  122. }
  123. if container.State.Running {
  124. t.Errorf("Container shouldn't be running")
  125. }
  126. container.Wait()
  127. if container.State.Running {
  128. t.Errorf("Container shouldn't be running")
  129. }
  130. // Try stopping twice
  131. if err := container.Kill(); err != nil {
  132. t.Fatal(err)
  133. }
  134. }
  135. func TestExitCode(t *testing.T) {
  136. docker, err := newTestDocker()
  137. if err != nil {
  138. t.Fatal(err)
  139. }
  140. trueContainer, err := docker.Create(
  141. "exit_test_1",
  142. "/bin/true",
  143. []string{""},
  144. []string{"/var/lib/docker/images/ubuntu"},
  145. &Config{},
  146. )
  147. if err != nil {
  148. t.Fatal(err)
  149. }
  150. defer docker.Destroy(trueContainer)
  151. if err := trueContainer.Run(); err != nil {
  152. t.Fatal(err)
  153. }
  154. falseContainer, err := docker.Create(
  155. "exit_test_2",
  156. "/bin/false",
  157. []string{""},
  158. []string{"/var/lib/docker/images/ubuntu"},
  159. &Config{},
  160. )
  161. if err != nil {
  162. t.Fatal(err)
  163. }
  164. defer docker.Destroy(falseContainer)
  165. if err := falseContainer.Run(); err != nil {
  166. t.Fatal(err)
  167. }
  168. if trueContainer.State.ExitCode != 0 {
  169. t.Errorf("Unexpected exit code %v", trueContainer.State.ExitCode)
  170. }
  171. if falseContainer.State.ExitCode != 1 {
  172. t.Errorf("Unexpected exit code %v", falseContainer.State.ExitCode)
  173. }
  174. }
  175. func TestMultipleContainers(t *testing.T) {
  176. docker, err := newTestDocker()
  177. if err != nil {
  178. t.Fatal(err)
  179. }
  180. container1, err := docker.Create(
  181. "container1",
  182. "cat",
  183. []string{"/dev/zero"},
  184. []string{"/var/lib/docker/images/ubuntu"},
  185. &Config{},
  186. )
  187. if err != nil {
  188. t.Fatal(err)
  189. }
  190. defer docker.Destroy(container1)
  191. container2, err := docker.Create(
  192. "container2",
  193. "cat",
  194. []string{"/dev/zero"},
  195. []string{"/var/lib/docker/images/ubuntu"},
  196. &Config{},
  197. )
  198. if err != nil {
  199. t.Fatal(err)
  200. }
  201. defer docker.Destroy(container2)
  202. // Start both containers
  203. if err := container1.Start(); err != nil {
  204. t.Fatal(err)
  205. }
  206. if err := container2.Start(); err != nil {
  207. t.Fatal(err)
  208. }
  209. // If we are here, both containers should be running
  210. if !container1.State.Running {
  211. t.Fatal("Container not running")
  212. }
  213. if !container2.State.Running {
  214. t.Fatal("Container not running")
  215. }
  216. // Kill them
  217. if err := container1.Kill(); err != nil {
  218. t.Fatal(err)
  219. }
  220. if err := container2.Kill(); err != nil {
  221. t.Fatal(err)
  222. }
  223. }
  224. func BenchmarkRunSequencial(b *testing.B) {
  225. docker, err := newTestDocker()
  226. if err != nil {
  227. b.Fatal(err)
  228. }
  229. for i := 0; i < b.N; i++ {
  230. container, err := docker.Create(
  231. fmt.Sprintf("bench_%v", i),
  232. "echo",
  233. []string{"-n", "foo"},
  234. []string{"/var/lib/docker/images/ubuntu"},
  235. &Config{},
  236. )
  237. if err != nil {
  238. b.Fatal(err)
  239. }
  240. defer docker.Destroy(container)
  241. output, err := container.Output()
  242. if err != nil {
  243. b.Fatal(err)
  244. }
  245. if string(output) != "foo" {
  246. b.Fatalf("Unexecpted output: %v", string(output))
  247. }
  248. if err := docker.Destroy(container); err != nil {
  249. b.Fatal(err)
  250. }
  251. }
  252. }
  253. func BenchmarkRunParallel(b *testing.B) {
  254. docker, err := newTestDocker()
  255. if err != nil {
  256. b.Fatal(err)
  257. }
  258. var tasks []chan error
  259. for i := 0; i < b.N; i++ {
  260. complete := make(chan error)
  261. tasks = append(tasks, complete)
  262. go func(i int, complete chan error) {
  263. container, err := docker.Create(
  264. fmt.Sprintf("bench_%v", i),
  265. "echo",
  266. []string{"-n", "foo"},
  267. []string{"/var/lib/docker/images/ubuntu"},
  268. &Config{},
  269. )
  270. if err != nil {
  271. complete <- err
  272. return
  273. }
  274. defer docker.Destroy(container)
  275. if err := container.Start(); err != nil {
  276. complete <- err
  277. return
  278. }
  279. if err := container.WaitTimeout(15 * time.Second); err != nil {
  280. complete <- err
  281. return
  282. }
  283. // if string(output) != "foo" {
  284. // complete <- fmt.Errorf("Unexecpted output: %v", string(output))
  285. // }
  286. if err := docker.Destroy(container); err != nil {
  287. complete <- err
  288. return
  289. }
  290. complete <- nil
  291. }(i, complete)
  292. }
  293. var errors []error
  294. for _, task := range tasks {
  295. err := <-task
  296. if err != nil {
  297. errors = append(errors, err)
  298. }
  299. }
  300. if len(errors) > 0 {
  301. b.Fatal(errors)
  302. }
  303. }