this adds new tests to test logging of long log-lines
(without newlines), and trailing log-lines.
Signed-off-by: Sebastiaan van Stijn <github@gone.nl>
| ... | ... |
@@ -6,6 +6,7 @@ import ( |
| 6 | 6 |
"fmt" |
| 7 | 7 |
"io" |
| 8 | 8 |
"os" |
| 9 |
+ "strings" |
|
| 9 | 10 |
"sync" |
| 10 | 11 |
"testing" |
| 11 | 12 |
"time" |
| ... | ... |
@@ -33,6 +34,9 @@ func (l *TestLoggerJSON) Name() string { return "json" }
|
| 33 | 33 |
func TestCopier(t *testing.T) {
|
| 34 | 34 |
stdoutLine := "Line that thinks that it is log line from docker stdout" |
| 35 | 35 |
stderrLine := "Line that thinks that it is log line from docker stderr" |
| 36 |
+ stdoutTrailingLine := "stdout trailing line" |
|
| 37 |
+ stderrTrailingLine := "stderr trailing line" |
|
| 38 |
+ |
|
| 36 | 39 |
var stdout bytes.Buffer |
| 37 | 40 |
var stderr bytes.Buffer |
| 38 | 41 |
for i := 0; i < 30; i++ {
|
| ... | ... |
@@ -44,6 +48,88 @@ func TestCopier(t *testing.T) {
|
| 44 | 44 |
} |
| 45 | 45 |
} |
| 46 | 46 |
|
| 47 |
+ // Test remaining lines without line-endings |
|
| 48 |
+ if _, err := stdout.WriteString(stdoutTrailingLine); err != nil {
|
|
| 49 |
+ t.Fatal(err) |
|
| 50 |
+ } |
|
| 51 |
+ if _, err := stderr.WriteString(stderrTrailingLine); err != nil {
|
|
| 52 |
+ t.Fatal(err) |
|
| 53 |
+ } |
|
| 54 |
+ |
|
| 55 |
+ var jsonBuf bytes.Buffer |
|
| 56 |
+ |
|
| 57 |
+ jsonLog := &TestLoggerJSON{Encoder: json.NewEncoder(&jsonBuf)}
|
|
| 58 |
+ |
|
| 59 |
+ c := NewCopier( |
|
| 60 |
+ map[string]io.Reader{
|
|
| 61 |
+ "stdout": &stdout, |
|
| 62 |
+ "stderr": &stderr, |
|
| 63 |
+ }, |
|
| 64 |
+ jsonLog) |
|
| 65 |
+ c.Run() |
|
| 66 |
+ wait := make(chan struct{})
|
|
| 67 |
+ go func() {
|
|
| 68 |
+ c.Wait() |
|
| 69 |
+ close(wait) |
|
| 70 |
+ }() |
|
| 71 |
+ select {
|
|
| 72 |
+ case <-time.After(1 * time.Second): |
|
| 73 |
+ t.Fatal("Copier failed to do its work in 1 second")
|
|
| 74 |
+ case <-wait: |
|
| 75 |
+ } |
|
| 76 |
+ dec := json.NewDecoder(&jsonBuf) |
|
| 77 |
+ for {
|
|
| 78 |
+ var msg Message |
|
| 79 |
+ if err := dec.Decode(&msg); err != nil {
|
|
| 80 |
+ if err == io.EOF {
|
|
| 81 |
+ break |
|
| 82 |
+ } |
|
| 83 |
+ t.Fatal(err) |
|
| 84 |
+ } |
|
| 85 |
+ if msg.Source != "stdout" && msg.Source != "stderr" {
|
|
| 86 |
+ t.Fatalf("Wrong Source: %q, should be %q or %q", msg.Source, "stdout", "stderr")
|
|
| 87 |
+ } |
|
| 88 |
+ if msg.Source == "stdout" {
|
|
| 89 |
+ if string(msg.Line) != stdoutLine && string(msg.Line) != stdoutTrailingLine {
|
|
| 90 |
+ t.Fatalf("Wrong Line: %q, expected %q or %q", msg.Line, stdoutLine, stdoutTrailingLine)
|
|
| 91 |
+ } |
|
| 92 |
+ } |
|
| 93 |
+ if msg.Source == "stderr" {
|
|
| 94 |
+ if string(msg.Line) != stderrLine && string(msg.Line) != stderrTrailingLine {
|
|
| 95 |
+ t.Fatalf("Wrong Line: %q, expected %q or %q", msg.Line, stderrLine, stderrTrailingLine)
|
|
| 96 |
+ } |
|
| 97 |
+ } |
|
| 98 |
+ } |
|
| 99 |
+} |
|
| 100 |
+ |
|
| 101 |
+// TestCopierLongLines tests long lines without line breaks |
|
| 102 |
+func TestCopierLongLines(t *testing.T) {
|
|
| 103 |
+ // Long lines (should be split at "bufSize") |
|
| 104 |
+ const bufSize = 16 * 1024 |
|
| 105 |
+ stdoutLongLine := strings.Repeat("a", bufSize)
|
|
| 106 |
+ stderrLongLine := strings.Repeat("b", bufSize)
|
|
| 107 |
+ stdoutTrailingLine := "stdout trailing line" |
|
| 108 |
+ stderrTrailingLine := "stderr trailing line" |
|
| 109 |
+ |
|
| 110 |
+ var stdout bytes.Buffer |
|
| 111 |
+ var stderr bytes.Buffer |
|
| 112 |
+ |
|
| 113 |
+ for i := 0; i < 3; i++ {
|
|
| 114 |
+ if _, err := stdout.WriteString(stdoutLongLine); err != nil {
|
|
| 115 |
+ t.Fatal(err) |
|
| 116 |
+ } |
|
| 117 |
+ if _, err := stderr.WriteString(stderrLongLine); err != nil {
|
|
| 118 |
+ t.Fatal(err) |
|
| 119 |
+ } |
|
| 120 |
+ } |
|
| 121 |
+ |
|
| 122 |
+ if _, err := stdout.WriteString(stdoutTrailingLine); err != nil {
|
|
| 123 |
+ t.Fatal(err) |
|
| 124 |
+ } |
|
| 125 |
+ if _, err := stderr.WriteString(stderrTrailingLine); err != nil {
|
|
| 126 |
+ t.Fatal(err) |
|
| 127 |
+ } |
|
| 128 |
+ |
|
| 47 | 129 |
var jsonBuf bytes.Buffer |
| 48 | 130 |
|
| 49 | 131 |
jsonLog := &TestLoggerJSON{Encoder: json.NewEncoder(&jsonBuf)}
|
| ... | ... |
@@ -78,13 +164,13 @@ func TestCopier(t *testing.T) {
|
| 78 | 78 |
t.Fatalf("Wrong Source: %q, should be %q or %q", msg.Source, "stdout", "stderr")
|
| 79 | 79 |
} |
| 80 | 80 |
if msg.Source == "stdout" {
|
| 81 |
- if string(msg.Line) != stdoutLine {
|
|
| 82 |
- t.Fatalf("Wrong Line: %q, expected %q", msg.Line, stdoutLine)
|
|
| 81 |
+ if string(msg.Line) != stdoutLongLine && string(msg.Line) != stdoutTrailingLine {
|
|
| 82 |
+ t.Fatalf("Wrong Line: %q, expected 'stdoutLongLine' or 'stdoutTrailingLine'", msg.Line)
|
|
| 83 | 83 |
} |
| 84 | 84 |
} |
| 85 | 85 |
if msg.Source == "stderr" {
|
| 86 |
- if string(msg.Line) != stderrLine {
|
|
| 87 |
- t.Fatalf("Wrong Line: %q, expected %q", msg.Line, stderrLine)
|
|
| 86 |
+ if string(msg.Line) != stderrLongLine && string(msg.Line) != stderrTrailingLine {
|
|
| 87 |
+ t.Fatalf("Wrong Line: %q, expected 'stderrLongLine' or 'stderrTrailingLine'", msg.Line)
|
|
| 88 | 88 |
} |
| 89 | 89 |
} |
| 90 | 90 |
} |