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 }