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  })