crashTest.go 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. package main
  2. import (
  3. "io"
  4. "log"
  5. "os"
  6. "os/exec"
  7. "time"
  8. )
  9. const DOCKER_PATH = "/home/creack/dotcloud/docker/docker/docker"
  10. func runDaemon() (*exec.Cmd, error) {
  11. cmd := exec.Command(DOCKER_PATH, "-d")
  12. outPipe, err := cmd.StdoutPipe()
  13. if err != nil {
  14. return nil, err
  15. }
  16. errPipe, err := cmd.StderrPipe()
  17. if err != nil {
  18. return nil, err
  19. }
  20. if err := cmd.Start(); err != nil {
  21. return nil, err
  22. }
  23. go func() {
  24. io.Copy(os.Stdout, outPipe)
  25. }()
  26. go func() {
  27. io.Copy(os.Stderr, errPipe)
  28. }()
  29. return cmd, nil
  30. }
  31. func crashTest() error {
  32. if err := exec.Command("/bin/bash", "-c", "while true; do true; done").Start(); err != nil {
  33. return err
  34. }
  35. for {
  36. daemon, err := runDaemon()
  37. if err != nil {
  38. return err
  39. }
  40. time.Sleep(5000 * time.Millisecond)
  41. go func() error {
  42. for i := 0; i < 100; i++ {
  43. go func() error {
  44. cmd := exec.Command(DOCKER_PATH, "run", "base", "echo", "hello", "world")
  45. log.Printf("%d", i)
  46. outPipe, err := cmd.StdoutPipe()
  47. if err != nil {
  48. return err
  49. }
  50. inPipe, err := cmd.StdinPipe()
  51. if err != nil {
  52. return err
  53. }
  54. if err := cmd.Start(); err != nil {
  55. return err
  56. }
  57. go func() {
  58. io.Copy(os.Stdout, outPipe)
  59. }()
  60. // Expecting error, do not check
  61. inPipe.Write([]byte("hello world!!!!!\n"))
  62. go inPipe.Write([]byte("hello world!!!!!\n"))
  63. go inPipe.Write([]byte("hello world!!!!!\n"))
  64. inPipe.Close()
  65. if err := cmd.Wait(); err != nil {
  66. return err
  67. }
  68. outPipe.Close()
  69. return nil
  70. }()
  71. time.Sleep(250 * time.Millisecond)
  72. }
  73. return nil
  74. }()
  75. time.Sleep(20 * time.Second)
  76. if err := daemon.Process.Kill(); err != nil {
  77. return err
  78. }
  79. }
  80. return nil
  81. }
  82. func main() {
  83. if err := crashTest(); err != nil {
  84. log.Println(err)
  85. }
  86. }