From e7916505a37182ba14bda2f4dc4db1185ea2b4ce Mon Sep 17 00:00:00 2001 From: Michael Crosby Date: Thu, 26 Jun 2014 11:50:22 -0700 Subject: [PATCH] Add unit test for sync pipe Docker-DCO-1.1-Signed-off-by: Michael Crosby (github: crosbymichael) --- namespaces/sync_pipe.go | 10 ++++-- namespaces/sync_pipe_test.go | 63 ++++++++++++++++++++++++++++++++++++ 2 files changed, 71 insertions(+), 2 deletions(-) create mode 100644 namespaces/sync_pipe_test.go diff --git a/namespaces/sync_pipe.go b/namespaces/sync_pipe.go index 2160243e4..8a7c62215 100644 --- a/namespaces/sync_pipe.go +++ b/namespaces/sync_pipe.go @@ -24,6 +24,7 @@ func NewSyncPipe() (s *SyncPipe, err error) { if err != nil { return nil, err } + s.child = os.NewFile(uintptr(fds[0]), "child syncpipe") s.parent = os.NewFile(uintptr(fds[1]), "parent syncpipe") @@ -32,6 +33,7 @@ func NewSyncPipe() (s *SyncPipe, err error) { func NewSyncPipeFromFd(parendFd, childFd uintptr) (*SyncPipe, error) { s := &SyncPipe{} + if parendFd > 0 { s.parent = os.NewFile(parendFd, "parendPipe") } else if childFd > 0 { @@ -39,6 +41,7 @@ func NewSyncPipeFromFd(parendFd, childFd uintptr) (*SyncPipe, error) { } else { return nil, fmt.Errorf("no valid sync pipe fd specified") } + return s, nil } @@ -65,9 +68,11 @@ func (s *SyncPipe) ReadFromChild() error { if err != nil { return err } + if len(data) > 0 { - return fmt.Errorf("Child error: %s", string(data)) + return fmt.Errorf("%s", data) } + return nil } @@ -83,7 +88,6 @@ func (s *SyncPipe) ReadFromParent() (*network.NetworkState, error) { } } return networkState, nil - } func (s *SyncPipe) ReportChildError(err error) { @@ -95,9 +99,11 @@ func (s *SyncPipe) Close() error { if s.parent != nil { s.parent.Close() } + if s.child != nil { s.child.Close() } + return nil } diff --git a/namespaces/sync_pipe_test.go b/namespaces/sync_pipe_test.go new file mode 100644 index 000000000..79d7f5daa --- /dev/null +++ b/namespaces/sync_pipe_test.go @@ -0,0 +1,63 @@ +package namespaces + +import ( + "fmt" + "testing" +) + +func TestSendErrorFromChild(t *testing.T) { + pipe, err := NewSyncPipe() + if err != nil { + t.Fatal(err) + } + defer func() { + if err := pipe.Close(); err != nil { + t.Fatal(err) + } + }() + + expected := "something bad happened" + + pipe.ReportChildError(fmt.Errorf(expected)) + + childError := pipe.ReadFromChild() + if childError == nil { + t.Fatal("expected an error to be returned but did not receive anything") + } + + if childError.Error() != expected { + t.Fatalf("expected %q but received error message %q", expected, childError.Error()) + } +} + +func TestSendPayloadToChild(t *testing.T) { + pipe, err := NewSyncPipe() + if err != nil { + t.Fatal(err) + } + + defer func() { + if err := pipe.Close(); err != nil { + t.Fatal(err) + } + }() + + expected := "libcontainer" + + if err := pipe.SendToChild(map[string]string{"name": expected}); err != nil { + t.Fatal(err) + } + + payload, err := pipe.ReadFromParent() + if err != nil { + t.Fatal(err) + } + + if len(payload) != 1 { + t.Fatalf("expected to only have one value in the payload but received %d", len(payload)) + } + + if name := payload["name"]; name != expected { + t.Fatalf("expected name %q but received %q", expected, name) + } +}