Selaa lähdekoodia

Engine: fix a timeout bug in Sender/Receiver

Docker-DCO-1.1-Signed-off-by: Solomon Hykes <solomon@docker.com> (github: shykes)
Solomon Hykes 11 vuotta sitten
vanhempi
commit
dfdc03b061
2 muutettua tiedostoa jossa 74 lisäystä ja 1 poistoa
  1. 2 0
      engine/remote.go
  2. 72 1
      engine/remote_test.go

+ 2 - 0
engine/remote.go

@@ -90,6 +90,8 @@ func (rcv *Receiver) Run() error {
 			f.Close()
 			return err
 		}
+		f.Close()
+		defer peer.Close()
 		cmd := data.Message(p).Get("cmd")
 		job := rcv.Engine.Job(cmd[0], cmd[1:]...)
 		stdout, err := beam.SendRPipe(peer, data.Empty().Set("cmd", "log", "stdout").Bytes())

+ 72 - 1
engine/remote_test.go

@@ -1,3 +1,74 @@
 package engine
 
-import ()
+import (
+	"bytes"
+	"fmt"
+	"github.com/dotcloud/docker/pkg/beam"
+	"strings"
+	"testing"
+	"time"
+)
+
+func TestHelloWorld(t *testing.T) {
+	testRemote(t,
+
+		// Sender side
+		func(eng *Engine) {
+			job := eng.Job("echo", "hello", "world")
+			out := &bytes.Buffer{}
+			job.Stdout.Add(out)
+			job.Run()
+			if job.status != StatusOK {
+				t.Fatalf("#%v", job.StatusCode())
+			}
+			if out.String() != "hello world\n" {
+				t.Fatalf("%#v", out.String())
+			}
+		},
+
+		// Receiver side
+		func(eng *Engine) {
+			eng.Register("echo", func(job *Job) Status {
+				fmt.Fprintf(job.Stdout, "%s\n", strings.Join(job.Args, " "))
+				return StatusOK
+			})
+		},
+	)
+}
+
+func testRemote(t *testing.T, senderSide, receiverSide func(*Engine)) {
+	sndConn, rcvConn, err := beam.USocketPair()
+	if err != nil {
+		t.Fatal(err)
+	}
+	defer sndConn.Close()
+	defer rcvConn.Close()
+	sender := NewSender(sndConn)
+	receiver := NewReceiver(rcvConn)
+
+	// Setup the sender side
+	eng := New()
+	sender.Install(eng)
+
+	// Setup the receiver side
+	receiverSide(receiver.Engine)
+	go receiver.Run()
+
+	timeout(t, func() {
+		senderSide(eng)
+	})
+}
+
+func timeout(t *testing.T, f func()) {
+	onTimeout := time.After(100 * time.Millisecond)
+	onDone := make(chan bool)
+	go func() {
+		f()
+		close(onDone)
+	}()
+	select {
+	case <-onTimeout:
+		t.Fatalf("timeout")
+	case <-onDone:
+	}
+}