github.com/wallyworld/juju@v0.0.0-20161013125918-6cf1bc9d917a/state/internal/audit/audit_test.go (about)

     1  // Copyright 2016 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package audit_test
     5  
     6  import (
     7  	"github.com/juju/errors"
     8  	"github.com/juju/testing"
     9  	jc "github.com/juju/testing/checkers"
    10  	"github.com/juju/utils"
    11  	"github.com/juju/version"
    12  	gc "gopkg.in/check.v1"
    13  	"gopkg.in/mgo.v2/bson"
    14  
    15  	"github.com/juju/juju/audit"
    16  	mongoutils "github.com/juju/juju/mongo/utils"
    17  	stateaudit "github.com/juju/juju/state/internal/audit"
    18  	coretesting "github.com/juju/juju/testing"
    19  )
    20  
    21  type AuditSuite struct {
    22  	testing.IsolationSuite
    23  }
    24  
    25  var _ = gc.Suite(&AuditSuite{})
    26  
    27  func (*AuditSuite) TestPutAuditEntry_PersistAuditEntry(c *gc.C) {
    28  
    29  	requested := audit.AuditEntry{
    30  		JujuServerVersion: version.MustParse("1.0.0"),
    31  		ModelUUID:         utils.MustNewUUID().String(),
    32  		Timestamp:         coretesting.NonZeroTime().UTC(),
    33  		RemoteAddress:     "8.8.8.8",
    34  		OriginType:        "user",
    35  		OriginName:        "bob",
    36  		Operation:         "status",
    37  		Data: map[string]interface{}{
    38  			"a": "b",
    39  			"$a.b": map[string]interface{}{
    40  				"b.$a": "c",
    41  			},
    42  		},
    43  	}
    44  
    45  	var insertDocsCalled bool
    46  	insertDocs := func(collectionName string, docs ...interface{}) error {
    47  		insertDocsCalled = true
    48  		c.Check(collectionName, gc.Equals, "audit.log")
    49  		c.Assert(docs, gc.HasLen, 1)
    50  
    51  		serializedAuditDoc, err := bson.Marshal(docs[0])
    52  		c.Assert(err, jc.ErrorIsNil)
    53  
    54  		requestedTimeBlob, err := requested.Timestamp.MarshalText()
    55  		c.Assert(err, jc.ErrorIsNil)
    56  
    57  		c.Check(string(serializedAuditDoc), jc.BSONEquals, map[string]interface{}{
    58  			"juju-server-version": requested.JujuServerVersion,
    59  			"model-uuid":          requested.ModelUUID,
    60  			"timestamp":           string(requestedTimeBlob),
    61  			"remote-address":      "8.8.8.8",
    62  			"origin-type":         requested.OriginType,
    63  			"origin-name":         requested.OriginName,
    64  			"operation":           requested.Operation,
    65  			"data":                mongoutils.EscapeKeys(requested.Data),
    66  		})
    67  
    68  		return nil
    69  	}
    70  
    71  	putAuditEntry := stateaudit.PutAuditEntryFn("audit.log", insertDocs)
    72  	err := putAuditEntry(requested)
    73  	c.Assert(err, jc.ErrorIsNil)
    74  
    75  	c.Assert(insertDocsCalled, jc.IsTrue)
    76  }
    77  
    78  func (*AuditSuite) TestPutAuditEntry_PropagatesWriteError(c *gc.C) {
    79  	const errMsg = "my error"
    80  	insertDocs := func(string, ...interface{}) error {
    81  		return errors.New(errMsg)
    82  	}
    83  	putAuditEntry := stateaudit.PutAuditEntryFn("audit.log", insertDocs)
    84  
    85  	uuid, err := utils.NewUUID()
    86  	c.Assert(err, jc.ErrorIsNil)
    87  
    88  	auditEntry := audit.AuditEntry{
    89  		JujuServerVersion: version.MustParse("1.0.0"),
    90  		ModelUUID:         uuid.String(),
    91  		Timestamp:         coretesting.NonZeroTime().UTC(),
    92  		RemoteAddress:     "8.8.8.8",
    93  		OriginType:        "user",
    94  		OriginName:        "bob",
    95  		Operation:         "status",
    96  	}
    97  	c.Assert(auditEntry.Validate(), jc.ErrorIsNil)
    98  
    99  	err = putAuditEntry(auditEntry)
   100  	c.Check(err, gc.ErrorMatches, errMsg)
   101  }
   102  
   103  func (*AuditSuite) TestPutAuditEntry_ValidateAuditEntry(c *gc.C) {
   104  	var auditEntry audit.AuditEntry
   105  
   106  	// Don't care what the error is; just that it's not valid.
   107  	validationErr := auditEntry.Validate()
   108  	c.Assert(validationErr, gc.NotNil)
   109  
   110  	putAuditEntry := stateaudit.PutAuditEntryFn("", nil)
   111  	err := putAuditEntry(auditEntry)
   112  	c.Check(err, gc.ErrorMatches, validationErr.Error())
   113  }