Skip to content

Commit

Permalink
Add tests and fix test related issues
Browse files Browse the repository at this point in the history
  • Loading branch information
nicklas-dohrn committed Jun 20, 2024
1 parent 21666c8 commit 3c9934f
Show file tree
Hide file tree
Showing 4 changed files with 190 additions and 70 deletions.
17 changes: 9 additions & 8 deletions src/pkg/egress/syslog/https_batch.go
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ func NewHTTPSBatchWriter(
syslogConverter: c,
},
batchSize: BATCHSIZE,
sendInterval: time.Second,
sendInterval: 1 * time.Second,
egrMsgCount: 0,
}
}
Expand Down Expand Up @@ -99,16 +99,17 @@ func NewTriggerTimer(d time.Duration, f func()) *TriggerTimer {

func (t *TriggerTimer) initWait(duration time.Duration) {
timer := time.NewTimer(duration)
<-timer.C
if !t.triggered {
t.execFunc()
}

go func() {
<-timer.C
t.Trigger()
}()
}

func (t *TriggerTimer) Trigger() {
t.triggered = true
t.execFunc()
if !t.triggered {
t.triggered = true
t.execFunc()
}
}

func (t *TriggerTimer) Running() bool {
Expand Down
180 changes: 180 additions & 0 deletions src/pkg/egress/syslog/https_batch_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,180 @@
package syslog_test

import (
"bytes"
"crypto/tls"
"io"
"net/http"
"net/http/httptest"
"time"

"code.cloudfoundry.org/go-loggregator/v9/rfc5424"
"code.cloudfoundry.org/go-loggregator/v9/rpc/loggregator_v2"
metricsHelpers "code.cloudfoundry.org/go-metric-registry/testhelpers"
"code.cloudfoundry.org/loggregator-agent-release/src/pkg/egress"
"code.cloudfoundry.org/loggregator-agent-release/src/pkg/egress/syslog"
. "github.com/onsi/ginkgo/v2"
. "github.com/onsi/gomega"
)

var triggered = 0
var string_to_1024_chars = "saljdflajsdssdfsdfljkfkajafjajlköflkjöjaklgljksdjlakljkflkjweljklkwjejlkfekljwlkjefjklwjklsdajkljklwerlkaskldgjksakjekjwrjkljasdjkgfkljwejklrkjlklasdkjlsadjlfjlkadfljkajklsdfjklslkdfjkllkjasdjkflsdlakfjklasldfkjlasdjfkjlsadlfjklaljsafjlslkjawjklerkjljklasjkdfjklwerjljalsdjkflwerjlkwejlkarjklalkklfsdjlfhkjsdfkhsewhkjjasdjfkhwkejrkjahjefkhkasdjhfkashfkjwehfkksadfjaskfkhjdshjfhewkjhasdfjdajskfjwehkfajkankaskjdfasdjhfkkjhjjkasdfjhkjahksdf"

var _ = Describe("TriggerTimer testing", func() {
BeforeEach(func() {
triggered = 0
})

It("Timer triggered by call", func() {
timer := syslog.NewTriggerTimer(10*time.Millisecond, trigger)
timer.Trigger()
//expect timer to be triggered and therefore stopped
Expect(timer.Running()).To(BeFalse())
Expect(triggered).To(Equal(1))
time.Sleep(12 * time.Millisecond)
//expect timer to stay stopped and not trigger func again
Expect(timer.Running()).To(BeFalse())
Expect(triggered).To(Equal(1))
})

It("Timer triggered by time elapsed", func() {
timer := syslog.NewTriggerTimer(10*time.Millisecond, trigger)
//expect timer to be running and untriggered
Expect(timer.Running()).To(BeTrue())
Expect(triggered).To(Equal(0))
time.Sleep(12 * time.Millisecond)
//expect timer to be triggered and stopped
Expect(timer.Running()).To(BeFalse())
Expect(triggered).To(Equal(1))
//expect timer to not be able to be retriggered
timer.Trigger()
Expect(timer.Running()).To(BeFalse())
Expect(triggered).To(Equal(1))
})
})

func trigger() {
triggered += 1
}

var _ = Describe("HTTPS_batch_testing", func() {
var (
netConf syslog.NetworkTimeoutConfig
skipSSLTLSConfig = &tls.Config{
InsecureSkipVerify: true, //nolint:gosec
}
c = syslog.NewConverter()
drain *SpyDrain
b *syslog.URLBinding
writer egress.WriteCloser
)
string_to_1024_chars += string_to_1024_chars

BeforeEach(func() {
drain = newBatchMockDrain(200)
b = buildURLBinding(
drain.URL,
"test-app-id",
"test-hostname",
)
writer = syslog.NewHTTPSBatchWriter(
b,
netConf,
skipSSLTLSConfig,
&metricsHelpers.SpyMetric{},
c,
)
})

It("testing simple appending of one log", func() {
env1 := buildLogEnvelope("APP", "1", "message 1", loggregator_v2.Log_OUT)
Expect(writer.Write(env1)).To(Succeed())
env2 := buildLogEnvelope("APP", "2", "message 2", loggregator_v2.Log_OUT)
Expect(writer.Write(env2)).To(Succeed())
time.Sleep(2 * time.Second)

Expect(drain.messages).To(HaveLen(2))
expected := &rfc5424.Message{
AppName: "test-app-id",
Hostname: "test-hostname",
Priority: rfc5424.Priority(14),
ProcessID: "[APP/1]",
Message: []byte("message 1\n"),
}
Expect(drain.messages[0].AppName).To(Equal(expected.AppName))
Expect(drain.messages[0].Hostname).To(Equal(expected.Hostname))
Expect(drain.messages[0].Priority).To(BeEquivalentTo(expected.Priority))
Expect(drain.messages[0].ProcessID).To(Equal(expected.ProcessID))
Expect(drain.messages[0].Message).To(Equal(expected.Message))
expected = &rfc5424.Message{
AppName: "test-app-id",
Hostname: "test-hostname",
Priority: rfc5424.Priority(14),
ProcessID: "[APP/2]",
Message: []byte("message 2\n"),
}
Expect(drain.messages[1].AppName).To(Equal(expected.AppName))
Expect(drain.messages[1].Hostname).To(Equal(expected.Hostname))
Expect(drain.messages[1].Priority).To(BeEquivalentTo(expected.Priority))
Expect(drain.messages[1].ProcessID).To(Equal(expected.ProcessID))
Expect(drain.messages[1].Message).To(Equal(expected.Message))
})

It("test early dispatch on high message load", func() {
env1 := buildLogEnvelope("APP", "1", "string to get log to 1024 characters:"+string_to_1024_chars, loggregator_v2.Log_OUT)
for i := 0; i < 300; i++ {
writer.Write(env1)
}
Expect(drain.messages).To(HaveLen(256))
})

It("test batch dispatching with all logs in a given timeframe", func() {
env1 := buildLogEnvelope("APP", "1", "string to get log to 1024 characters:"+string_to_1024_chars, loggregator_v2.Log_OUT)
for i := 0; i < 10; i++ {
writer.Write(env1)
time.Sleep(99 * time.Millisecond)
}
time.Sleep(100 * time.Millisecond)
Expect(drain.messages).To(HaveLen(10))
})

It("probabilistic test for race condition", func() {
env1 := buildLogEnvelope("APP", "1", "string to get log to 1024 characters:"+string_to_1024_chars, loggregator_v2.Log_OUT)
for i := 0; i < 10; i++ {
writer.Write(env1)
time.Sleep(99 * time.Millisecond)
}
time.Sleep(100 * time.Millisecond)
Expect(drain.messages).To(HaveLen(10))
})
})

func newBatchMockDrain(status int) *SpyDrain {
drain := &SpyDrain{}
handler := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {

body, err := io.ReadAll(r.Body)
Expect(err).ToNot(HaveOccurred())
defer r.Body.Close()

println(body)

message := &rfc5424.Message{}

messages := bytes.SplitAfter(body, []byte("\n"))
for _, raw := range messages {
if bytes.Equal(raw, []byte("")) {
continue
}
message = &rfc5424.Message{}
err = message.UnmarshalBinary(raw)
Expect(err).ToNot(HaveOccurred())
drain.messages = append(drain.messages, message)
drain.headers = append(drain.headers, r.Header)
}
w.WriteHeader(status)
})
server := httptest.NewTLSServer(handler)
drain.Server = server
return drain
}
55 changes: 1 addition & 54 deletions src/pkg/egress/syslog/https_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -106,60 +106,6 @@ var _ = Describe("HTTPWriter", func() {
Expect(err.Error()).ToNot(ContainSubstring("password"))
})

It("writes syslog formatted messages to http drain", func() {
drain := newMockOKDrain()

b := buildURLBinding(
drain.URL,
"test-app-id",
"test-hostname",
)

writer := syslog.NewHTTPSWriter(
b,
netConf,
skipSSLTLSConfig,
&metricsHelpers.SpyMetric{},
c,
)

env1 := buildLogEnvelope("APP", "1", "just a test", loggregator_v2.Log_OUT)
Expect(writer.Write(env1)).To(Succeed())
env2 := buildLogEnvelope("CELL", "5", "log from cell", loggregator_v2.Log_ERR)
Expect(writer.Write(env2)).To(Succeed())
env3 := buildLogEnvelope("CELL", "", "log from cell", loggregator_v2.Log_ERR)
Expect(writer.Write(env3)).To(Succeed())

Expect(drain.messages).To(HaveLen(3))
expected := &rfc5424.Message{
AppName: "test-app-id",
Hostname: "test-hostname",
Priority: rfc5424.Priority(14),
ProcessID: "[APP/1]",
Message: []byte("just a test\n"),
}
Expect(drain.messages[0].AppName).To(Equal(expected.AppName))
Expect(drain.messages[0].Hostname).To(Equal(expected.Hostname))
Expect(drain.messages[0].Priority).To(BeEquivalentTo(expected.Priority))
Expect(drain.messages[0].ProcessID).To(Equal(expected.ProcessID))
Expect(drain.messages[0].Message).To(Equal(expected.Message))

expected = &rfc5424.Message{
AppName: "test-app-id",
Hostname: "test-hostname",
Priority: rfc5424.Priority(11),
ProcessID: "[CELL/5]",
Message: []byte("log from cell\n"),
}
Expect(drain.messages[1].AppName).To(Equal(expected.AppName))
Expect(drain.messages[1].Hostname).To(Equal(expected.Hostname))
Expect(drain.messages[1].Priority).To(BeEquivalentTo(expected.Priority))
Expect(drain.messages[1].ProcessID).To(Equal(expected.ProcessID))
Expect(drain.messages[1].Message).To(Equal(expected.Message))

Expect(drain.messages[2].ProcessID).To(Equal("[CELL]"))
})

It("sets Content-Type to text/plain", func() {
drain := newMockOKDrain()

Expand Down Expand Up @@ -342,6 +288,7 @@ func newMockDrain(status int) *SpyDrain {
Expect(err).ToNot(HaveOccurred())
defer r.Body.Close()

println(body)
err = message.UnmarshalBinary(body)
Expect(err).ToNot(HaveOccurred())

Expand Down
8 changes: 0 additions & 8 deletions src/pkg/egress/syslog/syslog_connector.go
Original file line number Diff line number Diff line change
Expand Up @@ -166,12 +166,4 @@ func (w *SyslogConnector) emitLoggregatorErrorLog(appID, message string) {
w.logClient.EmitLog(message, option)
}
func (w *SyslogConnector) emitStandardOutErrorLog(appID, scheme, url string, missed int) {
errorAppOrAggregate := fmt.Sprintf("for %s's app drain", appID)
if appID == "" {
errorAppOrAggregate = "for aggregate drain"
}
log.Printf(
"Dropped %d %s logs %s with url %s",
missed, scheme, errorAppOrAggregate, url,
)
}

0 comments on commit 3c9934f

Please sign in to comment.