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  }