remote_test.go 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. package engine
  2. import (
  3. "bufio"
  4. "bytes"
  5. "fmt"
  6. "github.com/dotcloud/docker/pkg/beam"
  7. "strings"
  8. "testing"
  9. "time"
  10. )
  11. func TestHelloWorld(t *testing.T) {
  12. for i := 0; i < 10; i++ {
  13. testRemote(t,
  14. // Sender side
  15. func(eng *Engine) {
  16. job := eng.Job("echo", "hello", "world")
  17. out := &bytes.Buffer{}
  18. job.Stdout.Add(out)
  19. job.Run()
  20. if job.status != StatusOK {
  21. t.Fatalf("#%v", job.StatusCode())
  22. }
  23. lines := bufio.NewScanner(out)
  24. var i int
  25. for lines.Scan() {
  26. if lines.Text() != "hello world" {
  27. t.Fatalf("%#v", lines.Text())
  28. }
  29. i++
  30. }
  31. if i != 1000 {
  32. t.Fatalf("%#v", i)
  33. }
  34. },
  35. // Receiver side
  36. func(eng *Engine) {
  37. eng.Register("echo", func(job *Job) Status {
  38. // Simulate more output with a delay in the middle
  39. for i := 0; i < 500; i++ {
  40. fmt.Fprintf(job.Stdout, "%s\n", strings.Join(job.Args, " "))
  41. }
  42. time.Sleep(5 * time.Millisecond)
  43. for i := 0; i < 500; i++ {
  44. fmt.Fprintf(job.Stdout, "%s\n", strings.Join(job.Args, " "))
  45. }
  46. return StatusOK
  47. })
  48. },
  49. )
  50. }
  51. }
  52. // Helpers
  53. func testRemote(t *testing.T, senderSide, receiverSide func(*Engine)) {
  54. sndConn, rcvConn, err := beam.USocketPair()
  55. if err != nil {
  56. t.Fatal(err)
  57. }
  58. defer sndConn.Close()
  59. defer rcvConn.Close()
  60. sender := NewSender(sndConn)
  61. receiver := NewReceiver(rcvConn)
  62. // Setup the sender side
  63. eng := New()
  64. sender.Install(eng)
  65. // Setup the receiver side
  66. receiverSide(receiver.Engine)
  67. go receiver.Run()
  68. timeout(t, func() {
  69. senderSide(eng)
  70. })
  71. }
  72. func timeout(t *testing.T, f func()) {
  73. onTimeout := time.After(100 * time.Millisecond)
  74. onDone := make(chan bool)
  75. go func() {
  76. f()
  77. close(onDone)
  78. }()
  79. select {
  80. case <-onTimeout:
  81. t.Fatalf("timeout")
  82. case <-onDone:
  83. }
  84. }