Describe("RecentLogs", func() {
		var (
			httpTestServer   *httptest.Server
			incomingMessages []*events.LogMessage
			err              error
		)

		BeforeEach(func() {
			httpTestServer = httptest.NewServer(handlers.NewHttpHandler(messagesToSend, loggertesthelper.Logger()))
			endpoint = "ws://" + httpTestServer.Listener.Addr().String()
		})

		JustBeforeEach(func() {
			close(messagesToSend)
			incomingMessages, err = connection.RecentLogs("fakeAppGuid", "authToken")
		})

		AfterEach(func() {
			httpTestServer.Close()
		})

		Context("with recent logs", func() {
			BeforeEach(func() {
				messagesToSend <- marshalMessage(createMessage("test-message-0", 0))
				messagesToSend <- marshalMessage(createMessage("test-message-1", 0))
			})

			It("returns those logs from the server", func() {
				Expect(err).NotTo(HaveOccurred())
				Expect(incomingMessages).To(HaveLen(2))
	Describe("Stream", func() {
		It("times out due to handshake timeout", func() {
			defer close(fakeHandler)

			cnsmr = consumer.New(strings.Replace(testServer.URL, "http", "ws", 1), nil, nil)

			_, errCh := cnsmr.Stream(appGuid, authToken)
			var err error
			Eventually(errCh, 2*testTimeout).Should(Receive(&err))
			Expect(err.Error()).To(ContainSubstring("i/o timeout"))
		})
	})

	Describe("RecentLogs", func() {
		It("times out due to an unresponsive server", func() {
			defer close(fakeHandler)
			errs := make(chan error, 10)
			cnsmr = consumer.New(strings.Replace(testServer.URL, "http", "ws", 1), nil, nil)
			go func() {
				_, err := cnsmr.RecentLogs("some-guid", "some-token")
				errs <- err
			}()

			var err error
			Eventually(errs, 2*testTimeout).Should(Receive(&err))
			Expect(err).To(HaveOccurred())
		})
	})
})
		}
	})

	Describe("RecentLogs", func() {
		var (
			receivedLogMessages []*events.LogMessage
			recentError         error
		)

		BeforeEach(func() {
			appGuid = "appGuid"
		})

		JustBeforeEach(func() {
			close(messagesToSend)
			receivedLogMessages, recentError = cnsmr.RecentLogs(appGuid, authToken)
		})

		Context("with an invalid URL", func() {
			BeforeEach(func() {
				trafficControllerURL = "invalid-url"
			})

			It("returns an error", func() {
				Expect(recentError).ToNot(BeNil())
			})
		})

		Context("when the connection can be established", func() {
			BeforeEach(func() {
				testServer = httptest.NewServer(handlers.NewHttpHandler(messagesToSend, loggertesthelper.Logger()))
			})
			server := httptest.NewServer(testHandler)
			tcURL = "ws://" + server.Listener.Addr().String()

			refresher = newMockTokenRefresher()
			refresher.RefreshAuthTokenOutput.Token <- "some-example-token"
			refresher.RefreshAuthTokenOutput.AuthError <- nil

			cnsmr = consumer.New(tcURL, nil, nil)

			cnsmr.RefreshTokenFrom(refresher)
		})

		Describe("RecentLogs", func() {
			It("uses the token refresher to obtain a new token", func() {
				cnsmr.RecentLogs("some-fake-app-guid", "")
				Eventually(refresher.RefreshAuthTokenCalled).Should(BeCalled())
			})

			It("loads a token if the provided token fails with 401", func() {
				statuses <- http.StatusUnauthorized
				cnsmr.RecentLogs("some-fake-app-guid", "")
				Eventually(refresher.RefreshAuthTokenCalled).Should(BeCalled())
			})
		})

		Describe("ContainerMetrics", func() {
			It("uses the token refresher to obtain a new token", func() {
				cnsmr.ContainerMetrics("some-fake-app-guid", "")
				Eventually(refresher.RefreshAuthTokenCalled).Should(BeCalled())
			})
			noaaConsumer = consumer.New(tcURL, &tls.Config{}, nil)
		})

		AfterEach(func() {
			noaaConsumer.Close()
		})

		It("logs stream access", func() {
			noaaConsumer.Stream(APP_ID, AUTH_TOKEN)

			expected := fmt.Sprintf("CEF:0|cloud_foundry|loggregator_trafficcontroller|1.0|GET /apps/%s/stream|GET /apps/%[1]s/stream|0|", APP_ID)
			Eventually(testContents).Should(ContainSubstring(expected))
		})

		It("logs recent access", func() {
			noaaConsumer.RecentLogs(APP_ID, AUTH_TOKEN)

			expected := fmt.Sprintf("CEF:0|cloud_foundry|loggregator_trafficcontroller|1.0|GET /apps/%s/recentlogs|GET /apps/%[1]s/recentlogs|0|", APP_ID)
			Eventually(testContents).Should(ContainSubstring(expected))
		})

		It("logs container metrics access", func() {
			noaaConsumer.ContainerMetrics(APP_ID, AUTH_TOKEN)

			expected := fmt.Sprintf("CEF:0|cloud_foundry|loggregator_trafficcontroller|1.0|GET /apps/%s/containermetrics|GET /apps/%[1]s/containermetrics|0|", APP_ID)
			Eventually(testContents).Should(ContainSubstring(expected))
		})

		It("logs firehose access", func() {
			noaaConsumer.Firehose("foo", AUTH_TOKEN)