crashTest.go 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. package main
  2. import (
  3. "fmt"
  4. "io"
  5. "log"
  6. "net"
  7. "os"
  8. "os/exec"
  9. "path"
  10. "time"
  11. )
  12. var DOCKERPATH = path.Join(os.Getenv("DOCKERPATH"), "docker")
  13. // WARNING: this crashTest will 1) crash your host, 2) remove all containers
  14. func runDaemon() (*exec.Cmd, error) {
  15. os.Remove("/var/run/docker.pid")
  16. exec.Command("rm", "-rf", "/var/lib/docker/containers").Run()
  17. cmd := exec.Command(DOCKERPATH, "-d")
  18. outPipe, err := cmd.StdoutPipe()
  19. if err != nil {
  20. return nil, err
  21. }
  22. errPipe, err := cmd.StderrPipe()
  23. if err != nil {
  24. return nil, err
  25. }
  26. if err := cmd.Start(); err != nil {
  27. return nil, err
  28. }
  29. go func() {
  30. io.Copy(os.Stdout, outPipe)
  31. }()
  32. go func() {
  33. io.Copy(os.Stderr, errPipe)
  34. }()
  35. return cmd, nil
  36. }
  37. func crashTest() error {
  38. if err := exec.Command("/bin/bash", "-c", "while true; do true; done").Start(); err != nil {
  39. return err
  40. }
  41. var endpoint string
  42. if ep := os.Getenv("TEST_ENDPOINT"); ep == "" {
  43. endpoint = "192.168.56.1:7979"
  44. } else {
  45. endpoint = ep
  46. }
  47. c := make(chan bool)
  48. var conn io.Writer
  49. go func() {
  50. conn, _ = net.Dial("tcp", endpoint)
  51. c <- false
  52. }()
  53. go func() {
  54. time.Sleep(2 * time.Second)
  55. c <- true
  56. }()
  57. <-c
  58. restartCount := 0
  59. totalTestCount := 1
  60. for {
  61. daemon, err := runDaemon()
  62. if err != nil {
  63. return err
  64. }
  65. restartCount++
  66. // time.Sleep(5000 * time.Millisecond)
  67. var stop bool
  68. go func() error {
  69. stop = false
  70. for i := 0; i < 100 && !stop; {
  71. func() error {
  72. cmd := exec.Command(DOCKERPATH, "run", "ubuntu", "echo", fmt.Sprintf("%d", totalTestCount))
  73. i++
  74. totalTestCount++
  75. outPipe, err := cmd.StdoutPipe()
  76. if err != nil {
  77. return err
  78. }
  79. inPipe, err := cmd.StdinPipe()
  80. if err != nil {
  81. return err
  82. }
  83. if err := cmd.Start(); err != nil {
  84. return err
  85. }
  86. if conn != nil {
  87. go io.Copy(conn, outPipe)
  88. }
  89. // Expecting error, do not check
  90. inPipe.Write([]byte("hello world!!!!!\n"))
  91. go inPipe.Write([]byte("hello world!!!!!\n"))
  92. go inPipe.Write([]byte("hello world!!!!!\n"))
  93. inPipe.Close()
  94. if err := cmd.Wait(); err != nil {
  95. return err
  96. }
  97. outPipe.Close()
  98. return nil
  99. }()
  100. }
  101. return nil
  102. }()
  103. time.Sleep(20 * time.Second)
  104. stop = true
  105. if err := daemon.Process.Kill(); err != nil {
  106. return err
  107. }
  108. }
  109. }
  110. func main() {
  111. if err := crashTest(); err != nil {
  112. log.Println(err)
  113. }
  114. }