mirror of
https://github.com/amir20/dozzle.git
synced 2025-12-25 23:03:47 +01:00
* fix(performance): improves streaming of logs by using the Docker library to demultiplex * fixes go tests * changes channel to unbuffered * fixes golang race test * fixes stopped containers * wip * uses different strategy * cleans tests * cleans tests * adds more tests * fixes possible bug * fixes download * adds more tests for download * uses pool * adds more tests
80 lines
1.8 KiB
Go
80 lines
1.8 KiB
Go
package docker
|
|
|
|
import (
|
|
"bufio"
|
|
"bytes"
|
|
"encoding/binary"
|
|
"strings"
|
|
"sync"
|
|
"testing"
|
|
"time"
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
"github.com/stretchr/testify/require"
|
|
)
|
|
|
|
func TestEventGenerator_Events_tty(t *testing.T) {
|
|
input := "example input"
|
|
reader := bufio.NewReader(strings.NewReader(input))
|
|
|
|
g := NewEventGenerator(reader, true)
|
|
event := <-g.Events
|
|
|
|
require.NotNil(t, event, "Expected event to not be nil, but got nil")
|
|
assert.Equal(t, input, event.Message)
|
|
}
|
|
|
|
func TestEventGenerator_Events_non_tty(t *testing.T) {
|
|
input := "example input"
|
|
reader := bytes.NewReader(makeMessage(input, STDOUT))
|
|
|
|
g := NewEventGenerator(reader, false)
|
|
event := <-g.Events
|
|
|
|
require.NotNil(t, event, "Expected event to not be nil, but got nil")
|
|
assert.Equal(t, input, event.Message)
|
|
}
|
|
|
|
func TestEventGenerator_Events_non_tty_close_channel(t *testing.T) {
|
|
input := "example input"
|
|
reader := bytes.NewReader(makeMessage(input, STDOUT))
|
|
|
|
g := NewEventGenerator(reader, false)
|
|
<-g.Events
|
|
_, ok := <-g.Events
|
|
|
|
assert.False(t, ok, "Expected channel to be closed")
|
|
}
|
|
|
|
func TestEventGenerator_Events_routines_done(t *testing.T) {
|
|
input := "example input"
|
|
reader := bytes.NewReader(makeMessage(input, STDOUT))
|
|
|
|
g := NewEventGenerator(reader, false)
|
|
<-g.Events
|
|
assert.False(t, waitTimeout(&g.wg, 1*time.Second), "Expected routines to be done")
|
|
}
|
|
|
|
func makeMessage(message string, stream StdType) []byte {
|
|
data := make([]byte, 8)
|
|
binary.BigEndian.PutUint32(data[4:], uint32(len(message)))
|
|
data[0] = byte(stream / 2)
|
|
data = append(data, []byte(message)...)
|
|
|
|
return data
|
|
}
|
|
|
|
func waitTimeout(wg *sync.WaitGroup, timeout time.Duration) bool {
|
|
c := make(chan struct{})
|
|
go func() {
|
|
defer close(c)
|
|
wg.Wait()
|
|
}()
|
|
select {
|
|
case <-c:
|
|
return false // completed normally
|
|
case <-time.After(timeout):
|
|
return true // timed out
|
|
}
|
|
}
|