github.com/axw/juju@v0.0.0-20161005053422-4bd6544d08d4/api/logsender/logsender_test.go (about)

     1  // Copyright 2015 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package logsender_test
     5  
     6  import (
     7  	"errors"
     8  	"net/url"
     9  
    10  	jc "github.com/juju/testing/checkers"
    11  	gc "gopkg.in/check.v1"
    12  
    13  	"github.com/juju/juju/api/base"
    14  	"github.com/juju/juju/api/logsender"
    15  	"github.com/juju/juju/apiserver/params"
    16  	coretesting "github.com/juju/juju/testing"
    17  	"github.com/juju/juju/version"
    18  )
    19  
    20  type LogSenderSuite struct {
    21  	coretesting.BaseSuite
    22  }
    23  
    24  var _ = gc.Suite(&LogSenderSuite{})
    25  
    26  func (s *LogSenderSuite) TestNewAPI(c *gc.C) {
    27  	conn := &mockConnector{
    28  		c: c,
    29  	}
    30  	a := logsender.NewAPI(conn)
    31  	w, err := a.LogWriter()
    32  	c.Assert(err, gc.IsNil)
    33  
    34  	msg := new(params.LogRecord)
    35  	err = w.WriteLog(msg)
    36  	c.Assert(err, gc.IsNil)
    37  
    38  	c.Assert(conn.written, gc.HasLen, 1)
    39  	c.Assert(conn.written[0], gc.Equals, msg)
    40  
    41  	err = w.Close()
    42  	c.Assert(err, gc.IsNil)
    43  	c.Assert(conn.closeCount, gc.Equals, 1)
    44  }
    45  
    46  func (s *LogSenderSuite) TestNewAPIWriteLogError(c *gc.C) {
    47  	conn := &mockConnector{
    48  		c:            c,
    49  		connectError: errors.New("foo"),
    50  	}
    51  	a := logsender.NewAPI(conn)
    52  	w, err := a.LogWriter()
    53  	c.Assert(err, gc.ErrorMatches, "cannot connect to /logsink: foo")
    54  	c.Assert(w, gc.Equals, nil)
    55  }
    56  
    57  func (s *LogSenderSuite) TestNewAPIWriteError(c *gc.C) {
    58  	conn := &mockConnector{
    59  		c:          c,
    60  		writeError: errors.New("foo"),
    61  	}
    62  	a := logsender.NewAPI(conn)
    63  	w, err := a.LogWriter()
    64  	c.Assert(err, gc.IsNil)
    65  
    66  	err = w.WriteLog(new(params.LogRecord))
    67  	c.Assert(err, gc.ErrorMatches, "cannot send log message: foo")
    68  	c.Assert(conn.written, gc.HasLen, 0)
    69  }
    70  
    71  type mockConnector struct {
    72  	c *gc.C
    73  
    74  	connectError error
    75  	writeError   error
    76  	written      []interface{}
    77  
    78  	closeCount int
    79  }
    80  
    81  func (c *mockConnector) ConnectStream(path string, values url.Values) (base.Stream, error) {
    82  	c.c.Assert(path, gc.Equals, "/logsink")
    83  	c.c.Assert(values, jc.DeepEquals, url.Values{
    84  		"jujuclientversion": []string{version.Current.String()},
    85  	})
    86  	if c.connectError != nil {
    87  		return nil, c.connectError
    88  	}
    89  	return mockStream{c}, nil
    90  }
    91  
    92  type mockStream struct {
    93  	conn *mockConnector
    94  }
    95  
    96  func (s mockStream) WriteJSON(v interface{}) error {
    97  	if s.conn.writeError != nil {
    98  		return s.conn.writeError
    99  	}
   100  	s.conn.written = append(s.conn.written, v)
   101  	return nil
   102  }
   103  
   104  func (s mockStream) ReadJSON(v interface{}) error {
   105  	s.conn.c.Errorf("ReadJSON called unexpectedly")
   106  	return nil
   107  }
   108  
   109  func (s mockStream) Read([]byte) (int, error) {
   110  	s.conn.c.Errorf("Read called unexpectedly")
   111  	return 0, nil
   112  }
   113  
   114  func (s mockStream) Write([]byte) (int, error) {
   115  	s.conn.c.Errorf("Write called unexpectedly")
   116  	return 0, nil
   117  }
   118  
   119  func (s mockStream) Close() error {
   120  	s.conn.closeCount++
   121  	return nil
   122  }