1
// Copyright 2016 Canonical Ltd.
2
// Licensed under the AGPLv3, see LICENCE file for details.
11
"github.com/juju/loggo"
12
"github.com/juju/rfc/rfc5424"
13
"github.com/juju/rfc/rfc5424/sdelements"
14
"github.com/juju/testing"
15
jc "github.com/juju/testing/checkers"
16
"github.com/juju/version"
17
gc "gopkg.in/check.v1"
18
"gopkg.in/juju/names.v2"
20
"github.com/juju/juju/logfwd"
21
"github.com/juju/juju/logfwd/syslog"
22
coretesting "github.com/juju/juju/testing"
25
type ClientSuite struct {
26
testing.IsolationSuite
32
var _ = gc.Suite(&ClientSuite{})
34
func (s *ClientSuite) SetUpTest(c *gc.C) {
35
s.IsolationSuite.SetUpTest(c)
37
s.stub = &testing.Stub{}
38
s.sender = &stubSender{stub: s.stub}
41
func (s *ClientSuite) TestOpen(c *gc.C) {
42
cfg := syslog.RawConfig{
45
CACert: coretesting.CACert,
46
ClientCert: coretesting.ServerCert,
47
ClientKey: coretesting.ServerKey,
49
senderOpener := &stubSenderOpener{
54
client, err := syslog.OpenForSender(cfg, senderOpener)
55
c.Assert(err, jc.ErrorIsNil)
57
s.stub.CheckCallNames(c, "DialFunc", "Open")
59
clientCert, err := tls.X509KeyPair([]byte(coretesting.ServerCert), []byte(coretesting.ServerKey))
60
c.Assert(err, jc.ErrorIsNil)
61
rootCAs := x509.NewCertPool()
62
rootCAs.AddCert(coretesting.CACertX509)
63
tlsConfig := &tls.Config{
64
Certificates: []tls.Certificate{clientCert},
68
s.stub.CheckCall(c, 0, "DialFunc", tlsConfig, time.Duration(0))
69
c.Check(client.Sender, gc.Equals, s.sender)
72
func (s *ClientSuite) TestClose(c *gc.C) {
73
client := syslog.Client{Sender: s.sender}
76
c.Assert(err, jc.ErrorIsNil)
78
s.stub.CheckCallNames(c, "Close")
81
func (s *ClientSuite) TestSendLogFull(c *gc.C) {
82
tag := names.NewMachineTag("99")
83
cID := "9f484882-2f18-4fd2-967d-db9663db7bea"
84
mID := "deadbeef-2f18-4fd2-967d-db9663db7bea"
85
ver := version.MustParse("1.2.3")
86
ts := time.Unix(12345, 0)
88
Origin: logfwd.OriginForMachineAgent(tag, cID, mID, ver),
89
Timestamp: time.Unix(12345, 0),
91
Location: logfwd.SourceLocation{
93
Filename: "x/y/spam.go",
96
Message: "(╯°□°)╯︵ ┻━┻",
98
client := syslog.Client{Sender: s.sender}
100
err := client.Send([]logfwd.Record{rec})
101
c.Assert(err, jc.ErrorIsNil)
103
s.stub.CheckCallNames(c, "Send")
104
s.stub.CheckCall(c, 0, "Send", rfc5424.Message{
105
Header: rfc5424.Header{
106
Priority: rfc5424.Priority{
107
Severity: rfc5424.SeverityError,
108
Facility: rfc5424.FacilityUser,
110
Timestamp: rfc5424.Timestamp{ts},
111
Hostname: rfc5424.Hostname{
112
FQDN: "machine-99.deadbeef-2f18-4fd2-967d-db9663db7bea",
114
AppName: "jujud-machine-agent-deadbeef-2f18-4fd2-967d-db96",
116
StructuredData: rfc5424.StructuredData{
118
EnterpriseID: sdelements.OriginEnterpriseID{
121
SoftwareName: "jujud-machine-agent",
122
SoftwareVersion: ver,
127
Data: []rfc5424.StructuredDataParam{{
128
Name: "controller-uuid",
129
Value: "9f484882-2f18-4fd2-967d-db9663db7bea",
132
Value: "deadbeef-2f18-4fd2-967d-db9663db7bea",
138
Data: []rfc5424.StructuredDataParam{{
143
Value: "x/y/spam.go:42",
151
func (s *ClientSuite) TestSendLogLevels(c *gc.C) {
152
tag := names.NewMachineTag("99")
153
cID := "9f484882-2f18-4fd2-967d-db9663db7bea"
154
mID := "deadbeef-2f18-4fd2-967d-db9663db7bea"
155
ver := version.MustParse("1.2.3")
156
rec := logfwd.Record{
157
Origin: logfwd.OriginForMachineAgent(tag, cID, mID, ver),
158
Timestamp: time.Unix(12345, 0),
160
Location: logfwd.SourceLocation{
162
Filename: "x/y/spam.go",
165
Message: "(╯°□°)╯︵ ┻━┻",
167
client := syslog.Client{Sender: s.sender}
169
levels := map[loggo.Level]rfc5424.Severity{
170
loggo.ERROR: rfc5424.SeverityError,
171
loggo.WARNING: rfc5424.SeverityWarning,
172
loggo.INFO: rfc5424.SeverityInformational,
173
loggo.DEBUG: rfc5424.SeverityDebug,
174
loggo.TRACE: rfc5424.SeverityDebug,
176
for level, expected := range levels {
177
c.Logf("trying %s -> %s", level, expected)
181
err := client.Send([]logfwd.Record{rec})
182
c.Assert(err, jc.ErrorIsNil)
184
msg := s.stub.Calls()[0].Args[0].(rfc5424.Message)
185
c.Check(msg.Severity, gc.Equals, expected)
189
type stubSenderOpener struct {
192
ReturnDialFunc rfc5424.DialFunc
193
ReturnOpen syslog.Sender
196
func (s *stubSenderOpener) DialFunc(cfg *tls.Config, timeout time.Duration) (rfc5424.DialFunc, error) {
197
s.stub.AddCall("DialFunc", cfg, timeout)
198
if err := s.stub.NextErr(); err != nil {
202
dial := s.ReturnDialFunc
204
dial = func(network, address string) (rfc5424.Conn, error) {
205
s.stub.AddCall("dial", network, address)
206
if err := s.stub.NextErr(); err != nil {
216
func (s *stubSenderOpener) Open(host string, cfg rfc5424.ClientConfig, dial rfc5424.DialFunc) (syslog.Sender, error) {
217
s.stub.AddCall("Open", host, cfg, dial)
218
if err := s.stub.NextErr(); err != nil {
222
return s.ReturnOpen, nil
225
type stubSender struct {
229
func (s *stubSender) Send(msg rfc5424.Message) error {
230
s.stub.AddCall("Send", msg)
231
if err := s.stub.NextErr(); err != nil {
238
func (s *stubSender) Close() error {
239
s.stub.AddCall("Close")
240
if err := s.stub.NextErr(); err != nil {