github.com/rogpeppe/juju@v0.0.0-20140613142852-6337964b789e/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  	"net/rpc"
     8  	"path/filepath"
     9  
    10  	"github.com/juju/utils/exec"
    11  	gc "launchpad.net/gocheck"
    12  
    13  	"github.com/juju/juju/testing"
    14  	"github.com/juju/juju/worker/uniter"
    15  )
    16  
    17  type ListenerSuite struct {
    18  	testing.BaseSuite
    19  	socketPath string
    20  }
    21  
    22  var _ = gc.Suite(&ListenerSuite{})
    23  
    24  // Mirror the params to uniter.NewRunListener, but add cleanup to close it.
    25  func (s *ListenerSuite) NewRunListener(c *gc.C) *uniter.RunListener {
    26  	s.socketPath = filepath.Join(c.MkDir(), "test.listener")
    27  	listener, err := uniter.NewRunListener(&mockRunner{c}, s.socketPath)
    28  	c.Assert(err, gc.IsNil)
    29  	c.Assert(listener, gc.NotNil)
    30  	s.AddCleanup(func(*gc.C) {
    31  		listener.Close()
    32  	})
    33  	return listener
    34  }
    35  
    36  func (s *ListenerSuite) TestNewRunListenerOnExistingSocketRemovesItAndSucceeds(c *gc.C) {
    37  	s.NewRunListener(c)
    38  
    39  	listener, err := uniter.NewRunListener(&mockRunner{}, s.socketPath)
    40  	c.Assert(err, gc.IsNil)
    41  	c.Assert(listener, gc.NotNil)
    42  	listener.Close()
    43  }
    44  
    45  func (s *ListenerSuite) TestClientCall(c *gc.C) {
    46  	s.NewRunListener(c)
    47  
    48  	client, err := rpc.Dial("unix", s.socketPath)
    49  	c.Assert(err, gc.IsNil)
    50  	defer client.Close()
    51  
    52  	var result exec.ExecResponse
    53  	err = client.Call(uniter.JujuRunEndpoint, "some-command", &result)
    54  	c.Assert(err, gc.IsNil)
    55  
    56  	c.Assert(string(result.Stdout), gc.Equals, "some-command stdout")
    57  	c.Assert(string(result.Stderr), gc.Equals, "some-command stderr")
    58  	c.Assert(result.Code, gc.Equals, 42)
    59  }
    60  
    61  type mockRunner struct {
    62  	c *gc.C
    63  }
    64  
    65  var _ uniter.CommandRunner = (*mockRunner)(nil)
    66  
    67  func (r *mockRunner) RunCommands(commands string) (results *exec.ExecResponse, err error) {
    68  	r.c.Log("mock runner: " + commands)
    69  	return &exec.ExecResponse{
    70  		Code:   42,
    71  		Stdout: []byte(commands + " stdout"),
    72  		Stderr: []byte(commands + " stderr"),
    73  	}, nil
    74  }