github.com/cloudfoundry-attic/ltc@v0.0.0-20151123212628-098adc7919fc/logs/console_tailed_logs_outputter/chug/chug_log_message_test.go (about) 1 package chug_test 2 3 import ( 4 "strconv" 5 "time" 6 7 . "github.com/onsi/ginkgo" 8 . "github.com/onsi/gomega" 9 10 "github.com/cloudfoundry-incubator/ltc/logs/console_tailed_logs_outputter/chug" 11 "github.com/cloudfoundry/sonde-go/events" 12 "github.com/pivotal-golang/lager" 13 ) 14 15 var _ = Describe("ChugLogMessage", func() { 16 var ( 17 entry chug.Entry 18 input []byte 19 ) 20 21 buildLogMessage := func(sourceType, sourceInstance string, timestamp time.Time, message []byte) *events.LogMessage { 22 unixTime := timestamp.UnixNano() 23 return &events.LogMessage{ 24 Message: message, 25 Timestamp: &unixTime, 26 SourceType: &sourceType, 27 SourceInstance: &sourceInstance, 28 } 29 } 30 31 verifyEntryIsRaw := func() { 32 Expect(entry.IsLager).To(BeFalse()) 33 Expect(entry.Log).To(BeZero()) 34 Expect(entry.Raw).To(Equal(input)) 35 } 36 37 Context("when the message has lager to chug", func() { 38 It("chugs a lager message", func() { 39 input = []byte(`{"timestamp":"1429296198.620077372","source":"rep","message":"rep.event-consumer.operation-stream.executing-container-operation.succeeded-fetch-container","log_level":1,"data":{"container-guid":"app-9eb203ad-72f3-4f26-6424-48f20dc12298","session":"7.1.10","trace":"trace-me-now"}}`) 40 logMessage := buildLogMessage("", "", time.Time{}, input) 41 42 entry := chug.ChugLogMessage(logMessage) 43 44 Expect(entry).ToNot(BeNil()) 45 Expect(entry.LogMessage).To(Equal(logMessage)) 46 Expect(entry.Raw).To(Equal(input)) 47 Expect(entry.IsLager).To(BeTrue()) 48 }) 49 50 It("chugs a lager message prepended by junk", func() { 51 input = []byte(`JUNK JUNK JUNK {"timestamp":"1429296198.620077372","source":"rep","message":"rep.event-consumer.operation-stream.executing-container-operation.succeeded-fetch-container","log_level":1,"data":{"container-guid":"app-9eb203ad-72f3-4f26-6424-48f20dc12298","session":"7.1.10","trace":"trace-me-now"}}`) 52 logMessage := buildLogMessage("", "", time.Time{}, input) 53 54 entry := chug.ChugLogMessage(logMessage) 55 56 Expect(entry).ToNot(BeNil()) 57 Expect(entry.LogMessage).To(Equal(logMessage)) 58 Expect(entry.Raw).To(Equal(input)) 59 Expect(entry.IsLager).To(BeTrue()) 60 Expect(entry.Log).NotTo(BeZero()) 61 }) 62 63 It("populates Entry.Log with a lager message", func() { 64 input = []byte(`{"timestamp":"1429296198.620077372","source":"rep","message":"rep.event-consumer.operation-stream.executing-container-operation.succeeded-fetch-container","log_level":2,"data":{"container-guid":"app-9eb203ad-72f3-4f26-6424-48f20dc12298","session":"7.1.10","trace":"trace-me-now","error":"your the man now dog"}}`) 65 logMessage := buildLogMessage("", "", time.Time{}, input) 66 67 entry := chug.ChugLogMessage(logMessage) 68 69 Expect(entry).ToNot(BeNil()) 70 Expect(entry.IsLager).To(BeTrue()) 71 timestamp, err := strconv.ParseFloat("1429296198.620077372", 64) 72 Expect(err).ToNot(HaveOccurred()) 73 Expect(entry.Log.Timestamp).To(Equal(time.Unix(0, int64(timestamp*1e9)))) 74 Expect(entry.Log.LogLevel).To(Equal(lager.LogLevel(2))) 75 Expect(entry.Log.Source).To(Equal("rep")) 76 Expect(entry.Log.Message).To(Equal("rep.event-consumer.operation-stream.executing-container-operation.succeeded-fetch-container")) 77 Expect(entry.Log.Session).To(Equal("7.1.10")) 78 Expect(entry.Log.Trace).To(Equal("trace-me-now")) 79 Expect(entry.Log.Error).To(MatchError("your the man now dog")) 80 Expect(entry.Log.Data).To(Equal(lager.Data{"container-guid": "app-9eb203ad-72f3-4f26-6424-48f20dc12298"})) 81 }) 82 83 }) 84 85 Context("handling malformed/non-lager data", func() { 86 It("chugs a message that is not lager", func() { 87 input = []byte("ABC 123") 88 logMessage := buildLogMessage("", "", time.Time{}, input) 89 90 entry = chug.ChugLogMessage(logMessage) 91 92 Expect(entry).ToNot(BeNil()) 93 Expect(entry.LogMessage).ToNot(BeNil()) 94 Expect(entry.LogMessage).To(Equal(logMessage)) 95 96 verifyEntryIsRaw() 97 }) 98 99 It("chugs a message that has invalid json", func() { 100 input = []byte(`{"timestamp`) 101 logMessage := buildLogMessage("", "", time.Time{}, input) 102 103 entry = chug.ChugLogMessage(logMessage) 104 105 Expect(entry).ToNot(BeNil()) 106 Expect(entry.LogMessage).To(Equal(logMessage)) 107 108 verifyEntryIsRaw() 109 }) 110 111 Context("when the timestamp is invalid", func() { 112 It("returns raw data", func() { 113 input = []byte(`{"timestamp":"tomorrow","source":"chug-test","message":"chug-test.chug","log_level":3,"data":{"some-float":3,"some-string":"foo","error":7}}`) 114 logMessage := buildLogMessage("", "", time.Time{}, input) 115 entry = chug.ChugLogMessage(logMessage) 116 117 verifyEntryIsRaw() 118 }) 119 }) 120 121 Context("when the error does not parse", func() { 122 It("returns raw data", func() { 123 input = []byte(`{"timestamp":"1407102779.028711081","source":"chug-test","message":"chug-test.chug","log_level":3,"data":{"some-float":3,"some-string":"foo","error":7}}`) 124 logMessage := buildLogMessage("", "", time.Time{}, input) 125 entry = chug.ChugLogMessage(logMessage) 126 127 verifyEntryIsRaw() 128 }) 129 }) 130 131 Context("when the trace does not parse", func() { 132 It("returns raw data", func() { 133 input = []byte(`{"timestamp":"1407102779.028711081","source":"chug-test","message":"chug-test.chug","log_level":3,"data":{"some-float":3,"some-string":"foo","trace":7}}`) 134 logMessage := buildLogMessage("", "", time.Time{}, input) 135 entry = chug.ChugLogMessage(logMessage) 136 137 verifyEntryIsRaw() 138 }) 139 }) 140 141 Context("when the session does not parse", func() { 142 It("returns raw data", func() { 143 input = []byte(`{"timestamp":"1407102779.028711081","source":"chug-test","message":"chug-test.chug","log_level":3,"data":{"some-float":3,"some-string":"foo","session":7}}`) 144 logMessage := buildLogMessage("", "", time.Time{}, input) 145 entry = chug.ChugLogMessage(logMessage) 146 147 verifyEntryIsRaw() 148 }) 149 }) 150 }) 151 })