github.com/brianfoshee/docker@v1.6.0/daemon/logger/copier_test.go (about)

     1  package logger
     2  
     3  import (
     4  	"bytes"
     5  	"encoding/json"
     6  	"io"
     7  	"testing"
     8  	"time"
     9  )
    10  
    11  type TestLoggerJSON struct {
    12  	*json.Encoder
    13  }
    14  
    15  func (l *TestLoggerJSON) Log(m *Message) error {
    16  	return l.Encode(m)
    17  }
    18  
    19  func (l *TestLoggerJSON) Close() error {
    20  	return nil
    21  }
    22  
    23  func (l *TestLoggerJSON) Name() string {
    24  	return "json"
    25  }
    26  
    27  type TestLoggerText struct {
    28  	*bytes.Buffer
    29  }
    30  
    31  func (l *TestLoggerText) Log(m *Message) error {
    32  	_, err := l.WriteString(m.ContainerID + " " + m.Source + " " + string(m.Line) + "\n")
    33  	return err
    34  }
    35  
    36  func (l *TestLoggerText) Close() error {
    37  	return nil
    38  }
    39  
    40  func (l *TestLoggerText) Name() string {
    41  	return "text"
    42  }
    43  
    44  func TestCopier(t *testing.T) {
    45  	stdoutLine := "Line that thinks that it is log line from docker stdout"
    46  	stderrLine := "Line that thinks that it is log line from docker stderr"
    47  	var stdout bytes.Buffer
    48  	var stderr bytes.Buffer
    49  	for i := 0; i < 30; i++ {
    50  		if _, err := stdout.WriteString(stdoutLine + "\n"); err != nil {
    51  			t.Fatal(err)
    52  		}
    53  		if _, err := stderr.WriteString(stderrLine + "\n"); err != nil {
    54  			t.Fatal(err)
    55  		}
    56  	}
    57  
    58  	var jsonBuf bytes.Buffer
    59  
    60  	jsonLog := &TestLoggerJSON{Encoder: json.NewEncoder(&jsonBuf)}
    61  
    62  	cid := "a7317399f3f857173c6179d44823594f8294678dea9999662e5c625b5a1c7657"
    63  	c, err := NewCopier(cid,
    64  		map[string]io.Reader{
    65  			"stdout": &stdout,
    66  			"stderr": &stderr,
    67  		},
    68  		jsonLog)
    69  	if err != nil {
    70  		t.Fatal(err)
    71  	}
    72  	c.Run()
    73  	wait := make(chan struct{})
    74  	go func() {
    75  		c.Wait()
    76  		close(wait)
    77  	}()
    78  	select {
    79  	case <-time.After(1 * time.Second):
    80  		t.Fatal("Copier failed to do its work in 1 second")
    81  	case <-wait:
    82  	}
    83  	dec := json.NewDecoder(&jsonBuf)
    84  	for {
    85  		var msg Message
    86  		if err := dec.Decode(&msg); err != nil {
    87  			if err == io.EOF {
    88  				break
    89  			}
    90  			t.Fatal(err)
    91  		}
    92  		if msg.Source != "stdout" && msg.Source != "stderr" {
    93  			t.Fatalf("Wrong Source: %q, should be %q or %q", msg.Source, "stdout", "stderr")
    94  		}
    95  		if msg.ContainerID != cid {
    96  			t.Fatalf("Wrong ContainerID: %q, expected %q", msg.ContainerID, cid)
    97  		}
    98  		if msg.Source == "stdout" {
    99  			if string(msg.Line) != stdoutLine {
   100  				t.Fatalf("Wrong Line: %q, expected %q", msg.Line, stdoutLine)
   101  			}
   102  		}
   103  		if msg.Source == "stderr" {
   104  			if string(msg.Line) != stderrLine {
   105  				t.Fatalf("Wrong Line: %q, expected %q", msg.Line, stderrLine)
   106  			}
   107  		}
   108  	}
   109  }