Expect(fakeEventEmitter.GetMessages()[0].Event.(*events.CounterEvent)).To(Equal(&events.CounterEvent{
					Name:  proto.String("TruncatingBuffer.totalDroppedMessages"),
					Delta: proto.Uint64(uint64(3)),
				}))
			})

			Context("when the buffer fills once", func() {
				tracksDroppedMessagesAnd("drops all the messages", 3, 3)
			})

			Context("when the buffer fills multiple times ", func() {
				var receiveEvents int
				var sendLog int

				JustBeforeEach(func() {
					outputChannel := buffer.GetOutputChannel()

					for i := 0; i < receiveEvents; i++ {
						Eventually(outputChannel).Should(Receive())
					}

					for i := 0; i < sendLog; i++ {
						sendLogMessages("message X", inMessageChan)
					}
				})

				Context("no event is read and buffer fills a second time", func() {
					BeforeEach(func() {
						receiveEvents = 0
						sendLog = 1
					})
				})

				It("keeps track of dropped messages", func() {
					Eventually(fakeEventEmitter.GetMessages).Should(HaveLen(1))
					Expect(fakeEventEmitter.GetMessages()[0].Event.(*events.CounterEvent)).To(Equal(&events.CounterEvent{
						Name:  proto.String("TruncatingBuffer.totalDroppedMessages"),
						Delta: proto.Uint64(uint64(total)),
					}))
				})
			}

			Context("when the buffer fills once", func() {
				JustBeforeEach(func() {
					Expect(buffer.GetDroppedMessageCount()).To(BeZero())

					firstBuffer := buffer.GetOutputChannel()
					sendLogMessages("message 1", inMessageChan)
					sendLogMessages("message 2", inMessageChan)
					sendLogMessages("message 3", inMessageChan)
					sendLogMessages("message 4", inMessageChan)
					Eventually(buffer.GetOutputChannel).ShouldNot(Equal(firstBuffer))
				})

				tracksDroppedMessages("drops all the messages", 3, 3)

				Context("when the buffer fills multiple times", func() {
					var receiveEvents int
					var sendLog int

					JustBeforeEach(func() {
						outputChannel := buffer.GetOutputChannel()