github.com/cloud-green/juju@v0.0.0-20151002100041-a00291338d3d/worker/uniter/runlistener_test.go (about) 1 // Copyright 2012, 2013 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package uniter_test 5 6 import ( 7 "path/filepath" 8 "runtime" 9 10 jc "github.com/juju/testing/checkers" 11 "github.com/juju/utils/exec" 12 gc "gopkg.in/check.v1" 13 14 "github.com/juju/juju/juju/sockets" 15 "github.com/juju/juju/testing" 16 "github.com/juju/juju/worker/uniter" 17 ) 18 19 type ListenerSuite struct { 20 testing.BaseSuite 21 socketPath string 22 } 23 24 var _ = gc.Suite(&ListenerSuite{}) 25 26 func sockPath(c *gc.C) string { 27 sockPath := filepath.Join(c.MkDir(), "test.listener") 28 if runtime.GOOS == "windows" { 29 return `\\.\pipe` + sockPath[2:] 30 } 31 return sockPath 32 } 33 34 func (s *ListenerSuite) SetUpTest(c *gc.C) { 35 s.BaseSuite.SetUpTest(c) 36 s.socketPath = sockPath(c) 37 } 38 39 // Mirror the params to uniter.NewRunListener, but add cleanup to close it. 40 func (s *ListenerSuite) NewRunListener(c *gc.C) *uniter.RunListener { 41 listener, err := uniter.NewRunListener(&mockRunner{c}, s.socketPath) 42 c.Assert(err, jc.ErrorIsNil) 43 c.Assert(listener, gc.NotNil) 44 s.AddCleanup(func(*gc.C) { 45 c.Assert(listener.Close(), jc.ErrorIsNil) 46 }) 47 return listener 48 } 49 50 func (s *ListenerSuite) TestNewRunListenerOnExistingSocketRemovesItAndSucceeds(c *gc.C) { 51 if runtime.GOOS == "windows" { 52 c.Skip("bug 1403084: Current named pipes implementation does not support this") 53 } 54 s.NewRunListener(c) 55 56 listener, err := uniter.NewRunListener(&mockRunner{}, s.socketPath) 57 c.Assert(err, jc.ErrorIsNil) 58 c.Assert(listener, gc.NotNil) 59 c.Assert(listener.Close(), jc.ErrorIsNil) 60 } 61 62 func (s *ListenerSuite) TestClientCall(c *gc.C) { 63 s.NewRunListener(c) 64 65 client, err := sockets.Dial(s.socketPath) 66 c.Assert(err, jc.ErrorIsNil) 67 defer client.Close() 68 69 var result exec.ExecResponse 70 args := uniter.RunCommandsArgs{ 71 Commands: "some-command", 72 RelationId: -1, 73 RemoteUnitName: "", 74 ForceRemoteUnit: false, 75 } 76 err = client.Call(uniter.JujuRunEndpoint, args, &result) 77 c.Assert(err, jc.ErrorIsNil) 78 79 c.Assert(string(result.Stdout), gc.Equals, "some-command stdout") 80 c.Assert(string(result.Stderr), gc.Equals, "some-command stderr") 81 c.Assert(result.Code, gc.Equals, 42) 82 } 83 84 type mockRunner struct { 85 c *gc.C 86 } 87 88 var _ uniter.CommandRunner = (*mockRunner)(nil) 89 90 func (r *mockRunner) RunCommands(args uniter.RunCommandsArgs) (results *exec.ExecResponse, err error) { 91 r.c.Log("mock runner: " + args.Commands) 92 return &exec.ExecResponse{ 93 Code: 42, 94 Stdout: []byte(args.Commands + " stdout"), 95 Stderr: []byte(args.Commands + " stderr"), 96 }, nil 97 }