github.com/axw/juju@v0.0.0-20161005053422-4bd6544d08d4/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 }